@sapui5/sap.fe.core 1.102.2 → 1.104.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/package.json +6 -6
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +73 -30
  4. package/src/sap/fe/core/AppComponent.ts +65 -43
  5. package/src/sap/fe/core/AppStateHandler.js +82 -70
  6. package/src/sap/fe/core/AppStateHandler.ts +32 -37
  7. package/src/sap/fe/core/BaseController.js +11 -9
  8. package/src/sap/fe/core/BaseController.ts +15 -13
  9. package/src/sap/fe/core/CommonUtils.js +227 -126
  10. package/src/sap/fe/core/CommonUtils.ts +240 -163
  11. package/src/sap/fe/core/ExtensionAPI.js +24 -27
  12. package/src/sap/fe/core/ExtensionAPI.ts +36 -38
  13. package/src/sap/fe/core/PageController.js +4 -4
  14. package/src/sap/fe/core/PageController.ts +4 -5
  15. package/src/sap/fe/core/TemplateComponent.js +1 -1
  16. package/src/sap/fe/core/TemplateComponent.ts +6 -6
  17. package/src/sap/fe/core/TemplateModel.js +1 -1
  18. package/src/sap/fe/core/TemplateModel.ts +1 -1
  19. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
  20. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +1 -1
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +181 -43
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +150 -24
  23. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +585 -210
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +246 -96
  25. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +30 -30
  26. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +32 -29
  27. package/src/sap/fe/core/controllerextensions/EditFlow.js +379 -330
  28. package/src/sap/fe/core/controllerextensions/EditFlow.ts +253 -245
  29. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +9 -9
  30. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
  31. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +101 -74
  32. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +69 -79
  33. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +67 -67
  34. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +76 -76
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +85 -77
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +103 -99
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +66 -68
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
  39. package/src/sap/fe/core/controllerextensions/MassEdit.js +9 -9
  40. package/src/sap/fe/core/controllerextensions/MassEdit.ts +20 -27
  41. package/src/sap/fe/core/controllerextensions/MessageHandler.js +20 -12
  42. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -14
  43. package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
  44. package/src/sap/fe/core/controllerextensions/PageReady.ts +98 -34
  45. package/src/sap/fe/core/controllerextensions/Paginator.js +21 -22
  46. package/src/sap/fe/core/controllerextensions/Paginator.ts +24 -25
  47. package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -6
  48. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  49. package/src/sap/fe/core/controllerextensions/Routing.js +10 -11
  50. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  51. package/src/sap/fe/core/controllerextensions/Share.js +170 -139
  52. package/src/sap/fe/core/controllerextensions/Share.ts +117 -118
  53. package/src/sap/fe/core/controllerextensions/SideEffects.js +46 -50
  54. package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
  55. package/src/sap/fe/core/controllerextensions/ViewState.js +200 -131
  56. package/src/sap/fe/core/controllerextensions/ViewState.ts +141 -148
  57. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
  58. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
  59. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +11 -10
  60. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +17 -20
  61. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -2
  62. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +4 -4
  63. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +7 -9
  64. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +18 -19
  65. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +190 -141
  66. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +258 -210
  67. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +183 -125
  68. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +213 -156
  69. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +164 -140
  70. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +180 -150
  71. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +24 -26
  72. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +35 -33
  73. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +71 -41
  74. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +102 -82
  75. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +61 -71
  76. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +56 -64
  77. package/src/sap/fe/core/controls/Any.js +9 -5
  78. package/src/sap/fe/core/controls/Any.ts +10 -4
  79. package/src/sap/fe/core/controls/CommandExecution.js +11 -25
  80. package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
  81. package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
  82. package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
  83. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +22 -22
  84. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
  85. package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -2
  86. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
  87. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
  88. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
  89. package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
  90. package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
  91. package/src/sap/fe/core/controls/FileWrapper.js +7 -2
  92. package/src/sap/fe/core/controls/FileWrapper.ts +15 -11
  93. package/src/sap/fe/core/controls/FilterBar.js +6 -2
  94. package/src/sap/fe/core/controls/FilterBar.ts +13 -9
  95. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
  96. package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
  97. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  98. package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
  99. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +3 -3
  100. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +16 -12
  101. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
  102. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -3
  103. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
  104. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +49 -49
  105. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +54 -54
  106. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
  107. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +22 -35
  108. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
  109. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
  110. package/src/sap/fe/core/converters/ConverterContext.js +26 -33
  111. package/src/sap/fe/core/converters/ConverterContext.ts +52 -61
  112. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  113. package/src/sap/fe/core/converters/ManifestSettings.ts +17 -15
  114. package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
  115. package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
  116. package/src/sap/fe/core/converters/MetaModelConverter.js +64 -35
  117. package/src/sap/fe/core/converters/MetaModelConverter.ts +154 -129
  118. package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
  119. package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
  120. package/src/sap/fe/core/converters/annotations/DataField.js +58 -35
  121. package/src/sap/fe/core/converters/annotations/DataField.ts +102 -76
  122. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1911 -1495
  123. package/src/sap/fe/core/converters/controls/Common/Action.js +50 -41
  124. package/src/sap/fe/core/converters/controls/Common/Action.ts +56 -46
  125. package/src/sap/fe/core/converters/controls/Common/Chart.js +14 -14
  126. package/src/sap/fe/core/converters/controls/Common/Chart.ts +26 -33
  127. package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
  128. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
  129. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +30 -28
  130. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +60 -61
  131. package/src/sap/fe/core/converters/controls/Common/Form.js +27 -28
  132. package/src/sap/fe/core/converters/controls/Common/Form.ts +44 -57
  133. package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
  134. package/src/sap/fe/core/converters/controls/Common/KPI.ts +49 -52
  135. package/src/sap/fe/core/converters/controls/Common/Table.js +181 -197
  136. package/src/sap/fe/core/converters/controls/Common/Table.ts +251 -280
  137. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
  138. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +144 -141
  139. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +45 -41
  140. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +65 -59
  141. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
  142. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
  143. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
  144. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
  145. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +67 -64
  146. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +69 -66
  147. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +77 -73
  148. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +101 -97
  149. package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
  150. package/src/sap/fe/core/converters/helpers/Aggregation.ts +12 -15
  151. package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
  152. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
  153. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -4
  154. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +9 -9
  155. package/src/sap/fe/core/converters/helpers/ID.js +48 -46
  156. package/src/sap/fe/core/converters/helpers/ID.ts +26 -25
  157. package/src/sap/fe/core/converters/helpers/Key.js +7 -7
  158. package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
  159. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  160. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -5
  161. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
  162. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
  163. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +46 -62
  164. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +54 -82
  165. package/src/sap/fe/core/converters/templates/ListReportConverter.js +55 -42
  166. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +81 -66
  167. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +39 -38
  168. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +52 -61
  169. package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
  170. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
  171. package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
  172. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
  173. package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
  174. package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
  175. package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
  176. package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
  177. package/src/sap/fe/core/formatters/StandardFormatter.js +96 -0
  178. package/src/sap/fe/core/formatters/StandardFormatter.ts +70 -0
  179. package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
  180. package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
  181. package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
  182. package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
  183. package/src/sap/fe/core/helpers/AppStartupHelper.js +15 -15
  184. package/src/sap/fe/core/helpers/AppStartupHelper.ts +37 -40
  185. package/src/sap/fe/core/helpers/BindingToolkit.js +1832 -0
  186. package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +396 -269
  187. package/src/sap/fe/core/helpers/ClassSupport.js +49 -12
  188. package/src/sap/fe/core/helpers/ClassSupport.ts +37 -10
  189. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
  190. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
  191. package/src/sap/fe/core/helpers/EditState.js +1 -6
  192. package/src/sap/fe/core/helpers/EditState.ts +5 -10
  193. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
  194. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
  195. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  196. package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
  197. package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
  198. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
  199. package/src/sap/fe/core/helpers/MassEditHelper.js +306 -280
  200. package/src/sap/fe/core/helpers/MassEditHelper.ts +380 -360
  201. package/src/sap/fe/core/helpers/MessageStrip.js +81 -0
  202. package/src/sap/fe/core/helpers/MessageStrip.ts +79 -0
  203. package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
  204. package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
  205. package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
  206. package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
  207. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  208. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
  209. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
  210. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
  211. package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
  212. package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
  213. package/src/sap/fe/core/helpers/ToES6Promise.js +32 -0
  214. package/src/sap/fe/core/helpers/ToES6Promise.ts +19 -0
  215. package/src/sap/fe/core/jsx-runtime/Fragment.js +16 -0
  216. package/src/sap/fe/core/jsx-runtime/Fragment.ts +3 -0
  217. package/src/sap/fe/core/jsx-runtime/jsx-control.js +99 -0
  218. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +82 -0
  219. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +105 -0
  220. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +89 -0
  221. package/src/sap/fe/core/jsx-runtime/jsx.js +12 -90
  222. package/src/sap/fe/core/jsx-runtime/jsx.ts +24 -85
  223. package/src/sap/fe/core/library.js +42 -3
  224. package/src/sap/fe/core/library.ts +38 -0
  225. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
  226. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
  227. package/src/sap/fe/core/messagebundle.properties +39 -63
  228. package/src/sap/fe/core/messagebundle_ar.properties +25 -39
  229. package/src/sap/fe/core/messagebundle_bg.properties +25 -39
  230. package/src/sap/fe/core/messagebundle_ca.properties +25 -39
  231. package/src/sap/fe/core/messagebundle_cs.properties +25 -39
  232. package/src/sap/fe/core/messagebundle_cy.properties +25 -39
  233. package/src/sap/fe/core/messagebundle_da.properties +25 -39
  234. package/src/sap/fe/core/messagebundle_de.properties +25 -39
  235. package/src/sap/fe/core/messagebundle_el.properties +26 -40
  236. package/src/sap/fe/core/messagebundle_en.properties +25 -39
  237. package/src/sap/fe/core/messagebundle_en_GB.properties +25 -39
  238. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +25 -39
  239. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +25 -39
  240. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +26 -18
  241. package/src/sap/fe/core/messagebundle_es.properties +27 -41
  242. package/src/sap/fe/core/messagebundle_es_MX.properties +25 -39
  243. package/src/sap/fe/core/messagebundle_et.properties +25 -39
  244. package/src/sap/fe/core/messagebundle_fi.properties +25 -39
  245. package/src/sap/fe/core/messagebundle_fr.properties +26 -40
  246. package/src/sap/fe/core/messagebundle_fr_CA.properties +25 -39
  247. package/src/sap/fe/core/messagebundle_hi.properties +25 -39
  248. package/src/sap/fe/core/messagebundle_hr.properties +25 -39
  249. package/src/sap/fe/core/messagebundle_hu.properties +25 -39
  250. package/src/sap/fe/core/messagebundle_id.properties +25 -39
  251. package/src/sap/fe/core/messagebundle_it.properties +41 -55
  252. package/src/sap/fe/core/messagebundle_iw.properties +25 -39
  253. package/src/sap/fe/core/messagebundle_ja.properties +25 -39
  254. package/src/sap/fe/core/messagebundle_kk.properties +25 -39
  255. package/src/sap/fe/core/messagebundle_ko.properties +30 -44
  256. package/src/sap/fe/core/messagebundle_lt.properties +25 -39
  257. package/src/sap/fe/core/messagebundle_lv.properties +25 -39
  258. package/src/sap/fe/core/messagebundle_ms.properties +25 -39
  259. package/src/sap/fe/core/messagebundle_nl.properties +27 -41
  260. package/src/sap/fe/core/messagebundle_no.properties +25 -39
  261. package/src/sap/fe/core/messagebundle_pl.properties +26 -40
  262. package/src/sap/fe/core/messagebundle_pt.properties +26 -40
  263. package/src/sap/fe/core/messagebundle_pt_PT.properties +25 -39
  264. package/src/sap/fe/core/messagebundle_ro.properties +25 -39
  265. package/src/sap/fe/core/messagebundle_ru.properties +25 -39
  266. package/src/sap/fe/core/messagebundle_sh.properties +25 -39
  267. package/src/sap/fe/core/messagebundle_sk.properties +25 -39
  268. package/src/sap/fe/core/messagebundle_sl.properties +25 -39
  269. package/src/sap/fe/core/messagebundle_sv.properties +25 -39
  270. package/src/sap/fe/core/messagebundle_th.properties +25 -39
  271. package/src/sap/fe/core/messagebundle_tr.properties +25 -39
  272. package/src/sap/fe/core/messagebundle_uk.properties +25 -39
  273. package/src/sap/fe/core/messagebundle_vi.properties +25 -39
  274. package/src/sap/fe/core/messagebundle_zh_CN.properties +25 -39
  275. package/src/sap/fe/core/messagebundle_zh_TW.properties +25 -39
  276. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  277. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
  278. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +97 -69
  279. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +68 -69
  280. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
  281. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
  282. package/src/sap/fe/core/services/NavigationServiceFactory.js +61 -49
  283. package/src/sap/fe/core/services/NavigationServiceFactory.ts +63 -52
  284. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
  285. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
  286. package/src/sap/fe/core/services/RoutingServiceFactory.js +55 -55
  287. package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
  288. package/src/sap/fe/core/services/ShellServicesFactory.js +92 -76
  289. package/src/sap/fe/core/services/ShellServicesFactory.ts +95 -82
  290. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +61 -61
  291. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
  292. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +224 -198
  293. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +138 -139
  294. package/src/sap/fe/core/support/CommonHelper.js +3 -2
  295. package/src/sap/fe/core/support/CommonHelper.ts +9 -13
  296. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  297. package/src/sap/fe/core/support/Diagnostics.ts +5 -5
  298. package/src/sap/fe/core/templating/CommonFormatters.js +84 -0
  299. package/src/sap/fe/core/templating/CommonFormatters.ts +86 -0
  300. package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
  301. package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
  302. package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
  303. package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
  304. package/src/sap/fe/core/templating/DataModelPathHelper.js +16 -15
  305. package/src/sap/fe/core/templating/DataModelPathHelper.ts +42 -32
  306. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  307. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
  308. package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
  309. package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
  310. package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
  311. package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
  312. package/src/sap/fe/core/templating/FilterHelper.js +16 -15
  313. package/src/sap/fe/core/templating/FilterHelper.ts +18 -18
  314. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  315. package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
  316. package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
  317. package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
  318. package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
  319. package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
  320. package/src/sap/fe/core/templating/UIFormatters.js +152 -95
  321. package/src/sap/fe/core/templating/UIFormatters.ts +202 -128
  322. package/src/sap/fe/core/type/Email.js +2 -2
  323. package/src/sap/fe/core/type/Email.ts +2 -2
  324. package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
@@ -10,9 +10,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
10
10
  * Called for property change in the transient context.
11
11
  *
12
12
  * @function
13
- * @param {any} newValue New value of the property.
14
- * @param {string} dataProperty Final context returned after the paginator action
15
- * @param {string} mdcFieldId Final context returned after the paginator action
13
+ * @param newValue New value of the property.
14
+ * @param dataProperty Final context returned after the paginator action
15
+ * @param mdcFieldId Final context returned after the paginator action
16
16
  */
