@sapui5/sap.fe.core 1.102.2 → 1.104.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/package.json +6 -6
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +73 -30
  4. package/src/sap/fe/core/AppComponent.ts +65 -43
  5. package/src/sap/fe/core/AppStateHandler.js +82 -70
  6. package/src/sap/fe/core/AppStateHandler.ts +32 -37
  7. package/src/sap/fe/core/BaseController.js +11 -9
  8. package/src/sap/fe/core/BaseController.ts +15 -13
  9. package/src/sap/fe/core/CommonUtils.js +227 -126
  10. package/src/sap/fe/core/CommonUtils.ts +240 -163
  11. package/src/sap/fe/core/ExtensionAPI.js +24 -27
  12. package/src/sap/fe/core/ExtensionAPI.ts +36 -38
  13. package/src/sap/fe/core/PageController.js +4 -4
  14. package/src/sap/fe/core/PageController.ts +4 -5
  15. package/src/sap/fe/core/TemplateComponent.js +1 -1
  16. package/src/sap/fe/core/TemplateComponent.ts +6 -6
  17. package/src/sap/fe/core/TemplateModel.js +1 -1
  18. package/src/sap/fe/core/TemplateModel.ts +1 -1
  19. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
  20. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +1 -1
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +181 -43
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +150 -24
  23. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +585 -210
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +246 -96
  25. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +30 -30
  26. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +32 -29
  27. package/src/sap/fe/core/controllerextensions/EditFlow.js +379 -330
  28. package/src/sap/fe/core/controllerextensions/EditFlow.ts +253 -245
  29. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +9 -9
  30. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
  31. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +101 -74
  32. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +69 -79
  33. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +67 -67
  34. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +76 -76
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +85 -77
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +103 -99
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +66 -68
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
  39. package/src/sap/fe/core/controllerextensions/MassEdit.js +9 -9
  40. package/src/sap/fe/core/controllerextensions/MassEdit.ts +20 -27
  41. package/src/sap/fe/core/controllerextensions/MessageHandler.js +20 -12
  42. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -14
  43. package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
  44. package/src/sap/fe/core/controllerextensions/PageReady.ts +98 -34
  45. package/src/sap/fe/core/controllerextensions/Paginator.js +21 -22
  46. package/src/sap/fe/core/controllerextensions/Paginator.ts +24 -25
  47. package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -6
  48. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  49. package/src/sap/fe/core/controllerextensions/Routing.js +10 -11
  50. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  51. package/src/sap/fe/core/controllerextensions/Share.js +170 -139
  52. package/src/sap/fe/core/controllerextensions/Share.ts +117 -118
  53. package/src/sap/fe/core/controllerextensions/SideEffects.js +46 -50
  54. package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
  55. package/src/sap/fe/core/controllerextensions/ViewState.js +200 -131
  56. package/src/sap/fe/core/controllerextensions/ViewState.ts +141 -148
  57. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
  58. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
  59. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +11 -10
  60. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +17 -20
  61. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -2
  62. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +4 -4
  63. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +7 -9
  64. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +18 -19
  65. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +190 -141
  66. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +258 -210
  67. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +183 -125
  68. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +213 -156
  69. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +164 -140
  70. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +180 -150
  71. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +24 -26
  72. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +35 -33
  73. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +71 -41
  74. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +102 -82
  75. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +61 -71
  76. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +56 -64
  77. package/src/sap/fe/core/controls/Any.js +9 -5
  78. package/src/sap/fe/core/controls/Any.ts +10 -4
  79. package/src/sap/fe/core/controls/CommandExecution.js +11 -25
  80. package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
  81. package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
  82. package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
  83. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +22 -22
  84. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
  85. package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -2
  86. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
  87. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
  88. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
  89. package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
  90. package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
  91. package/src/sap/fe/core/controls/FileWrapper.js +7 -2
  92. package/src/sap/fe/core/controls/FileWrapper.ts +15 -11
  93. package/src/sap/fe/core/controls/FilterBar.js +6 -2
  94. package/src/sap/fe/core/controls/FilterBar.ts +13 -9
  95. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
  96. package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
  97. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  98. package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
  99. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +3 -3
  100. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +16 -12
  101. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
  102. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -3
  103. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
  104. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +49 -49
  105. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +54 -54
  106. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
  107. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +22 -35
  108. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
  109. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
  110. package/src/sap/fe/core/converters/ConverterContext.js +26 -33
  111. package/src/sap/fe/core/converters/ConverterContext.ts +52 -61
  112. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  113. package/src/sap/fe/core/converters/ManifestSettings.ts +17 -15
  114. package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
  115. package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
  116. package/src/sap/fe/core/converters/MetaModelConverter.js +64 -35
  117. package/src/sap/fe/core/converters/MetaModelConverter.ts +154 -129
  118. package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
  119. package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
  120. package/src/sap/fe/core/converters/annotations/DataField.js +58 -35
  121. package/src/sap/fe/core/converters/annotations/DataField.ts +102 -76
  122. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1911 -1495
  123. package/src/sap/fe/core/converters/controls/Common/Action.js +50 -41
  124. package/src/sap/fe/core/converters/controls/Common/Action.ts +56 -46
  125. package/src/sap/fe/core/converters/controls/Common/Chart.js +14 -14
  126. package/src/sap/fe/core/converters/controls/Common/Chart.ts +26 -33
  127. package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
  128. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
  129. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +30 -28
  130. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +60 -61
  131. package/src/sap/fe/core/converters/controls/Common/Form.js +27 -28
  132. package/src/sap/fe/core/converters/controls/Common/Form.ts +44 -57
  133. package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
  134. package/src/sap/fe/core/converters/controls/Common/KPI.ts +49 -52
  135. package/src/sap/fe/core/converters/controls/Common/Table.js +181 -197
  136. package/src/sap/fe/core/converters/controls/Common/Table.ts +251 -280
  137. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
  138. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +144 -141
  139. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +45 -41
  140. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +65 -59
  141. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
  142. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
  143. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
  144. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
  145. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +67 -64
  146. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +69 -66
  147. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +77 -73
  148. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +101 -97
  149. package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
  150. package/src/sap/fe/core/converters/helpers/Aggregation.ts +12 -15
  151. package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
  152. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
  153. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -4
  154. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +9 -9
  155. package/src/sap/fe/core/converters/helpers/ID.js +48 -46
  156. package/src/sap/fe/core/converters/helpers/ID.ts +26 -25
  157. package/src/sap/fe/core/converters/helpers/Key.js +7 -7
  158. package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
  159. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  160. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -5
  161. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
  162. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
  163. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +46 -62
  164. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +54 -82
  165. package/src/sap/fe/core/converters/templates/ListReportConverter.js +55 -42
  166. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +81 -66
  167. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +39 -38
  168. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +52 -61
  169. package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
  170. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
  171. package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
  172. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
  173. package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
  174. package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
  175. package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
  176. package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
  177. package/src/sap/fe/core/formatters/StandardFormatter.js +96 -0
  178. package/src/sap/fe/core/formatters/StandardFormatter.ts +70 -0
  179. package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
  180. package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
  181. package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
  182. package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
  183. package/src/sap/fe/core/helpers/AppStartupHelper.js +15 -15
  184. package/src/sap/fe/core/helpers/AppStartupHelper.ts +37 -40
  185. package/src/sap/fe/core/helpers/BindingToolkit.js +1832 -0
  186. package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +396 -269
  187. package/src/sap/fe/core/helpers/ClassSupport.js +49 -12
  188. package/src/sap/fe/core/helpers/ClassSupport.ts +37 -10
  189. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
  190. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
  191. package/src/sap/fe/core/helpers/EditState.js +1 -6
  192. package/src/sap/fe/core/helpers/EditState.ts +5 -10
  193. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
  194. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
  195. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  196. package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
  197. package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
  198. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
  199. package/src/sap/fe/core/helpers/MassEditHelper.js +306 -280
  200. package/src/sap/fe/core/helpers/MassEditHelper.ts +380 -360
  201. package/src/sap/fe/core/helpers/MessageStrip.js +81 -0
  202. package/src/sap/fe/core/helpers/MessageStrip.ts +79 -0
  203. package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
  204. package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
  205. package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
  206. package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
  207. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  208. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
  209. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
  210. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
  211. package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
  212. package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
  213. package/src/sap/fe/core/helpers/ToES6Promise.js +32 -0
  214. package/src/sap/fe/core/helpers/ToES6Promise.ts +19 -0
  215. package/src/sap/fe/core/jsx-runtime/Fragment.js +16 -0
  216. package/src/sap/fe/core/jsx-runtime/Fragment.ts +3 -0
  217. package/src/sap/fe/core/jsx-runtime/jsx-control.js +99 -0
  218. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +82 -0
  219. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +105 -0
  220. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +89 -0
  221. package/src/sap/fe/core/jsx-runtime/jsx.js +12 -90
  222. package/src/sap/fe/core/jsx-runtime/jsx.ts +24 -85
  223. package/src/sap/fe/core/library.js +42 -3
  224. package/src/sap/fe/core/library.ts +38 -0
  225. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
  226. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
  227. package/src/sap/fe/core/messagebundle.properties +39 -63
  228. package/src/sap/fe/core/messagebundle_ar.properties +25 -39
  229. package/src/sap/fe/core/messagebundle_bg.properties +25 -39
  230. package/src/sap/fe/core/messagebundle_ca.properties +25 -39
  231. package/src/sap/fe/core/messagebundle_cs.properties +25 -39
  232. package/src/sap/fe/core/messagebundle_cy.properties +25 -39
  233. package/src/sap/fe/core/messagebundle_da.properties +25 -39
  234. package/src/sap/fe/core/messagebundle_de.properties +25 -39
  235. package/src/sap/fe/core/messagebundle_el.properties +26 -40
  236. package/src/sap/fe/core/messagebundle_en.properties +25 -39
  237. package/src/sap/fe/core/messagebundle_en_GB.properties +25 -39
  238. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +25 -39
  239. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +25 -39
  240. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +26 -18
  241. package/src/sap/fe/core/messagebundle_es.properties +27 -41
  242. package/src/sap/fe/core/messagebundle_es_MX.properties +25 -39
  243. package/src/sap/fe/core/messagebundle_et.properties +25 -39
  244. package/src/sap/fe/core/messagebundle_fi.properties +25 -39
  245. package/src/sap/fe/core/messagebundle_fr.properties +26 -40
  246. package/src/sap/fe/core/messagebundle_fr_CA.properties +25 -39
  247. package/src/sap/fe/core/messagebundle_hi.properties +25 -39
  248. package/src/sap/fe/core/messagebundle_hr.properties +25 -39
  249. package/src/sap/fe/core/messagebundle_hu.properties +25 -39
  250. package/src/sap/fe/core/messagebundle_id.properties +25 -39
  251. package/src/sap/fe/core/messagebundle_it.properties +41 -55
  252. package/src/sap/fe/core/messagebundle_iw.properties +25 -39
  253. package/src/sap/fe/core/messagebundle_ja.properties +25 -39
  254. package/src/sap/fe/core/messagebundle_kk.properties +25 -39
  255. package/src/sap/fe/core/messagebundle_ko.properties +30 -44
  256. package/src/sap/fe/core/messagebundle_lt.properties +25 -39
  257. package/src/sap/fe/core/messagebundle_lv.properties +25 -39
  258. package/src/sap/fe/core/messagebundle_ms.properties +25 -39
  259. package/src/sap/fe/core/messagebundle_nl.properties +27 -41
  260. package/src/sap/fe/core/messagebundle_no.properties +25 -39
  261. package/src/sap/fe/core/messagebundle_pl.properties +26 -40
  262. package/src/sap/fe/core/messagebundle_pt.properties +26 -40
  263. package/src/sap/fe/core/messagebundle_pt_PT.properties +25 -39
  264. package/src/sap/fe/core/messagebundle_ro.properties +25 -39
  265. package/src/sap/fe/core/messagebundle_ru.properties +25 -39
  266. package/src/sap/fe/core/messagebundle_sh.properties +25 -39
  267. package/src/sap/fe/core/messagebundle_sk.properties +25 -39
  268. package/src/sap/fe/core/messagebundle_sl.properties +25 -39
  269. package/src/sap/fe/core/messagebundle_sv.properties +25 -39
  270. package/src/sap/fe/core/messagebundle_th.properties +25 -39
  271. package/src/sap/fe/core/messagebundle_tr.properties +25 -39
  272. package/src/sap/fe/core/messagebundle_uk.properties +25 -39
  273. package/src/sap/fe/core/messagebundle_vi.properties +25 -39
  274. package/src/sap/fe/core/messagebundle_zh_CN.properties +25 -39
  275. package/src/sap/fe/core/messagebundle_zh_TW.properties +25 -39
  276. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  277. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
  278. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +97 -69
  279. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +68 -69
  280. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
  281. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
  282. package/src/sap/fe/core/services/NavigationServiceFactory.js +61 -49
  283. package/src/sap/fe/core/services/NavigationServiceFactory.ts +63 -52
  284. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
  285. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
  286. package/src/sap/fe/core/services/RoutingServiceFactory.js +55 -55
  287. package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
  288. package/src/sap/fe/core/services/ShellServicesFactory.js +92 -76
  289. package/src/sap/fe/core/services/ShellServicesFactory.ts +95 -82
  290. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +61 -61
  291. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
  292. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +224 -198
  293. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +138 -139
  294. package/src/sap/fe/core/support/CommonHelper.js +3 -2
  295. package/src/sap/fe/core/support/CommonHelper.ts +9 -13
  296. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  297. package/src/sap/fe/core/support/Diagnostics.ts +5 -5
  298. package/src/sap/fe/core/templating/CommonFormatters.js +84 -0
  299. package/src/sap/fe/core/templating/CommonFormatters.ts +86 -0
  300. package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
  301. package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
  302. package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
  303. package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
  304. package/src/sap/fe/core/templating/DataModelPathHelper.js +16 -15
  305. package/src/sap/fe/core/templating/DataModelPathHelper.ts +42 -32
  306. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  307. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
  308. package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
  309. package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
  310. package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
  311. package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
  312. package/src/sap/fe/core/templating/FilterHelper.js +16 -15
  313. package/src/sap/fe/core/templating/FilterHelper.ts +18 -18
  314. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  315. package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
  316. package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
  317. package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
  318. package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
  319. package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
  320. package/src/sap/fe/core/templating/UIFormatters.js +152 -95
  321. package/src/sap/fe/core/templating/UIFormatters.ts +202 -128
  322. package/src/sap/fe/core/type/Email.js +2 -2
  323. package/src/sap/fe/core/type/Email.ts +2 -2
  324. package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/PropertyHelper", "sap/fe/macros/field/FieldTemplating", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageToast", "sap/ui/core/Core", "sap/ui/core/Fragment", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/mdc/enum/EditMode", "sap/ui/model/json/JSONModel", "../controls/Any", "../converters/MetaModelConverter", "../templating/FieldControlHelper", "../templating/UIFormatters"], function (Log, CommonUtils, FELibrary, DataModelPathHelper, PropertyHelper, FieldTemplating, Button, Dialog, MessageToast, Core, Fragment, XMLPreprocessor, XMLTemplateProcessor, EditMode, JSONModel, Any, MetaModelConverter, FieldControlHelper, UIFormatters) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/library", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/PropertyHelper", "sap/fe/macros/field/FieldTemplating", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageToast", "sap/ui/core/Core", "sap/ui/core/Fragment", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/mdc/enum/EditMode", "sap/ui/model/json/JSONModel", "../controls/Any", "../converters/MetaModelConverter", "../templating/FieldControlHelper", "../templating/UIFormatters"], function (Log, CommonUtils, BindingToolkit, FELibrary, DataModelPathHelper, PropertyHelper, FieldTemplating, Button, Dialog, MessageToast, Core, Fragment, XMLPreprocessor, XMLTemplateProcessor, EditMode, JSONModel, Any, MetaModelConverter, FieldControlHelper, UIFormatters) {
6
6
  "use strict";
7
7
 
8
8
  var isCollectionField = UIFormatters.isCollectionField;
@@ -20,6 +20,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
20
20
  var getAssociatedUnitPropertyPath = PropertyHelper.getAssociatedUnitPropertyPath;
21
21
  var getAssociatedUnitProperty = PropertyHelper.getAssociatedUnitProperty;
22
22
  var enhanceDataModelPath = DataModelPathHelper.enhanceDataModelPath;
23
+ var pathInModel = BindingToolkit.pathInModel;
24
+ var or = BindingToolkit.or;
25
+ var not = BindingToolkit.not;
26
+ var ifElse = BindingToolkit.ifElse;
27
+ var constant = BindingToolkit.constant;
28
+ var compileExpression = BindingToolkit.compileExpression;
23
29
 
24
30
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
25
31
 
@@ -32,9 +38,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
32
38
  * Initializes the value at final or deepest level path with a blank array.
33
39
  * Return an empty array pointing to the final or deepest level path.
34
40
  *
35
- * @param {string} sPath Property path
36
- * @param {Array} aValues Array instance where the default data needs to be added
37
- * @returns {Array}
41
+ * @param sPath Property path
42
+ * @param aValues Array instance where the default data needs to be added
43
+ * @returns The final path
38
44
  */
