@sapui5/sap.fe.core 1.101.0 → 1.103.0

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