17
17
  contextPropertyChange: function (newValue, dataProperty, mdcFieldId) {
18
18
  // Called for
@@ -21,7 +21,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
21
21
  var source = Core.byId(mdcFieldId);
22
22
  var transCtx = source && source.getBindingContext();
23
23
  var fieldInfoModel = source && source.getModel("fieldsInfo");
24
- var values = fieldInfoModel.getProperty("/values/" + dataProperty) || fieldInfoModel.getProperty("/unitData/" + dataProperty) || [];
24
+ var values = fieldInfoModel.getProperty("/values/".concat(dataProperty)) || fieldInfoModel.getProperty("/unitData/".concat(dataProperty)) || [];
25
25
 
26
26
  if (transCtx && (values.inputType === "InputWithValueHelp" || values.inputType === "InputWithUnit") && !values.valueListInfo) {
27
27
  MassEditHandlers._setValueListInfo(transCtx, source, fieldInfoModel, dataProperty);
@@ -42,8 +42,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
42
42
  * This is not called on change of the dropdown as we are using a custom MassEditSelect control and not general Select.
43
43
  *
44
44
  * @function
45
- * @param {object} event Event object for change.
46
- * @param {string} propertyName Property path.
45
+ * @param event Event object for change.
46
+ * @param propertyName Property path.
47
47
  */
48
48
  handleMDCFieldChange: function (event, propertyName) {
49
49
  // Called for
@@ -57,7 +57,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
57
57
  }
58
58
 
59
59
  changePromise.then(MassEditHandlers._updateSelectKeyForMDCFieldChange.bind(MassEditHandlers, source, propertyName)).catch(function (err) {
60
- Log.warning("VHD selection couldn't be populated in the mass edit field." + err);
60
+ Log.warning("VHD selection couldn't be populated in the mass edit field.".concat(err));
61
61
  });
62
62
  },
63
63
 
@@ -65,7 +65,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
65
65
  * Called for selection change through the drop down.
66
66
  *
67
67
  * @function
68
- * @param {object} event Event object for change.
68
+ * @param event Event object for change.
69
69
  */
70
70
  handleSelectionChange: function (event) {
71
71
  // Called for Manual selection from dropdown(comboBox or select)
@@ -100,14 +100,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
100
100
  * Update selections to results and the suggests in drop downs.
101
101
  *
102
102
  * @function
103
- * @param {MDCField} source MDC field that was changed.
104
- * @param {string} propertyName Property path.
105
- * @param {any} value New value.
103
+ * @param source MDC field that was changed.
104
+ * @param propertyName Property path.
105
+ * @param value New value.
106
106
  */
107
107
  _updateSelectKeyForMDCFieldChange: function (source, propertyName, value) {
108
108
  var transCtx = source && source.getBindingContext();
109
109
  var fieldInfoModel = source && source.getModel("fieldsInfo");
110
- var values = fieldInfoModel.getProperty("/values/" + propertyName) || fieldInfoModel.getProperty("/unitData/" + propertyName) || [];
110
+ var values = fieldInfoModel.getProperty("/values/".concat(propertyName)) || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) || [];
111
111
 
112
112
  if (transCtx && (values.inputType === "InputWithValueHelp" || values.inputType === "InputWithUnit") && !values.valueListInfo) {
113
113
  MassEditHandlers._setValueListInfo(transCtx, source, fieldInfoModel, propertyName);
@@ -126,10 +126,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
126
126
  * Update suggests for all drop downs with InParameter as the propertyName.
127
127
  *
128
128
  * @function
129
- * @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
130
- * @param {string} propertyName Property path.
131
- * @param {boolean} resetValues Should the values be reset to original state.
132
- * @param {boolean} keepExistingSelection Should the existing selection before update remain.
129
+ * @param fieldInfoModel Runtime model with parameters store information.
130
+ * @param propertyName Property path.
131
+ * @param resetValues Should the values be reset to original state.
132
+ * @param keepExistingSelection Should the existing selection before update remain.
133
133
  */
134
134
  _updateSuggestionForFieldsWithInParameters: function (fieldInfoModel, propertyName, resetValues, keepExistingSelection) {
135
135
  var values = fieldInfoModel.getProperty("/values");
@@ -144,15 +144,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
144
144
  * Update suggests for a drop down with InParameter as the srcPropertyName.
145
145
  *
146
146
  * @function
147
- * @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
148
- * @param {string} pathPrefix Path in the runtime model.
149
- * @param {string} srcPropertyName The InParameter Property path.
150
- * @param {boolean} resetValues Should the values be reset to original state.
151
- * @param {boolean} keepExistingSelection Should the existing selection before update remain.
152
- * @param {string} propertyName Property path that needs update of suggestions.
147
+ * @param fieldInfoModel Runtime model with parameters store information.
148
+ * @param pathPrefix Path in the runtime model.
149
+ * @param srcPropertyName The InParameter Property path.
150
+ * @param resetValues Should the values be reset to original state.
151
+ * @param keepExistingSelection Should the existing selection before update remain.
152
+ * @param propertyName Property path that needs update of suggestions.
153
153
  */
154
154
  _updateInParameterSuggetions: function (fieldInfoModel, pathPrefix, srcPropertyName, resetValues, keepExistingSelection, propertyName) {
155
- var valueListInfo = fieldInfoModel.getProperty(pathPrefix + propertyName + "/valueListInfo");
155
+ var valueListInfo = fieldInfoModel.getProperty("".concat(pathPrefix + propertyName, "/valueListInfo"));
156
156
 
157
157
  if (valueListInfo && srcPropertyName != propertyName) {
158
158
  var inParameters = valueListInfo.inParameters;
@@ -167,23 +167,25 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
167
167
  * Update suggests for all OutParameter's drop downs of the propertyName.
168
168
  *
169
169
  * @function
170
- * @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
171
- * @param {string} propertyName Property path.
172
- * @param {boolean} resetValues Should the values be reset to original state.
173
- * @param {boolean} keepExistingSelection Should the existing selection before update remain.
170
+ * @param fieldInfoModel Runtime model with parameters store information.
171
+ * @param propertyName Property path.
172
+ * @param resetValues Should the values be reset to original state.
173
+ * @param keepExistingSelection Should the existing selection before update remain.
174
174
  */
175
175
  _updateSuggestionForFieldsWithOutParameters: function (fieldInfoModel, propertyName, resetValues, keepExistingSelection) {
176
- var valueListInfo = fieldInfoModel.getProperty("/values/" + propertyName + "/valueListInfo") || fieldInfoModel.getProperty("/unitData/" + propertyName + "/valueListInfo");
176
+ var valueListInfo = fieldInfoModel.getProperty("/values/".concat(propertyName, "/valueListInfo")) || fieldInfoModel.getProperty("/unitData/".concat(propertyName, "/valueListInfo"));
177
177
 
178
178
  if (valueListInfo && valueListInfo.outParameters) {
179
179
  var outParameters = valueListInfo.outParameters;
180
180
 
181
- MassEditHandlers._updateOutParameterSuggetions(outParameters, fieldInfoModel, resetValues, keepExistingSelection);
181
+ if (outParameters.length && outParameters.length > 0) {
182
+ MassEditHandlers._updateOutParameterSuggetions(outParameters, fieldInfoModel, resetValues, keepExistingSelection);
182
183
 
183
- var pathPrefix = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/".concat(propertyName) || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/".concat(propertyName);
184
+ var pathPrefix = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/".concat(propertyName) || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/".concat(propertyName);
184
185
 
185
- if (pathPrefix) {
186
- MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, pathPrefix, false, true);
186
+ if (pathPrefix) {
187
+ MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, pathPrefix, false, true);
188
+ }
187
189
  }
188
190
  }
189
191
  },
@@ -192,10 +194,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
192
194
  * Update suggests for a drop down with InParameter as the srcPropertyName.
193
195
  *
194
196
  * @function
195
- * @param {string} outParameters String arrary of OutParameter property paths.
196
- * @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
197
- * @param {boolean} resetValues Should the values be reset to original state.
198
- * @param {boolean} keepExistingSelection Should the existing selection before update remain.
197
+ * @param outParameters String arrary of OutParameter property paths.
198
+ * @param fieldInfoModel Runtime model with parameters store information.
199
+ * @param resetValues Should the values be reset to original state.
200
+ * @param keepExistingSelection Should the existing selection before update remain.
199
201
  */
200
202
  _updateOutParameterSuggetions: function (outParameters, fieldInfoModel, resetValues, keepExistingSelection) {
201
203
  var values = fieldInfoModel.getProperty("/values");
@@ -204,9 +206,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
204
206
  var unitFieldPaths = Object.keys(unitData);
205
207
  outParameters.forEach(function (outParameter) {
206
208
  if (fieldPaths.includes(outParameter)) {
207
- MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, "/values/" + outParameter, resetValues, keepExistingSelection);
209
+ MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, "/values/".concat(outParameter), resetValues, keepExistingSelection);
208
210
  } else if (unitFieldPaths.includes(outParameter)) {
209
- MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, "/unitData/" + outParameter, resetValues, keepExistingSelection);
211
+ MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, "/unitData/".concat(outParameter), resetValues, keepExistingSelection);
210
212
  }
211
213
  });
212
214
  },
@@ -215,15 +217,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
215
217
  * Update suggests for a drop down of a field.
216
218
  *
217
219
  * @function
218
- * @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
219
- * @param {string} fieldPathAbsolute Complete runtime property path.
220
- * @param {boolean} resetValues Should the values be reset to original state.
221
- * @param {boolean} keepExistingSelection Should the existing selection before update remain.
220
+ * @param fieldInfoModel Runtime model with parameters store information.
221
+ * @param fieldPathAbsolute Complete runtime property path.
222
+ * @param resetValues Should the values be reset to original state.
223
+ * @param keepExistingSelection Should the existing selection before update remain.
222
224
  */
223
225
  _updateFieldPathSuggestions: function (fieldInfoModel, fieldPathAbsolute, resetValues, keepExistingSelection) {
224
226
  var options = fieldInfoModel.getProperty(fieldPathAbsolute);
225
227
  var defaultOptions = options.defaultOptions;
226
- var selectedKey = fieldInfoModel.getProperty(fieldPathAbsolute + "/selectedKey");
228
+ var selectedKey = fieldInfoModel.getProperty("".concat(fieldPathAbsolute, "/selectedKey"));
227
229
  var existingSelection = keepExistingSelection && options.find(function (option) {
228
230
  return option.key === selectedKey;
229
231
  });
@@ -248,7 +250,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
248
250
 
249
251
  if (existingSelection && !options.includes(existingSelection)) {
250
252
  options.push(existingSelection);
251
- fieldInfoModel.setProperty(fieldPathAbsolute + "/selectedKey", selectedKey);
253
+ fieldInfoModel.setProperty("".concat(fieldPathAbsolute, "/selectedKey"), selectedKey);
252
254
  }
253
255
  },
254
256
 
@@ -256,13 +258,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
256
258
  * Update In and Out Parameters in the MED.
257
259
  *
258
260
  * @function
259
- * @param {Context} transCtx The transient context of the MED.
260
- * @param {MDCField} source MDC field.
261
- * @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
262
- * @param {string} propertyName Property path.
261
+ * @param transCtx The transient context of the MED.
262
+ * @param source MDC field.
263
+ * @param fieldInfoModel Runtime model with parameters store information.
264
+ * @param propertyName Property path.
263
265
  */
264
266
  _setValueListInfo: function (transCtx, source, fieldInfoModel, propertyName) {
265
- var propPath = fieldInfoModel.getProperty("/values/" + propertyName) && "/values/" || fieldInfoModel.getProperty("/unitData/" + propertyName) && "/unitData/";
267
+ var propPath = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/" || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/";
266
268
 
267
269
  if (fieldInfoModel.getProperty("".concat(propPath).concat(propertyName, "/valueListInfo"))) {
268
270
  return;
@@ -299,14 +301,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
299
301
  * Request and update In and Out Parameters in the MED.
300
302
  *
301
303
  * @function
302
- * @param {Context} transCtx The transient context of the MED.
303
- * @param {MDCField} source MDC field.
304
- * @param {JSONModel} fieldInfoModel Runtime model with parameters store information.
305
- * @param {string} propertyName Property path.
304
+ * @param transCtx The transient context of the MED.
305
+ * @param source MDC field.
306
+ * @param fieldInfoModel Runtime model with parameters store information.
307
+ * @param propertyName Property path.
306
308
  */
307
309
  _requestValueList: function (transCtx, source, fieldInfoModel, propertyName) {
308
310
  var metaPath = ModelHelper.getMetaPathForContext(transCtx);
309
- var propertyPath = metaPath && metaPath + "/" + propertyName;
311
+ var propertyPath = metaPath && "".concat(metaPath, "/").concat(propertyName);
310
312
  var dependents = source === null || source === void 0 ? void 0 : source.getDependents();
311
313
  var fieldHelp = source === null || source === void 0 ? void 0 : source.getFieldHelp();
312
314
  var fieldValueHelp = dependents === null || dependents === void 0 ? void 0 : dependents.find(function (dependent) {
@@ -321,7 +323,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
321
323
  ValueListHelper.createVHUIModel(propertyPath, fieldValueHelp);
322
324
  var valueListInfo = ValueListHelper.getValueListInfo(fieldValueHelp, metaModel, propertyPath);
323
325
  valueListInfo.then(function (vLinfo) {
324
- var propPath = fieldInfoModel.getProperty("/values/" + propertyName) && "/values/" || fieldInfoModel.getProperty("/unitData/" + propertyName) && "/unitData/";
326
+ var propPath = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/" || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/";
325
327
  var info = {
326
328
  inParameters: vLinfo.inParameters.map(function (inParam) {
327
329
  return inParam.getFieldPath();
@@ -344,32 +346,31 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
344
346
  * Get field help control from MDC field.
345
347
  *
346
348
  * @function
347
- * @param {Context} transCtx The transient context of the MED.
348
- * @param {MDCField} source MDC field.
349
+ * @param transCtx The transient context of the MED.
350
+ * @param source MDC field.
349
351
  * @returns Field Help control.
350
352
  */
351
353
  _getValueHelp: function (transCtx, source) {
352
354
  var dependents = source === null || source === void 0 ? void 0 : source.getDependents();
353
355
  var fieldHelp = source === null || source === void 0 ? void 0 : source.getFieldHelp();
354
- var fieldValueHelp = dependents === null || dependents === void 0 ? void 0 : dependents.find(function (dependent) {
356
+ return dependents === null || dependents === void 0 ? void 0 : dependents.find(function (dependent) {
355
357
  return dependent.getId() === fieldHelp;
356
358
  });
357
- return fieldValueHelp;
358
359
  },
359
360
 
360
361
  /**
361
362
  * Colled on drop down selection of VHD option.
362
363
  *
363
364
  * @function
364
- * @param {MassEditSelect} source Custom Mass Edit Select control.
365
- * @param {string} propertyName Property path.
366
- * @param {string} selectKey Previous key before the VHD was selected.
365
+ * @param source Custom Mass Edit Select control.
366
+ * @param propertyName Property path.
367
+ * @param selectKey Previous key before the VHD was selected.
367
368
  */
368
369
  _onVHSelect: function (source, propertyName, selectKey) {
369
370
  // Called for
370
371
  // 1. VHD selected.
371
372
  var fieldInfoModel = source && source.getModel("fieldsInfo");
372
- var propPath = fieldInfoModel.getProperty("/values/" + propertyName) && "/values/" || fieldInfoModel.getProperty("/unitData/" + propertyName) && "/unitData/";
373
+ var propPath = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/" || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/";
373
374
  var transCtx = source.getBindingContext();
374
375
 
375
376
  var fieldValueHelp = MassEditHandlers._getValueHelp(transCtx, source.getParent());
@@ -379,14 +380,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
379
380
  }
380
381
 
381
382
  source.fireValueHelpRequest();
382
- fieldInfoModel.setProperty(propPath + propertyName + "/selectedKey", selectKey);
383
+ fieldInfoModel.setProperty("".concat(propPath + propertyName, "/selectedKey"), selectKey);
383
384
  },
384
385
 
385
386
  /**
386
387
  * Gets Property name from selection key.
387
388
  *
388
389
  * @function
389
- * @param {string} key Selection key.
390
+ * @param key Selection key.
390
391
  * @returns Property name.
391
392
  */
392
393
  _getPropertyNameFromKey: function (key) {
@@ -405,23 +406,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
405
406
  * Update selection to Custom Mass Edit Select from MDC field.
406
407
  *
407
408
  * @function
408
- * @param {MDCField} source MDC field.
409
- * @param {string} propertyName Property path.
410
- * @param {string} value Value to update.
411
- * @param {string} fullText Full text to use.
409
+ * @param source MDC field.
410
+ * @param propertyName Property path.
411
+ * @param value Value to update.
412
+ * @param fullText Full text to use.
412
413
  */
413
414
  _updateSelectKey: function (source, propertyName, value, fullText) {
414
415
  // Called for
415
416
  // 1. VHD property change
416
417
  // 2. Out Parameters.
417
418
  // 3. Transient context property change.
418
- var massEditSelect = source.getContent();
419
+ var comboBox = source.getContent();
419
420
 
420
- if (!massEditSelect || !propertyName) {
421
+ if (!comboBox || !propertyName) {
421
422
  return;
422
423
  }
423
424
 
424
- var key = massEditSelect.getSelectedKey();
425
+ var key = comboBox.getSelectedKey();
425
426
 
426
427
  if ((key.startsWith("Default/") || key.startsWith("ClearFieldValue/")) && !value) {
427
428
  return;
@@ -429,8 +430,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
429
430
 
430
431
  var formattedText = MassEditHandlers._valueExists(fullText) ? fullText : value;
431
432
  var fieldInfoModel = source && source.getModel("fieldsInfo");
432
- var values = fieldInfoModel.getProperty("/values/" + propertyName) || fieldInfoModel.getProperty("/unitData/" + propertyName) || [];
433
- var propPath = fieldInfoModel.getProperty("/values/" + propertyName) && "/values/" || fieldInfoModel.getProperty("/unitData/" + propertyName) && "/unitData/";
433
+ var values = fieldInfoModel.getProperty("/values/".concat(propertyName)) || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) || [];
434
+ var propPath = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/" || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/";
434
435
  var relatedField = values.find(function (fieldData) {
435
436
  var _fieldData$textInfo;
436
437
 
@@ -446,13 +447,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
446
447
  }
447
448
 
448
449
  if (relatedField.key === key) {
449
- fieldInfoModel.setProperty(propPath + propertyName + "/selectedKey", key);
450
+ fieldInfoModel.setProperty("".concat(propPath + propertyName, "/selectedKey"), key);
450
451
  return;
451
452
  }
452
453
 
453
454
  key = relatedField.key;
454
455
  } else if ([undefined, null, ""].indexOf(value) === -1) {
455
- key = propertyName + "/" + value;
456
+ key = "".concat(propertyName, "/").concat(value);
456
457
  var selectionInfo = {
457
458
  text: formattedText,
458
459
  key: key,
@@ -470,20 +471,20 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
470
471
  values.selectOptions.push(selectionInfo);
471
472
  fieldInfoModel.setProperty(propPath + propertyName, values);
472
473
  } else {
473
- key = "Default/" + propertyName;
474
+ key = "Default/".concat(propertyName);
474
475
  }
475
476
 
476
- fieldInfoModel.setProperty(propPath + propertyName + "/selectedKey", key);
477
+ fieldInfoModel.setProperty("".concat(propPath + propertyName, "/selectedKey"), key);
477
478
 
478
- MassEditHandlers._updateResults(massEditSelect);
479
+ MassEditHandlers._updateResults(comboBox);
479
480
  },
480
481
 
481
482
  /**
482
483
  * Get Value from Drop down.
483
484
  *
484
485
  * @function
485
- * @param {Control} source Drop down control.
486
- * @returns {string} Value of selection.
486
+ * @param source Drop down control.
487
+ * @returns Value of selection.
487
488
  */
488
489
  _getValue: function (source) {
489
490
  var _getSelectedItem;
@@ -512,9 +513,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
512
513
  * Updates selections to runtime model.
513
514
  *
514
515
  * @function
515
- * @param {Control} oSource Drop down control.
516
- * @param {Array} aParams Parts of key in runtime model.
517
- * @param {boolean} updateTransCtx Should transient context be updated with the value.
516
+ * @param oSource Drop down control.
517
+ * @param aParams Parts of key in runtime model.
518
+ * @param updateTransCtx Should transient context be updated with the value.
518
519
  */
519
520
  _updateResults: function (oSource) {
520
521
  var aParams = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
@@ -530,7 +531,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
530
531
 
531
532
  aParams = aParams.length > 0 ? aParams : oSource && oSource.getSelectedKey() && oSource.getSelectedKey().split("/");
532
533
  var oDataObject;
533
- var sPropertyName = oSource.getId().substring(oSource.getId().lastIndexOf(":") + 1);
534
+ var sPropertyName = oSource.data("fieldPath");
534
535
 
535
536
  if (aParams[0] === "Default") {
536
537
  oDataObject = {
@@ -552,7 +553,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
552
553
  };
553
554
  } else {
554
555
  var propertyName = aParams.slice(0, -1).join("/");
555
- var propertyValues = fieldsInfoModel.getProperty("/values/" + propertyName) || fieldsInfoModel.getProperty("/unitData/" + propertyName) || [];
556
+ var propertyValues = fieldsInfoModel.getProperty("/values/".concat(propertyName)) || fieldsInfoModel.getProperty("/unitData/".concat(propertyName)) || [];
556
557
  var relatedField = (propertyValues || []).find(function (oFieldData) {
557
558
  var _oFieldData$textInfo;
558
559
 
@@ -578,7 +579,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
578
579
  oFieldsInfoData.results.push(oDataObject);
579
580
  }
580
581
 
581
- if (updateTransCtx) {
582
+ if (updateTransCtx && !oDataObject.keyValue.includes("/")) {
582
583
  var transCtx = oSource.getBindingContext();
583
584
 
584
585
  if (aParams[0] === "Default" || aParams[0] === "ClearFieldValue") {
@@ -591,4 +592,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
591
592
  };
592
593
  return MassEditHandlers;
593
594
  }, false);
594
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGFuZGxlcnMudHMiXSwibmFtZXMiOlsiTWFzc0VkaXRIYW5kbGVycyIsImNvbnRleHRQcm9wZXJ0eUNoYW5nZSIsIm5ld1ZhbHVlIiwiZGF0YVByb3BlcnR5IiwibWRjRmllbGRJZCIsInNvdXJjZSIsIkNvcmUiLCJieUlkIiwidHJhbnNDdHgiLCJnZXRCaW5kaW5nQ29udGV4dCIsImZpZWxkSW5mb01vZGVsIiwiZ2V0TW9kZWwiLCJ2YWx1ZXMiLCJnZXRQcm9wZXJ0eSIsImlucHV0VHlwZSIsInZhbHVlTGlzdEluZm8iLCJfc2V0VmFsdWVMaXN0SW5mbyIsImlzRGlhbG9nT3BlbiIsImdldFZpc2libGUiLCJfdXBkYXRlU2VsZWN0S2V5IiwiaGFuZGxlTURDRmllbGRDaGFuZ2UiLCJldmVudCIsInByb3BlcnR5TmFtZSIsImdldFNvdXJjZSIsImNoYW5nZVByb21pc2UiLCJnZXRQYXJhbWV0ZXIiLCJjb21ib0JveCIsImdldENvbnRlbnQiLCJ0aGVuIiwiX3VwZGF0ZVNlbGVjdEtleUZvck1EQ0ZpZWxkQ2hhbmdlIiwiYmluZCIsImNhdGNoIiwiZXJyIiwiTG9nIiwid2FybmluZyIsImhhbmRsZVNlbGVjdGlvbkNoYW5nZSIsImtleSIsImdldFNlbGVjdGVkS2V5IiwicGFyYW1zIiwic3BsaXQiLCJwcmV2SXRlbSIsInNlbGVjdEtleSIsImdldEtleSIsInNsaWNlIiwiam9pbiIsIl9vblZIU2VsZWN0IiwiX2dldFByb3BlcnR5TmFtZUZyb21LZXkiLCJfdXBkYXRlU3VnZ2VzdGlvbkZvckZpZWxkc1dpdGhJblBhcmFtZXRlcnMiLCJzdGFydHNXaXRoIiwiX3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoT3V0UGFyYW1ldGVycyIsIl91cGRhdGVSZXN1bHRzIiwidmFsdWUiLCJmb3JtYXR0ZWRWYWx1ZSIsImdldEZvcm1Gb3JtYXR0ZWRWYWx1ZSIsInJlc2V0VmFsdWVzIiwia2VlcEV4aXN0aW5nU2VsZWN0aW9uIiwidW5pdERhdGEiLCJmaWVsZFBhdGhzIiwiT2JqZWN0Iiwia2V5cyIsInVuaXRGaWVsZFBhdGhzIiwiZm9yRWFjaCIsIl91cGRhdGVJblBhcmFtZXRlclN1Z2dldGlvbnMiLCJwYXRoUHJlZml4Iiwic3JjUHJvcGVydHlOYW1lIiwiaW5QYXJhbWV0ZXJzIiwibGVuZ3RoIiwiaW5jbHVkZXMiLCJfdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnMiLCJvdXRQYXJhbWV0ZXJzIiwiX3VwZGF0ZU91dFBhcmFtZXRlclN1Z2dldGlvbnMiLCJvdXRQYXJhbWV0ZXIiLCJmaWVsZFBhdGhBYnNvbHV0ZSIsIm9wdGlvbnMiLCJkZWZhdWx0T3B0aW9ucyIsInNlbGVjdGVkS2V5IiwiZXhpc3RpbmdTZWxlY3Rpb24iLCJmaW5kIiwib3B0aW9uIiwic2VsZWN0T3B0aW9ucyIsImRlZmF1bHRPcHRpb24iLCJwdXNoIiwic2VsZWN0T3B0aW9uIiwic2V0UHJvcGVydHkiLCJwcm9wUGF0aCIsImZpZWxkVmFsdWVIZWxwIiwiX2dldFZhbHVlSGVscCIsImdldERpYWxvZ0NvbnRlbnQiLCJnZXRUYWJsZSIsImdldEluUGFyYW1ldGVycyIsIm1hcCIsImluUGFyYW0iLCJnZXRGaWVsZFBhdGgiLCJvdXRQYXJhbSIsImluZm8iLCJfcmVxdWVzdFZhbHVlTGlzdCIsIm1ldGFQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJwcm9wZXJ0eVBhdGgiLCJkZXBlbmRlbnRzIiwiZ2V0RGVwZW5kZW50cyIsImZpZWxkSGVscCIsImdldEZpZWxkSGVscCIsImRlcGVuZGVudCIsImdldElkIiwic2V0QmluZGluZ0NvbnRleHQiLCJtZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJWYWx1ZUxpc3RIZWxwZXIiLCJjcmVhdGVWSFVJTW9kZWwiLCJnZXRWYWx1ZUxpc3RJbmZvIiwidkxpbmZvIiwiZ2V0UGFyZW50IiwiZmlyZVZhbHVlSGVscFJlcXVlc3QiLCJzdWJzdHJpbmciLCJpbmRleE9mIiwibGFzdEluZGV4T2YiLCJmdWxsVGV4dCIsIm1hc3NFZGl0U2VsZWN0IiwiZm9ybWF0dGVkVGV4dCIsIl92YWx1ZUV4aXN0cyIsInJlbGF0ZWRGaWVsZCIsImZpZWxkRGF0YSIsInRleHRJbmZvIiwidGV4dCIsImRlc2NyaXB0aW9uUGF0aCIsImRlc2NyaXB0aW9uIiwiZ2V0QWRkaXRpb25hbFZhbHVlIiwidW5kZWZpbmVkIiwic2VsZWN0aW9uSW5mbyIsInRleHRBcnJhbmdlbWVudCIsImdldERpc3BsYXkiLCJnZXRWYWx1ZSIsInZhbHVlUGF0aCIsIl9nZXRWYWx1ZSIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsImdldFNlbGVjdGVkSXRlbSIsImdldFRleHQiLCJfZ2V0VmFsdWVPbkVtcHR5Iiwib1NvdXJjZSIsImZpZWxkc0luZm9Nb2RlbCIsInNQcm9wZXJ0eU5hbWUiLCJ1bml0UHJvcGVydHkiLCJzZXRWYWx1ZSIsImFQYXJhbXMiLCJ1cGRhdGVUcmFuc0N0eCIsIm9GaWVsZHNJbmZvRGF0YSIsImdldERhdGEiLCJvRGF0YU9iamVjdCIsImtleVZhbHVlIiwicHJvcGVydHlWYWx1ZXMiLCJvRmllbGREYXRhIiwiYkV4aXN0aW5nRWxlbWVudGluZGV4IiwiaSIsInJlc3VsdHMiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFxQkEsTUFBTUEsZ0JBQXFCLEdBQUc7QUFDN0I7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDQyxJQUFBQSxxQkFBcUIsRUFBRSxVQUFVQyxRQUFWLEVBQXlCQyxZQUF6QixFQUErQ0MsVUFBL0MsRUFBbUU7QUFDekY7QUFDQTtBQUNBO0FBRUEsVUFBTUMsTUFBTSxHQUFHQyxJQUFJLENBQUNDLElBQUwsQ0FBVUgsVUFBVixDQUFmO0FBQ0EsVUFBTUksUUFBUSxHQUFHSCxNQUFNLElBQUtBLE1BQU0sQ0FBQ0ksaUJBQVAsRUFBNUI7QUFDQSxVQUFNQyxjQUFjLEdBQUdMLE1BQU0sSUFBS0EsTUFBTSxDQUFDTSxRQUFQLENBQWdCLFlBQWhCLENBQWxDO0FBQ0EsVUFB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TUFBNUMsRUFBb0R5RixDQUFDLEVBQXJELEVBQXlEO0FBQ3hELFlBQUlQLGVBQWUsQ0FBQ1EsT0FBaEIsQ0FBd0JELENBQXhCLEVBQTJCSixRQUEzQixLQUF3Q0QsV0FBVyxDQUFDQyxRQUF4RCxFQUFrRTtBQUNqRUcsVUFBQUEscUJBQXFCLEdBQUdDLENBQXhCO0FBQ0E7QUFDRDs7QUFDRCxVQUFJRCxxQkFBcUIsS0FBSyxDQUFDLENBQS9CLEVBQWtDO0FBQ2pDTixRQUFBQSxlQUFlLENBQUNRLE9BQWhCLENBQXdCRixxQkFBeEIsSUFBaURKLFdBQWpEO0FBQ0EsT0FGRCxNQUVPO0FBQ05GLFFBQUFBLGVBQWUsQ0FBQ1EsT0FBaEIsQ0FBd0IzRSxJQUF4QixDQUE2QnFFLFdBQTdCO0FBQ0E7O0FBQ0QsVUFBSUgsY0FBSixFQUFvQjtBQUNuQixZQUFNM0ksUUFBUSxHQUFHcUksT0FBTyxDQUFDcEksaUJBQVIsRUFBakI7O0FBQ0EsWUFBSXlJLE9BQU8sQ0FBQyxDQUFELENBQVAsS0FBZSxTQUFmLElBQTRCQSxPQUFPLENBQUMsQ0FBRCxDQUFQLEtBQWUsaUJBQS9DLEVBQWtFO0FBQ2pFMUksVUFBQUEsUUFBUSxDQUFDMkUsV0FBVCxDQUFxQm1FLFdBQVcsQ0FBQ0MsUUFBakMsRUFBMkMsSUFBM0M7QUFDQSxTQUZELE1BRU8sSUFBSUQsV0FBSixFQUFpQjtBQUN2QjlJLFVBQUFBLFFBQVEsQ0FBQzJFLFdBQVQsQ0FBcUJtRSxXQUFXLENBQUNDLFFBQWpDLEVBQTJDRCxXQUFXLENBQUNuRyxLQUF2RDtBQUNBO0FBQ0Q7QUFDRDtBQXBtQjRCLEdBQTlCO1NBdW1CZW5ELGdCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnN0cnVjdG9yIGZvciBhIG5ldyBWaXN1YWwgRmlsdGVyIENvbnRhaW5lci5cbiAqIFVzZWQgZm9yIHZpc3VhbCBmaWx0ZXJzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtzSWRdIElEIGZvciB0aGUgbmV3IGNvbnRyb2wsIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGlmIG5vIElEIGlzIGdpdmVuXG4gKiBAZXh0ZW5kcyBzYXAudWkubWRjLmZpbHRlcmJhci5JRmlsdGVyQ29udGFpbmVyXG4gKiBAY2xhc3NcbiAqIEBwcml2YXRlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbHMuZmlsdGVyYmFyLlZpc3VhbEZpbHRlckNvbnRhaW5lclxuICovXG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFZhbHVlTGlzdEhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC92YWx1ZWhlbHAvVmFsdWVMaXN0SGVscGVyXCI7XG5pbXBvcnQgQ29tYm9Cb3ggZnJvbSBcInNhcC9tL0NvbWJvQm94XCI7XG5pbXBvcnQgU2VsZWN0IGZyb20gXCJzYXAvbS9TZWxlY3RcIjtcbmltcG9ydCBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IEZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL0ZpZWxkXCI7XG5pbXBvcnQgSW5QYXJhbWV0ZXIgZnJvbSBcInNhcC91aS9tZGMvZmllbGQvSW5QYXJhbWV0ZXJcIjtcbmltcG9ydCBPdXRQYXJhbWV0ZXIgZnJvbSBcInNhcC91aS9tZGMvZmllbGQvT3V0UGFyYW1ldGVyXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuXG5jb25zdCBNYXNzRWRpdEhhbmRsZXJzOiBhbnkgPSB7XG5cdC8qKlxuXHQgKiBDYWxsZWQgZm9yIHByb3BlcnR5IGNoYW5nZSBpbiB0aGUgdHJhbnNpZW50IGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge2FueX0gbmV3VmFsdWUgTmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGRhdGFQcm9wZXJ0eSBGaW5hbCBjb250ZXh0IHJldHVybmVkIGFmdGVyIHRoZSBwYWdpbmF0b3IgYWN0aW9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtZGNGaWVsZElkIEZpbmFsIGNvbnRleHQgcmV0dXJuZWQgYWZ0ZXIgdGhlIHBhZ2luYXRvciBhY3Rpb25cblx0ICovXG5cdGNvbnRleHRQcm9wZXJ0eUNoYW5nZTogZnVuY3Rpb24gKG5ld1ZhbHVlOiBhbnksIGRhdGFQcm9wZXJ0eTogc3RyaW5nLCBtZGNGaWVsZElkOiBzdHJpbmcpIHtcblx0XHQvLyBDYWxsZWQgZm9yXG5cdFx0Ly8gMS4gT3V0IFBhcmFtZXRlcnMuXG5cdFx0Ly8gMi4gVHJhbnNpZW50IGNvbnRleHQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3Qgc291cmNlID0gQ29yZS5ieUlkKG1kY0ZpZWxkSWQpIGFzIEZpZWxkO1xuXHRcdGNvbnN0IHRyYW5zQ3R4ID0gc291cmNlICYmIChzb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KTtcblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdGNvbnN0IHZhbHVlcyA9XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXMvXCIgKyBkYXRhUHJvcGVydHkpIHx8IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL3VuaXREYXRhL1wiICsgZGF0YVByb3BlcnR5KSB8fCBbXTtcblxuXHRcdGlmICh0cmFuc0N0eCAmJiAodmFsdWVzLmlucHV0VHlwZSA9PT0gXCJJbnB1dFdpdGhWYWx1ZUhlbHBcIiB8fCB2YWx1ZXMuaW5wdXRUeXBlID09PSBcIklucHV0V2l0aFVuaXRcIikgJiYgIXZhbHVlcy52YWx1ZUxpc3RJbmZvKSB7XG5cdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl9zZXRWYWx1ZUxpc3RJbmZvKHRyYW5zQ3R4LCBzb3VyY2UsIGZpZWxkSW5mb01vZGVsLCBkYXRhUHJvcGVydHkpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzRGlhbG9nT3BlbiA9IGZpZWxkSW5mb01vZGVsICYmIGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL2lzT3BlblwiKTtcblx0XHRpZiAoIWlzRGlhbG9nT3BlbiB8fCAhc291cmNlLmdldFZpc2libGUoKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVNlbGVjdEtleShzb3VyY2UsIGRhdGFQcm9wZXJ0eSwgbmV3VmFsdWUpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgZm9yIGNoYW5nZSBpbiB0aGUgTURDIGZpZWxkLlxuXHQgKiBUaGlzIGlzIGNhbGxlZCBvbiBzZWxlY3Rpb24gZG9uZSB0aHJvdWdoIFZIRC5cblx0ICogVGhpcyBpcyBub3QgY2FsbGVkIG9uIGNoYW5nZSBvZiB0aGUgZHJvcGRvd24gYXMgd2UgYXJlIHVzaW5nIGEgY3VzdG9tIE1hc3NFZGl0U2VsZWN0IGNvbnRyb2wgYW5kIG5vdCBnZW5lcmFsIFNlbGVjdC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3QgZm9yIGNoYW5nZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKi9cblx0aGFuZGxlTURDRmllbGRDaGFuZ2U6IGZ1bmN0aW9uIChldmVudDogYW55LCBwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuXHRcdC8vIENhbGxlZCBmb3Jcblx0XHQvLyAxLiBWSEQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3Qgc291cmNlID0gZXZlbnQgJiYgZXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0Y29uc3QgY2hhbmdlUHJvbWlzZSA9IGV2ZW50ICYmIGV2ZW50LmdldFBhcmFtZXRlcihcInByb21pc2VcIik7XG5cdFx0Y29uc3QgY29tYm9Cb3ggPSBzb3VyY2UuZ2V0Q29udGVudCgpO1xuXHRcdGlmICghY29tYm9Cb3ggfHwgIXByb3BlcnR5TmFtZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNoYW5nZVByb21pc2Vcblx0XHRcdC50aGVuKE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVNlbGVjdEtleUZvck1EQ0ZpZWxkQ2hhbmdlLmJpbmQoTWFzc0VkaXRIYW5kbGVycywgc291cmNlLCBwcm9wZXJ0eU5hbWUpKVxuXHRcdFx0LmNhdGNoKChlcnI6IGFueSkgPT4ge1xuXHRcdFx0XHRMb2cud2FybmluZyhcIlZIRCBzZWxlY3Rpb24gY291bGRuJ3QgYmUgcG9wdWxhdGVkIGluIHRoZSBtYXNzIGVkaXQgZmllbGQuXCIgKyBlcnIpO1xuXHRcdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxlZCBmb3Igc2VsZWN0aW9uIGNoYW5nZSB0aHJvdWdoIHRoZSBkcm9wIGRvd24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0IGZvciBjaGFuZ2UuXG5cdCAqL1xuXHRoYW5kbGVTZWxlY3Rpb25DaGFuZ2U6IGZ1bmN0aW9uIChldmVudDogYW55KSB7XG5cdFx0Ly8gQ2FsbGVkIGZvciBNYW51YWwgc2VsZWN0aW9uIGZyb20gZHJvcGRvd24oY29tYm9Cb3ggb3Igc2VsZWN0KVxuXHRcdC8vIDEuIFZIRCBzZWxlY3QuXG5cdFx0Ly8gMi4gQW55IHZhbHVlIGNoYW5nZSBpbiB0aGUgY29udHJvbC5cblxuXHRcdGNvbnN0IHNvdXJjZSA9IChldmVudCAmJiBldmVudC5nZXRTb3VyY2UoKSkgYXMgYW55O1xuXHRcdGNvbnN0IGtleSA9IHNvdXJjZS5nZXRTZWxlY3RlZEtleSgpIGFzIHN0cmluZztcblx0XHRjb25zdCBwYXJhbXMgPSBzb3VyY2UgJiYga2V5ICYmIGtleS5zcGxpdChcIi9cIik7XG5cdFx0bGV0IHByb3BlcnR5TmFtZTtcblxuXHRcdGlmIChwYXJhbXNbMF0gPT09IFwiVXNlVmFsdWVIZWxwVmFsdWVcIikge1xuXHRcdFx0Y29uc3QgcHJldkl0ZW0gPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJwcmV2aW91c1NlbGVjdGVkSXRlbVwiKTtcblx0XHRcdGNvbnN0IHNlbGVjdEtleSA9IHByZXZJdGVtLmdldEtleSgpO1xuXHRcdFx0cHJvcGVydHlOYW1lID0gcGFyYW1zLnNsaWNlKDEpLmpvaW4oXCIvXCIpO1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fb25WSFNlbGVjdChzb3VyY2UsIHByb3BlcnR5TmFtZSwgc2VsZWN0S2V5KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdHByb3BlcnR5TmFtZSA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFByb3BlcnR5TmFtZUZyb21LZXkoa2V5KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aEluUGFyYW1ldGVycyhcblx0XHRcdGZpZWxkSW5mb01vZGVsLFxuXHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0a2V5LnN0YXJ0c1dpdGgoXCJEZWZhdWx0L1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIkNsZWFyRmllbGRWYWx1ZS9cIiksXG5cdFx0XHR0cnVlXG5cdFx0KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aE91dFBhcmFtZXRlcnMoXG5cdFx0XHRmaWVsZEluZm9Nb2RlbCxcblx0XHRcdHByb3BlcnR5TmFtZSxcblx0XHRcdGtleS5zdGFydHNXaXRoKFwiRGVmYXVsdC9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJDbGVhckZpZWxkVmFsdWUvXCIpLFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVJlc3VsdHMoc291cmNlLCBwYXJhbXMsIHRydWUpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc2VsZWN0aW9ucyB0byByZXN1bHRzIGFuZCB0aGUgc3VnZ2VzdHMgaW4gZHJvcCBkb3ducy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7TURDRmllbGR9IHNvdXJjZSBNREMgZmllbGQgdGhhdCB3YXMgY2hhbmdlZC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKiBAcGFyYW0ge2FueX0gdmFsdWUgTmV3IHZhbHVlLlxuXHQgKi9cblx0X3VwZGF0ZVNlbGVjdEtleUZvck1EQ0ZpZWxkQ2hhbmdlOiBmdW5jdGlvbiAoc291cmNlOiBhbnksIHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG5cdFx0Y29uc3QgdHJhbnNDdHggPSBzb3VyY2UgJiYgc291cmNlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgZmllbGRJbmZvTW9kZWwgPSBzb3VyY2UgJiYgKHNvdXJjZS5nZXRNb2RlbChcImZpZWxkc0luZm9cIikgYXMgSlNPTk1vZGVsKTtcblx0XHRjb25zdCB2YWx1ZXMgPVxuXHRcdFx0ZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzL1wiICsgcHJvcGVydHlOYW1lKSB8fCBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi91bml0RGF0YS9cIiArIHByb3BlcnR5TmFtZSkgfHwgW107XG5cblx0XHRpZiAodHJhbnNDdHggJiYgKHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiSW5wdXRXaXRoVmFsdWVIZWxwXCIgfHwgdmFsdWVzLmlucHV0VHlwZSA9PT0gXCJJbnB1dFdpdGhVbml0XCIpICYmICF2YWx1ZXMudmFsdWVMaXN0SW5mbykge1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fc2V0VmFsdWVMaXN0SW5mbyh0cmFuc0N0eCwgc291cmNlLCBmaWVsZEluZm9Nb2RlbCwgcHJvcGVydHlOYW1lKTtcblx0XHR9XG5cblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aE91dFBhcmFtZXRlcnMoZmllbGRJbmZvTW9kZWwsIHByb3BlcnR5TmFtZSwgZmFsc2UsIHRydWUpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoSW5QYXJhbWV0ZXJzKGZpZWxkSW5mb01vZGVsLCBwcm9wZXJ0eU5hbWUsIGZhbHNlLCB0cnVlKTtcblxuXHRcdGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gc291cmNlLmdldEZvcm1Gb3JtYXR0ZWRWYWx1ZSgpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVNlbGVjdEtleShzb3VyY2UsIHByb3BlcnR5TmFtZSwgdmFsdWUsIGZvcm1hdHRlZFZhbHVlKTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIHN1Z2dlc3RzIGZvciBhbGwgZHJvcCBkb3ducyB3aXRoIEluUGFyYW1ldGVyIGFzIHRoZSBwcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHtib29sZWFufSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIHtib29sZWFufSBrZWVwRXhpc3RpbmdTZWxlY3Rpb24gU2hvdWxkIHRoZSBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHVwZGF0ZSByZW1haW4uXG5cdCAqL1xuXHRfdXBkYXRlU3VnZ2VzdGlvbkZvckZpZWxkc1dpdGhJblBhcmFtZXRlcnM6IGZ1bmN0aW9uIChcblx0XHRmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLFxuXHRcdHByb3BlcnR5TmFtZTogc3RyaW5nLFxuXHRcdHJlc2V0VmFsdWVzOiBib29sZWFuLFxuXHRcdGtlZXBFeGlzdGluZ1NlbGVjdGlvbjogYm9vbGVhblxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCB2YWx1ZXMgPSBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXNcIik7XG5cdFx0Y29uc3QgdW5pdERhdGEgPSBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi91bml0RGF0YVwiKTtcblx0XHRjb25zdCBmaWVsZFBhdGhzID0gT2JqZWN0LmtleXModmFsdWVzKTtcblx0XHRjb25zdCB1bml0RmllbGRQYXRocyA9IE9iamVjdC5rZXlzKHVuaXREYXRhKTtcblxuXHRcdGZpZWxkUGF0aHMuZm9yRWFjaChcblx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZUluUGFyYW1ldGVyU3VnZ2V0aW9ucy5iaW5kKFxuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLFxuXHRcdFx0XHRmaWVsZEluZm9Nb2RlbCxcblx0XHRcdFx0XCIvdmFsdWVzL1wiLFxuXHRcdFx0XHRwcm9wZXJ0eU5hbWUsXG5cdFx0XHRcdHJlc2V0VmFsdWVzLFxuXHRcdFx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb25cblx0XHRcdClcblx0XHQpO1xuXHRcdHVuaXRGaWVsZFBhdGhzLmZvckVhY2goXG5cdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVJblBhcmFtZXRlclN1Z2dldGlvbnMuYmluZChcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycyxcblx0XHRcdFx0ZmllbGRJbmZvTW9kZWwsXG5cdFx0XHRcdFwiL3VuaXREYXRhL1wiLFxuXHRcdFx0XHRwcm9wZXJ0eU5hbWUsXG5cdFx0XHRcdHJlc2V0VmFsdWVzLFxuXHRcdFx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb25cblx0XHRcdClcblx0XHQpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGEgZHJvcCBkb3duIHdpdGggSW5QYXJhbWV0ZXIgYXMgdGhlIHNyY1Byb3BlcnR5TmFtZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7SlNPTk1vZGVsfSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdGhQcmVmaXggUGF0aCBpbiB0aGUgcnVudGltZSBtb2RlbC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNyY1Byb3BlcnR5TmFtZSBUaGUgSW5QYXJhbWV0ZXIgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHtib29sZWFufSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIHtib29sZWFufSBrZWVwRXhpc3RpbmdTZWxlY3Rpb24gU2hvdWxkIHRoZSBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHVwZGF0ZSByZW1haW4uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aCB0aGF0IG5lZWRzIHVwZGF0ZSBvZiBzdWdnZXN0aW9ucy5cblx0ICovXG5cdF91cGRhdGVJblBhcmFtZXRlclN1Z2dldGlvbnM6IGZ1bmN0aW9uIChcblx0XHRmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLFxuXHRcdHBhdGhQcmVmaXg6IHN0cmluZyxcblx0XHRzcmNQcm9wZXJ0eU5hbWU6IHN0cmluZyxcblx0XHRyZXNldFZhbHVlczogYm9vbGVhbixcblx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb246IGJvb2xlYW4sXG5cdFx0cHJvcGVydHlOYW1lOiBzdHJpbmdcblx0KSB7XG5cdFx0Y29uc3QgdmFsdWVMaXN0SW5mbyA9IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KHBhdGhQcmVmaXggKyBwcm9wZXJ0eU5hbWUgKyBcIi92YWx1ZUxpc3RJbmZvXCIpO1xuXHRcdGlmICh2YWx1ZUxpc3RJbmZvICYmIHNyY1Byb3BlcnR5TmFtZSAhPSBwcm9wZXJ0eU5hbWUpIHtcblx0XHRcdGNvbnN0IGluUGFyYW1ldGVycyA9IHZhbHVlTGlzdEluZm8uaW5QYXJhbWV0ZXJzO1xuXHRcdFx0aWYgKGluUGFyYW1ldGVycyAmJiBpblBhcmFtZXRlcnMubGVuZ3RoID4gMCAmJiBpblBhcmFtZXRlcnMuaW5jbHVkZXMoc3JjUHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgcGF0aFByZWZpeCArIHByb3BlcnR5TmFtZSwgcmVzZXRWYWx1ZXMsIGtlZXBFeGlzdGluZ1NlbGVjdGlvbik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGFsbCBPdXRQYXJhbWV0ZXIncyBkcm9wIGRvd25zIG9mIHRoZSBwcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHtib29sZWFufSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIHtib29sZWFufSBrZWVwRXhpc3RpbmdTZWxlY3Rpb24gU2hvdWxkIHRoZSBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHVwZGF0ZSByZW1haW4uXG5cdCAqL1xuXHRfdXBkYXRlU3VnZ2VzdGlvbkZvckZpZWxkc1dpdGhPdXRQYXJhbWV0ZXJzOiBmdW5jdGlvbiAoXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRwcm9wZXJ0eU5hbWU6IHN0cmluZyxcblx0XHRyZXNldFZhbHVlczogYm9vbGVhbixcblx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb246IGJvb2xlYW5cblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgdmFsdWVMaXN0SW5mbyA9XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXMvXCIgKyBwcm9wZXJ0eU5hbWUgKyBcIi92YWx1ZUxpc3RJbmZvXCIpIHx8XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi91bml0RGF0YS9cIiArIHByb3BlcnR5TmFtZSArIFwiL3ZhbHVlTGlzdEluZm9cIik7XG5cblx0XHRpZiAodmFsdWVMaXN0SW5mbyAmJiB2YWx1ZUxpc3RJbmZvLm91dFBhcmFtZXRlcnMpIHtcblx0XHRcdGNvbnN0IG91dFBhcmFtZXRlcnMgPSB2YWx1ZUxpc3RJbmZvLm91dFBhcmFtZXRlcnM7XG5cdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVPdXRQYXJhbWV0ZXJTdWdnZXRpb25zKG91dFBhcmFtZXRlcnMsIGZpZWxkSW5mb01vZGVsLCByZXNldFZhbHVlcywga2VlcEV4aXN0aW5nU2VsZWN0aW9uKTtcblx0XHRcdGNvbnN0IHBhdGhQcmVmaXggPVxuXHRcdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9YCkgfHxcblx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKTtcblx0XHRcdGlmIChwYXRoUHJlZml4KSB7XG5cdFx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZUZpZWxkUGF0aFN1Z2dlc3Rpb25zKGZpZWxkSW5mb01vZGVsLCBwYXRoUHJlZml4LCBmYWxzZSwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGEgZHJvcCBkb3duIHdpdGggSW5QYXJhbWV0ZXIgYXMgdGhlIHNyY1Byb3BlcnR5TmFtZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBvdXRQYXJhbWV0ZXJzIFN0cmluZyBhcnJhcnkgb2YgT3V0UGFyYW1ldGVyIHByb3BlcnR5IHBhdGhzLlxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVzZXRWYWx1ZXMgU2hvdWxkIHRoZSB2YWx1ZXMgYmUgcmVzZXQgdG8gb3JpZ2luYWwgc3RhdGUuXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZU91dFBhcmFtZXRlclN1Z2dldGlvbnM6IGZ1bmN0aW9uIChcblx0XHRvdXRQYXJhbWV0ZXJzOiBzdHJpbmdbXSxcblx0XHRmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLFxuXHRcdHJlc2V0VmFsdWVzOiBib29sZWFuLFxuXHRcdGtlZXBFeGlzdGluZ1NlbGVjdGlvbjogYm9vbGVhblxuXHQpIHtcblx0XHRjb25zdCB2YWx1ZXMgPSBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXNcIik7XG5cdFx0Y29uc3QgdW5pdERhdGEgPSBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi91bml0RGF0YVwiKTtcblx0XHRjb25zdCBmaWVsZFBhdGhzID0gT2JqZWN0LmtleXModmFsdWVzKTtcblx0XHRjb25zdCB1bml0RmllbGRQYXRocyA9IE9iamVjdC5rZXlzKHVuaXREYXRhKTtcblxuXHRcdG91dFBhcmFtZXRlcnMuZm9yRWFjaCgob3V0UGFyYW1ldGVyOiBzdHJpbmcpID0+IHtcblx0XHRcdGlmIChmaWVsZFBhdGhzLmluY2x1ZGVzKG91dFBhcmFtZXRlcikpIHtcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnMoZmllbGRJbmZvTW9kZWwsIFwiL3ZhbHVlcy9cIiArIG91dFBhcmFtZXRlciwgcmVzZXRWYWx1ZXMsIGtlZXBFeGlzdGluZ1NlbGVjdGlvbik7XG5cdFx0XHR9IGVsc2UgaWYgKHVuaXRGaWVsZFBhdGhzLmluY2x1ZGVzKG91dFBhcmFtZXRlcikpIHtcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnMoXG5cdFx0XHRcdFx0ZmllbGRJbmZvTW9kZWwsXG5cdFx0XHRcdFx0XCIvdW5pdERhdGEvXCIgKyBvdXRQYXJhbWV0ZXIsXG5cdFx0XHRcdFx0cmVzZXRWYWx1ZXMsXG5cdFx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZSBzdWdnZXN0cyBmb3IgYSBkcm9wIGRvd24gb2YgYSBmaWVsZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7SlNPTk1vZGVsfSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkUGF0aEFic29sdXRlIENvbXBsZXRlIHJ1bnRpbWUgcHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHtib29sZWFufSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIHtib29sZWFufSBrZWVwRXhpc3RpbmdTZWxlY3Rpb24gU2hvdWxkIHRoZSBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHVwZGF0ZSByZW1haW4uXG5cdCAqL1xuXHRfdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnM6IGZ1bmN0aW9uIChcblx0XHRmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLFxuXHRcdGZpZWxkUGF0aEFic29sdXRlOiBzdHJpbmcsXG5cdFx0cmVzZXRWYWx1ZXM6IGJvb2xlYW4sXG5cdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uOiBib29sZWFuXG5cdCkge1xuXHRcdGNvbnN0IG9wdGlvbnMgPSBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShmaWVsZFBhdGhBYnNvbHV0ZSk7XG5cdFx0Y29uc3QgZGVmYXVsdE9wdGlvbnMgPSBvcHRpb25zLmRlZmF1bHRPcHRpb25zO1xuXHRcdGNvbnN0IHNlbGVjdGVkS2V5ID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoZmllbGRQYXRoQWJzb2x1dGUgKyBcIi9zZWxlY3RlZEtleVwiKTtcblx0XHRjb25zdCBleGlzdGluZ1NlbGVjdGlvbiA9IGtlZXBFeGlzdGluZ1NlbGVjdGlvbiAmJiBvcHRpb25zLmZpbmQoKG9wdGlvbjogYW55KSA9PiBvcHRpb24ua2V5ID09PSBzZWxlY3RlZEtleSk7XG5cdFx0aWYgKHJlc2V0VmFsdWVzKSB7XG5cdFx0XHRjb25zdCBzZWxlY3RPcHRpb25zID0gb3B0aW9ucy5zZWxlY3RPcHRpb25zO1xuXHRcdFx0b3B0aW9ucy5sZW5ndGggPSAwO1xuXHRcdFx0ZGVmYXVsdE9wdGlvbnMuZm9yRWFjaCgoZGVmYXVsdE9wdGlvbjogYW55KSA9PiBvcHRpb25zLnB1c2goZGVmYXVsdE9wdGlvbikpO1xuXHRcdFx0c2VsZWN0T3B0aW9ucy5mb3JFYWNoKChzZWxlY3RPcHRpb246IGFueSkgPT4gb3B0aW9ucy5wdXNoKHNlbGVjdE9wdGlvbikpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvcHRpb25zLmxlbmd0aCA9IDA7XG5cdFx0XHRkZWZhdWx0T3B0aW9ucy5mb3JFYWNoKChkZWZhdWx0T3B0aW9uOiBhbnkpID0+IG9wdGlvbnMucHVzaChkZWZhdWx0T3B0aW9uKSk7XG5cdFx0fVxuXG5cdFx0ZmllbGRJbmZvTW9kZWwuc2V0UHJvcGVydHkoZmllbGRQYXRoQWJzb2x1dGUsIG9wdGlvbnMpO1xuXG5cdFx0aWYgKGV4aXN0aW5nU2VsZWN0aW9uICYmICFvcHRpb25zLmluY2x1ZGVzKGV4aXN0aW5nU2VsZWN0aW9uKSkge1xuXHRcdFx0b3B0aW9ucy5wdXNoKGV4aXN0aW5nU2VsZWN0aW9uKTtcblx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KGZpZWxkUGF0aEFic29sdXRlICsgXCIvc2VsZWN0ZWRLZXlcIiwgc2VsZWN0ZWRLZXkpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIEluIGFuZCBPdXQgUGFyYW1ldGVycyBpbiB0aGUgTUVELlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtDb250ZXh0fSB0cmFuc0N0eCBUaGUgdHJhbnNpZW50IGNvbnRleHQgb2YgdGhlIE1FRC5cblx0ICogQHBhcmFtIHtNRENGaWVsZH0gc291cmNlIE1EQyBmaWVsZC5cblx0ICogQHBhcmFtIHtKU09OTW9kZWx9IGZpZWxkSW5mb01vZGVsIFJ1bnRpbWUgbW9kZWwgd2l0aCBwYXJhbWV0ZXJzIHN0b3JlIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqL1xuXHRfc2V0VmFsdWVMaXN0SW5mbzogZnVuY3Rpb24gKHRyYW5zQ3R4OiBDb250ZXh0LCBzb3VyY2U6IEZpZWxkLCBmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IHByb3BQYXRoID1cblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXMvXCIgKyBwcm9wZXJ0eU5hbWUpICYmIFwiL3ZhbHVlcy9cIikgfHxcblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi91bml0RGF0YS9cIiArIHByb3BlcnR5TmFtZSkgJiYgXCIvdW5pdERhdGEvXCIpO1xuXG5cdFx0aWYgKGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAke3Byb3BQYXRofSR7cHJvcGVydHlOYW1lfS92YWx1ZUxpc3RJbmZvYCkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZmllbGRWYWx1ZUhlbHAgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZUhlbHAodHJhbnNDdHgsIHNvdXJjZSk7XG5cdFx0aWYgKGZpZWxkVmFsdWVIZWxwICYmIGZpZWxkVmFsdWVIZWxwLmdldERpYWxvZ0NvbnRlbnQoKS5nZXRUYWJsZSgpKSB7XG5cdFx0XHRjb25zdCBpblBhcmFtZXRlcnMgPSAoZmllbGRWYWx1ZUhlbHAuZ2V0SW5QYXJhbWV0ZXJzKCkgfHwgW10pLm1hcCgoaW5QYXJhbTogSW5QYXJhbWV0ZXIpID0+IGluUGFyYW0uZ2V0RmllbGRQYXRoKCkpO1xuXHRcdFx0Y29uc3Qgb3V0UGFyYW1ldGVycyA9IChmaWVsZFZhbHVlSGVscC5nZXRJblBhcmFtZXRlcnMoKSB8fCBbXSkubWFwKChvdXRQYXJhbTogT3V0UGFyYW1ldGVyKSA9PiBvdXRQYXJhbS5nZXRGaWVsZFBhdGgoKSk7XG5cdFx0XHRjb25zdCBpbmZvOiBhbnkgPSB7XG5cdFx0XHRcdGluUGFyYW1ldGVyczogaW5QYXJhbWV0ZXJzLm1hcCgoaW5QYXJhbTogYW55KSA9PiBpblBhcmFtLmdldEZpZWxkUGF0aCgpKSxcblx0XHRcdFx0b3V0UGFyYW1ldGVyczogb3V0UGFyYW1ldGVycy5tYXAoKG91dFBhcmFtOiBhbnkpID0+IG91dFBhcmFtLmdldEZpZWxkUGF0aCgpKVxuXHRcdFx0fTtcblx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KGAke3Byb3BQYXRofSR7cHJvcGVydHlOYW1lfS92YWx1ZUxpc3RJbmZvYCwgaW5mbyk7XG5cdFx0XHRpZiAoaW5mby5vdXRQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnMoZmllbGRJbmZvTW9kZWwsIGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWAsIGZhbHNlLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fcmVxdWVzdFZhbHVlTGlzdCh0cmFuc0N0eCwgc291cmNlLCBmaWVsZEluZm9Nb2RlbCwgcHJvcGVydHlOYW1lKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgYW5kIHVwZGF0ZSBJbiBhbmQgT3V0IFBhcmFtZXRlcnMgaW4gdGhlIE1FRC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7Q29udGV4dH0gdHJhbnNDdHggVGhlIHRyYW5zaWVudCBjb250ZXh0IG9mIHRoZSBNRUQuXG5cdCAqIEBwYXJhbSB7TURDRmllbGR9IHNvdXJjZSBNREMgZmllbGQuXG5cdCAqIEBwYXJhbSB7SlNPTk1vZGVsfSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKi9cblx0X3JlcXVlc3RWYWx1ZUxpc3Q6IGZ1bmN0aW9uICh0cmFuc0N0eDogQ29udGV4dCwgc291cmNlOiBGaWVsZCwgZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBtZXRhUGF0aCA9IE1vZGVsSGVscGVyLmdldE1ldGFQYXRoRm9yQ29udGV4dCh0cmFuc0N0eCk7XG5cdFx0Y29uc3QgcHJvcGVydHlQYXRoID0gKG1ldGFQYXRoICYmIG1ldGFQYXRoICsgXCIvXCIgKyBwcm9wZXJ0eU5hbWUpIGFzIHN0cmluZztcblx0XHRjb25zdCBkZXBlbmRlbnRzID0gKHNvdXJjZSBhcyBhbnkpPy5nZXREZXBlbmRlbnRzKCk7XG5cdFx0Y29uc3QgZmllbGRIZWxwID0gc291cmNlPy5nZXRGaWVsZEhlbHAoKTtcblx0XHRjb25zdCBmaWVsZFZhbHVlSGVscCA9IGRlcGVuZGVudHM/LmZpbmQoKGRlcGVuZGVudDogYW55KSA9PiBkZXBlbmRlbnQuZ2V0SWQoKSA9PT0gZmllbGRIZWxwKTtcblx0XHRpZiAoIWZpZWxkVmFsdWVIZWxwPy5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRmaWVsZFZhbHVlSGVscD8uc2V0QmluZGluZ0NvbnRleHQodHJhbnNDdHgpO1xuXHRcdH1cblx0XHRjb25zdCBtZXRhTW9kZWwgPSB0cmFuc0N0eC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFZhbHVlTGlzdEhlbHBlci5jcmVhdGVWSFVJTW9kZWwocHJvcGVydHlQYXRoLCBmaWVsZFZhbHVlSGVscCk7XG5cdFx0Y29uc3QgdmFsdWVMaXN0SW5mbyA9IFZhbHVlTGlzdEhlbHBlci5nZXRWYWx1ZUxpc3RJbmZvKGZpZWxkVmFsdWVIZWxwLCBtZXRhTW9kZWwsIHByb3BlcnR5UGF0aCkgYXMgUHJvbWlzZTxhbnk+O1xuXG5cdFx0dmFsdWVMaXN0SW5mb1xuXHRcdFx0LnRoZW4oKHZMaW5mbzogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHByb3BQYXRoID1cblx0XHRcdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzL1wiICsgcHJvcGVydHlOYW1lKSAmJiBcIi92YWx1ZXMvXCIpIHx8XG5cdFx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL3VuaXREYXRhL1wiICsgcHJvcGVydHlOYW1lKSAmJiBcIi91bml0RGF0YS9cIik7XG5cdFx0XHRcdGNvbnN0IGluZm86IGFueSA9IHtcblx0XHRcdFx0XHRpblBhcmFtZXRlcnM6IHZMaW5mby5pblBhcmFtZXRlcnMubWFwKChpblBhcmFtOiBhbnkpID0+IGluUGFyYW0uZ2V0RmllbGRQYXRoKCkpLFxuXHRcdFx0XHRcdG91dFBhcmFtZXRlcnM6IHZMaW5mby5vdXRQYXJhbWV0ZXJzLm1hcCgob3V0UGFyYW06IGFueSkgPT4gb3V0UGFyYW0uZ2V0RmllbGRQYXRoKCkpXG5cdFx0XHRcdH07XG5cdFx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KGAke3Byb3BQYXRofSR7cHJvcGVydHlOYW1lfS92YWx1ZUxpc3RJbmZvYCwgaW5mbyk7XG5cdFx0XHRcdGlmIChpbmZvLm91dFBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZUZpZWxkUGF0aFN1Z2dlc3Rpb25zKGZpZWxkSW5mb01vZGVsLCBgL3ZhbHVlcy8ke3Byb3BlcnR5TmFtZX1gLCBmYWxzZSwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKCkgPT4ge1xuXHRcdFx0XHRMb2cud2FybmluZyhgTWFzcyBFZGl0OiBDb3VsZG4ndCBsb2FkIHZhbHVlTGlzdCBpbmZvIGZvciAke3Byb3BlcnR5UGF0aH1gKTtcblx0XHRcdH0pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgZmllbGQgaGVscCBjb250cm9sIGZyb20gTURDIGZpZWxkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtDb250ZXh0fSB0cmFuc0N0eCBUaGUgdHJhbnNpZW50IGNvbnRleHQgb2YgdGhlIE1FRC5cblx0ICogQHBhcmFtIHtNRENGaWVsZH0gc291cmNlIE1EQyBmaWVsZC5cblx0ICogQHJldHVybnMgRmllbGQgSGVscCBjb250cm9sLlxuXHQgKi9cblx0X2dldFZhbHVlSGVscDogZnVuY3Rpb24gKHRyYW5zQ3R4OiBDb250ZXh0LCBzb3VyY2U6IGFueSk6IGFueSB7XG5cdFx0Y29uc3QgZGVwZW5kZW50cyA9IHNvdXJjZT8uZ2V0RGVwZW5kZW50cygpO1xuXHRcdGNvbnN0IGZpZWxkSGVscCA9IHNvdXJjZT8uZ2V0RmllbGRIZWxwKCk7XG5cdFx0Y29uc3QgZmllbGRWYWx1ZUhlbHAgPSBkZXBlbmRlbnRzPy5maW5kKChkZXBlbmRlbnQ6IGFueSkgPT4gZGVwZW5kZW50LmdldElkKCkgPT09IGZpZWxkSGVscCk7XG5cdFx0cmV0dXJuIGZpZWxkVmFsdWVIZWxwO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDb2xsZWQgb24gZHJvcCBkb3duIHNlbGVjdGlvbiBvZiBWSEQgb3B0aW9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtNYXNzRWRpdFNlbGVjdH0gc291cmNlIEN1c3RvbSBNYXNzIEVkaXQgU2VsZWN0IGNvbnRyb2wuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdEtleSBQcmV2aW91cyBrZXkgYmVmb3JlIHRoZSBWSEQgd2FzIHNlbGVjdGVkLlxuXHQgKi9cblx0X29uVkhTZWxlY3Q6IGZ1bmN0aW9uIChzb3VyY2U6IGFueSwgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHNlbGVjdEtleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0Ly8gQ2FsbGVkIGZvclxuXHRcdC8vIDEuIFZIRCBzZWxlY3RlZC5cblxuXHRcdGNvbnN0IGZpZWxkSW5mb01vZGVsID0gc291cmNlICYmIHNvdXJjZS5nZXRNb2RlbChcImZpZWxkc0luZm9cIik7XG5cdFx0Y29uc3QgcHJvcFBhdGggPVxuXHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL3ZhbHVlcy9cIiArIHByb3BlcnR5TmFtZSkgJiYgXCIvdmFsdWVzL1wiKSB8fFxuXHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL3VuaXREYXRhL1wiICsgcHJvcGVydHlOYW1lKSAmJiBcIi91bml0RGF0YS9cIik7XG5cdFx0Y29uc3QgdHJhbnNDdHggPSBzb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBmaWVsZFZhbHVlSGVscCA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFZhbHVlSGVscCh0cmFuc0N0eCwgc291cmNlLmdldFBhcmVudCgpKTtcblx0XHRpZiAoIWZpZWxkVmFsdWVIZWxwPy5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRmaWVsZFZhbHVlSGVscD8uc2V0QmluZGluZ0NvbnRleHQodHJhbnNDdHgpO1xuXHRcdH1cblx0XHRzb3VyY2UuZmlyZVZhbHVlSGVscFJlcXVlc3QoKTtcblxuXHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KHByb3BQYXRoICsgcHJvcGVydHlOYW1lICsgXCIvc2VsZWN0ZWRLZXlcIiwgc2VsZWN0S2V5KTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0cyBQcm9wZXJ0eSBuYW1lIGZyb20gc2VsZWN0aW9uIGtleS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgU2VsZWN0aW9uIGtleS5cblx0ICogQHJldHVybnMgUHJvcGVydHkgbmFtZS5cblx0ICovXG5cdF9nZXRQcm9wZXJ0eU5hbWVGcm9tS2V5OiBmdW5jdGlvbiAoa2V5OiBzdHJpbmcpIHtcblx0XHRsZXQgcHJvcGVydHlOYW1lID0gXCJcIjtcblx0XHRpZiAoa2V5LnN0YXJ0c1dpdGgoXCJEZWZhdWx0L1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIkNsZWFyRmllbGRWYWx1ZS9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJVc2VWYWx1ZUhlbHBWYWx1ZS9cIikpIHtcblx0XHRcdHByb3BlcnR5TmFtZSA9IGtleS5zdWJzdHJpbmcoa2V5LmluZGV4T2YoXCIvXCIpICsgMSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb3BlcnR5TmFtZSA9IGtleS5zdWJzdHJpbmcoMCwga2V5Lmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cdFx0fVxuXHRcdHJldHVybiBwcm9wZXJ0eU5hbWU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZSBzZWxlY3Rpb24gdG8gQ3VzdG9tIE1hc3MgRWRpdCBTZWxlY3QgZnJvbSBNREMgZmllbGQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge01EQ0ZpZWxkfSBzb3VyY2UgTURDIGZpZWxkLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBWYWx1ZSB0byB1cGRhdGUuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBmdWxsVGV4dCBGdWxsIHRleHQgdG8gdXNlLlxuXHQgKi9cblx0X3VwZGF0ZVNlbGVjdEtleTogZnVuY3Rpb24gKHNvdXJjZTogRmllbGQsIHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBmdWxsVGV4dD86IGFueSk6IHZvaWQge1xuXHRcdC8vIENhbGxlZCBmb3Jcblx0XHQvLyAxLiBWSEQgcHJvcGVydHkgY2hhbmdlXG5cdFx0Ly8gMi4gT3V0IFBhcmFtZXRlcnMuXG5cdFx0Ly8gMy4gVHJhbnNpZW50IGNvbnRleHQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3QgbWFzc0VkaXRTZWxlY3QgPSBzb3VyY2UuZ2V0Q29udGVudCgpIGFzIGFueSBhcyBTZWxlY3Q7XG5cdFx0aWYgKCFtYXNzRWRpdFNlbGVjdCB8fCAhcHJvcGVydHlOYW1lKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGxldCBrZXk6IHN0cmluZyA9IG1hc3NFZGl0U2VsZWN0LmdldFNlbGVjdGVkS2V5KCk7XG5cdFx0aWYgKChrZXkuc3RhcnRzV2l0aChcIkRlZmF1bHQvXCIpIHx8IGtleS5zdGFydHNXaXRoKFwiQ2xlYXJGaWVsZFZhbHVlL1wiKSkgJiYgIXZhbHVlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgZm9ybWF0dGVkVGV4dCA9IE1hc3NFZGl0SGFuZGxlcnMuX3ZhbHVlRXhpc3RzKGZ1bGxUZXh0KSA/IGZ1bGxUZXh0IDogdmFsdWU7XG5cdFx0Y29uc3QgZmllbGRJbmZvTW9kZWwgPSBzb3VyY2UgJiYgKChzb3VyY2UgYXMgYW55KS5nZXRNb2RlbChcImZpZWxkc0luZm9cIikgYXMgSlNPTk1vZGVsKTtcblx0XHRjb25zdCB2YWx1ZXMgPVxuXHRcdFx0ZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzL1wiICsgcHJvcGVydHlOYW1lKSB8fCBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi91bml0RGF0YS9cIiArIHByb3BlcnR5TmFtZSkgfHwgW107XG5cdFx0Y29uc3QgcHJvcFBhdGggPVxuXHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL3ZhbHVlcy9cIiArIHByb3BlcnR5TmFtZSkgJiYgXCIvdmFsdWVzL1wiKSB8fFxuXHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KFwiL3VuaXREYXRhL1wiICsgcHJvcGVydHlOYW1lKSAmJiBcIi91bml0RGF0YS9cIik7XG5cblx0XHRjb25zdCByZWxhdGVkRmllbGQgPSB2YWx1ZXMuZmluZCgoZmllbGREYXRhOiBhbnkpID0+IGZpZWxkRGF0YT8udGV4dEluZm8/LnZhbHVlID09PSB2YWx1ZSB8fCBmaWVsZERhdGEudGV4dCA9PT0gdmFsdWUpO1xuXG5cdFx0aWYgKHJlbGF0ZWRGaWVsZCkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRmdWxsVGV4dCAmJlxuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8gJiZcblx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHRJbmZvLmRlc2NyaXB0aW9uUGF0aCAmJlxuXHRcdFx0XHQocmVsYXRlZEZpZWxkLnRleHQgIT0gZm9ybWF0dGVkVGV4dCB8fCByZWxhdGVkRmllbGQudGV4dEluZm8uZnVsbFRleHQgIT0gZm9ybWF0dGVkVGV4dClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBVcGRhdGUgdGhlIGZ1bGwgdGV4dCBvbmx5IHdoZW4gcHJvdmlkZWQuXG5cdFx0XHRcdHJlbGF0ZWRGaWVsZC50ZXh0ID0gZm9ybWF0dGVkVGV4dDtcblx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHRJbmZvLmZ1bGxUZXh0ID0gZm9ybWF0dGVkVGV4dDtcblx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHRJbmZvLmRlc2NyaXB0aW9uID0gc291cmNlLmdldEFkZGl0aW9uYWxWYWx1ZSgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHJlbGF0ZWRGaWVsZC5rZXkgPT09IGtleSkge1xuXHRcdFx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShwcm9wUGF0aCArIHByb3BlcnR5TmFtZSArIFwiL3NlbGVjdGVkS2V5XCIsIGtleSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGtleSA9IHJlbGF0ZWRGaWVsZC5rZXk7XG5cdFx0fSBlbHNlIGlmIChbdW5kZWZpbmVkLCBudWxsLCBcIlwiXS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcblx0XHRcdGtleSA9IHByb3BlcnR5TmFtZSArIFwiL1wiICsgdmFsdWU7XG5cdFx0XHRjb25zdCBzZWxlY3Rpb25JbmZvID0ge1xuXHRcdFx0XHR0ZXh0OiBmb3JtYXR0ZWRUZXh0LFxuXHRcdFx0XHRrZXksXG5cdFx0XHRcdHRleHRJbmZvOiB7XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHNvdXJjZS5nZXRBZGRpdGlvbmFsVmFsdWUoKSxcblx0XHRcdFx0XHRkZXNjcmlwdGlvblBhdGg6IHZhbHVlcyAmJiB2YWx1ZXMudGV4dEluZm8gJiYgdmFsdWVzLnRleHRJbmZvLmRlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFx0XHRmdWxsVGV4dDogZm9ybWF0dGVkVGV4dCxcblx0XHRcdFx0XHR0ZXh0QXJyYW5nZW1lbnQ6IHNvdXJjZS5nZXREaXNwbGF5KCksXG5cdFx0XHRcdFx0dmFsdWU6IHNvdXJjZS5nZXRWYWx1ZSgpLFxuXHRcdFx0XHRcdHZhbHVlUGF0aDogcHJvcGVydHlOYW1lXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHR2YWx1ZXMucHVzaChzZWxlY3Rpb25JbmZvKTtcblx0XHRcdHZhbHVlcy5zZWxlY3RPcHRpb25zID0gdmFsdWVzLnNlbGVjdE9wdGlvbnMgfHwgW107XG5cdFx0XHR2YWx1ZXMuc2VsZWN0T3B0aW9ucy5wdXNoKHNlbGVjdGlvbkluZm8pO1xuXHRcdFx0ZmllbGRJbmZvTW9kZWwuc2V0UHJvcGVydHkocHJvcFBhdGggKyBwcm9wZXJ0eU5hbWUsIHZhbHVlcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGtleSA9IFwiRGVmYXVsdC9cIiArIHByb3BlcnR5TmFtZTtcblx0XHR9XG5cblx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShwcm9wUGF0aCArIHByb3BlcnR5TmFtZSArIFwiL3NlbGVjdGVkS2V5XCIsIGtleSk7XG5cdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlUmVzdWx0cyhtYXNzRWRpdFNlbGVjdCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCBWYWx1ZSBmcm9tIERyb3AgZG93bi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7Q29udHJvbH0gc291cmNlIERyb3AgZG93biBjb250cm9sLlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBWYWx1ZSBvZiBzZWxlY3Rpb24uXG5cdCAqL1xuXHRfZ2V0VmFsdWU6IGZ1bmN0aW9uIChzb3VyY2U6IENvbnRyb2wpIHtcblx0XHRyZXR1cm4gc291cmNlLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpID09PSBcInNhcC5mZS5jb3JlLmNvbnRyb2xzLk1hc3NFZGl0U2VsZWN0XCJcblx0XHRcdD8gKHNvdXJjZSBhcyBTZWxlY3QpLmdldFNlbGVjdGVkSXRlbSgpPy5nZXRUZXh0KClcblx0XHRcdDogKHNvdXJjZSBhcyBDb21ib0JveCkuZ2V0VmFsdWUoKTtcblx0fSxcblxuXHRfZ2V0VmFsdWVPbkVtcHR5OiBmdW5jdGlvbiAob1NvdXJjZTogYW55LCBmaWVsZHNJbmZvTW9kZWw6IEpTT05Nb2RlbCwgdmFsdWU6IGFueSwgc1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0aWYgKCF2YWx1ZSkge1xuXHRcdFx0Y29uc3QgdmFsdWVzID1cblx0XHRcdFx0ZmllbGRzSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7c1Byb3BlcnR5TmFtZX1gKSB8fCBmaWVsZHNJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3NQcm9wZXJ0eU5hbWV9YCkgfHwgW107XG5cdFx0XHRpZiAodmFsdWVzLnVuaXRQcm9wZXJ0eSkge1xuXHRcdFx0XHR2YWx1ZSA9IDA7XG5cdFx0XHRcdG9Tb3VyY2Uuc2V0VmFsdWUodmFsdWUpO1xuXHRcdFx0fSBlbHNlIGlmICh2YWx1ZXMuaW5wdXRUeXBlID09PSBcIkNoZWNrQm94XCIpIHtcblx0XHRcdFx0dmFsdWUgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9LFxuXG5cdF92YWx1ZUV4aXN0czogZnVuY3Rpb24gKHZhbHVlOiBhbnkpIHtcblx0XHRyZXR1cm4gdmFsdWUgIT0gdW5kZWZpbmVkICYmIHZhbHVlICE9IG51bGw7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgc2VsZWN0aW9ucyB0byBydW50aW1lIG1vZGVsLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtDb250cm9sfSBvU291cmNlIERyb3AgZG93biBjb250cm9sLlxuXHQgKiBAcGFyYW0ge0FycmF5fSBhUGFyYW1zIFBhcnRzIG9mIGtleSBpbiBydW50aW1lIG1vZGVsLlxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHVwZGF0ZVRyYW5zQ3R4IFNob3VsZCB0cmFuc2llbnQgY29udGV4dCBiZSB1cGRhdGVkIHdpdGggdGhlIHZhbHVlLlxuXHQgKi9cblx0X3VwZGF0ZVJlc3VsdHM6IGZ1bmN0aW9uIChvU291cmNlOiBhbnksIGFQYXJhbXM6IEFycmF5PHN0cmluZz4gPSBbXSwgdXBkYXRlVHJhbnNDdHg6IGJvb2xlYW4pIHtcblx0XHQvLyBDYWxsZWQgZm9yXG5cdFx0Ly8gMS4gVkhEIHByb3BlcnR5IGNoYW5nZS5cblx0XHQvLyAyLiBPdXQgcGFyYW1ldGVyLlxuXHRcdC8vIDMuIHRyYW5zaWVudCBjb250ZXh0IHByb3BlcnR5IGNoYW5nZS5cblx0XHRjb25zdCBmaWVsZHNJbmZvTW9kZWwgPSBvU291cmNlICYmIG9Tb3VyY2UuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpO1xuXHRcdGNvbnN0IG9GaWVsZHNJbmZvRGF0YSA9IGZpZWxkc0luZm9Nb2RlbCAmJiBmaWVsZHNJbmZvTW9kZWwuZ2V0RGF0YSgpO1xuXHRcdGxldCB2YWx1ZSA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFZhbHVlKG9Tb3VyY2UgYXMgQ29udHJvbCk7XG5cdFx0YVBhcmFtcyA9IGFQYXJhbXMubGVuZ3RoID4gMCA/IGFQYXJhbXMgOiBvU291cmNlICYmIG9Tb3VyY2UuZ2V0U2VsZWN0ZWRLZXkoKSAmJiBvU291cmNlLmdldFNlbGVjdGVkS2V5KCkuc3BsaXQoXCIvXCIpO1xuXG5cdFx0bGV0IG9EYXRhT2JqZWN0O1xuXHRcdGNvbnN0IHNQcm9wZXJ0eU5hbWUgPSBvU291cmNlLmdldElkKCkuc3Vic3RyaW5nKG9Tb3VyY2UuZ2V0SWQoKS5sYXN0SW5kZXhPZihcIjpcIikgKyAxKTtcblxuXHRcdGlmIChhUGFyYW1zWzBdID09PSBcIkRlZmF1bHRcIikge1xuXHRcdFx0b0RhdGFPYmplY3QgPSB7XG5cdFx0XHRcdGtleVZhbHVlOiBhUGFyYW1zWzFdLFxuXHRcdFx0XHR2YWx1ZTogYVBhcmFtc1swXVxuXHRcdFx0fTtcblx0XHR9IGVsc2UgaWYgKGFQYXJhbXNbMF0gPT09IFwiQ2xlYXJGaWVsZFZhbHVlXCIpIHtcblx0XHRcdHZhbHVlID0gXCJcIjtcblx0XHRcdHZhbHVlID0gTWFzc0VkaXRIYW5kbGVycy5fZ2V0VmFsdWVPbkVtcHR5KG9Tb3VyY2UsIGZpZWxkc0luZm9Nb2RlbCwgdmFsdWUsIHNQcm9wZXJ0eU5hbWUpO1xuXHRcdFx0b0RhdGFPYmplY3QgPSB7XG5cdFx0XHRcdGtleVZhbHVlOiBhUGFyYW1zWzFdLFxuXHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdH07XG5cdFx0fSBlbHNlIGlmICghYVBhcmFtcykge1xuXHRcdFx0dmFsdWUgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZU9uRW1wdHkob1NvdXJjZSwgZmllbGRzSW5mb01vZGVsLCB2YWx1ZSwgc1Byb3BlcnR5TmFtZSk7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IHNQcm9wZXJ0eU5hbWUsXG5cdFx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gYVBhcmFtcy5zbGljZSgwLCAtMSkuam9pbihcIi9cIik7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlcyA9XG5cdFx0XHRcdGZpZWxkc0luZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi92YWx1ZXMvXCIgKyBwcm9wZXJ0eU5hbWUpIHx8IGZpZWxkc0luZm9Nb2RlbC5nZXRQcm9wZXJ0eShcIi91bml0RGF0YS9cIiArIHByb3BlcnR5TmFtZSkgfHwgW107XG5cblx0XHRcdGNvbnN0IHJlbGF0ZWRGaWVsZCA9IChwcm9wZXJ0eVZhbHVlcyB8fCBbXSkuZmluZChmdW5jdGlvbiAob0ZpZWxkRGF0YTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvRmllbGREYXRhPy50ZXh0SW5mbz8udmFsdWUgPT09IHZhbHVlIHx8IG9GaWVsZERhdGEudGV4dCA9PT0gdmFsdWU7XG5cdFx0XHR9KTtcblx0XHRcdG9EYXRhT2JqZWN0ID0ge1xuXHRcdFx0XHRrZXlWYWx1ZTogcHJvcGVydHlOYW1lLFxuXHRcdFx0XHR2YWx1ZTpcblx0XHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8gJiYgTWFzc0VkaXRIYW5kbGVycy5fdmFsdWVFeGlzdHMocmVsYXRlZEZpZWxkLnRleHRJbmZvLnZhbHVlKVxuXHRcdFx0XHRcdFx0PyByZWxhdGVkRmllbGQudGV4dEluZm8udmFsdWVcblx0XHRcdFx0XHRcdDogcmVsYXRlZEZpZWxkLnRleHRcblx0XHRcdH07XG5cdFx0fVxuXHRcdGxldCBiRXhpc3RpbmdFbGVtZW50aW5kZXggPSAtMTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG9GaWVsZHNJbmZvRGF0YS5yZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAob0ZpZWxkc0luZm9EYXRhLnJlc3VsdHNbaV0ua2V5VmFsdWUgPT09IG9EYXRhT2JqZWN0LmtleVZhbHVlKSB7XG5cdFx0XHRcdGJFeGlzdGluZ0VsZW1lbnRpbmRleCA9IGk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChiRXhpc3RpbmdFbGVtZW50aW5kZXggIT09IC0xKSB7XG5cdFx0XHRvRmllbGRzSW5mb0RhdGEucmVzdWx0c1tiRXhpc3RpbmdFbGVtZW50aW5kZXhdID0gb0RhdGFPYmplY3Q7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9GaWVsZHNJbmZvRGF0YS5yZXN1bHRzLnB1c2gob0RhdGFPYmplY3QpO1xuXHRcdH1cblx0XHRpZiAodXBkYXRlVHJhbnNDdHgpIHtcblx0XHRcdGNvbnN0IHRyYW5zQ3R4ID0gb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0aWYgKGFQYXJhbXNbMF0gPT09IFwiRGVmYXVsdFwiIHx8IGFQYXJhbXNbMF0gPT09IFwiQ2xlYXJGaWVsZFZhbHVlXCIpIHtcblx0XHRcdFx0dHJhbnNDdHguc2V0UHJvcGVydHkob0RhdGFPYmplY3Qua2V5VmFsdWUsIG51bGwpO1xuXHRcdFx0fSBlbHNlIGlmIChvRGF0YU9iamVjdCkge1xuXHRcdFx0XHR0cmFuc0N0eC5zZXRQcm9wZXJ0eShvRGF0YU9iamVjdC5rZXlWYWx1ZSwgb0RhdGFPYmplY3QudmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTWFzc0VkaXRIYW5kbGVycztcbiJdfQ==
595
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGFuZGxlcnMudHMiXSwibmFtZXMiOlsiTWFzc0VkaXRIYW5kbGVycyIsImNvbnRleHRQcm9wZXJ0eUNoYW5nZSIsIm5ld1ZhbHVlIiwiZGF0YVByb3BlcnR5IiwibWRjRmllbGRJZCIsInNvdXJjZSIsIkNvcmUiLCJieUlkIiwidHJhbnNDdHgiLCJnZXRCaW5kaW5nQ29udGV4dCIsImZpZWxkSW5mb01vZGVsIiwiZ2V0TW9kZWwiLCJ2YWx1ZXMiLCJnZXRQcm9wZXJ0eSIsImlucHV0VHlwZSIsInZhbHVlTGlzdEluZm8iLCJfc2V0VmFsdWVMaXN0SW5mbyIsImlzRGlhbG9nT3BlbiIsImdldFZpc2libGUiLCJfdXBkYXRlU2VsZWN0S2V5IiwiaGFuZGxlTURDRmllbGRDaGFuZ2UiLCJldmVudCIsInByb3BlcnR5TmFtZSIsImdldFNvdXJjZSIsImNoYW5nZVByb21pc2UiLCJnZXRQYXJhbWV0ZXIiLCJjb21ib0JveCIsImdldENvbnRlbnQiLCJ0aGVuIiwiX3VwZGF0ZVNlbGVjdEtleUZvck1EQ0ZpZWxkQ2hhbmdlIiwiYmluZCIsImNhdGNoIiwiZXJyIiwiTG9nIiwid2FybmluZyIsImhhbmRsZVNlbGVjdGlvbkNoYW5nZSIsImtleSIsImdldFNlbGVjdGVkS2V5IiwicGFyYW1zIiwic3BsaXQiLCJwcmV2SXRlbSIsInNlbGVjdEtleSIsImdldEtleSIsInNsaWNlIiwiam9pbiIsIl9vblZIU2VsZWN0IiwiX2dldFByb3BlcnR5TmFtZUZyb21LZXkiLCJfdXBkYXRlU3VnZ2VzdGlvbkZvckZpZWxkc1dpdGhJblBhcmFtZXRlcnMiLCJzdGFydHNXaXRoIiwiX3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoT3V0UGFyYW1ldGVycyIsIl91cGRhdGVSZXN1bHRzIiwidmFsdWUiLCJmb3JtYXR0ZWRWYWx1ZSIsImdldEZvcm1Gb3JtYXR0ZWRWYWx1ZSIsInJlc2V0VmFsdWVzIiwia2VlcEV4aXN0aW5nU2VsZWN0aW9uIiwidW5pdERhdGEiLCJmaWVsZFBhdGhzIiwiT2JqZWN0Iiwia2V5cyIsInVuaXRGaWVsZFBhdGhzIiwiZm9yRWFjaCIsIl91cGRhdGVJblBhcmFtZXRlclN1Z2dldGlvbnMiLCJwYXRoUHJlZml4Iiwic3JjUHJvcGVydHlOYW1lIiwiaW5QYXJhbWV0ZXJzIiwibGVuZ3RoIiwiaW5jbHVkZXMiLCJfdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnMiLCJvdXRQYXJhbWV0ZXJzIiwiX3VwZGF0ZU91dFBhcmFtZXRlclN1Z2dldGlvbnMiLCJvdXRQYXJhbWV0ZXIiLCJmaWVsZFBhdGhBYnNvbHV0ZSIsIm9wdGlvbnMiLCJkZWZhdWx0T3B0aW9ucyIsInNlbGVjdGVkS2V5IiwiZXhpc3RpbmdTZWxlY3Rpb24iLCJmaW5kIiwib3B0aW9uIiwic2VsZWN0T3B0aW9ucyIsImRlZmF1bHRPcHRpb24iLCJwdXNoIiwic2VsZWN0T3B0aW9uIiwic2V0UHJvcGVydHkiLCJwcm9wUGF0aCIsImZpZWxkVmFsdWVIZWxwIiwiX2dldFZhbHVlSGVscCIsImdldERpYWxvZ0NvbnRlbnQiLCJnZXRUYWJsZSIsImdldEluUGFyYW1ldGVycyIsIm1hcCIsImluUGFyYW0iLCJnZXRGaWVsZFBhdGgiLCJvdXRQYXJhbSIsImluZm8iLCJfcmVxdWVzdFZhbHVlTGlzdCIsIm1ldGFQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJwcm9wZXJ0eVBhdGgiLCJkZXBlbmRlbnRzIiwiZ2V0RGVwZW5kZW50cyIsImZpZWxkSGVscCIsImdldEZpZWxkSGVscCIsImRlcGVuZGVudCIsImdldElkIiwic2V0QmluZGluZ0NvbnRleHQiLCJtZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJWYWx1ZUxpc3RIZWxwZXIiLCJjcmVhdGVWSFVJTW9kZWwiLCJnZXRWYWx1ZUxpc3RJbmZvIiwidkxpbmZvIiwiZ2V0UGFyZW50IiwiZmlyZVZhbHVlSGVscFJlcXVlc3QiLCJzdWJzdHJpbmciLCJpbmRleE9mIiwibGFzdEluZGV4T2YiLCJmdWxsVGV4dCIsImZvcm1hdHRlZFRleHQiLCJfdmFsdWVFeGlzdHMiLCJyZWxhdGVkRmllbGQiLCJmaWVsZERhdGEiLCJ0ZXh0SW5mbyIsInRleHQiLCJkZXNjcmlwdGlvblBhdGgiLCJkZXNjcmlwdGlvbiIsImdldEFkZGl0aW9uYWxWYWx1ZSIsInVuZGVmaW5lZCIsInNlbGVjdGlvbkluZm8iLCJ0ZXh0QXJyYW5nZW1lbnQiLCJnZXREaXNwbGF5IiwiZ2V0VmFsdWUiLCJ2YWx1ZVBhdGgiLCJfZ2V0VmFsdWUiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJnZXRTZWxlY3RlZEl0ZW0iLCJnZXRUZXh0IiwiX2dldFZhbHVlT25FbXB0eSIsIm9Tb3VyY2UiLCJmaWVsZHNJbmZvTW9kZWwiLCJzUHJvcGVydHlOYW1lIiwidW5pdFByb3BlcnR5Iiwic2V0VmFsdWUiLCJhUGFyYW1zIiwidXBkYXRlVHJhbnNDdHgiLCJvRmllbGRzSW5mb0RhdGEiLCJnZXREYXRhIiwib0RhdGFPYmplY3QiLCJkYXRhIiwia2V5VmFsdWUiLCJwcm9wZXJ0eVZhbHVlcyIsIm9GaWVsZERhdGEiLCJiRXhpc3RpbmdFbGVtZW50aW5kZXgiLCJpIiwicmVzdWx0cyJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7OztBQXFCQSxNQUFNQSxnQkFBcUIsR0FBRztBQUM3QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NDLElBQUFBLHFCQUFxQixFQUFFLFVBQVVDLFFBQVYsRUFBeUJDLFlBQXpCLEVBQStDQyxVQUEvQyxFQUFtRTtBQUN6RjtBQUNBO0FBQ0E7QUFFQSxVQUFNQyxNQUFNLEdBQUdDLElBQUksQ0FBQ0MsSUFBTCxDQUFVSCxVQUFWLENBQWY7QUFDQSxVQUFNSSxRQUFRLEdBQUdILE1BQU0sSUFBS0EsTUFBTSxDQUFDSSxpQkFBUCxFQUE1QjtBQUNBLFVBQU1DLGNBQWMsR0FBR0wsTUFBTSxJQUFLQSxNQUFNLENBQUNNLFFBQVAsQ0FBZ0IsWUFBaEIsQ0FBbEM7QUFDQSxVQUFNQyxNQUFNLEdB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QUNTLE9BQWhCLENBQXdCRixxQkFBeEIsSUFBaURMLFdBQWpEO0FBQ0EsT0FGRCxNQUVPO0FBQ05GLFFBQUFBLGVBQWUsQ0FBQ1MsT0FBaEIsQ0FBd0IzRSxJQUF4QixDQUE2Qm9FLFdBQTdCO0FBQ0E7O0FBQ0QsVUFBSUgsY0FBYyxJQUFJLENBQUNHLFdBQVcsQ0FBQ0UsUUFBWixDQUFxQnBGLFFBQXJCLENBQThCLEdBQTlCLENBQXZCLEVBQTJEO0FBQzFELFlBQU0zRCxRQUFRLEdBQUdvSSxPQUFPLENBQUNuSSxpQkFBUixFQUFqQjs7QUFDQSxZQUFJd0ksT0FBTyxDQUFDLENBQUQsQ0FBUCxLQUFlLFNBQWYsSUFBNEJBLE9BQU8sQ0FBQyxDQUFELENBQVAsS0FBZSxpQkFBL0MsRUFBa0U7QUFDakV6SSxVQUFBQSxRQUFRLENBQUMyRSxXQUFULENBQXFCa0UsV0FBVyxDQUFDRSxRQUFqQyxFQUEyQyxJQUEzQztBQUNBLFNBRkQsTUFFTyxJQUFJRixXQUFKLEVBQWlCO0FBQ3ZCN0ksVUFBQUEsUUFBUSxDQUFDMkUsV0FBVCxDQUFxQmtFLFdBQVcsQ0FBQ0UsUUFBakMsRUFBMkNGLFdBQVcsQ0FBQ2xHLEtBQXZEO0FBQ0E7QUFDRDtBQUNEO0FBcm1CNEIsR0FBOUI7U0F3bUJlbkQsZ0IiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29uc3RydWN0b3IgZm9yIGEgbmV3IFZpc3VhbCBGaWx0ZXIgQ29udGFpbmVyLlxuICogVXNlZCBmb3IgdmlzdWFsIGZpbHRlcnNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NJZF0gSUQgZm9yIHRoZSBuZXcgY29udHJvbCwgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgaWYgbm8gSUQgaXMgZ2l2ZW5cbiAqIEBleHRlbmRzIHNhcC51aS5tZGMuZmlsdGVyYmFyLklGaWx0ZXJDb250YWluZXJcbiAqIEBjbGFzc1xuICogQHByaXZhdGVcbiAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9scy5maWx0ZXJiYXIuVmlzdWFsRmlsdGVyQ29udGFpbmVyXG4gKi9cbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgVmFsdWVMaXN0SGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL2ludGVybmFsL3ZhbHVlaGVscC9WYWx1ZUxpc3RIZWxwZXJcIjtcbmltcG9ydCB0eXBlIENvbWJvQm94IGZyb20gXCJzYXAvbS9Db21ib0JveFwiO1xuaW1wb3J0IHR5cGUgU2VsZWN0IGZyb20gXCJzYXAvbS9TZWxlY3RcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgdHlwZSBGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9GaWVsZFwiO1xuaW1wb3J0IHR5cGUgSW5QYXJhbWV0ZXIgZnJvbSBcInNhcC91aS9tZGMvZmllbGQvSW5QYXJhbWV0ZXJcIjtcbmltcG9ydCB0eXBlIE91dFBhcmFtZXRlciBmcm9tIFwic2FwL3VpL21kYy9maWVsZC9PdXRQYXJhbWV0ZXJcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuXG5jb25zdCBNYXNzRWRpdEhhbmRsZXJzOiBhbnkgPSB7XG5cdC8qKlxuXHQgKiBDYWxsZWQgZm9yIHByb3BlcnR5IGNoYW5nZSBpbiB0aGUgdHJhbnNpZW50IGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gbmV3VmFsdWUgTmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cblx0ICogQHBhcmFtIGRhdGFQcm9wZXJ0eSBGaW5hbCBjb250ZXh0IHJldHVybmVkIGFmdGVyIHRoZSBwYWdpbmF0b3IgYWN0aW9uXG5cdCAqIEBwYXJhbSBtZGNGaWVsZElkIEZpbmFsIGNvbnRleHQgcmV0dXJuZWQgYWZ0ZXIgdGhlIHBhZ2luYXRvciBhY3Rpb25cblx0ICovXG5cdGNvbnRleHRQcm9wZXJ0eUNoYW5nZTogZnVuY3Rpb24gKG5ld1ZhbHVlOiBhbnksIGRhdGFQcm9wZXJ0eTogc3RyaW5nLCBtZGNGaWVsZElkOiBzdHJpbmcpIHtcblx0XHQvLyBDYWxsZWQgZm9yXG5cdFx0Ly8gMS4gT3V0IFBhcmFtZXRlcnMuXG5cdFx0Ly8gMi4gVHJhbnNpZW50IGNvbnRleHQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3Qgc291cmNlID0gQ29yZS5ieUlkKG1kY0ZpZWxkSWQpIGFzIEZpZWxkO1xuXHRcdGNvbnN0IHRyYW5zQ3R4ID0gc291cmNlICYmIChzb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KTtcblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdGNvbnN0IHZhbHVlcyA9XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3ZhbHVlcy8ke2RhdGFQcm9wZXJ0eX1gKSB8fCBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7ZGF0YVByb3BlcnR5fWApIHx8IFtdO1xuXG5cdFx0aWYgKHRyYW5zQ3R4ICYmICh2YWx1ZXMuaW5wdXRUeXBlID09PSBcIklucHV0V2l0aFZhbHVlSGVscFwiIHx8IHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiSW5wdXRXaXRoVW5pdFwiKSAmJiAhdmFsdWVzLnZhbHVlTGlzdEluZm8pIHtcblx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3NldFZhbHVlTGlzdEluZm8odHJhbnNDdHgsIHNvdXJjZSwgZmllbGRJbmZvTW9kZWwsIGRhdGFQcm9wZXJ0eSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaXNEaWFsb2dPcGVuID0gZmllbGRJbmZvTW9kZWwgJiYgZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvaXNPcGVuXCIpO1xuXHRcdGlmICghaXNEaWFsb2dPcGVuIHx8ICFzb3VyY2UuZ2V0VmlzaWJsZSgpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlU2VsZWN0S2V5KHNvdXJjZSwgZGF0YVByb3BlcnR5LCBuZXdWYWx1ZSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxlZCBmb3IgY2hhbmdlIGluIHRoZSBNREMgZmllbGQuXG5cdCAqIFRoaXMgaXMgY2FsbGVkIG9uIHNlbGVjdGlvbiBkb25lIHRocm91Z2ggVkhELlxuXHQgKiBUaGlzIGlzIG5vdCBjYWxsZWQgb24gY2hhbmdlIG9mIHRoZSBkcm9wZG93biBhcyB3ZSBhcmUgdXNpbmcgYSBjdXN0b20gTWFzc0VkaXRTZWxlY3QgY29udHJvbCBhbmQgbm90IGdlbmVyYWwgU2VsZWN0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIGV2ZW50IEV2ZW50IG9iamVjdCBmb3IgY2hhbmdlLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqL1xuXHRoYW5kbGVNRENGaWVsZENoYW5nZTogZnVuY3Rpb24gKGV2ZW50OiBhbnksIHByb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0Ly8gQ2FsbGVkIGZvclxuXHRcdC8vIDEuIFZIRCBwcm9wZXJ0eSBjaGFuZ2UuXG5cblx0XHRjb25zdCBzb3VyY2UgPSBldmVudCAmJiBldmVudC5nZXRTb3VyY2UoKTtcblx0XHRjb25zdCBjaGFuZ2VQcm9taXNlID0gZXZlbnQgJiYgZXZlbnQuZ2V0UGFyYW1ldGVyKFwicHJvbWlzZVwiKTtcblx0XHRjb25zdCBjb21ib0JveCA9IHNvdXJjZS5nZXRDb250ZW50KCk7XG5cdFx0aWYgKCFjb21ib0JveCB8fCAhcHJvcGVydHlOYW1lKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y2hhbmdlUHJvbWlzZVxuXHRcdFx0LnRoZW4oTWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlU2VsZWN0S2V5Rm9yTURDRmllbGRDaGFuZ2UuYmluZChNYXNzRWRpdEhhbmRsZXJzLCBzb3VyY2UsIHByb3BlcnR5TmFtZSkpXG5cdFx0XHQuY2F0Y2goKGVycjogYW55KSA9PiB7XG5cdFx0XHRcdExvZy53YXJuaW5nKGBWSEQgc2VsZWN0aW9uIGNvdWxkbid0IGJlIHBvcHVsYXRlZCBpbiB0aGUgbWFzcyBlZGl0IGZpZWxkLiR7ZXJyfWApO1xuXHRcdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxlZCBmb3Igc2VsZWN0aW9uIGNoYW5nZSB0aHJvdWdoIHRoZSBkcm9wIGRvd24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZXZlbnQgRXZlbnQgb2JqZWN0IGZvciBjaGFuZ2UuXG5cdCAqL1xuXHRoYW5kbGVTZWxlY3Rpb25DaGFuZ2U6IGZ1bmN0aW9uIChldmVudDogYW55KSB7XG5cdFx0Ly8gQ2FsbGVkIGZvciBNYW51YWwgc2VsZWN0aW9uIGZyb20gZHJvcGRvd24oY29tYm9Cb3ggb3Igc2VsZWN0KVxuXHRcdC8vIDEuIFZIRCBzZWxlY3QuXG5cdFx0Ly8gMi4gQW55IHZhbHVlIGNoYW5nZSBpbiB0aGUgY29udHJvbC5cblxuXHRcdGNvbnN0IHNvdXJjZSA9IGV2ZW50ICYmIGV2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IGtleSA9IHNvdXJjZS5nZXRTZWxlY3RlZEtleSgpIGFzIHN0cmluZztcblx0XHRjb25zdCBwYXJhbXMgPSBzb3VyY2UgJiYga2V5ICYmIGtleS5zcGxpdChcIi9cIik7XG5cdFx0bGV0IHByb3BlcnR5TmFtZTtcblxuXHRcdGlmIChwYXJhbXNbMF0gPT09IFwiVXNlVmFsdWVIZWxwVmFsdWVcIikge1xuXHRcdFx0Y29uc3QgcHJldkl0ZW0gPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJwcmV2aW91c1NlbGVjdGVkSXRlbVwiKTtcblx0XHRcdGNvbnN0IHNlbGVjdEtleSA9IHByZXZJdGVtLmdldEtleSgpO1xuXHRcdFx0cHJvcGVydHlOYW1lID0gcGFyYW1zLnNsaWNlKDEpLmpvaW4oXCIvXCIpO1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fb25WSFNlbGVjdChzb3VyY2UsIHByb3BlcnR5TmFtZSwgc2VsZWN0S2V5KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdHByb3BlcnR5TmFtZSA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFByb3BlcnR5TmFtZUZyb21LZXkoa2V5KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aEluUGFyYW1ldGVycyhcblx0XHRcdGZpZWxkSW5mb01vZGVsLFxuXHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0a2V5LnN0YXJ0c1dpdGgoXCJEZWZhdWx0L1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIkNsZWFyRmllbGRWYWx1ZS9cIiksXG5cdFx0XHR0cnVlXG5cdFx0KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aE91dFBhcmFtZXRlcnMoXG5cdFx0XHRmaWVsZEluZm9Nb2RlbCxcblx0XHRcdHByb3BlcnR5TmFtZSxcblx0XHRcdGtleS5zdGFydHNXaXRoKFwiRGVmYXVsdC9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJDbGVhckZpZWxkVmFsdWUvXCIpLFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVJlc3VsdHMoc291cmNlLCBwYXJhbXMsIHRydWUpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc2VsZWN0aW9ucyB0byByZXN1bHRzIGFuZCB0aGUgc3VnZ2VzdHMgaW4gZHJvcCBkb3ducy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBzb3VyY2UgTURDIGZpZWxkIHRoYXQgd2FzIGNoYW5nZWQuXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHZhbHVlIE5ldyB2YWx1ZS5cblx0ICovXG5cdF91cGRhdGVTZWxlY3RLZXlGb3JNRENGaWVsZENoYW5nZTogZnVuY3Rpb24gKHNvdXJjZTogYW55LCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuXHRcdGNvbnN0IHRyYW5zQ3R4ID0gc291cmNlICYmIHNvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IGZpZWxkSW5mb01vZGVsID0gc291cmNlICYmIChzb3VyY2UuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpIGFzIEpTT05Nb2RlbCk7XG5cdFx0Y29uc3QgdmFsdWVzID1cblx0XHRcdGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgfHwgW107XG5cblx0XHRpZiAodHJhbnNDdHggJiYgKHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiSW5wdXRXaXRoVmFsdWVIZWxwXCIgfHwgdmFsdWVzLmlucHV0VHlwZSA9PT0gXCJJbnB1dFdpdGhVbml0XCIpICYmICF2YWx1ZXMudmFsdWVMaXN0SW5mbykge1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fc2V0VmFsdWVMaXN0SW5mbyh0cmFuc0N0eCwgc291cmNlLCBmaWVsZEluZm9Nb2RlbCwgcHJvcGVydHlOYW1lKTtcblx0XHR9XG5cblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aE91dFBhcmFtZXRlcnMoZmllbGRJbmZvTW9kZWwsIHByb3BlcnR5TmFtZSwgZmFsc2UsIHRydWUpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoSW5QYXJhbWV0ZXJzKGZpZWxkSW5mb01vZGVsLCBwcm9wZXJ0eU5hbWUsIGZhbHNlLCB0cnVlKTtcblxuXHRcdGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gc291cmNlLmdldEZvcm1Gb3JtYXR0ZWRWYWx1ZSgpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVNlbGVjdEtleShzb3VyY2UsIHByb3BlcnR5TmFtZSwgdmFsdWUsIGZvcm1hdHRlZFZhbHVlKTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIHN1Z2dlc3RzIGZvciBhbGwgZHJvcCBkb3ducyB3aXRoIEluUGFyYW1ldGVyIGFzIHRoZSBwcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHJlc2V0VmFsdWVzIFNob3VsZCB0aGUgdmFsdWVzIGJlIHJlc2V0IHRvIG9yaWdpbmFsIHN0YXRlLlxuXHQgKiBAcGFyYW0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoSW5QYXJhbWV0ZXJzOiBmdW5jdGlvbiAoXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRwcm9wZXJ0eU5hbWU6IHN0cmluZyxcblx0XHRyZXNldFZhbHVlczogYm9vbGVhbixcblx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb246IGJvb2xlYW5cblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgdmFsdWVzID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzXCIpO1xuXHRcdGNvbnN0IHVuaXREYXRhID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdW5pdERhdGFcIik7XG5cdFx0Y29uc3QgZmllbGRQYXRocyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XG5cdFx0Y29uc3QgdW5pdEZpZWxkUGF0aHMgPSBPYmplY3Qua2V5cyh1bml0RGF0YSk7XG5cblx0XHRmaWVsZFBhdGhzLmZvckVhY2goXG5cdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVJblBhcmFtZXRlclN1Z2dldGlvbnMuYmluZChcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycyxcblx0XHRcdFx0ZmllbGRJbmZvTW9kZWwsXG5cdFx0XHRcdFwiL3ZhbHVlcy9cIixcblx0XHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0XHRyZXNldFZhbHVlcyxcblx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHQpXG5cdFx0KTtcblx0XHR1bml0RmllbGRQYXRocy5mb3JFYWNoKFxuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlSW5QYXJhbWV0ZXJTdWdnZXRpb25zLmJpbmQoXG5cdFx0XHRcdE1hc3NFZGl0SGFuZGxlcnMsXG5cdFx0XHRcdGZpZWxkSW5mb01vZGVsLFxuXHRcdFx0XHRcIi91bml0RGF0YS9cIixcblx0XHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0XHRyZXNldFZhbHVlcyxcblx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHQpXG5cdFx0KTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIHN1Z2dlc3RzIGZvciBhIGRyb3AgZG93biB3aXRoIEluUGFyYW1ldGVyIGFzIHRoZSBzcmNQcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwYXRoUHJlZml4IFBhdGggaW4gdGhlIHJ1bnRpbWUgbW9kZWwuXG5cdCAqIEBwYXJhbSBzcmNQcm9wZXJ0eU5hbWUgVGhlIEluUGFyYW1ldGVyIFByb3BlcnR5IHBhdGguXG5cdCAqIEBwYXJhbSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIGtlZXBFeGlzdGluZ1NlbGVjdGlvbiBTaG91bGQgdGhlIGV4aXN0aW5nIHNlbGVjdGlvbiBiZWZvcmUgdXBkYXRlIHJlbWFpbi5cblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoIHRoYXQgbmVlZHMgdXBkYXRlIG9mIHN1Z2dlc3Rpb25zLlxuXHQgKi9cblx0X3VwZGF0ZUluUGFyYW1ldGVyU3VnZ2V0aW9uczogZnVuY3Rpb24gKFxuXHRcdGZpZWxkSW5mb01vZGVsOiBKU09OTW9kZWwsXG5cdFx0cGF0aFByZWZpeDogc3RyaW5nLFxuXHRcdHNyY1Byb3BlcnR5TmFtZTogc3RyaW5nLFxuXHRcdHJlc2V0VmFsdWVzOiBib29sZWFuLFxuXHRcdGtlZXBFeGlzdGluZ1NlbGVjdGlvbjogYm9vbGVhbixcblx0XHRwcm9wZXJ0eU5hbWU6IHN0cmluZ1xuXHQpIHtcblx0XHRjb25zdCB2YWx1ZUxpc3RJbmZvID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYCR7cGF0aFByZWZpeCArIHByb3BlcnR5TmFtZX0vdmFsdWVMaXN0SW5mb2ApO1xuXHRcdGlmICh2YWx1ZUxpc3RJbmZvICYmIHNyY1Byb3BlcnR5TmFtZSAhPSBwcm9wZXJ0eU5hbWUpIHtcblx0XHRcdGNvbnN0IGluUGFyYW1ldGVycyA9IHZhbHVlTGlzdEluZm8uaW5QYXJhbWV0ZXJzO1xuXHRcdFx0aWYgKGluUGFyYW1ldGVycyAmJiBpblBhcmFtZXRlcnMubGVuZ3RoID4gMCAmJiBpblBhcmFtZXRlcnMuaW5jbHVkZXMoc3JjUHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgcGF0aFByZWZpeCArIHByb3BlcnR5TmFtZSwgcmVzZXRWYWx1ZXMsIGtlZXBFeGlzdGluZ1NlbGVjdGlvbik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGFsbCBPdXRQYXJhbWV0ZXIncyBkcm9wIGRvd25zIG9mIHRoZSBwcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHJlc2V0VmFsdWVzIFNob3VsZCB0aGUgdmFsdWVzIGJlIHJlc2V0IHRvIG9yaWdpbmFsIHN0YXRlLlxuXHQgKiBAcGFyYW0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoT3V0UGFyYW1ldGVyczogZnVuY3Rpb24gKFxuXHRcdGZpZWxkSW5mb01vZGVsOiBKU09OTW9kZWwsXG5cdFx0cHJvcGVydHlOYW1lOiBzdHJpbmcsXG5cdFx0cmVzZXRWYWx1ZXM6IGJvb2xlYW4sXG5cdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uOiBib29sZWFuXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IHZhbHVlTGlzdEluZm8gPVxuXHRcdFx0ZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gKSB8fFxuXHRcdFx0ZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX0vdmFsdWVMaXN0SW5mb2ApO1xuXG5cdFx0aWYgKHZhbHVlTGlzdEluZm8gJiYgdmFsdWVMaXN0SW5mby5vdXRQYXJhbWV0ZXJzKSB7XG5cdFx0XHRjb25zdCBvdXRQYXJhbWV0ZXJzID0gdmFsdWVMaXN0SW5mby5vdXRQYXJhbWV0ZXJzO1xuXHRcdFx0aWYgKG91dFBhcmFtZXRlcnMubGVuZ3RoICYmIG91dFBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVPdXRQYXJhbWV0ZXJTdWdnZXRpb25zKG91dFBhcmFtZXRlcnMsIGZpZWxkSW5mb01vZGVsLCByZXNldFZhbHVlcywga2VlcEV4aXN0aW5nU2VsZWN0aW9uKTtcblx0XHRcdFx0Y29uc3QgcGF0aFByZWZpeCA9XG5cdFx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApICYmIGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8XG5cdFx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKTtcblx0XHRcdFx0aWYgKHBhdGhQcmVmaXgpIHtcblx0XHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgcGF0aFByZWZpeCwgZmFsc2UsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGEgZHJvcCBkb3duIHdpdGggSW5QYXJhbWV0ZXIgYXMgdGhlIHNyY1Byb3BlcnR5TmFtZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBvdXRQYXJhbWV0ZXJzIFN0cmluZyBhcnJhcnkgb2YgT3V0UGFyYW1ldGVyIHByb3BlcnR5IHBhdGhzLlxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIGtlZXBFeGlzdGluZ1NlbGVjdGlvbiBTaG91bGQgdGhlIGV4aXN0aW5nIHNlbGVjdGlvbiBiZWZvcmUgdXBkYXRlIHJlbWFpbi5cblx0ICovXG5cdF91cGRhdGVPdXRQYXJhbWV0ZXJTdWdnZXRpb25zOiBmdW5jdGlvbiAoXG5cdFx0b3V0UGFyYW1ldGVyczogc3RyaW5nW10sXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRyZXNldFZhbHVlczogYm9vbGVhbixcblx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb246IGJvb2xlYW5cblx0KSB7XG5cdFx0Y29uc3QgdmFsdWVzID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzXCIpO1xuXHRcdGNvbnN0IHVuaXREYXRhID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdW5pdERhdGFcIik7XG5cdFx0Y29uc3QgZmllbGRQYXRocyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XG5cdFx0Y29uc3QgdW5pdEZpZWxkUGF0aHMgPSBPYmplY3Qua2V5cyh1bml0RGF0YSk7XG5cblx0XHRvdXRQYXJhbWV0ZXJzLmZvckVhY2goKG91dFBhcmFtZXRlcjogc3RyaW5nKSA9PiB7XG5cdFx0XHRpZiAoZmllbGRQYXRocy5pbmNsdWRlcyhvdXRQYXJhbWV0ZXIpKSB7XG5cdFx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZUZpZWxkUGF0aFN1Z2dlc3Rpb25zKGZpZWxkSW5mb01vZGVsLCBgL3ZhbHVlcy8ke291dFBhcmFtZXRlcn1gLCByZXNldFZhbHVlcywga2VlcEV4aXN0aW5nU2VsZWN0aW9uKTtcblx0XHRcdH0gZWxzZSBpZiAodW5pdEZpZWxkUGF0aHMuaW5jbHVkZXMob3V0UGFyYW1ldGVyKSkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhcblx0XHRcdFx0XHRmaWVsZEluZm9Nb2RlbCxcblx0XHRcdFx0XHRgL3VuaXREYXRhLyR7b3V0UGFyYW1ldGVyfWAsXG5cdFx0XHRcdFx0cmVzZXRWYWx1ZXMsXG5cdFx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZSBzdWdnZXN0cyBmb3IgYSBkcm9wIGRvd24gb2YgYSBmaWVsZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIGZpZWxkUGF0aEFic29sdXRlIENvbXBsZXRlIHJ1bnRpbWUgcHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHJlc2V0VmFsdWVzIFNob3VsZCB0aGUgdmFsdWVzIGJlIHJlc2V0IHRvIG9yaWdpbmFsIHN0YXRlLlxuXHQgKiBAcGFyYW0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZUZpZWxkUGF0aFN1Z2dlc3Rpb25zOiBmdW5jdGlvbiAoXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRmaWVsZFBhdGhBYnNvbHV0ZTogc3RyaW5nLFxuXHRcdHJlc2V0VmFsdWVzOiBib29sZWFuLFxuXHRcdGtlZXBFeGlzdGluZ1NlbGVjdGlvbjogYm9vbGVhblxuXHQpIHtcblx0XHRjb25zdCBvcHRpb25zID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoZmllbGRQYXRoQWJzb2x1dGUpO1xuXHRcdGNvbnN0IGRlZmF1bHRPcHRpb25zID0gb3B0aW9ucy5kZWZhdWx0T3B0aW9ucztcblx0XHRjb25zdCBzZWxlY3RlZEtleSA9IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAke2ZpZWxkUGF0aEFic29sdXRlfS9zZWxlY3RlZEtleWApO1xuXHRcdGNvbnN0IGV4aXN0aW5nU2VsZWN0aW9uID0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uICYmIG9wdGlvbnMuZmluZCgob3B0aW9uOiBhbnkpID0+IG9wdGlvbi5rZXkgPT09IHNlbGVjdGVkS2V5KTtcblx0XHRpZiAocmVzZXRWYWx1ZXMpIHtcblx0XHRcdGNvbnN0IHNlbGVjdE9wdGlvbnMgPSBvcHRpb25zLnNlbGVjdE9wdGlvbnM7XG5cdFx0XHRvcHRpb25zLmxlbmd0aCA9IDA7XG5cdFx0XHRkZWZhdWx0T3B0aW9ucy5mb3JFYWNoKChkZWZhdWx0T3B0aW9uOiBhbnkpID0+IG9wdGlvbnMucHVzaChkZWZhdWx0T3B0aW9uKSk7XG5cdFx0XHRzZWxlY3RPcHRpb25zLmZvckVhY2goKHNlbGVjdE9wdGlvbjogYW55KSA9PiBvcHRpb25zLnB1c2goc2VsZWN0T3B0aW9uKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9wdGlvbnMubGVuZ3RoID0gMDtcblx0XHRcdGRlZmF1bHRPcHRpb25zLmZvckVhY2goKGRlZmF1bHRPcHRpb246IGFueSkgPT4gb3B0aW9ucy5wdXNoKGRlZmF1bHRPcHRpb24pKTtcblx0XHR9XG5cblx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShmaWVsZFBhdGhBYnNvbHV0ZSwgb3B0aW9ucyk7XG5cblx0XHRpZiAoZXhpc3RpbmdTZWxlY3Rpb24gJiYgIW9wdGlvbnMuaW5jbHVkZXMoZXhpc3RpbmdTZWxlY3Rpb24pKSB7XG5cdFx0XHRvcHRpb25zLnB1c2goZXhpc3RpbmdTZWxlY3Rpb24pO1xuXHRcdFx0ZmllbGRJbmZvTW9kZWwuc2V0UHJvcGVydHkoYCR7ZmllbGRQYXRoQWJzb2x1dGV9L3NlbGVjdGVkS2V5YCwgc2VsZWN0ZWRLZXkpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIEluIGFuZCBPdXQgUGFyYW1ldGVycyBpbiB0aGUgTUVELlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHRyYW5zQ3R4IFRoZSB0cmFuc2llbnQgY29udGV4dCBvZiB0aGUgTUVELlxuXHQgKiBAcGFyYW0gc291cmNlIE1EQyBmaWVsZC5cblx0ICogQHBhcmFtIGZpZWxkSW5mb01vZGVsIFJ1bnRpbWUgbW9kZWwgd2l0aCBwYXJhbWV0ZXJzIHN0b3JlIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqL1xuXHRfc2V0VmFsdWVMaXN0SW5mbzogZnVuY3Rpb24gKHRyYW5zQ3R4OiBDb250ZXh0LCBzb3VyY2U6IEZpZWxkLCBmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IHByb3BQYXRoID1cblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3ZhbHVlcy8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi92YWx1ZXMvXCIpIHx8XG5cdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi91bml0RGF0YS9cIik7XG5cblx0XHRpZiAoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYCR7cHJvcFBhdGh9JHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBmaWVsZFZhbHVlSGVscCA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFZhbHVlSGVscCh0cmFuc0N0eCwgc291cmNlKTtcblx0XHRpZiAoZmllbGRWYWx1ZUhlbHAgJiYgZmllbGRWYWx1ZUhlbHAuZ2V0RGlhbG9nQ29udGVudCgpLmdldFRhYmxlKCkpIHtcblx0XHRcdGNvbnN0IGluUGFyYW1ldGVycyA9IChmaWVsZFZhbHVlSGVscC5nZXRJblBhcmFtZXRlcnMoKSB8fCBbXSkubWFwKChpblBhcmFtOiBJblBhcmFtZXRlcikgPT4gaW5QYXJhbS5nZXRGaWVsZFBhdGgoKSk7XG5cdFx0XHRjb25zdCBvdXRQYXJhbWV0ZXJzID0gKGZpZWxkVmFsdWVIZWxwLmdldEluUGFyYW1ldGVycygpIHx8IFtdKS5tYXAoKG91dFBhcmFtOiBPdXRQYXJhbWV0ZXIpID0+IG91dFBhcmFtLmdldEZpZWxkUGF0aCgpKTtcblx0XHRcdGNvbnN0IGluZm86IGFueSA9IHtcblx0XHRcdFx0aW5QYXJhbWV0ZXJzOiBpblBhcmFtZXRlcnMubWFwKChpblBhcmFtOiBhbnkpID0+IGluUGFyYW0uZ2V0RmllbGRQYXRoKCkpLFxuXHRcdFx0XHRvdXRQYXJhbWV0ZXJzOiBvdXRQYXJhbWV0ZXJzLm1hcCgob3V0UGFyYW06IGFueSkgPT4gb3V0UGFyYW0uZ2V0RmllbGRQYXRoKCkpXG5cdFx0XHR9O1xuXHRcdFx0ZmllbGRJbmZvTW9kZWwuc2V0UHJvcGVydHkoYCR7cHJvcFBhdGh9JHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gLCBpbmZvKTtcblx0XHRcdGlmIChpbmZvLm91dFBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9YCwgZmFsc2UsIHRydWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl9yZXF1ZXN0VmFsdWVMaXN0KHRyYW5zQ3R4LCBzb3VyY2UsIGZpZWxkSW5mb01vZGVsLCBwcm9wZXJ0eU5hbWUpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogUmVxdWVzdCBhbmQgdXBkYXRlIEluIGFuZCBPdXQgUGFyYW1ldGVycyBpbiB0aGUgTUVELlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHRyYW5zQ3R4IFRoZSB0cmFuc2llbnQgY29udGV4dCBvZiB0aGUgTUVELlxuXHQgKiBAcGFyYW0gc291cmNlIE1EQyBmaWVsZC5cblx0ICogQHBhcmFtIGZpZWxkSW5mb01vZGVsIFJ1bnRpbWUgbW9kZWwgd2l0aCBwYXJhbWV0ZXJzIHN0b3JlIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqL1xuXHRfcmVxdWVzdFZhbHVlTGlzdDogZnVuY3Rpb24gKHRyYW5zQ3R4OiBDb250ZXh0LCBzb3VyY2U6IEZpZWxkLCBmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IG1ldGFQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWV0YVBhdGhGb3JDb250ZXh0KHRyYW5zQ3R4KTtcblx0XHRjb25zdCBwcm9wZXJ0eVBhdGggPSAobWV0YVBhdGggJiYgYCR7bWV0YVBhdGh9LyR7cHJvcGVydHlOYW1lfWApIGFzIHN0cmluZztcblx0XHRjb25zdCBkZXBlbmRlbnRzID0gc291cmNlPy5nZXREZXBlbmRlbnRzKCk7XG5cdFx0Y29uc3QgZmllbGRIZWxwID0gc291cmNlPy5nZXRGaWVsZEhlbHAoKTtcblx0XHRjb25zdCBmaWVsZFZhbHVlSGVscCA9IGRlcGVuZGVudHM/LmZpbmQoKGRlcGVuZGVudDogYW55KSA9PiBkZXBlbmRlbnQuZ2V0SWQoKSA9PT0gZmllbGRIZWxwKTtcblx0XHRpZiAoIWZpZWxkVmFsdWVIZWxwPy5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRmaWVsZFZhbHVlSGVscD8uc2V0QmluZGluZ0NvbnRleHQodHJhbnNDdHgpO1xuXHRcdH1cblx0XHRjb25zdCBtZXRhTW9kZWwgPSB0cmFuc0N0eC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFZhbHVlTGlzdEhlbHBlci5jcmVhdGVWSFVJTW9kZWwocHJvcGVydHlQYXRoLCBmaWVsZFZhbHVlSGVscCk7XG5cdFx0Y29uc3QgdmFsdWVMaXN0SW5mbyA9IFZhbHVlTGlzdEhlbHBlci5nZXRWYWx1ZUxpc3RJbmZvKGZpZWxkVmFsdWVIZWxwLCBtZXRhTW9kZWwsIHByb3BlcnR5UGF0aCkgYXMgUHJvbWlzZTxhbnk+O1xuXG5cdFx0dmFsdWVMaXN0SW5mb1xuXHRcdFx0LnRoZW4oKHZMaW5mbzogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHByb3BQYXRoID1cblx0XHRcdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgXCIvdmFsdWVzL1wiKSB8fFxuXHRcdFx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7cHJvcGVydHlOYW1lfWApICYmIFwiL3VuaXREYXRhL1wiKTtcblx0XHRcdFx0Y29uc3QgaW5mbzogYW55ID0ge1xuXHRcdFx0XHRcdGluUGFyYW1ldGVyczogdkxpbmZvLmluUGFyYW1ldGVycy5tYXAoKGluUGFyYW06IGFueSkgPT4gaW5QYXJhbS5nZXRGaWVsZFBhdGgoKSksXG5cdFx0XHRcdFx0b3V0UGFyYW1ldGVyczogdkxpbmZvLm91dFBhcmFtZXRlcnMubWFwKChvdXRQYXJhbTogYW55KSA9PiBvdXRQYXJhbS5nZXRGaWVsZFBhdGgoKSlcblx0XHRcdFx0fTtcblx0XHRcdFx0ZmllbGRJbmZvTW9kZWwuc2V0UHJvcGVydHkoYCR7cHJvcFBhdGh9JHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gLCBpbmZvKTtcblx0XHRcdFx0aWYgKGluZm8ub3V0UGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnMoZmllbGRJbmZvTW9kZWwsIGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWAsIGZhbHNlLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoKSA9PiB7XG5cdFx0XHRcdExvZy53YXJuaW5nKGBNYXNzIEVkaXQ6IENvdWxkbid0IGxvYWQgdmFsdWVMaXN0IGluZm8gZm9yICR7cHJvcGVydHlQYXRofWApO1xuXHRcdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCBmaWVsZCBoZWxwIGNvbnRyb2wgZnJvbSBNREMgZmllbGQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gdHJhbnNDdHggVGhlIHRyYW5zaWVudCBjb250ZXh0IG9mIHRoZSBNRUQuXG5cdCAqIEBwYXJhbSBzb3VyY2UgTURDIGZpZWxkLlxuXHQgKiBAcmV0dXJucyBGaWVsZCBIZWxwIGNvbnRyb2wuXG5cdCAqL1xuXHRfZ2V0VmFsdWVIZWxwOiBmdW5jdGlvbiAodHJhbnNDdHg6IENvbnRleHQsIHNvdXJjZTogRmllbGQpOiBhbnkge1xuXHRcdGNvbnN0IGRlcGVuZGVudHMgPSBzb3VyY2U/LmdldERlcGVuZGVudHMoKTtcblx0XHRjb25zdCBmaWVsZEhlbHAgPSBzb3VyY2U/LmdldEZpZWxkSGVscCgpO1xuXHRcdHJldHVybiBkZXBlbmRlbnRzPy5maW5kKChkZXBlbmRlbnQ6IGFueSkgPT4gZGVwZW5kZW50LmdldElkKCkgPT09IGZpZWxkSGVscCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENvbGxlZCBvbiBkcm9wIGRvd24gc2VsZWN0aW9uIG9mIFZIRCBvcHRpb24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gc291cmNlIEN1c3RvbSBNYXNzIEVkaXQgU2VsZWN0IGNvbnRyb2wuXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHNlbGVjdEtleSBQcmV2aW91cyBrZXkgYmVmb3JlIHRoZSBWSEQgd2FzIHNlbGVjdGVkLlxuXHQgKi9cblx0X29uVkhTZWxlY3Q6IGZ1bmN0aW9uIChzb3VyY2U6IGFueSwgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHNlbGVjdEtleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0Ly8gQ2FsbGVkIGZvclxuXHRcdC8vIDEuIFZIRCBzZWxlY3RlZC5cblxuXHRcdGNvbnN0IGZpZWxkSW5mb01vZGVsID0gc291cmNlICYmIHNvdXJjZS5nZXRNb2RlbChcImZpZWxkc0luZm9cIik7XG5cdFx0Y29uc3QgcHJvcFBhdGggPVxuXHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApICYmIFwiL3ZhbHVlcy9cIikgfHxcblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7cHJvcGVydHlOYW1lfWApICYmIFwiL3VuaXREYXRhL1wiKTtcblx0XHRjb25zdCB0cmFuc0N0eCA9IHNvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IGZpZWxkVmFsdWVIZWxwID0gTWFzc0VkaXRIYW5kbGVycy5fZ2V0VmFsdWVIZWxwKHRyYW5zQ3R4LCBzb3VyY2UuZ2V0UGFyZW50KCkpO1xuXHRcdGlmICghZmllbGRWYWx1ZUhlbHA/LmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdGZpZWxkVmFsdWVIZWxwPy5zZXRCaW5kaW5nQ29udGV4dCh0cmFuc0N0eCk7XG5cdFx0fVxuXHRcdHNvdXJjZS5maXJlVmFsdWVIZWxwUmVxdWVzdCgpO1xuXG5cdFx0ZmllbGRJbmZvTW9kZWwuc2V0UHJvcGVydHkoYCR7cHJvcFBhdGggKyBwcm9wZXJ0eU5hbWV9L3NlbGVjdGVkS2V5YCwgc2VsZWN0S2V5KTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0cyBQcm9wZXJ0eSBuYW1lIGZyb20gc2VsZWN0aW9uIGtleS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBrZXkgU2VsZWN0aW9uIGtleS5cblx0ICogQHJldHVybnMgUHJvcGVydHkgbmFtZS5cblx0ICovXG5cdF9nZXRQcm9wZXJ0eU5hbWVGcm9tS2V5OiBmdW5jdGlvbiAoa2V5OiBzdHJpbmcpIHtcblx0XHRsZXQgcHJvcGVydHlOYW1lID0gXCJcIjtcblx0XHRpZiAoa2V5LnN0YXJ0c1dpdGgoXCJEZWZhdWx0L1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIkNsZWFyRmllbGRWYWx1ZS9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJVc2VWYWx1ZUhlbHBWYWx1ZS9cIikpIHtcblx0XHRcdHByb3BlcnR5TmFtZSA9IGtleS5zdWJzdHJpbmcoa2V5LmluZGV4T2YoXCIvXCIpICsgMSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb3BlcnR5TmFtZSA9IGtleS5zdWJzdHJpbmcoMCwga2V5Lmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cdFx0fVxuXHRcdHJldHVybiBwcm9wZXJ0eU5hbWU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZSBzZWxlY3Rpb24gdG8gQ3VzdG9tIE1hc3MgRWRpdCBTZWxlY3QgZnJvbSBNREMgZmllbGQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gc291cmNlIE1EQyBmaWVsZC5cblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gdXBkYXRlLlxuXHQgKiBAcGFyYW0gZnVsbFRleHQgRnVsbCB0ZXh0IHRvIHVzZS5cblx0ICovXG5cdF91cGRhdGVTZWxlY3RLZXk6IGZ1bmN0aW9uIChzb3VyY2U6IEZpZWxkLCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgZnVsbFRleHQ/OiBhbnkpOiB2b2lkIHtcblx0XHQvLyBDYWxsZWQgZm9yXG5cdFx0Ly8gMS4gVkhEIHByb3BlcnR5IGNoYW5nZVxuXHRcdC8vIDIuIE91dCBQYXJhbWV0ZXJzLlxuXHRcdC8vIDMuIFRyYW5zaWVudCBjb250ZXh0IHByb3BlcnR5IGNoYW5nZS5cblxuXHRcdGNvbnN0IGNvbWJvQm94ID0gc291cmNlLmdldENvbnRlbnQoKSBhcyBDb21ib0JveDtcblx0XHRpZiAoIWNvbWJvQm94IHx8ICFwcm9wZXJ0eU5hbWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0bGV0IGtleTogc3RyaW5nID0gY29tYm9Cb3guZ2V0U2VsZWN0ZWRLZXkoKTtcblx0XHRpZiAoKGtleS5zdGFydHNXaXRoKFwiRGVmYXVsdC9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJDbGVhckZpZWxkVmFsdWUvXCIpKSAmJiAhdmFsdWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBmb3JtYXR0ZWRUZXh0ID0gTWFzc0VkaXRIYW5kbGVycy5fdmFsdWVFeGlzdHMoZnVsbFRleHQpID8gZnVsbFRleHQgOiB2YWx1ZTtcblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdGNvbnN0IHZhbHVlcyA9XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3ZhbHVlcy8ke3Byb3BlcnR5TmFtZX1gKSB8fCBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7cHJvcGVydHlOYW1lfWApIHx8IFtdO1xuXHRcdGNvbnN0IHByb3BQYXRoID1cblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3ZhbHVlcy8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi92YWx1ZXMvXCIpIHx8XG5cdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi91bml0RGF0YS9cIik7XG5cblx0XHRjb25zdCByZWxhdGVkRmllbGQgPSB2YWx1ZXMuZmluZCgoZmllbGREYXRhOiBhbnkpID0+IGZpZWxkRGF0YT8udGV4dEluZm8/LnZhbHVlID09PSB2YWx1ZSB8fCBmaWVsZERhdGEudGV4dCA9PT0gdmFsdWUpO1xuXG5cdFx0aWYgKHJlbGF0ZWRGaWVsZCkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRmdWxsVGV4dCAmJlxuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8gJiZcblx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHRJbmZvLmRlc2NyaXB0aW9uUGF0aCAmJlxuXHRcdFx0XHQocmVsYXRlZEZpZWxkLnRleHQgIT0gZm9ybWF0dGVkVGV4dCB8fCByZWxhdGVkRmllbGQudGV4dEluZm8uZnVsbFRleHQgIT0gZm9ybWF0dGVkVGV4dClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBVcGRhdGUgdGhlIGZ1bGwgdGV4dCBvbmx5IHdoZW4gcHJvdmlkZWQuXG5cdFx0XHRcdHJlbGF0ZWRGaWVsZC50ZXh0ID0gZm9ybWF0dGVkVGV4dDtcblx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHRJbmZvLmZ1bGxUZXh0ID0gZm9ybWF0dGVkVGV4dDtcblx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHRJbmZvLmRlc2NyaXB0aW9uID0gc291cmNlLmdldEFkZGl0aW9uYWxWYWx1ZSgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHJlbGF0ZWRGaWVsZC5rZXkgPT09IGtleSkge1xuXHRcdFx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShgJHtwcm9wUGF0aCArIHByb3BlcnR5TmFtZX0vc2VsZWN0ZWRLZXlgLCBrZXkpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRrZXkgPSByZWxhdGVkRmllbGQua2V5O1xuXHRcdH0gZWxzZSBpZiAoW3VuZGVmaW5lZCwgbnVsbCwgXCJcIl0uaW5kZXhPZih2YWx1ZSkgPT09IC0xKSB7XG5cdFx0XHRrZXkgPSBgJHtwcm9wZXJ0eU5hbWV9LyR7dmFsdWV9YDtcblx0XHRcdGNvbnN0IHNlbGVjdGlvbkluZm8gPSB7XG5cdFx0XHRcdHRleHQ6IGZvcm1hdHRlZFRleHQsXG5cdFx0XHRcdGtleSxcblx0XHRcdFx0dGV4dEluZm86IHtcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogc291cmNlLmdldEFkZGl0aW9uYWxWYWx1ZSgpLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aDogdmFsdWVzICYmIHZhbHVlcy50ZXh0SW5mbyAmJiB2YWx1ZXMudGV4dEluZm8uZGVzY3JpcHRpb25QYXRoLFxuXHRcdFx0XHRcdGZ1bGxUZXh0OiBmb3JtYXR0ZWRUZXh0LFxuXHRcdFx0XHRcdHRleHRBcnJhbmdlbWVudDogc291cmNlLmdldERpc3BsYXkoKSxcblx0XHRcdFx0XHR2YWx1ZTogc291cmNlLmdldFZhbHVlKCksXG5cdFx0XHRcdFx0dmFsdWVQYXRoOiBwcm9wZXJ0eU5hbWVcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdHZhbHVlcy5wdXNoKHNlbGVjdGlvbkluZm8pO1xuXHRcdFx0dmFsdWVzLnNlbGVjdE9wdGlvbnMgPSB2YWx1ZXMuc2VsZWN0T3B0aW9ucyB8fCBbXTtcblx0XHRcdHZhbHVlcy5zZWxlY3RPcHRpb25zLnB1c2goc2VsZWN0aW9uSW5mbyk7XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShwcm9wUGF0aCArIHByb3BlcnR5TmFtZSwgdmFsdWVzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0a2V5ID0gYERlZmF1bHQvJHtwcm9wZXJ0eU5hbWV9YDtcblx0XHR9XG5cblx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShgJHtwcm9wUGF0aCArIHByb3BlcnR5TmFtZX0vc2VsZWN0ZWRLZXlgLCBrZXkpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVJlc3VsdHMoY29tYm9Cb3gpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgVmFsdWUgZnJvbSBEcm9wIGRvd24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gc291cmNlIERyb3AgZG93biBjb250cm9sLlxuXHQgKiBAcmV0dXJucyBWYWx1ZSBvZiBzZWxlY3Rpb24uXG5cdCAqL1xuXHRfZ2V0VmFsdWU6IGZ1bmN0aW9uIChzb3VyY2U6IENvbnRyb2wpIHtcblx0XHRyZXR1cm4gc291cmNlLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpID09PSBcInNhcC5mZS5jb3JlLmNvbnRyb2xzLk1hc3NFZGl0U2VsZWN0XCJcblx0XHRcdD8gKHNvdXJjZSBhcyBTZWxlY3QpLmdldFNlbGVjdGVkSXRlbSgpPy5nZXRUZXh0KClcblx0XHRcdDogKHNvdXJjZSBhcyBDb21ib0JveCkuZ2V0VmFsdWUoKTtcblx0fSxcblxuXHRfZ2V0VmFsdWVPbkVtcHR5OiBmdW5jdGlvbiAob1NvdXJjZTogYW55LCBmaWVsZHNJbmZvTW9kZWw6IEpTT05Nb2RlbCwgdmFsdWU6IGFueSwgc1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0aWYgKCF2YWx1ZSkge1xuXHRcdFx0Y29uc3QgdmFsdWVzID1cblx0XHRcdFx0ZmllbGRzSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7c1Byb3BlcnR5TmFtZX1gKSB8fCBmaWVsZHNJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3NQcm9wZXJ0eU5hbWV9YCkgfHwgW107XG5cdFx0XHRpZiAodmFsdWVzLnVuaXRQcm9wZXJ0eSkge1xuXHRcdFx0XHR2YWx1ZSA9IDA7XG5cdFx0XHRcdG9Tb3VyY2Uuc2V0VmFsdWUodmFsdWUpO1xuXHRcdFx0fSBlbHNlIGlmICh2YWx1ZXMuaW5wdXRUeXBlID09PSBcIkNoZWNrQm94XCIpIHtcblx0XHRcdFx0dmFsdWUgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9LFxuXG5cdF92YWx1ZUV4aXN0czogZnVuY3Rpb24gKHZhbHVlOiBhbnkpIHtcblx0XHRyZXR1cm4gdmFsdWUgIT0gdW5kZWZpbmVkICYmIHZhbHVlICE9IG51bGw7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgc2VsZWN0aW9ucyB0byBydW50aW1lIG1vZGVsLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIG9Tb3VyY2UgRHJvcCBkb3duIGNvbnRyb2wuXG5cdCAqIEBwYXJhbSBhUGFyYW1zIFBhcnRzIG9mIGtleSBpbiBydW50aW1lIG1vZGVsLlxuXHQgKiBAcGFyYW0gdXBkYXRlVHJhbnNDdHggU2hvdWxkIHRyYW5zaWVudCBjb250ZXh0IGJlIHVwZGF0ZWQgd2l0aCB0aGUgdmFsdWUuXG5cdCAqL1xuXHRfdXBkYXRlUmVzdWx0czogZnVuY3Rpb24gKG9Tb3VyY2U6IGFueSwgYVBhcmFtczogQXJyYXk8c3RyaW5nPiA9IFtdLCB1cGRhdGVUcmFuc0N0eDogYm9vbGVhbikge1xuXHRcdC8vIENhbGxlZCBmb3Jcblx0XHQvLyAxLiBWSEQgcHJvcGVydHkgY2hhbmdlLlxuXHRcdC8vIDIuIE91dCBwYXJhbWV0ZXIuXG5cdFx0Ly8gMy4gdHJhbnNpZW50IGNvbnRleHQgcHJvcGVydHkgY2hhbmdlLlxuXHRcdGNvbnN0IGZpZWxkc0luZm9Nb2RlbCA9IG9Tb3VyY2UgJiYgb1NvdXJjZS5nZXRNb2RlbChcImZpZWxkc0luZm9cIik7XG5cdFx0Y29uc3Qgb0ZpZWxkc0luZm9EYXRhID0gZmllbGRzSW5mb01vZGVsICYmIGZpZWxkc0luZm9Nb2RlbC5nZXREYXRhKCk7XG5cdFx0bGV0IHZhbHVlID0gTWFzc0VkaXRIYW5kbGVycy5fZ2V0VmFsdWUob1NvdXJjZSBhcyBDb250cm9sKTtcblx0XHRhUGFyYW1zID0gYVBhcmFtcy5sZW5ndGggPiAwID8gYVBhcmFtcyA6IG9Tb3VyY2UgJiYgb1NvdXJjZS5nZXRTZWxlY3RlZEtleSgpICYmIG9Tb3VyY2UuZ2V0U2VsZWN0ZWRLZXkoKS5zcGxpdChcIi9cIik7XG5cblx0XHRsZXQgb0RhdGFPYmplY3Q7XG5cdFx0Y29uc3Qgc1Byb3BlcnR5TmFtZSA9IG9Tb3VyY2UuZGF0YShcImZpZWxkUGF0aFwiKTtcblxuXHRcdGlmIChhUGFyYW1zWzBdID09PSBcIkRlZmF1bHRcIikge1xuXHRcdFx0b0RhdGFPYmplY3QgPSB7XG5cdFx0XHRcdGtleVZhbHVlOiBhUGFyYW1zWzFdLFxuXHRcdFx0XHR2YWx1ZTogYVBhcmFtc1swXVxuXHRcdFx0fTtcblx0XHR9IGVsc2UgaWYgKGFQYXJhbXNbMF0gPT09IFwiQ2xlYXJGaWVsZFZhbHVlXCIpIHtcblx0XHRcdHZhbHVlID0gXCJcIjtcblx0XHRcdHZhbHVlID0gTWFzc0VkaXRIYW5kbGVycy5fZ2V0VmFsdWVPbkVtcHR5KG9Tb3VyY2UsIGZpZWxkc0luZm9Nb2RlbCwgdmFsdWUsIHNQcm9wZXJ0eU5hbWUpO1xuXHRcdFx0b0RhdGFPYmplY3QgPSB7XG5cdFx0XHRcdGtleVZhbHVlOiBhUGFyYW1zWzFdLFxuXHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdH07XG5cdFx0fSBlbHNlIGlmICghYVBhcmFtcykge1xuXHRcdFx0dmFsdWUgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZU9uRW1wdHkob1NvdXJjZSwgZmllbGRzSW5mb01vZGVsLCB2YWx1ZSwgc1Byb3BlcnR5TmFtZSk7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IHNQcm9wZXJ0eU5hbWUsXG5cdFx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gYVBhcmFtcy5zbGljZSgwLCAtMSkuam9pbihcIi9cIik7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlcyA9XG5cdFx0XHRcdGZpZWxkc0luZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3ZhbHVlcy8ke3Byb3BlcnR5TmFtZX1gKSB8fCBmaWVsZHNJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKSB8fCBbXTtcblxuXHRcdFx0Y29uc3QgcmVsYXRlZEZpZWxkID0gKHByb3BlcnR5VmFsdWVzIHx8IFtdKS5maW5kKGZ1bmN0aW9uIChvRmllbGREYXRhOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9GaWVsZERhdGE/LnRleHRJbmZvPy52YWx1ZSA9PT0gdmFsdWUgfHwgb0ZpZWxkRGF0YS50ZXh0ID09PSB2YWx1ZTtcblx0XHRcdH0pO1xuXHRcdFx0b0RhdGFPYmplY3QgPSB7XG5cdFx0XHRcdGtleVZhbHVlOiBwcm9wZXJ0eU5hbWUsXG5cdFx0XHRcdHZhbHVlOlxuXHRcdFx0XHRcdHJlbGF0ZWRGaWVsZC50ZXh0SW5mbyAmJiBNYXNzRWRpdEhhbmRsZXJzLl92YWx1ZUV4aXN0cyhyZWxhdGVkRmllbGQudGV4dEluZm8udmFsdWUpXG5cdFx0XHRcdFx0XHQ/IHJlbGF0ZWRGaWVsZC50ZXh0SW5mby52YWx1ZVxuXHRcdFx0XHRcdFx0OiByZWxhdGVkRmllbGQudGV4dFxuXHRcdFx0fTtcblx0XHR9XG5cdFx0bGV0IGJFeGlzdGluZ0VsZW1lbnRpbmRleCA9IC0xO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgb0ZpZWxkc0luZm9EYXRhLnJlc3VsdHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmIChvRmllbGRzSW5mb0RhdGEucmVzdWx0c1tpXS5rZXlWYWx1ZSA9PT0gb0RhdGFPYmplY3Qua2V5VmFsdWUpIHtcblx0XHRcdFx0YkV4aXN0aW5nRWxlbWVudGluZGV4ID0gaTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGJFeGlzdGluZ0VsZW1lbnRpbmRleCAhPT0gLTEpIHtcblx0XHRcdG9GaWVsZHNJbmZvRGF0YS5yZXN1bHRzW2JFeGlzdGluZ0VsZW1lbnRpbmRleF0gPSBvRGF0YU9iamVjdDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0ZpZWxkc0luZm9EYXRhLnJlc3VsdHMucHVzaChvRGF0YU9iamVjdCk7XG5cdFx0fVxuXHRcdGlmICh1cGRhdGVUcmFuc0N0eCAmJiAhb0RhdGFPYmplY3Qua2V5VmFsdWUuaW5jbHVkZXMoXCIvXCIpKSB7XG5cdFx0XHRjb25zdCB0cmFuc0N0eCA9IG9Tb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdGlmIChhUGFyYW1zWzBdID09PSBcIkRlZmF1bHRcIiB8fCBhUGFyYW1zWzBdID09PSBcIkNsZWFyRmllbGRWYWx1ZVwiKSB7XG5cdFx0XHRcdHRyYW5zQ3R4LnNldFByb3BlcnR5KG9EYXRhT2JqZWN0LmtleVZhbHVlLCBudWxsKTtcblx0XHRcdH0gZWxzZSBpZiAob0RhdGFPYmplY3QpIHtcblx0XHRcdFx0dHJhbnNDdHguc2V0UHJvcGVydHkob0RhdGFPYmplY3Qua2V5VmFsdWUsIG9EYXRhT2JqZWN0LnZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1hc3NFZGl0SGFuZGxlcnM7XG4iXX0=