39
45
  initLastLevelOfPropertyPath: function (sPath, aValues) {
40
46
  var aFinalPath;
@@ -48,7 +54,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
48
54
  sFullPath = sFullPath + sPropertyPath;
49
55
  index++;
50
56
  } else if (!aFinalPath[sPropertyPath]) {
51
- sFullPath = sFullPath + "/" + sPropertyPath;
57
+ sFullPath = "".concat(sFullPath, "/").concat(sPropertyPath);
52
58
 
53
59
  if (sFullPath !== sPath) {
54
60
  aFinalPath[sPropertyPath] = {};
@@ -64,10 +70,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
64
70
  /**
65
71
  * Method to get unique values for given array values.
66
72
  *
67
- * @param {string} sValue Property value
68
- * @param {number} index Index of the property value
69
- * @param {Array} self Instance of the array
70
- * @returns {boolean}
73
+ * @param sValue Property value
74
+ * @param index Index of the property value
75
+ * @param self Instance of the array
76
+ * @returns The unique value
71
77
  */
72
78
  getUniqueValues: function (sValue, index, self) {
73
79
  if (sValue != undefined && sValue != null) {
@@ -79,9 +85,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
79
85
  * Gets the property value for a multi-level path (for example: _Materials/Material_Details gets the value of Material_Details under _Materials Object).
80
86
  * Returns the propertyValue, which can be of any type (string, number, etc..).
81
87
  *
82
- * @param {string} sDataPropertyPath Property path
83
- * @param {object} oValues Object of property values
84
- * @returns {*}
88
+ * @param sDataPropertyPath Property path
89
+ * @param oValues Object of property values
90
+ * @returns The property value
85
91
  */
86
92
  getValueForMultiLevelPath: function (sDataPropertyPath, oValues) {
87
93
  if (sDataPropertyPath && sDataPropertyPath.indexOf("/") > 0) {
@@ -101,9 +107,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
101
107
  * => If propertyValue for all selected contexts is empty, then < Leave Blank > is preselected.
102
108
  *
103
109
  *
104
- * @param {Array} aContexts Contexts for mass edit
105
- * @param {string} sDataPropertyPath Data property path
106
- * @returns {string}
110
+ * @param aContexts Contexts for mass edit
111
+ * @param sDataPropertyPath Data property path
112
+ * @returns The key path
107
113
  */
108
114
  getDefaultSelectionPathComboBox: function (aContexts, sDataPropertyPath) {
109
115
  if (sDataPropertyPath && aContexts.length > 0) {
@@ -120,11 +126,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
120
126
  var aUniquePropertyValues = aPropertyValues.filter(MassEditHelper.getUniqueValues);
121
127
 
122
128
  if (aUniquePropertyValues.length > 1) {
123
- return "Default/" + sDataPropertyPath;
129
+ return "Default/".concat(sDataPropertyPath);
124
130
  } else if (aUniquePropertyValues.length === 0) {
125
- return "Empty/" + sDataPropertyPath;
131
+ return "Empty/".concat(sDataPropertyPath);
126
132
  } else if (aUniquePropertyValues.length === 1) {
127
- return sDataPropertyPath + "/" + aUniquePropertyValues[0];
133
+ return "".concat(sDataPropertyPath, "/").concat(aUniquePropertyValues[0]);
128
134
  }
129
135
  }
130
136
  },
@@ -132,9 +138,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
132
138
  /**
133
139
  * Checks hidden annotation value [both static and path based] for table's selected context.
134
140
  *
135
- * @param {*} hiddenValue Hidden annotation value / path for field
136
- * @param {Array} aContexts Contexts for mass edit
137
- * @returns {boolean}
141
+ * @param hiddenValue Hidden annotation value / path for field
142
+ * @param aContexts Contexts for mass edit
143
+ * @returns The hidden annotation value
138
144
  */
139
145
  getHiddenValueForContexts: function (hiddenValue, aContexts) {
140
146
  if (hiddenValue && hiddenValue.$Path) {
@@ -164,10 +170,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
164
170
  /**
165
171
  * Get text path for the mass edit field.
166
172
  *
167
- * @param {string} property Property path
168
- * @param {any} textBinding Text Binding Info
169
- * @param {string} displayMode Display mode
170
- * @returns {string | undefined} Text Property Path if it exists
173
+ * @param property Property path
174
+ * @param textBinding Text Binding Info
175
+ * @param displayMode Display mode
176
+ * @returns Text Property Path if it exists
171
177
  */
172
178
  getTextPath: function (property, textBinding, displayMode) {
173
179
  var descriptionPath;
@@ -190,16 +196,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
190
196
  /**
191
197
  * Initializes a JSON Model for properties of dialog fields [label, visiblity, dataproperty, etc.].
192
198
  *
193
- * @param {object} oTable Instance of Table
194
- * @param {Array} aContexts Contexts for mass edit
195
- * @param {Array} aDataArray Array containing data related to the dialog used by both the static and the runtime model
196
- * @returns {object}
199
+ * @param oTable Instance of Table
200
+ * @param aContexts Contexts for mass edit
201
+ * @param aDataArray Array containing data related to the dialog used by both the static and the runtime model
202
+ * @returns The model
197
203
  */
198
204
  prepareDataForDialog: function (oTable, aContexts, aDataArray) {
199
205
  var oMetaModel = oTable && oTable.getModel().getMetaModel(),
200
206
  sCurrentEntitySetName = oTable.data("metaPath"),
201
207
  aTableFields = MassEditHelper.getTableFields(oTable),
202
- oEntityTypeContext = oMetaModel.getContext(sCurrentEntitySetName + "/@"),
208
+ oEntityTypeContext = oMetaModel.getContext("".concat(sCurrentEntitySetName, "/@")),
203
209
  oEntitySetContext = oMetaModel.getContext(sCurrentEntitySetName),
204
210
  oDataModelObjectPath = getInvolvedDataModelObjects(oEntityTypeContext);
205
211
  var oDataFieldModel = new JSONModel();
@@ -228,7 +234,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
228
234
  oTextBinding = getTextBinding(oDataModelObjectPath, {}, true) || {};
229
235
  var oFieldContext = oMetaModel.getContext(oColumnInfo.annotationPath),
230
236
  oDataFieldConverted = convertMetaModelContext(oFieldContext),
231
- oPropertyContext = oMetaModel.getContext(sCurrentEntitySetName + "/" + sDataPropertyPath + "@"),
237
+ oPropertyContext = oMetaModel.getContext("".concat(sCurrentEntitySetName, "/").concat(sDataPropertyPath, "@")),
232
238
  oInterface = oPropertyContext && oPropertyContext.getInterface();
233
239
  var oDataModelPath = getInvolvedDataModelObjects(oFieldContext, oEntitySetContext);
234
240
 
@@ -243,7 +249,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
243
249
  return oInterface.getModel();
244
250
  },
245
251
  getPath: function () {
246
- return sCurrentEntitySetName + "/" + sDataPropertyPath;
252
+ return "".concat(sCurrentEntitySetName, "/").concat(sDataPropertyPath);
247
253
  }
248
254
  };
249
255
  oPropertyInfo = oDataFieldConverted._type === "Property" ? oDataFieldConverted : oDataFieldConverted && oDataFieldConverted.Value && oDataFieldConverted.Value.$target || oDataFieldConverted && oDataFieldConverted.Target && oDataFieldConverted.Target.$target; // Datafield is not included in the FieldControl calculation, needs to be implemented
@@ -258,17 +264,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
258
264
 
259
265
 
260
266
  bValueHelpEnabled = hasValueHelp(oPropertyInfo);
261
- sUnitPropertyPath = (hasCurrency(oPropertyInfo) || hasUnit(oPropertyInfo)) && getAssociatedUnitPropertyPath(oPropertyInfo);
267
+ sUnitPropertyPath = (hasCurrency(oPropertyInfo) || hasUnit(oPropertyInfo)) && getAssociatedUnitPropertyPath(oPropertyInfo) || "";
262
268
  var unitPropertyInfo = sUnitPropertyPath && getAssociatedUnitProperty(oPropertyInfo);
263
269
  bValueHelpEnabledForUnit = unitPropertyInfo && hasValueHelp(unitPropertyInfo); // EditMode and InputType
264
270
 
265
271
  var propertyForFieldControl = oPropertyInfo && oPropertyInfo.Value ? oPropertyInfo.Value : oPropertyInfo;
266
- var expBinding = getEditMode(propertyForFieldControl, oDataModelPath, false, false, oDataFieldConverted, true);
272
+ var expBinding = getEditMode(propertyForFieldControl, oDataModelPath, false, false, oDataFieldConverted, constant(true));
267
273
  var editModeValues = Object.keys(EditMode);
268
274
  var editModeIsStatic = !!expBinding && editModeValues.includes(expBinding);
269
275
  var editable = !!expBinding && (editModeIsStatic && expBinding === EditMode.Editable || !editModeIsStatic);
276
+ var navPropertyWithValueHelp = sDataPropertyPath.includes("/") && bValueHelpEnabled;
270
277
 
271
- if (!editable) {
278
+ if (!editable || navPropertyWithValueHelp) {
272
279
  return;
273
280
  }
274
281
 
@@ -281,8 +288,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
281
288
  "label": sLabelText,
282
289
  "dataProperty": sDataPropertyPath,
283
290
  "isValueHelpEnabled": bValueHelpEnabled ? bValueHelpEnabled : false,
284
- "unitProperty": sUnitPropertyPath ? sUnitPropertyPath : false,
285
- "isValueHelpEnabledForUnit": bValueHelpEnabledForUnit ? bValueHelpEnabledForUnit : false,
291
+ "unitProperty": sUnitPropertyPath && !sDataPropertyPath.includes("/") ? sUnitPropertyPath : false,
292
+ "isValueHelpEnabledForUnit": bValueHelpEnabledForUnit && !sUnitPropertyPath.includes("/") ? bValueHelpEnabledForUnit : false,
286
293
  "propertyPathForValueHelp": "".concat(sCurrentEntitySetName, "/").concat(sDataPropertyPath),
287
294
  "propertyPathForValueHelpUnit": sUnitPropertyPath && "".concat(sCurrentEntitySetName, "/").concat(sUnitPropertyPath),
288
295
  "isFieldRequired": getRequiredExpression(oPropertyInfo, oDataFieldConverted, true),
@@ -330,15 +337,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
330
337
  "massEditTitle": oResourceBundle.getText("C_MASS_EDIT_DIALOG_TITLE", iSelectedContexts.toString()),
331
338
  "applyButtonText": bDisplayMode ? oResourceBundle.getText("C_MASS_EDIT_SAVE_BUTTON_TEXT") : oResourceBundle.getText("C_MASS_EDIT_APPLY_BUTTON_TEXT"),
332
339
  "useValueHelpValue": "< Use Value Help >",
333
- "cancelButtonText": oResourceBundle.getText("C_MASS_EDIT_CANCEL_BUTTON_TEXT")
340
+ "cancelButtonText": oResourceBundle.getText("C_COMMON_OBJECT_PAGE_CANCEL"),
341
+ "noFields": oResourceBundle.getText("C_MASS_EDIT_NO_EDITABLE_FIELDS"),
342
+ "okButtonText": oResourceBundle.getText("C_COMMON_DIALOG_OK")
334
343
  };
335
344
  },
336
345
 
337
346
  /**
338
347
  * Adds a suffix to the 'keep existing' property of the comboBox.
339
348
  *
340
- * @param {string} sInputType InputType of the field
341
- * @returns {string}
349
+ * @param sInputType InputType of the field
350
+ * @returns The modified string
342
351
  */
343
352
  // getSuffixForKeepExisiting: function (sInputType: string) {
344
353
  // let sResult = "Values";
@@ -359,24 +368,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
359
368
  /**
360
369
  * Adds default values to the model [Keep Existing Values, Leave Blank].
361
370
  *
362
- * @param {Array} aValues Array instance where the default data needs to be added
363
- * @param {Array} aContexts Contexts for mass edit
364
- * @param {object} oDefaultValues Default values from Application Manifest
365
- * @param {object} oPropertyInfo Property information
366
- * @param {boolean} bUOMField
371
+ * @param aValues Array instance where the default data needs to be added
372
+ * @param oDefaultValues Default values from Application Manifest
373
+ * @param oPropertyInfo Property information
374
+ * @param bUOMField
367
375
  */
368
- setDefaultValuesToDialog: function (aValues, aContexts, oDefaultValues, oPropertyInfo, bUOMField) {
376
+ setDefaultValuesToDialog: function (aValues, oDefaultValues, oPropertyInfo, bUOMField) {
369
377
  var sPropertyPath = bUOMField ? oPropertyInfo.unitProperty : oPropertyInfo.dataProperty,
370
378
  sInputType = oPropertyInfo.inputType,
371
379
  bPropertyRequired = oPropertyInfo.isFieldRequired; // const sSuffixForKeepExisting = MassEditHelper.getSuffixForKeepExisiting(sInputType);
372
380
 
373
381
  var sSuffixForKeepExisting = "Values";
374
- aValues.defaultOptions = aValues.defaultOptions || []; //TODO - Add <<Use Value Help or control implmentation>> and related key by checking if value help is enabled for property or Unit.
375
- //TODO - Add option Apply to Empty Fields only for Both Value Help and controls.
376
-
377
- var bValueExistsForPropertyPath = aContexts.some(function (oSelectedContext) {
378
- return oSelectedContext.getObject(sPropertyPath);
379
- });
382
+ aValues.defaultOptions = aValues.defaultOptions || [];
383
+ var selectOptionsExist = aValues.selectOptions && aValues.selectOptions.length > 0;
384
+ var keepEntry = {
385
+ text: "".concat(oDefaultValues.keepExistingPrefix, " ").concat(sSuffixForKeepExisting, " >"),
386
+ key: "Default/".concat(sPropertyPath)
387
+ };
380
388
 
381
389
  if (sInputType === "CheckBox") {
382
390
  var falseEntry = {
@@ -397,19 +405,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
397
405
  aValues.defaultOptions.unshift(falseEntry);
398
406
  aValues.unshift(truthyEntry);
399
407
  aValues.defaultOptions.unshift(truthyEntry);
400
- }
401
-
402
- if (oPropertyInfo.isValueHelpEnabled || oPropertyInfo.isValueHelpEnabledForUnit && bUOMField) {
403
- var vhdEntry = {
404
- text: oDefaultValues.useValueHelpValue,
405
- key: "UseValueHelpValue/" + sPropertyPath
406
- };
407
- aValues.unshift(vhdEntry);
408
- aValues.defaultOptions.unshift(vhdEntry);
409
- }
408
+ aValues.unshift(keepEntry);
409
+ aValues.defaultOptions.unshift(keepEntry);
410
+ } else {
411
+ if (oPropertyInfo.isValueHelpEnabled || oPropertyInfo.isValueHelpEnabledForUnit && bUOMField) {
412
+ var vhdEntry = {
413
+ text: oDefaultValues.useValueHelpValue,
414
+ key: "UseValueHelpValue/".concat(sPropertyPath)
415
+ };
416
+ aValues.unshift(vhdEntry);
417
+ aValues.defaultOptions.unshift(vhdEntry);
418
+ }
410
419
 
411
- if (sInputType != "CheckBox") {
412
- if (bValueExistsForPropertyPath) {
420
+ if (selectOptionsExist) {
413
421
  if (bPropertyRequired !== "true" && !bUOMField) {
414
422
  var clearEntry = {
415
423
  text: oDefaultValues.clearFieldValue,
@@ -418,32 +426,28 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
418
426
  aValues.unshift(clearEntry);
419
427
  aValues.defaultOptions.unshift(clearEntry);
420
428
  }
429
+
430
+ aValues.unshift(keepEntry);
431
+ aValues.defaultOptions.unshift(keepEntry);
421
432
  } else {
422
433
  var emptyEntry = {
423
434
  text: oDefaultValues.leaveBlankValue,
424
- key: "Empty/".concat(sPropertyPath)
435
+ key: "Default/".concat(sPropertyPath)
425
436
  };
426
437
  aValues.unshift(emptyEntry);
427
438
  aValues.defaultOptions.unshift(emptyEntry);
428
439
  }
429
440
  }
430
-
431
- var keepEntry = {
432
- text: oDefaultValues.keepExistingPrefix + " " + sSuffixForKeepExisting + " >",
433
- key: "Default/" + sPropertyPath
434
- };
435
- aValues.unshift(keepEntry);
436
- aValues.defaultOptions.unshift(keepEntry);
437
441
  },
438
442
 
439
443
  /**
440
444
  * Get text arrangement info for a context property.
441
445
  *
442
- * @param {string} property Property Path
443
- * @param {string} descriptionPath Path to text association of the property
444
- * @param {string} displayMode Display mode of the property and text association
445
- * @param {Context} selectedContext Context to find the full text
446
- * @returns {TextArrangementInfo}
446
+ * @param property Property Path
447
+ * @param descriptionPath Path to text association of the property
448
+ * @param displayMode Display mode of the property and text association
449
+ * @param selectedContext Context to find the full text
450
+ * @returns The text arrangement
447
451
  */
448
452
  getTextArrangementInfo: function (property, descriptionPath, displayMode, selectedContext) {
449
453
  var value = selectedContext.getObject(property),
@@ -465,17 +469,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
465
469
  case "ValueDescription":
466
470
  value = selectedContext.getObject(property) || "";
467
471
  descriptionValue = selectedContext.getObject(descriptionPath) || "";
468
- fullText = value + (descriptionValue && " (" + descriptionValue + ")");
472
+ fullText = descriptionValue ? "".concat(value, " (").concat(descriptionValue, ")") : value;
469
473
  break;
470
474
 
471
475
  case "DescriptionValue":
472
476
  value = selectedContext.getObject(property) || "";
473
477
  descriptionValue = selectedContext.getObject(descriptionPath) || "";
474
- fullText = descriptionValue ? descriptionValue + " (" + value + ")" : value;
478
+ fullText = descriptionValue ? "".concat(descriptionValue, " (").concat(value, ")") : value;
475
479
  break;
476
480
 
477
481
  default:
478
- Log.info("Display Property not applicable: " + property);
482
+ Log.info("Display Property not applicable: ".concat(property));
479
483
  break;
480
484
  }
481
485
  }
@@ -493,8 +497,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
493
497
  /**
494
498
  * Return the visibility valuue for the ManagedObject Any.
495
499
  *
496
- * @param {AnyType} any The ManagedObject Any to be used to calculate the visible value of the binding.
497
- * @returns {boolean} Returns true if the mass edit field is editable.
500
+ * @param any The ManagedObject Any to be used to calculate the visible value of the binding.
501
+ * @returns Returns true if the mass edit field is editable.
498
502
  */
499
503
  isEditable: function (any) {
500
504
  var binding = any.getBinding("any");
@@ -505,25 +509,25 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
505
509
  /**
506
510
  * Calculate and update the visibility of mass edit field on change of the ManagedObject Any binding.
507
511
  *
508
- * @param {JSONModel} oDialogDataModel Model to be used runtime.
509
- * @param {string} dataProperty Field name.
512
+ * @param oDialogDataModel Model to be used runtime.
513
+ * @param dataProperty Field name.
510
514
  */
511
515
  onContextEditableChange: function (oDialogDataModel, dataProperty) {
512
- var objectsForVisibility = oDialogDataModel.getProperty("/values/" + dataProperty + "/objectsForVisibility") || [];
516
+ var objectsForVisibility = oDialogDataModel.getProperty("/values/".concat(dataProperty, "/objectsForVisibility")) || [];
513
517
  var editable = objectsForVisibility.some(MassEditHelper.isEditable);
514
518
 
515
519
  if (editable) {
516
- oDialogDataModel.setProperty("/values/" + dataProperty + "/visible", editable);
520
+ oDialogDataModel.setProperty("/values/".concat(dataProperty, "/visible"), editable);
517
521
  }
518
522
  },
519
523
 
520
524
  /**
521
525
  * Update Managed Object Any for visibility of the mass edit fields.
522
526
  *
523
- * @param {AnyType} mOToUse The ManagedObject Any to be used to calculate the visible value of the binding.
524
- * @param {JSONModel} oDialogDataModel Model to be used runtime.
525
- * @param {string} dataProperty Field name.
526
- * @param {any} values Values of the field.
527
+ * @param mOToUse The ManagedObject Any to be used to calculate the visible value of the binding.
528
+ * @param oDialogDataModel Model to be used runtime.
529
+ * @param dataProperty Field name.
530
+ * @param values Values of the field.
527
531
  */
528
532
  updateOnContextChange: function (mOToUse, oDialogDataModel, dataProperty, values) {
529
533
  var binding = mOToUse.getBinding("any");
@@ -535,9 +539,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
535
539
  /**
536
540
  * Get bound object to calculate the visibility of contexts.
537
541
  *
538
- * @param {BindingExpression<boolean> | ExpressionOrPrimitive<boolean>} expBinding Binding String object.
539
- * @param {object} context Context the binding value.
540
- * @returns {AnyType} The ManagedObject Any to be used to calculate the visible value of the binding.
542
+ * @param expBinding Binding String object.
543
+ * @param context Context the binding value.
544
+ * @returns The ManagedObject Any to be used to calculate the visible value of the binding.
541
545
  */
542
546
  getBoundObject: function (expBinding, context) {
543
547
  var mOToUse = new Any({
@@ -552,12 +556,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
552
556
  /**
553
557
  * Get the visibility of the field.
554
558
  *
555
- * @param {BindingExpression<boolean> | ExpressionOrPrimitive<boolean>} expBinding Binding String object.
556
- * @param {JSONModel} oDialogDataModel Model to be used runtime.
557
- * @param {string} dataProperty Field name.
558
- * @param {any} values Values of the field.
559
- * @param {object} context Context the binding value.
560
- * @returns {boolean} Returns true if the mass edit field is editable.
559
+ * @param expBinding Binding String object.
560
+ * @param oDialogDataModel Model to be used runtime.
561
+ * @param dataProperty Field name.
562
+ * @param values Values of the field.
563
+ * @param context Context the binding value.
564
+ * @returns Returns true if the mass edit field is editable.
561
565
  */
562
566
  getFieldVisiblity: function (expBinding, oDialogDataModel, dataProperty, values, context) {
563
567
  var mOToUse = MassEditHelper.getBoundObject(expBinding, context);
@@ -575,11 +579,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
575
579
  * => The model consists of values shown in the comboBox of the dialog (Leave Blank, Keep Existing Values, or any property value for the selected context, etc.)
576
580
  * => The model will capture runtime changes in the results property (the value entered in the comboBox).
577
581
  *
578
- * @param {Array} aContexts Contexts for mass edit
579
- * @param {Array} aDataArray Array containing data related to the dialog used by both the static and the runtime model
580
- * @param {object} oDefaultValues Default values from i18n
581
- * @param {Context} dialogContext Transient context for mass edit dialog.
582
- * @returns {object}
582
+ * @param aContexts Contexts for mass edit
583
+ * @param aDataArray Array containing data related to the dialog used by both the static and the runtime model
584
+ * @param oDefaultValues Default values from i18n
585
+ * @param dialogContext Transient context for mass edit dialog.
586
+ * @returns The runtime model
583
587
  */
584
588
  setRuntimeModelOnDialog: function (aContexts, aDataArray, oDefaultValues, dialogContext) {
585
589
  var aValues = [];
@@ -591,21 +595,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
591
595
  "unitData": aUnitData,
592
596
  "results": aResults,
593
597
  "readablePropertyData": aReadOnlyFieldInfo,
594
- "selectedKey": undefined
598
+ "selectedKey": undefined,
599
+ "noFields": oDefaultValues.noFields
595
600
  };
596
601
  var oDialogDataModel = new JSONModel(oData);
597
- aDataArray.forEach(function (oData) {
602
+ aDataArray.forEach(function (oInData) {
598
603
  var oTextInfo;
599
604
  var sPropertyKey;
600
605
  var sUnitPropertyName;
601
606
  var oDistinctValueMap = {};
602
607
  var oDistinctUnitMap = {};
603
608
 
604
- if (oData.dataProperty && oData.dataProperty.indexOf("/") > -1) {
605
- var aFinalPath = MassEditHelper.initLastLevelOfPropertyPath(oData.dataProperty, aValues
609
+ if (oInData.dataProperty && oInData.dataProperty.indexOf("/") > -1) {
610
+ var aFinalPath = MassEditHelper.initLastLevelOfPropertyPath(oInData.dataProperty, aValues
606
611
  /*, dialogContext */
607
612
  );
608
- var aPropertyPaths = oData.dataProperty.split("/");
613
+ var aPropertyPaths = oInData.dataProperty.split("/");
609
614
 
610
615
  var _iterator = _createForOfIteratorHelper(aContexts),
611
616
  _step;
@@ -613,11 +618,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
613
618
  try {
614
619
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
615
620
  var context = _step.value;
616
- var sMultiLevelPathValue = context.getObject(oData.dataProperty);
617
- sPropertyKey = oData.dataProperty + "/" + sMultiLevelPathValue;
621
+ var sMultiLevelPathValue = context.getObject(oInData.dataProperty);
622
+ sPropertyKey = "".concat(oInData.dataProperty, "/").concat(sMultiLevelPathValue);
618
623
 
619
624
  if (!oDistinctValueMap[sPropertyKey] && aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]]) {
620
- oTextInfo = MassEditHelper.getTextArrangementInfo(oData.dataProperty, oData.descriptionPath, oData.display, context);
625
+ oTextInfo = MassEditHelper.getTextArrangementInfo(oInData.dataProperty, oInData.descriptionPath, oInData.display, context);
621
626
  aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]].push({
622
627
  "text": oTextInfo && oTextInfo.fullText || sMultiLevelPathValue,
623
628
  "key": sPropertyKey,
@@ -636,17 +641,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
636
641
  }
637
642
 
638
643
  aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]].textInfo = {
639
- descriptionPath: oData.descriptionPath,
640
- valuePath: oData.dataProperty,
641
- displayMode: oData.display
644
+ descriptionPath: oInData.descriptionPath,
645
+ valuePath: oInData.dataProperty,
646
+ displayMode: oInData.display
642
647
  };
643
648
  } else {
644
- aValues[oData.dataProperty] = aValues[oData.dataProperty] || [];
645
- aValues[oData.dataProperty]["selectOptions"] = aValues[oData.dataProperty]["selectOptions"] || [];
649
+ aValues[oInData.dataProperty] = aValues[oInData.dataProperty] || [];
650
+ aValues[oInData.dataProperty]["selectOptions"] = aValues[oInData.dataProperty]["selectOptions"] || [];
646
651
 
647
- if (oData.unitProperty) {
648
- aUnitData[oData.unitProperty] = aUnitData[oData.unitProperty] || [];
649
- aUnitData[oData.unitProperty]["selectOptions"] = aUnitData[oData.unitProperty]["selectOptions"] || [];
652
+ if (oInData.unitProperty) {
653
+ aUnitData[oInData.unitProperty] = aUnitData[oInData.unitProperty] || [];
654
+ aUnitData[oInData.unitProperty]["selectOptions"] = aUnitData[oInData.unitProperty]["selectOptions"] || [];
650
655
  }
651
656
 
652
657
  var _iterator2 = _createForOfIteratorHelper(aContexts),
@@ -658,39 +663,39 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
658
663
 
659
664
  var oDataObject = _context.getObject();
660
665
 
661
- sPropertyKey = oData.dataProperty + "/" + oDataObject[oData.dataProperty];
666
+ sPropertyKey = "".concat(oInData.dataProperty, "/").concat(oDataObject[oInData.dataProperty]);
662
667
 
663
- if (oData.dataProperty && oDataObject[oData.dataProperty] && !oDistinctValueMap[sPropertyKey]) {
664
- if (oData.inputType != "CheckBox") {
665
- oTextInfo = MassEditHelper.getTextArrangementInfo(oData.dataProperty, oData.descriptionPath, oData.display, _context);
668
+ if (oInData.dataProperty && oDataObject[oInData.dataProperty] && !oDistinctValueMap[sPropertyKey]) {
669
+ if (oInData.inputType != "CheckBox") {
670
+ oTextInfo = MassEditHelper.getTextArrangementInfo(oInData.dataProperty, oInData.descriptionPath, oInData.display, _context);
666
671
  var entry = {
667
- "text": oTextInfo && oTextInfo.fullText || oDataObject[oData.dataProperty],
672
+ "text": oTextInfo && oTextInfo.fullText || oDataObject[oInData.dataProperty],
668
673
  "key": sPropertyKey,
669
674
  "textInfo": oTextInfo
670
675
  };
671
- aValues[oData.dataProperty].push(entry);
672
- aValues[oData.dataProperty]["selectOptions"].push(entry);
676
+ aValues[oInData.dataProperty].push(entry);
677
+ aValues[oInData.dataProperty]["selectOptions"].push(entry);
673
678
  }
674
679
 
675
- oDistinctValueMap[sPropertyKey] = oDataObject[oData.dataProperty];
680
+ oDistinctValueMap[sPropertyKey] = oDataObject[oInData.dataProperty];
676
681
  }
677
682
 
678
- if (oData.unitProperty && oDataObject[oData.unitProperty]) {
679
- sUnitPropertyName = oData.unitProperty + "/" + oDataObject[oData.unitProperty];
683
+ if (oInData.unitProperty && oDataObject[oInData.unitProperty]) {
684
+ sUnitPropertyName = "".concat(oInData.unitProperty, "/").concat(oDataObject[oInData.unitProperty]);
680
685
 
681
686
  if (!oDistinctUnitMap[sUnitPropertyName]) {
682
- if (oData.inputType != "CheckBox") {
683
- oTextInfo = MassEditHelper.getTextArrangementInfo(oData.unitProperty, oData.descriptionPath, oData.display, _context);
687
+ if (oInData.inputType != "CheckBox") {
688
+ oTextInfo = MassEditHelper.getTextArrangementInfo(oInData.unitProperty, oInData.descriptionPath, oInData.display, _context);
684
689
  var unitEntry = {
685
- "text": oTextInfo && oTextInfo.fullText || oDataObject[oData.unitProperty],
690
+ "text": oTextInfo && oTextInfo.fullText || oDataObject[oInData.unitProperty],
686
691
  "key": sUnitPropertyName,
687
692
  "textInfo": oTextInfo
688
693
  };
689
- aUnitData[oData.unitProperty].push(unitEntry);
690
- aUnitData[oData.unitProperty]["selectOptions"].push(unitEntry);
694
+ aUnitData[oInData.unitProperty].push(unitEntry);
695
+ aUnitData[oInData.unitProperty]["selectOptions"].push(unitEntry);
691
696
  }
692
697
 
693
- oDistinctUnitMap[sUnitPropertyName] = oDataObject[oData.unitProperty];
698
+ oDistinctUnitMap[sUnitPropertyName] = oDataObject[oInData.unitProperty];
694
699
  }
695
700
  }
696
701
  }
@@ -700,104 +705,104 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
700
705
  _iterator2.f();
701
706
  }
702
707
 
703
- aValues[oData.dataProperty].textInfo = {
704
- descriptionPath: oData.descriptionPath,
705
- valuePath: oData.dataProperty,
706
- displayMode: oData.display
708
+ aValues[oInData.dataProperty].textInfo = {
709
+ descriptionPath: oInData.descriptionPath,
710
+ valuePath: oInData.dataProperty,
711
+ displayMode: oInData.display
707
712
  };
708
- }
709
713
 
710
- if (Object.keys(oDistinctValueMap).length === 1) {
711
- dialogContext.setProperty(oData.dataProperty, sPropertyKey && oDistinctValueMap[sPropertyKey]);
712
- }
714
+ if (Object.keys(oDistinctValueMap).length === 1) {
715
+ dialogContext.setProperty(oInData.dataProperty, sPropertyKey && oDistinctValueMap[sPropertyKey]);
716
+ }
713
717
 
714
- if (Object.keys(oDistinctUnitMap).length === 1) {
715
- dialogContext.setProperty(oData.unitProperty, sUnitPropertyName && oDistinctUnitMap[sUnitPropertyName]);
718
+ if (Object.keys(oDistinctUnitMap).length === 1) {
719
+ dialogContext.setProperty(oInData.unitProperty, sUnitPropertyName && oDistinctUnitMap[sUnitPropertyName]);
720
+ }
716
721
  }
717
722
  });
718
- aDataArray.forEach(function (oData) {
723
+ aDataArray.forEach(function (oInData) {
719
724
  var values = {};
720
725
 
721
- if (oData.dataProperty.indexOf("/") > -1) {
722
- var sMultiLevelPropPathValue = MassEditHelper.getValueForMultiLevelPath(oData.dataProperty, aValues);
726
+ if (oInData.dataProperty.indexOf("/") > -1) {
727
+ var sMultiLevelPropPathValue = MassEditHelper.getValueForMultiLevelPath(oInData.dataProperty, aValues);
723
728
 
724
729
  if (!sMultiLevelPropPathValue) {
725
730
  sMultiLevelPropPathValue.push({
726
731
  text: oDefaultValues.leaveBlankValue,
727
- key: "Empty/" + oData.dataProperty
732
+ key: "Empty/".concat(oInData.dataProperty)
728
733
  });
729
734
  } else {
730
- MassEditHelper.setDefaultValuesToDialog(sMultiLevelPropPathValue, aContexts, oDefaultValues, oData);
735
+ MassEditHelper.setDefaultValuesToDialog(sMultiLevelPropPathValue, oDefaultValues, oInData);
731
736
  }
732
737
 
733
738
  values = sMultiLevelPropPathValue;
734
- } else if (aValues[oData.dataProperty]) {
735
- aValues[oData.dataProperty] = aValues[oData.dataProperty] || [];
736
- MassEditHelper.setDefaultValuesToDialog(aValues[oData.dataProperty], aContexts, oDefaultValues, oData);
737
- values = aValues[oData.dataProperty];
739
+ } else if (aValues[oInData.dataProperty]) {
740
+ aValues[oInData.dataProperty] = aValues[oInData.dataProperty] || [];
741
+ MassEditHelper.setDefaultValuesToDialog(aValues[oInData.dataProperty], oDefaultValues, oInData);
742
+ values = aValues[oInData.dataProperty];
738
743
  }
739
744
 
740
- if (aUnitData[oData.unitProperty] && aUnitData[oData.unitProperty].length) {
741
- MassEditHelper.setDefaultValuesToDialog(aUnitData[oData.unitProperty], aContexts, oDefaultValues, oData, true);
742
- aUnitData[oData.unitProperty].textInfo = {};
743
- aUnitData[oData.unitProperty].selectedKey = MassEditHelper.getDefaultSelectionPathComboBox(aContexts, oData.unitProperty);
744
- aUnitData[oData.unitProperty].inputType = oData.inputType;
745
- } else if (oData.dataProperty && aValues[oData.dataProperty] && !aValues[oData.dataProperty].length || oData.unitProperty && aUnitData[oData.unitProperty] && !aUnitData[oData.unitProperty].length) {
746
- var bClearFieldOrBlankValueExists = aValues[oData.dataProperty] && aValues[oData.dataProperty].some(function (obj) {
745
+ if (aUnitData[oInData.unitProperty] && aUnitData[oInData.unitProperty].length) {
746
+ MassEditHelper.setDefaultValuesToDialog(aUnitData[oInData.unitProperty], oDefaultValues, oInData, true);
747
+ aUnitData[oInData.unitProperty].textInfo = {};
748
+ aUnitData[oInData.unitProperty].selectedKey = MassEditHelper.getDefaultSelectionPathComboBox(aContexts, oInData.unitProperty);
749
+ aUnitData[oInData.unitProperty].inputType = oInData.inputType;
750
+ } else if (oInData.dataProperty && aValues[oInData.dataProperty] && !aValues[oInData.dataProperty].length || oInData.unitProperty && aUnitData[oInData.unitProperty] && !aUnitData[oInData.unitProperty].length) {
751
+ var bClearFieldOrBlankValueExists = aValues[oInData.dataProperty] && aValues[oInData.dataProperty].some(function (obj) {
747
752
  return obj.text === "< Clear Values >" || obj.text === "< Leave Blank >";
748
753
  });
749
754
 
750
- if (oData.dataProperty && !bClearFieldOrBlankValueExists) {
751
- aValues[oData.dataProperty].push({
755
+ if (oInData.dataProperty && !bClearFieldOrBlankValueExists) {
756
+ aValues[oInData.dataProperty].push({
752
757
  text: oDefaultValues.leaveBlankValue,
753
- key: "Empty/" + oData.dataProperty
758
+ key: "Empty/".concat(oInData.dataProperty)
754
759
  });
755
760
  }
756
761
 
757
- var bClearFieldOrBlankUnitValueExists = aUnitData[oData.unitProperty] && aUnitData[oData.unitProperty].some(function (obj) {
762
+ var bClearFieldOrBlankUnitValueExists = aUnitData[oInData.unitProperty] && aUnitData[oInData.unitProperty].some(function (obj) {
758
763
  return obj.text === "< Clear Values >" || obj.text === "< Leave Blank >";
759
764
  });
760
765
 
761
- if (oData.unitProperty) {
766
+ if (oInData.unitProperty) {
762
767
  if (!bClearFieldOrBlankUnitValueExists) {
763
- aUnitData[oData.unitProperty].push({
768
+ aUnitData[oInData.unitProperty].push({
764
769
  text: oDefaultValues.leaveBlankValue,
765
- key: "Empty/" + oData.unitProperty
770
+ key: "Empty/".concat(oInData.unitProperty)
766
771
  });
767
772
  }
768
773
 
769
- aUnitData[oData.unitProperty].textInfo = {};
770
- aUnitData[oData.unitProperty].selectedKey = MassEditHelper.getDefaultSelectionPathComboBox(aContexts, oData.unitProperty);
771
- aUnitData[oData.unitProperty].inputType = oData.inputType;
774
+ aUnitData[oInData.unitProperty].textInfo = {};
775
+ aUnitData[oInData.unitProperty].selectedKey = MassEditHelper.getDefaultSelectionPathComboBox(aContexts, oInData.unitProperty);
776
+ aUnitData[oInData.unitProperty].inputType = oInData.inputType;
772
777
  }
773
778
  }
774
779
 
775
- if (oData.isPropertyReadOnly && typeof oData.isPropertyReadOnly === "boolean") {
780
+ if (oInData.isPropertyReadOnly && typeof oInData.isPropertyReadOnly === "boolean") {
776
781
  aReadOnlyFieldInfo.push({
777
- "property": oData.dataProperty,
778
- value: oData.isPropertyReadOnly,
782
+ "property": oInData.dataProperty,
783
+ value: oInData.isPropertyReadOnly,
779
784
  type: "Default"
780
785
  });
781
- } else if (oData.isPropertyReadOnly && oData.isPropertyReadOnly.operands && oData.isPropertyReadOnly.operands[0] && oData.isPropertyReadOnly.operands[0].operand1 && oData.isPropertyReadOnly.operands[0].operand2) {
786
+ } else if (oInData.isPropertyReadOnly && oInData.isPropertyReadOnly.operands && oInData.isPropertyReadOnly.operands[0] && oInData.isPropertyReadOnly.operands[0].operand1 && oInData.isPropertyReadOnly.operands[0].operand2) {
782
787
  // This needs to be refactored in accordance with the ReadOnlyExpression change
783
788
  aReadOnlyFieldInfo.push({
784
- "property": oData.dataProperty,
785
- propertyPath: oData.isPropertyReadOnly.operands[0].operand1.path,
786
- propertyValue: oData.isPropertyReadOnly.operands[0].operand2.value,
789
+ "property": oInData.dataProperty,
790
+ propertyPath: oInData.isPropertyReadOnly.operands[0].operand1.path,
791
+ propertyValue: oInData.isPropertyReadOnly.operands[0].operand2.value,
787
792
  type: "Path"
788
793
  });
789
794
  } // Setting visbility of the mass edit field.
790
795
 
791
796
 
792
- if (oData.editMode) {
793
- values.visible = oData.editMode === EditMode.Editable || aContexts.some(MassEditHelper.getFieldVisiblity.bind(MassEditHelper, oData.editMode, oDialogDataModel, oData.dataProperty, values));
797
+ if (oInData.editMode) {
798
+ values.visible = oInData.editMode === EditMode.Editable || aContexts.some(MassEditHelper.getFieldVisiblity.bind(MassEditHelper, oInData.editMode, oDialogDataModel, oInData.dataProperty, values));
794
799
  } else {
795
800
  values.visible = true;
796
801
  }
797
802
 
798
- values.selectedKey = MassEditHelper.getDefaultSelectionPathComboBox(aContexts, oData.dataProperty);
799
- values.inputType = oData.inputType;
800
- values.unitProperty = oData.unitProperty;
803
+ values.selectedKey = MassEditHelper.getDefaultSelectionPathComboBox(aContexts, oInData.dataProperty);
804
+ values.inputType = oInData.inputType;
805
+ values.unitProperty = oInData.unitProperty;
801
806
  });
802
807
  return oDialogDataModel;
803
808
  },
@@ -805,9 +810,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
805
810
  /**
806
811
  * Gets transient context for dialog.
807
812
  *
808
- * @param {Table} table Instance of Table.
809
- * @param {Dialog} dialog Mass Edit Dialog.
810
- * @returns {object} Promise returning instance of dialog.
813
+ * @param table Instance of Table.
814
+ * @param dialog Mass Edit Dialog.
815
+ * @returns Promise returning instance of dialog.
811
816
  */
812
817
  getDialogContext: function (table, dialog) {
813
818
  var transCtx = dialog && dialog.getBindingContext();
@@ -837,22 +842,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
837
842
  /**
838
843
  * Create the mass edit dialog.
839
844
  *
840
- * @param {object} oTable Instance of Table
841
- * @param {Array} aContexts Contexts for mass edit
842
- * @param {object} oController Controller for the view
843
- * @returns {object} Promise returning instance of dialog.
845
+ * @param oTable Instance of Table
846
+ * @param aContexts Contexts for mass edit
847
+ * @param oController Controller for the view
848
+ * @returns Promise returning instance of dialog.
844
849
  */
845
850
  createDialog: function (oTable, aContexts, oController) {
846
- var sFragmentName = "sap/fe/core/controls/massEdit/MassEditDialog",
847
- aDataArray = [],
848
- oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core"),
849
- oDefaultValues = MassEditHelper.getDefaultTextsForDialog(oResourceBundle, aContexts.length, oTable),
850
- oDataFieldModel = MassEditHelper.prepareDataForDialog(oTable, aContexts, aDataArray),
851
- dialogContext = MassEditHelper.getDialogContext(oTable),
852
- oDialogDataModel = MassEditHelper.setRuntimeModelOnDialog(aContexts, aDataArray, oDefaultValues, dialogContext);
853
- return new Promise(function (resolve, reject) {
851
+ try {
852
+ var sFragmentName = "sap/fe/core/controls/massEdit/MassEditDialog",
853
+ aDataArray = [],
854
+ oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core"),
855
+ oDefaultValues = MassEditHelper.getDefaultTextsForDialog(oResourceBundle, aContexts.length, oTable),
856
+ oDataFieldModel = MassEditHelper.prepareDataForDialog(oTable, aContexts, aDataArray),
857
+ dialogContext = MassEditHelper.getDialogContext(oTable),
858
+ oDialogDataModel = MassEditHelper.setRuntimeModelOnDialog(aContexts, aDataArray, oDefaultValues, dialogContext);
854
859
  var oFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment");
855
- return Promise.resolve(XMLPreprocessor.process(oFragment, {
860
+ return Promise.resolve(Promise.resolve(XMLPreprocessor.process(oFragment, {
856
861
  name: sFragmentName
857
862
  }, {
858
863
  bindingContexts: {
@@ -861,112 +866,115 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
861
866
  models: {
862
867
  dataFieldModel: oDataFieldModel
863
868
  }
864
- })).then(function (oFragment) {
865
- return Fragment.load({
866
- definition: oFragment
867
- }).then(function (oDialogContent) {
869
+ }))).then(function (oCreatedFragment) {
870
+ return Promise.resolve(Fragment.load({
871
+ definition: oCreatedFragment
872
+ })).then(function (oDialogContent) {
868
873
  var DraftStatus = FELibrary.DraftStatus;
869
874
  var oDialog = new Dialog({
875
+ resizable: true,
870
876
  title: oDefaultValues.massEditTitle,
871
877
  content: [oDialogContent],
872
878
  afterOpen: MassEditHelper.onDialogOpen,
873
879
  beginButton: new Button({
874
- text: oDefaultValues.applyButtonText,
880
+ text: MassEditHelper.helpers.getExpBindingForApplyButtonTxt(oDefaultValues, oDataFieldModel.getObject("/")),
875
881
  type: "Emphasized",
876
882
  press: function (oEvent) {
877
- var _oController$getView, _oController$getView$;
878
-
879
- (_oController$getView = oController.getView()) === null || _oController$getView === void 0 ? void 0 : (_oController$getView$ = _oController$getView.getBindingContext("internal")) === null || _oController$getView$ === void 0 ? void 0 : _oController$getView$.setProperty("skipPatchHandlers", true);
880
- var oDialog = oEvent.getSource().getParent();
881
- var oModel = oDialog.getModel("fieldsInfo");
882
- var aResults = oModel.getProperty("/results");
883
- var aPropertyReadableInfo = oModel.getProperty("/readablePropertyData");
884
- var changePromise = [];
885
- var bReadOnlyField = false;
886
- var groupId; //let index = 0;
887
-
888
- var errorValues = [];
889
- aContexts.forEach(function (oSelectedContext, idx) {
890
- aResults.forEach(function (oResult) {
891
- //TODO - Add save implementation for Value Help.
892
- if (aPropertyReadableInfo) {
893
- bReadOnlyField = aPropertyReadableInfo.some(function (oPropertyInfo) {
894
- if (oResult.keyValue === oPropertyInfo.property) {
895
- if (oPropertyInfo.type === "Default") {
896
- return oPropertyInfo.value === true;
897
- } else if (oPropertyInfo.type === "Path" && oPropertyInfo.propertyValue && oPropertyInfo.propertyPath) {
898
- return oSelectedContext.getObject(oPropertyInfo.propertyPath) === oPropertyInfo.propertyValue;
883
+ try {
884
+ var _oController$getView, _oController$getView$;
885
+
886
+ (_oController$getView = oController.getView()) === null || _oController$getView === void 0 ? void 0 : (_oController$getView$ = _oController$getView.getBindingContext("internal")) === null || _oController$getView$ === void 0 ? void 0 : _oController$getView$.setProperty("skipPatchHandlers", true);
887
+ var oInDialog = oEvent.getSource().getParent();
888
+ var oModel = oInDialog.getModel("fieldsInfo");
889
+ var aResults = oModel.getProperty("/results");
890
+ var aPropertyReadableInfo = oModel.getProperty("/readablePropertyData");
891
+ var changePromise = [];
892
+ var bReadOnlyField = false;
893
+ var groupId;
894
+ var errorValues = [];
895
+ aContexts.forEach(function (oSelectedContext, idx) {
896
+ aResults.forEach(function (oResult) {
897
+ //TODO - Add save implementation for Value Help.
898
+ if (aPropertyReadableInfo) {
899
+ bReadOnlyField = aPropertyReadableInfo.some(function (oPropertyInfo) {
900
+ if (oResult.keyValue === oPropertyInfo.property) {
901
+ if (oPropertyInfo.type === "Default") {
902
+ return oPropertyInfo.value === true;
903
+ } else if (oPropertyInfo.type === "Path" && oPropertyInfo.propertyValue && oPropertyInfo.propertyPath) {
904
+ return oSelectedContext.getObject(oPropertyInfo.propertyPath) === oPropertyInfo.propertyValue;
905
+ }
899
906
  }
900
- }
901
- });
902
- }
907
+ });
908
+ }
903
909
 
904
- groupId = "$auto." + idx; //index += 1;
910
+ groupId = "$auto.".concat(idx); //index += 1;
905
911
 
906
- oController._editFlow.setDraftStatus(DraftStatus.Saving); //let promiseCount = 0;
912
+ oController._editFlow.setDraftStatus(DraftStatus.Saving); //let promiseCount = 0;
907
913
 
908
914
 
909
- if (oResult.keyValue && oResult.value !== "Default" && !bReadOnlyField) {
910
- changePromise.push(oSelectedContext.setProperty(oResult.keyValue, oResult.value, groupId).then(function () {
911
- return oSelectedContext;
912
- }).catch(function (oError) {
913
- errorValues.push(oSelectedContext.getObject());
914
- Log.error("Mass Edit: Something went wrong in updating entries.", oError);
915
- }));
916
- }
917
- });
918
- });
919
- Promise.allSettled(changePromise).then(function () {
920
- var oListBinding = oTable.getRowBinding();
921
- var oExtensionAPI = oController && oController.getExtensionAPI();
922
- return oExtensionAPI.refresh(oListBinding.getPath()).then(function () {
923
- var subtitleColumn = CommonUtils.getMessageColumn(oTable);
924
- var messages = sap.ui.getCore().getMessageManager().getMessageModel().getData();
925
- var boundTransitionErrorContexts = [];
926
- messages.forEach(function (message, idx) {
927
- var messageTargets = message.getTargets();
928
-
929
- if (messageTargets && messageTargets.length === 1 && messageTargets[0].length && message.persistent === true) {
930
- var boundTransitionErrorContext = aContexts.find(function (oContext) {
931
- return message.getTarget().indexOf(oContext.getPath()) !== -1;
932
- });
933
- boundTransitionErrorContexts.push(boundTransitionErrorContext);
934
- message.additionalText = boundTransitionErrorContext ? boundTransitionErrorContext.getObject()[subtitleColumn] : undefined;
915
+ if (oResult.keyValue && oResult.value !== "Default" && !bReadOnlyField) {
916
+ changePromise.push(oSelectedContext.setProperty(oResult.keyValue, oResult.value, groupId).then(function () {
917
+ return oSelectedContext;
918
+ }).catch(function (oError) {
919
+ errorValues.push(oSelectedContext.getObject());
920
+ Log.error("Mass Edit: Something went wrong in updating entries.", oError);
921
+ }));
935
922
  }
936
923
  });
924
+ });
925
+ return Promise.resolve(Promise.allSettled(changePromise)).then(function () {
926
+ var oListBinding = oTable.getRowBinding();
927
+ var oExtensionAPI = oController && oController.getExtensionAPI();
928
+ return Promise.resolve(oExtensionAPI.refresh(oListBinding.getPath())).then(function () {
929
+ var subtitleColumn = CommonUtils.getMessageColumn(oTable);
930
+ var messages = sap.ui.getCore().getMessageManager().getMessageModel().getData();
931
+ var boundTransitionErrorContexts = [];
932
+ messages.forEach(function (message) {
933
+ var messageTargets = message.getTargets();
934
+
935
+ if (messageTargets && messageTargets.length === 1 && messageTargets[0].length && message.persistent === true) {
936
+ var boundTransitionErrorContext = aContexts.find(function (oContext) {
937
+ return message.getTarget().indexOf(oContext.getPath()) !== -1;
938
+ });
939
+ boundTransitionErrorContexts.push(boundTransitionErrorContext);
940
+ message.additionalText = boundTransitionErrorContext ? boundTransitionErrorContext.getObject()[subtitleColumn] : undefined;
941
+ }
942
+ });
937
943
 
938
- if (boundTransitionErrorContexts.length === 0 && errorValues.length === 0) {
939
- oController._editFlow.setDraftStatus(DraftStatus.Saved);
944
+ if (aResults.length > 0 && boundTransitionErrorContexts.length === 0 && errorValues.length === 0) {
945
+ oController._editFlow.setDraftStatus(DraftStatus.Saved);
940
946
 
941
- var successToast = oResourceBundle.getText("C_MASS_EDIT_SUCCESS_TOAST");
942
- MessageToast.show(successToast);
943
- } else {
944
- if (errorValues.length + boundTransitionErrorContexts.length < oTable.getSelectedContexts().length) {
947
+ var successToast = oResourceBundle.getText("C_MASS_EDIT_SUCCESS_TOAST");
948
+ MessageToast.show(successToast);
949
+ } else if (errorValues.length + boundTransitionErrorContexts.length < oTable.getSelectedContexts().length) {
945
950
  oController._editFlow.setDraftStatus(DraftStatus.Saved);
946
951
  } else if (errorValues.length + boundTransitionErrorContexts.length === oTable.getSelectedContexts().length) {
947
952
  oController._editFlow.setDraftStatus(DraftStatus.Clear);
948
953
  }
949
- }
950
954
 
951
- oController._editFlow.getMessageHandler().showMessages();
955
+ oController._editFlow.getMessageHandler().showMessages();
952
956
 
953
- if (oDialog.isOpen()) {
954
- var _oController$getView2, _oController$getView3;
957
+ if (oInDialog.isOpen()) {
958
+ var _oController$getView2, _oController$getView3;
955
959
 
956
- oDialog.close();
957
- oDialog.destroy();
958
- (_oController$getView2 = oController.getView()) === null || _oController$getView2 === void 0 ? void 0 : (_oController$getView3 = _oController$getView2.getBindingContext("internal")) === null || _oController$getView3 === void 0 ? void 0 : _oController$getView3.setProperty("skipPatchHandlers", false);
959
- }
960
+ oInDialog.close();
961
+ oInDialog.destroy();
962
+ (_oController$getView2 = oController.getView()) === null || _oController$getView2 === void 0 ? void 0 : (_oController$getView3 = _oController$getView2.getBindingContext("internal")) === null || _oController$getView3 === void 0 ? void 0 : _oController$getView3.setProperty("skipPatchHandlers", false);
963
+ }
964
+ });
960
965
  });
961
- });
966
+ } catch (e) {
967
+ return Promise.reject(e);
968
+ }
962
969
  }
963
970
  }),
964
971
  endButton: new Button({
965
972
  text: oDefaultValues.cancelButtonText,
973
+ visible: MassEditHelper.helpers.hasEditableFieldsBinding(oDataFieldModel.getObject("/"), true),
966
974
  press: function (oEvent) {
967
- var oDialog = oEvent.getSource().getParent();
968
- oDialog.close();
969
- oDialog.destroy();
975
+ var oInDialog = oEvent.getSource().getParent();
976
+ oInDialog.close();
977
+ oInDialog.destroy();
970
978
  }
971
979
  })
972
980
  });
@@ -974,12 +982,30 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/library",
974
982
  oDialog.setModel(oDialogDataModel, "fieldsInfo");
975
983
  oDialog.setModel(model);
976
984
  oDialog.setBindingContext(dialogContext);
977
- resolve(oDialog);
985
+ return oDialog;
978
986
  });
979
- }).catch(reject);
980
- });
987
+ });
988
+ } catch (e) {
989
+ return Promise.reject(e);
990
+ }
991
+ },
992
+ helpers: {
993
+ getBindingExpForHasEditableFields: function (fields, editable) {
994
+ var totalExp = fields.reduce(function (expression, field) {
995
+ return or(expression, pathInModel("/values/" + field.dataProperty + "/visible", "fieldsInfo"));
996
+ }, constant(false));
997
+ return editable ? totalExp : not(totalExp);
998
+ },
999
+ getExpBindingForApplyButtonTxt: function (defaultValues, fields) {
1000
+ var editableExp = MassEditHelper.helpers.getBindingExpForHasEditableFields(fields, true);
1001
+ var totalExp = ifElse(editableExp, constant(defaultValues.applyButtonText), constant(defaultValues.okButtonText));
1002
+ return compileExpression(totalExp);
1003
+ },
1004
+ hasEditableFieldsBinding: function (fields, editable) {
1005
+ return compileExpression(MassEditHelper.helpers.getBindingExpForHasEditableFields(fields, editable));
1006
+ }
981
1007
  }
982
1008
  };
983
1009
  return MassEditHelper;
984
1010
  }, false);
985
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGVscGVyLnRzIl0sIm5hbWVzIjpbIk1hc3NFZGl0SGVscGVyIiwiaW5pdExhc3RMZXZlbE9mUHJvcGVydHlQYXRoIiwic1BhdGgiLCJhVmFsdWVzIiwiYUZpbmFsUGF0aCIsImluZGV4IiwiYVBhdGhzIiwic3BsaXQiLCJzRnVsbFBhdGgiLCJmb3JFYWNoIiwic1Byb3BlcnR5UGF0aCIsImdldFVuaXF1ZVZhbHVlcyIsInNWYWx1ZSIsInNlbGYiLCJ1bmRlZmluZWQiLCJpbmRleE9mIiwiZ2V0VmFsdWVGb3JNdWx0aUxldmVsUGF0aCIsInNEYXRhUHJvcGVydHlQYXRoIiwib1ZhbHVlcyIsImFQcm9wZXJ0eVBhdGhzIiwiUmVzdWx0IiwiZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveCIsImFDb250ZXh0cyIsImxlbmd0aCIsIm9TZWxlY3RlZENvbnRleHQiLCJhUHJvcGVydHlWYWx1ZXMiLCJvQ29udGV4dCIsIm9EYXRhT2JqZWN0IiwiZ2V0T2JqZWN0Iiwic011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uIiwiaGFzT3duUHJvcGVydHkiLCJwdXNoIiwiYVVuaXF1ZVByb3BlcnR5VmFsdWVzIiwiZmlsdGVyIiwiZ2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0cyIsImhpZGRlblZhbHVlIiwiJFBhdGgiLCJzb21lIiwiZ2V0SW5wdXRUeXBlIiwicHJvcGVydHlJbmZvIiwiZGF0YUZpZWxkQ29udmVydGVkIiwib0RhdGFNb2RlbFBhdGgiLCJlZGl0U3R5bGVQcm9wZXJ0aWVzIiwiaW5wdXRUeXBlIiwic2V0RWRpdFN0eWxlUHJvcGVydGllcyIsImVkaXRTdHlsZSIsImlzVmFsaWRGb3JNYXNzRWRpdCIsImlzQ29sbGVjdGlvbkZpZWxkIiwiaGFzVmFsdWVIZWxwV2l0aEZpeGVkVmFsdWVzIiwiZ2V0SXNGaWVsZEdycCIsIiRUeXBlIiwiVGFyZ2V0IiwidmFsdWUiLCJnZXRUZXh0UGF0aCIsInByb3BlcnR5IiwidGV4dEJpbmRpbmciLCJkaXNwbGF5TW9kZSIsImRlc2NyaXB0aW9uUGF0aCIsInBhdGgiLCJwYXJhbWV0ZXJzIiwicHJvcHMiLCJwcmVwYXJlRGF0YUZvckRpYWxvZyIsIm9UYWJsZSIsImFEYXRhQXJyYXkiLCJvTWV0YU1vZGVsIiwiZ2V0TW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJzQ3VycmVudEVudGl0eVNldE5hbWUiLCJkYXRhIiwiYVRhYmxlRmllbGRzIiwiZ2V0VGFibGVGaWVsZHMiLCJvRW50aXR5VHlwZUNvbnRleHQiLCJnZXRDb250ZXh0Iiwib0VudGl0eVNldENvbnRleHQiLCJvRGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsIm9EYXRhRmllbGRNb2RlbCIsIkpTT05Nb2RlbCIsIm9SZXN1bHQiLCJzTGFiZWxUZXh0IiwiYlZhbHVlSGVscEVuYWJsZWQiLCJzVW5pdFByb3BlcnR5UGF0aCIsImJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCIsIm9UZXh0QmluZGluZyIsIm9Db2x1bW5JbmZvIiwiZGF0YVByb3BlcnR5Iiwib1Byb3BlcnR5SW5mbyIsImxhYmVsIiwidGFyZ2V0T2JqZWN0IiwidGFyZ2V0RW50aXR5VHlwZSIsImVudGl0eVByb3BlcnRpZXMiLCJvUHJvcGVydHkiLCJuYW1lIiwiZ2V0VGV4dEJpbmRpbmciLCJvRmllbGRDb250ZXh0IiwiYW5ub3RhdGlvblBhdGgiLCJvRGF0YUZpZWxkQ29udmVydGVkIiwiY29udmVydE1ldGFNb2RlbENvbnRleHQiLCJvUHJvcGVydHlDb250ZXh0Iiwib0ludGVyZmFjZSIsImdldEludGVyZmFjZSIsIlZhbHVlIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJiSGlkZGVuRmllbGQiLCJpc0ltYWdlIiwiY29udGV4dCIsImdldFBhdGgiLCJfdHlwZSIsIiR0YXJnZXQiLCJjaGFydFByb3BlcnR5IiwidGVybSIsImlzQWN0aW9uIiwiQWN0aW9uIiwiaXNGaWVsZEdycCIsImhhc1ZhbHVlSGVscCIsImhhc0N1cnJlbmN5IiwiaGFzVW5pdCIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHlQYXRoIiwidW5pdFByb3BlcnR5SW5mbyIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkiLCJwcm9wZXJ0eUZvckZpZWxkQ29udHJvbCIsImV4cEJpbmRpbmciLCJnZXRFZGl0TW9kZSIsImVkaXRNb2RlVmFsdWVzIiwiT2JqZWN0Iiwia2V5cyIsIkVkaXRNb2RlIiwiZWRpdE1vZGVJc1N0YXRpYyIsImluY2x1ZGVzIiwiZWRpdGFibGUiLCJFZGl0YWJsZSIsImlzUmVhZE9ubHkiLCJpc1JlYWRPbmx5RXhwcmVzc2lvbiIsIkNvbW1vblV0aWxzIiwiY29tcHV0ZURpc3BsYXlNb2RlIiwiZ2V0UmVxdWlyZWRFeHByZXNzaW9uIiwibnVsbGFibGUiLCJzZXREYXRhIiwiYUNvbHVtbnMiLCJnZXRDb2x1bW5zIiwiY29sdW1uc0RhdGEiLCJnZXRQYXJlbnQiLCJnZXRUYWJsZURlZmluaXRpb24iLCJjb2x1bW5zIiwibWFwIiwib0NvbHVtbiIsInNEYXRhUHJvcGVydHkiLCJnZXREYXRhUHJvcGVydHkiLCJhUmVhbHRlZENvbHVtbkluZm8iLCJ0eXBlIiwiZ2V0SGVhZGVyIiwiZ2V0RGVmYXVsdFRleHRzRm9yRGlhbG9nIiwib1Jlc291cmNlQnVuZGxlIiwiaVNlbGVjdGVkQ29udGV4dHMiLCJiRGlzcGxheU1vZGUiLCJnZXRUZXh0IiwidG9TdHJpbmciLCJzZXREZWZhdWx0VmFsdWVzVG9EaWFsb2ciLCJvRGVmYXVsdFZhbHVlcyIsImJVT01GaWVsZCIsInVuaXRQcm9wZXJ0eSIsInNJbnB1dFR5cGUiLCJiUHJvcGVydHlSZXF1aXJlZCIsImlzRmllbGRSZXF1aXJlZCIsInNTdWZmaXhGb3JLZWVwRXhpc3RpbmciLCJkZWZhdWx0T3B0aW9ucyIsImJWYWx1ZUV4aXN0c0ZvclByb3BlcnR5UGF0aCIsImZhbHNlRW50cnkiLCJ0ZXh0Iiwia2V5IiwidGV4dEluZm8iLCJ0cnV0aHlFbnRyeSIsInVuc2hpZnQiLCJpc1ZhbHVlSGVscEVuYWJsZWQiLCJpc1ZhbHVlSGVscEVuYWJsZWRGb3JVbml0IiwidmhkRW50cnkiLCJ1c2VWYWx1ZUhlbHBWYWx1ZSIsImNsZWFyRW50cnkiLCJjbGVhckZpZWxkVmFsdWUiLCJlbXB0eUVudHJ5IiwibGVhdmVCbGFua1ZhbHVlIiwia2VlcEVudHJ5Iiwia2VlcEV4aXN0aW5nUHJlZml4IiwiZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyIsInNlbGVjdGVkQ29udGV4dCIsImRlc2NyaXB0aW9uVmFsdWUiLCJmdWxsVGV4dCIsIkxvZyIsImluZm8iLCJpc0VkaXRhYmxlIiwiYW55IiwiYmluZGluZyIsImdldEJpbmRpbmciLCJnZXRFeHRlcm5hbFZhbHVlIiwib25Db250ZXh0RWRpdGFibGVDaGFuZ2UiLCJvRGlhbG9nRGF0YU1vZGVsIiwib2JqZWN0c0ZvclZpc2liaWxpdHkiLCJnZXRQcm9wZXJ0eSIsInNldFByb3BlcnR5IiwidXBkYXRlT25Db250ZXh0Q2hhbmdlIiwibU9Ub1VzZSIsInZhbHVlcyIsImF0dGFjaENoYW5nZSIsImJpbmQiLCJnZXRCb3VuZE9iamVjdCIsIkFueSIsIm1vZGVsIiwic2V0TW9kZWwiLCJzZXRCaW5kaW5nQ29udGV4dCIsImdldEZpZWxkVmlzaWJsaXR5IiwiaXNDb250ZXh0RWRpdGFibGUiLCJzZXRSdW50aW1lTW9kZWxPbkRpYWxvZyIsImRpYWxvZ0NvbnRleHQiLCJhVW5pdERhdGEiLCJhUmVzdWx0cyIsImFSZWFkT25seUZpZWxkSW5mbyIsIm9EYXRhIiwib1RleHRJbmZvIiwic1Byb3BlcnR5S2V5Iiwic1VuaXRQcm9wZXJ0eU5hbWUiLCJvRGlzdGluY3RWYWx1ZU1hcCIsIm9EaXN0aW5jdFVuaXRNYXAiLCJzTXVsdGlMZXZlbFBhdGhWYWx1ZSIsImRpc3BsYXkiLCJ2YWx1ZVBhdGgiLCJlbnRyeSIsInVuaXRFbnRyeSIsInNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSIsInNlbGVjdGVkS2V5IiwiYkNsZWFyRmllbGRPckJsYW5rVmFsdWVFeGlzdHMiLCJvYmoiLCJiQ2xlYXJGaWVsZE9yQmxhbmtVbml0VmFsdWVFeGlzdHMiLCJpc1Byb3BlcnR5UmVhZE9ubHkiLCJvcGVyYW5kcyIsIm9wZXJhbmQxIiwib3BlcmFuZDIiLCJwcm9wZXJ0eVBhdGgiLCJwcm9wZXJ0eVZhbHVlIiwiZWRpdE1vZGUiLCJ2aXNpYmxlIiwiZ2V0RGlhbG9nQ29udGV4dCIsInRhYmxlIiwiZGlhbG9nIiwidHJhbnNDdHgiLCJnZXRCaW5kaW5nQ29udGV4dCIsImxpc3RCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsInRyYW5zaWVudExpc3RCaW5kaW5nIiwiYmluZExpc3QiLCIkJHVwZGF0ZUdyb3VwSWQiLCJyZWZyZXNoSW50ZXJuYWwiLCJjcmVhdGUiLCJvbkRpYWxvZ09wZW4iLCJldmVudCIsInNvdXJjZSIsImdldFNvdXJjZSIsImZpZWxkc0luZm9Nb2RlbCIsImNyZWF0ZURpYWxvZyIsIm9Db250cm9sbGVyIiwic0ZyYWdtZW50TmFtZSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9GcmFnbWVudCIsIlhNTFRlbXBsYXRlUHJvY2Vzc29yIiwibG9hZFRlbXBsYXRlIiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsImJpbmRpbmdDb250ZXh0cyIsImRhdGFGaWVsZE1vZGVsIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJtb2RlbHMiLCJ0aGVuIiwiRnJhZ21lbnQiLCJsb2FkIiwiZGVmaW5pdGlvbiIsIm9EaWFsb2dDb250ZW50IiwiRHJhZnRTdGF0dXMiLCJGRUxpYnJhcnkiLCJvRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJtYXNzRWRpdFRpdGxlIiwiY29udGVudCIsImFmdGVyT3BlbiIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwiYXBwbHlCdXR0b25UZXh0IiwicHJlc3MiLCJvRXZlbnQiLCJnZXRWaWV3Iiwib01vZGVsIiwiYVByb3BlcnR5UmVhZGFibGVJbmZvIiwiY2hhbmdlUHJvbWlzZSIsImJSZWFkT25seUZpZWxkIiwiZ3JvdXBJZCIsImVycm9yVmFsdWVzIiwiaWR4Iiwia2V5VmFsdWUiLCJfZWRpdEZsb3ciLCJzZXREcmFmdFN0YXR1cyIsIlNhdmluZyIsImNhdGNoIiwib0Vycm9yIiwiZXJyb3IiLCJhbGxTZXR0bGVkIiwib0xpc3RCaW5kaW5nIiwib0V4dGVuc2lvbkFQSSIsImdldEV4dGVuc2lvbkFQSSIsInJlZnJlc2giLCJzdWJ0aXRsZUNvbHVtbiIsImdldE1lc3NhZ2VDb2x1bW4iLCJtZXNzYWdlcyIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImdldE1lc3NhZ2VNYW5hZ2VyIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dHMiLCJtZXNzYWdlIiwibWVzc2FnZVRhcmdldHMiLCJnZXRUYXJnZXRzIiwicGVyc2lzdGVudCIsImJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dCIsImZpbmQiLCJnZXRUYXJnZXQiLCJhZGRpdGlvbmFsVGV4dCIsIlNhdmVkIiwic3VjY2Vzc1RvYXN0IiwiTWVzc2FnZVRvYXN0Iiwic2hvdyIsImdldFNlbGVjdGVkQ29udGV4dHMiLCJDbGVhciIsImdldE1lc3NhZ2VIYW5kbGVyIiwic2hvd01lc3NhZ2VzIiwiaXNPcGVuIiwiY2xvc2UiLCJkZXN0cm95IiwiZW5kQnV0dG9uIiwiY2FuY2VsQnV0dG9uVGV4dCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpREEsTUFBTUEsY0FBYyxHQUFHO0FBQ3RCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQ0MsSUFBQUEsMkJBQTJCLEVBQUUsVUFBVUMsS0FBVixFQUF5QkMsT0FBekIsRUFBZ0U7QUFDNUYsVUFBSUMsVUFBSjtBQUNBLFVBQUlDLEtBQUssR0FBRyxDQUFaO0FBQ0EsVUFBTUMsTUFBTSxHQUFHSixLQUFLLENBQUNLLEtBQU4sQ0FBWSxHQUFaLENBQWY7QUFDQSxVQUFJQyxTQUFTLEdBQUcsRUFBaEI7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QUFNVixPQUFPLEdBQUdVLE1BQU0sQ0FBQ3BDLFNBQVAsR0FBbUJsSCxTQUFuQixFQUFoQjtBQUNBNEksa0JBQUFBLE9BQU8sQ0FBQzBELEtBQVI7QUFDQTFELGtCQUFBQSxPQUFPLENBQUMyRCxPQUFSO0FBQ0E7QUFOb0IsZUFBWDtBQXBIZSxhQUFYLENBQWhCO0FBNkhBLGdCQUFNdEksS0FBSyxHQUFHaEosTUFBTSxDQUFDRyxRQUFQLEVBQWQ7QUFDQXdOLFlBQUFBLE9BQU8sQ0FBQzFFLFFBQVIsQ0FBaUJaLGdCQUFqQixFQUFtQyxZQUFuQztBQUNBc0YsWUFBQUEsT0FBTyxDQUFDMUUsUUFBUixDQUFpQkQsS0FBakI7QUFDQTJFLFlBQUFBLE9BQU8sQ0FBQ3pFLGlCQUFSLENBQTBCSSxhQUExQjtBQUNBbUQsWUFBQUEsT0FBTyxDQUFDa0IsT0FBRCxDQUFQO0FBQ0EsV0FwSU0sQ0FBUDtBQXFJQSxTQXBKSyxFQXFKTHVCLEtBckpLLENBcUpDeEMsTUFySkQsQ0FBUDtBQXNKQSxPQXhKTSxDQUFQO0FBeUpBO0FBMThCcUIsR0FBdkI7U0E2OEJleFEsYyIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgeyBCaW5kaW5nRXhwcmVzc2lvbiwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ0V4cHJlc3Npb25cIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgRGF0YU1vZGVsT2JqZWN0UGF0aCwgZW5oYW5jZURhdGFNb2RlbFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQge1xuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aCxcblx0aGFzQ3VycmVuY3ksXG5cdGhhc1VuaXQsXG5cdGhhc1ZhbHVlSGVscCxcblx0aGFzVmFsdWVIZWxwV2l0aEZpeGVkVmFsdWVzXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgeyBnZXRUZXh0QmluZGluZywgc2V0RWRpdFN0eWxlUHJvcGVydGllcyB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpZWxkL0ZpZWxkVGVtcGxhdGluZ1wiO1xuaW1wb3J0IHsgRmllbGRQcm9wZXJ0aWVzIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvRmllbGQubWV0YWRhdGFcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IFhNTFRlbXBsYXRlUHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS9YTUxUZW1wbGF0ZVByb2Nlc3NvclwiO1xuaW1wb3J0IEVkaXRNb2RlIGZyb20gXCJzYXAvdWkvbWRjL2VudW0vRWRpdE1vZGVcIjtcbmltcG9ydCBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHsgQ29yZUV4IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuaW1wb3J0IEFueSwgeyBBbnlUeXBlIH0gZnJvbSBcIi4uL2NvbnRyb2xzL0FueVwiO1xuaW1wb3J0IHsgY29udmVydE1ldGFNb2RlbENvbnRleHQsIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCIuLi9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgaXNSZWFkT25seUV4cHJlc3Npb24gfSBmcm9tIFwiLi4vdGVtcGxhdGluZy9GaWVsZENvbnRyb2xIZWxwZXJcIjtcbmltcG9ydCB7IGdldEVkaXRNb2RlLCBnZXRSZXF1aXJlZEV4cHJlc3Npb24sIGlzQ29sbGVjdGlvbkZpZWxkIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvVUlGb3JtYXR0ZXJzXCI7XG5pbXBvcnQgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCIuL01vZGVsSGVscGVyXCI7XG5cbi8qIFRoaXMgY2xhc3MgY29udGFpbnMgaGVscGVycyB0byBiZSB1c2VkIGZvciBtYXNzIGVkaXQgZnVuY3Rpb25hbGl0eSAqL1xudHlwZSBUZXh0QXJyYW5nZW1lbnRJbmZvID0ge1xuXHR0ZXh0QXJyYW5nZW1lbnQ6IHN0cmluZztcblx0dmFsdWVQYXRoOiBzdHJpbmc7XG5cdGRlc2NyaXB0aW9uUGF0aD86IHN0cmluZztcblx0dmFsdWU6IHN0cmluZztcblx0ZGVzY3JpcHRpb246IHN0cmluZztcblx0ZnVsbFRleHQ6IHN0cmluZztcbn07XG5cbnR5cGUgQmluZGluZ0luZm8gPSB7XG5cdHBhdGg/OiBzdHJpbmc7XG5cdG1vZGVsPzogc3RyaW5nIHwgb2JqZWN0O1xuXHRwYXJhbWV0ZXJzPzogQXJyYXk8QmluZGluZ0luZm8+O1xufTtcblxuY29uc3QgTWFzc0VkaXRIZWxwZXIgPSB7XG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyB0aGUgdmFsdWUgYXQgZmluYWwgb3IgZGVlcGVzdCBsZXZlbCBwYXRoIHdpdGggYSBibGFuayBhcnJheS5cblx0ICogUmV0dXJuIGFuIGVtcHR5IGFycmF5IHBvaW50aW5nIHRvIHRoZSBmaW5hbCBvciBkZWVwZXN0IGxldmVsIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUGF0aCBQcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFWYWx1ZXMgQXJyYXkgaW5zdGFuY2Ugd2hlcmUgdGhlIGRlZmF1bHQgZGF0YSBuZWVkcyB0byBiZSBhZGRlZFxuXHQgKiBAcmV0dXJucyB7QXJyYXl9XG5cdCAqL1xuXHRpbml0TGFzdExldmVsT2ZQcm9wZXJ0eVBhdGg6IGZ1bmN0aW9uIChzUGF0aDogc3RyaW5nLCBhVmFsdWVzOiBhbnkgLyosIHRyYW5zQ3R4OiBDb250ZXh0ICovKSB7XG5cdFx0bGV0IGFGaW5hbFBhdGg6IGFueTtcblx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdGNvbnN0IGFQYXRocyA9IHNQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRsZXQgc0Z1bGxQYXRoID0gXCJcIjtcblx0XHRhUGF0aHMuZm9yRWFjaChmdW5jdGlvbiAoc1Byb3BlcnR5UGF0aDogc3RyaW5nKSB7XG5cdFx0XHRpZiAoIWFWYWx1ZXNbc1Byb3BlcnR5UGF0aF0gJiYgaW5kZXggPT09IDApIHtcblx0XHRcdFx0YVZhbHVlc1tzUHJvcGVydHlQYXRoXSA9IHt9O1xuXHRcdFx0XHRhRmluYWxQYXRoID0gYVZhbHVlc1tzUHJvcGVydHlQYXRoXTtcblx0XHRcdFx0c0Z1bGxQYXRoID0gc0Z1bGxQYXRoICsgc1Byb3BlcnR5UGF0aDtcblx0XHRcdFx0aW5kZXgrKztcblx0XHRcdH0gZWxzZSBpZiAoIWFGaW5hbFBhdGhbc1Byb3BlcnR5UGF0aF0pIHtcblx0XHRcdFx0c0Z1bGxQYXRoID0gc0Z1bGxQYXRoICsgXCIvXCIgKyBzUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRpZiAoc0Z1bGxQYXRoICE9PSBzUGF0aCkge1xuXHRcdFx0XHRcdGFGaW5hbFBhdGhbc1Byb3BlcnR5UGF0aF0gPSB7fTtcblx0XHRcdFx0XHRhRmluYWxQYXRoID0gYUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhRmluYWxQYXRoW3NQcm9wZXJ0eVBhdGhdID0gW107XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gYUZpbmFsUGF0aDtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGdldCB1bmlxdWUgdmFsdWVzIGZvciBnaXZlbiBhcnJheSB2YWx1ZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzVmFsdWUgUHJvcGVydHkgdmFsdWVcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZVxuXHQgKiBAcGFyYW0ge0FycmF5fSBzZWxmIEluc3RhbmNlIG9mIHRoZSBhcnJheVxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdGdldFVuaXF1ZVZhbHVlczogZnVuY3Rpb24gKHNWYWx1ZTogc3RyaW5nLCBpbmRleDogbnVtYmVyLCBzZWxmOiBhbnlbXSkge1xuXHRcdGlmIChzVmFsdWUgIT0gdW5kZWZpbmVkICYmIHNWYWx1ZSAhPSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gc2VsZi5pbmRleE9mKHNWYWx1ZSkgPT09IGluZGV4O1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogR2V0cyB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIGEgbXVsdGktbGV2ZWwgcGF0aCAoZm9yIGV4YW1wbGU6IF9NYXRlcmlhbHMvTWF0ZXJpYWxfRGV0YWlscyBnZXRzIHRoZSB2YWx1ZSBvZiBNYXRlcmlhbF9EZXRhaWxzIHVuZGVyIF9NYXRlcmlhbHMgT2JqZWN0KS5cblx0ICogUmV0dXJucyB0aGUgcHJvcGVydHlWYWx1ZSwgd2hpY2ggY2FuIGJlIG9mIGFueSB0eXBlIChzdHJpbmcsIG51bWJlciwgZXRjLi4pLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0RhdGFQcm9wZXJ0eVBhdGggUHJvcGVydHkgcGF0aFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1ZhbHVlcyBPYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzXG5cdCAqIEByZXR1cm5zIHsqfVxuXHQgKi9cblx0Z2V0VmFsdWVGb3JNdWx0aUxldmVsUGF0aDogZnVuY3Rpb24gKHNEYXRhUHJvcGVydHlQYXRoOiBzdHJpbmcsIG9WYWx1ZXM6IGFueSkge1xuXHRcdGlmIChzRGF0YVByb3BlcnR5UGF0aCAmJiBzRGF0YVByb3BlcnR5UGF0aC5pbmRleE9mKFwiL1wiKSA+IDApIHtcblx0XHRcdGNvbnN0IGFQcm9wZXJ0eVBhdGhzID0gc0RhdGFQcm9wZXJ0eVBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0bGV0IFJlc3VsdDogYW55O1xuXHRcdFx0YVByb3BlcnR5UGF0aHMuZm9yRWFjaChmdW5jdGlvbiAoc1BhdGg6IHN0cmluZykge1xuXHRcdFx0XHRSZXN1bHQgPSBvVmFsdWVzICYmIG9WYWx1ZXNbc1BhdGhdID8gb1ZhbHVlc1tzUGF0aF0gOiBSZXN1bHQgJiYgUmVzdWx0W3NQYXRoXTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIFJlc3VsdDtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGtleSBwYXRoIGZvciB0aGUga2V5IG9mIGEgY29tYm8gYm94IHRoYXQgbXVzdCBiZSBzZWxlY3RlZCBpbml0aWFsbHkgd2hlbiB0aGUgZGlhbG9nIG9wZW5zOlxuXHQgKiA9PiBJZiBwcm9wZXJ0eVZhbHVlIGZvciBhbGwgc2VsZWN0ZWQgY29udGV4dHMgaXMgZGlmZmVyZW50LCB0aGVuIDwgS2VlcCBFeGlzdGluZyBWYWx1ZXMgPiBpcyBwcmVzZWxlY3RlZC5cblx0ICogPT4gSWYgcHJvcGVydHlWYWx1ZSBmb3IgYWxsIHNlbGVjdGVkIGNvbnRleHRzIGlzIHRoZSBzYW1lLCB0aGVuIHRoZSBwcm9wZXJ0eVZhbHVlIGlzIHByZXNlbGVjdGVkLlxuXHQgKiA9PiBJZiBwcm9wZXJ0eVZhbHVlIGZvciBhbGwgc2VsZWN0ZWQgY29udGV4dHMgaXMgZW1wdHksIHRoZW4gPCBMZWF2ZSBCbGFuayA+IGlzIHByZXNlbGVjdGVkLlxuXHQgKlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FycmF5fSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0RhdGFQcm9wZXJ0eVBhdGggRGF0YSBwcm9wZXJ0eSBwYXRoXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdCAqL1xuXHRnZXREZWZhdWx0U2VsZWN0aW9uUGF0aENvbWJvQm94OiBmdW5jdGlvbiAoYUNvbnRleHRzOiBhbnlbXSwgc0RhdGFQcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRcdGlmIChzRGF0YVByb3BlcnR5UGF0aCAmJiBhQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3Qgb1NlbGVjdGVkQ29udGV4dCA9IGFDb250ZXh0cyxcblx0XHRcdFx0YVByb3BlcnR5VmFsdWVzOiBhbnlbXSA9IFtdO1xuXHRcdFx0b1NlbGVjdGVkQ29udGV4dC5mb3JFYWNoKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdGNvbnN0IG9EYXRhT2JqZWN0ID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdGNvbnN0IHNNdWx0aUxldmVsUGF0aENvbmRpdGlvbiA9XG5cdFx0XHRcdFx0c0RhdGFQcm9wZXJ0eVBhdGguaW5kZXhPZihcIi9cIikgPiAtMSAmJiBvRGF0YU9iamVjdC5oYXNPd25Qcm9wZXJ0eShzRGF0YVByb3BlcnR5UGF0aC5zcGxpdChcIi9cIilbMF0pO1xuXHRcdFx0XHRpZiAob0NvbnRleHQgJiYgKG9EYXRhT2JqZWN0Lmhhc093blByb3BlcnR5KHNEYXRhUHJvcGVydHlQYXRoKSB8fCBzTXVsdGlMZXZlbFBhdGhDb25kaXRpb24pKSB7XG5cdFx0XHRcdFx0YVByb3BlcnR5VmFsdWVzLnB1c2gob0NvbnRleHQuZ2V0T2JqZWN0KHNEYXRhUHJvcGVydHlQYXRoKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgYVVuaXF1ZVByb3BlcnR5VmFsdWVzID0gYVByb3BlcnR5VmFsdWVzLmZpbHRlcihNYXNzRWRpdEhlbHBlci5nZXRVbmlxdWVWYWx1ZXMpO1xuXHRcdFx0aWYgKGFVbmlxdWVQcm9wZXJ0eVZhbHVlcy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdHJldHVybiBcIkRlZmF1bHQvXCIgKyBzRGF0YVByb3BlcnR5UGF0aDtcblx0XHRcdH0gZWxzZSBpZiAoYVVuaXF1ZVByb3BlcnR5VmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRyZXR1cm4gXCJFbXB0eS9cIiArIHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0fSBlbHNlIGlmIChhVW5pcXVlUHJvcGVydHlWYWx1ZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdHJldHVybiBzRGF0YVByb3BlcnR5UGF0aCArIFwiL1wiICsgYVVuaXF1ZVByb3BlcnR5VmFsdWVzWzBdO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGhpZGRlbiBhbm5vdGF0aW9uIHZhbHVlIFtib3RoIHN0YXRpYyBhbmQgcGF0aCBiYXNlZF0gZm9yIHRhYmxlJ3Mgc2VsZWN0ZWQgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHsqfSBoaWRkZW5WYWx1ZSBIaWRkZW4gYW5ub3RhdGlvbiB2YWx1ZSAvIHBhdGggZm9yIGZpZWxkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0Z2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0czogZnVuY3Rpb24gKGhpZGRlblZhbHVlOiBhbnksIGFDb250ZXh0czogYW55W10pIHtcblx0XHRpZiAoaGlkZGVuVmFsdWUgJiYgaGlkZGVuVmFsdWUuJFBhdGgpIHtcblx0XHRcdHJldHVybiAhYUNvbnRleHRzLnNvbWUoZnVuY3Rpb24gKG9TZWxlY3RlZENvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QoaGlkZGVuVmFsdWUuJFBhdGgpID09PSBmYWxzZTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gaGlkZGVuVmFsdWU7XG5cdH0sXG5cblx0Z2V0SW5wdXRUeXBlOiBmdW5jdGlvbiAocHJvcGVydHlJbmZvOiBhbnksIGRhdGFGaWVsZENvbnZlcnRlZDogYW55LCBvRGF0YU1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCk6IHN0cmluZyB7XG5cdFx0Y29uc3QgZWRpdFN0eWxlUHJvcGVydGllcyA9IHt9IGFzIEZpZWxkUHJvcGVydGllcztcblx0XHRsZXQgaW5wdXRUeXBlITogc3RyaW5nO1xuXHRcdGlmIChwcm9wZXJ0eUluZm8pIHtcblx0XHRcdHNldEVkaXRTdHlsZVByb3BlcnRpZXMoZWRpdFN0eWxlUHJvcGVydGllcywgZGF0YUZpZWxkQ29udmVydGVkLCBvRGF0YU1vZGVsUGF0aCwgdHJ1ZSk7XG5cdFx0XHRpbnB1dFR5cGUgPSBlZGl0U3R5bGVQcm9wZXJ0aWVzPy5lZGl0U3R5bGUgfHwgXCJcIjtcblx0XHR9XG5cdFx0Y29uc3QgaXNWYWxpZEZvck1hc3NFZGl0ID1cblx0XHRcdGlucHV0VHlwZSAmJlxuXHRcdFx0W1wiRGF0ZVBpY2tlclwiLCBcIlRpbWVQaWNrZXJcIiwgXCJEYXRlVGltZVBpY2tlclwiLCBcIlJhdGluZ0luZGljYXRvclwiXS5pbmRleE9mKGlucHV0VHlwZSkgPT09IC0xICYmXG5cdFx0XHQhaXNDb2xsZWN0aW9uRmllbGQob0RhdGFNb2RlbFBhdGgpICYmXG5cdFx0XHQhaGFzVmFsdWVIZWxwV2l0aEZpeGVkVmFsdWVzKHByb3BlcnR5SW5mbyk7XG5cblx0XHRyZXR1cm4gKGlzVmFsaWRGb3JNYXNzRWRpdCB8fCBcIlwiKSAmJiBpbnB1dFR5cGU7XG5cdH0sXG5cblx0Z2V0SXNGaWVsZEdycDogZnVuY3Rpb24gKGRhdGFGaWVsZENvbnZlcnRlZDogYW55KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIChcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZCAmJlxuXHRcdFx0ZGF0YUZpZWxkQ29udmVydGVkLiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckFubm90YXRpb25cIiAmJlxuXHRcdFx0ZGF0YUZpZWxkQ29udmVydGVkLlRhcmdldCAmJlxuXHRcdFx0ZGF0YUZpZWxkQ29udmVydGVkLlRhcmdldC52YWx1ZSAmJlxuXHRcdFx0ZGF0YUZpZWxkQ29udmVydGVkLlRhcmdldC52YWx1ZS5pbmRleE9mKFwiRmllbGRHcm91cFwiKSA+IC0xXG5cdFx0KTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IHRleHQgcGF0aCBmb3IgdGhlIG1hc3MgZWRpdCBmaWVsZC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIHthbnl9IHRleHRCaW5kaW5nIFRleHQgQmluZGluZyBJbmZvXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwbGF5TW9kZSBEaXNwbGF5IG1vZGVcblx0ICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gVGV4dCBQcm9wZXJ0eSBQYXRoIGlmIGl0IGV4aXN0c1xuXHQgKi9cblx0Z2V0VGV4dFBhdGg6IGZ1bmN0aW9uIChwcm9wZXJ0eTogc3RyaW5nLCB0ZXh0QmluZGluZzogYW55LCBkaXNwbGF5TW9kZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRsZXQgZGVzY3JpcHRpb25QYXRoO1xuXHRcdGlmICh0ZXh0QmluZGluZyAmJiAodGV4dEJpbmRpbmcucGF0aCB8fCAodGV4dEJpbmRpbmcucGFyYW1ldGVycyAmJiB0ZXh0QmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCkpICYmIHByb3BlcnR5KSB7XG5cdFx0XHRpZiAodGV4dEJpbmRpbmcucGF0aCAmJiBkaXNwbGF5TW9kZSA9PT0gXCJEZXNjcmlwdGlvblwiKSB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uUGF0aCA9IHRleHRCaW5kaW5nLnBhdGg7XG5cdFx0XHR9IGVsc2UgaWYgKHRleHRCaW5kaW5nLnBhcmFtZXRlcnMpIHtcblx0XHRcdFx0dGV4dEJpbmRpbmcucGFyYW1ldGVycy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wczogQmluZGluZ0luZm8pIHtcblx0XHRcdFx0XHRpZiAocHJvcHMucGF0aCAmJiBwcm9wcy5wYXRoICE9PSBwcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb25QYXRoID0gcHJvcHMucGF0aDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZGVzY3JpcHRpb25QYXRoO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyBhIEpTT04gTW9kZWwgZm9yIHByb3BlcnRpZXMgb2YgZGlhbG9nIGZpZWxkcyBbbGFiZWwsIHZpc2libGl0eSwgZGF0YXByb3BlcnR5LCBldGMuXS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9UYWJsZSBJbnN0YW5jZSBvZiBUYWJsZVxuXHQgKiBAcGFyYW0ge0FycmF5fSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhRGF0YUFycmF5IEFycmF5IGNvbnRhaW5pbmcgZGF0YSByZWxhdGVkIHRvIHRoZSBkaWFsb2cgdXNlZCBieSBib3RoIHRoZSBzdGF0aWMgYW5kIHRoZSBydW50aW1lIG1vZGVsXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9XG5cdCAqL1xuXHRwcmVwYXJlRGF0YUZvckRpYWxvZzogZnVuY3Rpb24gKG9UYWJsZTogVGFibGUsIGFDb250ZXh0czogYW55W10sIGFEYXRhQXJyYXk6IGFueVtdKSB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9UYWJsZSAmJiAob1RhYmxlLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgYW55KSxcblx0XHRcdHNDdXJyZW50RW50aXR5U2V0TmFtZSA9IG9UYWJsZS5kYXRhKFwibWV0YVBhdGhcIiksXG5cdFx0XHRhVGFibGVGaWVsZHMgPSBNYXNzRWRpdEhlbHBlci5nZXRUYWJsZUZpZWxkcyhvVGFibGUpLFxuXHRcdFx0b0VudGl0eVR5cGVDb250ZXh0ID0gb01ldGFNb2RlbC5nZXRDb250ZXh0KHNDdXJyZW50RW50aXR5U2V0TmFtZSArIFwiL0BcIiksXG5cdFx0XHRvRW50aXR5U2V0Q29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzQ3VycmVudEVudGl0eVNldE5hbWUpLFxuXHRcdFx0b0RhdGFNb2RlbE9iamVjdFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob0VudGl0eVR5cGVDb250ZXh0KTtcblxuXHRcdGNvbnN0IG9EYXRhRmllbGRNb2RlbCA9IG5ldyBKU09OTW9kZWwoKTtcblx0XHRsZXQgb1Jlc3VsdDtcblx0XHRsZXQgc0xhYmVsVGV4dDtcblx0XHRsZXQgYlZhbHVlSGVscEVuYWJsZWQ7XG5cdFx0bGV0IHNVbml0UHJvcGVydHlQYXRoO1xuXHRcdGxldCBiVmFsdWVIZWxwRW5hYmxlZEZvclVuaXQ7XG5cdFx0bGV0IG9UZXh0QmluZGluZztcblxuXHRcdGFUYWJsZUZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChvQ29sdW1uSW5mbzogYW55KSB7XG5cdFx0XHRjb25zdCBzRGF0YVByb3BlcnR5UGF0aCA9IG9Db2x1bW5JbmZvLmRhdGFQcm9wZXJ0eTtcblx0XHRcdGlmIChzRGF0YVByb3BlcnR5UGF0aCkge1xuXHRcdFx0XHRsZXQgb1Byb3BlcnR5SW5mbyA9IHNEYXRhUHJvcGVydHlQYXRoICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDdXJyZW50RW50aXR5U2V0TmFtZX0vJHtzRGF0YVByb3BlcnR5UGF0aH1AYCk7XG5cdFx0XHRcdHNMYWJlbFRleHQgPVxuXHRcdFx0XHRcdG9Db2x1bW5JbmZvLmxhYmVsIHx8XG5cdFx0XHRcdFx0KG9Qcm9wZXJ0eUluZm8gJiYgb1Byb3BlcnR5SW5mb1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTGFiZWxcIl0pIHx8XG5cdFx0XHRcdFx0b0NvbHVtbkluZm8uZGF0YVByb3BlcnR5O1xuXHRcdFx0XHRpZiAob0RhdGFNb2RlbE9iamVjdFBhdGgpIHtcblx0XHRcdFx0XHRvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgPSBvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZmlsdGVyKGZ1bmN0aW9uIChcblx0XHRcdFx0XHRcdG9Qcm9wZXJ0eTogYW55XG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb1Byb3BlcnR5Lm5hbWUgPT09IHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCA9IG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdFswXSB8fCB7fTtcblx0XHRcdFx0b1RleHRCaW5kaW5nID0gZ2V0VGV4dEJpbmRpbmcob0RhdGFNb2RlbE9iamVjdFBhdGgsIHt9LCB0cnVlKSB8fCB7fTtcblx0XHRcdFx0Y29uc3Qgb0ZpZWxkQ29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChvQ29sdW1uSW5mby5hbm5vdGF0aW9uUGF0aCksXG5cdFx0XHRcdFx0b0RhdGFGaWVsZENvbnZlcnRlZCA9IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0KG9GaWVsZENvbnRleHQpLFxuXHRcdFx0XHRcdG9Qcm9wZXJ0eUNvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQoc0N1cnJlbnRFbnRpdHlTZXROYW1lICsgXCIvXCIgKyBzRGF0YVByb3BlcnR5UGF0aCArIFwiQFwiKSxcblx0XHRcdFx0XHRvSW50ZXJmYWNlID0gb1Byb3BlcnR5Q29udGV4dCAmJiBvUHJvcGVydHlDb250ZXh0LmdldEludGVyZmFjZSgpO1xuXG5cdFx0XHRcdGxldCBvRGF0YU1vZGVsUGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvRmllbGRDb250ZXh0LCBvRW50aXR5U2V0Q29udGV4dCk7XG5cdFx0XHRcdGlmIChvRGF0YUZpZWxkQ29udmVydGVkPy5WYWx1ZT8ucGF0aD8ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdG9EYXRhTW9kZWxQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGgob0RhdGFNb2RlbFBhdGgsIHNEYXRhUHJvcGVydHlQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBiSGlkZGVuRmllbGQgPVxuXHRcdFx0XHRcdE1hc3NFZGl0SGVscGVyLmdldEhpZGRlblZhbHVlRm9yQ29udGV4dHMoXG5cdFx0XHRcdFx0XHRvRmllbGRDb250ZXh0ICYmIG9GaWVsZENvbnRleHQuZ2V0T2JqZWN0KClbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuXCJdLFxuXHRcdFx0XHRcdFx0YUNvbnRleHRzXG5cdFx0XHRcdFx0KSB8fCBmYWxzZTtcblx0XHRcdFx0Y29uc3QgaXNJbWFnZSA9IG9Qcm9wZXJ0eUluZm8gJiYgb1Byb3BlcnR5SW5mb1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Jc0ltYWdlVVJMXCJdO1xuXG5cdFx0XHRcdG9JbnRlcmZhY2UuY29udGV4dCA9IHtcblx0XHRcdFx0XHRnZXRNb2RlbDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9JbnRlcmZhY2UuZ2V0TW9kZWwoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGdldFBhdGg6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBzQ3VycmVudEVudGl0eVNldE5hbWUgKyBcIi9cIiArIHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0b1Byb3BlcnR5SW5mbyA9XG5cdFx0XHRcdFx0b0RhdGFGaWVsZENvbnZlcnRlZC5fdHlwZSA9PT0gXCJQcm9wZXJ0eVwiXG5cdFx0XHRcdFx0XHQ/IG9EYXRhRmllbGRDb252ZXJ0ZWRcblx0XHRcdFx0XHRcdDogKG9EYXRhRmllbGRDb252ZXJ0ZWQgJiYgb0RhdGFGaWVsZENvbnZlcnRlZC5WYWx1ZSAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlZhbHVlLiR0YXJnZXQpIHx8XG5cdFx0XHRcdFx0XHQgIChvRGF0YUZpZWxkQ29udmVydGVkICYmIG9EYXRhRmllbGRDb252ZXJ0ZWQuVGFyZ2V0ICYmIG9EYXRhRmllbGRDb252ZXJ0ZWQuVGFyZ2V0LiR0YXJnZXQpO1xuXHRcdFx0XHQvLyBEYXRhZmllbGQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBGaWVsZENvbnRyb2wgY2FsY3VsYXRpb24sIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkXG5cblx0XHRcdFx0Y29uc3QgY2hhcnRQcm9wZXJ0eSA9IG9Qcm9wZXJ0eUluZm8gJiYgb1Byb3BlcnR5SW5mby50ZXJtICYmIG9Qcm9wZXJ0eUluZm8udGVybSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5DaGFydFwiO1xuXHRcdFx0XHRjb25zdCBpc0FjdGlvbiA9ICEhb0RhdGFGaWVsZENvbnZlcnRlZC5BY3Rpb247XG5cdFx0XHRcdGNvbnN0IGlzRmllbGRHcnAgPSBNYXNzRWRpdEhlbHBlci5nZXRJc0ZpZWxkR3JwKG9EYXRhRmllbGRDb252ZXJ0ZWQpO1xuXG5cdFx0XHRcdGlmIChpc0ltYWdlIHx8IGJIaWRkZW5GaWVsZCB8fCBjaGFydFByb3BlcnR5IHx8IGlzQWN0aW9uIHx8IGlzRmllbGRHcnApIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBWYWx1ZUhlbHAgcHJvcGVydGllc1xuXHRcdFx0XHRiVmFsdWVIZWxwRW5hYmxlZCA9IGhhc1ZhbHVlSGVscChvUHJvcGVydHlJbmZvKTtcblx0XHRcdFx0c1VuaXRQcm9wZXJ0eVBhdGggPSAoaGFzQ3VycmVuY3kob1Byb3BlcnR5SW5mbykgfHwgaGFzVW5pdChvUHJvcGVydHlJbmZvKSkgJiYgZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgob1Byb3BlcnR5SW5mbyk7XG5cdFx0XHRcdGNvbnN0IHVuaXRQcm9wZXJ0eUluZm8gPSBzVW5pdFByb3BlcnR5UGF0aCAmJiBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KG9Qcm9wZXJ0eUluZm8pO1xuXHRcdFx0XHRiVmFsdWVIZWxwRW5hYmxlZEZvclVuaXQgPSB1bml0UHJvcGVydHlJbmZvICYmIGhhc1ZhbHVlSGVscCh1bml0UHJvcGVydHlJbmZvKTtcblxuXHRcdFx0XHQvLyBFZGl0TW9kZSBhbmQgSW5wdXRUeXBlXG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5Rm9yRmllbGRDb250cm9sID0gb1Byb3BlcnR5SW5mbyAmJiBvUHJvcGVydHlJbmZvLlZhbHVlID8gb1Byb3BlcnR5SW5mby5WYWx1ZSA6IG9Qcm9wZXJ0eUluZm87XG5cdFx0XHRcdGNvbnN0IGV4cEJpbmRpbmcgPSBnZXRFZGl0TW9kZShwcm9wZXJ0eUZvckZpZWxkQ29udHJvbCwgb0RhdGFNb2RlbFBhdGgsIGZhbHNlLCBmYWxzZSwgb0RhdGFGaWVsZENvbnZlcnRlZCwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IGVkaXRNb2RlVmFsdWVzID0gT2JqZWN0LmtleXMoRWRpdE1vZGUpO1xuXHRcdFx0XHRjb25zdCBlZGl0TW9kZUlzU3RhdGljID0gISFleHBCaW5kaW5nICYmIGVkaXRNb2RlVmFsdWVzLmluY2x1ZGVzKGV4cEJpbmRpbmcgYXMgRWRpdE1vZGUpO1xuXHRcdFx0XHRjb25zdCBlZGl0YWJsZSA9ICEhZXhwQmluZGluZyAmJiAoKGVkaXRNb2RlSXNTdGF0aWMgJiYgZXhwQmluZGluZyA9PT0gRWRpdE1vZGUuRWRpdGFibGUpIHx8ICFlZGl0TW9kZUlzU3RhdGljKTtcblxuXHRcdFx0XHRpZiAoIWVkaXRhYmxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgaW5wdXRUeXBlID0gTWFzc0VkaXRIZWxwZXIuZ2V0SW5wdXRUeXBlKG9Qcm9wZXJ0eUluZm8sIG9EYXRhRmllbGRDb252ZXJ0ZWQsIG9EYXRhTW9kZWxQYXRoKTtcblxuXHRcdFx0XHRpZiAoaW5wdXRUeXBlKSB7XG5cdFx0XHRcdFx0Y29uc3QgaXNSZWFkT25seSA9IGlzUmVhZE9ubHlFeHByZXNzaW9uKG9Qcm9wZXJ0eUluZm8pO1xuXHRcdFx0XHRcdGNvbnN0IGRpc3BsYXlNb2RlID0gQ29tbW9uVXRpbHMuY29tcHV0ZURpc3BsYXlNb2RlKG9Qcm9wZXJ0eUNvbnRleHQuZ2V0T2JqZWN0KCkpO1xuXHRcdFx0XHRcdG9SZXN1bHQgPSB7XG5cdFx0XHRcdFx0XHRcImxhYmVsXCI6IHNMYWJlbFRleHQsXG5cdFx0XHRcdFx0XHRcImRhdGFQcm9wZXJ0eVwiOiBzRGF0YVByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdFwiaXNWYWx1ZUhlbHBFbmFibGVkXCI6IGJWYWx1ZUhlbHBFbmFibGVkID8gYlZhbHVlSGVscEVuYWJsZWQgOiBmYWxzZSxcblx0XHRcdFx0XHRcdFwidW5pdFByb3BlcnR5XCI6IHNVbml0UHJvcGVydHlQYXRoID8gc1VuaXRQcm9wZXJ0eVBhdGggOiBmYWxzZSxcblx0XHRcdFx0XHRcdFwiaXNWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdFwiOiBiVmFsdWVIZWxwRW5hYmxlZEZvclVuaXQgPyBiVmFsdWVIZWxwRW5hYmxlZEZvclVuaXQgOiBmYWxzZSxcblx0XHRcdFx0XHRcdFwicHJvcGVydHlQYXRoRm9yVmFsdWVIZWxwXCI6IGAke3NDdXJyZW50RW50aXR5U2V0TmFtZX0vJHtzRGF0YVByb3BlcnR5UGF0aH1gLFxuXHRcdFx0XHRcdFx0XCJwcm9wZXJ0eVBhdGhGb3JWYWx1ZUhlbHBVbml0XCI6IHNVbml0UHJvcGVydHlQYXRoICYmIGAke3NDdXJyZW50RW50aXR5U2V0TmFtZX0vJHtzVW5pdFByb3BlcnR5UGF0aH1gLFxuXHRcdFx0XHRcdFx0XCJpc0ZpZWxkUmVxdWlyZWRcIjogZ2V0UmVxdWlyZWRFeHByZXNzaW9uKG9Qcm9wZXJ0eUluZm8sIG9EYXRhRmllbGRDb252ZXJ0ZWQsIHRydWUpLFxuXHRcdFx0XHRcdFx0XCJkZWZhdWx0U2VsZWN0aW9uUGF0aFwiOiBzRGF0YVByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0XHQ/IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goYUNvbnRleHRzLCBzRGF0YVByb3BlcnR5UGF0aClcblx0XHRcdFx0XHRcdFx0OiBmYWxzZSxcblx0XHRcdFx0XHRcdFwiZGVmYXVsdFNlbGVjdGlvblVuaXRQYXRoXCI6IHNVbml0UHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0XHRcdD8gTWFzc0VkaXRIZWxwZXIuZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveChhQ29udGV4dHMsIHNVbml0UHJvcGVydHlQYXRoKVxuXHRcdFx0XHRcdFx0XHQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJlbnRpdHlTZXRcIjogc0N1cnJlbnRFbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRcdFx0XCJkaXNwbGF5XCI6IGRpc3BsYXlNb2RlLFxuXHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblBhdGhcIjogTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dFBhdGgoc0RhdGFQcm9wZXJ0eVBhdGgsIG9UZXh0QmluZGluZywgZGlzcGxheU1vZGUpLFxuXHRcdFx0XHRcdFx0XCJudWxsYWJsZVwiOiBvUHJvcGVydHlJbmZvLm51bGxhYmxlICE9PSB1bmRlZmluZWQgPyBvUHJvcGVydHlJbmZvLm51bGxhYmxlIDogdHJ1ZSxcblx0XHRcdFx0XHRcdFwiaXNQcm9wZXJ0eVJlYWRPbmx5XCI6IGlzUmVhZE9ubHkgIT09IHVuZGVmaW5lZCA/IGlzUmVhZE9ubHkgOiBmYWxzZSxcblx0XHRcdFx0XHRcdFwiaW5wdXRUeXBlXCI6IGlucHV0VHlwZSxcblx0XHRcdFx0XHRcdFwiZWRpdE1vZGVcIjogZWRpdGFibGUgPyBleHBCaW5kaW5nIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XCJ1bml0RGF0YVBhdGhcIjogc1VuaXRQcm9wZXJ0eVBhdGggJiYgXCJmaWVsZHNJbmZvPi91bml0RGF0YS9cIixcblx0XHRcdFx0XHRcdFwidmFsdWVzUGF0aFwiOiBcImZpZWxkc0luZm8+L3ZhbHVlcy9cIlxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YURhdGFBcnJheS5wdXNoKG9SZXN1bHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0b0RhdGFGaWVsZE1vZGVsLnNldERhdGEoYURhdGFBcnJheSk7XG5cdFx0cmV0dXJuIG9EYXRhRmllbGRNb2RlbDtcblx0fSxcblxuXHRnZXRUYWJsZUZpZWxkczogZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0Y29uc3QgYUNvbHVtbnMgPSAob1RhYmxlICYmIG9UYWJsZS5nZXRDb2x1bW5zKCkpIHx8IFtdO1xuXHRcdGNvbnN0IGNvbHVtbnNEYXRhID0gb1RhYmxlICYmIG9UYWJsZS5nZXRQYXJlbnQoKS5nZXRUYWJsZURlZmluaXRpb24oKS5jb2x1bW5zO1xuXHRcdHJldHVybiBhQ29sdW1ucy5tYXAoZnVuY3Rpb24gKG9Db2x1bW46IGFueSkge1xuXHRcdFx0Y29uc3Qgc0RhdGFQcm9wZXJ0eSA9IG9Db2x1bW4gJiYgb0NvbHVtbi5nZXREYXRhUHJvcGVydHkoKSxcblx0XHRcdFx0YVJlYWx0ZWRDb2x1bW5JbmZvID1cblx0XHRcdFx0XHRjb2x1bW5zRGF0YSAmJlxuXHRcdFx0XHRcdGNvbHVtbnNEYXRhLmZpbHRlcihmdW5jdGlvbiAob0NvbHVtbkluZm86IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Db2x1bW5JbmZvLm5hbWUgPT09IHNEYXRhUHJvcGVydHkgJiYgb0NvbHVtbkluZm8udHlwZSA9PT0gXCJBbm5vdGF0aW9uXCI7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcImRhdGFQcm9wZXJ0eVwiOiBzRGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcImxhYmVsXCI6IG9Db2x1bW4uZ2V0SGVhZGVyKCksXG5cdFx0XHRcdFwiYW5ub3RhdGlvblBhdGhcIjogYVJlYWx0ZWRDb2x1bW5JbmZvICYmIGFSZWFsdGVkQ29sdW1uSW5mb1swXSAmJiBhUmVhbHRlZENvbHVtbkluZm9bMF0uYW5ub3RhdGlvblBhdGhcblx0XHRcdH07XG5cdFx0fSk7XG5cdH0sXG5cblx0Z2V0RGVmYXVsdFRleHRzRm9yRGlhbG9nOiBmdW5jdGlvbiAob1Jlc291cmNlQnVuZGxlOiBhbnksIGlTZWxlY3RlZENvbnRleHRzOiBhbnksIG9UYWJsZTogYW55KSB7XG5cdFx0Ly8gVGhlIGNvbmZpcm0gYnV0dG9uIHRleHQgaXMgXCJTYXZlXCIgZm9yIHRhYmxlIGluIERpc3BsYXkgbW9kZSBhbmQgXCJBcHBseVwiIGZvciB0YWJsZSBpbiBlZGl0IG1vZGUuIFRoaXMgY2FuIGJlIGxhdGVyIGV4cG9zZWQgaWYgbmVlZGVkLlxuXHRcdGNvbnN0IGJEaXNwbGF5TW9kZSA9IG9UYWJsZS5kYXRhKFwiZGlzcGxheU1vZGVQcm9wZXJ0eUJpbmRpbmdcIikgPT09IFwidHJ1ZVwiO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdFwia2VlcEV4aXN0aW5nUHJlZml4XCI6IFwiPCBLZWVwXCIsXG5cdFx0XHRcImxlYXZlQmxhbmtWYWx1ZVwiOiBcIjwgTGVhdmUgQmxhbmsgPlwiLFxuXHRcdFx0XCJjbGVhckZpZWxkVmFsdWVcIjogXCI8IENsZWFyIFZhbHVlcyA+XCIsXG5cdFx0XHRcIm1hc3NFZGl0VGl0bGVcIjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9ESUFMT0dfVElUTEVcIiwgaVNlbGVjdGVkQ29udGV4dHMudG9TdHJpbmcoKSksXG5cdFx0XHRcImFwcGx5QnV0dG9uVGV4dFwiOiBiRGlzcGxheU1vZGVcblx0XHRcdFx0PyBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX1NBVkVfQlVUVE9OX1RFWFRcIilcblx0XHRcdFx0OiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX0FQUExZX0JVVFRPTl9URVhUXCIpLFxuXHRcdFx0XCJ1c2VWYWx1ZUhlbHBWYWx1ZVwiOiBcIjwgVXNlIFZhbHVlIEhlbHAgPlwiLFxuXHRcdFx0XCJjYW5jZWxCdXR0b25UZXh0XCI6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfQ0FOQ0VMX0JVVFRPTl9URVhUXCIpXG5cdFx0fTtcblx0fSxcblxuXHQvKipcblx0ICogQWRkcyBhIHN1ZmZpeCB0byB0aGUgJ2tlZXAgZXhpc3RpbmcnIHByb3BlcnR5IG9mIHRoZSBjb21ib0JveC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNJbnB1dFR5cGUgSW5wdXRUeXBlIG9mIHRoZSBmaWVsZFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKi9cblx0Ly8gZ2V0U3VmZml4Rm9yS2VlcEV4aXNpdGluZzogZnVuY3Rpb24gKHNJbnB1dFR5cGU6IHN0cmluZykge1xuXHQvLyBcdGxldCBzUmVzdWx0ID0gXCJWYWx1ZXNcIjtcblxuXHQvLyBcdHN3aXRjaCAoc0lucHV0VHlwZSkge1xuXHQvLyBcdFx0Ly9UT0RPIC0gQWRkIGZvciBvdGhlciBjb250cm9sIHR5cGVzIGFzIHdlbGwgKFJhZGlvIEJ1dHRvbiwgRW1haWwsIElucHV0LCBNREMgRmllbGRzLCBJbWFnZSBldGMuKVxuXHQvLyBcdFx0Y2FzZSBcIkRhdGVQaWNrZXJcIjpcblx0Ly8gXHRcdFx0c1Jlc3VsdCA9IFwiRGF0ZXNcIjtcblx0Ly8gXHRcdFx0YnJlYWs7XG5cdC8vIFx0XHRjYXNlIFwiQ2hlY2tCb3hcIjpcblx0Ly8gXHRcdFx0c1Jlc3VsdCA9IFwiU2V0dGluZ3NcIjtcblx0Ly8gXHRcdFx0YnJlYWs7XG5cdC8vIFx0XHRkZWZhdWx0OlxuXHQvLyBcdFx0XHRzUmVzdWx0ID0gXCJWYWx1ZXNcIjtcblx0Ly8gXHR9XG5cdC8vIFx0cmV0dXJuIHNSZXN1bHQ7XG5cdC8vIH0sXG5cblx0LyoqXG5cdCAqIEFkZHMgZGVmYXVsdCB2YWx1ZXMgdG8gdGhlIG1vZGVsIFtLZWVwIEV4aXN0aW5nIFZhbHVlcywgTGVhdmUgQmxhbmtdLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FycmF5fSBhVmFsdWVzIEFycmF5IGluc3RhbmNlIHdoZXJlIHRoZSBkZWZhdWx0IGRhdGEgbmVlZHMgdG8gYmUgYWRkZWRcblx0ICogQHBhcmFtIHtBcnJheX0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9EZWZhdWx0VmFsdWVzIERlZmF1bHQgdmFsdWVzIGZyb20gQXBwbGljYXRpb24gTWFuaWZlc3Rcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Qcm9wZXJ0eUluZm8gUHJvcGVydHkgaW5mb3JtYXRpb25cblx0ICogQHBhcmFtIHtib29sZWFufSBiVU9NRmllbGRcblx0ICovXG5cdHNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZzogZnVuY3Rpb24gKGFWYWx1ZXM6IGFueSwgYUNvbnRleHRzOiBhbnlbXSwgb0RlZmF1bHRWYWx1ZXM6IGFueSwgb1Byb3BlcnR5SW5mbzogYW55LCBiVU9NRmllbGQ/OiBib29sZWFuKSB7XG5cdFx0Y29uc3Qgc1Byb3BlcnR5UGF0aCA9IGJVT01GaWVsZCA/IG9Qcm9wZXJ0eUluZm8udW5pdFByb3BlcnR5IDogb1Byb3BlcnR5SW5mby5kYXRhUHJvcGVydHksXG5cdFx0XHRzSW5wdXRUeXBlID0gb1Byb3BlcnR5SW5mby5pbnB1dFR5cGUsXG5cdFx0XHRiUHJvcGVydHlSZXF1aXJlZCA9IG9Qcm9wZXJ0eUluZm8uaXNGaWVsZFJlcXVpcmVkO1xuXHRcdC8vIGNvbnN0IHNTdWZmaXhGb3JLZWVwRXhpc3RpbmcgPSBNYXNzRWRpdEhlbHBlci5nZXRTdWZmaXhGb3JLZWVwRXhpc2l0aW5nKHNJbnB1dFR5cGUpO1xuXHRcdGNvbnN0IHNTdWZmaXhGb3JLZWVwRXhpc3RpbmcgPSBcIlZhbHVlc1wiO1xuXHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMgPSBhVmFsdWVzLmRlZmF1bHRPcHRpb25zIHx8IFtdO1xuXHRcdC8vVE9ETyAtIEFkZCA8PFVzZSBWYWx1ZSBIZWxwIG9yIGNvbnRyb2wgaW1wbG1lbnRhdGlvbj4+IGFuZCByZWxhdGVkIGtleSBieSBjaGVja2luZyBpZiB2YWx1ZSBoZWxwIGlzIGVuYWJsZWQgZm9yIHByb3BlcnR5IG9yIFVuaXQuXG5cdFx0Ly9UT0RPIC0gQWRkIG9wdGlvbiBBcHBseSB0byBFbXB0eSBGaWVsZHMgb25seSBmb3IgQm90aCBWYWx1ZSBIZWxwIGFuZCBjb250cm9scy5cblx0XHRjb25zdCBiVmFsdWVFeGlzdHNGb3JQcm9wZXJ0eVBhdGggPSBhQ29udGV4dHMuc29tZShmdW5jdGlvbiAob1NlbGVjdGVkQ29udGV4dDogYW55KSB7XG5cdFx0XHRyZXR1cm4gb1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3Qoc1Byb3BlcnR5UGF0aCk7XG5cdFx0fSk7XG5cblx0XHRpZiAoc0lucHV0VHlwZSA9PT0gXCJDaGVja0JveFwiKSB7XG5cdFx0XHRjb25zdCBmYWxzZUVudHJ5ID0geyB0ZXh0OiBcIk5vXCIsIGtleTogYCR7c1Byb3BlcnR5UGF0aH0vZmFsc2VgLCB0ZXh0SW5mbzogeyB2YWx1ZTogZmFsc2UgfSB9O1xuXHRcdFx0Y29uc3QgdHJ1dGh5RW50cnkgPSB7IHRleHQ6IFwiWWVzXCIsIGtleTogYCR7c1Byb3BlcnR5UGF0aH0vdHJ1ZWAsIHRleHRJbmZvOiB7IHZhbHVlOiB0cnVlIH0gfTtcblx0XHRcdGFWYWx1ZXMudW5zaGlmdChmYWxzZUVudHJ5KTtcblx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdChmYWxzZUVudHJ5KTtcblx0XHRcdGFWYWx1ZXMudW5zaGlmdCh0cnV0aHlFbnRyeSk7XG5cdFx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zLnVuc2hpZnQodHJ1dGh5RW50cnkpO1xuXHRcdH1cblxuXHRcdGlmIChvUHJvcGVydHlJbmZvLmlzVmFsdWVIZWxwRW5hYmxlZCB8fCAob1Byb3BlcnR5SW5mby5pc1ZhbHVlSGVscEVuYWJsZWRGb3JVbml0ICYmIGJVT01GaWVsZCkpIHtcblx0XHRcdGNvbnN0IHZoZEVudHJ5ID0geyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy51c2VWYWx1ZUhlbHBWYWx1ZSwga2V5OiBcIlVzZVZhbHVlSGVscFZhbHVlL1wiICsgc1Byb3BlcnR5UGF0aCB9O1xuXHRcdFx0YVZhbHVlcy51bnNoaWZ0KHZoZEVudHJ5KTtcblx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdCh2aGRFbnRyeSk7XG5cdFx0fVxuXG5cdFx0aWYgKHNJbnB1dFR5cGUgIT0gXCJDaGVja0JveFwiKSB7XG5cdFx0XHRpZiAoYlZhbHVlRXhpc3RzRm9yUHJvcGVydHlQYXRoKSB7XG5cdFx0XHRcdGlmIChiUHJvcGVydHlSZXF1aXJlZCAhPT0gXCJ0cnVlXCIgJiYgIWJVT01GaWVsZCkge1xuXHRcdFx0XHRcdGNvbnN0IGNsZWFyRW50cnkgPSB7IHRleHQ6IG9EZWZhdWx0VmFsdWVzLmNsZWFyRmllbGRWYWx1ZSwga2V5OiBgQ2xlYXJGaWVsZFZhbHVlLyR7c1Byb3BlcnR5UGF0aH1gIH07XG5cdFx0XHRcdFx0YVZhbHVlcy51bnNoaWZ0KGNsZWFyRW50cnkpO1xuXHRcdFx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdChjbGVhckVudHJ5KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgZW1wdHlFbnRyeSA9IHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLCBrZXk6IGBFbXB0eS8ke3NQcm9wZXJ0eVBhdGh9YCB9O1xuXHRcdFx0XHRhVmFsdWVzLnVuc2hpZnQoZW1wdHlFbnRyeSk7XG5cdFx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdChlbXB0eUVudHJ5KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Y29uc3Qga2VlcEVudHJ5ID0ge1xuXHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMua2VlcEV4aXN0aW5nUHJlZml4ICsgXCIgXCIgKyBzU3VmZml4Rm9yS2VlcEV4aXN0aW5nICsgXCIgPlwiLFxuXHRcdFx0a2V5OiBcIkRlZmF1bHQvXCIgKyBzUHJvcGVydHlQYXRoXG5cdFx0fTtcblx0XHRhVmFsdWVzLnVuc2hpZnQoa2VlcEVudHJ5KTtcblx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zLnVuc2hpZnQoa2VlcEVudHJ5KTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IHRleHQgYXJyYW5nZW1lbnQgaW5mbyBmb3IgYSBjb250ZXh0IHByb3BlcnR5LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgUGF0aFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25QYXRoIFBhdGggdG8gdGV4dCBhc3NvY2lhdGlvbiBvZiB0aGUgcHJvcGVydHlcblx0ICogQHBhcmFtIHtzdHJpbmd9IGRpc3BsYXlNb2RlIERpc3BsYXkgbW9kZSBvZiB0aGUgcHJvcGVydHkgYW5kIHRleHQgYXNzb2NpYXRpb25cblx0ICogQHBhcmFtIHtDb250ZXh0fSBzZWxlY3RlZENvbnRleHQgQ29udGV4dCB0byBmaW5kIHRoZSBmdWxsIHRleHRcblx0ICogQHJldHVybnMge1RleHRBcnJhbmdlbWVudEluZm99XG5cdCAqL1xuXHRnZXRUZXh0QXJyYW5nZW1lbnRJbmZvOiBmdW5jdGlvbiAoXG5cdFx0cHJvcGVydHk6IHN0cmluZyxcblx0XHRkZXNjcmlwdGlvblBhdGg6IHN0cmluZyxcblx0XHRkaXNwbGF5TW9kZTogc3RyaW5nLFxuXHRcdHNlbGVjdGVkQ29udGV4dDogQ29udGV4dFxuXHQpOiBUZXh0QXJyYW5nZW1lbnRJbmZvIHtcblx0XHRsZXQgdmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5KSxcblx0XHRcdGRlc2NyaXB0aW9uVmFsdWUsXG5cdFx0XHRmdWxsVGV4dDtcblx0XHRpZiAoZGVzY3JpcHRpb25QYXRoICYmIHByb3BlcnR5KSB7XG5cdFx0XHRzd2l0Y2ggKGRpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uVmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGRlc2NyaXB0aW9uUGF0aCkgfHwgXCJcIjtcblx0XHRcdFx0XHRmdWxsVGV4dCA9IGRlc2NyaXB0aW9uVmFsdWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJWYWx1ZVwiOlxuXHRcdFx0XHRcdHZhbHVlID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChwcm9wZXJ0eSkgfHwgXCJcIjtcblx0XHRcdFx0XHRmdWxsVGV4dCA9IHZhbHVlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiVmFsdWVEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRcdHZhbHVlID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChwcm9wZXJ0eSkgfHwgXCJcIjtcblx0XHRcdFx0XHRkZXNjcmlwdGlvblZhbHVlID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChkZXNjcmlwdGlvblBhdGgpIHx8IFwiXCI7XG5cdFx0XHRcdFx0ZnVsbFRleHQgPSB2YWx1ZSArIChkZXNjcmlwdGlvblZhbHVlICYmIFwiIChcIiArIGRlc2NyaXB0aW9uVmFsdWUgKyBcIilcIik7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblZhbHVlXCI6XG5cdFx0XHRcdFx0dmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5KSB8fCBcIlwiO1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uVmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGRlc2NyaXB0aW9uUGF0aCkgfHwgXCJcIjtcblx0XHRcdFx0XHRmdWxsVGV4dCA9IGRlc2NyaXB0aW9uVmFsdWUgPyBkZXNjcmlwdGlvblZhbHVlICsgXCIgKFwiICsgdmFsdWUgKyBcIilcIiA6IHZhbHVlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdExvZy5pbmZvKFwiRGlzcGxheSBQcm9wZXJ0eSBub3QgYXBwbGljYWJsZTogXCIgKyBwcm9wZXJ0eSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdFwidGV4dEFycmFuZ2VtZW50XCI6IGRpc3BsYXlNb2RlLFxuXHRcdFx0XCJ2YWx1ZVBhdGhcIjogcHJvcGVydHksXG5cdFx0XHRcImRlc2NyaXB0aW9uUGF0aFwiOiBkZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcInZhbHVlXCI6IHZhbHVlLFxuXHRcdFx0XCJkZXNjcmlwdGlvblwiOiBkZXNjcmlwdGlvblZhbHVlLFxuXHRcdFx0XCJmdWxsVGV4dFwiOiBmdWxsVGV4dFxuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybiB0aGUgdmlzaWJpbGl0eSB2YWx1dWUgZm9yIHRoZSBNYW5hZ2VkT2JqZWN0IEFueS5cblx0ICpcblx0ICogQHBhcmFtIHtBbnlUeXBlfSBhbnkgVGhlIE1hbmFnZWRPYmplY3QgQW55IHRvIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2aXNpYmxlIHZhbHVlIG9mIHRoZSBiaW5kaW5nLlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBtYXNzIGVkaXQgZmllbGQgaXMgZWRpdGFibGUuXG5cdCAqL1xuXHRpc0VkaXRhYmxlOiBmdW5jdGlvbiAoYW55OiBBbnlUeXBlKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYmluZGluZyA9IGFueS5nZXRCaW5kaW5nKFwiYW55XCIpO1xuXHRcdGNvbnN0IHZhbHVlID0gKGJpbmRpbmcgYXMgYW55KS5nZXRFeHRlcm5hbFZhbHVlKCk7XG5cdFx0cmV0dXJuIHZhbHVlID09PSBFZGl0TW9kZS5FZGl0YWJsZTtcblx0fSxcblxuXHQvKipcblx0ICogQ2FsY3VsYXRlIGFuZCB1cGRhdGUgdGhlIHZpc2liaWxpdHkgb2YgbWFzcyBlZGl0IGZpZWxkIG9uIGNoYW5nZSBvZiB0aGUgTWFuYWdlZE9iamVjdCBBbnkgYmluZGluZy5cblx0ICpcblx0ICogQHBhcmFtIHtKU09OTW9kZWx9IG9EaWFsb2dEYXRhTW9kZWwgTW9kZWwgdG8gYmUgdXNlZCBydW50aW1lLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZGF0YVByb3BlcnR5IEZpZWxkIG5hbWUuXG5cdCAqL1xuXHRvbkNvbnRleHRFZGl0YWJsZUNoYW5nZTogZnVuY3Rpb24gKG9EaWFsb2dEYXRhTW9kZWw6IEpTT05Nb2RlbCwgZGF0YVByb3BlcnR5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBvYmplY3RzRm9yVmlzaWJpbGl0eSA9IG9EaWFsb2dEYXRhTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzL1wiICsgZGF0YVByb3BlcnR5ICsgXCIvb2JqZWN0c0ZvclZpc2liaWxpdHlcIikgfHwgW107XG5cdFx0Y29uc3QgZWRpdGFibGUgPSBvYmplY3RzRm9yVmlzaWJpbGl0eS5zb21lKE1hc3NFZGl0SGVscGVyLmlzRWRpdGFibGUpO1xuXG5cdFx0aWYgKGVkaXRhYmxlKSB7XG5cdFx0XHRvRGlhbG9nRGF0YU1vZGVsLnNldFByb3BlcnR5KFwiL3ZhbHVlcy9cIiArIGRhdGFQcm9wZXJ0eSArIFwiL3Zpc2libGVcIiwgZWRpdGFibGUpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIE1hbmFnZWQgT2JqZWN0IEFueSBmb3IgdmlzaWJpbGl0eSBvZiB0aGUgbWFzcyBlZGl0IGZpZWxkcy5cblx0ICpcblx0ICogQHBhcmFtIHtBbnlUeXBlfSBtT1RvVXNlIFRoZSBNYW5hZ2VkT2JqZWN0IEFueSB0byBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgdmlzaWJsZSB2YWx1ZSBvZiB0aGUgYmluZGluZy5cblx0ICogQHBhcmFtIHtKU09OTW9kZWx9IG9EaWFsb2dEYXRhTW9kZWwgTW9kZWwgdG8gYmUgdXNlZCBydW50aW1lLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZGF0YVByb3BlcnR5IEZpZWxkIG5hbWUuXG5cdCAqIEBwYXJhbSB7YW55fSB2YWx1ZXMgVmFsdWVzIG9mIHRoZSBmaWVsZC5cblx0ICovXG5cdHVwZGF0ZU9uQ29udGV4dENoYW5nZTogZnVuY3Rpb24gKG1PVG9Vc2U6IEFueVR5cGUsIG9EaWFsb2dEYXRhTW9kZWw6IEpTT05Nb2RlbCwgZGF0YVByb3BlcnR5OiBzdHJpbmcsIHZhbHVlczogYW55KSB7XG5cdFx0Y29uc3QgYmluZGluZyA9IG1PVG9Vc2UuZ2V0QmluZGluZyhcImFueVwiKTtcblxuXHRcdHZhbHVlcy5vYmplY3RzRm9yVmlzaWJpbGl0eSA9IHZhbHVlcy5vYmplY3RzRm9yVmlzaWJpbGl0eSB8fCBbXTtcblx0XHR2YWx1ZXMub2JqZWN0c0ZvclZpc2liaWxpdHkucHVzaChtT1RvVXNlKTtcblxuXHRcdGJpbmRpbmcuYXR0YWNoQ2hhbmdlKE1hc3NFZGl0SGVscGVyLm9uQ29udGV4dEVkaXRhYmxlQ2hhbmdlLmJpbmQobnVsbCwgb0RpYWxvZ0RhdGFNb2RlbCwgZGF0YVByb3BlcnR5KSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCBib3VuZCBvYmplY3QgdG8gY2FsY3VsYXRlIHRoZSB2aXNpYmlsaXR5IG9mIGNvbnRleHRzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0JpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+fSBleHBCaW5kaW5nIEJpbmRpbmcgU3RyaW5nIG9iamVjdC5cblx0ICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQgQ29udGV4dCB0aGUgYmluZGluZyB2YWx1ZS5cblx0ICogQHJldHVybnMge0FueVR5cGV9IFRoZSBNYW5hZ2VkT2JqZWN0IEFueSB0byBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgdmlzaWJsZSB2YWx1ZSBvZiB0aGUgYmluZGluZy5cblx0ICovXG5cdGdldEJvdW5kT2JqZWN0OiBmdW5jdGlvbiAoZXhwQmluZGluZzogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB8IEV4cHJlc3Npb25PclByaW1pdGl2ZTxzdHJpbmc+LCBjb250ZXh0OiBDb250ZXh0KTogQW55VHlwZSB7XG5cdFx0Y29uc3QgbU9Ub1VzZSA9IG5ldyBBbnkoeyBhbnk6IGV4cEJpbmRpbmcgfSk7XG5cdFx0Y29uc3QgbW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0bU9Ub1VzZS5zZXRNb2RlbChtb2RlbCk7XG5cdFx0bU9Ub1VzZS5zZXRCaW5kaW5nQ29udGV4dChjb250ZXh0KTtcblxuXHRcdHJldHVybiBtT1RvVXNlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGZpZWxkLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0JpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+fSBleHBCaW5kaW5nIEJpbmRpbmcgU3RyaW5nIG9iamVjdC5cblx0ICogQHBhcmFtIHtKU09OTW9kZWx9IG9EaWFsb2dEYXRhTW9kZWwgTW9kZWwgdG8gYmUgdXNlZCBydW50aW1lLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZGF0YVByb3BlcnR5IEZpZWxkIG5hbWUuXG5cdCAqIEBwYXJhbSB7YW55fSB2YWx1ZXMgVmFsdWVzIG9mIHRoZSBmaWVsZC5cblx0ICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQgQ29udGV4dCB0aGUgYmluZGluZyB2YWx1ZS5cblx0ICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFzcyBlZGl0IGZpZWxkIGlzIGVkaXRhYmxlLlxuXHQgKi9cblx0Z2V0RmllbGRWaXNpYmxpdHk6IGZ1bmN0aW9uIChcblx0XHRleHBCaW5kaW5nOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPHN0cmluZz4sXG5cdFx0b0RpYWxvZ0RhdGFNb2RlbDogSlNPTk1vZGVsLFxuXHRcdGRhdGFQcm9wZXJ0eTogc3RyaW5nLFxuXHRcdHZhbHVlczogYW55LFxuXHRcdGNvbnRleHQ6IENvbnRleHRcblx0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbU9Ub1VzZSA9IE1hc3NFZGl0SGVscGVyLmdldEJvdW5kT2JqZWN0KGV4cEJpbmRpbmcsIGNvbnRleHQpO1xuXHRcdGNvbnN0IGlzQ29udGV4dEVkaXRhYmxlID0gTWFzc0VkaXRIZWxwZXIuaXNFZGl0YWJsZShtT1RvVXNlKTtcblxuXHRcdGlmICghaXNDb250ZXh0RWRpdGFibGUpIHtcblx0XHRcdE1hc3NFZGl0SGVscGVyLnVwZGF0ZU9uQ29udGV4dENoYW5nZShtT1RvVXNlLCBvRGlhbG9nRGF0YU1vZGVsLCBkYXRhUHJvcGVydHksIHZhbHVlcyk7XG5cdFx0fVxuXHRcdHJldHVybiBpc0NvbnRleHRFZGl0YWJsZTtcblx0fSxcblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZXMgYSBydW50aW1lIG1vZGVsOlxuXHQgKiA9PiBUaGUgbW9kZWwgY29uc2lzdHMgb2YgdmFsdWVzIHNob3duIGluIHRoZSBjb21ib0JveCBvZiB0aGUgZGlhbG9nIChMZWF2ZSBCbGFuaywgS2VlcCBFeGlzdGluZyBWYWx1ZXMsIG9yIGFueSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHNlbGVjdGVkIGNvbnRleHQsIGV0Yy4pXG5cdCAqID0+IFRoZSBtb2RlbCB3aWxsIGNhcHR1cmUgcnVudGltZSBjaGFuZ2VzIGluIHRoZSByZXN1bHRzIHByb3BlcnR5ICh0aGUgdmFsdWUgZW50ZXJlZCBpbiB0aGUgY29tYm9Cb3gpLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FycmF5fSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhRGF0YUFycmF5IEFycmF5IGNvbnRhaW5pbmcgZGF0YSByZWxhdGVkIHRvIHRoZSBkaWFsb2cgdXNlZCBieSBib3RoIHRoZSBzdGF0aWMgYW5kIHRoZSBydW50aW1lIG1vZGVsXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRGVmYXVsdFZhbHVlcyBEZWZhdWx0IHZhbHVlcyBmcm9tIGkxOG5cblx0ICogQHBhcmFtIHtDb250ZXh0fSBkaWFsb2dDb250ZXh0IFRyYW5zaWVudCBjb250ZXh0IGZvciBtYXNzIGVkaXQgZGlhbG9nLlxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fVxuXHQgKi9cblx0c2V0UnVudGltZU1vZGVsT25EaWFsb2c6IGZ1bmN0aW9uIChhQ29udGV4dHM6IGFueVtdLCBhRGF0YUFycmF5OiBhbnlbXSwgb0RlZmF1bHRWYWx1ZXM6IGFueSwgZGlhbG9nQ29udGV4dDogQ29udGV4dCkge1xuXHRcdGNvbnN0IGFWYWx1ZXM6IGFueVtdID0gW107XG5cdFx0Y29uc3QgYVVuaXREYXRhOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IGFSZXN1bHRzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IGFSZWFkT25seUZpZWxkSW5mbzogYW55W10gPSBbXTtcblx0XHRjb25zdCBvRGF0YSA9IHtcblx0XHRcdFwidmFsdWVzXCI6IGFWYWx1ZXMsXG5cdFx0XHRcInVuaXREYXRhXCI6IGFVbml0RGF0YSxcblx0XHRcdFwicmVzdWx0c1wiOiBhUmVzdWx0cyxcblx0XHRcdFwicmVhZGFibGVQcm9wZXJ0eURhdGFcIjogYVJlYWRPbmx5RmllbGRJbmZvLFxuXHRcdFx0XCJzZWxlY3RlZEtleVwiOiB1bmRlZmluZWRcblx0XHR9O1xuXHRcdGNvbnN0IG9EaWFsb2dEYXRhTW9kZWwgPSBuZXcgSlNPTk1vZGVsKG9EYXRhKTtcblx0XHRhRGF0YUFycmF5LmZvckVhY2goZnVuY3Rpb24gKG9EYXRhOiBhbnkpIHtcblx0XHRcdGxldCBvVGV4dEluZm87XG5cdFx0XHRsZXQgc1Byb3BlcnR5S2V5O1xuXHRcdFx0bGV0IHNVbml0UHJvcGVydHlOYW1lO1xuXHRcdFx0Y29uc3Qgb0Rpc3RpbmN0VmFsdWVNYXA6IGFueSA9IHt9O1xuXHRcdFx0Y29uc3Qgb0Rpc3RpbmN0VW5pdE1hcDogYW55ID0ge307XG5cdFx0XHRpZiAob0RhdGEuZGF0YVByb3BlcnR5ICYmIG9EYXRhLmRhdGFQcm9wZXJ0eS5pbmRleE9mKFwiL1wiKSA+IC0xKSB7XG5cdFx0XHRcdGNvbnN0IGFGaW5hbFBhdGggPSBNYXNzRWRpdEhlbHBlci5pbml0TGFzdExldmVsT2ZQcm9wZXJ0eVBhdGgob0RhdGEuZGF0YVByb3BlcnR5LCBhVmFsdWVzIC8qLCBkaWFsb2dDb250ZXh0ICovKTtcblx0XHRcdFx0Y29uc3QgYVByb3BlcnR5UGF0aHMgPSBvRGF0YS5kYXRhUHJvcGVydHkuc3BsaXQoXCIvXCIpO1xuXG5cdFx0XHRcdGZvciAoY29uc3QgY29udGV4dCBvZiBhQ29udGV4dHMpIHtcblx0XHRcdFx0XHRjb25zdCBzTXVsdGlMZXZlbFBhdGhWYWx1ZSA9IGNvbnRleHQuZ2V0T2JqZWN0KG9EYXRhLmRhdGFQcm9wZXJ0eSk7XG5cdFx0XHRcdFx0c1Byb3BlcnR5S2V5ID0gb0RhdGEuZGF0YVByb3BlcnR5ICsgXCIvXCIgKyBzTXVsdGlMZXZlbFBhdGhWYWx1ZTtcblx0XHRcdFx0XHRpZiAoIW9EaXN0aW5jdFZhbHVlTWFwW3NQcm9wZXJ0eUtleV0gJiYgYUZpbmFsUGF0aFthUHJvcGVydHlQYXRoc1thUHJvcGVydHlQYXRocy5sZW5ndGggLSAxXV0pIHtcblx0XHRcdFx0XHRcdG9UZXh0SW5mbyA9IE1hc3NFZGl0SGVscGVyLmdldFRleHRBcnJhbmdlbWVudEluZm8oXG5cdFx0XHRcdFx0XHRcdG9EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0b0RhdGEuZGVzY3JpcHRpb25QYXRoLFxuXHRcdFx0XHRcdFx0XHRvRGF0YS5kaXNwbGF5LFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0YUZpbmFsUGF0aFthUHJvcGVydHlQYXRoc1thUHJvcGVydHlQYXRocy5sZW5ndGggLSAxXV0ucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFwidGV4dFwiOiAob1RleHRJbmZvICYmIG9UZXh0SW5mby5mdWxsVGV4dCkgfHwgc011bHRpTGV2ZWxQYXRoVmFsdWUsXG5cdFx0XHRcdFx0XHRcdFwia2V5XCI6IHNQcm9wZXJ0eUtleSxcblx0XHRcdFx0XHRcdFx0XCJ0ZXh0SW5mb1wiOiBvVGV4dEluZm9cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0b0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSA9IHNNdWx0aUxldmVsUGF0aFZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBpZiAoT2JqZWN0LmtleXMob0Rpc3RpbmN0VmFsdWVNYXApLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHQvLyBcdGRpYWxvZ0NvbnRleHQuc2V0UHJvcGVydHkob0RhdGEuZGF0YVByb3BlcnR5LCBzUHJvcGVydHlLZXkgJiYgb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSk7XG5cdFx0XHRcdC8vIH1cblxuXHRcdFx0XHRhRmluYWxQYXRoW2FQcm9wZXJ0eVBhdGhzW2FQcm9wZXJ0eVBhdGhzLmxlbmd0aCAtIDFdXS50ZXh0SW5mbyA9IHtcblx0XHRcdFx0XHRkZXNjcmlwdGlvblBhdGg6IG9EYXRhLmRlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFx0XHR2YWx1ZVBhdGg6IG9EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRkaXNwbGF5TW9kZTogb0RhdGEuZGlzcGxheVxuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldID0gYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldIHx8IFtdO1xuXHRcdFx0XHRhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdID0gYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldW1wic2VsZWN0T3B0aW9uc1wiXSB8fCBbXTtcblx0XHRcdFx0aWYgKG9EYXRhLnVuaXRQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldID0gYVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0gfHwgW107XG5cdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdID0gYVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdIHx8IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAoY29uc3QgY29udGV4dCBvZiBhQ29udGV4dHMpIHtcblx0XHRcdFx0XHRjb25zdCBvRGF0YU9iamVjdCA9IGNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0c1Byb3BlcnR5S2V5ID0gb0RhdGEuZGF0YVByb3BlcnR5ICsgXCIvXCIgKyBvRGF0YU9iamVjdFtvRGF0YS5kYXRhUHJvcGVydHldO1xuXHRcdFx0XHRcdGlmIChvRGF0YS5kYXRhUHJvcGVydHkgJiYgb0RhdGFPYmplY3Rbb0RhdGEuZGF0YVByb3BlcnR5XSAmJiAhb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSkge1xuXHRcdFx0XHRcdFx0aWYgKG9EYXRhLmlucHV0VHlwZSAhPSBcIkNoZWNrQm94XCIpIHtcblx0XHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0XHRvRGF0YS5kYXRhUHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdFx0b0RhdGEuZGVzY3JpcHRpb25QYXRoLFxuXHRcdFx0XHRcdFx0XHRcdG9EYXRhLmRpc3BsYXksXG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBlbnRyeSA9IHtcblx0XHRcdFx0XHRcdFx0XHRcInRleHRcIjogKG9UZXh0SW5mbyAmJiBvVGV4dEluZm8uZnVsbFRleHQpIHx8IG9EYXRhT2JqZWN0W29EYXRhLmRhdGFQcm9wZXJ0eV0sXG5cdFx0XHRcdFx0XHRcdFx0XCJrZXlcIjogc1Byb3BlcnR5S2V5LFxuXHRcdFx0XHRcdFx0XHRcdFwidGV4dEluZm9cIjogb1RleHRJbmZvXG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XS5wdXNoKGVudHJ5KTtcblx0XHRcdFx0XHRcdFx0YVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldW1wic2VsZWN0T3B0aW9uc1wiXS5wdXNoKGVudHJ5KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9EaXN0aW5jdFZhbHVlTWFwW3NQcm9wZXJ0eUtleV0gPSBvRGF0YU9iamVjdFtvRGF0YS5kYXRhUHJvcGVydHldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob0RhdGEudW5pdFByb3BlcnR5ICYmIG9EYXRhT2JqZWN0W29EYXRhLnVuaXRQcm9wZXJ0eV0pIHtcblx0XHRcdFx0XHRcdHNVbml0UHJvcGVydHlOYW1lID0gb0RhdGEudW5pdFByb3BlcnR5ICsgXCIvXCIgKyBvRGF0YU9iamVjdFtvRGF0YS51bml0UHJvcGVydHldO1xuXHRcdFx0XHRcdFx0aWYgKCFvRGlzdGluY3RVbml0TWFwW3NVbml0UHJvcGVydHlOYW1lXSkge1xuXHRcdFx0XHRcdFx0XHRpZiAob0RhdGEuaW5wdXRUeXBlICE9IFwiQ2hlY2tCb3hcIikge1xuXHRcdFx0XHRcdFx0XHRcdG9UZXh0SW5mbyA9IE1hc3NFZGl0SGVscGVyLmdldFRleHRBcnJhbmdlbWVudEluZm8oXG5cdFx0XHRcdFx0XHRcdFx0XHRvRGF0YS51bml0UHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdFx0XHRvRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRvRGF0YS5kaXNwbGF5LFxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgdW5pdEVudHJ5ID0ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XCJ0ZXh0XCI6IChvVGV4dEluZm8gJiYgb1RleHRJbmZvLmZ1bGxUZXh0KSB8fCBvRGF0YU9iamVjdFtvRGF0YS51bml0UHJvcGVydHldLFxuXHRcdFx0XHRcdFx0XHRcdFx0XCJrZXlcIjogc1VuaXRQcm9wZXJ0eU5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcInRleHRJbmZvXCI6IG9UZXh0SW5mb1xuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0ucHVzaCh1bml0RW50cnkpO1xuXHRcdFx0XHRcdFx0XHRcdGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldW1wic2VsZWN0T3B0aW9uc1wiXS5wdXNoKHVuaXRFbnRyeSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0b0Rpc3RpbmN0VW5pdE1hcFtzVW5pdFByb3BlcnR5TmFtZV0gPSBvRGF0YU9iamVjdFtvRGF0YS51bml0UHJvcGVydHldO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0udGV4dEluZm8gPSB7XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25QYXRoOiBvRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0dmFsdWVQYXRoOiBvRGF0YS5kYXRhUHJvcGVydHksXG5cdFx0XHRcdFx0ZGlzcGxheU1vZGU6IG9EYXRhLmRpc3BsYXlcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHRcdGlmIChPYmplY3Qua2V5cyhvRGlzdGluY3RWYWx1ZU1hcCkubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdGRpYWxvZ0NvbnRleHQuc2V0UHJvcGVydHkob0RhdGEuZGF0YVByb3BlcnR5LCBzUHJvcGVydHlLZXkgJiYgb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoT2JqZWN0LmtleXMob0Rpc3RpbmN0VW5pdE1hcCkubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdGRpYWxvZ0NvbnRleHQuc2V0UHJvcGVydHkob0RhdGEudW5pdFByb3BlcnR5LCBzVW5pdFByb3BlcnR5TmFtZSAmJiBvRGlzdGluY3RVbml0TWFwW3NVbml0UHJvcGVydHlOYW1lXSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0YURhdGFBcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChvRGF0YTogYW55KSB7XG5cdFx0XHRsZXQgdmFsdWVzOiBhbnkgPSB7fTtcblx0XHRcdGlmIChvRGF0YS5kYXRhUHJvcGVydHkuaW5kZXhPZihcIi9cIikgPiAtMSkge1xuXHRcdFx0XHRjb25zdCBzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUgPSBNYXNzRWRpdEhlbHBlci5nZXRWYWx1ZUZvck11bHRpTGV2ZWxQYXRoKG9EYXRhLmRhdGFQcm9wZXJ0eSwgYVZhbHVlcyk7XG5cdFx0XHRcdGlmICghc011bHRpTGV2ZWxQcm9wUGF0aFZhbHVlKSB7XG5cdFx0XHRcdFx0c011bHRpTGV2ZWxQcm9wUGF0aFZhbHVlLnB1c2goeyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy5sZWF2ZUJsYW5rVmFsdWUsIGtleTogXCJFbXB0eS9cIiArIG9EYXRhLmRhdGFQcm9wZXJ0eSB9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRNYXNzRWRpdEhlbHBlci5zZXREZWZhdWx0VmFsdWVzVG9EaWFsb2coc011bHRpTGV2ZWxQcm9wUGF0aFZhbHVlLCBhQ29udGV4dHMsIG9EZWZhdWx0VmFsdWVzLCBvRGF0YSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dmFsdWVzID0gc011bHRpTGV2ZWxQcm9wUGF0aFZhbHVlO1xuXHRcdFx0fSBlbHNlIGlmIChhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0pIHtcblx0XHRcdFx0YVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldID0gYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldIHx8IFtdO1xuXHRcdFx0XHRNYXNzRWRpdEhlbHBlci5zZXREZWZhdWx0VmFsdWVzVG9EaWFsb2coYVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldLCBhQ29udGV4dHMsIG9EZWZhdWx0VmFsdWVzLCBvRGF0YSk7XG5cdFx0XHRcdHZhbHVlcyA9IGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldICYmIGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldLmxlbmd0aCkge1xuXHRcdFx0XHRNYXNzRWRpdEhlbHBlci5zZXREZWZhdWx0VmFsdWVzVG9EaWFsb2coYVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0sIGFDb250ZXh0cywgb0RlZmF1bHRWYWx1ZXMsIG9EYXRhLCB0cnVlKTtcblx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0udGV4dEluZm8gPSB7fTtcblx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0uc2VsZWN0ZWRLZXkgPSBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0U2VsZWN0aW9uUGF0aENvbWJvQm94KGFDb250ZXh0cywgb0RhdGEudW5pdFByb3BlcnR5KTtcblx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0uaW5wdXRUeXBlID0gb0RhdGEuaW5wdXRUeXBlO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0KG9EYXRhLmRhdGFQcm9wZXJ0eSAmJiBhVmFsdWVzW29EYXRhLmRhdGFQcm9wZXJ0eV0gJiYgIWFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XS5sZW5ndGgpIHx8XG5cdFx0XHRcdChvRGF0YS51bml0UHJvcGVydHkgJiYgYVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0gJiYgIWFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldLmxlbmd0aClcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBiQ2xlYXJGaWVsZE9yQmxhbmtWYWx1ZUV4aXN0cyA9XG5cdFx0XHRcdFx0YVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldICYmXG5cdFx0XHRcdFx0YVZhbHVlc1tvRGF0YS5kYXRhUHJvcGVydHldLnNvbWUoZnVuY3Rpb24gKG9iajogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb2JqLnRleHQgPT09IFwiPCBDbGVhciBWYWx1ZXMgPlwiIHx8IG9iai50ZXh0ID09PSBcIjwgTGVhdmUgQmxhbmsgPlwiO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAob0RhdGEuZGF0YVByb3BlcnR5ICYmICFiQ2xlYXJGaWVsZE9yQmxhbmtWYWx1ZUV4aXN0cykge1xuXHRcdFx0XHRcdGFWYWx1ZXNbb0RhdGEuZGF0YVByb3BlcnR5XS5wdXNoKHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLCBrZXk6IFwiRW1wdHkvXCIgKyBvRGF0YS5kYXRhUHJvcGVydHkgfSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgYkNsZWFyRmllbGRPckJsYW5rVW5pdFZhbHVlRXhpc3RzID1cblx0XHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XSAmJlxuXHRcdFx0XHRcdGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldLnNvbWUoZnVuY3Rpb24gKG9iajogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb2JqLnRleHQgPT09IFwiPCBDbGVhciBWYWx1ZXMgPlwiIHx8IG9iai50ZXh0ID09PSBcIjwgTGVhdmUgQmxhbmsgPlwiO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAob0RhdGEudW5pdFByb3BlcnR5KSB7XG5cdFx0XHRcdFx0aWYgKCFiQ2xlYXJGaWVsZE9yQmxhbmtVbml0VmFsdWVFeGlzdHMpIHtcblx0XHRcdFx0XHRcdGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldLnB1c2goe1xuXHRcdFx0XHRcdFx0XHR0ZXh0OiBvRGVmYXVsdFZhbHVlcy5sZWF2ZUJsYW5rVmFsdWUsXG5cdFx0XHRcdFx0XHRcdGtleTogXCJFbXB0eS9cIiArIG9EYXRhLnVuaXRQcm9wZXJ0eVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGFVbml0RGF0YVtvRGF0YS51bml0UHJvcGVydHldLnRleHRJbmZvID0ge307XG5cdFx0XHRcdFx0YVVuaXREYXRhW29EYXRhLnVuaXRQcm9wZXJ0eV0uc2VsZWN0ZWRLZXkgPSBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0U2VsZWN0aW9uUGF0aENvbWJvQm94KFxuXHRcdFx0XHRcdFx0YUNvbnRleHRzLFxuXHRcdFx0XHRcdFx0b0RhdGEudW5pdFByb3BlcnR5XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRhVW5pdERhdGFbb0RhdGEudW5pdFByb3BlcnR5XS5pbnB1dFR5cGUgPSBvRGF0YS5pbnB1dFR5cGU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkgJiYgdHlwZW9mIG9EYXRhLmlzUHJvcGVydHlSZWFkT25seSA9PT0gXCJib29sZWFuXCIpIHtcblx0XHRcdFx0YVJlYWRPbmx5RmllbGRJbmZvLnB1c2goeyBcInByb3BlcnR5XCI6IG9EYXRhLmRhdGFQcm9wZXJ0eSwgdmFsdWU6IG9EYXRhLmlzUHJvcGVydHlSZWFkT25seSwgdHlwZTogXCJEZWZhdWx0XCIgfSk7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkgJiZcblx0XHRcdFx0b0RhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5Lm9wZXJhbmRzICYmXG5cdFx0XHRcdG9EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXSAmJlxuXHRcdFx0XHRvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDEgJiZcblx0XHRcdFx0b0RhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5Lm9wZXJhbmRzWzBdLm9wZXJhbmQyXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gVGhpcyBuZWVkcyB0byBiZSByZWZhY3RvcmVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgUmVhZE9ubHlFeHByZXNzaW9uIGNoYW5nZVxuXHRcdFx0XHRhUmVhZE9ubHlGaWVsZEluZm8ucHVzaCh7XG5cdFx0XHRcdFx0XCJwcm9wZXJ0eVwiOiBvRGF0YS5kYXRhUHJvcGVydHksXG5cdFx0XHRcdFx0cHJvcGVydHlQYXRoOiBvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDEucGF0aCxcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlOiBvRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDIudmFsdWUsXG5cdFx0XHRcdFx0dHlwZTogXCJQYXRoXCJcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldHRpbmcgdmlzYmlsaXR5IG9mIHRoZSBtYXNzIGVkaXQgZmllbGQuXG5cdFx0XHRpZiAob0RhdGEuZWRpdE1vZGUpIHtcblx0XHRcdFx0dmFsdWVzLnZpc2libGUgPVxuXHRcdFx0XHRcdG9EYXRhLmVkaXRNb2RlID09PSBFZGl0TW9kZS5FZGl0YWJsZSB8fFxuXHRcdFx0XHRcdGFDb250ZXh0cy5zb21lKFxuXHRcdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuZ2V0RmllbGRWaXNpYmxpdHkuYmluZChNYXNzRWRpdEhlbHBlciwgb0RhdGEuZWRpdE1vZGUsIG9EaWFsb2dEYXRhTW9kZWwsIG9EYXRhLmRhdGFQcm9wZXJ0eSwgdmFsdWVzKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YWx1ZXMudmlzaWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHR2YWx1ZXMuc2VsZWN0ZWRLZXkgPSBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0U2VsZWN0aW9uUGF0aENvbWJvQm94KGFDb250ZXh0cywgb0RhdGEuZGF0YVByb3BlcnR5KTtcblx0XHRcdHZhbHVlcy5pbnB1dFR5cGUgPSBvRGF0YS5pbnB1dFR5cGU7XG5cdFx0XHR2YWx1ZXMudW5pdFByb3BlcnR5ID0gb0RhdGEudW5pdFByb3BlcnR5O1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIG9EaWFsb2dEYXRhTW9kZWw7XG5cdH0sXG5cdC8qKlxuXHQgKiBHZXRzIHRyYW5zaWVudCBjb250ZXh0IGZvciBkaWFsb2cuXG5cdCAqXG5cdCAqIEBwYXJhbSB7VGFibGV9IHRhYmxlIEluc3RhbmNlIG9mIFRhYmxlLlxuXHQgKiBAcGFyYW0ge0RpYWxvZ30gZGlhbG9nIE1hc3MgRWRpdCBEaWFsb2cuXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFByb21pc2UgcmV0dXJuaW5nIGluc3RhbmNlIG9mIGRpYWxvZy5cblx0ICovXG5cdGdldERpYWxvZ0NvbnRleHQ6IGZ1bmN0aW9uICh0YWJsZTogVGFibGUsIGRpYWxvZz86IERpYWxvZyk6IENvbnRleHQge1xuXHRcdGxldCB0cmFuc0N0eDogQ29udGV4dCA9IChkaWFsb2cgJiYgZGlhbG9nLmdldEJpbmRpbmdDb250ZXh0KCkpIGFzIENvbnRleHQ7XG5cblx0XHRpZiAoIXRyYW5zQ3R4KSB7XG5cdFx0XHRjb25zdCBtb2RlbCA9IHRhYmxlLmdldE1vZGVsKCk7XG5cdFx0XHRjb25zdCBsaXN0QmluZGluZyA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdGNvbnN0IHRyYW5zaWVudExpc3RCaW5kaW5nID0gbW9kZWwuYmluZExpc3QobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBsaXN0QmluZGluZy5nZXRDb250ZXh0KCksIFtdLCBbXSwge1xuXHRcdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwic3VibWl0TGF0ZXJcIlxuXHRcdFx0fSkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHRcdCh0cmFuc2llbnRMaXN0QmluZGluZyBhcyBhbnkpLnJlZnJlc2hJbnRlcm5hbCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0LyogKi9cblx0XHRcdH07XG5cdFx0XHR0cmFuc0N0eCA9IHRyYW5zaWVudExpc3RCaW5kaW5nLmNyZWF0ZSh7fSwgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRyYW5zQ3R4O1xuXHR9LFxuXG5cdG9uRGlhbG9nT3BlbjogZnVuY3Rpb24gKGV2ZW50OiBhbnkpOiB2b2lkIHtcblx0XHRjb25zdCBzb3VyY2UgPSBldmVudC5nZXRTb3VyY2UoKTtcblx0XHRjb25zdCBmaWVsZHNJbmZvTW9kZWwgPSBzb3VyY2UuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpO1xuXHRcdGZpZWxkc0luZm9Nb2RlbC5zZXRQcm9wZXJ0eShcIi9pc09wZW5cIiwgdHJ1ZSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENyZWF0ZSB0aGUgbWFzcyBlZGl0IGRpYWxvZy5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9UYWJsZSBJbnN0YW5jZSBvZiBUYWJsZVxuXHQgKiBAcGFyYW0ge0FycmF5fSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRyb2xsZXIgQ29udHJvbGxlciBmb3IgdGhlIHZpZXdcblx0ICogQHJldHVybnMge29iamVjdH0gUHJvbWlzZSByZXR1cm5pbmcgaW5zdGFuY2Ugb2YgZGlhbG9nLlxuXHQgKi9cblx0Y3JlYXRlRGlhbG9nOiBmdW5jdGlvbiAob1RhYmxlOiBUYWJsZSwgYUNvbnRleHRzOiBhbnlbXSwgb0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyKSB7XG5cdFx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IFwic2FwL2ZlL2NvcmUvY29udHJvbHMvbWFzc0VkaXQvTWFzc0VkaXREaWFsb2dcIixcblx0XHRcdGFEYXRhQXJyYXk6IGFueVtdID0gW10sXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGUgPSAoQ29yZSBhcyBDb3JlRXgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpLFxuXHRcdFx0b0RlZmF1bHRWYWx1ZXMgPSBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0VGV4dHNGb3JEaWFsb2cob1Jlc291cmNlQnVuZGxlLCBhQ29udGV4dHMubGVuZ3RoLCBvVGFibGUpLFxuXHRcdFx0b0RhdGFGaWVsZE1vZGVsID0gTWFzc0VkaXRIZWxwZXIucHJlcGFyZURhdGFGb3JEaWFsb2cob1RhYmxlLCBhQ29udGV4dHMsIGFEYXRhQXJyYXkpLFxuXHRcdFx0ZGlhbG9nQ29udGV4dCA9IE1hc3NFZGl0SGVscGVyLmdldERpYWxvZ0NvbnRleHQob1RhYmxlKSxcblx0XHRcdG9EaWFsb2dEYXRhTW9kZWwgPSBNYXNzRWRpdEhlbHBlci5zZXRSdW50aW1lTW9kZWxPbkRpYWxvZyhhQ29udGV4dHMsIGFEYXRhQXJyYXksIG9EZWZhdWx0VmFsdWVzLCBkaWFsb2dDb250ZXh0KTtcblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3Qgb0ZyYWdtZW50ID0gWE1MVGVtcGxhdGVQcm9jZXNzb3IubG9hZFRlbXBsYXRlKHNGcmFnbWVudE5hbWUsIFwiZnJhZ21lbnRcIik7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRYTUxQcmVwcm9jZXNzb3IucHJvY2Vzcyhcblx0XHRcdFx0XHRvRnJhZ21lbnQsXG5cdFx0XHRcdFx0eyBuYW1lOiBzRnJhZ21lbnROYW1lIH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRcdGRhdGFGaWVsZE1vZGVsOiBvRGF0YUZpZWxkTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFx0XHRcdGRhdGFGaWVsZE1vZGVsOiBvRGF0YUZpZWxkTW9kZWxcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdClcblx0XHRcdClcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9GcmFnbWVudDogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIEZyYWdtZW50LmxvYWQoeyBkZWZpbml0aW9uOiBvRnJhZ21lbnQgfSkudGhlbihmdW5jdGlvbiAob0RpYWxvZ0NvbnRlbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgRHJhZnRTdGF0dXMgPSBGRUxpYnJhcnkuRHJhZnRTdGF0dXM7XG5cdFx0XHRcdFx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdFx0XHRcdHRpdGxlOiBvRGVmYXVsdFZhbHVlcy5tYXNzRWRpdFRpdGxlLFxuXHRcdFx0XHRcdFx0XHRjb250ZW50OiBbb0RpYWxvZ0NvbnRlbnRdLFxuXHRcdFx0XHRcdFx0XHRhZnRlck9wZW46IE1hc3NFZGl0SGVscGVyLm9uRGlhbG9nT3Blbixcblx0XHRcdFx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0XHRcdHRleHQ6IG9EZWZhdWx0VmFsdWVzLmFwcGx5QnV0dG9uVGV4dCxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQob0NvbnRyb2xsZXIuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KT8uc2V0UHJvcGVydHkoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwic2tpcFBhdGNoSGFuZGxlcnNcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9EaWFsb2cgPSBvRXZlbnQuZ2V0U291cmNlKCkuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvTW9kZWwgPSBvRGlhbG9nLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFSZXN1bHRzID0gb01vZGVsLmdldFByb3BlcnR5KFwiL3Jlc3VsdHNcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhUHJvcGVydHlSZWFkYWJsZUluZm8gPSBvTW9kZWwuZ2V0UHJvcGVydHkoXCIvcmVhZGFibGVQcm9wZXJ0eURhdGFcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBjaGFuZ2VQcm9taXNlOiBhbnlbXSA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IGJSZWFkT25seUZpZWxkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgZ3JvdXBJZDtcblx0XHRcdFx0XHRcdFx0XHRcdC8vbGV0IGluZGV4ID0gMDtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBlcnJvclZhbHVlczogYW55W10gPSBbXTtcblx0XHRcdFx0XHRcdFx0XHRcdGFDb250ZXh0cy5mb3JFYWNoKGZ1bmN0aW9uIChvU2VsZWN0ZWRDb250ZXh0OiBhbnksIGlkeDogbnVtYmVyKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFSZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKG9SZXN1bHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vVE9ETyAtIEFkZCBzYXZlIGltcGxlbWVudGF0aW9uIGZvciBWYWx1ZSBIZWxwLlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhUHJvcGVydHlSZWFkYWJsZUluZm8pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJSZWFkT25seUZpZWxkID0gYVByb3BlcnR5UmVhZGFibGVJbmZvLnNvbWUoZnVuY3Rpb24gKG9Qcm9wZXJ0eUluZm86IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob1Jlc3VsdC5rZXlWYWx1ZSA9PT0gb1Byb3BlcnR5SW5mby5wcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUHJvcGVydHlJbmZvLnR5cGUgPT09IFwiRGVmYXVsdFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1Byb3BlcnR5SW5mby52YWx1ZSA9PT0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Byb3BlcnR5SW5mby50eXBlID09PSBcIlBhdGhcIiAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Byb3BlcnR5SW5mby5wcm9wZXJ0eVZhbHVlICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvLnByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3Qob1Byb3BlcnR5SW5mby5wcm9wZXJ0eVBhdGgpID09PVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvLnByb3BlcnR5VmFsdWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Z3JvdXBJZCA9IFwiJGF1dG8uXCIgKyBpZHg7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9pbmRleCArPSAxO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Db250cm9sbGVyLl9lZGl0Rmxvdy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vbGV0IHByb21pc2VDb3VudCA9IDA7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9SZXN1bHQua2V5VmFsdWUgJiYgb1Jlc3VsdC52YWx1ZSAhPT0gXCJEZWZhdWx0XCIgJiYgIWJSZWFkT25seUZpZWxkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VQcm9taXNlLnB1c2goXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9TZWxlY3RlZENvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuc2V0UHJvcGVydHkob1Jlc3VsdC5rZXlWYWx1ZSwgb1Jlc3VsdC52YWx1ZSwgZ3JvdXBJZClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1NlbGVjdGVkQ29udGV4dDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVycm9yVmFsdWVzLnB1c2gob1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QoKSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJNYXNzIEVkaXQ6IFNvbWV0aGluZyB3ZW50IHdyb25nIGluIHVwZGF0aW5nIGVudHJpZXMuXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQoUHJvbWlzZSBhcyBhbnkpLmFsbFNldHRsZWQoY2hhbmdlUHJvbWlzZSkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9MaXN0QmluZGluZyA9IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9FeHRlbnNpb25BUEkgPSBvQ29udHJvbGxlciAmJiAob0NvbnRyb2xsZXIuZ2V0RXh0ZW5zaW9uQVBJKCkgYXMgYW55KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9FeHRlbnNpb25BUEkucmVmcmVzaChvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgc3VidGl0bGVDb2x1bW4gPSBDb21tb25VdGlscy5nZXRNZXNzYWdlQ29sdW1uKG9UYWJsZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IG1lc3NhZ2VzID0gc2FwLnVpLmdldENvcmUoKS5nZXRNZXNzYWdlTWFuYWdlcigpLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0cyA9IFtdIGFzIGFueTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChtZXNzYWdlOiBhbnksIGlkeDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBtZXNzYWdlVGFyZ2V0cyA9IG1lc3NhZ2UuZ2V0VGFyZ2V0cygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlVGFyZ2V0cyAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlVGFyZ2V0cy5sZW5ndGggPT09IDEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZVRhcmdldHNbMF0ubGVuZ3RoICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2UucGVyc2lzdGVudCA9PT0gdHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHQgPSBhQ29udGV4dHMuZmluZChmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlLmdldFRhcmdldCgpLmluZGV4T2Yob0NvbnRleHQuZ2V0UGF0aCgpKSAhPT0gLTE7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRzLnB1c2goYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZS5hZGRpdGlvbmFsVGV4dCA9IGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0LmdldE9iamVjdCgpW3N1YnRpdGxlQ29sdW1uXVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRzLmxlbmd0aCA9PT0gMCAmJiBlcnJvclZhbHVlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Db250cm9sbGVyLl9lZGl0Rmxvdy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBzdWNjZXNzVG9hc3QgPSBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX1NVQ0NFU1NfVE9BU1RcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhzdWNjZXNzVG9hc3QpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVycm9yVmFsdWVzLmxlbmd0aCArIGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dHMubGVuZ3RoIDxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KG9UYWJsZSBhcyBhbnkpLmdldFNlbGVjdGVkQ29udGV4dHMoKS5sZW5ndGhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvQ29udHJvbGxlci5fZWRpdEZsb3cuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JWYWx1ZXMubGVuZ3RoICsgYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0cy5sZW5ndGggPT09XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdChvVGFibGUgYXMgYW55KS5nZXRTZWxlY3RlZENvbnRleHRzKCkubGVuZ3RoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXRGbG93LnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXRGbG93LmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9EaWFsb2cuaXNPcGVuKCkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KG9Db250cm9sbGVyLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCk/LnNldFByb3BlcnR5KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInNraXBQYXRjaEhhbmRsZXJzXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZhbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0XHRcdHRleHQ6IG9EZWZhdWx0VmFsdWVzLmNhbmNlbEJ1dHRvblRleHQsXG5cdFx0XHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uIChvRXZlbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RpYWxvZyA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0Y29uc3QgbW9kZWwgPSBvVGFibGUuZ2V0TW9kZWwoKTtcblx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0TW9kZWwob0RpYWxvZ0RhdGFNb2RlbCwgXCJmaWVsZHNJbmZvXCIpO1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5zZXRNb2RlbChtb2RlbCk7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLnNldEJpbmRpbmdDb250ZXh0KGRpYWxvZ0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShvRGlhbG9nKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKHJlamVjdCk7XG5cdFx0fSk7XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1hc3NFZGl0SGVscGVyO1xuIl19
1011
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGVscGVyLnRzIl0sIm5hbWVzIjpbIk1hc3NFZGl0SGVscGVyIiwiaW5pdExhc3RMZXZlbE9mUHJvcGVydHlQYXRoIiwic1BhdGgiLCJhVmFsdWVzIiwiYUZpbmFsUGF0aCIsImluZGV4IiwiYVBhdGhzIiwic3BsaXQiLCJzRnVsbFBhdGgiLCJmb3JFYWNoIiwic1Byb3BlcnR5UGF0aCIsImdldFVuaXF1ZVZhbHVlcyIsInNWYWx1ZSIsInNlbGYiLCJ1bmRlZmluZWQiLCJpbmRleE9mIiwiZ2V0VmFsdWVGb3JNdWx0aUxldmVsUGF0aCIsInNEYXRhUHJvcGVydHlQYXRoIiwib1ZhbHVlcyIsImFQcm9wZXJ0eVBhdGhzIiwiUmVzdWx0IiwiZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveCIsImFDb250ZXh0cyIsImxlbmd0aCIsIm9TZWxlY3RlZENvbnRleHQiLCJhUHJvcGVydHlWYWx1ZXMiLCJvQ29udGV4dCIsIm9EYXRhT2JqZWN0IiwiZ2V0T2JqZWN0Iiwic011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uIiwiaGFzT3duUHJvcGVydHkiLCJwdXNoIiwiYVVuaXF1ZVByb3BlcnR5VmFsdWVzIiwiZmlsdGVyIiwiZ2V0SGlkZGVuVmFsdWVGb3JDb250ZXh0cyIsImhpZGRlblZhbHVlIiwiJFBhdGgiLCJzb21lIiwiZ2V0SW5wdXRUeXBlIiwicHJvcGVydHlJbmZvIiwiZGF0YUZpZWxkQ29udmVydGVkIiwib0RhdGFNb2RlbFBhdGgiLCJlZGl0U3R5bGVQcm9wZXJ0aWVzIiwiaW5wdXRUeXBlIiwic2V0RWRpdFN0eWxlUHJvcGVydGllcyIsImVkaXRTdHlsZSIsImlzVmFsaWRGb3JNYXNzRWRpdCIsImlzQ29sbGVjdGlvbkZpZWxkIiwiaGFzVmFsdWVIZWxwV2l0aEZpeGVkVmFsdWVzIiwiZ2V0SXNGaWVsZEdycCIsIiRUeXBlIiwiVGFyZ2V0IiwidmFsdWUiLCJnZXRUZXh0UGF0aCIsInByb3BlcnR5IiwidGV4dEJpbmRpbmciLCJkaXNwbGF5TW9kZSIsImRlc2NyaXB0aW9uUGF0aCIsInBhdGgiLCJwYXJhbWV0ZXJzIiwicHJvcHMiLCJwcmVwYXJlRGF0YUZvckRpYWxvZyIsIm9UYWJsZSIsImFEYXRhQXJyYXkiLCJvTWV0YU1vZGVsIiwiZ2V0TW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJzQ3VycmVudEVudGl0eVNldE5hbWUiLCJkYXRhIiwiYVRhYmxlRmllbGRzIiwiZ2V0VGFibGVGaWVsZHMiLCJvRW50aXR5VHlwZUNvbnRleHQiLCJnZXRDb250ZXh0Iiwib0VudGl0eVNldENvbnRleHQiLCJvRGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsIm9EYXRhRmllbGRNb2RlbCIsIkpTT05Nb2RlbCIsIm9SZXN1bHQiLCJzTGFiZWxUZXh0IiwiYlZhbHVlSGVscEVuYWJsZWQiLCJzVW5pdFByb3BlcnR5UGF0aCIsImJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCIsIm9UZXh0QmluZGluZyIsIm9Db2x1bW5JbmZvIiwiZGF0YVByb3BlcnR5Iiwib1Byb3BlcnR5SW5mbyIsImxhYmVsIiwidGFyZ2V0T2JqZWN0IiwidGFyZ2V0RW50aXR5VHlwZSIsImVudGl0eVByb3BlcnRpZXMiLCJvUHJvcGVydHkiLCJuYW1lIiwiZ2V0VGV4dEJpbmRpbmciLCJvRmllbGRDb250ZXh0IiwiYW5ub3RhdGlvblBhdGgiLCJvRGF0YUZpZWxkQ29udmVydGVkIiwiY29udmVydE1ldGFNb2RlbENvbnRleHQiLCJvUHJvcGVydHlDb250ZXh0Iiwib0ludGVyZmFjZSIsImdldEludGVyZmFjZSIsIlZhbHVlIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJiSGlkZGVuRmllbGQiLCJpc0ltYWdlIiwiY29udGV4dCIsImdldFBhdGgiLCJfdHlwZSIsIiR0YXJnZXQiLCJjaGFydFByb3BlcnR5IiwidGVybSIsImlzQWN0aW9uIiwiQWN0aW9uIiwiaXNGaWVsZEdycCIsImhhc1ZhbHVlSGVscCIsImhhc0N1cnJlbmN5IiwiaGFzVW5pdCIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHlQYXRoIiwidW5pdFByb3BlcnR5SW5mbyIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkiLCJwcm9wZXJ0eUZvckZpZWxkQ29udHJvbCIsImV4cEJpbmRpbmciLCJnZXRFZGl0TW9kZSIsImNvbnN0YW50IiwiZWRpdE1vZGVWYWx1ZXMiLCJPYmplY3QiLCJrZXlzIiwiRWRpdE1vZGUiLCJlZGl0TW9kZUlzU3RhdGljIiwiaW5jbHVkZXMiLCJlZGl0YWJsZSIsIkVkaXRhYmxlIiwibmF2UHJvcGVydHlXaXRoVmFsdWVIZWxwIiwiaXNSZWFkT25seSIsImlzUmVhZE9ubHlFeHByZXNzaW9uIiwiQ29tbW9uVXRpbHMiLCJjb21wdXRlRGlzcGxheU1vZGUiLCJnZXRSZXF1aXJlZEV4cHJlc3Npb24iLCJudWxsYWJsZSIsInNldERhdGEiLCJhQ29sdW1ucyIsImdldENvbHVtbnMiLCJjb2x1bW5zRGF0YSIsImdldFBhcmVudCIsImdldFRhYmxlRGVmaW5pdGlvbiIsImNvbHVtbnMiLCJtYXAiLCJvQ29sdW1uIiwic0RhdGFQcm9wZXJ0eSIsImdldERhdGFQcm9wZXJ0eSIsImFSZWFsdGVkQ29sdW1uSW5mbyIsInR5cGUiLCJnZXRIZWFkZXIiLCJnZXREZWZhdWx0VGV4dHNGb3JEaWFsb2ciLCJvUmVzb3VyY2VCdW5kbGUiLCJpU2VsZWN0ZWRDb250ZXh0cyIsImJEaXNwbGF5TW9kZSIsImdldFRleHQiLCJ0b1N0cmluZyIsInNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZyIsIm9EZWZhdWx0VmFsdWVzIiwiYlVPTUZpZWxkIiwidW5pdFByb3BlcnR5Iiwic0lucHV0VHlwZSIsImJQcm9wZXJ0eVJlcXVpcmVkIiwiaXNGaWVsZFJlcXVpcmVkIiwic1N1ZmZpeEZvcktlZXBFeGlzdGluZyIsImRlZmF1bHRPcHRpb25zIiwic2VsZWN0T3B0aW9uc0V4aXN0Iiwic2VsZWN0T3B0aW9ucyIsImtlZXBFbnRyeSIsInRleHQiLCJrZWVwRXhpc3RpbmdQcmVmaXgiLCJrZXkiLCJmYWxzZUVudHJ5IiwidGV4dEluZm8iLCJ0cnV0aHlFbnRyeSIsInVuc2hpZnQiLCJpc1ZhbHVlSGVscEVuYWJsZWQiLCJpc1ZhbHVlSGVscEVuYWJsZWRGb3JVbml0IiwidmhkRW50cnkiLCJ1c2VWYWx1ZUhlbHBWYWx1ZSIsImNsZWFyRW50cnkiLCJjbGVhckZpZWxkVmFsdWUiLCJlbXB0eUVudHJ5IiwibGVhdmVCbGFua1ZhbHVlIiwiZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyIsInNlbGVjdGVkQ29udGV4dCIsImRlc2NyaXB0aW9uVmFsdWUiLCJmdWxsVGV4dCIsIkxvZyIsImluZm8iLCJpc0VkaXRhYmxlIiwiYW55IiwiYmluZGluZyIsImdldEJpbmRpbmciLCJnZXRFeHRlcm5hbFZhbHVlIiwib25Db250ZXh0RWRpdGFibGVDaGFuZ2UiLCJvRGlhbG9nRGF0YU1vZGVsIiwib2JqZWN0c0ZvclZpc2liaWxpdHkiLCJnZXRQcm9wZXJ0eSIsInNldFByb3BlcnR5IiwidXBkYXRlT25Db250ZXh0Q2hhbmdlIiwibU9Ub1VzZSIsInZhbHVlcyIsImF0dGFjaENoYW5nZSIsImJpbmQiLCJnZXRCb3VuZE9iamVjdCIsIkFueSIsIm1vZGVsIiwic2V0TW9kZWwiLCJzZXRCaW5kaW5nQ29udGV4dCIsImdldEZpZWxkVmlzaWJsaXR5IiwiaXNDb250ZXh0RWRpdGFibGUiLCJzZXRSdW50aW1lTW9kZWxPbkRpYWxvZyIsImRpYWxvZ0NvbnRleHQiLCJhVW5pdERhdGEiLCJhUmVzdWx0cyIsImFSZWFkT25seUZpZWxkSW5mbyIsIm9EYXRhIiwibm9GaWVsZHMiLCJvSW5EYXRhIiwib1RleHRJbmZvIiwic1Byb3BlcnR5S2V5Iiwic1VuaXRQcm9wZXJ0eU5hbWUiLCJvRGlzdGluY3RWYWx1ZU1hcCIsIm9EaXN0aW5jdFVuaXRNYXAiLCJzTXVsdGlMZXZlbFBhdGhWYWx1ZSIsImRpc3BsYXkiLCJ2YWx1ZVBhdGgiLCJlbnRyeSIsInVuaXRFbnRyeSIsInNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSIsInNlbGVjdGVkS2V5IiwiYkNsZWFyRmllbGRPckJsYW5rVmFsdWVFeGlzdHMiLCJvYmoiLCJiQ2xlYXJGaWVsZE9yQmxhbmtVbml0VmFsdWVFeGlzdHMiLCJpc1Byb3BlcnR5UmVhZE9ubHkiLCJvcGVyYW5kcyIsIm9wZXJhbmQxIiwib3BlcmFuZDIiLCJwcm9wZXJ0eVBhdGgiLCJwcm9wZXJ0eVZhbHVlIiwiZWRpdE1vZGUiLCJ2aXNpYmxlIiwiZ2V0RGlhbG9nQ29udGV4dCIsInRhYmxlIiwiZGlhbG9nIiwidHJhbnNDdHgiLCJnZXRCaW5kaW5nQ29udGV4dCIsImxpc3RCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsInRyYW5zaWVudExpc3RCaW5kaW5nIiwiYmluZExpc3QiLCIkJHVwZGF0ZUdyb3VwSWQiLCJyZWZyZXNoSW50ZXJuYWwiLCJjcmVhdGUiLCJvbkRpYWxvZ09wZW4iLCJldmVudCIsInNvdXJjZSIsImdldFNvdXJjZSIsImZpZWxkc0luZm9Nb2RlbCIsImNyZWF0ZURpYWxvZyIsIm9Db250cm9sbGVyIiwic0ZyYWdtZW50TmFtZSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJvRnJhZ21lbnQiLCJYTUxUZW1wbGF0ZVByb2Nlc3NvciIsImxvYWRUZW1wbGF0ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsImJpbmRpbmdDb250ZXh0cyIsImRhdGFGaWVsZE1vZGVsIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJtb2RlbHMiLCJvQ3JlYXRlZEZyYWdtZW50IiwiRnJhZ21lbnQiLCJsb2FkIiwiZGVmaW5pdGlvbiIsIm9EaWFsb2dDb250ZW50IiwiRHJhZnRTdGF0dXMiLCJGRUxpYnJhcnkiLCJvRGlhbG9nIiwiRGlhbG9nIiwicmVzaXphYmxlIiwidGl0bGUiLCJtYXNzRWRpdFRpdGxlIiwiY29udGVudCIsImFmdGVyT3BlbiIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwiaGVscGVycyIsImdldEV4cEJpbmRpbmdGb3JBcHBseUJ1dHRvblR4dCIsInByZXNzIiwib0V2ZW50IiwiZ2V0VmlldyIsIm9JbkRpYWxvZyIsIm9Nb2RlbCIsImFQcm9wZXJ0eVJlYWRhYmxlSW5mbyIsImNoYW5nZVByb21pc2UiLCJiUmVhZE9ubHlGaWVsZCIsImdyb3VwSWQiLCJlcnJvclZhbHVlcyIsImlkeCIsImtleVZhbHVlIiwiX2VkaXRGbG93Iiwic2V0RHJhZnRTdGF0dXMiLCJTYXZpbmciLCJ0aGVuIiwiY2F0Y2giLCJvRXJyb3IiLCJlcnJvciIsImFsbFNldHRsZWQiLCJvTGlzdEJpbmRpbmciLCJvRXh0ZW5zaW9uQVBJIiwiZ2V0RXh0ZW5zaW9uQVBJIiwicmVmcmVzaCIsInN1YnRpdGxlQ29sdW1uIiwiZ2V0TWVzc2FnZUNvbHVtbiIsIm1lc3NhZ2VzIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiZ2V0TWVzc2FnZU1hbmFnZXIiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwiYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0cyIsIm1lc3NhZ2UiLCJtZXNzYWdlVGFyZ2V0cyIsImdldFRhcmdldHMiLCJwZXJzaXN0ZW50IiwiYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0IiwiZmluZCIsImdldFRhcmdldCIsImFkZGl0aW9uYWxUZXh0IiwiU2F2ZWQiLCJzdWNjZXNzVG9hc3QiLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsIkNsZWFyIiwiZ2V0TWVzc2FnZUhhbmRsZXIiLCJzaG93TWVzc2FnZXMiLCJpc09wZW4iLCJjbG9zZSIsImRlc3Ryb3kiLCJlbmRCdXR0b24iLCJjYW5jZWxCdXR0b25UZXh0IiwiaGFzRWRpdGFibGVGaWVsZHNCaW5kaW5nIiwiZ2V0QmluZGluZ0V4cEZvckhhc0VkaXRhYmxlRmllbGRzIiwiZmllbGRzIiwidG90YWxFeHAiLCJyZWR1Y2UiLCJleHByZXNzaW9uIiwiZmllbGQiLCJvciIsInBhdGhJbk1vZGVsIiwibm90IiwiZGVmYXVsdFZhbHVlcyIsImVkaXRhYmxlRXhwIiwi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YyxDQUFDc1MsT0FBZixDQUF1QjBELGlDQUF2QixDQUF5REMsTUFBekQsRUFBaUUvTixRQUFqRSxDQUFELENBQXhCO0FBQ0E7QUFyQk87QUE3N0JhLEdBQXZCO1NBczlCZWxJLGMiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHtcblx0QmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLFxuXHRDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbixcblx0Y29tcGlsZUV4cHJlc3Npb24sXG5cdGNvbnN0YW50LFxuXHRpZkVsc2UsXG5cdG5vdCxcblx0b3IsXG5cdHBhdGhJbk1vZGVsXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IGVuaGFuY2VEYXRhTW9kZWxQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHtcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgsXG5cdGhhc0N1cnJlbmN5LFxuXHRoYXNVbml0LFxuXHRoYXNWYWx1ZUhlbHAsXG5cdGhhc1ZhbHVlSGVscFdpdGhGaXhlZFZhbHVlc1xufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0VGV4dEJpbmRpbmcsIHNldEVkaXRTdHlsZVByb3BlcnRpZXMgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWVsZC9GaWVsZFRlbXBsYXRpbmdcIjtcbmltcG9ydCB0eXBlIHsgRmllbGRQcm9wZXJ0aWVzIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvRmllbGQubWV0YWRhdGFcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IFhNTFRlbXBsYXRlUHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS9YTUxUZW1wbGF0ZVByb2Nlc3NvclwiO1xuaW1wb3J0IEVkaXRNb2RlIGZyb20gXCJzYXAvdWkvbWRjL2VudW0vRWRpdE1vZGVcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgeyBDb3JlRXggfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEFueVR5cGUgfSBmcm9tIFwiLi4vY29udHJvbHMvQW55XCI7XG5pbXBvcnQgQW55IGZyb20gXCIuLi9jb250cm9scy9BbnlcIjtcbmltcG9ydCB7IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0LCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwiLi4vY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGlzUmVhZE9ubHlFeHByZXNzaW9uIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvRmllbGRDb250cm9sSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRFZGl0TW9kZSwgZ2V0UmVxdWlyZWRFeHByZXNzaW9uLCBpc0NvbGxlY3Rpb25GaWVsZCB9IGZyb20gXCIuLi90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCIuL01vZGVsSGVscGVyXCI7XG5cbi8qIFRoaXMgY2xhc3MgY29udGFpbnMgaGVscGVycyB0byBiZSB1c2VkIGZvciBtYXNzIGVkaXQgZnVuY3Rpb25hbGl0eSAqL1xudHlwZSBUZXh0QXJyYW5nZW1lbnRJbmZvID0ge1xuXHR0ZXh0QXJyYW5nZW1lbnQ6IHN0cmluZztcblx0dmFsdWVQYXRoOiBzdHJpbmc7XG5cdGRlc2NyaXB0aW9uUGF0aD86IHN0cmluZztcblx0dmFsdWU6IHN0cmluZztcblx0ZGVzY3JpcHRpb246IHN0cmluZztcblx0ZnVsbFRleHQ6IHN0cmluZztcbn07XG5cbnR5cGUgQmluZGluZ0luZm8gPSB7XG5cdHBhdGg/OiBzdHJpbmc7XG5cdG1vZGVsPzogc3RyaW5nIHwgb2JqZWN0O1xuXHRwYXJhbWV0ZXJzPzogQXJyYXk8QmluZGluZ0luZm8+O1xufTtcblxuY29uc3QgTWFzc0VkaXRIZWxwZXIgPSB7XG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyB0aGUgdmFsdWUgYXQgZmluYWwgb3IgZGVlcGVzdCBsZXZlbCBwYXRoIHdpdGggYSBibGFuayBhcnJheS5cblx0ICogUmV0dXJuIGFuIGVtcHR5IGFycmF5IHBvaW50aW5nIHRvIHRoZSBmaW5hbCBvciBkZWVwZXN0IGxldmVsIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzUGF0aCBQcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSBhVmFsdWVzIEFycmF5IGluc3RhbmNlIHdoZXJlIHRoZSBkZWZhdWx0IGRhdGEgbmVlZHMgdG8gYmUgYWRkZWRcblx0ICogQHJldHVybnMgVGhlIGZpbmFsIHBhdGhcblx0ICovXG5cdGluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aDogZnVuY3Rpb24gKHNQYXRoOiBzdHJpbmcsIGFWYWx1ZXM6IGFueSAvKiwgdHJhbnNDdHg6IENvbnRleHQgKi8pIHtcblx0XHRsZXQgYUZpbmFsUGF0aDogYW55O1xuXHRcdGxldCBpbmRleCA9IDA7XG5cdFx0Y29uc3QgYVBhdGhzID0gc1BhdGguc3BsaXQoXCIvXCIpO1xuXHRcdGxldCBzRnVsbFBhdGggPSBcIlwiO1xuXHRcdGFQYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChzUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHRcdGlmICghYVZhbHVlc1tzUHJvcGVydHlQYXRoXSAmJiBpbmRleCA9PT0gMCkge1xuXHRcdFx0XHRhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdID0ge307XG5cdFx0XHRcdGFGaW5hbFBhdGggPSBhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRzRnVsbFBhdGggPSBzRnVsbFBhdGggKyBzUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0fSBlbHNlIGlmICghYUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXSkge1xuXHRcdFx0XHRzRnVsbFBhdGggPSBgJHtzRnVsbFBhdGh9LyR7c1Byb3BlcnR5UGF0aH1gO1xuXHRcdFx0XHRpZiAoc0Z1bGxQYXRoICE9PSBzUGF0aCkge1xuXHRcdFx0XHRcdGFGaW5hbFBhdGhbc1Byb3BlcnR5UGF0aF0gPSB7fTtcblx0XHRcdFx0XHRhRmluYWxQYXRoID0gYUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhRmluYWxQYXRoW3NQcm9wZXJ0eVBhdGhdID0gW107XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gYUZpbmFsUGF0aDtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGdldCB1bmlxdWUgdmFsdWVzIGZvciBnaXZlbiBhcnJheSB2YWx1ZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBzVmFsdWUgUHJvcGVydHkgdmFsdWVcblx0ICogQHBhcmFtIGluZGV4IEluZGV4IG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZVxuXHQgKiBAcGFyYW0gc2VsZiBJbnN0YW5jZSBvZiB0aGUgYXJyYXlcblx0ICogQHJldHVybnMgVGhlIHVuaXF1ZSB2YWx1ZVxuXHQgKi9cblx0Z2V0VW5pcXVlVmFsdWVzOiBmdW5jdGlvbiAoc1ZhbHVlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIHNlbGY6IGFueVtdKSB7XG5cdFx0aWYgKHNWYWx1ZSAhPSB1bmRlZmluZWQgJiYgc1ZhbHVlICE9IG51bGwpIHtcblx0XHRcdHJldHVybiBzZWxmLmluZGV4T2Yoc1ZhbHVlKSA9PT0gaW5kZXg7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgYSBtdWx0aS1sZXZlbCBwYXRoIChmb3IgZXhhbXBsZTogX01hdGVyaWFscy9NYXRlcmlhbF9EZXRhaWxzIGdldHMgdGhlIHZhbHVlIG9mIE1hdGVyaWFsX0RldGFpbHMgdW5kZXIgX01hdGVyaWFscyBPYmplY3QpLlxuXHQgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eVZhbHVlLCB3aGljaCBjYW4gYmUgb2YgYW55IHR5cGUgKHN0cmluZywgbnVtYmVyLCBldGMuLikuXG5cdCAqXG5cdCAqIEBwYXJhbSBzRGF0YVByb3BlcnR5UGF0aCBQcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSBvVmFsdWVzIE9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXNcblx0ICogQHJldHVybnMgVGhlIHByb3BlcnR5IHZhbHVlXG5cdCAqL1xuXHRnZXRWYWx1ZUZvck11bHRpTGV2ZWxQYXRoOiBmdW5jdGlvbiAoc0RhdGFQcm9wZXJ0eVBhdGg6IHN0cmluZywgb1ZhbHVlczogYW55KSB7XG5cdFx0aWYgKHNEYXRhUHJvcGVydHlQYXRoICYmIHNEYXRhUHJvcGVydHlQYXRoLmluZGV4T2YoXCIvXCIpID4gMCkge1xuXHRcdFx0Y29uc3QgYVByb3BlcnR5UGF0aHMgPSBzRGF0YVByb3BlcnR5UGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRsZXQgUmVzdWx0OiBhbnk7XG5cdFx0XHRhUHJvcGVydHlQYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChzUGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdFJlc3VsdCA9IG9WYWx1ZXMgJiYgb1ZhbHVlc1tzUGF0aF0gPyBvVmFsdWVzW3NQYXRoXSA6IFJlc3VsdCAmJiBSZXN1bHRbc1BhdGhdO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gUmVzdWx0O1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogR2V0cyB0aGUga2V5IHBhdGggZm9yIHRoZSBrZXkgb2YgYSBjb21ibyBib3ggdGhhdCBtdXN0IGJlIHNlbGVjdGVkIGluaXRpYWxseSB3aGVuIHRoZSBkaWFsb2cgb3BlbnM6XG5cdCAqID0+IElmIHByb3BlcnR5VmFsdWUgZm9yIGFsbCBzZWxlY3RlZCBjb250ZXh0cyBpcyBkaWZmZXJlbnQsIHRoZW4gPCBLZWVwIEV4aXN0aW5nIFZhbHVlcyA+IGlzIHByZXNlbGVjdGVkLlxuXHQgKiA9PiBJZiBwcm9wZXJ0eVZhbHVlIGZvciBhbGwgc2VsZWN0ZWQgY29udGV4dHMgaXMgdGhlIHNhbWUsIHRoZW4gdGhlIHByb3BlcnR5VmFsdWUgaXMgcHJlc2VsZWN0ZWQuXG5cdCAqID0+IElmIHByb3BlcnR5VmFsdWUgZm9yIGFsbCBzZWxlY3RlZCBjb250ZXh0cyBpcyBlbXB0eSwgdGhlbiA8IExlYXZlIEJsYW5rID4gaXMgcHJlc2VsZWN0ZWQuXG5cdCAqXG5cdCAqXG5cdCAqIEBwYXJhbSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcGFyYW0gc0RhdGFQcm9wZXJ0eVBhdGggRGF0YSBwcm9wZXJ0eSBwYXRoXG5cdCAqIEByZXR1cm5zIFRoZSBrZXkgcGF0aFxuXHQgKi9cblx0Z2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveDogZnVuY3Rpb24gKGFDb250ZXh0czogYW55W10sIHNEYXRhUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHRpZiAoc0RhdGFQcm9wZXJ0eVBhdGggJiYgYUNvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IG9TZWxlY3RlZENvbnRleHQgPSBhQ29udGV4dHMsXG5cdFx0XHRcdGFQcm9wZXJ0eVZhbHVlczogYW55W10gPSBbXTtcblx0XHRcdG9TZWxlY3RlZENvbnRleHQuZm9yRWFjaChmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRjb25zdCBvRGF0YU9iamVjdCA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRjb25zdCBzTXVsdGlMZXZlbFBhdGhDb25kaXRpb24gPVxuXHRcdFx0XHRcdHNEYXRhUHJvcGVydHlQYXRoLmluZGV4T2YoXCIvXCIpID4gLTEgJiYgb0RhdGFPYmplY3QuaGFzT3duUHJvcGVydHkoc0RhdGFQcm9wZXJ0eVBhdGguc3BsaXQoXCIvXCIpWzBdKTtcblx0XHRcdFx0aWYgKG9Db250ZXh0ICYmIChvRGF0YU9iamVjdC5oYXNPd25Qcm9wZXJ0eShzRGF0YVByb3BlcnR5UGF0aCkgfHwgc011bHRpTGV2ZWxQYXRoQ29uZGl0aW9uKSkge1xuXHRcdFx0XHRcdGFQcm9wZXJ0eVZhbHVlcy5wdXNoKG9Db250ZXh0LmdldE9iamVjdChzRGF0YVByb3BlcnR5UGF0aCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGFVbmlxdWVQcm9wZXJ0eVZhbHVlcyA9IGFQcm9wZXJ0eVZhbHVlcy5maWx0ZXIoTWFzc0VkaXRIZWxwZXIuZ2V0VW5pcXVlVmFsdWVzKTtcblx0XHRcdGlmIChhVW5pcXVlUHJvcGVydHlWYWx1ZXMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRyZXR1cm4gYERlZmF1bHQvJHtzRGF0YVByb3BlcnR5UGF0aH1gO1xuXHRcdFx0fSBlbHNlIGlmIChhVW5pcXVlUHJvcGVydHlWYWx1ZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHJldHVybiBgRW1wdHkvJHtzRGF0YVByb3BlcnR5UGF0aH1gO1xuXHRcdFx0fSBlbHNlIGlmIChhVW5pcXVlUHJvcGVydHlWYWx1ZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdHJldHVybiBgJHtzRGF0YVByb3BlcnR5UGF0aH0vJHthVW5pcXVlUHJvcGVydHlWYWx1ZXNbMF19YDtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBoaWRkZW4gYW5ub3RhdGlvbiB2YWx1ZSBbYm90aCBzdGF0aWMgYW5kIHBhdGggYmFzZWRdIGZvciB0YWJsZSdzIHNlbGVjdGVkIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBoaWRkZW5WYWx1ZSBIaWRkZW4gYW5ub3RhdGlvbiB2YWx1ZSAvIHBhdGggZm9yIGZpZWxkXG5cdCAqIEBwYXJhbSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcmV0dXJucyBUaGUgaGlkZGVuIGFubm90YXRpb24gdmFsdWVcblx0ICovXG5cdGdldEhpZGRlblZhbHVlRm9yQ29udGV4dHM6IGZ1bmN0aW9uIChoaWRkZW5WYWx1ZTogYW55LCBhQ29udGV4dHM6IGFueVtdKSB7XG5cdFx0aWYgKGhpZGRlblZhbHVlICYmIGhpZGRlblZhbHVlLiRQYXRoKSB7XG5cdFx0XHRyZXR1cm4gIWFDb250ZXh0cy5zb21lKGZ1bmN0aW9uIChvU2VsZWN0ZWRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGhpZGRlblZhbHVlLiRQYXRoKSA9PT0gZmFsc2U7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIGhpZGRlblZhbHVlO1xuXHR9LFxuXG5cdGdldElucHV0VHlwZTogZnVuY3Rpb24gKHByb3BlcnR5SW5mbzogYW55LCBkYXRhRmllbGRDb252ZXJ0ZWQ6IGFueSwgb0RhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGVkaXRTdHlsZVByb3BlcnRpZXMgPSB7fSBhcyBGaWVsZFByb3BlcnRpZXM7XG5cdFx0bGV0IGlucHV0VHlwZSE6IHN0cmluZztcblx0XHRpZiAocHJvcGVydHlJbmZvKSB7XG5cdFx0XHRzZXRFZGl0U3R5bGVQcm9wZXJ0aWVzKGVkaXRTdHlsZVByb3BlcnRpZXMsIGRhdGFGaWVsZENvbnZlcnRlZCwgb0RhdGFNb2RlbFBhdGgsIHRydWUpO1xuXHRcdFx0aW5wdXRUeXBlID0gZWRpdFN0eWxlUHJvcGVydGllcz8uZWRpdFN0eWxlIHx8IFwiXCI7XG5cdFx0fVxuXHRcdGNvbnN0IGlzVmFsaWRGb3JNYXNzRWRpdCA9XG5cdFx0XHRpbnB1dFR5cGUgJiZcblx0XHRcdFtcIkRhdGVQaWNrZXJcIiwgXCJUaW1lUGlja2VyXCIsIFwiRGF0ZVRpbWVQaWNrZXJcIiwgXCJSYXRpbmdJbmRpY2F0b3JcIl0uaW5kZXhPZihpbnB1dFR5cGUpID09PSAtMSAmJlxuXHRcdFx0IWlzQ29sbGVjdGlvbkZpZWxkKG9EYXRhTW9kZWxQYXRoKSAmJlxuXHRcdFx0IWhhc1ZhbHVlSGVscFdpdGhGaXhlZFZhbHVlcyhwcm9wZXJ0eUluZm8pO1xuXG5cdFx0cmV0dXJuIChpc1ZhbGlkRm9yTWFzc0VkaXQgfHwgXCJcIikgJiYgaW5wdXRUeXBlO1xuXHR9LFxuXG5cdGdldElzRmllbGRHcnA6IGZ1bmN0aW9uIChkYXRhRmllbGRDb252ZXJ0ZWQ6IGFueSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAoXG5cdFx0XHRkYXRhRmllbGRDb252ZXJ0ZWQgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JBbm5vdGF0aW9uXCIgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQudmFsdWUgJiZcblx0XHRcdGRhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQudmFsdWUuaW5kZXhPZihcIkZpZWxkR3JvdXBcIikgPiAtMVxuXHRcdCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0ZXh0IHBhdGggZm9yIHRoZSBtYXNzIGVkaXQgZmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eSBQcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSB0ZXh0QmluZGluZyBUZXh0IEJpbmRpbmcgSW5mb1xuXHQgKiBAcGFyYW0gZGlzcGxheU1vZGUgRGlzcGxheSBtb2RlXG5cdCAqIEByZXR1cm5zIFRleHQgUHJvcGVydHkgUGF0aCBpZiBpdCBleGlzdHNcblx0ICovXG5cdGdldFRleHRQYXRoOiBmdW5jdGlvbiAocHJvcGVydHk6IHN0cmluZywgdGV4dEJpbmRpbmc6IGFueSwgZGlzcGxheU1vZGU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IGRlc2NyaXB0aW9uUGF0aDtcblx0XHRpZiAodGV4dEJpbmRpbmcgJiYgKHRleHRCaW5kaW5nLnBhdGggfHwgKHRleHRCaW5kaW5nLnBhcmFtZXRlcnMgJiYgdGV4dEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGgpKSAmJiBwcm9wZXJ0eSkge1xuXHRcdFx0aWYgKHRleHRCaW5kaW5nLnBhdGggJiYgZGlzcGxheU1vZGUgPT09IFwiRGVzY3JpcHRpb25cIikge1xuXHRcdFx0XHRkZXNjcmlwdGlvblBhdGggPSB0ZXh0QmluZGluZy5wYXRoO1xuXHRcdFx0fSBlbHNlIGlmICh0ZXh0QmluZGluZy5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdHRleHRCaW5kaW5nLnBhcmFtZXRlcnMuZm9yRWFjaChmdW5jdGlvbiAocHJvcHM6IEJpbmRpbmdJbmZvKSB7XG5cdFx0XHRcdFx0aWYgKHByb3BzLnBhdGggJiYgcHJvcHMucGF0aCAhPT0gcHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aCA9IHByb3BzLnBhdGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGRlc2NyaXB0aW9uUGF0aDtcblx0fSxcblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZXMgYSBKU09OIE1vZGVsIGZvciBwcm9wZXJ0aWVzIG9mIGRpYWxvZyBmaWVsZHMgW2xhYmVsLCB2aXNpYmxpdHksIGRhdGFwcm9wZXJ0eSwgZXRjLl0uXG5cdCAqXG5cdCAqIEBwYXJhbSBvVGFibGUgSW5zdGFuY2Ugb2YgVGFibGVcblx0ICogQHBhcmFtIGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSBhRGF0YUFycmF5IEFycmF5IGNvbnRhaW5pbmcgZGF0YSByZWxhdGVkIHRvIHRoZSBkaWFsb2cgdXNlZCBieSBib3RoIHRoZSBzdGF0aWMgYW5kIHRoZSBydW50aW1lIG1vZGVsXG5cdCAqIEByZXR1cm5zIFRoZSBtb2RlbFxuXHQgKi9cblx0cHJlcGFyZURhdGFGb3JEaWFsb2c6IGZ1bmN0aW9uIChvVGFibGU6IFRhYmxlLCBhQ29udGV4dHM6IGFueVtdLCBhRGF0YUFycmF5OiBhbnlbXSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVGFibGUgJiYgKG9UYWJsZS5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIGFueSksXG5cdFx0XHRzQ3VycmVudEVudGl0eVNldE5hbWUgPSBvVGFibGUuZGF0YShcIm1ldGFQYXRoXCIpLFxuXHRcdFx0YVRhYmxlRmllbGRzID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGFibGVGaWVsZHMob1RhYmxlKSxcblx0XHRcdG9FbnRpdHlUeXBlQ29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChgJHtzQ3VycmVudEVudGl0eVNldE5hbWV9L0BgKSxcblx0XHRcdG9FbnRpdHlTZXRDb250ZXh0ID0gb01ldGFNb2RlbC5nZXRDb250ZXh0KHNDdXJyZW50RW50aXR5U2V0TmFtZSksXG5cdFx0XHRvRGF0YU1vZGVsT2JqZWN0UGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvRW50aXR5VHlwZUNvbnRleHQpO1xuXG5cdFx0Y29uc3Qgb0RhdGFGaWVsZE1vZGVsID0gbmV3IEpTT05Nb2RlbCgpO1xuXHRcdGxldCBvUmVzdWx0O1xuXHRcdGxldCBzTGFiZWxUZXh0O1xuXHRcdGxldCBiVmFsdWVIZWxwRW5hYmxlZDtcblx0XHRsZXQgc1VuaXRQcm9wZXJ0eVBhdGg7XG5cdFx0bGV0IGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdDtcblx0XHRsZXQgb1RleHRCaW5kaW5nO1xuXG5cdFx0YVRhYmxlRmllbGRzLmZvckVhY2goZnVuY3Rpb24gKG9Db2x1bW5JbmZvOiBhbnkpIHtcblx0XHRcdGNvbnN0IHNEYXRhUHJvcGVydHlQYXRoID0gb0NvbHVtbkluZm8uZGF0YVByb3BlcnR5O1xuXHRcdFx0aWYgKHNEYXRhUHJvcGVydHlQYXRoKSB7XG5cdFx0XHRcdGxldCBvUHJvcGVydHlJbmZvID0gc0RhdGFQcm9wZXJ0eVBhdGggJiYgb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0N1cnJlbnRFbnRpdHlTZXROYW1lfS8ke3NEYXRhUHJvcGVydHlQYXRofUBgKTtcblx0XHRcdFx0c0xhYmVsVGV4dCA9XG5cdFx0XHRcdFx0b0NvbHVtbkluZm8ubGFiZWwgfHxcblx0XHRcdFx0XHQob1Byb3BlcnR5SW5mbyAmJiBvUHJvcGVydHlJbmZvW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5MYWJlbFwiXSkgfHxcblx0XHRcdFx0XHRvQ29sdW1uSW5mby5kYXRhUHJvcGVydHk7XG5cblx0XHRcdFx0aWYgKG9EYXRhTW9kZWxPYmplY3RQYXRoKSB7XG5cdFx0XHRcdFx0b0RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0ID0gb0RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmZpbHRlcihmdW5jdGlvbiAoXG5cdFx0XHRcdFx0XHRvUHJvcGVydHk6IGFueVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Qcm9wZXJ0eS5uYW1lID09PSBzRGF0YVByb3BlcnR5UGF0aDtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgPSBvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3RbMF0gfHwge307XG5cdFx0XHRcdG9UZXh0QmluZGluZyA9IGdldFRleHRCaW5kaW5nKG9EYXRhTW9kZWxPYmplY3RQYXRoLCB7fSwgdHJ1ZSkgfHwge307XG5cdFx0XHRcdGNvbnN0IG9GaWVsZENvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQob0NvbHVtbkluZm8uYW5ub3RhdGlvblBhdGgpLFxuXHRcdFx0XHRcdG9EYXRhRmllbGRDb252ZXJ0ZWQgPSBjb252ZXJ0TWV0YU1vZGVsQ29udGV4dChvRmllbGRDb250ZXh0KSxcblx0XHRcdFx0XHRvUHJvcGVydHlDb250ZXh0ID0gb01ldGFNb2RlbC5nZXRDb250ZXh0KGAke3NDdXJyZW50RW50aXR5U2V0TmFtZX0vJHtzRGF0YVByb3BlcnR5UGF0aH1AYCksXG5cdFx0XHRcdFx0b0ludGVyZmFjZSA9IG9Qcm9wZXJ0eUNvbnRleHQgJiYgb1Byb3BlcnR5Q29udGV4dC5nZXRJbnRlcmZhY2UoKTtcblxuXHRcdFx0XHRsZXQgb0RhdGFNb2RlbFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob0ZpZWxkQ29udGV4dCwgb0VudGl0eVNldENvbnRleHQpO1xuXHRcdFx0XHRpZiAob0RhdGFGaWVsZENvbnZlcnRlZD8uVmFsdWU/LnBhdGg/Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRvRGF0YU1vZGVsUGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKG9EYXRhTW9kZWxQYXRoLCBzRGF0YVByb3BlcnR5UGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgYkhpZGRlbkZpZWxkID1cblx0XHRcdFx0XHRNYXNzRWRpdEhlbHBlci5nZXRIaWRkZW5WYWx1ZUZvckNvbnRleHRzKFxuXHRcdFx0XHRcdFx0b0ZpZWxkQ29udGV4dCAmJiBvRmllbGRDb250ZXh0LmdldE9iamVjdCgpW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhpZGRlblwiXSxcblx0XHRcdFx0XHRcdGFDb250ZXh0c1xuXHRcdFx0XHRcdCkgfHwgZmFsc2U7XG5cdFx0XHRcdGNvbnN0IGlzSW1hZ2UgPSBvUHJvcGVydHlJbmZvICYmIG9Qcm9wZXJ0eUluZm9bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSXNJbWFnZVVSTFwiXTtcblxuXHRcdFx0XHRvSW50ZXJmYWNlLmNvbnRleHQgPSB7XG5cdFx0XHRcdFx0Z2V0TW9kZWw6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvSW50ZXJmYWNlLmdldE1vZGVsKCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRnZXRQYXRoOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gYCR7c0N1cnJlbnRFbnRpdHlTZXROYW1lfS8ke3NEYXRhUHJvcGVydHlQYXRofWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRvUHJvcGVydHlJbmZvID1cblx0XHRcdFx0XHRvRGF0YUZpZWxkQ29udmVydGVkLl90eXBlID09PSBcIlByb3BlcnR5XCJcblx0XHRcdFx0XHRcdD8gb0RhdGFGaWVsZENvbnZlcnRlZFxuXHRcdFx0XHRcdFx0OiAob0RhdGFGaWVsZENvbnZlcnRlZCAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlZhbHVlICYmIG9EYXRhRmllbGRDb252ZXJ0ZWQuVmFsdWUuJHRhcmdldCkgfHxcblx0XHRcdFx0XHRcdCAgKG9EYXRhRmllbGRDb252ZXJ0ZWQgJiYgb0RhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQgJiYgb0RhdGFGaWVsZENvbnZlcnRlZC5UYXJnZXQuJHRhcmdldCk7XG5cdFx0XHRcdC8vIERhdGFmaWVsZCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIEZpZWxkQ29udHJvbCBjYWxjdWxhdGlvbiwgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWRcblxuXHRcdFx0XHRjb25zdCBjaGFydFByb3BlcnR5ID0gb1Byb3BlcnR5SW5mbyAmJiBvUHJvcGVydHlJbmZvLnRlcm0gJiYgb1Byb3BlcnR5SW5mby50ZXJtID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0XCI7XG5cdFx0XHRcdGNvbnN0IGlzQWN0aW9uID0gISFvRGF0YUZpZWxkQ29udmVydGVkLkFjdGlvbjtcblx0XHRcdFx0Y29uc3QgaXNGaWVsZEdycCA9IE1hc3NFZGl0SGVscGVyLmdldElzRmllbGRHcnAob0RhdGFGaWVsZENvbnZlcnRlZCk7XG5cblx0XHRcdFx0aWYgKGlzSW1hZ2UgfHwgYkhpZGRlbkZpZWxkIHx8IGNoYXJ0UHJvcGVydHkgfHwgaXNBY3Rpb24gfHwgaXNGaWVsZEdycCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFZhbHVlSGVscCBwcm9wZXJ0aWVzXG5cdFx0XHRcdGJWYWx1ZUhlbHBFbmFibGVkID0gaGFzVmFsdWVIZWxwKG9Qcm9wZXJ0eUluZm8pO1xuXHRcdFx0XHRzVW5pdFByb3BlcnR5UGF0aCA9XG5cdFx0XHRcdFx0KChoYXNDdXJyZW5jeShvUHJvcGVydHlJbmZvKSB8fCBoYXNVbml0KG9Qcm9wZXJ0eUluZm8pKSAmJiBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aChvUHJvcGVydHlJbmZvKSkgfHwgXCJcIjtcblx0XHRcdFx0Y29uc3QgdW5pdFByb3BlcnR5SW5mbyA9IHNVbml0UHJvcGVydHlQYXRoICYmIGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkob1Byb3BlcnR5SW5mbyk7XG5cdFx0XHRcdGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCA9IHVuaXRQcm9wZXJ0eUluZm8gJiYgaGFzVmFsdWVIZWxwKHVuaXRQcm9wZXJ0eUluZm8pO1xuXG5cdFx0XHRcdC8vIEVkaXRNb2RlIGFuZCBJbnB1dFR5cGVcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlGb3JGaWVsZENvbnRyb2wgPSBvUHJvcGVydHlJbmZvICYmIG9Qcm9wZXJ0eUluZm8uVmFsdWUgPyBvUHJvcGVydHlJbmZvLlZhbHVlIDogb1Byb3BlcnR5SW5mbztcblx0XHRcdFx0Y29uc3QgZXhwQmluZGluZyA9IGdldEVkaXRNb2RlKHByb3BlcnR5Rm9yRmllbGRDb250cm9sLCBvRGF0YU1vZGVsUGF0aCwgZmFsc2UsIGZhbHNlLCBvRGF0YUZpZWxkQ29udmVydGVkLCBjb25zdGFudCh0cnVlKSk7XG5cdFx0XHRcdGNvbnN0IGVkaXRNb2RlVmFsdWVzID0gT2JqZWN0LmtleXMoRWRpdE1vZGUpO1xuXHRcdFx0XHRjb25zdCBlZGl0TW9kZUlzU3RhdGljID0gISFleHBCaW5kaW5nICYmIGVkaXRNb2RlVmFsdWVzLmluY2x1ZGVzKGV4cEJpbmRpbmcgYXMgRWRpdE1vZGUpO1xuXHRcdFx0XHRjb25zdCBlZGl0YWJsZSA9ICEhZXhwQmluZGluZyAmJiAoKGVkaXRNb2RlSXNTdGF0aWMgJiYgZXhwQmluZGluZyA9PT0gRWRpdE1vZGUuRWRpdGFibGUpIHx8ICFlZGl0TW9kZUlzU3RhdGljKTtcblx0XHRcdFx0Y29uc3QgbmF2UHJvcGVydHlXaXRoVmFsdWVIZWxwID0gc0RhdGFQcm9wZXJ0eVBhdGguaW5jbHVkZXMoXCIvXCIpICYmIGJWYWx1ZUhlbHBFbmFibGVkO1xuXHRcdFx0XHRpZiAoIWVkaXRhYmxlIHx8IG5hdlByb3BlcnR5V2l0aFZhbHVlSGVscCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGlucHV0VHlwZSA9IE1hc3NFZGl0SGVscGVyLmdldElucHV0VHlwZShvUHJvcGVydHlJbmZvLCBvRGF0YUZpZWxkQ29udmVydGVkLCBvRGF0YU1vZGVsUGF0aCk7XG5cblx0XHRcdFx0aWYgKGlucHV0VHlwZSkge1xuXHRcdFx0XHRcdGNvbnN0IGlzUmVhZE9ubHkgPSBpc1JlYWRPbmx5RXhwcmVzc2lvbihvUHJvcGVydHlJbmZvKTtcblx0XHRcdFx0XHRjb25zdCBkaXNwbGF5TW9kZSA9IENvbW1vblV0aWxzLmNvbXB1dGVEaXNwbGF5TW9kZShvUHJvcGVydHlDb250ZXh0LmdldE9iamVjdCgpKTtcblx0XHRcdFx0XHRvUmVzdWx0ID0ge1xuXHRcdFx0XHRcdFx0XCJsYWJlbFwiOiBzTGFiZWxUZXh0LFxuXHRcdFx0XHRcdFx0XCJkYXRhUHJvcGVydHlcIjogc0RhdGFQcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0XHRcImlzVmFsdWVIZWxwRW5hYmxlZFwiOiBiVmFsdWVIZWxwRW5hYmxlZCA/IGJWYWx1ZUhlbHBFbmFibGVkIDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcInVuaXRQcm9wZXJ0eVwiOiBzVW5pdFByb3BlcnR5UGF0aCAmJiAhc0RhdGFQcm9wZXJ0eVBhdGguaW5jbHVkZXMoXCIvXCIpID8gc1VuaXRQcm9wZXJ0eVBhdGggOiBmYWxzZSxcblx0XHRcdFx0XHRcdFwiaXNWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdFwiOlxuXHRcdFx0XHRcdFx0XHRiVmFsdWVIZWxwRW5hYmxlZEZvclVuaXQgJiYgIXNVbml0UHJvcGVydHlQYXRoLmluY2x1ZGVzKFwiL1wiKSA/IGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCA6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJwcm9wZXJ0eVBhdGhGb3JWYWx1ZUhlbHBcIjogYCR7c0N1cnJlbnRFbnRpdHlTZXROYW1lfS8ke3NEYXRhUHJvcGVydHlQYXRofWAsXG5cdFx0XHRcdFx0XHRcInByb3BlcnR5UGF0aEZvclZhbHVlSGVscFVuaXRcIjogc1VuaXRQcm9wZXJ0eVBhdGggJiYgYCR7c0N1cnJlbnRFbnRpdHlTZXROYW1lfS8ke3NVbml0UHJvcGVydHlQYXRofWAsXG5cdFx0XHRcdFx0XHRcImlzRmllbGRSZXF1aXJlZFwiOiBnZXRSZXF1aXJlZEV4cHJlc3Npb24ob1Byb3BlcnR5SW5mbywgb0RhdGFGaWVsZENvbnZlcnRlZCwgdHJ1ZSksXG5cdFx0XHRcdFx0XHRcImRlZmF1bHRTZWxlY3Rpb25QYXRoXCI6IHNEYXRhUHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0XHRcdD8gTWFzc0VkaXRIZWxwZXIuZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveChhQ29udGV4dHMsIHNEYXRhUHJvcGVydHlQYXRoKVxuXHRcdFx0XHRcdFx0XHQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJkZWZhdWx0U2VsZWN0aW9uVW5pdFBhdGhcIjogc1VuaXRQcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdFx0PyBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0U2VsZWN0aW9uUGF0aENvbWJvQm94KGFDb250ZXh0cywgc1VuaXRQcm9wZXJ0eVBhdGgpXG5cdFx0XHRcdFx0XHRcdDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcImVudGl0eVNldFwiOiBzQ3VycmVudEVudGl0eVNldE5hbWUsXG5cdFx0XHRcdFx0XHRcImRpc3BsYXlcIjogZGlzcGxheU1vZGUsXG5cdFx0XHRcdFx0XHRcImRlc2NyaXB0aW9uUGF0aFwiOiBNYXNzRWRpdEhlbHBlci5nZXRUZXh0UGF0aChzRGF0YVByb3BlcnR5UGF0aCwgb1RleHRCaW5kaW5nLCBkaXNwbGF5TW9kZSksXG5cdFx0XHRcdFx0XHRcIm51bGxhYmxlXCI6IG9Qcm9wZXJ0eUluZm8ubnVsbGFibGUgIT09IHVuZGVmaW5lZCA/IG9Qcm9wZXJ0eUluZm8ubnVsbGFibGUgOiB0cnVlLFxuXHRcdFx0XHRcdFx0XCJpc1Byb3BlcnR5UmVhZE9ubHlcIjogaXNSZWFkT25seSAhPT0gdW5kZWZpbmVkID8gaXNSZWFkT25seSA6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XCJpbnB1dFR5cGVcIjogaW5wdXRUeXBlLFxuXHRcdFx0XHRcdFx0XCJlZGl0TW9kZVwiOiBlZGl0YWJsZSA/IGV4cEJpbmRpbmcgOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcInVuaXREYXRhUGF0aFwiOiBzVW5pdFByb3BlcnR5UGF0aCAmJiBcImZpZWxkc0luZm8+L3VuaXREYXRhL1wiLFxuXHRcdFx0XHRcdFx0XCJ2YWx1ZXNQYXRoXCI6IFwiZmllbGRzSW5mbz4vdmFsdWVzL1wiXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRhRGF0YUFycmF5LnB1c2gob1Jlc3VsdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRvRGF0YUZpZWxkTW9kZWwuc2V0RGF0YShhRGF0YUFycmF5KTtcblx0XHRyZXR1cm4gb0RhdGFGaWVsZE1vZGVsO1xuXHR9LFxuXG5cdGdldFRhYmxlRmllbGRzOiBmdW5jdGlvbiAob1RhYmxlOiBhbnkpIHtcblx0XHRjb25zdCBhQ29sdW1ucyA9IChvVGFibGUgJiYgb1RhYmxlLmdldENvbHVtbnMoKSkgfHwgW107XG5cdFx0Y29uc3QgY29sdW1uc0RhdGEgPSBvVGFibGUgJiYgb1RhYmxlLmdldFBhcmVudCgpLmdldFRhYmxlRGVmaW5pdGlvbigpLmNvbHVtbnM7XG5cdFx0cmV0dXJuIGFDb2x1bW5zLm1hcChmdW5jdGlvbiAob0NvbHVtbjogYW55KSB7XG5cdFx0XHRjb25zdCBzRGF0YVByb3BlcnR5ID0gb0NvbHVtbiAmJiBvQ29sdW1uLmdldERhdGFQcm9wZXJ0eSgpLFxuXHRcdFx0XHRhUmVhbHRlZENvbHVtbkluZm8gPVxuXHRcdFx0XHRcdGNvbHVtbnNEYXRhICYmXG5cdFx0XHRcdFx0Y29sdW1uc0RhdGEuZmlsdGVyKGZ1bmN0aW9uIChvQ29sdW1uSW5mbzogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0NvbHVtbkluZm8ubmFtZSA9PT0gc0RhdGFQcm9wZXJ0eSAmJiBvQ29sdW1uSW5mby50eXBlID09PSBcIkFubm90YXRpb25cIjtcblx0XHRcdFx0XHR9KTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFwiZGF0YVByb3BlcnR5XCI6IHNEYXRhUHJvcGVydHksXG5cdFx0XHRcdFwibGFiZWxcIjogb0NvbHVtbi5nZXRIZWFkZXIoKSxcblx0XHRcdFx0XCJhbm5vdGF0aW9uUGF0aFwiOiBhUmVhbHRlZENvbHVtbkluZm8gJiYgYVJlYWx0ZWRDb2x1bW5JbmZvWzBdICYmIGFSZWFsdGVkQ29sdW1uSW5mb1swXS5hbm5vdGF0aW9uUGF0aFxuXHRcdFx0fTtcblx0XHR9KTtcblx0fSxcblxuXHRnZXREZWZhdWx0VGV4dHNGb3JEaWFsb2c6IGZ1bmN0aW9uIChvUmVzb3VyY2VCdW5kbGU6IGFueSwgaVNlbGVjdGVkQ29udGV4dHM6IGFueSwgb1RhYmxlOiBhbnkpIHtcblx0XHQvLyBUaGUgY29uZmlybSBidXR0b24gdGV4dCBpcyBcIlNhdmVcIiBmb3IgdGFibGUgaW4gRGlzcGxheSBtb2RlIGFuZCBcIkFwcGx5XCIgZm9yIHRhYmxlIGluIGVkaXQgbW9kZS4gVGhpcyBjYW4gYmUgbGF0ZXIgZXhwb3NlZCBpZiBuZWVkZWQuXG5cdFx0Y29uc3QgYkRpc3BsYXlNb2RlID0gb1RhYmxlLmRhdGEoXCJkaXNwbGF5TW9kZVByb3BlcnR5QmluZGluZ1wiKSA9PT0gXCJ0cnVlXCI7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0XCJrZWVwRXhpc3RpbmdQcmVmaXhcIjogXCI8IEtlZXBcIixcblx0XHRcdFwibGVhdmVCbGFua1ZhbHVlXCI6IFwiPCBMZWF2ZSBCbGFuayA+XCIsXG5cdFx0XHRcImNsZWFyRmllbGRWYWx1ZVwiOiBcIjwgQ2xlYXIgVmFsdWVzID5cIixcblx0XHRcdFwibWFzc0VkaXRUaXRsZVwiOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX0RJQUxPR19USVRMRVwiLCBpU2VsZWN0ZWRDb250ZXh0cy50b1N0cmluZygpKSxcblx0XHRcdFwiYXBwbHlCdXR0b25UZXh0XCI6IGJEaXNwbGF5TW9kZVxuXHRcdFx0XHQ/IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfU0FWRV9CVVRUT05fVEVYVFwiKVxuXHRcdFx0XHQ6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfQVBQTFlfQlVUVE9OX1RFWFRcIiksXG5cdFx0XHRcInVzZVZhbHVlSGVscFZhbHVlXCI6IFwiPCBVc2UgVmFsdWUgSGVscCA+XCIsXG5cdFx0XHRcImNhbmNlbEJ1dHRvblRleHRcIjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9DQU5DRUxcIiksXG5cdFx0XHRcIm5vRmllbGRzXCI6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfTk9fRURJVEFCTEVfRklFTERTXCIpLFxuXHRcdFx0XCJva0J1dHRvblRleHRcIjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfT0tcIilcblx0XHR9O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgc3VmZml4IHRvIHRoZSAna2VlcCBleGlzdGluZycgcHJvcGVydHkgb2YgdGhlIGNvbWJvQm94LlxuXHQgKlxuXHQgKiBAcGFyYW0gc0lucHV0VHlwZSBJbnB1dFR5cGUgb2YgdGhlIGZpZWxkXG5cdCAqIEByZXR1cm5zIFRoZSBtb2RpZmllZCBzdHJpbmdcblx0ICovXG5cdC8vIGdldFN1ZmZpeEZvcktlZXBFeGlzaXRpbmc6IGZ1bmN0aW9uIChzSW5wdXRUeXBlOiBzdHJpbmcpIHtcblx0Ly8gXHRsZXQgc1Jlc3VsdCA9IFwiVmFsdWVzXCI7XG5cblx0Ly8gXHRzd2l0Y2ggKHNJbnB1dFR5cGUpIHtcblx0Ly8gXHRcdC8vVE9ETyAtIEFkZCBmb3Igb3RoZXIgY29udHJvbCB0eXBlcyBhcyB3ZWxsIChSYWRpbyBCdXR0b24sIEVtYWlsLCBJbnB1dCwgTURDIEZpZWxkcywgSW1hZ2UgZXRjLilcblx0Ly8gXHRcdGNhc2UgXCJEYXRlUGlja2VyXCI6XG5cdC8vIFx0XHRcdHNSZXN1bHQgPSBcIkRhdGVzXCI7XG5cdC8vIFx0XHRcdGJyZWFrO1xuXHQvLyBcdFx0Y2FzZSBcIkNoZWNrQm94XCI6XG5cdC8vIFx0XHRcdHNSZXN1bHQgPSBcIlNldHRpbmdzXCI7XG5cdC8vIFx0XHRcdGJyZWFrO1xuXHQvLyBcdFx0ZGVmYXVsdDpcblx0Ly8gXHRcdFx0c1Jlc3VsdCA9IFwiVmFsdWVzXCI7XG5cdC8vIFx0fVxuXHQvLyBcdHJldHVybiBzUmVzdWx0O1xuXHQvLyB9LFxuXG5cdC8qKlxuXHQgKiBBZGRzIGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBtb2RlbCBbS2VlcCBFeGlzdGluZyBWYWx1ZXMsIExlYXZlIEJsYW5rXS5cblx0ICpcblx0ICogQHBhcmFtIGFWYWx1ZXMgQXJyYXkgaW5zdGFuY2Ugd2hlcmUgdGhlIGRlZmF1bHQgZGF0YSBuZWVkcyB0byBiZSBhZGRlZFxuXHQgKiBAcGFyYW0gb0RlZmF1bHRWYWx1ZXMgRGVmYXVsdCB2YWx1ZXMgZnJvbSBBcHBsaWNhdGlvbiBNYW5pZmVzdFxuXHQgKiBAcGFyYW0gb1Byb3BlcnR5SW5mbyBQcm9wZXJ0eSBpbmZvcm1hdGlvblxuXHQgKiBAcGFyYW0gYlVPTUZpZWxkXG5cdCAqL1xuXHRzZXREZWZhdWx0VmFsdWVzVG9EaWFsb2c6IGZ1bmN0aW9uIChhVmFsdWVzOiBhbnksIG9EZWZhdWx0VmFsdWVzOiBhbnksIG9Qcm9wZXJ0eUluZm86IGFueSwgYlVPTUZpZWxkPzogYm9vbGVhbikge1xuXHRcdGNvbnN0IHNQcm9wZXJ0eVBhdGggPSBiVU9NRmllbGQgPyBvUHJvcGVydHlJbmZvLnVuaXRQcm9wZXJ0eSA6IG9Qcm9wZXJ0eUluZm8uZGF0YVByb3BlcnR5LFxuXHRcdFx0c0lucHV0VHlwZSA9IG9Qcm9wZXJ0eUluZm8uaW5wdXRUeXBlLFxuXHRcdFx0YlByb3BlcnR5UmVxdWlyZWQgPSBvUHJvcGVydHlJbmZvLmlzRmllbGRSZXF1aXJlZDtcblx0XHQvLyBjb25zdCBzU3VmZml4Rm9yS2VlcEV4aXN0aW5nID0gTWFzc0VkaXRIZWxwZXIuZ2V0U3VmZml4Rm9yS2VlcEV4aXNpdGluZyhzSW5wdXRUeXBlKTtcblx0XHRjb25zdCBzU3VmZml4Rm9yS2VlcEV4aXN0aW5nID0gXCJWYWx1ZXNcIjtcblx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zID0gYVZhbHVlcy5kZWZhdWx0T3B0aW9ucyB8fCBbXTtcblx0XHRjb25zdCBzZWxlY3RPcHRpb25zRXhpc3QgPSBhVmFsdWVzLnNlbGVjdE9wdGlvbnMgJiYgYVZhbHVlcy5zZWxlY3RPcHRpb25zLmxlbmd0aCA+IDA7XG5cdFx0Y29uc3Qga2VlcEVudHJ5ID0ge1xuXHRcdFx0dGV4dDogYCR7b0RlZmF1bHRWYWx1ZXMua2VlcEV4aXN0aW5nUHJlZml4fSAke3NTdWZmaXhGb3JLZWVwRXhpc3Rpbmd9ID5gLFxuXHRcdFx0a2V5OiBgRGVmYXVsdC8ke3NQcm9wZXJ0eVBhdGh9YFxuXHRcdH07XG5cblx0XHRpZiAoc0lucHV0VHlwZSA9PT0gXCJDaGVja0JveFwiKSB7XG5cdFx0XHRjb25zdCBmYWxzZUVudHJ5ID0geyB0ZXh0OiBcIk5vXCIsIGtleTogYCR7c1Byb3BlcnR5UGF0aH0vZmFsc2VgLCB0ZXh0SW5mbzogeyB2YWx1ZTogZmFsc2UgfSB9O1xuXHRcdFx0Y29uc3QgdHJ1dGh5RW50cnkgPSB7IHRleHQ6IFwiWWVzXCIsIGtleTogYCR7c1Byb3BlcnR5UGF0aH0vdHJ1ZWAsIHRleHRJbmZvOiB7IHZhbHVlOiB0cnVlIH0gfTtcblx0XHRcdGFWYWx1ZXMudW5zaGlmdChmYWxzZUVudHJ5KTtcblx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdChmYWxzZUVudHJ5KTtcblx0XHRcdGFWYWx1ZXMudW5zaGlmdCh0cnV0aHlFbnRyeSk7XG5cdFx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zLnVuc2hpZnQodHJ1dGh5RW50cnkpO1xuXHRcdFx0YVZhbHVlcy51bnNoaWZ0KGtlZXBFbnRyeSk7XG5cdFx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zLnVuc2hpZnQoa2VlcEVudHJ5KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKG9Qcm9wZXJ0eUluZm8uaXNWYWx1ZUhlbHBFbmFibGVkIHx8IChvUHJvcGVydHlJbmZvLmlzVmFsdWVIZWxwRW5hYmxlZEZvclVuaXQgJiYgYlVPTUZpZWxkKSkge1xuXHRcdFx0XHRjb25zdCB2aGRFbnRyeSA9IHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMudXNlVmFsdWVIZWxwVmFsdWUsIGtleTogYFVzZVZhbHVlSGVscFZhbHVlLyR7c1Byb3BlcnR5UGF0aH1gIH07XG5cdFx0XHRcdGFWYWx1ZXMudW5zaGlmdCh2aGRFbnRyeSk7XG5cdFx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdCh2aGRFbnRyeSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc2VsZWN0T3B0aW9uc0V4aXN0KSB7XG5cdFx0XHRcdGlmIChiUHJvcGVydHlSZXF1aXJlZCAhPT0gXCJ0cnVlXCIgJiYgIWJVT01GaWVsZCkge1xuXHRcdFx0XHRcdGNvbnN0IGNsZWFyRW50cnkgPSB7IHRleHQ6IG9EZWZhdWx0VmFsdWVzLmNsZWFyRmllbGRWYWx1ZSwga2V5OiBgQ2xlYXJGaWVsZFZhbHVlLyR7c1Byb3BlcnR5UGF0aH1gIH07XG5cdFx0XHRcdFx0YVZhbHVlcy51bnNoaWZ0KGNsZWFyRW50cnkpO1xuXHRcdFx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdChjbGVhckVudHJ5KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhVmFsdWVzLnVuc2hpZnQoa2VlcEVudHJ5KTtcblx0XHRcdFx0YVZhbHVlcy5kZWZhdWx0T3B0aW9ucy51bnNoaWZ0KGtlZXBFbnRyeSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBlbXB0eUVudHJ5ID0geyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy5sZWF2ZUJsYW5rVmFsdWUsIGtleTogYERlZmF1bHQvJHtzUHJvcGVydHlQYXRofWAgfTtcblx0XHRcdFx0YVZhbHVlcy51bnNoaWZ0KGVtcHR5RW50cnkpO1xuXHRcdFx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zLnVuc2hpZnQoZW1wdHlFbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgdGV4dCBhcnJhbmdlbWVudCBpbmZvIGZvciBhIGNvbnRleHQgcHJvcGVydHkuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eSBQcm9wZXJ0eSBQYXRoXG5cdCAqIEBwYXJhbSBkZXNjcmlwdGlvblBhdGggUGF0aCB0byB0ZXh0IGFzc29jaWF0aW9uIG9mIHRoZSBwcm9wZXJ0eVxuXHQgKiBAcGFyYW0gZGlzcGxheU1vZGUgRGlzcGxheSBtb2RlIG9mIHRoZSBwcm9wZXJ0eSBhbmQgdGV4dCBhc3NvY2lhdGlvblxuXHQgKiBAcGFyYW0gc2VsZWN0ZWRDb250ZXh0IENvbnRleHQgdG8gZmluZCB0aGUgZnVsbCB0ZXh0XG5cdCAqIEByZXR1cm5zIFRoZSB0ZXh0IGFycmFuZ2VtZW50XG5cdCAqL1xuXHRnZXRUZXh0QXJyYW5nZW1lbnRJbmZvOiBmdW5jdGlvbiAoXG5cdFx0cHJvcGVydHk6IHN0cmluZyxcblx0XHRkZXNjcmlwdGlvblBhdGg6IHN0cmluZyxcblx0XHRkaXNwbGF5TW9kZTogc3RyaW5nLFxuXHRcdHNlbGVjdGVkQ29udGV4dDogQ29udGV4dFxuXHQpOiBUZXh0QXJyYW5nZW1lbnRJbmZvIHtcblx0XHRsZXQgdmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5KSxcblx0XHRcdGRlc2NyaXB0aW9uVmFsdWUsXG5cdFx0XHRmdWxsVGV4dDtcblx0XHRpZiAoZGVzY3JpcHRpb25QYXRoICYmIHByb3BlcnR5KSB7XG5cdFx0XHRzd2l0Y2ggKGRpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uVmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGRlc2NyaXB0aW9uUGF0aCkgfHwgXCJcIjtcblx0XHRcdFx0XHRmdWxsVGV4dCA9IGRlc2NyaXB0aW9uVmFsdWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJWYWx1ZVwiOlxuXHRcdFx0XHRcdHZhbHVlID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChwcm9wZXJ0eSkgfHwgXCJcIjtcblx0XHRcdFx0XHRmdWxsVGV4dCA9IHZhbHVlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiVmFsdWVEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRcdHZhbHVlID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChwcm9wZXJ0eSkgfHwgXCJcIjtcblx0XHRcdFx0XHRkZXNjcmlwdGlvblZhbHVlID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChkZXNjcmlwdGlvblBhdGgpIHx8IFwiXCI7XG5cdFx0XHRcdFx0ZnVsbFRleHQgPSBkZXNjcmlwdGlvblZhbHVlID8gYCR7dmFsdWV9ICgke2Rlc2NyaXB0aW9uVmFsdWV9KWAgOiB2YWx1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIkRlc2NyaXB0aW9uVmFsdWVcIjpcblx0XHRcdFx0XHR2YWx1ZSA9IHNlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QocHJvcGVydHkpIHx8IFwiXCI7XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25WYWx1ZSA9IHNlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QoZGVzY3JpcHRpb25QYXRoKSB8fCBcIlwiO1xuXHRcdFx0XHRcdGZ1bGxUZXh0ID0gZGVzY3JpcHRpb25WYWx1ZSA/IGAke2Rlc2NyaXB0aW9uVmFsdWV9ICgke3ZhbHVlfSlgIDogdmFsdWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0TG9nLmluZm8oYERpc3BsYXkgUHJvcGVydHkgbm90IGFwcGxpY2FibGU6ICR7cHJvcGVydHl9YCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdFwidGV4dEFycmFuZ2VtZW50XCI6IGRpc3BsYXlNb2RlLFxuXHRcdFx0XCJ2YWx1ZVBhdGhcIjogcHJvcGVydHksXG5cdFx0XHRcImRlc2NyaXB0aW9uUGF0aFwiOiBkZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcInZhbHVlXCI6IHZhbHVlLFxuXHRcdFx0XCJkZXNjcmlwdGlvblwiOiBkZXNjcmlwdGlvblZhbHVlLFxuXHRcdFx0XCJmdWxsVGV4dFwiOiBmdWxsVGV4dFxuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybiB0aGUgdmlzaWJpbGl0eSB2YWx1dWUgZm9yIHRoZSBNYW5hZ2VkT2JqZWN0IEFueS5cblx0ICpcblx0ICogQHBhcmFtIGFueSBUaGUgTWFuYWdlZE9iamVjdCBBbnkgdG8gYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHZpc2libGUgdmFsdWUgb2YgdGhlIGJpbmRpbmcuXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFzcyBlZGl0IGZpZWxkIGlzIGVkaXRhYmxlLlxuXHQgKi9cblx0aXNFZGl0YWJsZTogZnVuY3Rpb24gKGFueTogQW55VHlwZSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGJpbmRpbmcgPSBhbnkuZ2V0QmluZGluZyhcImFueVwiKTtcblx0XHRjb25zdCB2YWx1ZSA9IChiaW5kaW5nIGFzIGFueSkuZ2V0RXh0ZXJuYWxWYWx1ZSgpO1xuXHRcdHJldHVybiB2YWx1ZSA9PT0gRWRpdE1vZGUuRWRpdGFibGU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGN1bGF0ZSBhbmQgdXBkYXRlIHRoZSB2aXNpYmlsaXR5IG9mIG1hc3MgZWRpdCBmaWVsZCBvbiBjaGFuZ2Ugb2YgdGhlIE1hbmFnZWRPYmplY3QgQW55IGJpbmRpbmcuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRGlhbG9nRGF0YU1vZGVsIE1vZGVsIHRvIGJlIHVzZWQgcnVudGltZS5cblx0ICogQHBhcmFtIGRhdGFQcm9wZXJ0eSBGaWVsZCBuYW1lLlxuXHQgKi9cblx0b25Db250ZXh0RWRpdGFibGVDaGFuZ2U6IGZ1bmN0aW9uIChvRGlhbG9nRGF0YU1vZGVsOiBKU09OTW9kZWwsIGRhdGFQcm9wZXJ0eTogc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc3Qgb2JqZWN0c0ZvclZpc2liaWxpdHkgPSBvRGlhbG9nRGF0YU1vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7ZGF0YVByb3BlcnR5fS9vYmplY3RzRm9yVmlzaWJpbGl0eWApIHx8IFtdO1xuXHRcdGNvbnN0IGVkaXRhYmxlID0gb2JqZWN0c0ZvclZpc2liaWxpdHkuc29tZShNYXNzRWRpdEhlbHBlci5pc0VkaXRhYmxlKTtcblxuXHRcdGlmIChlZGl0YWJsZSkge1xuXHRcdFx0b0RpYWxvZ0RhdGFNb2RlbC5zZXRQcm9wZXJ0eShgL3ZhbHVlcy8ke2RhdGFQcm9wZXJ0eX0vdmlzaWJsZWAsIGVkaXRhYmxlKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZSBNYW5hZ2VkIE9iamVjdCBBbnkgZm9yIHZpc2liaWxpdHkgb2YgdGhlIG1hc3MgZWRpdCBmaWVsZHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBtT1RvVXNlIFRoZSBNYW5hZ2VkT2JqZWN0IEFueSB0byBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgdmlzaWJsZSB2YWx1ZSBvZiB0aGUgYmluZGluZy5cblx0ICogQHBhcmFtIG9EaWFsb2dEYXRhTW9kZWwgTW9kZWwgdG8gYmUgdXNlZCBydW50aW1lLlxuXHQgKiBAcGFyYW0gZGF0YVByb3BlcnR5IEZpZWxkIG5hbWUuXG5cdCAqIEBwYXJhbSB2YWx1ZXMgVmFsdWVzIG9mIHRoZSBmaWVsZC5cblx0ICovXG5cdHVwZGF0ZU9uQ29udGV4dENoYW5nZTogZnVuY3Rpb24gKG1PVG9Vc2U6IEFueVR5cGUsIG9EaWFsb2dEYXRhTW9kZWw6IEpTT05Nb2RlbCwgZGF0YVByb3BlcnR5OiBzdHJpbmcsIHZhbHVlczogYW55KSB7XG5cdFx0Y29uc3QgYmluZGluZyA9IG1PVG9Vc2UuZ2V0QmluZGluZyhcImFueVwiKTtcblxuXHRcdHZhbHVlcy5vYmplY3RzRm9yVmlzaWJpbGl0eSA9IHZhbHVlcy5vYmplY3RzRm9yVmlzaWJpbGl0eSB8fCBbXTtcblx0XHR2YWx1ZXMub2JqZWN0c0ZvclZpc2liaWxpdHkucHVzaChtT1RvVXNlKTtcblxuXHRcdGJpbmRpbmcuYXR0YWNoQ2hhbmdlKE1hc3NFZGl0SGVscGVyLm9uQ29udGV4dEVkaXRhYmxlQ2hhbmdlLmJpbmQobnVsbCwgb0RpYWxvZ0RhdGFNb2RlbCwgZGF0YVByb3BlcnR5KSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCBib3VuZCBvYmplY3QgdG8gY2FsY3VsYXRlIHRoZSB2aXNpYmlsaXR5IG9mIGNvbnRleHRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gZXhwQmluZGluZyBCaW5kaW5nIFN0cmluZyBvYmplY3QuXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdGhlIGJpbmRpbmcgdmFsdWUuXG5cdCAqIEByZXR1cm5zIFRoZSBNYW5hZ2VkT2JqZWN0IEFueSB0byBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgdmlzaWJsZSB2YWx1ZSBvZiB0aGUgYmluZGluZy5cblx0ICovXG5cdGdldEJvdW5kT2JqZWN0OiBmdW5jdGlvbiAoZXhwQmluZGluZzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sIGNvbnRleHQ6IENvbnRleHQpOiBBbnlUeXBlIHtcblx0XHRjb25zdCBtT1RvVXNlID0gbmV3IEFueSh7IGFueTogZXhwQmluZGluZyB9KTtcblx0XHRjb25zdCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRtT1RvVXNlLnNldE1vZGVsKG1vZGVsKTtcblx0XHRtT1RvVXNlLnNldEJpbmRpbmdDb250ZXh0KGNvbnRleHQpO1xuXG5cdFx0cmV0dXJuIG1PVG9Vc2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSBleHBCaW5kaW5nIEJpbmRpbmcgU3RyaW5nIG9iamVjdC5cblx0ICogQHBhcmFtIG9EaWFsb2dEYXRhTW9kZWwgTW9kZWwgdG8gYmUgdXNlZCBydW50aW1lLlxuXHQgKiBAcGFyYW0gZGF0YVByb3BlcnR5IEZpZWxkIG5hbWUuXG5cdCAqIEBwYXJhbSB2YWx1ZXMgVmFsdWVzIG9mIHRoZSBmaWVsZC5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGUgYmluZGluZyB2YWx1ZS5cblx0ICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSBtYXNzIGVkaXQgZmllbGQgaXMgZWRpdGFibGUuXG5cdCAqL1xuXHRnZXRGaWVsZFZpc2libGl0eTogZnVuY3Rpb24gKFxuXHRcdGV4cEJpbmRpbmc6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLFxuXHRcdG9EaWFsb2dEYXRhTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRkYXRhUHJvcGVydHk6IHN0cmluZyxcblx0XHR2YWx1ZXM6IGFueSxcblx0XHRjb250ZXh0OiBDb250ZXh0XG5cdCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG1PVG9Vc2UgPSBNYXNzRWRpdEhlbHBlci5nZXRCb3VuZE9iamVjdChleHBCaW5kaW5nLCBjb250ZXh0KTtcblx0XHRjb25zdCBpc0NvbnRleHRFZGl0YWJsZSA9IE1hc3NFZGl0SGVscGVyLmlzRWRpdGFibGUobU9Ub1VzZSk7XG5cblx0XHRpZiAoIWlzQ29udGV4dEVkaXRhYmxlKSB7XG5cdFx0XHRNYXNzRWRpdEhlbHBlci51cGRhdGVPbkNvbnRleHRDaGFuZ2UobU9Ub1VzZSwgb0RpYWxvZ0RhdGFNb2RlbCwgZGF0YVByb3BlcnR5LCB2YWx1ZXMpO1xuXHRcdH1cblx0XHRyZXR1cm4gaXNDb250ZXh0RWRpdGFibGU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEluaXRpYWxpemVzIGEgcnVudGltZSBtb2RlbDpcblx0ICogPT4gVGhlIG1vZGVsIGNvbnNpc3RzIG9mIHZhbHVlcyBzaG93biBpbiB0aGUgY29tYm9Cb3ggb2YgdGhlIGRpYWxvZyAoTGVhdmUgQmxhbmssIEtlZXAgRXhpc3RpbmcgVmFsdWVzLCBvciBhbnkgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBzZWxlY3RlZCBjb250ZXh0LCBldGMuKVxuXHQgKiA9PiBUaGUgbW9kZWwgd2lsbCBjYXB0dXJlIHJ1bnRpbWUgY2hhbmdlcyBpbiB0aGUgcmVzdWx0cyBwcm9wZXJ0eSAodGhlIHZhbHVlIGVudGVyZWQgaW4gdGhlIGNvbWJvQm94KS5cblx0ICpcblx0ICogQHBhcmFtIGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSBhRGF0YUFycmF5IEFycmF5IGNvbnRhaW5pbmcgZGF0YSByZWxhdGVkIHRvIHRoZSBkaWFsb2cgdXNlZCBieSBib3RoIHRoZSBzdGF0aWMgYW5kIHRoZSBydW50aW1lIG1vZGVsXG5cdCAqIEBwYXJhbSBvRGVmYXVsdFZhbHVlcyBEZWZhdWx0IHZhbHVlcyBmcm9tIGkxOG5cblx0ICogQHBhcmFtIGRpYWxvZ0NvbnRleHQgVHJhbnNpZW50IGNvbnRleHQgZm9yIG1hc3MgZWRpdCBkaWFsb2cuXG5cdCAqIEByZXR1cm5zIFRoZSBydW50aW1lIG1vZGVsXG5cdCAqL1xuXHRzZXRSdW50aW1lTW9kZWxPbkRpYWxvZzogZnVuY3Rpb24gKGFDb250ZXh0czogYW55W10sIGFEYXRhQXJyYXk6IGFueVtdLCBvRGVmYXVsdFZhbHVlczogYW55LCBkaWFsb2dDb250ZXh0OiBDb250ZXh0KSB7XG5cdFx0Y29uc3QgYVZhbHVlczogYW55W10gPSBbXTtcblx0XHRjb25zdCBhVW5pdERhdGE6IGFueVtdID0gW107XG5cdFx0Y29uc3QgYVJlc3VsdHM6IGFueVtdID0gW107XG5cdFx0Y29uc3QgYVJlYWRPbmx5RmllbGRJbmZvOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IG9EYXRhID0ge1xuXHRcdFx0XCJ2YWx1ZXNcIjogYVZhbHVlcyxcblx0XHRcdFwidW5pdERhdGFcIjogYVVuaXREYXRhLFxuXHRcdFx0XCJyZXN1bHRzXCI6IGFSZXN1bHRzLFxuXHRcdFx0XCJyZWFkYWJsZVByb3BlcnR5RGF0YVwiOiBhUmVhZE9ubHlGaWVsZEluZm8sXG5cdFx0XHRcInNlbGVjdGVkS2V5XCI6IHVuZGVmaW5lZCxcblx0XHRcdFwibm9GaWVsZHNcIjogb0RlZmF1bHRWYWx1ZXMubm9GaWVsZHNcblx0XHR9O1xuXHRcdGNvbnN0IG9EaWFsb2dEYXRhTW9kZWwgPSBuZXcgSlNPTk1vZGVsKG9EYXRhKTtcblx0XHRhRGF0YUFycmF5LmZvckVhY2goZnVuY3Rpb24gKG9JbkRhdGE6IGFueSkge1xuXHRcdFx0bGV0IG9UZXh0SW5mbztcblx0XHRcdGxldCBzUHJvcGVydHlLZXk7XG5cdFx0XHRsZXQgc1VuaXRQcm9wZXJ0eU5hbWU7XG5cdFx0XHRjb25zdCBvRGlzdGluY3RWYWx1ZU1hcDogYW55ID0ge307XG5cdFx0XHRjb25zdCBvRGlzdGluY3RVbml0TWFwOiBhbnkgPSB7fTtcblx0XHRcdGlmIChvSW5EYXRhLmRhdGFQcm9wZXJ0eSAmJiBvSW5EYXRhLmRhdGFQcm9wZXJ0eS5pbmRleE9mKFwiL1wiKSA+IC0xKSB7XG5cdFx0XHRcdGNvbnN0IGFGaW5hbFBhdGggPSBNYXNzRWRpdEhlbHBlci5pbml0TGFzdExldmVsT2ZQcm9wZXJ0eVBhdGgob0luRGF0YS5kYXRhUHJvcGVydHksIGFWYWx1ZXMgLyosIGRpYWxvZ0NvbnRleHQgKi8pO1xuXHRcdFx0XHRjb25zdCBhUHJvcGVydHlQYXRocyA9IG9JbkRhdGEuZGF0YVByb3BlcnR5LnNwbGl0KFwiL1wiKTtcblxuXHRcdFx0XHRmb3IgKGNvbnN0IGNvbnRleHQgb2YgYUNvbnRleHRzKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc011bHRpTGV2ZWxQYXRoVmFsdWUgPSBjb250ZXh0LmdldE9iamVjdChvSW5EYXRhLmRhdGFQcm9wZXJ0eSk7XG5cdFx0XHRcdFx0c1Byb3BlcnR5S2V5ID0gYCR7b0luRGF0YS5kYXRhUHJvcGVydHl9LyR7c011bHRpTGV2ZWxQYXRoVmFsdWV9YDtcblx0XHRcdFx0XHRpZiAoIW9EaXN0aW5jdFZhbHVlTWFwW3NQcm9wZXJ0eUtleV0gJiYgYUZpbmFsUGF0aFthUHJvcGVydHlQYXRoc1thUHJvcGVydHlQYXRocy5sZW5ndGggLSAxXV0pIHtcblx0XHRcdFx0XHRcdG9UZXh0SW5mbyA9IE1hc3NFZGl0SGVscGVyLmdldFRleHRBcnJhbmdlbWVudEluZm8oXG5cdFx0XHRcdFx0XHRcdG9JbkRhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRvSW5EYXRhLmRlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFx0XHRcdFx0b0luRGF0YS5kaXNwbGF5LFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0YUZpbmFsUGF0aFthUHJvcGVydHlQYXRoc1thUHJvcGVydHlQYXRocy5sZW5ndGggLSAxXV0ucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFwidGV4dFwiOiAob1RleHRJbmZvICYmIG9UZXh0SW5mby5mdWxsVGV4dCkgfHwgc011bHRpTGV2ZWxQYXRoVmFsdWUsXG5cdFx0XHRcdFx0XHRcdFwia2V5XCI6IHNQcm9wZXJ0eUtleSxcblx0XHRcdFx0XHRcdFx0XCJ0ZXh0SW5mb1wiOiBvVGV4dEluZm9cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0b0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSA9IHNNdWx0aUxldmVsUGF0aFZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBpZiAoT2JqZWN0LmtleXMob0Rpc3RpbmN0VmFsdWVNYXApLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHQvLyBcdGRpYWxvZ0NvbnRleHQuc2V0UHJvcGVydHkob0RhdGEuZGF0YVByb3BlcnR5LCBzUHJvcGVydHlLZXkgJiYgb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSk7XG5cdFx0XHRcdC8vIH1cblxuXHRcdFx0XHRhRmluYWxQYXRoW2FQcm9wZXJ0eVBhdGhzW2FQcm9wZXJ0eVBhdGhzLmxlbmd0aCAtIDFdXS50ZXh0SW5mbyA9IHtcblx0XHRcdFx0XHRkZXNjcmlwdGlvblBhdGg6IG9JbkRhdGEuZGVzY3JpcHRpb25QYXRoLFxuXHRcdFx0XHRcdHZhbHVlUGF0aDogb0luRGF0YS5kYXRhUHJvcGVydHksXG5cdFx0XHRcdFx0ZGlzcGxheU1vZGU6IG9JbkRhdGEuZGlzcGxheVxuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0gPSBhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XSB8fCBbXTtcblx0XHRcdFx0YVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdID0gYVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdIHx8IFtdO1xuXHRcdFx0XHRpZiAob0luRGF0YS51bml0UHJvcGVydHkpIHtcblx0XHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldID0gYVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XSB8fCBbXTtcblx0XHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldW1wic2VsZWN0T3B0aW9uc1wiXSA9IGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdIHx8IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAoY29uc3QgY29udGV4dCBvZiBhQ29udGV4dHMpIHtcblx0XHRcdFx0XHRjb25zdCBvRGF0YU9iamVjdCA9IGNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0c1Byb3BlcnR5S2V5ID0gYCR7b0luRGF0YS5kYXRhUHJvcGVydHl9LyR7b0RhdGFPYmplY3Rbb0luRGF0YS5kYXRhUHJvcGVydHldfWA7XG5cdFx0XHRcdFx0aWYgKG9JbkRhdGEuZGF0YVByb3BlcnR5ICYmIG9EYXRhT2JqZWN0W29JbkRhdGEuZGF0YVByb3BlcnR5XSAmJiAhb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSkge1xuXHRcdFx0XHRcdFx0aWYgKG9JbkRhdGEuaW5wdXRUeXBlICE9IFwiQ2hlY2tCb3hcIikge1xuXHRcdFx0XHRcdFx0XHRvVGV4dEluZm8gPSBNYXNzRWRpdEhlbHBlci5nZXRUZXh0QXJyYW5nZW1lbnRJbmZvKFxuXHRcdFx0XHRcdFx0XHRcdG9JbkRhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRcdG9JbkRhdGEuZGVzY3JpcHRpb25QYXRoLFxuXHRcdFx0XHRcdFx0XHRcdG9JbkRhdGEuZGlzcGxheSxcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGVudHJ5ID0ge1xuXHRcdFx0XHRcdFx0XHRcdFwidGV4dFwiOiAob1RleHRJbmZvICYmIG9UZXh0SW5mby5mdWxsVGV4dCkgfHwgb0RhdGFPYmplY3Rbb0luRGF0YS5kYXRhUHJvcGVydHldLFxuXHRcdFx0XHRcdFx0XHRcdFwia2V5XCI6IHNQcm9wZXJ0eUtleSxcblx0XHRcdFx0XHRcdFx0XHRcInRleHRJbmZvXCI6IG9UZXh0SW5mb1xuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XS5wdXNoKGVudHJ5KTtcblx0XHRcdFx0XHRcdFx0YVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdLnB1c2goZW50cnkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSA9IG9EYXRhT2JqZWN0W29JbkRhdGEuZGF0YVByb3BlcnR5XTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG9JbkRhdGEudW5pdFByb3BlcnR5ICYmIG9EYXRhT2JqZWN0W29JbkRhdGEudW5pdFByb3BlcnR5XSkge1xuXHRcdFx0XHRcdFx0c1VuaXRQcm9wZXJ0eU5hbWUgPSBgJHtvSW5EYXRhLnVuaXRQcm9wZXJ0eX0vJHtvRGF0YU9iamVjdFtvSW5EYXRhLnVuaXRQcm9wZXJ0eV19YDtcblx0XHRcdFx0XHRcdGlmICghb0Rpc3RpbmN0VW5pdE1hcFtzVW5pdFByb3BlcnR5TmFtZV0pIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9JbkRhdGEuaW5wdXRUeXBlICE9IFwiQ2hlY2tCb3hcIikge1xuXHRcdFx0XHRcdFx0XHRcdG9UZXh0SW5mbyA9IE1hc3NFZGl0SGVscGVyLmdldFRleHRBcnJhbmdlbWVudEluZm8oXG5cdFx0XHRcdFx0XHRcdFx0XHRvSW5EYXRhLnVuaXRQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0XHRcdG9JbkRhdGEuZGVzY3JpcHRpb25QYXRoLFxuXHRcdFx0XHRcdFx0XHRcdFx0b0luRGF0YS5kaXNwbGF5LFxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgdW5pdEVudHJ5ID0ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XCJ0ZXh0XCI6IChvVGV4dEluZm8gJiYgb1RleHRJbmZvLmZ1bGxUZXh0KSB8fCBvRGF0YU9iamVjdFtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcImtleVwiOiBzVW5pdFByb3BlcnR5TmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFwidGV4dEluZm9cIjogb1RleHRJbmZvXG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLnB1c2godW5pdEVudHJ5KTtcblx0XHRcdFx0XHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldW1wic2VsZWN0T3B0aW9uc1wiXS5wdXNoKHVuaXRFbnRyeSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0b0Rpc3RpbmN0VW5pdE1hcFtzVW5pdFByb3BlcnR5TmFtZV0gPSBvRGF0YU9iamVjdFtvSW5EYXRhLnVuaXRQcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldLnRleHRJbmZvID0ge1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aDogb0luRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0dmFsdWVQYXRoOiBvSW5EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRkaXNwbGF5TW9kZTogb0luRGF0YS5kaXNwbGF5XG5cdFx0XHRcdH07XG5cdFx0XHRcdGlmIChPYmplY3Qua2V5cyhvRGlzdGluY3RWYWx1ZU1hcCkubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0ZGlhbG9nQ29udGV4dC5zZXRQcm9wZXJ0eShvSW5EYXRhLmRhdGFQcm9wZXJ0eSwgc1Byb3BlcnR5S2V5ICYmIG9EaXN0aW5jdFZhbHVlTWFwW3NQcm9wZXJ0eUtleV0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChPYmplY3Qua2V5cyhvRGlzdGluY3RVbml0TWFwKS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRkaWFsb2dDb250ZXh0LnNldFByb3BlcnR5KG9JbkRhdGEudW5pdFByb3BlcnR5LCBzVW5pdFByb3BlcnR5TmFtZSAmJiBvRGlzdGluY3RVbml0TWFwW3NVbml0UHJvcGVydHlOYW1lXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRhRGF0YUFycmF5LmZvckVhY2goZnVuY3Rpb24gKG9JbkRhdGE6IGFueSkge1xuXHRcdFx0bGV0IHZhbHVlczogYW55ID0ge307XG5cdFx0XHRpZiAob0luRGF0YS5kYXRhUHJvcGVydHkuaW5kZXhPZihcIi9cIikgPiAtMSkge1xuXHRcdFx0XHRjb25zdCBzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUgPSBNYXNzRWRpdEhlbHBlci5nZXRWYWx1ZUZvck11bHRpTGV2ZWxQYXRoKG9JbkRhdGEuZGF0YVByb3BlcnR5LCBhVmFsdWVzKTtcblx0XHRcdFx0aWYgKCFzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUpIHtcblx0XHRcdFx0XHRzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUucHVzaCh7IHRleHQ6IG9EZWZhdWx0VmFsdWVzLmxlYXZlQmxhbmtWYWx1ZSwga2V5OiBgRW1wdHkvJHtvSW5EYXRhLmRhdGFQcm9wZXJ0eX1gIH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE1hc3NFZGl0SGVscGVyLnNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZyhzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUsIG9EZWZhdWx0VmFsdWVzLCBvSW5EYXRhKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR2YWx1ZXMgPSBzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWU7XG5cdFx0XHR9IGVsc2UgaWYgKGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldKSB7XG5cdFx0XHRcdGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldID0gYVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0gfHwgW107XG5cdFx0XHRcdE1hc3NFZGl0SGVscGVyLnNldERlZmF1bHRWYWx1ZXNUb0RpYWxvZyhhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XSwgb0RlZmF1bHRWYWx1ZXMsIG9JbkRhdGEpO1xuXHRcdFx0XHR2YWx1ZXMgPSBhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0gJiYgYVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XS5sZW5ndGgpIHtcblx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuc2V0RGVmYXVsdFZhbHVlc1RvRGlhbG9nKGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0sIG9EZWZhdWx0VmFsdWVzLCBvSW5EYXRhLCB0cnVlKTtcblx0XHRcdFx0YVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XS50ZXh0SW5mbyA9IHt9O1xuXHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLnNlbGVjdGVkS2V5ID0gTWFzc0VkaXRIZWxwZXIuZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveChcblx0XHRcdFx0XHRhQ29udGV4dHMsXG5cdFx0XHRcdFx0b0luRGF0YS51bml0UHJvcGVydHlcblx0XHRcdFx0KTtcblx0XHRcdFx0YVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XS5pbnB1dFR5cGUgPSBvSW5EYXRhLmlucHV0VHlwZTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdChvSW5EYXRhLmRhdGFQcm9wZXJ0eSAmJiBhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XSAmJiAhYVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0ubGVuZ3RoKSB8fFxuXHRcdFx0XHQob0luRGF0YS51bml0UHJvcGVydHkgJiYgYVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XSAmJiAhYVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XS5sZW5ndGgpXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc3QgYkNsZWFyRmllbGRPckJsYW5rVmFsdWVFeGlzdHMgPVxuXHRcdFx0XHRcdGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldICYmXG5cdFx0XHRcdFx0YVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0uc29tZShmdW5jdGlvbiAob2JqOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvYmoudGV4dCA9PT0gXCI8IENsZWFyIFZhbHVlcyA+XCIgfHwgb2JqLnRleHQgPT09IFwiPCBMZWF2ZSBCbGFuayA+XCI7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChvSW5EYXRhLmRhdGFQcm9wZXJ0eSAmJiAhYkNsZWFyRmllbGRPckJsYW5rVmFsdWVFeGlzdHMpIHtcblx0XHRcdFx0XHRhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XS5wdXNoKHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLCBrZXk6IGBFbXB0eS8ke29JbkRhdGEuZGF0YVByb3BlcnR5fWAgfSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgYkNsZWFyRmllbGRPckJsYW5rVW5pdFZhbHVlRXhpc3RzID1cblx0XHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldICYmXG5cdFx0XHRcdFx0YVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XS5zb21lKGZ1bmN0aW9uIChvYmo6IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9iai50ZXh0ID09PSBcIjwgQ2xlYXIgVmFsdWVzID5cIiB8fCBvYmoudGV4dCA9PT0gXCI8IExlYXZlIEJsYW5rID5cIjtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKG9JbkRhdGEudW5pdFByb3BlcnR5KSB7XG5cdFx0XHRcdFx0aWYgKCFiQ2xlYXJGaWVsZE9yQmxhbmtVbml0VmFsdWVFeGlzdHMpIHtcblx0XHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0ucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IG9EZWZhdWx0VmFsdWVzLmxlYXZlQmxhbmtWYWx1ZSxcblx0XHRcdFx0XHRcdFx0a2V5OiBgRW1wdHkvJHtvSW5EYXRhLnVuaXRQcm9wZXJ0eX1gXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XS50ZXh0SW5mbyA9IHt9O1xuXHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0uc2VsZWN0ZWRLZXkgPSBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0U2VsZWN0aW9uUGF0aENvbWJvQm94KFxuXHRcdFx0XHRcdFx0YUNvbnRleHRzLFxuXHRcdFx0XHRcdFx0b0luRGF0YS51bml0UHJvcGVydHlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0uaW5wdXRUeXBlID0gb0luRGF0YS5pbnB1dFR5cGU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChvSW5EYXRhLmlzUHJvcGVydHlSZWFkT25seSAmJiB0eXBlb2Ygb0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkgPT09IFwiYm9vbGVhblwiKSB7XG5cdFx0XHRcdGFSZWFkT25seUZpZWxkSW5mby5wdXNoKHsgXCJwcm9wZXJ0eVwiOiBvSW5EYXRhLmRhdGFQcm9wZXJ0eSwgdmFsdWU6IG9JbkRhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5LCB0eXBlOiBcIkRlZmF1bHRcIiB9KTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdG9JbkRhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5ICYmXG5cdFx0XHRcdG9JbkRhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5Lm9wZXJhbmRzICYmXG5cdFx0XHRcdG9JbkRhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5Lm9wZXJhbmRzWzBdICYmXG5cdFx0XHRcdG9JbkRhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5Lm9wZXJhbmRzWzBdLm9wZXJhbmQxICYmXG5cdFx0XHRcdG9JbkRhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5Lm9wZXJhbmRzWzBdLm9wZXJhbmQyXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gVGhpcyBuZWVkcyB0byBiZSByZWZhY3RvcmVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgUmVhZE9ubHlFeHByZXNzaW9uIGNoYW5nZVxuXHRcdFx0XHRhUmVhZE9ubHlGaWVsZEluZm8ucHVzaCh7XG5cdFx0XHRcdFx0XCJwcm9wZXJ0eVwiOiBvSW5EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGg6IG9JbkRhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5Lm9wZXJhbmRzWzBdLm9wZXJhbmQxLnBhdGgsXG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZTogb0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDIudmFsdWUsXG5cdFx0XHRcdFx0dHlwZTogXCJQYXRoXCJcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldHRpbmcgdmlzYmlsaXR5IG9mIHRoZSBtYXNzIGVkaXQgZmllbGQuXG5cdFx0XHRpZiAob0luRGF0YS5lZGl0TW9kZSkge1xuXHRcdFx0XHR2YWx1ZXMudmlzaWJsZSA9XG5cdFx0XHRcdFx0b0luRGF0YS5lZGl0TW9kZSA9PT0gRWRpdE1vZGUuRWRpdGFibGUgfHxcblx0XHRcdFx0XHRhQ29udGV4dHMuc29tZShcblx0XHRcdFx0XHRcdE1hc3NFZGl0SGVscGVyLmdldEZpZWxkVmlzaWJsaXR5LmJpbmQoXG5cdFx0XHRcdFx0XHRcdE1hc3NFZGl0SGVscGVyLFxuXHRcdFx0XHRcdFx0XHRvSW5EYXRhLmVkaXRNb2RlLFxuXHRcdFx0XHRcdFx0XHRvRGlhbG9nRGF0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRvSW5EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0dmFsdWVzXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbHVlcy52aXNpYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHZhbHVlcy5zZWxlY3RlZEtleSA9IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goYUNvbnRleHRzLCBvSW5EYXRhLmRhdGFQcm9wZXJ0eSk7XG5cdFx0XHR2YWx1ZXMuaW5wdXRUeXBlID0gb0luRGF0YS5pbnB1dFR5cGU7XG5cdFx0XHR2YWx1ZXMudW5pdFByb3BlcnR5ID0gb0luRGF0YS51bml0UHJvcGVydHk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gb0RpYWxvZ0RhdGFNb2RlbDtcblx0fSxcblx0LyoqXG5cdCAqIEdldHMgdHJhbnNpZW50IGNvbnRleHQgZm9yIGRpYWxvZy5cblx0ICpcblx0ICogQHBhcmFtIHRhYmxlIEluc3RhbmNlIG9mIFRhYmxlLlxuXHQgKiBAcGFyYW0gZGlhbG9nIE1hc3MgRWRpdCBEaWFsb2cuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmV0dXJuaW5nIGluc3RhbmNlIG9mIGRpYWxvZy5cblx0ICovXG5cdGdldERpYWxvZ0NvbnRleHQ6IGZ1bmN0aW9uICh0YWJsZTogVGFibGUsIGRpYWxvZz86IERpYWxvZyk6IENvbnRleHQge1xuXHRcdGxldCB0cmFuc0N0eDogQ29udGV4dCA9IChkaWFsb2cgJiYgZGlhbG9nLmdldEJpbmRpbmdDb250ZXh0KCkpIGFzIENvbnRleHQ7XG5cblx0XHRpZiAoIXRyYW5zQ3R4KSB7XG5cdFx0XHRjb25zdCBtb2RlbCA9IHRhYmxlLmdldE1vZGVsKCk7XG5cdFx0XHRjb25zdCBsaXN0QmluZGluZyA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdGNvbnN0IHRyYW5zaWVudExpc3RCaW5kaW5nID0gbW9kZWwuYmluZExpc3QobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBsaXN0QmluZGluZy5nZXRDb250ZXh0KCksIFtdLCBbXSwge1xuXHRcdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwic3VibWl0TGF0ZXJcIlxuXHRcdFx0fSkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHRcdCh0cmFuc2llbnRMaXN0QmluZGluZyBhcyBhbnkpLnJlZnJlc2hJbnRlcm5hbCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0LyogKi9cblx0XHRcdH07XG5cdFx0XHR0cmFuc0N0eCA9IHRyYW5zaWVudExpc3RCaW5kaW5nLmNyZWF0ZSh7fSwgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRyYW5zQ3R4O1xuXHR9LFxuXG5cdG9uRGlhbG9nT3BlbjogZnVuY3Rpb24gKGV2ZW50OiBhbnkpOiB2b2lkIHtcblx0XHRjb25zdCBzb3VyY2UgPSBldmVudC5nZXRTb3VyY2UoKTtcblx0XHRjb25zdCBmaWVsZHNJbmZvTW9kZWwgPSBzb3VyY2UuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpO1xuXHRcdGZpZWxkc0luZm9Nb2RlbC5zZXRQcm9wZXJ0eShcIi9pc09wZW5cIiwgdHJ1ZSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENyZWF0ZSB0aGUgbWFzcyBlZGl0IGRpYWxvZy5cblx0ICpcblx0ICogQHBhcmFtIG9UYWJsZSBJbnN0YW5jZSBvZiBUYWJsZVxuXHQgKiBAcGFyYW0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIG9Db250cm9sbGVyIENvbnRyb2xsZXIgZm9yIHRoZSB2aWV3XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmV0dXJuaW5nIGluc3RhbmNlIG9mIGRpYWxvZy5cblx0ICovXG5cdGNyZWF0ZURpYWxvZzogYXN5bmMgZnVuY3Rpb24gKG9UYWJsZTogVGFibGUsIGFDb250ZXh0czogYW55W10sIG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlcik6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IFwic2FwL2ZlL2NvcmUvY29udHJvbHMvbWFzc0VkaXQvTWFzc0VkaXREaWFsb2dcIixcblx0XHRcdGFEYXRhQXJyYXk6IGFueVtdID0gW10sXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGUgPSAoQ29yZSBhcyBDb3JlRXgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpLFxuXHRcdFx0b0RlZmF1bHRWYWx1ZXMgPSBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0VGV4dHNGb3JEaWFsb2cob1Jlc291cmNlQnVuZGxlLCBhQ29udGV4dHMubGVuZ3RoLCBvVGFibGUpLFxuXHRcdFx0b0RhdGFGaWVsZE1vZGVsID0gTWFzc0VkaXRIZWxwZXIucHJlcGFyZURhdGFGb3JEaWFsb2cob1RhYmxlLCBhQ29udGV4dHMsIGFEYXRhQXJyYXkpLFxuXHRcdFx0ZGlhbG9nQ29udGV4dCA9IE1hc3NFZGl0SGVscGVyLmdldERpYWxvZ0NvbnRleHQob1RhYmxlKSxcblx0XHRcdG9EaWFsb2dEYXRhTW9kZWwgPSBNYXNzRWRpdEhlbHBlci5zZXRSdW50aW1lTW9kZWxPbkRpYWxvZyhhQ29udGV4dHMsIGFEYXRhQXJyYXksIG9EZWZhdWx0VmFsdWVzLCBkaWFsb2dDb250ZXh0KTtcblxuXHRcdGNvbnN0IG9GcmFnbWVudCA9IFhNTFRlbXBsYXRlUHJvY2Vzc29yLmxvYWRUZW1wbGF0ZShzRnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpO1xuXHRcdGNvbnN0IG9DcmVhdGVkRnJhZ21lbnQgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoXG5cdFx0XHRYTUxQcmVwcm9jZXNzb3IucHJvY2Vzcyhcblx0XHRcdFx0b0ZyYWdtZW50LFxuXHRcdFx0XHR7IG5hbWU6IHNGcmFnbWVudE5hbWUgfSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkTW9kZWw6IG9EYXRhRmllbGRNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIilcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkTW9kZWw6IG9EYXRhRmllbGRNb2RlbFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0KVxuXHRcdCk7XG5cdFx0Y29uc3Qgb0RpYWxvZ0NvbnRlbnQgPSBhd2FpdCBGcmFnbWVudC5sb2FkKHsgZGVmaW5pdGlvbjogb0NyZWF0ZWRGcmFnbWVudCB9KTtcblx0XHRjb25zdCBEcmFmdFN0YXR1cyA9IEZFTGlicmFyeS5EcmFmdFN0YXR1cztcblx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRyZXNpemFibGU6IHRydWUsXG5cdFx0XHR0aXRsZTogb0RlZmF1bHRWYWx1ZXMubWFzc0VkaXRUaXRsZSxcblx0XHRcdGNvbnRlbnQ6IFtvRGlhbG9nQ29udGVudCBhcyBhbnldLFxuXHRcdFx0YWZ0ZXJPcGVuOiBNYXNzRWRpdEhlbHBlci5vbkRpYWxvZ09wZW4sXG5cdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdHRleHQ6IE1hc3NFZGl0SGVscGVyLmhlbHBlcnMuZ2V0RXhwQmluZGluZ0ZvckFwcGx5QnV0dG9uVHh0KG9EZWZhdWx0VmFsdWVzLCBvRGF0YUZpZWxkTW9kZWwuZ2V0T2JqZWN0KFwiL1wiKSksXG5cdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRwcmVzczogYXN5bmMgZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0KG9Db250cm9sbGVyLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCk/LnNldFByb3BlcnR5KFwic2tpcFBhdGNoSGFuZGxlcnNcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0Y29uc3Qgb0luRGlhbG9nID0gb0V2ZW50LmdldFNvdXJjZSgpLmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9JbkRpYWxvZy5nZXRNb2RlbChcImZpZWxkc0luZm9cIik7XG5cdFx0XHRcdFx0Y29uc3QgYVJlc3VsdHMgPSBvTW9kZWwuZ2V0UHJvcGVydHkoXCIvcmVzdWx0c1wiKTtcblx0XHRcdFx0XHRjb25zdCBhUHJvcGVydHlSZWFkYWJsZUluZm8gPSBvTW9kZWwuZ2V0UHJvcGVydHkoXCIvcmVhZGFibGVQcm9wZXJ0eURhdGFcIik7XG5cdFx0XHRcdFx0Y29uc3QgY2hhbmdlUHJvbWlzZTogYW55W10gPSBbXTtcblx0XHRcdFx0XHRsZXQgYlJlYWRPbmx5RmllbGQgPSBmYWxzZTtcblx0XHRcdFx0XHRsZXQgZ3JvdXBJZDtcblx0XHRcdFx0XHRjb25zdCBlcnJvclZhbHVlczogYW55W10gPSBbXTtcblx0XHRcdFx0XHRhQ29udGV4dHMuZm9yRWFjaChmdW5jdGlvbiAob1NlbGVjdGVkQ29udGV4dDogYW55LCBpZHg6IG51bWJlcikge1xuXHRcdFx0XHRcdFx0YVJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAob1Jlc3VsdDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdC8vVE9ETyAtIEFkZCBzYXZlIGltcGxlbWVudGF0aW9uIGZvciBWYWx1ZSBIZWxwLlxuXHRcdFx0XHRcdFx0XHRpZiAoYVByb3BlcnR5UmVhZGFibGVJbmZvKSB7XG5cdFx0XHRcdFx0XHRcdFx0YlJlYWRPbmx5RmllbGQgPSBhUHJvcGVydHlSZWFkYWJsZUluZm8uc29tZShmdW5jdGlvbiAob1Byb3BlcnR5SW5mbzogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAob1Jlc3VsdC5rZXlWYWx1ZSA9PT0gb1Byb3BlcnR5SW5mby5wcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob1Byb3BlcnR5SW5mby50eXBlID09PSBcIkRlZmF1bHRcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUHJvcGVydHlJbmZvLnZhbHVlID09PSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8udHlwZSA9PT0gXCJQYXRoXCIgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvLnByb3BlcnR5VmFsdWUgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvLnByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3Qob1Byb3BlcnR5SW5mby5wcm9wZXJ0eVBhdGgpID09PSBvUHJvcGVydHlJbmZvLnByb3BlcnR5VmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRncm91cElkID0gYCRhdXRvLiR7aWR4fWA7XG5cdFx0XHRcdFx0XHRcdC8vaW5kZXggKz0gMTtcblx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXRGbG93LnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0XHRcdFx0XHRcdC8vbGV0IHByb21pc2VDb3VudCA9IDA7XG5cdFx0XHRcdFx0XHRcdGlmIChvUmVzdWx0LmtleVZhbHVlICYmIG9SZXN1bHQudmFsdWUgIT09IFwiRGVmYXVsdFwiICYmICFiUmVhZE9ubHlGaWVsZCkge1xuXHRcdFx0XHRcdFx0XHRcdGNoYW5nZVByb21pc2UucHVzaChcblx0XHRcdFx0XHRcdFx0XHRcdG9TZWxlY3RlZENvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnNldFByb3BlcnR5KG9SZXN1bHQua2V5VmFsdWUsIG9SZXN1bHQudmFsdWUsIGdyb3VwSWQpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1NlbGVjdGVkQ29udGV4dDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVycm9yVmFsdWVzLnB1c2gob1NlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QoKSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiTWFzcyBFZGl0OiBTb21ldGhpbmcgd2VudCB3cm9uZyBpbiB1cGRhdGluZyBlbnRyaWVzLlwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0YXdhaXQgKFByb21pc2UgYXMgYW55KS5hbGxTZXR0bGVkKGNoYW5nZVByb21pc2UpO1xuXG5cdFx0XHRcdFx0Y29uc3Qgb0xpc3RCaW5kaW5nID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRjb25zdCBvRXh0ZW5zaW9uQVBJID0gb0NvbnRyb2xsZXIgJiYgKG9Db250cm9sbGVyLmdldEV4dGVuc2lvbkFQSSgpIGFzIGFueSk7XG5cdFx0XHRcdFx0YXdhaXQgb0V4dGVuc2lvbkFQSS5yZWZyZXNoKG9MaXN0QmluZGluZy5nZXRQYXRoKCkpO1xuXG5cdFx0XHRcdFx0Y29uc3Qgc3VidGl0bGVDb2x1bW4gPSBDb21tb25VdGlscy5nZXRNZXNzYWdlQ29sdW1uKG9UYWJsZSk7XG5cdFx0XHRcdFx0Y29uc3QgbWVzc2FnZXMgPSBzYXAudWkuZ2V0Q29yZSgpLmdldE1lc3NhZ2VNYW5hZ2VyKCkuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdFx0XHRcdGNvbnN0IGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dHMgPSBbXSBhcyBhbnk7XG5cdFx0XHRcdFx0bWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbiAobWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBtZXNzYWdlVGFyZ2V0cyA9IG1lc3NhZ2UuZ2V0VGFyZ2V0cygpO1xuXHRcdFx0XHRcdFx0aWYgKG1lc3NhZ2VUYXJnZXRzICYmIG1lc3NhZ2VUYXJnZXRzLmxlbmd0aCA9PT0gMSAmJiBtZXNzYWdlVGFyZ2V0c1swXS5sZW5ndGggJiYgbWVzc2FnZS5wZXJzaXN0ZW50ID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dCA9IGFDb250ZXh0cy5maW5kKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VGFyZ2V0KCkuaW5kZXhPZihvQ29udGV4dC5nZXRQYXRoKCkpICE9PSAtMTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dHMucHVzaChib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRtZXNzYWdlLmFkZGl0aW9uYWxUZXh0ID0gYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0PyBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHQuZ2V0T2JqZWN0KClbc3VidGl0bGVDb2x1bW5dXG5cdFx0XHRcdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0aWYgKGFSZXN1bHRzLmxlbmd0aCA+IDAgJiYgYm91bmRUcmFuc2l0aW9uRXJyb3JDb250ZXh0cy5sZW5ndGggPT09IDAgJiYgZXJyb3JWYWx1ZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0XHRvQ29udHJvbGxlci5fZWRpdEZsb3cuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc3VjY2Vzc1RvYXN0ID0gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9TVUNDRVNTX1RPQVNUXCIpO1xuXHRcdFx0XHRcdFx0TWVzc2FnZVRvYXN0LnNob3coc3VjY2Vzc1RvYXN0KTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGVycm9yVmFsdWVzLmxlbmd0aCArIGJvdW5kVHJhbnNpdGlvbkVycm9yQ29udGV4dHMubGVuZ3RoIDwgKG9UYWJsZSBhcyBhbnkpLmdldFNlbGVjdGVkQ29udGV4dHMoKS5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdG9Db250cm9sbGVyLl9lZGl0Rmxvdy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChlcnJvclZhbHVlcy5sZW5ndGggKyBib3VuZFRyYW5zaXRpb25FcnJvckNvbnRleHRzLmxlbmd0aCA9PT0gKG9UYWJsZSBhcyBhbnkpLmdldFNlbGVjdGVkQ29udGV4dHMoKS5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdG9Db250cm9sbGVyLl9lZGl0Rmxvdy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9Db250cm9sbGVyLl9lZGl0Rmxvdy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0XHRcdGlmIChvSW5EaWFsb2cuaXNPcGVuKCkpIHtcblx0XHRcdFx0XHRcdG9JbkRpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0b0luRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdChvQ29udHJvbGxlci5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpPy5zZXRQcm9wZXJ0eShcblx0XHRcdFx0XHRcdFx0XCJza2lwUGF0Y2hIYW5kbGVyc1wiLFxuXHRcdFx0XHRcdFx0XHRmYWxzZVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMuY2FuY2VsQnV0dG9uVGV4dCxcblx0XHRcdFx0dmlzaWJsZTogTWFzc0VkaXRIZWxwZXIuaGVscGVycy5oYXNFZGl0YWJsZUZpZWxkc0JpbmRpbmcob0RhdGFGaWVsZE1vZGVsLmdldE9iamVjdChcIi9cIiksIHRydWUpIGFzIGFueSxcblx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uIChvRXZlbnQ6IGFueSkge1xuXHRcdFx0XHRcdGNvbnN0IG9JbkRpYWxvZyA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHRvSW5EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRvSW5EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdH0pO1xuXHRcdGNvbnN0IG1vZGVsID0gb1RhYmxlLmdldE1vZGVsKCk7XG5cdFx0b0RpYWxvZy5zZXRNb2RlbChvRGlhbG9nRGF0YU1vZGVsLCBcImZpZWxkc0luZm9cIik7XG5cdFx0b0RpYWxvZy5zZXRNb2RlbChtb2RlbCk7XG5cdFx0b0RpYWxvZy5zZXRCaW5kaW5nQ29udGV4dChkaWFsb2dDb250ZXh0KTtcblx0XHRyZXR1cm4gb0RpYWxvZztcblx0fSxcblxuXHRoZWxwZXJzOiB7XG5cdFx0Z2V0QmluZGluZ0V4cEZvckhhc0VkaXRhYmxlRmllbGRzOiAoZmllbGRzOiBhbnksIGVkaXRhYmxlOiBib29sZWFuKSA9PiB7XG5cdFx0XHRjb25zdCB0b3RhbEV4cCA9IGZpZWxkcy5yZWR1Y2UoXG5cdFx0XHRcdChleHByZXNzaW9uOiBhbnksIGZpZWxkOiBhbnkpID0+XG5cdFx0XHRcdFx0b3IoXG5cdFx0XHRcdFx0XHRleHByZXNzaW9uLFxuXHRcdFx0XHRcdFx0cGF0aEluTW9kZWwoXCIvdmFsdWVzL1wiICsgZmllbGQuZGF0YVByb3BlcnR5ICsgXCIvdmlzaWJsZVwiLCBcImZpZWxkc0luZm9cIikgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+XG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0Y29uc3RhbnQoZmFsc2UpXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIGVkaXRhYmxlID8gdG90YWxFeHAgOiBub3QodG90YWxFeHApO1xuXHRcdH0sXG5cblx0XHRnZXRFeHBCaW5kaW5nRm9yQXBwbHlCdXR0b25UeHQ6IChkZWZhdWx0VmFsdWVzOiBhbnksIGZpZWxkczogYm9vbGVhbikgPT4ge1xuXHRcdFx0Y29uc3QgZWRpdGFibGVFeHAgPSBNYXNzRWRpdEhlbHBlci5oZWxwZXJzLmdldEJpbmRpbmdFeHBGb3JIYXNFZGl0YWJsZUZpZWxkcyhmaWVsZHMsIHRydWUpO1xuXHRcdFx0Y29uc3QgdG90YWxFeHAgPSBpZkVsc2UoZWRpdGFibGVFeHAsIGNvbnN0YW50KGRlZmF1bHRWYWx1ZXMuYXBwbHlCdXR0b25UZXh0KSwgY29uc3RhbnQoZGVmYXVsdFZhbHVlcy5va0J1dHRvblRleHQpKTtcblx0XHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbih0b3RhbEV4cCk7XG5cdFx0fSxcblxuXHRcdGhhc0VkaXRhYmxlRmllbGRzQmluZGluZzogKGZpZWxkczogYW55LCBlZGl0YWJsZTogYm9vbGVhbikgPT4ge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKE1hc3NFZGl0SGVscGVyLmhlbHBlcnMuZ2V0QmluZGluZ0V4cEZvckhhc0VkaXRhYmxlRmllbGRzKGZpZWxkcywgZWRpdGFibGUpKTtcblx0XHR9XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1hc3NFZGl0SGVscGVyO1xuIl19