@sapui5/sap.fe.core 1.102.0 → 1.103.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/package.json +5 -5
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +62 -26
  4. package/src/sap/fe/core/AppComponent.ts +56 -40
  5. package/src/sap/fe/core/AppStateHandler.js +10 -10
  6. package/src/sap/fe/core/AppStateHandler.ts +9 -9
  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 +236 -109
  10. package/src/sap/fe/core/CommonUtils.ts +252 -136
  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/BuildingBlockRuntime.js +8 -8
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +11 -10
  23. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +27 -27
  24. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +28 -26
  25. package/src/sap/fe/core/controllerextensions/EditFlow.js +129 -118
  26. package/src/sap/fe/core/controllerextensions/EditFlow.ts +154 -141
  27. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +9 -9
  28. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
  29. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +31 -26
  30. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +34 -35
  31. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +70 -70
  32. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +77 -77
  33. package/src/sap/fe/core/controllerextensions/InternalRouting.js +84 -78
  34. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +105 -101
  35. package/src/sap/fe/core/controllerextensions/KPIManagement.js +66 -68
  36. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
  37. package/src/sap/fe/core/controllerextensions/MassEdit.js +8 -8
  38. package/src/sap/fe/core/controllerextensions/MassEdit.ts +19 -26
  39. package/src/sap/fe/core/controllerextensions/MessageHandler.js +20 -12
  40. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +29 -14
  41. package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
  42. package/src/sap/fe/core/controllerextensions/PageReady.ts +94 -34
  43. package/src/sap/fe/core/controllerextensions/Paginator.js +21 -22
  44. package/src/sap/fe/core/controllerextensions/Paginator.ts +24 -25
  45. package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -6
  46. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  47. package/src/sap/fe/core/controllerextensions/Routing.js +10 -11
  48. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  49. package/src/sap/fe/core/controllerextensions/Share.js +22 -22
  50. package/src/sap/fe/core/controllerextensions/Share.ts +30 -29
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +46 -50
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
  53. package/src/sap/fe/core/controllerextensions/ViewState.js +65 -62
  54. package/src/sap/fe/core/controllerextensions/ViewState.ts +68 -63
  55. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
  56. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
  57. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +6 -6
  58. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +12 -17
  59. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -2
  60. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +4 -4
  61. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +7 -9
  62. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +18 -19
  63. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +184 -137
  64. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +253 -206
  65. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +113 -121
  66. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +148 -158
  67. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +198 -148
  68. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +223 -159
  69. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +24 -26
  70. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +35 -33
  71. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +78 -44
  72. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +90 -60
  73. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +52 -55
  74. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +55 -58
  75. package/src/sap/fe/core/controls/Any.js +9 -5
  76. package/src/sap/fe/core/controls/Any.ts +10 -4
  77. package/src/sap/fe/core/controls/CommandExecution.js +11 -25
  78. package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
  79. package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
  80. package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
  81. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +22 -22
  82. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
  83. package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -2
  84. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
  85. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
  86. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
  87. package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
  88. package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
  89. package/src/sap/fe/core/controls/FileWrapper.js +2 -2
  90. package/src/sap/fe/core/controls/FileWrapper.ts +11 -11
  91. package/src/sap/fe/core/controls/FilterBar.js +6 -2
  92. package/src/sap/fe/core/controls/FilterBar.ts +13 -9
  93. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
  94. package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
  95. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  96. package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
  97. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +3 -3
  98. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +16 -12
  99. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
  100. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -3
  101. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
  102. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +47 -47
  103. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +52 -52
  104. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
  105. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
  106. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
  107. package/src/sap/fe/core/converters/ConverterContext.js +26 -33
  108. package/src/sap/fe/core/converters/ConverterContext.ts +51 -60
  109. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  110. package/src/sap/fe/core/converters/ManifestSettings.ts +14 -14
  111. package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
  112. package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
  113. package/src/sap/fe/core/converters/MetaModelConverter.js +50 -32
  114. package/src/sap/fe/core/converters/MetaModelConverter.ts +145 -127
  115. package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
  116. package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
  117. package/src/sap/fe/core/converters/annotations/DataField.js +54 -34
  118. package/src/sap/fe/core/converters/annotations/DataField.ts +97 -75
  119. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1911 -1495
  120. package/src/sap/fe/core/converters/controls/Common/Action.js +50 -41
  121. package/src/sap/fe/core/converters/controls/Common/Action.ts +56 -46
  122. package/src/sap/fe/core/converters/controls/Common/Chart.js +14 -14
  123. package/src/sap/fe/core/converters/controls/Common/Chart.ts +23 -26
  124. package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
  125. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
  126. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +28 -28
  127. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +40 -36
  128. package/src/sap/fe/core/converters/controls/Common/Form.js +25 -27
  129. package/src/sap/fe/core/converters/controls/Common/Form.ts +37 -45
  130. package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
  131. package/src/sap/fe/core/converters/controls/Common/KPI.ts +35 -39
  132. package/src/sap/fe/core/converters/controls/Common/Table.js +174 -183
  133. package/src/sap/fe/core/converters/controls/Common/Table.ts +237 -250
  134. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
  135. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +144 -141
  136. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +45 -41
  137. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +64 -57
  138. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
  139. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
  140. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
  141. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
  142. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +67 -64
  143. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +69 -66
  144. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +73 -72
  145. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +98 -96
  146. package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
  147. package/src/sap/fe/core/converters/helpers/Aggregation.ts +10 -13
  148. package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
  149. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
  150. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -4
  151. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +9 -9
  152. package/src/sap/fe/core/converters/helpers/ID.js +46 -46
  153. package/src/sap/fe/core/converters/helpers/ID.ts +25 -25
  154. package/src/sap/fe/core/converters/helpers/Key.js +7 -7
  155. package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
  156. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  157. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -4
  158. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
  159. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
  160. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +46 -62
  161. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +54 -82
  162. package/src/sap/fe/core/converters/templates/ListReportConverter.js +30 -29
  163. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +40 -40
  164. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +39 -38
  165. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +52 -61
  166. package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
  167. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
  168. package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
  169. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
  170. package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
  171. package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
  172. package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
  173. package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
  174. package/src/sap/fe/core/formatters/StandardFormatter.js +89 -0
  175. package/src/sap/fe/core/formatters/StandardFormatter.ts +64 -0
  176. package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
  177. package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
  178. package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
  179. package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
  180. package/src/sap/fe/core/helpers/AppStartupHelper.js +15 -15
  181. package/src/sap/fe/core/helpers/AppStartupHelper.ts +37 -40
  182. package/src/sap/fe/core/helpers/BindingToolkit.js +1809 -0
  183. package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +365 -264
  184. package/src/sap/fe/core/helpers/ClassSupport.js +20 -11
  185. package/src/sap/fe/core/helpers/ClassSupport.ts +14 -10
  186. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
  187. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
  188. package/src/sap/fe/core/helpers/EditState.js +1 -6
  189. package/src/sap/fe/core/helpers/EditState.ts +5 -10
  190. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
  191. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
  192. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  193. package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
  194. package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
  195. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
  196. package/src/sap/fe/core/helpers/MassEditHelper.js +281 -254
  197. package/src/sap/fe/core/helpers/MassEditHelper.ts +337 -289
  198. package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
  199. package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
  200. package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
  201. package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
  202. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  203. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
  204. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
  205. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
  206. package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
  207. package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
  208. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  209. package/src/sap/fe/core/jsx-runtime/jsx.ts +8 -8
  210. package/src/sap/fe/core/library.js +42 -3
  211. package/src/sap/fe/core/library.ts +38 -0
  212. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
  213. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
  214. package/src/sap/fe/core/messagebundle.properties +49 -35
  215. package/src/sap/fe/core/messagebundle_ar.properties +13 -5
  216. package/src/sap/fe/core/messagebundle_bg.properties +13 -5
  217. package/src/sap/fe/core/messagebundle_ca.properties +13 -5
  218. package/src/sap/fe/core/messagebundle_cs.properties +13 -5
  219. package/src/sap/fe/core/messagebundle_cy.properties +14 -6
  220. package/src/sap/fe/core/messagebundle_da.properties +13 -5
  221. package/src/sap/fe/core/messagebundle_de.properties +15 -7
  222. package/src/sap/fe/core/messagebundle_el.properties +14 -6
  223. package/src/sap/fe/core/messagebundle_en.properties +9 -1
  224. package/src/sap/fe/core/messagebundle_en_GB.properties +11 -3
  225. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +7 -1
  226. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +9 -1
  227. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +44 -85
  228. package/src/sap/fe/core/messagebundle_es.properties +13 -5
  229. package/src/sap/fe/core/messagebundle_es_MX.properties +13 -5
  230. package/src/sap/fe/core/messagebundle_et.properties +13 -5
  231. package/src/sap/fe/core/messagebundle_fi.properties +14 -6
  232. package/src/sap/fe/core/messagebundle_fr.properties +14 -6
  233. package/src/sap/fe/core/messagebundle_fr_CA.properties +14 -6
  234. package/src/sap/fe/core/messagebundle_hi.properties +14 -6
  235. package/src/sap/fe/core/messagebundle_hr.properties +14 -6
  236. package/src/sap/fe/core/messagebundle_hu.properties +13 -5
  237. package/src/sap/fe/core/messagebundle_id.properties +13 -5
  238. package/src/sap/fe/core/messagebundle_it.properties +33 -25
  239. package/src/sap/fe/core/messagebundle_iw.properties +13 -5
  240. package/src/sap/fe/core/messagebundle_ja.properties +14 -6
  241. package/src/sap/fe/core/messagebundle_kk.properties +13 -5
  242. package/src/sap/fe/core/messagebundle_ko.properties +13 -5
  243. package/src/sap/fe/core/messagebundle_lt.properties +13 -5
  244. package/src/sap/fe/core/messagebundle_lv.properties +14 -6
  245. package/src/sap/fe/core/messagebundle_ms.properties +13 -5
  246. package/src/sap/fe/core/messagebundle_nl.properties +13 -5
  247. package/src/sap/fe/core/messagebundle_no.properties +13 -5
  248. package/src/sap/fe/core/messagebundle_pl.properties +13 -5
  249. package/src/sap/fe/core/messagebundle_pt.properties +13 -5
  250. package/src/sap/fe/core/messagebundle_pt_PT.properties +14 -6
  251. package/src/sap/fe/core/messagebundle_ro.properties +13 -5
  252. package/src/sap/fe/core/messagebundle_ru.properties +13 -5
  253. package/src/sap/fe/core/messagebundle_sh.properties +13 -5
  254. package/src/sap/fe/core/messagebundle_sk.properties +13 -5
  255. package/src/sap/fe/core/messagebundle_sl.properties +17 -9
  256. package/src/sap/fe/core/messagebundle_sv.properties +14 -6
  257. package/src/sap/fe/core/messagebundle_th.properties +13 -5
  258. package/src/sap/fe/core/messagebundle_tr.properties +13 -5
  259. package/src/sap/fe/core/messagebundle_uk.properties +13 -5
  260. package/src/sap/fe/core/messagebundle_vi.properties +13 -5
  261. package/src/sap/fe/core/messagebundle_zh_CN.properties +14 -6
  262. package/src/sap/fe/core/messagebundle_zh_TW.properties +13 -5
  263. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  264. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
  265. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +2 -2
  266. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +14 -14
  267. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
  268. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
  269. package/src/sap/fe/core/services/NavigationServiceFactory.js +53 -44
  270. package/src/sap/fe/core/services/NavigationServiceFactory.ts +54 -46
  271. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
  272. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
  273. package/src/sap/fe/core/services/RoutingServiceFactory.js +55 -55
  274. package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
  275. package/src/sap/fe/core/services/ShellServicesFactory.js +72 -76
  276. package/src/sap/fe/core/services/ShellServicesFactory.ts +76 -82
  277. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +61 -61
  278. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
  279. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +20 -15
  280. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +26 -21
  281. package/src/sap/fe/core/support/CommonHelper.js +3 -2
  282. package/src/sap/fe/core/support/CommonHelper.ts +9 -13
  283. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  284. package/src/sap/fe/core/support/Diagnostics.ts +5 -5
  285. package/src/sap/fe/core/templating/CommonFormatters.js +84 -0
  286. package/src/sap/fe/core/templating/CommonFormatters.ts +86 -0
  287. package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
  288. package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
  289. package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
  290. package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
  291. package/src/sap/fe/core/templating/DataModelPathHelper.js +16 -15
  292. package/src/sap/fe/core/templating/DataModelPathHelper.ts +42 -32
  293. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  294. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
  295. package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
  296. package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
  297. package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
  298. package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
  299. package/src/sap/fe/core/templating/FilterHelper.js +10 -9
  300. package/src/sap/fe/core/templating/FilterHelper.ts +13 -13
  301. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  302. package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
  303. package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
  304. package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
  305. package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
  306. package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
  307. package/src/sap/fe/core/templating/UIFormatters.js +148 -93
  308. package/src/sap/fe/core/templating/UIFormatters.ts +196 -124
  309. package/src/sap/fe/core/type/Email.js +2 -2
  310. package/src/sap/fe/core/type/Email.ts +2 -2
  311. package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/formatters/ValueFormatter", "sap/fe/core/helpers/BindingExpression", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/DisplayModeFormatter", "sap/fe/core/templating/FieldControlHelper", "sap/fe/core/templating/PropertyHelper"], function (BindingHelper, MetaModelConverter, valueFormatters, BindingExpression, DataModelPathHelper, DisplayModeFormatter, FieldControlHelper, PropertyHelper) {
5
+ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/formatters/ValueFormatter", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/DisplayModeFormatter", "sap/fe/core/templating/FieldControlHelper", "sap/fe/core/templating/PropertyHelper"], function (BindingHelper, MetaModelConverter, valueFormatters, BindingToolkit, DataModelPathHelper, DisplayModeFormatter, FieldControlHelper, PropertyHelper) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
@@ -21,19 +21,21 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
21
21
  var isPathUpdatable = DataModelPathHelper.isPathUpdatable;
22
22
  var getTargetObjectPath = DataModelPathHelper.getTargetObjectPath;
23
23
  var getPathRelativeLocation = DataModelPathHelper.getPathRelativeLocation;
24
- var or = BindingExpression.or;
25
- var not = BindingExpression.not;
26
- var isTruthy = BindingExpression.isTruthy;
27
- var isConstant = BindingExpression.isConstant;
28
- var ifElse = BindingExpression.ifElse;
29
- var formatResult = BindingExpression.formatResult;
30
- var equal = BindingExpression.equal;
31
- var constant = BindingExpression.constant;
32
- var compileBinding = BindingExpression.compileBinding;
33
- var bindingExpression = BindingExpression.bindingExpression;
34
- var annotationExpression = BindingExpression.annotationExpression;
35
- var and = BindingExpression.and;
36
- var addTypeInformation = BindingExpression.addTypeInformation;
24
+ var getContextRelativeTargetObjectPath = DataModelPathHelper.getContextRelativeTargetObjectPath;
25
+ var pathInModel = BindingToolkit.pathInModel;
26
+ var or = BindingToolkit.or;
27
+ var notEqual = BindingToolkit.notEqual;
28
+ var not = BindingToolkit.not;
29
+ var isTruthy = BindingToolkit.isTruthy;
30
+ var isConstant = BindingToolkit.isConstant;
31
+ var ifElse = BindingToolkit.ifElse;
32
+ var getExpressionFromAnnotation = BindingToolkit.getExpressionFromAnnotation;
33
+ var formatResult = BindingToolkit.formatResult;
34
+ var equal = BindingToolkit.equal;
35
+ var constant = BindingToolkit.constant;
36
+ var compileExpression = BindingToolkit.compileExpression;
37
+ var and = BindingToolkit.and;
38
+ var addTypeInformation = BindingToolkit.addTypeInformation;
37
39
  var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
38
40
  var convertMetaModelContext = MetaModelConverter.convertMetaModelContext;
39
41
  var UI = BindingHelper.UI;
@@ -57,19 +59,28 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
57
59
  var getDisplayMode = function (oDataModelObjectPath) {
58
60
  return DisplayModeFormatter.getDisplayMode(oDataModelObjectPath.targetObject, oDataModelObjectPath);
59
61
  };
62
+
63
+ _exports.getDisplayMode = getDisplayMode;
64
+
65
+ var getEditableExpressionAsObject = function (oPropertyPath) {
66
+ var oDataFieldConverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
67
+ var oDataModelObjectPath = arguments.length > 2 ? arguments[2] : undefined;
68
+ var isEditable = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : UI.IsEditable;
69
+ return getEditableExpression(oPropertyPath, oDataFieldConverted, oDataModelObjectPath, true, isEditable);
70
+ };
60
71
  /**
61
72
  * Create the expression to generate an "editable" boolean value.
62
73
  *
63
- * @param {PropertyPath} oPropertyPath The input property
64
- * @param {object} oDataFieldConverted The DataFieldConverted object to read the fieldControl annotation
65
- * @param {DataModelObjectPath} oDataModelObjectPath The path to this property object
66
- * @param {boolean} bAsObject Whether or not this should be returned as an object or a binding string
67
- * @param {boolean} isEditable Whether or not UI.IsEditable be considered.
68
- * @returns {string} The binding expression used to determine if a property is editable or not
74
+ * @param oPropertyPath The input property
75
+ * @param oDataFieldConverted The DataFieldConverted object to read the fieldControl annotation
76
+ * @param oDataModelObjectPath The path to this property object
77
+ * @param bAsObject Whether or not this should be returned as an object or a binding string
78
+ * @param isEditable Whether or not UI.IsEditable be considered.
79
+ * @returns The binding expression used to determine if a property is editable or not
69
80
  */
70
81
 
71
82
 
72
- _exports.getDisplayMode = getDisplayMode;
83
+ _exports.getEditableExpressionAsObject = getEditableExpressionAsObject;
73
84
 
74
85
  var getEditableExpression = function (oPropertyPath) {
75
86
  var oDataFieldConverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
@@ -78,10 +89,10 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
78
89
  var isEditable = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : UI.IsEditable;
79
90
 
80
91
  if (!oPropertyPath || typeof oPropertyPath === "string") {
81
- return compileBinding(false);
92
+ return compileExpression(false);
82
93
  }
83
94
 
84
- var dataFieldEditableExpression = true;
95
+ var dataFieldEditableExpression = constant(true);
85
96
 
86
97
  if (oDataFieldConverted !== null) {
87
98
  dataFieldEditableExpression = ifElse(isNonEditableExpression(oDataFieldConverted), false, isEditable);
@@ -110,7 +121,7 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
110
121
  return and(editableExpression, dataFieldEditableExpression);
111
122
  }
112
123
 
113
- return compileBinding(and(editableExpression, dataFieldEditableExpression));
124
+ return compileExpression(and(editableExpression, dataFieldEditableExpression));
114
125
  };
115
126
 
116
127
  _exports.getEditableExpression = getEditableExpression;
@@ -119,35 +130,41 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
119
130
  var _dataModelObjectPath$;
120
131
 
121
132
  var objectPath = getTargetObjectPath(dataModelObjectPath);
122
- var activityExpression = bindingExpression("/collaboration/activities" + objectPath, "internal");
133
+ var activityExpression = pathInModel("/collaboration/activities".concat(objectPath), "internal");
123
134
  var keys = dataModelObjectPath === null || dataModelObjectPath === void 0 ? void 0 : (_dataModelObjectPath$ = dataModelObjectPath.targetEntityType) === null || _dataModelObjectPath$ === void 0 ? void 0 : _dataModelObjectPath$.keys;
124
135
  var keysExpressions = [];
125
136
  keys === null || keys === void 0 ? void 0 : keys.forEach(function (key) {
126
- var keyExpression = bindingExpression(key.name);
137
+ var keyExpression = pathInModel(key.name);
127
138
  keysExpressions.push(keyExpression);
128
139
  });
129
140
  return formatResult([activityExpression].concat(keysExpressions), formatter);
130
141
  };
142
+
143
+ _exports.getCollaborationExpression = getCollaborationExpression;
144
+
145
+ var getEnabledExpressionAsObject = function (oPropertyPath, oDataFieldConverted) {
146
+ return getEnabledExpression(oPropertyPath, oDataFieldConverted, true);
147
+ };
131
148
  /**
132
149
  * Create the expression to generate an "enabled" boolean value.
133
150
  *
134
- * @param {PropertyPath} oPropertyPath The input property
135
- * @param {any} oDataFieldConverted The DataFieldConverted Object to read the fieldControl annotation
136
- * @param {boolean} bAsObject Whether or not this should be returned as an object or a binding string
137
- * @returns {string} The binding expression to determine if a property is enabled or not
151
+ * @param oPropertyPath The input property
152
+ * @param oDataFieldConverted The DataFieldConverted Object to read the fieldControl annotation
153
+ * @param bAsObject Whether or not this should be returned as an object or a binding string
154
+ * @returns The binding expression to determine if a property is enabled or not
138
155
  */
139
156
 
140
157
 
141
- _exports.getCollaborationExpression = getCollaborationExpression;
158
+ _exports.getEnabledExpressionAsObject = getEnabledExpressionAsObject;
142
159
 
143
160
  var getEnabledExpression = function (oPropertyPath, oDataFieldConverted) {
144
161
  var bAsObject = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
145
162
 
146
163
  if (!oPropertyPath || typeof oPropertyPath === "string") {
147
- return compileBinding(true);
164
+ return compileExpression(true);
148
165
  }
149
166
 
150
- var dataFieldEnabledExpression = true;
167
+ var dataFieldEnabledExpression = constant(true);
151
168
 
152
169
  if (oDataFieldConverted !== null) {
153
170
  dataFieldEnabledExpression = ifElse(isDisabledExpression(oDataFieldConverted), false, true);
@@ -162,18 +179,18 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
162
179
  return and(enabledExpression, dataFieldEnabledExpression);
163
180
  }
164
181
 
165
- return compileBinding(and(enabledExpression, dataFieldEnabledExpression));
182
+ return compileExpression(and(enabledExpression, dataFieldEnabledExpression));
166
183
  };
167
184
  /**
168
185
  * Create the expression to generate an "editMode" enum value.
169
186
  *
170
- * @param {PropertyPath} oPropertyPath The input property
171
- * @param {DataModelObjectPath} oDataModelObjectPath The list of data model objects that are involved to reach that property
172
- * @param {boolean} bMeasureReadOnly Whether we should set UoM / currency field mode to read only
173
- * @param {boolean} bAsObject Whether we should return this as an expression or as a string
174
- * @param {object} oDataFieldConverted The dataField object
175
- * @param {boolean} isEditable Whether or not UI.IsEditable be considered.
176
- * @returns {BindingExpression<string> | ExpressionOrPrimitive<string>} The binding expression representing the current property edit mode, compliant with the MDC Field definition of editMode.
187
+ * @param oPropertyPath The input property
188
+ * @param oDataModelObjectPath The list of data model objects that are involved to reach that property
189
+ * @param bMeasureReadOnly Whether we should set UoM / currency field mode to read only
190
+ * @param bAsObject Whether we should return this as an expression or as a string
191
+ * @param oDataFieldConverted The dataField object
192
+ * @param isEditable Whether or not UI.IsEditable be considered.
193
+ * @returns The binding expression representing the current property edit mode, compliant with the MDC Field definition of editMode.
177
194
  */
178
195
 
179
196
 
@@ -196,11 +213,11 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
196
213
  // if the unit field control is readonly -> EditableReadOnly
197
214
  // otherwise -> Editable
198
215
 
199
- var editableExpression = getEditableExpression(oPropertyPath, oDataFieldConverted, oDataModelObjectPath, true, isEditable);
200
- var enabledExpression = getEnabledExpression(oPropertyPath, oDataFieldConverted, true);
216
+ var editableExpression = getEditableExpressionAsObject(oPropertyPath, oDataFieldConverted, oDataModelObjectPath, isEditable);
217
+ var enabledExpression = getEnabledExpressionAsObject(oPropertyPath, oDataFieldConverted);
201
218
  var associatedCurrencyProperty = getAssociatedCurrencyProperty(oProperty);
202
219
  var unitProperty = associatedCurrencyProperty || getAssociatedUnitProperty(oProperty);
203
- var resultExpression = "Editable";
220
+ var resultExpression = constant("Editable");
204
221
 
205
222
  if (unitProperty) {
206
223
  resultExpression = ifElse(or(isReadOnlyExpression(unitProperty), isComputed(unitProperty), bMeasureReadOnly), "EditableReadOnly", "Editable");
@@ -215,7 +232,7 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
215
232
  return editModeExpression;
216
233
  }
217
234
 
218
- return compileBinding(editModeExpression);
235
+ return compileExpression(editModeExpression);
219
236
  };
220
237
 
221
238
  _exports.getEditMode = getEditMode;
@@ -228,9 +245,9 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
228
245
  var measure = currency ? currency : (_oPropertyDefinition$3 = oPropertyDefinition.annotations) === null || _oPropertyDefinition$3 === void 0 ? void 0 : (_oPropertyDefinition$4 = _oPropertyDefinition$3.Measures) === null || _oPropertyDefinition$4 === void 0 ? void 0 : _oPropertyDefinition$4.Unit;
229
246
 
230
247
  if (measure) {
231
- return compileBinding(or(isTruthy(annotationExpression(measure)), not(UI.IsTotal)));
248
+ return compileExpression(or(isTruthy(getExpressionFromAnnotation(measure)), not(UI.IsTotal)));
232
249
  } else {
233
- return compileBinding(constant(true));
250
+ return compileExpression(constant(true));
234
251
  }
235
252
  };
236
253
 
@@ -241,18 +258,18 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
241
258
  var unitProperty = getAssociatedCurrencyProperty(oProperty) || getAssociatedUnitProperty(oProperty);
242
259
 
243
260
  if (!unitProperty) {
244
- return compileBinding(sNonEditableValue);
261
+ return compileExpression(sNonEditableValue);
245
262
  }
246
263
 
247
264
  var editableExpression = and(not(isReadOnlyExpression(unitProperty)), not(isComputed(unitProperty)));
248
- return compileBinding(ifElse(editableExpression, sEditableValue, sNonEditableValue));
265
+ return compileExpression(ifElse(editableExpression, sEditableValue, sNonEditableValue));
249
266
  };
250
267
 
251
268
  _exports.ifUnitEditable = ifUnitEditable;
252
269
 
253
270
  var getFieldDisplay = function (oPropertyPath, sTargetDisplayMode, oComputedEditMode) {
254
271
  var oProperty = isPathExpression(oPropertyPath) && oPropertyPath.$target || oPropertyPath;
255
- return hasValueHelp(oProperty) ? compileBinding(sTargetDisplayMode) : compileBinding(ifElse(equal(oComputedEditMode, "Editable"), "Value", sTargetDisplayMode));
272
+ return hasValueHelp(oProperty) ? compileExpression(sTargetDisplayMode) : compileExpression(ifElse(equal(oComputedEditMode, "Editable"), "Value", sTargetDisplayMode));
256
273
  };
257
274
 
258
275
  _exports.getFieldDisplay = getFieldDisplay;
@@ -359,7 +376,7 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
359
376
  };
360
377
 
361
378
  if (isProperty(oProperty)) {
362
- var _oTargetMapping$const2, _oTargetMapping$const3, _oTargetMapping$const4, _oTargetMapping$const5, _oTargetMapping$const6, _oProperty$annotation7, _oProperty$annotation8, _oProperty$annotation9, _oProperty$annotation10, _oTargetMapping$const7, _oProperty$annotation11, _oProperty$annotation12, _oProperty$annotation13, _oProperty$annotation14, _oTargetMapping$const8, _annotations, _annotations$Common, _oTargetMapping$const9;
379
+ var _oTargetMapping$const2, _oTargetMapping$const3, _oTargetMapping$const4, _oTargetMapping$const5, _oTargetMapping$const6, _oProperty$annotation7, _oProperty$annotation8, _oProperty$annotation9, _oProperty$annotation10, _oTargetMapping$const7, _oProperty$annotation11, _oProperty$annotation12, _oProperty$annotation13, _oProperty$annotation14, _oTargetMapping$const8, _oProperty$annotation15, _oProperty$annotation16, _oTargetMapping$const9;
363
380
 
364
381
  propertyTypeConfig.constraints = {
365
382
  scale: (_oTargetMapping$const2 = oTargetMapping.constraints) !== null && _oTargetMapping$const2 !== void 0 && _oTargetMapping$const2.$Scale ? oProperty.scale : undefined,
@@ -368,7 +385,7 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
368
385
  nullable: (_oTargetMapping$const5 = oTargetMapping.constraints) !== null && _oTargetMapping$const5 !== void 0 && _oTargetMapping$const5.$Nullable ? oProperty.nullable : undefined,
369
386
  minimum: (_oTargetMapping$const6 = oTargetMapping.constraints) !== null && _oTargetMapping$const6 !== void 0 && _oTargetMapping$const6["@Org.OData.Validation.V1.Minimum/$Decimal"] && !isNaN((_oProperty$annotation7 = oProperty.annotations) === null || _oProperty$annotation7 === void 0 ? void 0 : (_oProperty$annotation8 = _oProperty$annotation7.Validation) === null || _oProperty$annotation8 === void 0 ? void 0 : _oProperty$annotation8.Minimum) ? "".concat((_oProperty$annotation9 = oProperty.annotations) === null || _oProperty$annotation9 === void 0 ? void 0 : (_oProperty$annotation10 = _oProperty$annotation9.Validation) === null || _oProperty$annotation10 === void 0 ? void 0 : _oProperty$annotation10.Minimum) : undefined,
370
387
  maximum: (_oTargetMapping$const7 = oTargetMapping.constraints) !== null && _oTargetMapping$const7 !== void 0 && _oTargetMapping$const7["@Org.OData.Validation.V1.Maximum/$Decimal"] && !isNaN((_oProperty$annotation11 = oProperty.annotations) === null || _oProperty$annotation11 === void 0 ? void 0 : (_oProperty$annotation12 = _oProperty$annotation11.Validation) === null || _oProperty$annotation12 === void 0 ? void 0 : _oProperty$annotation12.Maximum) ? "".concat((_oProperty$annotation13 = oProperty.annotations) === null || _oProperty$annotation13 === void 0 ? void 0 : (_oProperty$annotation14 = _oProperty$annotation13.Validation) === null || _oProperty$annotation14 === void 0 ? void 0 : _oProperty$annotation14.Maximum) : undefined,
371
- isDigitSequence: propertyTypeConfig.type === "sap.ui.model.odata.type.String" && (_oTargetMapping$const8 = oTargetMapping.constraints) !== null && _oTargetMapping$const8 !== void 0 && _oTargetMapping$const8["@com.sap.vocabularies.Common.v1.IsDigitSequence"] && (_annotations = oProperty.annotations) !== null && _annotations !== void 0 && (_annotations$Common = _annotations.Common) !== null && _annotations$Common !== void 0 && _annotations$Common.IsDigitSequence ? true : undefined,
388
+ isDigitSequence: propertyTypeConfig.type === "sap.ui.model.odata.type.String" && (_oTargetMapping$const8 = oTargetMapping.constraints) !== null && _oTargetMapping$const8 !== void 0 && _oTargetMapping$const8["@com.sap.vocabularies.Common.v1.IsDigitSequence"] && (_oProperty$annotation15 = oProperty.annotations) !== null && _oProperty$annotation15 !== void 0 && (_oProperty$annotation16 = _oProperty$annotation15.Common) !== null && _oProperty$annotation16 !== void 0 && _oProperty$annotation16.IsDigitSequence ? true : undefined,
372
389
  V4: (_oTargetMapping$const9 = oTargetMapping.constraints) !== null && _oTargetMapping$const9 !== void 0 && _oTargetMapping$const9.$V4 ? true : undefined
373
390
  };
374
391
  }
@@ -383,7 +400,7 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
383
400
 
384
401
  _exports.getTypeConfig = getTypeConfig;
385
402
 
386
- var getBindingWithUnitOrCurrency = function (oPropertyDataModelPath, propertyBindingExpression, ignoreUnitConstraint) {
403
+ var getBindingWithUnitOrCurrency = function (oPropertyDataModelPath, propertyBindingExpression, ignoreUnitConstraint, formatOptions) {
387
404
  var _oPropertyDefinition$5, _oPropertyDefinition$6, _unit, _oPropertyDefinition$7, _oPropertyDefinition$8;
388
405
 
389
406
  var oPropertyDefinition = oPropertyDataModelPath.targetObject;
@@ -399,23 +416,50 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
399
416
 
400
417
  var complexType = unit ? "sap.ui.model.odata.type.Unit" : "sap.ui.model.odata.type.Currency";
401
418
  unit = unit ? unit : (_oPropertyDefinition$7 = oPropertyDefinition.annotations) === null || _oPropertyDefinition$7 === void 0 ? void 0 : (_oPropertyDefinition$8 = _oPropertyDefinition$7.Measures) === null || _oPropertyDefinition$8 === void 0 ? void 0 : _oPropertyDefinition$8.ISOCurrency;
402
- var unitBindingExpression = unit.$target ? formatWithTypeInformation(unit.$target, annotationExpression(unit, relativeLocation), ignoreUnitConstraint) : annotationExpression(unit, relativeLocation);
403
- return addTypeInformation([propertyBindingExpression, unitBindingExpression], complexType);
419
+ var unitBindingExpression = unit.$target ? formatWithTypeInformation(unit.$target, getExpressionFromAnnotation(unit, relativeLocation), ignoreUnitConstraint) : getExpressionFromAnnotation(unit, relativeLocation);
420
+ return addTypeInformation([propertyBindingExpression, unitBindingExpression], complexType, undefined, formatOptions);
404
421
  };
405
422
 
406
423
  _exports.getBindingWithUnitOrCurrency = getBindingWithUnitOrCurrency;
407
424
 
425
+ var getBindingForUnitOrCurrency = function (oPropertyDataModelPath) {
426
+ var _oPropertyDefinition$9, _oPropertyDefinition$10, _unit2, _oPropertyDefinition$11, _oPropertyDefinition$12;
427
+
428
+ var oPropertyDefinition = oPropertyDataModelPath.targetObject;
429
+ var unit = (_oPropertyDefinition$9 = oPropertyDefinition.annotations) === null || _oPropertyDefinition$9 === void 0 ? void 0 : (_oPropertyDefinition$10 = _oPropertyDefinition$9.Measures) === null || _oPropertyDefinition$10 === void 0 ? void 0 : _oPropertyDefinition$10.Unit;
430
+
431
+ if (((_unit2 = unit) === null || _unit2 === void 0 ? void 0 : _unit2.toString()) === "%") {
432
+ return constant("%");
433
+ }
434
+
435
+ var relativeLocation = getPathRelativeLocation(oPropertyDataModelPath.contextLocation, oPropertyDataModelPath.navigationProperties).map(function (np) {
436
+ return np.name;
437
+ });
438
+ var complexType = unit ? "sap.ui.model.odata.type.Unit" : "sap.ui.model.odata.type.Currency";
439
+ unit = unit ? unit : (_oPropertyDefinition$11 = oPropertyDefinition.annotations) === null || _oPropertyDefinition$11 === void 0 ? void 0 : (_oPropertyDefinition$12 = _oPropertyDefinition$11.Measures) === null || _oPropertyDefinition$12 === void 0 ? void 0 : _oPropertyDefinition$12.ISOCurrency;
440
+ var unitBindingExpression = unit.$target ? formatWithTypeInformation(unit.$target, getExpressionFromAnnotation(unit, relativeLocation)) : getExpressionFromAnnotation(unit, relativeLocation);
441
+ var propertyBindingExpression = pathInModel(getContextRelativeTargetObjectPath(oPropertyDataModelPath));
442
+ propertyBindingExpression = formatWithTypeInformation(oPropertyDefinition, propertyBindingExpression, true);
443
+ return addTypeInformation([propertyBindingExpression, unitBindingExpression], complexType, undefined, {
444
+ parseKeepsEmptyString: true,
445
+ emptyString: "",
446
+ showNumber: false
447
+ });
448
+ };
449
+
450
+ _exports.getBindingForUnitOrCurrency = getBindingForUnitOrCurrency;
451
+
408
452
  var getBindingWithTimezone = function (oPropertyDataModelPath, propertyBindingExpression, ignoreUnitConstraint, hideTimezoneForEmptyValues) {
409
- var _oPropertyDefinition$9, _oPropertyDefinition$10;
453
+ var _oPropertyDefinition$13, _oPropertyDefinition$14;
410
454
 
411
455
  var oPropertyDefinition = oPropertyDataModelPath.targetObject;
412
- var timezone = (_oPropertyDefinition$9 = oPropertyDefinition.annotations) === null || _oPropertyDefinition$9 === void 0 ? void 0 : (_oPropertyDefinition$10 = _oPropertyDefinition$9.Common) === null || _oPropertyDefinition$10 === void 0 ? void 0 : _oPropertyDefinition$10.Timezone;
456
+ var timezone = (_oPropertyDefinition$13 = oPropertyDefinition.annotations) === null || _oPropertyDefinition$13 === void 0 ? void 0 : (_oPropertyDefinition$14 = _oPropertyDefinition$13.Common) === null || _oPropertyDefinition$14 === void 0 ? void 0 : _oPropertyDefinition$14.Timezone;
413
457
  var relativeLocation = getPathRelativeLocation(oPropertyDataModelPath.contextLocation, oPropertyDataModelPath.navigationProperties).map(function (np) {
414
458
  return np.name;
415
459
  });
416
460
  propertyBindingExpression = formatWithTypeInformation(oPropertyDefinition, propertyBindingExpression);
417
461
  var complexType = "sap.fe.core.type.DateTimeWithTimezone";
418
- var unitBindingExpression = timezone.$target ? formatWithTypeInformation(timezone.$target, annotationExpression(timezone, relativeLocation), ignoreUnitConstraint) : annotationExpression(timezone, relativeLocation);
462
+ var unitBindingExpression = timezone.$target ? formatWithTypeInformation(timezone.$target, getExpressionFromAnnotation(timezone, relativeLocation), ignoreUnitConstraint) : getExpressionFromAnnotation(timezone, relativeLocation);
419
463
  var formatOptions;
420
464
 
421
465
  if (hideTimezoneForEmptyValues) {
@@ -432,14 +476,14 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
432
476
  var getAlignmentExpression = function (oComputedEditMode) {
433
477
  var sAlignDisplay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "Begin";
434
478
  var sAlignEdit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "Begin";
435
- return compileBinding(ifElse(equal(oComputedEditMode, "Display"), sAlignDisplay, sAlignEdit));
479
+ return compileExpression(ifElse(equal(oComputedEditMode, "Display"), sAlignDisplay, sAlignEdit));
436
480
  };
437
481
  /**
438
482
  * Formatter helper to retrieve the converterContext from the metamodel context.
439
483
  *
440
- * @param {Context} oContext The original metamodel context
441
- * @param {ComputedAnnotationInterface} oInterface The current templating context
442
- * @returns {object} The ConverterContext representing that object
484
+ * @param oContext The original metamodel context
485
+ * @param oInterface The current templating context
486
+ * @returns The ConverterContext representing that object
443
487
  */
444
488
 
445
489
 
@@ -457,9 +501,9 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
457
501
  /**
458
502
  * Formatter helper to retrieve the data model objects that are involved from the metamodel context.
459
503
  *
460
- * @param {Context} oContext The original ODataMetaModel context
461
- * @param {ComputedAnnotationInterface} oInterface The current templating context
462
- * @returns {object[]} An array of entitysets and navproperties that are involved to get to a specific object in the metamodel
504
+ * @param oContext The original ODataMetaModel context
505
+ * @param oInterface The current templating context
506
+ * @returns An array of entitysets and navproperties that are involved to get to a specific object in the metamodel
463
507
  */
464
508
 
465
509
  _exports.getConverterContext = getConverterContext;
@@ -473,21 +517,8 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
473
517
  };
474
518
 
475
519
  getDataModelObjectPath.requiresIContext = true;
476
- /**
477
- * Retrieves the expressionBinding created out of a binding expression.
478
- *
479
- * @param {Expression<any>} expression The expression which needs to be compiled
480
- * @returns {BindingExpression<string>} The expression-binding string
481
- */
482
-
483
520
  _exports.getDataModelObjectPath = getDataModelObjectPath;
484
521
 
485
- var getExpressionBinding = function (expression) {
486
- return compileBinding(expression);
487
- };
488
-
489
- _exports.getExpressionBinding = getExpressionBinding;
490
-
491
522
  var isCollectionField = function (oDataModelPath) {
492
523
  var _oDataModelPath$navig;
493
524
 
@@ -521,31 +552,54 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
521
552
 
522
553
  _exports.isCollectionField = isCollectionField;
523
554
 
555
+ var getRequiredExpressionAsObject = function (oPropertyPath, oDataFieldConverted) {
556
+ var forceEditMode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
557
+ return getRequiredExpression(oPropertyPath, oDataFieldConverted, forceEditMode, true);
558
+ };
559
+
560
+ _exports.getRequiredExpressionAsObject = getRequiredExpressionAsObject;
561
+
524
562
  var getRequiredExpression = function (oPropertyPath, oDataFieldConverted) {
525
563
  var forceEditMode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
526
564
  var bAsObject = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
565
+ var oRequiredProperties = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
566
+ var returnExpression;
567
+ var aRequiredPropertiesFromInsertRestrictions = oRequiredProperties.requiredPropertiesFromInsertRestrictions || [];
568
+ var aRequiredPropertiesFromUpdateRestrictions = oRequiredProperties.requiredPropertiesFromUpdateRestrictions || [];
527
569
 
528
570
  if (!oPropertyPath || typeof oPropertyPath === "string") {
529
- return compileBinding(false);
530
- }
571
+ returnExpression = constant(false);
572
+ } else {
573
+ var dataFieldRequiredExpression = constant(true);
531
574
 
532
- var dataFieldRequiredExpression = true;
575
+ if (oDataFieldConverted !== null) {
576
+ dataFieldRequiredExpression = isRequiredExpression(oDataFieldConverted);
577
+ }
533
578
 
534
- if (oDataFieldConverted !== null) {
535
- dataFieldRequiredExpression = isRequiredExpression(oDataFieldConverted);
536
- }
579
+ var requiredPropertyFromInsertRestrictionsExpression = constant(false);
580
+ var requiredPropertyFromUpdateRestrictionsExpression = constant(false);
581
+ var oProperty = isPathExpression(oPropertyPath) && oPropertyPath.$target || oPropertyPath; // Enablement depends on the field control expression
582
+ // If the Field control is statically in Inapplicable (disabled) -> not enabled
537
583
 
538
- var oProperty = isPathExpression(oPropertyPath) && oPropertyPath.$target || oPropertyPath; // Enablement depends on the field control expression
539
- // If the Field control is statically in Inapplicable (disabled) -> not enabled
584
+ var requiredExpression = isRequiredExpression(oProperty);
585
+ var editMode = forceEditMode || UI.IsEditable;
586
+
587
+ if (aRequiredPropertiesFromInsertRestrictions.length && aRequiredPropertiesFromInsertRestrictions.includes(oPropertyPath.name)) {
588
+ requiredPropertyFromInsertRestrictionsExpression = and(constant(true), UI.IsCreateMode);
589
+ }
540
590
 
541
- var requiredExpression = isRequiredExpression(oProperty);
542
- var editMode = forceEditMode || UI.IsEditable;
591
+ if (aRequiredPropertiesFromUpdateRestrictions.length && aRequiredPropertiesFromUpdateRestrictions.includes(oPropertyPath.name)) {
592
+ requiredPropertyFromUpdateRestrictionsExpression = and(constant(true), notEqual(UI.IsCreateMode, true));
593
+ }
594
+
595
+ returnExpression = or(and(or(requiredExpression, dataFieldRequiredExpression), editMode), requiredPropertyFromInsertRestrictionsExpression, requiredPropertyFromUpdateRestrictionsExpression);
596
+ }
543
597
 
544
598
  if (bAsObject) {
545
- return and(or(requiredExpression, dataFieldRequiredExpression), editMode);
599
+ return returnExpression;
546
600
  }
547
601
 
548
- return compileBinding(and(or(requiredExpression, dataFieldRequiredExpression), editMode));
602
+ return compileExpression(returnExpression);
549
603
  };
550
604
 
551
605
  _exports.getRequiredExpression = getRequiredExpression;
@@ -598,15 +652,16 @@ sap.ui.define(["sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/conv
598
652
  }
599
653
 
600
654
  break;
655
+ // no default
601
656
  }
602
657
 
603
- isRequiredExpressions.push(getRequiredExpression(propertyPath, dataField, false, true));
658
+ isRequiredExpressions.push(getRequiredExpressionAsObject(propertyPath, dataField, false));
604
659
  }
605
660
 
606
- return compileBinding(or.apply(void 0, _toConsumableArray(isRequiredExpressions)));
661
+ return compileExpression(or.apply(void 0, _toConsumableArray(isRequiredExpressions)));
607
662
  };
608
663
 
609
664
  _exports.getRequiredExpressionForConnectedDataField = getRequiredExpressionForConnectedDataField;
610
665
  return _exports;
611
666
  }, false);
612
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlVJRm9ybWF0dGVycy50cyJdLCJuYW1lcyI6WyJFRE1fVFlQRV9NQVBQSU5HIiwiRGlzcGxheU1vZGVGb3JtYXR0ZXIiLCJnZXREaXNwbGF5TW9kZSIsIm9EYXRhTW9kZWxPYmplY3RQYXRoIiwidGFyZ2V0T2JqZWN0IiwiZ2V0RWRpdGFibGVFeHByZXNzaW9uIiwib1Byb3BlcnR5UGF0aCIsIm9EYXRhRmllbGRDb252ZXJ0ZWQiLCJiQXNPYmplY3QiLCJpc0VkaXRhYmxlIiwiVUkiLCJJc0VkaXRhYmxlIiwiY29tcGlsZUJpbmRpbmciLCJkYXRhRmllbGRFZGl0YWJsZUV4cHJlc3Npb24iLCJpZkVsc2UiLCJpc05vbkVkaXRhYmxlRXhwcmVzc2lvbiIsIm9Qcm9wZXJ0eSIsImlzUGF0aEV4cHJlc3Npb24iLCIkdGFyZ2V0IiwiaXNQYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiIsImlzUGF0aFVwZGF0YWJsZSIsInByb3BlcnR5UGF0aCIsInBhdGhWaXNpdG9yIiwicGF0aCIsIm5hdmlnYXRpb25QYXRocyIsInNpbmdsZXRvblBhdGhWaXNpdG9yIiwiY29udmVydGVkVHlwZXMiLCJlZGl0YWJsZUV4cHJlc3Npb24iLCJvciIsIm5vdCIsImlzQ29tcHV0ZWQiLCJpc0tleSIsImlzSW1tdXRhYmxlIiwiSXNUcmFuc2llbnRCaW5kaW5nIiwiYW5kIiwiZ2V0Q29sbGFib3JhdGlvbkV4cHJlc3Npb24iLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiZm9ybWF0dGVyIiwib2JqZWN0UGF0aCIsImdldFRhcmdldE9iamVjdFBhdGgiLCJhY3Rpdml0eUV4cHJlc3Npb24iLCJiaW5kaW5nRXhwcmVzc2lvbiIsImtleXMiLCJ0YXJnZXRFbnRpdHlUeXBlIiwia2V5c0V4cHJlc3Npb25zIiwiZm9yRWFjaCIsImtleSIsImtleUV4cHJlc3Npb24iLCJuYW1lIiwicHVzaCIsImZvcm1hdFJlc3VsdCIsImdldEVuYWJsZWRFeHByZXNzaW9uIiwiZGF0YUZpZWxkRW5hYmxlZEV4cHJlc3Npb24iLCJpc0Rpc2FibGVkRXhwcmVzc2lvbiIsImVuYWJsZWRFeHByZXNzaW9uIiwiZ2V0RWRpdE1vZGUiLCJiTWVhc3VyZVJlYWRPbmx5IiwiYXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSIsInVuaXRQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkiLCJyZXN1bHRFeHByZXNzaW9uIiwiaXNSZWFkT25seUV4cHJlc3Npb24iLCJyZWFkT25seUV4cHJlc3Npb24iLCJlZGl0TW9kZUV4cHJlc3Npb24iLCJpc0NvbnN0YW50IiwiaGFzVmFsaWRBbmFseXRpY2FsQ3VycmVuY3lPclVuaXQiLCJvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwib1Byb3BlcnR5RGVmaW5pdGlvbiIsImN1cnJlbmN5IiwiYW5ub3RhdGlvbnMiLCJNZWFzdXJlcyIsIklTT0N1cnJlbmN5IiwibWVhc3VyZSIsIlVuaXQiLCJpc1RydXRoeSIsImFubm90YXRpb25FeHByZXNzaW9uIiwiSXNUb3RhbCIsImNvbnN0YW50IiwiaWZVbml0RWRpdGFibGUiLCJzRWRpdGFibGVWYWx1ZSIsInNOb25FZGl0YWJsZVZhbHVlIiwiZ2V0RmllbGREaXNwbGF5Iiwic1RhcmdldERpc3BsYXlNb2RlIiwib0NvbXB1dGVkRWRpdE1vZGUiLCJoYXNWYWx1ZUhlbHAiLCJlcXVhbCIsImZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24iLCJwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uIiwiaWdub3JlQ29uc3RyYWludHMiLCJvdXRFeHByZXNzaW9uIiwiX3R5cGUiLCJvVGFyZ2V0TWFwcGluZyIsInR5cGUiLCJjb25zdHJhaW50cyIsIiRTY2FsZSIsInNjYWxlIiwidW5kZWZpbmVkIiwiJFByZWNpc2lvbiIsInByZWNpc2lvbiIsIiRNYXhMZW5ndGgiLCJtYXhMZW5ndGgiLCJudWxsYWJsZSIsIlZhbGlkYXRpb24iLCJNaW5pbXVtIiwiaXNOYU4iLCJtaW5pbXVtIiwiTWF4aW11bSIsIm1heGltdW0iLCJpbmRleE9mIiwiZm9ybWF0T3B0aW9ucyIsIk9iamVjdCIsImFzc2lnbiIsInBhcnNlQXNTdHJpbmciLCJlbXB0eVN0cmluZyIsInBhcnNlS2VlcHNFbXB0eVN0cmluZyIsIkNvbW1vbiIsIklzRGlnaXRTZXF1ZW5jZSIsImlzRGlnaXRTZXF1ZW5jZSIsIlY0IiwiZ2V0VHlwZUNvbmZpZyIsImRhdGFUeXBlIiwicHJvcGVydHlUeXBlQ29uZmlnIiwiaXNQcm9wZXJ0eSIsIiROdWxsYWJsZSIsIiRWNCIsImdldEJpbmRpbmdXaXRoVW5pdE9yQ3VycmVuY3kiLCJvUHJvcGVydHlEYXRhTW9kZWxQYXRoIiwiaWdub3JlVW5pdENvbnN0cmFpbnQiLCJ1bml0IiwicmVsYXRpdmVMb2NhdGlvbiIsImdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uIiwiY29udGV4dExvY2F0aW9uIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJtYXAiLCJucCIsInRvU3RyaW5nIiwidmFsdWVGb3JtYXR0ZXJzIiwiZm9ybWF0V2l0aFBlcmNlbnRhZ2UiLCJjb21wbGV4VHlwZSIsInVuaXRCaW5kaW5nRXhwcmVzc2lvbiIsImFkZFR5cGVJbmZvcm1hdGlvbiIsImdldEJpbmRpbmdXaXRoVGltZXpvbmUiLCJoaWRlVGltZXpvbmVGb3JFbXB0eVZhbHVlcyIsInRpbWV6b25lIiwiVGltZXpvbmUiLCJzaG93VGltZXpvbmVGb3JFbXB0eVZhbHVlcyIsImdldEFsaWdubWVudEV4cHJlc3Npb24iLCJzQWxpZ25EaXNwbGF5Iiwic0FsaWduRWRpdCIsImdldENvbnZlcnRlckNvbnRleHQiLCJvQ29udGV4dCIsIm9JbnRlcmZhY2UiLCJjb250ZXh0IiwiY29udmVydE1ldGFNb2RlbENvbnRleHQiLCJyZXF1aXJlc0lDb250ZXh0IiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImdldEV4cHJlc3Npb25CaW5kaW5nIiwiZXhwcmVzc2lvbiIsImlzQ29sbGVjdGlvbkZpZWxkIiwib0RhdGFNb2RlbFBhdGgiLCJsZW5ndGgiLCJoYXNPbmVUb01hbnlOYXZpZ2F0aW9uIiwiZmluZEluZGV4Iiwib05hdiIsImlzQ29sbGVjdGlvbiIsIm9Db250ZXh0TmF2IiwiZ2V0UmVxdWlyZWRFeHByZXNzaW9uIiwiZm9yY2VFZGl0TW9kZSIsImRhdGFGaWVsZFJlcXVpcmVkRXhwcmVzc2lvbiIsImlzUmVxdWlyZWRFeHByZXNzaW9uIiwicmVxdWlyZWRFeHByZXNzaW9uIiwiZWRpdE1vZGUiLCJnZXRSZXF1aXJlZEV4cHJlc3Npb25Gb3JDb25uZWN0ZWREYXRhRmllbGQiLCJkYXRhRmllbGRPYmplY3RQYXRoIiwiZGF0YSIsIkRhdGEiLCJkYXRhRmllbGRzIiwiaXNSZXF1aXJlZEV4cHJlc3Npb25zIiwiZGF0YUZpZWxkIiwiJFR5cGUiLCJWYWx1ZSIsIlRhcmdldCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvRE8sTUFBTUEsZ0JBQWdCLEdBQUdDLG9CQUFvQixDQUFDRCxnQkFBOUM7OztBQW1DQSxNQUFNRSxjQUFjLEdBQUcsVUFBVUMsb0JBQVYsRUFBa0U7QUFDL0YsV0FBT0Ysb0JBQW9CLENBQUNDLGNBQXJCLENBQW9DQyxvQkFBb0IsQ0FBQ0MsWUFBekQsRUFBdUVELG9CQUF2RSxDQUFQO0FBQ0EsR0FGTTtBQUlQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNPLE1BQU1FLHFCQUFxQixHQUFHLFVBQ3BDQyxhQURvQyxFQU0wQjtBQUFBLFFBSjlEQyxtQkFJOEQsdUVBSm5DLElBSW1DO0FBQUEsUUFIOURKLG9CQUc4RDtBQUFBLFFBRjlESyxTQUU4RCx1RUFGekMsS0FFeUM7QUFBQSxRQUQ5REMsVUFDOEQsdUVBRGpCQyxFQUFFLENBQUNDLFVBQ2M7O0FBQzlELFFBQUksQ0FBQ0wsYUFBRCxJQUFrQixPQUFPQSxhQUFQ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Q00iLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5hdmlnYXRpb25Qcm9wZXJ0eSwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlclwiO1xuaW1wb3J0IHsgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHsgUGF0aEFubm90YXRpb25FeHByZXNzaW9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3R5cGVzL0VkbVwiO1xuaW1wb3J0IHsgVUlBbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdHlwZXMvZ2VuZXJhdGVkL1VJXCI7XG5pbXBvcnQgeyBzaW5nbGV0b25QYXRoVmlzaXRvciwgVUkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0JpbmRpbmdIZWxwZXJcIjtcbmltcG9ydCB7IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0LCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB2YWx1ZUZvcm1hdHRlcnMgZnJvbSBcInNhcC9mZS9jb3JlL2Zvcm1hdHRlcnMvVmFsdWVGb3JtYXR0ZXJcIjtcbmltcG9ydCB7XG5cdGFkZFR5cGVJbmZvcm1hdGlvbixcblx0YW5kLFxuXHRhbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0YmluZGluZ0V4cHJlc3Npb24sXG5cdEJpbmRpbmdFeHByZXNzaW9uLFxuXHRCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb24sXG5cdGNvbXBpbGVCaW5kaW5nLFxuXHRjb25zdGFudCxcblx0ZXF1YWwsXG5cdEV4cHJlc3Npb24sXG5cdEV4cHJlc3Npb25PclByaW1pdGl2ZSxcblx0Zm9ybWF0UmVzdWx0LFxuXHRpZkVsc2UsXG5cdGlzQ29uc3RhbnQsXG5cdGlzVHJ1dGh5LFxuXHRub3QsXG5cdG9yXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdFeHByZXNzaW9uXCI7XG5pbXBvcnQge1xuXHREYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRnZXRQYXRoUmVsYXRpdmVMb2NhdGlvbixcblx0Z2V0VGFyZ2V0T2JqZWN0UGF0aCxcblx0aXNQYXRoVXBkYXRhYmxlXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCAqIGFzIERpc3BsYXlNb2RlRm9ybWF0dGVyIGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0Rpc3BsYXlNb2RlRm9ybWF0dGVyXCI7XG5pbXBvcnQge1xuXHRpc0Rpc2FibGVkRXhwcmVzc2lvbixcblx0aXNOb25FZGl0YWJsZUV4cHJlc3Npb24sXG5cdGlzUmVhZE9ubHlFeHByZXNzaW9uLFxuXHRpc1JlcXVpcmVkRXhwcmVzc2lvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9GaWVsZENvbnRyb2xIZWxwZXJcIjtcbmltcG9ydCB7XG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5LFxuXHRoYXNWYWx1ZUhlbHAsXG5cdGlzQ29tcHV0ZWQsXG5cdGlzSW1tdXRhYmxlLFxuXHRpc0tleSxcblx0aXNQYXRoRXhwcmVzc2lvbixcblx0aXNQcm9wZXJ0eVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5cbi8vIEltcG9ydC1leHBvcnQgbWV0aG9kIHVzZWQgYnkgdGhlIGNvbnZlcnRlciB0byB1c2UgdGhlbSBpbiB0aGUgdGVtcGxhdGluZyB0aHJvdWdoIHRoZSBVSUZvcm1hdHRlcnMuXG5leHBvcnQgdHlwZSBEaXNwbGF5TW9kZSA9IERpc3BsYXlNb2RlRm9ybWF0dGVyLkRpc3BsYXlNb2RlO1xuXG5leHBvcnQgY29uc3QgRURNX1RZUEVfTUFQUElORyA9IERpc3BsYXlNb2RlRm9ybWF0dGVyLkVETV9UWVBFX01BUFBJTkc7XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5T3JQYXRoPFA+ID0gc3RyaW5nIHwgUCB8IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPjtcbmV4cG9ydCB0eXBlIE1ldGFNb2RlbENvbnRleHQgPSB7XG5cdCRraW5kOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgQ29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlID0ge1xuXHRjb250ZXh0OiBDb250ZXh0O1xuXHRhcmd1bWVudHM/OiBhbnlbXTtcblx0JCR2YWx1ZUFzUHJvbWlzZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBjb25maWdUeXBlQ29uc3RyYWludHMgPSB7XG5cdHNjYWxlPzogbnVtYmVyO1xuXHRwcmVjaXNpb24/OiBudW1iZXI7XG5cdG1heExlbmd0aD86IG51bWJlcjtcblx0bnVsbGFibGU/OiBib29sZWFuO1xuXHRtaW5pbXVtPzogc3RyaW5nO1xuXHRtYXhpbXVtPzogc3RyaW5nO1xuXHRpc0RpZ2l0U2VxdWVuY2U/OiBib29sZWFuO1xuXHRWND86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBjb25maWdUeXBlZm9ybWF0T3B0aW9ucyA9IHtcblx0cGFyc2VBc1N0cmluZz86IGJvb2xlYW47XG5cdGVtcHR5U3RyaW5nPzogc3RyaW5nO1xuXHRwYXJzZUtlZXBzRW1wdHlTdHJpbmc/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgY29uZmlnVHlwZSA9IHtcblx0dHlwZTogc3RyaW5nO1xuXHRjb25zdHJhaW50czogY29uZmlnVHlwZUNvbnN0cmFpbnRzO1xuXHRmb3JtYXRPcHRpb25zOiBjb25maWdUeXBlZm9ybWF0T3B0aW9ucztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREaXNwbGF5TW9kZSA9IGZ1bmN0aW9uIChvRGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCk6IERpc3BsYXlNb2RlIHtcblx0cmV0dXJuIERpc3BsYXlNb2RlRm9ybWF0dGVyLmdldERpc3BsYXlNb2RlKG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCwgb0RhdGFNb2RlbE9iamVjdFBhdGgpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgdGhlIGV4cHJlc3Npb24gdG8gZ2VuZXJhdGUgYW4gXCJlZGl0YWJsZVwiIGJvb2xlYW4gdmFsdWUuXG4gKlxuICogQHBhcmFtIHtQcm9wZXJ0eVBhdGh9IG9Qcm9wZXJ0eVBhdGggVGhlIGlucHV0IHByb3BlcnR5XG4gKiBAcGFyYW0ge29iamVjdH0gb0RhdGFGaWVsZENvbnZlcnRlZCBUaGUgRGF0YUZpZWxkQ29udmVydGVkIG9iamVjdCB0byByZWFkIHRoZSBmaWVsZENvbnRyb2wgYW5ub3RhdGlvblxuICogQHBhcmFtIHtEYXRhTW9kZWxPYmplY3RQYXRofSBvRGF0YU1vZGVsT2JqZWN0UGF0aCBUaGUgcGF0aCB0byB0aGlzIHByb3BlcnR5IG9iamVjdFxuICogQHBhcmFtIHtib29sZWFufSBiQXNPYmplY3QgV2hldGhlciBvciBub3QgdGhpcyBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYW4gb2JqZWN0IG9yIGEgYmluZGluZyBzdHJpbmdcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNFZGl0YWJsZSBXaGV0aGVyIG9yIG5vdCBVSS5Jc0VkaXRhYmxlIGJlIGNvbnNpZGVyZWQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgYmluZGluZyBleHByZXNzaW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgcHJvcGVydHkgaXMgZWRpdGFibGUgb3Igbm90XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFZGl0YWJsZUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0b0RhdGFGaWVsZENvbnZlcnRlZDogYW55ID0gbnVsbCxcblx0b0RhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGJBc09iamVjdDogYm9vbGVhbiA9IGZhbHNlLFxuXHRpc0VkaXRhYmxlOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj4gPSBVSS5Jc0VkaXRhYmxlXG4pOiBCaW5kaW5nRXhwcmVzc2lvbjxib29sZWFuPiB8IEV4cHJlc3Npb25PclByaW1pdGl2ZTxib29sZWFuPiB7XG5cdGlmICghb1Byb3BlcnR5UGF0aCB8fCB0eXBlb2Ygb1Byb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhmYWxzZSk7XG5cdH1cblx0bGV0IGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbjogQmluZGluZ0V4cHJlc3Npb248Ym9vbGVhbj4gfCBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj4gPSB0cnVlO1xuXHRpZiAob0RhdGFGaWVsZENvbnZlcnRlZCAhPT0gbnVsbCkge1xuXHRcdGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbiA9IGlmRWxzZShpc05vbkVkaXRhYmxlRXhwcmVzc2lvbihvRGF0YUZpZWxkQ29udmVydGVkKSwgZmFsc2UsIGlzRWRpdGFibGUpO1xuXHR9XG5cblx0Y29uc3Qgb1Byb3BlcnR5OiBQcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXHQvLyBFZGl0YWJpbGl0eSBkZXBlbmRzIG9uIHRoZSBmaWVsZCBjb250cm9sIGV4cHJlc3Npb25cblx0Ly8gSWYgdGhlIEZpZWxkIGNvbnRyb2wgaXMgc3RhdGljYWxseSBpbiBSZWFkT25seSBvciBJbmFwcGxpY2FibGUgKGRpc2FibGVkKSAtPiBub3QgZWRpdGFibGVcblx0Ly8gSWYgdGhlIHByb3BlcnR5IGlzIGEga2V5IC0+IG5vdCBlZGl0YWJsZSBleGNlcHQgaW4gY3JlYXRpb24gaWYgbm90IGNvbXB1dGVkXG5cdC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBjb21wdXRlZCAtPiBub3QgZWRpdGFibGVcblx0Ly8gSWYgdGhlIHByb3BlcnR5IGlzIG5vdCB1cGRhdGFibGUgLT4gbm90IGVkaXRhYmxlXG5cdC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBpbW11dGFibGUgLT4gbm90IGVkaXRhYmxlIGV4Y2VwdCBpbiBjcmVhdGlvblxuXHQvLyBJZiB0aGUgRmllbGQgY29udHJvbCBpcyBhIHBhdGggcmVzb2x2aW5nIHRvIFJlYWRPbmx5IG9yIEluYXBwbGljYWJsZSAoZGlzYWJsZWQpICg8PSAxKSAtPiBub3QgZWRpdGFibGVcblx0Ly8gRWxzZSwgdG8gYmUgZWRpdGFibGUgeW91IG5lZWRcblx0Ly8gaW1tdXRhYmxlIGFuZCBrZXkgd2hpbGUgaW4gdGhlIGNyZWF0aW9uIHJvd1xuXHQvLyB1aS9pc0VkaXRhYmxlXG5cdGNvbnN0IGlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24gPSBpc1BhdGhVcGRhdGFibGUob0RhdGFNb2RlbE9iamVjdFBhdGgsIHtcblx0XHRwcm9wZXJ0eVBhdGg6IG9Qcm9wZXJ0eVBhdGgsXG5cdFx0cGF0aFZpc2l0b3I6IChwYXRoOiBzdHJpbmcsIG5hdmlnYXRpb25QYXRoczogc3RyaW5nW10pID0+XG5cdFx0XHRzaW5nbGV0b25QYXRoVmlzaXRvcihwYXRoLCBvRGF0YU1vZGVsT2JqZWN0UGF0aC5jb252ZXJ0ZWRUeXBlcywgbmF2aWdhdGlvblBhdGhzKVxuXHR9KTtcblx0Y29uc3QgZWRpdGFibGVFeHByZXNzaW9uID0gaWZFbHNlKFxuXHRcdG9yKFxuXHRcdFx0bm90KGlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24pLFxuXHRcdFx0aXNDb21wdXRlZChvUHJvcGVydHkpLFxuXHRcdFx0aXNLZXkob1Byb3BlcnR5KSxcblx0XHRcdGlzSW1tdXRhYmxlKG9Qcm9wZXJ0eSksXG5cdFx0XHRpc05vbkVkaXRhYmxlRXhwcmVzc2lvbihvUHJvcGVydHkpXG5cdFx0KSxcblx0XHRpZkVsc2Uob3IoaXNDb21wdXRlZChvUHJvcGVydHkpLCBpc05vbkVkaXRhYmxlRXhwcmVzc2lvbihvUHJvcGVydHkpKSwgZmFsc2UsIFVJLklzVHJhbnNpZW50QmluZGluZyksXG5cdFx0aXNFZGl0YWJsZVxuXHQpO1xuXHRpZiAoYkFzT2JqZWN0KSB7XG5cdFx0cmV0dXJuIGFuZChlZGl0YWJsZUV4cHJlc3Npb24sIGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbik7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGFuZChlZGl0YWJsZUV4cHJlc3Npb24sIGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbikpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbGxhYm9yYXRpb25FeHByZXNzaW9uID0gZnVuY3Rpb24gKGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsIGZvcm1hdHRlcjogYW55KTogQmluZGluZ0V4cHJlc3Npb248YW55PiB7XG5cdGNvbnN0IG9iamVjdFBhdGggPSBnZXRUYXJnZXRPYmplY3RQYXRoKGRhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRjb25zdCBhY3Rpdml0eUV4cHJlc3Npb24gPSBiaW5kaW5nRXhwcmVzc2lvbihcIi9jb2xsYWJvcmF0aW9uL2FjdGl2aXRpZXNcIiArIG9iamVjdFBhdGgsIFwiaW50ZXJuYWxcIik7XG5cdGNvbnN0IGtleXMgPSBkYXRhTW9kZWxPYmplY3RQYXRoPy50YXJnZXRFbnRpdHlUeXBlPy5rZXlzO1xuXHRjb25zdCBrZXlzRXhwcmVzc2lvbnM6IEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxhbnk+W10gPSBbXTtcblx0a2V5cz8uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0Y29uc3Qga2V5RXhwcmVzc2lvbiA9IGJpbmRpbmdFeHByZXNzaW9uKGtleS5uYW1lKSBhcyBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248YW55Pjtcblx0XHRrZXlzRXhwcmVzc2lvbnMucHVzaChrZXlFeHByZXNzaW9uKTtcblx0fSk7XG5cdHJldHVybiBmb3JtYXRSZXN1bHQoW2FjdGl2aXR5RXhwcmVzc2lvbiwgLi4ua2V5c0V4cHJlc3Npb25zXSwgZm9ybWF0dGVyKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBleHByZXNzaW9uIHRvIGdlbmVyYXRlIGFuIFwiZW5hYmxlZFwiIGJvb2xlYW4gdmFsdWUuXG4gKlxuICogQHBhcmFtIHtQcm9wZXJ0eVBhdGh9IG9Qcm9wZXJ0eVBhdGggVGhlIGlucHV0IHByb3BlcnR5XG4gKiBAcGFyYW0ge2FueX0gb0RhdGFGaWVsZENvbnZlcnRlZCBUaGUgRGF0YUZpZWxkQ29udmVydGVkIE9iamVjdCB0byByZWFkIHRoZSBmaWVsZENvbnRyb2wgYW5ub3RhdGlvblxuICogQHBhcmFtIHtib29sZWFufSBiQXNPYmplY3QgV2hldGhlciBvciBub3QgdGhpcyBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYW4gb2JqZWN0IG9yIGEgYmluZGluZyBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gdG8gZGV0ZXJtaW5lIGlmIGEgcHJvcGVydHkgaXMgZW5hYmxlZCBvciBub3RcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEVuYWJsZWRFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ/OiBhbnksXG5cdGJBc09iamVjdDogYm9vbGVhbiA9IGZhbHNlXG4pOiBCaW5kaW5nRXhwcmVzc2lvbjxib29sZWFuPiB8IEV4cHJlc3Npb25PclByaW1pdGl2ZTxib29sZWFuPiB7XG5cdGlmICghb1Byb3BlcnR5UGF0aCB8fCB0eXBlb2Ygb1Byb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyh0cnVlKTtcblx0fVxuXHRsZXQgZGF0YUZpZWxkRW5hYmxlZEV4cHJlc3Npb246IEJpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+ID0gdHJ1ZTtcblx0aWYgKG9EYXRhRmllbGRDb252ZXJ0ZWQgIT09IG51bGwpIHtcblx0XHRkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbiA9IGlmRWxzZShpc0Rpc2FibGVkRXhwcmVzc2lvbihvRGF0YUZpZWxkQ29udmVydGVkKSwgZmFsc2UsIHRydWUpO1xuXHR9XG5cblx0Y29uc3Qgb1Byb3BlcnR5OiBQcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXHQvLyBFbmFibGVtZW50IGRlcGVuZHMgb24gdGhlIGZpZWxkIGNvbnRyb2wgZXhwcmVzc2lvblxuXHQvLyBJZiB0aGUgRmllbGQgY29udHJvbCBpcyBzdGF0aWNhbGx5IGluIEluYXBwbGljYWJsZSAoZGlzYWJsZWQpIC0+IG5vdCBlbmFibGVkXG5cdGNvbnN0IGVuYWJsZWRFeHByZXNzaW9uID0gaWZFbHNlKGlzRGlzYWJsZWRFeHByZXNzaW9uKG9Qcm9wZXJ0eSksIGZhbHNlLCB0cnVlKTtcblx0aWYgKGJBc09iamVjdCkge1xuXHRcdHJldHVybiBhbmQoZW5hYmxlZEV4cHJlc3Npb24sIGRhdGFGaWVsZEVuYWJsZWRFeHByZXNzaW9uKTtcblx0fVxuXHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoYW5kKGVuYWJsZWRFeHByZXNzaW9uLCBkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbikpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgdGhlIGV4cHJlc3Npb24gdG8gZ2VuZXJhdGUgYW4gXCJlZGl0TW9kZVwiIGVudW0gdmFsdWUuXG4gKlxuICogQHBhcmFtIHtQcm9wZXJ0eVBhdGh9IG9Qcm9wZXJ0eVBhdGggVGhlIGlucHV0IHByb3BlcnR5XG4gKiBAcGFyYW0ge0RhdGFNb2RlbE9iamVjdFBhdGh9IG9EYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBsaXN0IG9mIGRhdGEgbW9kZWwgb2JqZWN0cyB0aGF0IGFyZSBpbnZvbHZlZCB0byByZWFjaCB0aGF0IHByb3BlcnR5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGJNZWFzdXJlUmVhZE9ubHkgV2hldGhlciB3ZSBzaG91bGQgc2V0IFVvTSAvIGN1cnJlbmN5IGZpZWxkIG1vZGUgdG8gcmVhZCBvbmx5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGJBc09iamVjdCBXaGV0aGVyIHdlIHNob3VsZCByZXR1cm4gdGhpcyBhcyBhbiBleHByZXNzaW9uIG9yIGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge29iamVjdH0gb0RhdGFGaWVsZENvbnZlcnRlZCBUaGUgZGF0YUZpZWxkIG9iamVjdFxuICogQHBhcmFtIHtib29sZWFufSBpc0VkaXRhYmxlIFdoZXRoZXIgb3Igbm90IFVJLklzRWRpdGFibGUgYmUgY29uc2lkZXJlZC5cbiAqIEByZXR1cm5zIHtCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPHN0cmluZz59IFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHByb3BlcnR5IGVkaXQgbW9kZSwgY29tcGxpYW50IHdpdGggdGhlIE1EQyBGaWVsZCBkZWZpbml0aW9uIG9mIGVkaXRNb2RlLlxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdE1vZGUgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0b0RhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGJNZWFzdXJlUmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcblx0YkFzT2JqZWN0OiBib29sZWFuID0gZmFsc2UsXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ6IGFueSA9IG51bGwsXG5cdGlzRWRpdGFibGU6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxib29sZWFuPiA9IFVJLklzRWRpdGFibGVcbik6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4gfCBFeHByZXNzaW9uT3JQcmltaXRpdmU8c3RyaW5nPiB7XG5cdGlmICghb1Byb3BlcnR5UGF0aCB8fCB0eXBlb2Ygb1Byb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybiBcIkRpc3BsYXlcIjtcblx0fVxuXHRjb25zdCBvUHJvcGVydHk6IFByb3BlcnR5ID0gKGlzUGF0aEV4cHJlc3Npb24ob1Byb3BlcnR5UGF0aCkgJiYgb1Byb3BlcnR5UGF0aC4kdGFyZ2V0KSB8fCAob1Byb3BlcnR5UGF0aCBhcyBQcm9wZXJ0eSk7XG5cdC8vIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgZW5hYmxlZCA9PiBEaXNhYmxlZFxuXHQvLyBpZiB0aGUgcHJvcGVydHkgaXMgZW5hYmxlZCAmJiBub3QgZWRpdGFibGUgPT4gUmVhZE9ubHlcblx0Ly8gaWYgdGhlIHByb3BlcnR5IGlzIGVuYWJsZWQgJiYgZWRpdGFibGUgPT4gRWRpdGFibGVcblx0Ly8gSWYgdGhlcmUgaXMgYW4gYXNzb2NpYXRlZCB1bml0LCBhbmQgaXQgaGFzIGEgZmllbGQgY29udHJvbCBhbHNvIHVzZSBjb25zaWRlciB0aGUgZm9sbG93aW5nXG5cdC8vIGlmIHRoZSB1bml0IGZpZWxkIGNvbnRyb2wgaXMgcmVhZG9ubHkgLT4gRWRpdGFibGVSZWFkT25seVxuXHQvLyBvdGhlcndpc2UgLT4gRWRpdGFibGVcblx0Y29uc3QgZWRpdGFibGVFeHByZXNzaW9uID0gZ2V0RWRpdGFibGVFeHByZXNzaW9uKFxuXHRcdG9Qcm9wZXJ0eVBhdGgsXG5cdFx0b0RhdGFGaWVsZENvbnZlcnRlZCxcblx0XHRvRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHR0cnVlLFxuXHRcdGlzRWRpdGFibGVcblx0KSBhcyBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj47XG5cblx0Y29uc3QgZW5hYmxlZEV4cHJlc3Npb24gPSBnZXRFbmFibGVkRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoLCBvRGF0YUZpZWxkQ29udmVydGVkLCB0cnVlKSBhcyBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj47XG5cdGNvbnN0IGFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkob1Byb3BlcnR5KTtcblx0Y29uc3QgdW5pdFByb3BlcnR5ID0gYXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkgfHwgZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShvUHJvcGVydHkpO1xuXHRsZXQgcmVzdWx0RXhwcmVzc2lvbjogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPHN0cmluZz4gPSBcIkVkaXRhYmxlXCI7XG5cdGlmICh1bml0UHJvcGVydHkpIHtcblx0XHRyZXN1bHRFeHByZXNzaW9uID0gaWZFbHNlKFxuXHRcdFx0b3IoaXNSZWFkT25seUV4cHJlc3Npb24odW5pdFByb3BlcnR5KSwgaXNDb21wdXRlZCh1bml0UHJvcGVydHkpLCBiTWVhc3VyZVJlYWRPbmx5KSxcblx0XHRcdFwiRWRpdGFibGVSZWFkT25seVwiLFxuXHRcdFx0XCJFZGl0YWJsZVwiXG5cdFx0KTtcblx0fVxuXHRjb25zdCByZWFkT25seUV4cHJlc3Npb24gPSBvcihpc1JlYWRPbmx5RXhwcmVzc2lvbihvUHJvcGVydHkpLCBpc1JlYWRPbmx5RXhwcmVzc2lvbihvRGF0YUZpZWxkQ29udmVydGVkKSk7XG5cblx0Ly8gaWYgdGhlIHByb3BlcnR5IGlzIGZyb20gYSBub24tdXBkYXRhYmxlIGVudGl0eSA9PiBSZWFkIG9ubHkgbW9kZSwgcHJldmlvdXNseSBjYWxjdWxhdGVkIGVkaXQgTW9kZSBpcyBpZ25vcmVkXG5cdC8vIGlmIHRoZSBwcm9wZXJ0eSBpcyBmcm9tIGFuIHVwZGF0YWJsZSBlbnRpdHkgPT4gcHJldmlvdXNseSBjYWxjdWxhdGVkIGVkaXQgTW9kZSBleHByZXNzaW9uXG5cdGNvbnN0IGVkaXRNb2RlRXhwcmVzc2lvbiA9IGlmRWxzZShcblx0XHRlbmFibGVkRXhwcmVzc2lvbixcblx0XHRpZkVsc2UoXG5cdFx0XHRlZGl0YWJsZUV4cHJlc3Npb24sXG5cdFx0XHRyZXN1bHRFeHByZXNzaW9uLFxuXHRcdFx0aWZFbHNlKGFuZCghaXNDb25zdGFudChyZWFkT25seUV4cHJlc3Npb24pICYmIHJlYWRPbmx5RXhwcmVzc2lvbiwgaXNFZGl0YWJsZSksIFwiUmVhZE9ubHlcIiwgXCJEaXNwbGF5XCIpXG5cdFx0KSxcblx0XHRpZkVsc2UoaXNFZGl0YWJsZSwgXCJEaXNhYmxlZFwiLCBcIkRpc3BsYXlcIilcblx0KTtcblx0aWYgKGJBc09iamVjdCkge1xuXHRcdHJldHVybiBlZGl0TW9kZUV4cHJlc3Npb247XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGVkaXRNb2RlRXhwcmVzc2lvbik7XG59O1xuXG5leHBvcnQgY29uc3QgaGFzVmFsaWRBbmFseXRpY2FsQ3VycmVuY3lPclVuaXQgPSBmdW5jdGlvbiAob1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCk6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBvUHJvcGVydHlEZWZpbml0aW9uID0gb1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgYXMgUHJvcGVydHk7XG5cdGNvbnN0IGN1cnJlbmN5ID0gb1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5O1xuXHRjb25zdCBtZWFzdXJlID0gY3VycmVuY3kgPyBjdXJyZW5jeSA6IG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0O1xuXHRpZiAobWVhc3VyZSkge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhvcihpc1RydXRoeShhbm5vdGF0aW9uRXhwcmVzc2lvbihtZWFzdXJlKSBhcyBFeHByZXNzaW9uPHN0cmluZz4pLCBub3QoVUkuSXNUb3RhbCkpKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoY29uc3RhbnQodHJ1ZSkpO1xuXHR9XG59O1xuXG5leHBvcnQgY29uc3QgaWZVbml0RWRpdGFibGUgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0c0VkaXRhYmxlVmFsdWU6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxzdHJpbmc+LFxuXHRzTm9uRWRpdGFibGVWYWx1ZTogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPHN0cmluZz5cbik6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBvUHJvcGVydHkgPSAoaXNQYXRoRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoKSAmJiBvUHJvcGVydHlQYXRoLiR0YXJnZXQpIHx8IChvUHJvcGVydHlQYXRoIGFzIFByb3BlcnR5KTtcblx0Y29uc3QgdW5pdFByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkob1Byb3BlcnR5KSB8fCBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KG9Qcm9wZXJ0eSk7XG5cdGlmICghdW5pdFByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKHNOb25FZGl0YWJsZVZhbHVlKTtcblx0fVxuXHRjb25zdCBlZGl0YWJsZUV4cHJlc3Npb24gPSBhbmQobm90KGlzUmVhZE9ubHlFeHByZXNzaW9uKHVuaXRQcm9wZXJ0eSkpLCBub3QoaXNDb21wdXRlZCh1bml0UHJvcGVydHkpKSk7XG5cdHJldHVybiBjb21waWxlQmluZGluZyhpZkVsc2UoZWRpdGFibGVFeHByZXNzaW9uLCBzRWRpdGFibGVWYWx1ZSwgc05vbkVkaXRhYmxlVmFsdWUpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGaWVsZERpc3BsYXkgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0c1RhcmdldERpc3BsYXlNb2RlOiBzdHJpbmcsXG5cdG9Db21wdXRlZEVkaXRNb2RlOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8c3RyaW5nPlxuKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXG5cdHJldHVybiBoYXNWYWx1ZUhlbHAob1Byb3BlcnR5KVxuXHRcdD8gY29tcGlsZUJpbmRpbmcoc1RhcmdldERpc3BsYXlNb2RlKVxuXHRcdDogY29tcGlsZUJpbmRpbmcoaWZFbHNlKGVxdWFsKG9Db21wdXRlZEVkaXRNb2RlLCBcIkVkaXRhYmxlXCIpLCBcIlZhbHVlXCIsIHNUYXJnZXREaXNwbGF5TW9kZSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24gPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eTogUHJvcGVydHksXG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb246IEV4cHJlc3Npb248c3RyaW5nPixcblx0aWdub3JlQ29uc3RyYWludHM/OiBib29sZWFuXG4pOiBFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBvdXRFeHByZXNzaW9uOiBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248YW55PiA9IHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24gYXMgQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPGFueT47XG5cdGlmIChvUHJvcGVydHkuX3R5cGUgPT09IFwiUHJvcGVydHlcIikge1xuXHRcdGNvbnN0IG9UYXJnZXRNYXBwaW5nID0gRURNX1RZUEVfTUFQUElOR1sob1Byb3BlcnR5IGFzIFByb3BlcnR5KS50eXBlXTtcblx0XHRpZiAob1RhcmdldE1hcHBpbmcpIHtcblx0XHRcdG91dEV4cHJlc3Npb24udHlwZSA9IG9UYXJnZXRNYXBwaW5nLnR5cGU7XG5cdFx0XHRpZiAob1RhcmdldE1hcHBpbmcuY29uc3RyYWludHMgJiYgIWlnbm9yZUNvbnN0cmFpbnRzKSB7XG5cdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMgPSB7fTtcblx0XHRcdFx0aWYgKG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzLiRTY2FsZSAmJiBvUHJvcGVydHkuc2NhbGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMuc2NhbGUgPSBvUHJvcGVydHkuc2NhbGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzLiRQcmVjaXNpb24gJiYgb1Byb3BlcnR5LnByZWNpc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5jb25zdHJhaW50cy5wcmVjaXNpb24gPSBvUHJvcGVydHkucHJlY2lzaW9uO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cy4kTWF4TGVuZ3RoICYmIG9Qcm9wZXJ0eS5tYXhMZW5ndGggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMubWF4TGVuZ3RoID0gb1Byb3BlcnR5Lm1heExlbmd0aDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob1Byb3BlcnR5Lm51bGxhYmxlID09PSBmYWxzZSkge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMubnVsbGFibGUgPSBvUHJvcGVydHkubnVsbGFibGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1pbmltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0XHRvUHJvcGVydHkuYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1pbmltdW0gIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHRcdCFpc05hTihvUHJvcGVydHkuYW5ub3RhdGlvbnMuVmFsaWRhdGlvbi5NaW5pbXVtKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRvdXRFeHByZXNzaW9uLmNvbnN0cmFpbnRzLm1pbmltdW0gPSBgJHtvUHJvcGVydHkuYW5ub3RhdGlvbnMuVmFsaWRhdGlvbi5NaW5pbXVtfWA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1heGltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0XHRvUHJvcGVydHkuYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1heGltdW0gIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHRcdCFpc05hTihvUHJvcGVydHkuYW5ub3RhdGlvbnMuVmFsaWRhdGlvbi5NYXhpbXVtKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRvdXRFeHByZXNzaW9uLmNvbnN0cmFpbnRzLm1heGltdW0gPSBgJHtvUHJvcGVydHkuYW5ub3RhdGlvbnMuVmFsaWRhdGlvbi5NYXhpbXVtfWA7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob1Byb3BlcnR5Lm51bGxhYmxlID09PSBmYWxzZSkge1xuXHRcdFx0XHRvdXRFeHByZXNzaW9uLmNvbnN0cmFpbnRzID0ge307XG5cdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMubnVsbGFibGUgPSBvUHJvcGVydHkubnVsbGFibGU7XG5cdFx0XHR9XG5cdFx0XHRpZiAob3V0RXhwcmVzc2lvbj8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkludFwiKSA9PT0gMCkge1xuXHRcdFx0XHRpZiAoIW91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucykge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucyA9IHt9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdG91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24ob3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zLCB7XG5cdFx0XHRcdFx0cGFyc2VBc1N0cmluZzogZmFsc2UsXG5cdFx0XHRcdFx0ZW1wdHlTdHJpbmc6IFwiXCJcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob3V0RXhwcmVzc2lvbi50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiKSB7XG5cdFx0XHRcdGlmICghb3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zKSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zID0ge307XG5cdFx0XHRcdH1cblx0XHRcdFx0b3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zLnBhcnNlS2VlcHNFbXB0eVN0cmluZyA9IHRydWU7XG5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRGlnaXRTZXF1ZW5jZVwiXSAmJlxuXHRcdFx0XHRcdG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5Jc0RpZ2l0U2VxdWVuY2Vcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5jb25zdHJhaW50cy5pc0RpZ2l0U2VxdWVuY2UgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAob3V0RXhwcmVzc2lvbj8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRvdWJsZVwiKSA9PT0gMCkge1xuXHRcdFx0XHRpZiAoIW91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucykge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucyA9IHt9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdG91dEV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24ob3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zLCB7XG5cdFx0XHRcdFx0cGFyc2VBc1N0cmluZzogZmFsc2UsXG5cdFx0XHRcdFx0ZW1wdHlTdHJpbmc6IFwiXCJcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob3V0RXhwcmVzc2lvbj8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRhdGVUaW1lT2Zmc2V0XCIpID09PSAwKSB7XG5cdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMuVjQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gb3V0RXhwcmVzc2lvbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUeXBlQ29uZmlnID0gZnVuY3Rpb24gKG9Qcm9wZXJ0eTogUHJvcGVydHkgfCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLCBkYXRhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYW55IHtcblx0Y29uc3Qgb1RhcmdldE1hcHBpbmcgPSBFRE1fVFlQRV9NQVBQSU5HWyhvUHJvcGVydHkgYXMgUHJvcGVydHkpPy50eXBlXSB8fCAoZGF0YVR5cGUgPyBFRE1fVFlQRV9NQVBQSU5HW2RhdGFUeXBlXSA6IHVuZGVmaW5lZCk7XG5cdGNvbnN0IHByb3BlcnR5VHlwZUNvbmZpZzogY29uZmlnVHlwZSA9IHtcblx0XHR0eXBlOiBvVGFyZ2V0TWFwcGluZy50eXBlLFxuXHRcdGNvbnN0cmFpbnRzOiB7fSxcblx0XHRmb3JtYXRPcHRpb25zOiB7fVxuXHR9O1xuXHRpZiAoaXNQcm9wZXJ0eShvUHJvcGVydHkpKSB7XG5cdFx0cHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzID0ge1xuXHRcdFx0c2NhbGU6IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kU2NhbGUgPyBvUHJvcGVydHkuc2NhbGUgOiB1bmRlZmluZWQsXG5cdFx0XHRwcmVjaXNpb246IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kUHJlY2lzaW9uID8gb1Byb3BlcnR5LnByZWNpc2lvbiA6IHVuZGVmaW5lZCxcblx0XHRcdG1heExlbmd0aDogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRNYXhMZW5ndGggPyBvUHJvcGVydHkubWF4TGVuZ3RoIDogdW5kZWZpbmVkLFxuXHRcdFx0bnVsbGFibGU6IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kTnVsbGFibGUgPyBvUHJvcGVydHkubnVsbGFibGUgOiB1bmRlZmluZWQsXG5cdFx0XHRtaW5pbXVtOlxuXHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1pbmltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0IWlzTmFOKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bSlcblx0XHRcdFx0XHQ/IGAke29Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bX1gXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRtYXhpbXVtOlxuXHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1heGltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0IWlzTmFOKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bSlcblx0XHRcdFx0XHQ/IGAke29Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bX1gXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRpc0RpZ2l0U2VxdWVuY2U6XG5cdFx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZy50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiICYmXG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRGlnaXRTZXF1ZW5jZVwiXSAmJlxuXHRcdFx0XHQob1Byb3BlcnR5IGFzIFByb3BlcnR5KS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5Jc0RpZ2l0U2VxdWVuY2Vcblx0XHRcdFx0XHQ/IHRydWVcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdFY0OiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJFY0ID8gdHJ1ZSA6IHVuZGVmaW5lZFxuXHRcdH07XG5cdH1cblx0cHJvcGVydHlUeXBlQ29uZmlnLmZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0cGFyc2VBc1N0cmluZzpcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkludFwiKSA9PT0gMCB8fFxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRG91YmxlXCIpID09PSAwXG5cdFx0XHRcdD8gZmFsc2Vcblx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0ZW1wdHlTdHJpbmc6XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnRcIikgPT09IDAgfHxcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRvdWJsZVwiKSA9PT0gMFxuXHRcdFx0XHQ/IFwiXCJcblx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0cGFyc2VLZWVwc0VtcHR5U3RyaW5nOiBwcm9wZXJ0eVR5cGVDb25maWcudHlwZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5TdHJpbmdcIiA/IHRydWUgOiB1bmRlZmluZWRcblx0fTtcblx0cmV0dXJuIHByb3BlcnR5VHlwZUNvbmZpZztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCaW5kaW5nV2l0aFVuaXRPckN1cnJlbmN5ID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uOiBFeHByZXNzaW9uPHN0cmluZz4sXG5cdGlnbm9yZVVuaXRDb25zdHJhaW50PzogYm9vbGVhblxuKTogRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0Y29uc3Qgb1Byb3BlcnR5RGVmaW5pdGlvbiA9IG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgudGFyZ2V0T2JqZWN0IGFzIFByb3BlcnR5O1xuXHRsZXQgdW5pdCA9IG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0O1xuXHRjb25zdCByZWxhdGl2ZUxvY2F0aW9uID0gZ2V0UGF0aFJlbGF0aXZlTG9jYXRpb24oXG5cdFx0b1Byb3BlcnR5RGF0YU1vZGVsUGF0aC5jb250ZXh0TG9jYXRpb24sXG5cdFx0b1Byb3BlcnR5RGF0YU1vZGVsUGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllc1xuXHQpLm1hcCgobnApID0+IG5wLm5hbWUpO1xuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uID0gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihvUHJvcGVydHlEZWZpbml0aW9uLCBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uKTtcblx0aWYgKHVuaXQ/LnRvU3RyaW5nKCkgPT09IFwiJVwiKSB7XG5cdFx0cmV0dXJuIGZvcm1hdFJlc3VsdChbcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbl0sIHZhbHVlRm9ybWF0dGVycy5mb3JtYXRXaXRoUGVyY2VudGFnZSk7XG5cdH1cblx0Y29uc3QgY29tcGxleFR5cGUgPSB1bml0ID8gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Vbml0XCIgOiBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkN1cnJlbmN5XCI7XG5cdHVuaXQgPSB1bml0ID8gdW5pdCA6IG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeTtcblx0Y29uc3QgdW5pdEJpbmRpbmdFeHByZXNzaW9uID0gKHVuaXQgYXMgYW55KS4kdGFyZ2V0XG5cdFx0PyBmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKFxuXHRcdFx0XHQodW5pdCBhcyBhbnkpLiR0YXJnZXQsXG5cdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKHVuaXQsIHJlbGF0aXZlTG9jYXRpb24pIGFzIEV4cHJlc3Npb248c3RyaW5nPixcblx0XHRcdFx0aWdub3JlVW5pdENvbnN0cmFpbnRcblx0XHQgIClcblx0XHQ6IChhbm5vdGF0aW9uRXhwcmVzc2lvbih1bml0LCByZWxhdGl2ZUxvY2F0aW9uKSBhcyBFeHByZXNzaW9uPHN0cmluZz4pO1xuXG5cdHJldHVybiBhZGRUeXBlSW5mb3JtYXRpb24oW3Byb3BlcnR5QmluZGluZ0V4cHJlc3Npb24sIHVuaXRCaW5kaW5nRXhwcmVzc2lvbl0sIGNvbXBsZXhUeXBlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCaW5kaW5nV2l0aFRpbWV6b25lID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uOiBFeHByZXNzaW9uPHN0cmluZz4sXG5cdGlnbm9yZVVuaXRDb25zdHJhaW50PzogYm9vbGVhbixcblx0aGlkZVRpbWV6b25lRm9yRW1wdHlWYWx1ZXM/OiBib29sZWFuXG4pOiBFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBvUHJvcGVydHlEZWZpbml0aW9uID0gb1Byb3BlcnR5RGF0YU1vZGVsUGF0aC50YXJnZXRPYmplY3QgYXMgUHJvcGVydHk7XG5cdGNvbnN0IHRpbWV6b25lID0gb1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UaW1lem9uZTtcblx0Y29uc3QgcmVsYXRpdmVMb2NhdGlvbiA9IGdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uKFxuXHRcdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGguY29udGV4dExvY2F0aW9uLFxuXHRcdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXNcblx0KS5tYXAoKG5wKSA9PiBucC5uYW1lKTtcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiA9IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24ob1Byb3BlcnR5RGVmaW5pdGlvbiwgcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbik7XG5cblx0Y29uc3QgY29tcGxleFR5cGUgPSBcInNhcC5mZS5jb3JlLnR5cGUuRGF0ZVRpbWVXaXRoVGltZXpvbmVcIjtcblx0Y29uc3QgdW5pdEJpbmRpbmdFeHByZXNzaW9uID0gKHRpbWV6b25lIGFzIGFueSkuJHRhcmdldFxuXHRcdD8gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihcblx0XHRcdFx0KHRpbWV6b25lIGFzIGFueSkuJHRhcmdldCxcblx0XHRcdFx0YW5ub3RhdGlvbkV4cHJlc3Npb24odGltZXpvbmUsIHJlbGF0aXZlTG9jYXRpb24pIGFzIEV4cHJlc3Npb248c3RyaW5nPixcblx0XHRcdFx0aWdub3JlVW5pdENvbnN0cmFpbnRcblx0XHQgIClcblx0XHQ6IChhbm5vdGF0aW9uRXhwcmVzc2lvbih0aW1lem9uZSwgcmVsYXRpdmVMb2NhdGlvbikgYXMgRXhwcmVzc2lvbjxzdHJpbmc+KTtcblx0bGV0IGZvcm1hdE9wdGlvbnM7XG5cdGlmIChoaWRlVGltZXpvbmVGb3JFbXB0eVZhbHVlcykge1xuXHRcdGZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0XHRzaG93VGltZXpvbmVGb3JFbXB0eVZhbHVlczogZmFsc2Vcblx0XHR9O1xuXHR9XG5cdHJldHVybiBhZGRUeXBlSW5mb3JtYXRpb24oW3Byb3BlcnR5QmluZGluZ0V4cHJlc3Npb24sIHVuaXRCaW5kaW5nRXhwcmVzc2lvbl0sIGNvbXBsZXhUeXBlLCB1bmRlZmluZWQsIGZvcm1hdE9wdGlvbnMpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFsaWdubWVudEV4cHJlc3Npb24gPSBmdW5jdGlvbiAoXG5cdG9Db21wdXRlZEVkaXRNb2RlOiBFeHByZXNzaW9uPHN0cmluZz4sXG5cdHNBbGlnbkRpc3BsYXk6IHN0cmluZyA9IFwiQmVnaW5cIixcblx0c0FsaWduRWRpdDogc3RyaW5nID0gXCJCZWdpblwiXG4pOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHwgRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGlmRWxzZShlcXVhbChvQ29tcHV0ZWRFZGl0TW9kZSwgXCJEaXNwbGF5XCIpLCBzQWxpZ25EaXNwbGF5LCBzQWxpZ25FZGl0KSk7XG59O1xuXG4vKipcbiAqIEZvcm1hdHRlciBoZWxwZXIgdG8gcmV0cmlldmUgdGhlIGNvbnZlcnRlckNvbnRleHQgZnJvbSB0aGUgbWV0YW1vZGVsIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIHtDb250ZXh0fSBvQ29udGV4dCBUaGUgb3JpZ2luYWwgbWV0YW1vZGVsIGNvbnRleHRcbiAqIEBwYXJhbSB7Q29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlfSBvSW50ZXJmYWNlIFRoZSBjdXJyZW50IHRlbXBsYXRpbmcgY29udGV4dFxuICogQHJldHVybnMge29iamVjdH0gVGhlIENvbnZlcnRlckNvbnRleHQgcmVwcmVzZW50aW5nIHRoYXQgb2JqZWN0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb252ZXJ0ZXJDb250ZXh0ID0gZnVuY3Rpb24gKG9Db250ZXh0OiBNZXRhTW9kZWxDb250ZXh0LCBvSW50ZXJmYWNlOiBDb21wdXRlZEFubm90YXRpb25JbnRlcmZhY2UpOiBvYmplY3QgfCBudWxsIHtcblx0aWYgKG9JbnRlcmZhY2UgJiYgb0ludGVyZmFjZS5jb250ZXh0KSB7XG5cdFx0cmV0dXJuIGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0KG9JbnRlcmZhY2UuY29udGV4dCk7XG5cdH1cblx0cmV0dXJuIG51bGw7XG59O1xuZ2V0Q29udmVydGVyQ29udGV4dC5yZXF1aXJlc0lDb250ZXh0ID0gdHJ1ZTtcblxuLyoqXG4gKiBGb3JtYXR0ZXIgaGVscGVyIHRvIHJldHJpZXZlIHRoZSBkYXRhIG1vZGVsIG9iamVjdHMgdGhhdCBhcmUgaW52b2x2ZWQgZnJvbSB0aGUgbWV0YW1vZGVsIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIHtDb250ZXh0fSBvQ29udGV4dCBUaGUgb3JpZ2luYWwgT0RhdGFNZXRhTW9kZWwgY29udGV4dFxuICogQHBhcmFtIHtDb21wdXRlZEFubm90YXRpb25JbnRlcmZhY2V9IG9JbnRlcmZhY2UgVGhlIGN1cnJlbnQgdGVtcGxhdGluZyBjb250ZXh0XG4gKiBAcmV0dXJucyB7b2JqZWN0W119IEFuIGFycmF5IG9mIGVudGl0eXNldHMgYW5kIG5hdnByb3BlcnRpZXMgdGhhdCBhcmUgaW52b2x2ZWQgdG8gZ2V0IHRvIGEgc3BlY2lmaWMgb2JqZWN0IGluIHRoZSBtZXRhbW9kZWxcbiAqL1xuZXhwb3J0IGNvbnN0IGdldERhdGFNb2RlbE9iamVjdFBhdGggPSBmdW5jdGlvbiAoXG5cdG9Db250ZXh0OiBNZXRhTW9kZWxDb250ZXh0LFxuXHRvSW50ZXJmYWNlOiBDb21wdXRlZEFubm90YXRpb25JbnRlcmZhY2Vcbik6IERhdGFNb2RlbE9iamVjdFBhdGggfCBudWxsIHtcblx0aWYgKG9JbnRlcmZhY2UgJiYgb0ludGVyZmFjZS5jb250ZXh0KSB7XG5cdFx0cmV0dXJuIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvSW50ZXJmYWNlLmNvbnRleHQpO1xuXHR9XG5cdHJldHVybiBudWxsO1xufTtcbmdldERhdGFNb2RlbE9iamVjdFBhdGgucmVxdWlyZXNJQ29udGV4dCA9IHRydWU7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBleHByZXNzaW9uQmluZGluZyBjcmVhdGVkIG91dCBvZiBhIGJpbmRpbmcgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0ge0V4cHJlc3Npb248YW55Pn0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB3aGljaCBuZWVkcyB0byBiZSBjb21waWxlZFxuICogQHJldHVybnMge0JpbmRpbmdFeHByZXNzaW9uPHN0cmluZz59IFRoZSBleHByZXNzaW9uLWJpbmRpbmcgc3RyaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHByZXNzaW9uQmluZGluZyA9IGZ1bmN0aW9uIChleHByZXNzaW9uOiBFeHByZXNzaW9uPGFueT4pOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGV4cHJlc3Npb24pO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzQ29sbGVjdGlvbkZpZWxkID0gZnVuY3Rpb24gKG9EYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoKTogYm9vbGVhbiB7XG5cdGlmIChvRGF0YU1vZGVsUGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcz8ubGVuZ3RoKSB7XG5cdFx0Y29uc3QgaGFzT25lVG9NYW55TmF2aWdhdGlvbiA9XG5cdFx0XHRvRGF0YU1vZGVsUGF0aD8ubmF2aWdhdGlvblByb3BlcnRpZXMuZmluZEluZGV4KChvTmF2OiBOYXZpZ2F0aW9uUHJvcGVydHkpID0+IHtcblx0XHRcdFx0aWYgKG9OYXYuaXNDb2xsZWN0aW9uKSB7XG5cdFx0XHRcdFx0aWYgKG9EYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbj8ubmF2aWdhdGlvblByb3BlcnRpZXM/Lmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0Ly93ZSBjaGVjayB0aGUgb25lIHRvIG1hbnkgbmF2IGlzIG5vdCBhbHJlYWR5IHBhcnQgb2YgdGhlIGNvbnRleHRcblx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdG9EYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbj8ubmF2aWdhdGlvblByb3BlcnRpZXMuZmluZEluZGV4KFxuXHRcdFx0XHRcdFx0XHRcdChvQ29udGV4dE5hdjogTmF2aWdhdGlvblByb3BlcnR5KSA9PiBvQ29udGV4dE5hdi5uYW1lID09PSBvTmF2Lm5hbWVcblx0XHRcdFx0XHRcdFx0KSA9PT0gLTFcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0pID4gLTE7XG5cdFx0aWYgKGhhc09uZVRvTWFueU5hdmlnYXRpb24pIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVxdWlyZWRFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ/OiBhbnksXG5cdGZvcmNlRWRpdE1vZGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0YkFzT2JqZWN0OiBib29sZWFuID0gZmFsc2Vcbik6IEJpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+IHtcblx0aWYgKCFvUHJvcGVydHlQYXRoIHx8IHR5cGVvZiBvUHJvcGVydHlQYXRoID09PSBcInN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGZhbHNlKTtcblx0fVxuXG5cdGxldCBkYXRhRmllbGRSZXF1aXJlZEV4cHJlc3Npb246IEJpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+ID0gdHJ1ZTtcblx0aWYgKG9EYXRhRmllbGRDb252ZXJ0ZWQgIT09IG51bGwpIHtcblx0XHRkYXRhRmllbGRSZXF1aXJlZEV4cHJlc3Npb24gPSBpc1JlcXVpcmVkRXhwcmVzc2lvbihvRGF0YUZpZWxkQ29udmVydGVkKTtcblx0fVxuXG5cdGNvbnN0IG9Qcm9wZXJ0eTogUHJvcGVydHkgPSAoaXNQYXRoRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoKSAmJiBvUHJvcGVydHlQYXRoLiR0YXJnZXQpIHx8IChvUHJvcGVydHlQYXRoIGFzIFByb3BlcnR5KTtcblx0Ly8gRW5hYmxlbWVudCBkZXBlbmRzIG9uIHRoZSBmaWVsZCBjb250cm9sIGV4cHJlc3Npb25cblx0Ly8gSWYgdGhlIEZpZWxkIGNvbnRyb2wgaXMgc3RhdGljYWxseSBpbiBJbmFwcGxpY2FibGUgKGRpc2FibGVkKSAtPiBub3QgZW5hYmxlZFxuXHRjb25zdCByZXF1aXJlZEV4cHJlc3Npb24gPSBpc1JlcXVpcmVkRXhwcmVzc2lvbihvUHJvcGVydHkpO1xuXHRjb25zdCBlZGl0TW9kZSA9IGZvcmNlRWRpdE1vZGUgfHwgVUkuSXNFZGl0YWJsZTtcblx0aWYgKGJBc09iamVjdCkge1xuXHRcdHJldHVybiBhbmQob3IocmVxdWlyZWRFeHByZXNzaW9uLCBkYXRhRmllbGRSZXF1aXJlZEV4cHJlc3Npb24pLCBlZGl0TW9kZSk7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGFuZChvcihyZXF1aXJlZEV4cHJlc3Npb24sIGRhdGFGaWVsZFJlcXVpcmVkRXhwcmVzc2lvbiksIGVkaXRNb2RlKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVxdWlyZWRFeHByZXNzaW9uRm9yQ29ubmVjdGVkRGF0YUZpZWxkID0gZnVuY3Rpb24gKGRhdGFGaWVsZE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgpOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0Y29uc3QgZGF0YSA9IGRhdGFGaWVsZE9iamVjdFBhdGg/LnRhcmdldE9iamVjdD8uJHRhcmdldD8uRGF0YTtcblx0Y29uc3Qga2V5czogQXJyYXk8c3RyaW5nPiA9IE9iamVjdC5rZXlzKGRhdGEpO1xuXHRjb25zdCBkYXRhRmllbGRzID0gW107XG5cdGxldCBwcm9wZXJ0eVBhdGg7XG5cdGNvbnN0IGlzUmVxdWlyZWRFeHByZXNzaW9uczogKEJpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+KVtdIHwgdW5kZWZpbmVkID0gW107XG5cdGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcblx0XHRpZiAoZGF0YVtrZXldW1wiJFR5cGVcIl0gJiYgZGF0YVtrZXldW1wiJFR5cGVcIl0uaW5kZXhPZihcIkRhdGFGaWVsZFwiKSA+IC0xKSB7XG5cdFx0XHRkYXRhRmllbGRzLnB1c2goZGF0YVtrZXldKTtcblx0XHR9XG5cdH1cblx0Zm9yIChjb25zdCBkYXRhRmllbGQgb2YgZGF0YUZpZWxkcykge1xuXHRcdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uOlxuXHRcdFx0XHRpZiAodHlwZW9mIGRhdGFGaWVsZC5WYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdHByb3BlcnR5UGF0aCA9IGRhdGFGaWVsZC5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdFx0XHRpZiAoZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0KSB7XG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQgfHxcblx0XHRcdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQuVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlQYXRoID0gZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LlZhbHVlLiR0YXJnZXQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgZGF0YUZpZWxkLlRhcmdldCA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVBhdGggPSBkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdGlzUmVxdWlyZWRFeHByZXNzaW9ucy5wdXNoKGdldFJlcXVpcmVkRXhwcmVzc2lvbihwcm9wZXJ0eVBhdGgsIGRhdGFGaWVsZCwgZmFsc2UsIHRydWUpKTtcblx0fVxuXHRyZXR1cm4gY29tcGlsZUJpbmRpbmcob3IoLi4uKGlzUmVxdWlyZWRFeHByZXNzaW9ucyBhcyBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj5bXSkpKTtcbn07XG4iXX0=
667
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlVJRm9ybWF0dGVycy50cyJdLCJuYW1lcyI6WyJFRE1fVFlQRV9NQVBQSU5HIiwiRGlzcGxheU1vZGVGb3JtYXR0ZXIiLCJnZXREaXNwbGF5TW9kZSIsIm9EYXRhTW9kZWxPYmplY3RQYXRoIiwidGFyZ2V0T2JqZWN0IiwiZ2V0RWRpdGFibGVFeHByZXNzaW9uQXNPYmplY3QiLCJvUHJvcGVydHlQYXRoIiwib0RhdGFGaWVsZENvbnZlcnRlZCIsImlzRWRpdGFibGUiLCJVSSIsIklzRWRpdGFibGUiLCJnZXRFZGl0YWJsZUV4cHJlc3Npb24iLCJiQXNPYmplY3QiLCJjb21waWxlRXhwcmVzc2lvbiIsImRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbiIsImNvbnN0YW50IiwiaWZFbHNlIiwiaXNOb25FZGl0YWJsZUV4cHJlc3Npb24iLCJvUHJvcGVydHkiLCJpc1BhdGhFeHByZXNzaW9uIiwiJHRhcmdldCIsImlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24iLCJpc1BhdGhVcGRhdGFibGUiLCJwcm9wZXJ0eVBhdGgiLCJwYXRoVmlzaXRvciIsInBhdGgiLCJuYXZpZ2F0aW9uUGF0aHMiLCJzaW5nbGV0b25QYXRoVmlzaXRvciIsImNvbnZlcnRlZFR5cGVzIiwiZWRpdGFibGVFeHByZXNzaW9uIiwib3IiLCJub3QiLCJpc0NvbXB1dGVkIiwiaXNLZXkiLCJpc0ltbXV0YWJsZSIsIklzVHJhbnNpZW50QmluZGluZyIsImFuZCIsImdldENvbGxhYm9yYXRpb25FeHByZXNzaW9uIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsImZvcm1hdHRlciIsIm9iamVjdFBhdGgiLCJnZXRUYXJnZXRPYmplY3RQYXRoIiwiYWN0aXZpdHlFeHByZXNzaW9uIiwicGF0aEluTW9kZWwiLCJrZXlzIiwidGFyZ2V0RW50aXR5VHlwZSIsImtleXNFeHByZXNzaW9ucyIsImZvckVhY2giLCJrZXkiLCJrZXlFeHByZXNzaW9uIiwibmFtZSIsInB1c2giLCJmb3JtYXRSZXN1bHQiLCJnZXRFbmFibGVkRXhwcmVzc2lvbkFzT2JqZWN0IiwiZ2V0RW5hYmxlZEV4cHJlc3Npb24iLCJkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbiIsImlzRGlzYWJsZWRFeHByZXNzaW9uIiwiZW5hYmxlZEV4cHJlc3Npb24iLCJnZXRFZGl0TW9kZSIsImJNZWFzdXJlUmVhZE9ubHkiLCJhc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5IiwidW5pdFByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSIsInJlc3VsdEV4cHJlc3Npb24iLCJpc1JlYWRPbmx5RXhwcmVzc2lvbiIsInJlYWRPbmx5RXhwcmVzc2lvbiIsImVkaXRNb2RlRXhwcmVzc2lvbiIsImlzQ29uc3RhbnQiLCJoYXNWYWxpZEFuYWx5dGljYWxDdXJyZW5jeU9yVW5pdCIsIm9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgiLCJvUHJvcGVydHlEZWZpbml0aW9uIiwiY3VycmVuY3kiLCJhbm5vdGF0aW9ucyIsIk1lYXN1cmVzIiwiSVNPQ3VycmVuY3kiLCJtZWFzdXJlIiwiVW5pdCIsImlzVHJ1dGh5IiwiZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uIiwiSXNUb3RhbCIsImlmVW5pdEVkaXRhYmxlIiwic0VkaXRhYmxlVmFsdWUiLCJzTm9uRWRpdGFibGVWYWx1ZSIsImdldEZpZWxkRGlzcGxheSIsInNUYXJnZXREaXNwbGF5TW9kZSIsIm9Db21wdXRlZEVkaXRNb2RlIiwiaGFzVmFsdWVIZWxwIiwiZXF1YWwiLCJmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uIiwicHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiIsImlnbm9yZUNvbnN0cmFpbnRzIiwib3V0RXhwcmVzc2lvbiIsIl90eXBlIiwib1RhcmdldE1hcHBpbmciLCJ0eXBlIiwiY29uc3RyYWludHMiLCIkU2NhbGUiLCJzY2FsZSIsInVuZGVmaW5lZCIsIiRQcmVjaXNpb24iLCJwcmVjaXNpb24iLCIkTWF4TGVuZ3RoIiwibWF4TGVuZ3RoIiwibnVsbGFibGUiLCJWYWxpZGF0aW9uIiwiTWluaW11bSIsImlzTmFOIiwibWluaW11bSIsIk1heGltdW0iLCJtYXhpbXVtIiwiaW5kZXhPZiIsImZvcm1hdE9wdGlvbnMiLCJPYmplY3QiLCJhc3NpZ24iLCJwYXJzZUFzU3RyaW5nIiwiZW1wdHlTdHJpbmciLCJwYXJzZUtlZXBzRW1wdHlTdHJpbmciLCJDb21tb24iLCJJc0RpZ2l0U2VxdWVuY2UiLCJpc0RpZ2l0U2VxdWVuY2UiLCJWNCIsImdldFR5cGVDb25maWciLCJkYXRhVHlwZSIsInByb3BlcnR5VHlwZUNvbmZpZyIsImlzUHJvcGVydHkiLCIkTnVsbGFibGUiLCIkVjQiLCJnZXRCaW5kaW5nV2l0aFVuaXRPckN1cnJlbmN5Iiwib1Byb3BlcnR5RGF0YU1vZGVsUGF0aCIsImlnbm9yZVVuaXRDb25zdHJhaW50IiwidW5pdCIsInJlbGF0aXZlTG9jYXRpb24iLCJnZXRQYXRoUmVsYXRpdmVMb2NhdGlvbiIsImNvbnRleHRMb2NhdGlvbiIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwibWFwIiwibnAiLCJ0b1N0cmluZyIsInZhbHVlRm9ybWF0dGVycyIsImZvcm1hdFdpdGhQZXJjZW50YWdlIiwiY29tcGxleFR5cGUiLCJ1bml0QmluZGluZ0V4cHJlc3Npb24iLCJhZGRUeXBlSW5mb3JtYXRpb24iLCJnZXRCaW5kaW5nRm9yVW5pdE9yQ3VycmVuY3kiLCJnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoIiwic2hvd051bWJlciIsImdldEJpbmRpbmdXaXRoVGltZXpvbmUiLCJoaWRlVGltZXpvbmVGb3JFbXB0eVZhbHVlcyIsInRpbWV6b25lIiwiVGltZXpvbmUiLCJzaG93VGltZXpvbmVGb3JFbXB0eVZhbHVlcyIsImdldEFsaWdubWVudEV4cHJlc3Npb24iLCJzQWxpZ25EaXNwbGF5Iiwic0FsaWduRWRpdCIsImdldENvbnZlcnRlckNvbnRleHQiLCJvQ29udGV4dCIsIm9JbnRlcmZhY2UiLCJjb250ZXh0IiwiY29udmVydE1ldGFNb2RlbENvbnRleHQiLCJyZXF1aXJlc0lDb250ZXh0IiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImlzQ29sbGVjdGlvbkZpZWxkIiwib0RhdGFNb2RlbFBhdGgiLCJsZW5ndGgiLCJoYXNPbmVUb01hbnlOYXZpZ2F0aW9uIiwiZmluZEluZGV4Iiwib05hdiIsImlzQ29sbGVjdGlvbiIsIm9Db250ZXh0TmF2IiwiZ2V0UmVxdWlyZWRFeHByZXNzaW9uQXNPYmplY3QiLCJmb3JjZUVkaXRNb2RlIiwiZ2V0UmVxdWlyZWRFeHByZXNzaW9uIiwib1JlcXVpcmVkUHJvcGVydGllcyIsInJldHVybkV4cHJlc3Npb24iLCJhUmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUluc2VydFJlc3RyaWN0aW9ucyIsInJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnMiLCJhUmVxdWlyZWRQcm9wZXJ0aWVzRnJvbVVwZGF0ZVJlc3RyaWN0aW9ucyIsInJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnMiLCJkYXRhRmllbGRSZXF1aXJlZEV4cHJlc3Npb24iLCJpc1JlcXVpcmVkRXhwcmVzc2lvbiIsInJlcXVpcmVkUHJvcGVydHlGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zRXhwcmVzc2lvbiIsInJlcXVpcmVkUHJvcGVydHlGcm9tVXBkYXRlUmVzdHJpY3Rpb25zRXhwcmVzc2lvbiIsInJlcXVpcmVkRXhwcmVzc2lvbiIsImVkaXRNb2RlIiwiaW5jbHVkZXMiLCJJc0NyZWF0ZU1vZGUiLCJub3RFcXVhbCIsImdldFJlcXVpcmVkRXhwcmVzc2lvbkZvckNvbm5lY3RlZERhdGFGaWVsZCIsImRhdGFGaWVsZE9iamVjdFBhdGgiLCJkYXRhIiwiRGF0YSIsImRhdGFGaWVsZHMiLCJpc1JlcXVpcmVkRXhwcmVzc2lvbnMiLCJkYXRhRmllbGQiLCIkVHlwZSIsIlZhbHVlIiwiVGFyZ2V0Il0sIm1hcHBpbmdzIjoi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QUEzQkQ7O0FBNkJBOEssTUFBQUEscUJBQXFCLENBQUMvSSxJQUF0QixDQUEyQndILDZCQUE2QixDQUFDcEosWUFBRCxFQUFlNEssU0FBZixFQUEwQixLQUExQixDQUF4RDtBQUNBOztBQUNELFdBQU90TCxpQkFBaUIsQ0FBQ2lCLEVBQUUsTUFBRiw0QkFBT29LLHFCQUFQLEVBQUQsQ0FBeEI7QUFDQSxHQTlDTSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBOYXZpZ2F0aW9uUHJvcGVydHksIFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB7IFVJQW5ub3RhdGlvblR5cGVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IHsgc2luZ2xldG9uUGF0aFZpc2l0b3IsIFVJIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgeyBjb252ZXJ0TWV0YU1vZGVsQ29udGV4dCwgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgdmFsdWVGb3JtYXR0ZXJzIGZyb20gXCJzYXAvZmUvY29yZS9mb3JtYXR0ZXJzL1ZhbHVlRm9ybWF0dGVyXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiwgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sIFBhdGhJbk1vZGVsRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQge1xuXHRhZGRUeXBlSW5mb3JtYXRpb24sXG5cdGFuZCxcblx0Y29tcGlsZUV4cHJlc3Npb24sXG5cdGNvbnN0YW50LFxuXHRlcXVhbCxcblx0Zm9ybWF0UmVzdWx0LFxuXHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24sXG5cdGlmRWxzZSxcblx0aXNDb25zdGFudCxcblx0aXNUcnV0aHksXG5cdG5vdCxcblx0bm90RXF1YWwsXG5cdG9yLFxuXHRwYXRoSW5Nb2RlbFxufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHtcblx0RGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0Z2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aCxcblx0Z2V0UGF0aFJlbGF0aXZlTG9jYXRpb24sXG5cdGdldFRhcmdldE9iamVjdFBhdGgsXG5cdGlzUGF0aFVwZGF0YWJsZVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgKiBhcyBEaXNwbGF5TW9kZUZvcm1hdHRlciBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EaXNwbGF5TW9kZUZvcm1hdHRlclwiO1xuaW1wb3J0IHtcblx0aXNEaXNhYmxlZEV4cHJlc3Npb24sXG5cdGlzTm9uRWRpdGFibGVFeHByZXNzaW9uLFxuXHRpc1JlYWRPbmx5RXhwcmVzc2lvbixcblx0aXNSZXF1aXJlZEV4cHJlc3Npb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRmllbGRDb250cm9sSGVscGVyXCI7XG5pbXBvcnQge1xuXHRnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSxcblx0aGFzVmFsdWVIZWxwLFxuXHRpc0NvbXB1dGVkLFxuXHRpc0ltbXV0YWJsZSxcblx0aXNLZXksXG5cdGlzUGF0aEV4cHJlc3Npb24sXG5cdGlzUHJvcGVydHlcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5cbi8vIEltcG9ydC1leHBvcnQgbWV0aG9kIHVzZWQgYnkgdGhlIGNvbnZlcnRlciB0byB1c2UgdGhlbSBpbiB0aGUgdGVtcGxhdGluZyB0aHJvdWdoIHRoZSBVSUZvcm1hdHRlcnMuXG5leHBvcnQgdHlwZSBEaXNwbGF5TW9kZSA9IERpc3BsYXlNb2RlRm9ybWF0dGVyLkRpc3BsYXlNb2RlO1xuXG5leHBvcnQgY29uc3QgRURNX1RZUEVfTUFQUElORyA9IERpc3BsYXlNb2RlRm9ybWF0dGVyLkVETV9UWVBFX01BUFBJTkc7XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5T3JQYXRoPFA+ID0gc3RyaW5nIHwgUCB8IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPjtcbmV4cG9ydCB0eXBlIE1ldGFNb2RlbENvbnRleHQgPSB7XG5cdCRraW5kOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgQ29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlID0ge1xuXHRjb250ZXh0OiBDb250ZXh0O1xuXHRhcmd1bWVudHM/OiBhbnlbXTtcblx0JCR2YWx1ZUFzUHJvbWlzZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBjb25maWdUeXBlQ29uc3RyYWludHMgPSB7XG5cdHNjYWxlPzogbnVtYmVyO1xuXHRwcmVjaXNpb24/OiBudW1iZXI7XG5cdG1heExlbmd0aD86IG51bWJlcjtcblx0bnVsbGFibGU/OiBib29sZWFuO1xuXHRtaW5pbXVtPzogc3RyaW5nO1xuXHRtYXhpbXVtPzogc3RyaW5nO1xuXHRpc0RpZ2l0U2VxdWVuY2U/OiBib29sZWFuO1xuXHRWND86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBjb25maWdUeXBlZm9ybWF0T3B0aW9ucyA9IHtcblx0cGFyc2VBc1N0cmluZz86IGJvb2xlYW47XG5cdGVtcHR5U3RyaW5nPzogc3RyaW5nO1xuXHRwYXJzZUtlZXBzRW1wdHlTdHJpbmc/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgY29uZmlnVHlwZSA9IHtcblx0dHlwZTogc3RyaW5nO1xuXHRjb25zdHJhaW50czogY29uZmlnVHlwZUNvbnN0cmFpbnRzO1xuXHRmb3JtYXRPcHRpb25zOiBjb25maWdUeXBlZm9ybWF0T3B0aW9ucztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREaXNwbGF5TW9kZSA9IGZ1bmN0aW9uIChvRGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCk6IERpc3BsYXlNb2RlIHtcblx0cmV0dXJuIERpc3BsYXlNb2RlRm9ybWF0dGVyLmdldERpc3BsYXlNb2RlKG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCwgb0RhdGFNb2RlbE9iamVjdFBhdGgpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRFZGl0YWJsZUV4cHJlc3Npb25Bc09iamVjdCA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRvRGF0YUZpZWxkQ29udmVydGVkOiBhbnkgPSBudWxsLFxuXHRvRGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0aXNFZGl0YWJsZTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gVUkuSXNFZGl0YWJsZVxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGdldEVkaXRhYmxlRXhwcmVzc2lvbihcblx0XHRvUHJvcGVydHlQYXRoLFxuXHRcdG9EYXRhRmllbGRDb252ZXJ0ZWQsXG5cdFx0b0RhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0dHJ1ZSxcblx0XHRpc0VkaXRhYmxlXG5cdCkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+O1xufTtcbi8qKlxuICogQ3JlYXRlIHRoZSBleHByZXNzaW9uIHRvIGdlbmVyYXRlIGFuIFwiZWRpdGFibGVcIiBib29sZWFuIHZhbHVlLlxuICpcbiAqIEBwYXJhbSBvUHJvcGVydHlQYXRoIFRoZSBpbnB1dCBwcm9wZXJ0eVxuICogQHBhcmFtIG9EYXRhRmllbGRDb252ZXJ0ZWQgVGhlIERhdGFGaWVsZENvbnZlcnRlZCBvYmplY3QgdG8gcmVhZCB0aGUgZmllbGRDb250cm9sIGFubm90YXRpb25cbiAqIEBwYXJhbSBvRGF0YU1vZGVsT2JqZWN0UGF0aCBUaGUgcGF0aCB0byB0aGlzIHByb3BlcnR5IG9iamVjdFxuICogQHBhcmFtIGJBc09iamVjdCBXaGV0aGVyIG9yIG5vdCB0aGlzIHNob3VsZCBiZSByZXR1cm5lZCBhcyBhbiBvYmplY3Qgb3IgYSBiaW5kaW5nIHN0cmluZ1xuICogQHBhcmFtIGlzRWRpdGFibGUgV2hldGhlciBvciBub3QgVUkuSXNFZGl0YWJsZSBiZSBjb25zaWRlcmVkLlxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiB1c2VkIHRvIGRldGVybWluZSBpZiBhIHByb3BlcnR5IGlzIGVkaXRhYmxlIG9yIG5vdFxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdGFibGVFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ6IGFueSA9IG51bGwsXG5cdG9EYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRiQXNPYmplY3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0aXNFZGl0YWJsZTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gVUkuSXNFZGl0YWJsZVxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRpZiAoIW9Qcm9wZXJ0eVBhdGggfHwgdHlwZW9mIG9Qcm9wZXJ0eVBhdGggPT09IFwic3RyaW5nXCIpIHtcblx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oZmFsc2UpO1xuXHR9XG5cdGxldCBkYXRhRmllbGRFZGl0YWJsZUV4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiA9IGNvbnN0YW50KHRydWUpO1xuXHRpZiAob0RhdGFGaWVsZENvbnZlcnRlZCAhPT0gbnVsbCkge1xuXHRcdGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbiA9IGlmRWxzZShpc05vbkVkaXRhYmxlRXhwcmVzc2lvbihvRGF0YUZpZWxkQ29udmVydGVkKSwgZmFsc2UsIGlzRWRpdGFibGUpO1xuXHR9XG5cblx0Y29uc3Qgb1Byb3BlcnR5OiBQcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXHQvLyBFZGl0YWJpbGl0eSBkZXBlbmRzIG9uIHRoZSBmaWVsZCBjb250cm9sIGV4cHJlc3Npb25cblx0Ly8gSWYgdGhlIEZpZWxkIGNvbnRyb2wgaXMgc3RhdGljYWxseSBpbiBSZWFkT25seSBvciBJbmFwcGxpY2FibGUgKGRpc2FibGVkKSAtPiBub3QgZWRpdGFibGVcblx0Ly8gSWYgdGhlIHByb3BlcnR5IGlzIGEga2V5IC0+IG5vdCBlZGl0YWJsZSBleGNlcHQgaW4gY3JlYXRpb24gaWYgbm90IGNvbXB1dGVkXG5cdC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBjb21wdXRlZCAtPiBub3QgZWRpdGFibGVcblx0Ly8gSWYgdGhlIHByb3BlcnR5IGlzIG5vdCB1cGRhdGFibGUgLT4gbm90IGVkaXRhYmxlXG5cdC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBpbW11dGFibGUgLT4gbm90IGVkaXRhYmxlIGV4Y2VwdCBpbiBjcmVhdGlvblxuXHQvLyBJZiB0aGUgRmllbGQgY29udHJvbCBpcyBhIHBhdGggcmVzb2x2aW5nIHRvIFJlYWRPbmx5IG9yIEluYXBwbGljYWJsZSAoZGlzYWJsZWQpICg8PSAxKSAtPiBub3QgZWRpdGFibGVcblx0Ly8gRWxzZSwgdG8gYmUgZWRpdGFibGUgeW91IG5lZWRcblx0Ly8gaW1tdXRhYmxlIGFuZCBrZXkgd2hpbGUgaW4gdGhlIGNyZWF0aW9uIHJvd1xuXHQvLyB1aS9pc0VkaXRhYmxlXG5cdGNvbnN0IGlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24gPSBpc1BhdGhVcGRhdGFibGUob0RhdGFNb2RlbE9iamVjdFBhdGgsIHtcblx0XHRwcm9wZXJ0eVBhdGg6IG9Qcm9wZXJ0eVBhdGgsXG5cdFx0cGF0aFZpc2l0b3I6IChwYXRoOiBzdHJpbmcsIG5hdmlnYXRpb25QYXRoczogc3RyaW5nW10pID0+XG5cdFx0XHRzaW5nbGV0b25QYXRoVmlzaXRvcihwYXRoLCBvRGF0YU1vZGVsT2JqZWN0UGF0aC5jb252ZXJ0ZWRUeXBlcywgbmF2aWdhdGlvblBhdGhzKVxuXHR9KTtcblx0Y29uc3QgZWRpdGFibGVFeHByZXNzaW9uID0gaWZFbHNlKFxuXHRcdG9yKFxuXHRcdFx0bm90KGlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24pLFxuXHRcdFx0aXNDb21wdXRlZChvUHJvcGVydHkpLFxuXHRcdFx0aXNLZXkob1Byb3BlcnR5KSxcblx0XHRcdGlzSW1tdXRhYmxlKG9Qcm9wZXJ0eSksXG5cdFx0XHRpc05vbkVkaXRhYmxlRXhwcmVzc2lvbihvUHJvcGVydHkpXG5cdFx0KSxcblx0XHRpZkVsc2Uob3IoaXNDb21wdXRlZChvUHJvcGVydHkpLCBpc05vbkVkaXRhYmxlRXhwcmVzc2lvbihvUHJvcGVydHkpKSwgZmFsc2UsIFVJLklzVHJhbnNpZW50QmluZGluZyksXG5cdFx0aXNFZGl0YWJsZVxuXHQpO1xuXHRpZiAoYkFzT2JqZWN0KSB7XG5cdFx0cmV0dXJuIGFuZChlZGl0YWJsZUV4cHJlc3Npb24sIGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbik7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGFuZChlZGl0YWJsZUV4cHJlc3Npb24sIGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbikpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbGxhYm9yYXRpb25FeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRmb3JtYXR0ZXI6IGFueVxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGFueT4ge1xuXHRjb25zdCBvYmplY3RQYXRoID0gZ2V0VGFyZ2V0T2JqZWN0UGF0aChkYXRhTW9kZWxPYmplY3RQYXRoKTtcblx0Y29uc3QgYWN0aXZpdHlFeHByZXNzaW9uID0gcGF0aEluTW9kZWwoYC9jb2xsYWJvcmF0aW9uL2FjdGl2aXRpZXMke29iamVjdFBhdGh9YCwgXCJpbnRlcm5hbFwiKTtcblx0Y29uc3Qga2V5cyA9IGRhdGFNb2RlbE9iamVjdFBhdGg/LnRhcmdldEVudGl0eVR5cGU/LmtleXM7XG5cdGNvbnN0IGtleXNFeHByZXNzaW9uczogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGFueT5bXSA9IFtdO1xuXHRrZXlzPy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcblx0XHRjb25zdCBrZXlFeHByZXNzaW9uID0gcGF0aEluTW9kZWwoa2V5Lm5hbWUpO1xuXHRcdGtleXNFeHByZXNzaW9ucy5wdXNoKGtleUV4cHJlc3Npb24pO1xuXHR9KTtcblx0cmV0dXJuIGZvcm1hdFJlc3VsdChbYWN0aXZpdHlFeHByZXNzaW9uLCAuLi5rZXlzRXhwcmVzc2lvbnNdLCBmb3JtYXR0ZXIpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRFbmFibGVkRXhwcmVzc2lvbkFzT2JqZWN0ID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ/OiBhbnlcbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBnZXRFbmFibGVkRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoLCBvRGF0YUZpZWxkQ29udmVydGVkLCB0cnVlKSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG59O1xuLyoqXG4gKiBDcmVhdGUgdGhlIGV4cHJlc3Npb24gdG8gZ2VuZXJhdGUgYW4gXCJlbmFibGVkXCIgYm9vbGVhbiB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gb1Byb3BlcnR5UGF0aCBUaGUgaW5wdXQgcHJvcGVydHlcbiAqIEBwYXJhbSBvRGF0YUZpZWxkQ29udmVydGVkIFRoZSBEYXRhRmllbGRDb252ZXJ0ZWQgT2JqZWN0IHRvIHJlYWQgdGhlIGZpZWxkQ29udHJvbCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gYkFzT2JqZWN0IFdoZXRoZXIgb3Igbm90IHRoaXMgc2hvdWxkIGJlIHJldHVybmVkIGFzIGFuIG9iamVjdCBvciBhIGJpbmRpbmcgc3RyaW5nXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIHRvIGRldGVybWluZSBpZiBhIHByb3BlcnR5IGlzIGVuYWJsZWQgb3Igbm90XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFbmFibGVkRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRvRGF0YUZpZWxkQ29udmVydGVkPzogYW55LFxuXHRiQXNPYmplY3Q6IGJvb2xlYW4gPSBmYWxzZVxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRpZiAoIW9Qcm9wZXJ0eVBhdGggfHwgdHlwZW9mIG9Qcm9wZXJ0eVBhdGggPT09IFwic3RyaW5nXCIpIHtcblx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24odHJ1ZSk7XG5cdH1cblx0bGV0IGRhdGFGaWVsZEVuYWJsZWRFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudCh0cnVlKTtcblx0aWYgKG9EYXRhRmllbGRDb252ZXJ0ZWQgIT09IG51bGwpIHtcblx0XHRkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbiA9IGlmRWxzZShpc0Rpc2FibGVkRXhwcmVzc2lvbihvRGF0YUZpZWxkQ29udmVydGVkKSwgZmFsc2UsIHRydWUpO1xuXHR9XG5cblx0Y29uc3Qgb1Byb3BlcnR5OiBQcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXHQvLyBFbmFibGVtZW50IGRlcGVuZHMgb24gdGhlIGZpZWxkIGNvbnRyb2wgZXhwcmVzc2lvblxuXHQvLyBJZiB0aGUgRmllbGQgY29udHJvbCBpcyBzdGF0aWNhbGx5IGluIEluYXBwbGljYWJsZSAoZGlzYWJsZWQpIC0+IG5vdCBlbmFibGVkXG5cdGNvbnN0IGVuYWJsZWRFeHByZXNzaW9uID0gaWZFbHNlKGlzRGlzYWJsZWRFeHByZXNzaW9uKG9Qcm9wZXJ0eSksIGZhbHNlLCB0cnVlKTtcblx0aWYgKGJBc09iamVjdCkge1xuXHRcdHJldHVybiBhbmQoZW5hYmxlZEV4cHJlc3Npb24sIGRhdGFGaWVsZEVuYWJsZWRFeHByZXNzaW9uKTtcblx0fVxuXHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oYW5kKGVuYWJsZWRFeHByZXNzaW9uLCBkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbikpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgdGhlIGV4cHJlc3Npb24gdG8gZ2VuZXJhdGUgYW4gXCJlZGl0TW9kZVwiIGVudW0gdmFsdWUuXG4gKlxuICogQHBhcmFtIG9Qcm9wZXJ0eVBhdGggVGhlIGlucHV0IHByb3BlcnR5XG4gKiBAcGFyYW0gb0RhdGFNb2RlbE9iamVjdFBhdGggVGhlIGxpc3Qgb2YgZGF0YSBtb2RlbCBvYmplY3RzIHRoYXQgYXJlIGludm9sdmVkIHRvIHJlYWNoIHRoYXQgcHJvcGVydHlcbiAqIEBwYXJhbSBiTWVhc3VyZVJlYWRPbmx5IFdoZXRoZXIgd2Ugc2hvdWxkIHNldCBVb00gLyBjdXJyZW5jeSBmaWVsZCBtb2RlIHRvIHJlYWQgb25seVxuICogQHBhcmFtIGJBc09iamVjdCBXaGV0aGVyIHdlIHNob3VsZCByZXR1cm4gdGhpcyBhcyBhbiBleHByZXNzaW9uIG9yIGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0gb0RhdGFGaWVsZENvbnZlcnRlZCBUaGUgZGF0YUZpZWxkIG9iamVjdFxuICogQHBhcmFtIGlzRWRpdGFibGUgV2hldGhlciBvciBub3QgVUkuSXNFZGl0YWJsZSBiZSBjb25zaWRlcmVkLlxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgcHJvcGVydHkgZWRpdCBtb2RlLCBjb21wbGlhbnQgd2l0aCB0aGUgTURDIEZpZWxkIGRlZmluaXRpb24gb2YgZWRpdE1vZGUuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFZGl0TW9kZSA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRvRGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0Yk1lYXN1cmVSZWFkT25seTogYm9vbGVhbiA9IGZhbHNlLFxuXHRiQXNPYmplY3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0b0RhdGFGaWVsZENvbnZlcnRlZDogYW55ID0gbnVsbCxcblx0aXNFZGl0YWJsZTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gVUkuSXNFZGl0YWJsZVxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiB7XG5cdGlmICghb1Byb3BlcnR5UGF0aCB8fCB0eXBlb2Ygb1Byb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybiBcIkRpc3BsYXlcIjtcblx0fVxuXHRjb25zdCBvUHJvcGVydHk6IFByb3BlcnR5ID0gKGlzUGF0aEV4cHJlc3Npb24ob1Byb3BlcnR5UGF0aCkgJiYgb1Byb3BlcnR5UGF0aC4kdGFyZ2V0KSB8fCAob1Byb3BlcnR5UGF0aCBhcyBQcm9wZXJ0eSk7XG5cdC8vIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgZW5hYmxlZCA9PiBEaXNhYmxlZFxuXHQvLyBpZiB0aGUgcHJvcGVydHkgaXMgZW5hYmxlZCAmJiBub3QgZWRpdGFibGUgPT4gUmVhZE9ubHlcblx0Ly8gaWYgdGhlIHByb3BlcnR5IGlzIGVuYWJsZWQgJiYgZWRpdGFibGUgPT4gRWRpdGFibGVcblx0Ly8gSWYgdGhlcmUgaXMgYW4gYXNzb2NpYXRlZCB1bml0LCBhbmQgaXQgaGFzIGEgZmllbGQgY29udHJvbCBhbHNvIHVzZSBjb25zaWRlciB0aGUgZm9sbG93aW5nXG5cdC8vIGlmIHRoZSB1bml0IGZpZWxkIGNvbnRyb2wgaXMgcmVhZG9ubHkgLT4gRWRpdGFibGVSZWFkT25seVxuXHQvLyBvdGhlcndpc2UgLT4gRWRpdGFibGVcblx0Y29uc3QgZWRpdGFibGVFeHByZXNzaW9uID0gZ2V0RWRpdGFibGVFeHByZXNzaW9uQXNPYmplY3Qob1Byb3BlcnR5UGF0aCwgb0RhdGFGaWVsZENvbnZlcnRlZCwgb0RhdGFNb2RlbE9iamVjdFBhdGgsIGlzRWRpdGFibGUpO1xuXG5cdGNvbnN0IGVuYWJsZWRFeHByZXNzaW9uID0gZ2V0RW5hYmxlZEV4cHJlc3Npb25Bc09iamVjdChvUHJvcGVydHlQYXRoLCBvRGF0YUZpZWxkQ29udmVydGVkKTtcblx0Y29uc3QgYXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eShvUHJvcGVydHkpO1xuXHRjb25zdCB1bml0UHJvcGVydHkgPSBhc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSB8fCBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KG9Qcm9wZXJ0eSk7XG5cdGxldCByZXN1bHRFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiA9IGNvbnN0YW50KFwiRWRpdGFibGVcIik7XG5cdGlmICh1bml0UHJvcGVydHkpIHtcblx0XHRyZXN1bHRFeHByZXNzaW9uID0gaWZFbHNlKFxuXHRcdFx0b3IoaXNSZWFkT25seUV4cHJlc3Npb24odW5pdFByb3BlcnR5KSwgaXNDb21wdXRlZCh1bml0UHJvcGVydHkpLCBiTWVhc3VyZVJlYWRPbmx5KSxcblx0XHRcdFwiRWRpdGFibGVSZWFkT25seVwiLFxuXHRcdFx0XCJFZGl0YWJsZVwiXG5cdFx0KTtcblx0fVxuXHRjb25zdCByZWFkT25seUV4cHJlc3Npb24gPSBvcihpc1JlYWRPbmx5RXhwcmVzc2lvbihvUHJvcGVydHkpLCBpc1JlYWRPbmx5RXhwcmVzc2lvbihvRGF0YUZpZWxkQ29udmVydGVkKSk7XG5cblx0Ly8gaWYgdGhlIHByb3BlcnR5IGlzIGZyb20gYSBub24tdXBkYXRhYmxlIGVudGl0eSA9PiBSZWFkIG9ubHkgbW9kZSwgcHJldmlvdXNseSBjYWxjdWxhdGVkIGVkaXQgTW9kZSBpcyBpZ25vcmVkXG5cdC8vIGlmIHRoZSBwcm9wZXJ0eSBpcyBmcm9tIGFuIHVwZGF0YWJsZSBlbnRpdHkgPT4gcHJldmlvdXNseSBjYWxjdWxhdGVkIGVkaXQgTW9kZSBleHByZXNzaW9uXG5cdGNvbnN0IGVkaXRNb2RlRXhwcmVzc2lvbiA9IGlmRWxzZShcblx0XHRlbmFibGVkRXhwcmVzc2lvbixcblx0XHRpZkVsc2UoXG5cdFx0XHRlZGl0YWJsZUV4cHJlc3Npb24sXG5cdFx0XHRyZXN1bHRFeHByZXNzaW9uLFxuXHRcdFx0aWZFbHNlKGFuZCghaXNDb25zdGFudChyZWFkT25seUV4cHJlc3Npb24pICYmIHJlYWRPbmx5RXhwcmVzc2lvbiwgaXNFZGl0YWJsZSksIFwiUmVhZE9ubHlcIiwgXCJEaXNwbGF5XCIpXG5cdFx0KSxcblx0XHRpZkVsc2UoaXNFZGl0YWJsZSwgXCJEaXNhYmxlZFwiLCBcIkRpc3BsYXlcIilcblx0KTtcblx0aWYgKGJBc09iamVjdCkge1xuXHRcdHJldHVybiBlZGl0TW9kZUV4cHJlc3Npb247XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGVkaXRNb2RlRXhwcmVzc2lvbik7XG59O1xuXG5leHBvcnQgY29uc3QgaGFzVmFsaWRBbmFseXRpY2FsQ3VycmVuY3lPclVuaXQgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGhcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0Y29uc3Qgb1Byb3BlcnR5RGVmaW5pdGlvbiA9IG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0IGFzIFByb3BlcnR5O1xuXHRjb25zdCBjdXJyZW5jeSA9IG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeTtcblx0Y29uc3QgbWVhc3VyZSA9IGN1cnJlbmN5ID8gY3VycmVuY3kgOiBvUHJvcGVydHlEZWZpbml0aW9uLmFubm90YXRpb25zPy5NZWFzdXJlcz8uVW5pdDtcblx0aWYgKG1lYXN1cmUpIHtcblx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24ob3IoaXNUcnV0aHkoZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKG1lYXN1cmUpIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+KSwgbm90KFVJLklzVG90YWwpKSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGNvbnN0YW50KHRydWUpKTtcblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IGlmVW5pdEVkaXRhYmxlID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdHNFZGl0YWJsZVZhbHVlOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiB8IHN0cmluZyxcblx0c05vbkVkaXRhYmxlVmFsdWU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+IHwgc3RyaW5nXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXHRjb25zdCB1bml0UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eShvUHJvcGVydHkpIHx8IGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkob1Byb3BlcnR5KTtcblx0aWYgKCF1bml0UHJvcGVydHkpIHtcblx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oc05vbkVkaXRhYmxlVmFsdWUpO1xuXHR9XG5cdGNvbnN0IGVkaXRhYmxlRXhwcmVzc2lvbiA9IGFuZChub3QoaXNSZWFkT25seUV4cHJlc3Npb24odW5pdFByb3BlcnR5KSksIG5vdChpc0NvbXB1dGVkKHVuaXRQcm9wZXJ0eSkpKTtcblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGlmRWxzZShlZGl0YWJsZUV4cHJlc3Npb24sIHNFZGl0YWJsZVZhbHVlLCBzTm9uRWRpdGFibGVWYWx1ZSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZpZWxkRGlzcGxheSA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRzVGFyZ2V0RGlzcGxheU1vZGU6IHN0cmluZyxcblx0b0NvbXB1dGVkRWRpdE1vZGU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+XG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXG5cdHJldHVybiBoYXNWYWx1ZUhlbHAob1Byb3BlcnR5KVxuXHRcdD8gY29tcGlsZUV4cHJlc3Npb24oc1RhcmdldERpc3BsYXlNb2RlKVxuXHRcdDogY29tcGlsZUV4cHJlc3Npb24oaWZFbHNlKGVxdWFsKG9Db21wdXRlZEVkaXRNb2RlLCBcIkVkaXRhYmxlXCIpLCBcIlZhbHVlXCIsIHNUYXJnZXREaXNwbGF5TW9kZSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24gPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eTogUHJvcGVydHksXG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+LFxuXHRpZ25vcmVDb25zdHJhaW50cz86IGJvb2xlYW5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0Y29uc3Qgb3V0RXhwcmVzc2lvbjogUGF0aEluTW9kZWxFeHByZXNzaW9uPGFueT4gPSBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uIGFzIFBhdGhJbk1vZGVsRXhwcmVzc2lvbjxhbnk+O1xuXHRpZiAob1Byb3BlcnR5Ll90eXBlID09PSBcIlByb3BlcnR5XCIpIHtcblx0XHRjb25zdCBvVGFyZ2V0TWFwcGluZyA9IEVETV9UWVBFX01BUFBJTkdbb1Byb3BlcnR5LnR5cGVdO1xuXHRcdGlmIChvVGFyZ2V0TWFwcGluZykge1xuXHRcdFx0b3V0RXhwcmVzc2lvbi50eXBlID0gb1RhcmdldE1hcHBpbmcudHlwZTtcblx0XHRcdGlmIChvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cyAmJiAhaWdub3JlQ29uc3RyYWludHMpIHtcblx0XHRcdFx0b3V0RXhwcmVzc2lvbi5jb25zdHJhaW50cyA9IHt9O1xuXHRcdFx0XHRpZiAob1RhcmdldE1hcHBpbmcuY29uc3RyYWludHMuJFNjYWxlICYmIG9Qcm9wZXJ0eS5zY2FsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5jb25zdHJhaW50cy5zY2FsZSA9IG9Qcm9wZXJ0eS5zY2FsZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob1RhcmdldE1hcHBpbmcuY29uc3RyYWludHMuJFByZWNpc2lvbiAmJiBvUHJvcGVydHkucHJlY2lzaW9uICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRvdXRFeHByZXNzaW9uLmNvbnN0cmFpbnRzLnByZWNpc2lvbiA9IG9Qcm9wZXJ0eS5wcmVjaXNpb247XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzLiRNYXhMZW5ndGggJiYgb1Byb3BlcnR5Lm1heExlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5jb25zdHJhaW50cy5tYXhMZW5ndGggPSBvUHJvcGVydHkubWF4TGVuZ3RoO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvUHJvcGVydHkubnVsbGFibGUgPT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5jb25zdHJhaW50cy5udWxsYWJsZSA9IG9Qcm9wZXJ0eS5udWxsYWJsZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0b1RhcmdldE1hcHBpbmcuY29uc3RyYWludHNbXCJAT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWluaW11bS8kRGVjaW1hbFwiXSAmJlxuXHRcdFx0XHRcdG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bSAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdFx0IWlzTmFOKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucy5WYWxpZGF0aW9uLk1pbmltdW0pXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMubWluaW11bSA9IGAke29Qcm9wZXJ0eS5hbm5vdGF0aW9ucy5WYWxpZGF0aW9uLk1pbmltdW19YDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0b1RhcmdldE1hcHBpbmcuY29uc3RyYWludHNbXCJAT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWF4aW11bS8kRGVjaW1hbFwiXSAmJlxuXHRcdFx0XHRcdG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bSAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdFx0IWlzTmFOKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucy5WYWxpZGF0aW9uLk1heGltdW0pXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMubWF4aW11bSA9IGAke29Qcm9wZXJ0eS5hbm5vdGF0aW9ucy5WYWxpZGF0aW9uLk1heGltdW19YDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvUHJvcGVydHkubnVsbGFibGUgPT09IGZhbHNlKSB7XG5cdFx0XHRcdG91dEV4cHJlc3Npb24uY29uc3RyYWludHMgPSB7fTtcblx0XHRcdFx0b3V0RXhwcmVzc2lvbi5jb25zdHJhaW50cy5udWxsYWJsZSA9IG9Qcm9wZXJ0eS5udWxsYWJsZTtcblx0XHRcdH1cblx0XHRcdGlmIChvdXRFeHByZXNzaW9uPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50XCIpID09PSAwKSB7XG5cdFx0XHRcdGlmICghb3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zKSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zID0ge307XG5cdFx0XHRcdH1cblx0XHRcdFx0b3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zID0gT2JqZWN0LmFzc2lnbihvdXRFeHByZXNzaW9uLmZvcm1hdE9wdGlvbnMsIHtcblx0XHRcdFx0XHRwYXJzZUFzU3RyaW5nOiBmYWxzZSxcblx0XHRcdFx0XHRlbXB0eVN0cmluZzogXCJcIlxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGlmIChvdXRFeHByZXNzaW9uLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCIpIHtcblx0XHRcdFx0aWYgKCFvdXRFeHByZXNzaW9uLmZvcm1hdE9wdGlvbnMpIHtcblx0XHRcdFx0XHRvdXRFeHByZXNzaW9uLmZvcm1hdE9wdGlvbnMgPSB7fTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvdXRFeHByZXNzaW9uLmZvcm1hdE9wdGlvbnMucGFyc2VLZWVwc0VtcHR5U3RyaW5nID0gdHJ1ZTtcblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0b1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LltcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNEaWdpdFNlcXVlbmNlXCJdICYmXG5cdFx0XHRcdFx0b1Byb3BlcnR5LmFubm90YXRpb25zPy5Db21tb24/LklzRGlnaXRTZXF1ZW5jZVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRvdXRFeHByZXNzaW9uLmNvbnN0cmFpbnRzLmlzRGlnaXRTZXF1ZW5jZSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChvdXRFeHByZXNzaW9uPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRG91YmxlXCIpID09PSAwKSB7XG5cdFx0XHRcdGlmICghb3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zKSB7XG5cdFx0XHRcdFx0b3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zID0ge307XG5cdFx0XHRcdH1cblx0XHRcdFx0b3V0RXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zID0gT2JqZWN0LmFzc2lnbihvdXRFeHByZXNzaW9uLmZvcm1hdE9wdGlvbnMsIHtcblx0XHRcdFx0XHRwYXJzZUFzU3RyaW5nOiBmYWxzZSxcblx0XHRcdFx0XHRlbXB0eVN0cmluZzogXCJcIlxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGlmIChvdXRFeHByZXNzaW9uPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRGF0ZVRpbWVPZmZzZXRcIikgPT09IDApIHtcblx0XHRcdFx0b3V0RXhwcmVzc2lvbi5jb25zdHJhaW50cy5WNCA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvdXRFeHByZXNzaW9uO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFR5cGVDb25maWcgPSBmdW5jdGlvbiAob1Byb3BlcnR5OiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsIGRhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBhbnkge1xuXHRjb25zdCBvVGFyZ2V0TWFwcGluZyA9IEVETV9UWVBFX01BUFBJTkdbKG9Qcm9wZXJ0eSBhcyBQcm9wZXJ0eSk/LnR5cGVdIHx8IChkYXRhVHlwZSA/IEVETV9UWVBFX01BUFBJTkdbZGF0YVR5cGVdIDogdW5kZWZpbmVkKTtcblx0Y29uc3QgcHJvcGVydHlUeXBlQ29uZmlnOiBjb25maWdUeXBlID0ge1xuXHRcdHR5cGU6IG9UYXJnZXRNYXBwaW5nLnR5cGUsXG5cdFx0Y29uc3RyYWludHM6IHt9LFxuXHRcdGZvcm1hdE9wdGlvbnM6IHt9XG5cdH07XG5cdGlmIChpc1Byb3BlcnR5KG9Qcm9wZXJ0eSkpIHtcblx0XHRwcm9wZXJ0eVR5cGVDb25maWcuY29uc3RyYWludHMgPSB7XG5cdFx0XHRzY2FsZTogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRTY2FsZSA/IG9Qcm9wZXJ0eS5zY2FsZSA6IHVuZGVmaW5lZCxcblx0XHRcdHByZWNpc2lvbjogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRQcmVjaXNpb24gPyBvUHJvcGVydHkucHJlY2lzaW9uIDogdW5kZWZpbmVkLFxuXHRcdFx0bWF4TGVuZ3RoOiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJE1heExlbmd0aCA/IG9Qcm9wZXJ0eS5tYXhMZW5ndGggOiB1bmRlZmluZWQsXG5cdFx0XHRudWxsYWJsZTogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiROdWxsYWJsZSA/IG9Qcm9wZXJ0eS5udWxsYWJsZSA6IHVuZGVmaW5lZCxcblx0XHRcdG1pbmltdW06XG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWluaW11bS8kRGVjaW1hbFwiXSAmJlxuXHRcdFx0XHQhaXNOYU4ob1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtKVxuXHRcdFx0XHRcdD8gYCR7b1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtfWBcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdG1heGltdW06XG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWF4aW11bS8kRGVjaW1hbFwiXSAmJlxuXHRcdFx0XHQhaXNOYU4ob1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtKVxuXHRcdFx0XHRcdD8gYCR7b1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtfWBcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdGlzRGlnaXRTZXF1ZW5jZTpcblx0XHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCIgJiZcblx0XHRcdFx0b1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LltcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNEaWdpdFNlcXVlbmNlXCJdICYmXG5cdFx0XHRcdG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5Jc0RpZ2l0U2VxdWVuY2Vcblx0XHRcdFx0XHQ/IHRydWVcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdFY0OiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJFY0ID8gdHJ1ZSA6IHVuZGVmaW5lZFxuXHRcdH07XG5cdH1cblx0cHJvcGVydHlUeXBlQ29uZmlnLmZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0cGFyc2VBc1N0cmluZzpcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkludFwiKSA9PT0gMCB8fFxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRG91YmxlXCIpID09PSAwXG5cdFx0XHRcdD8gZmFsc2Vcblx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0ZW1wdHlTdHJpbmc6XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnRcIikgPT09IDAgfHxcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRvdWJsZVwiKSA9PT0gMFxuXHRcdFx0XHQ/IFwiXCJcblx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0cGFyc2VLZWVwc0VtcHR5U3RyaW5nOiBwcm9wZXJ0eVR5cGVDb25maWcudHlwZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5TdHJpbmdcIiA/IHRydWUgOiB1bmRlZmluZWRcblx0fTtcblx0cmV0dXJuIHByb3BlcnR5VHlwZUNvbmZpZztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCaW5kaW5nV2l0aFVuaXRPckN1cnJlbmN5ID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPixcblx0aWdub3JlVW5pdENvbnN0cmFpbnQ/OiBib29sZWFuLFxuXHRmb3JtYXRPcHRpb25zPzogYW55XG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eURlZmluaXRpb24gPSBvUHJvcGVydHlEYXRhTW9kZWxQYXRoLnRhcmdldE9iamVjdCBhcyBQcm9wZXJ0eTtcblx0bGV0IHVuaXQgPSBvUHJvcGVydHlEZWZpbml0aW9uLmFubm90YXRpb25zPy5NZWFzdXJlcz8uVW5pdDtcblx0Y29uc3QgcmVsYXRpdmVMb2NhdGlvbiA9IGdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uKFxuXHRcdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGguY29udGV4dExvY2F0aW9uLFxuXHRcdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXNcblx0KS5tYXAoKG5wKSA9PiBucC5uYW1lKTtcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiA9IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24ob1Byb3BlcnR5RGVmaW5pdGlvbiwgcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbik7XG5cdGlmICh1bml0Py50b1N0cmluZygpID09PSBcIiVcIikge1xuXHRcdHJldHVybiBmb3JtYXRSZXN1bHQoW3Byb3BlcnR5QmluZGluZ0V4cHJlc3Npb25dLCB2YWx1ZUZvcm1hdHRlcnMuZm9ybWF0V2l0aFBlcmNlbnRhZ2UpO1xuXHR9XG5cdGNvbnN0IGNvbXBsZXhUeXBlID0gdW5pdCA/IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuVW5pdFwiIDogXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5DdXJyZW5jeVwiO1xuXHR1bml0ID0gdW5pdCA/IHVuaXQgOiBvUHJvcGVydHlEZWZpbml0aW9uLmFubm90YXRpb25zPy5NZWFzdXJlcz8uSVNPQ3VycmVuY3k7XG5cdGNvbnN0IHVuaXRCaW5kaW5nRXhwcmVzc2lvbiA9ICh1bml0IGFzIGFueSkuJHRhcmdldFxuXHRcdD8gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihcblx0XHRcdFx0KHVuaXQgYXMgYW55KS4kdGFyZ2V0LFxuXHRcdFx0XHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odW5pdCwgcmVsYXRpdmVMb2NhdGlvbikgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4sXG5cdFx0XHRcdGlnbm9yZVVuaXRDb25zdHJhaW50XG5cdFx0ICApXG5cdFx0OiAoZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHVuaXQsIHJlbGF0aXZlTG9jYXRpb24pIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+KTtcblxuXHRyZXR1cm4gYWRkVHlwZUluZm9ybWF0aW9uKFtwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uLCB1bml0QmluZGluZ0V4cHJlc3Npb25dLCBjb21wbGV4VHlwZSwgdW5kZWZpbmVkLCBmb3JtYXRPcHRpb25zKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCaW5kaW5nRm9yVW5pdE9yQ3VycmVuY3kgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGhcbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+IHwgc3RyaW5nIHtcblx0Y29uc3Qgb1Byb3BlcnR5RGVmaW5pdGlvbiA9IG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgudGFyZ2V0T2JqZWN0IGFzIFByb3BlcnR5O1xuXG5cdGxldCB1bml0ID0gb1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdGlmICh1bml0Py50b1N0cmluZygpID09PSBcIiVcIikge1xuXHRcdHJldHVybiBjb25zdGFudChcIiVcIik7XG5cdH1cblx0Y29uc3QgcmVsYXRpdmVMb2NhdGlvbiA9IGdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uKFxuXHRcdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGguY29udGV4dExvY2F0aW9uLFxuXHRcdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXNcblx0KS5tYXAoKG5wKSA9PiBucC5uYW1lKTtcblxuXHRjb25zdCBjb21wbGV4VHlwZSA9IHVuaXQgPyBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlVuaXRcIiA6IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuQ3VycmVuY3lcIjtcblx0dW5pdCA9IHVuaXQgPyB1bml0IDogb1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5O1xuXHRjb25zdCB1bml0QmluZGluZ0V4cHJlc3Npb24gPSAodW5pdCBhcyBhbnkpLiR0YXJnZXRcblx0XHQ/IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24oXG5cdFx0XHRcdCh1bml0IGFzIGFueSkuJHRhcmdldCxcblx0XHRcdFx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHVuaXQsIHJlbGF0aXZlTG9jYXRpb24pIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+XG5cdFx0ICApXG5cdFx0OiAoZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHVuaXQsIHJlbGF0aXZlTG9jYXRpb24pIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+KTtcblxuXHRsZXQgcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiA9IHBhdGhJbk1vZGVsKFxuXHRcdGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgob1Byb3BlcnR5RGF0YU1vZGVsUGF0aClcblx0KSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPjtcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiA9IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24ob1Byb3BlcnR5RGVmaW5pdGlvbiwgcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiwgdHJ1ZSk7XG5cdHJldHVybiBhZGRUeXBlSW5mb3JtYXRpb24oW3Byb3BlcnR5QmluZGluZ0V4cHJlc3Npb24sIHVuaXRCaW5kaW5nRXhwcmVzc2lvbl0sIGNvbXBsZXhUeXBlLCB1bmRlZmluZWQsIHtcblx0XHRwYXJzZUtlZXBzRW1wdHlTdHJpbmc6IHRydWUsXG5cdFx0ZW1wdHlTdHJpbmc6IFwiXCIsXG5cdFx0c2hvd051bWJlcjogZmFsc2Vcblx0fSk7XG59O1xuZXhwb3J0IGNvbnN0IGdldEJpbmRpbmdXaXRoVGltZXpvbmUgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+LFxuXHRpZ25vcmVVbml0Q29uc3RyYWludD86IGJvb2xlYW4sXG5cdGhpZGVUaW1lem9uZUZvckVtcHR5VmFsdWVzPzogYm9vbGVhblxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBvUHJvcGVydHlEZWZpbml0aW9uID0gb1Byb3BlcnR5RGF0YU1vZGVsUGF0aC50YXJnZXRPYmplY3QgYXMgUHJvcGVydHk7XG5cdGNvbnN0IHRpbWV6b25lID0gb1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UaW1lem9uZTtcblx0Y29uc3QgcmVsYXRpdmVMb2NhdGlvbiA9IGdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uKFxuXHRcdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGguY29udGV4dExvY2F0aW9uLFxuXHRcdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXNcblx0KS5tYXAoKG5wKSA9PiBucC5uYW1lKTtcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiA9IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24ob1Byb3BlcnR5RGVmaW5pdGlvbiwgcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbik7XG5cblx0Y29uc3QgY29tcGxleFR5cGUgPSBcInNhcC5mZS5jb3JlLnR5cGUuRGF0ZVRpbWVXaXRoVGltZXpvbmVcIjtcblx0Y29uc3QgdW5pdEJpbmRpbmdFeHByZXNzaW9uID0gKHRpbWV6b25lIGFzIGFueSkuJHRhcmdldFxuXHRcdD8gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihcblx0XHRcdFx0KHRpbWV6b25lIGFzIGFueSkuJHRhcmdldCxcblx0XHRcdFx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHRpbWV6b25lLCByZWxhdGl2ZUxvY2F0aW9uKSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPixcblx0XHRcdFx0aWdub3JlVW5pdENvbnN0cmFpbnRcblx0XHQgIClcblx0XHQ6IChnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odGltZXpvbmUsIHJlbGF0aXZlTG9jYXRpb24pIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+KTtcblx0bGV0IGZvcm1hdE9wdGlvbnM7XG5cdGlmIChoaWRlVGltZXpvbmVGb3JFbXB0eVZhbHVlcykge1xuXHRcdGZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0XHRzaG93VGltZXpvbmVGb3JFbXB0eVZhbHVlczogZmFsc2Vcblx0XHR9O1xuXHR9XG5cdHJldHVybiBhZGRUeXBlSW5mb3JtYXRpb24oW3Byb3BlcnR5QmluZGluZ0V4cHJlc3Npb24sIHVuaXRCaW5kaW5nRXhwcmVzc2lvbl0sIGNvbXBsZXhUeXBlLCB1bmRlZmluZWQsIGZvcm1hdE9wdGlvbnMpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFsaWdubWVudEV4cHJlc3Npb24gPSBmdW5jdGlvbiAoXG5cdG9Db21wdXRlZEVkaXRNb2RlOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPixcblx0c0FsaWduRGlzcGxheTogc3RyaW5nID0gXCJCZWdpblwiLFxuXHRzQWxpZ25FZGl0OiBzdHJpbmcgPSBcIkJlZ2luXCJcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oaWZFbHNlKGVxdWFsKG9Db21wdXRlZEVkaXRNb2RlLCBcIkRpc3BsYXlcIiksIHNBbGlnbkRpc3BsYXksIHNBbGlnbkVkaXQpKTtcbn07XG5cbi8qKlxuICogRm9ybWF0dGVyIGhlbHBlciB0byByZXRyaWV2ZSB0aGUgY29udmVydGVyQ29udGV4dCBmcm9tIHRoZSBtZXRhbW9kZWwgY29udGV4dC5cbiAqXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIG9yaWdpbmFsIG1ldGFtb2RlbCBjb250ZXh0XG4gKiBAcGFyYW0gb0ludGVyZmFjZSBUaGUgY3VycmVudCB0ZW1wbGF0aW5nIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBDb252ZXJ0ZXJDb250ZXh0IHJlcHJlc2VudGluZyB0aGF0IG9iamVjdFxuICovXG5leHBvcnQgY29uc3QgZ2V0Q29udmVydGVyQ29udGV4dCA9IGZ1bmN0aW9uIChvQ29udGV4dDogTWV0YU1vZGVsQ29udGV4dCwgb0ludGVyZmFjZTogQ29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlKTogb2JqZWN0IHwgbnVsbCB7XG5cdGlmIChvSW50ZXJmYWNlICYmIG9JbnRlcmZhY2UuY29udGV4dCkge1xuXHRcdHJldHVybiBjb252ZXJ0TWV0YU1vZGVsQ29udGV4dChvSW50ZXJmYWNlLmNvbnRleHQpO1xuXHR9XG5cdHJldHVybiBudWxsO1xufTtcbmdldENvbnZlcnRlckNvbnRleHQucmVxdWlyZXNJQ29udGV4dCA9IHRydWU7XG5cbi8qKlxuICogRm9ybWF0dGVyIGhlbHBlciB0byByZXRyaWV2ZSB0aGUgZGF0YSBtb2RlbCBvYmplY3RzIHRoYXQgYXJlIGludm9sdmVkIGZyb20gdGhlIG1ldGFtb2RlbCBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgb3JpZ2luYWwgT0RhdGFNZXRhTW9kZWwgY29udGV4dFxuICogQHBhcmFtIG9JbnRlcmZhY2UgVGhlIGN1cnJlbnQgdGVtcGxhdGluZyBjb250ZXh0XG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBlbnRpdHlzZXRzIGFuZCBuYXZwcm9wZXJ0aWVzIHRoYXQgYXJlIGludm9sdmVkIHRvIGdldCB0byBhIHNwZWNpZmljIG9iamVjdCBpbiB0aGUgbWV0YW1vZGVsXG4gKi9cbmV4cG9ydCBjb25zdCBnZXREYXRhTW9kZWxPYmplY3RQYXRoID0gZnVuY3Rpb24gKFxuXHRvQ29udGV4dDogTWV0YU1vZGVsQ29udGV4dCxcblx0b0ludGVyZmFjZTogQ29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlXG4pOiBEYXRhTW9kZWxPYmplY3RQYXRoIHwgbnVsbCB7XG5cdGlmIChvSW50ZXJmYWNlICYmIG9JbnRlcmZhY2UuY29udGV4dCkge1xuXHRcdHJldHVybiBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob0ludGVyZmFjZS5jb250ZXh0KTtcblx0fVxuXHRyZXR1cm4gbnVsbDtcbn07XG5nZXREYXRhTW9kZWxPYmplY3RQYXRoLnJlcXVpcmVzSUNvbnRleHQgPSB0cnVlO1xuXG5leHBvcnQgY29uc3QgaXNDb2xsZWN0aW9uRmllbGQgPSBmdW5jdGlvbiAob0RhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgpOiBib29sZWFuIHtcblx0aWYgKG9EYXRhTW9kZWxQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzPy5sZW5ndGgpIHtcblx0XHRjb25zdCBoYXNPbmVUb01hbnlOYXZpZ2F0aW9uID1cblx0XHRcdG9EYXRhTW9kZWxQYXRoPy5uYXZpZ2F0aW9uUHJvcGVydGllcy5maW5kSW5kZXgoKG9OYXY6IE5hdmlnYXRpb25Qcm9wZXJ0eSkgPT4ge1xuXHRcdFx0XHRpZiAob05hdi5pc0NvbGxlY3Rpb24pIHtcblx0XHRcdFx0XHRpZiAob0RhdGFNb2RlbFBhdGguY29udGV4dExvY2F0aW9uPy5uYXZpZ2F0aW9uUHJvcGVydGllcz8ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHQvL3dlIGNoZWNrIHRoZSBvbmUgdG8gbWFueSBuYXYgaXMgbm90IGFscmVhZHkgcGFydCBvZiB0aGUgY29udGV4dFxuXHRcdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdFx0b0RhdGFNb2RlbFBhdGguY29udGV4dExvY2F0aW9uPy5uYXZpZ2F0aW9uUHJvcGVydGllcy5maW5kSW5kZXgoXG5cdFx0XHRcdFx0XHRcdFx0KG9Db250ZXh0TmF2OiBOYXZpZ2F0aW9uUHJvcGVydHkpID0+IG9Db250ZXh0TmF2Lm5hbWUgPT09IG9OYXYubmFtZVxuXHRcdFx0XHRcdFx0XHQpID09PSAtMVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSkgPiAtMTtcblx0XHRpZiAoaGFzT25lVG9NYW55TmF2aWdhdGlvbikge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmYWxzZTtcbn07XG5leHBvcnQgY29uc3QgZ2V0UmVxdWlyZWRFeHByZXNzaW9uQXNPYmplY3QgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0b0RhdGFGaWVsZENvbnZlcnRlZD86IGFueSxcblx0Zm9yY2VFZGl0TW9kZTogYm9vbGVhbiA9IGZhbHNlXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gZ2V0UmVxdWlyZWRFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgsIG9EYXRhRmllbGRDb252ZXJ0ZWQsIGZvcmNlRWRpdE1vZGUsIHRydWUpIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcbn07XG5leHBvcnQgY29uc3QgZ2V0UmVxdWlyZWRFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ/OiBhbnksXG5cdGZvcmNlRWRpdE1vZGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0YkFzT2JqZWN0OiBib29sZWFuID0gZmFsc2UsXG5cdG9SZXF1aXJlZFByb3BlcnRpZXM6IGFueSA9IHt9XG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGxldCByZXR1cm5FeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdGNvbnN0IGFSZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zID0gb1JlcXVpcmVkUHJvcGVydGllcy5yZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zIHx8IFtdO1xuXHRjb25zdCBhUmVxdWlyZWRQcm9wZXJ0aWVzRnJvbVVwZGF0ZVJlc3RyaWN0aW9ucyA9IG9SZXF1aXJlZFByb3BlcnRpZXMucmVxdWlyZWRQcm9wZXJ0aWVzRnJvbVVwZGF0ZVJlc3RyaWN0aW9ucyB8fCBbXTtcblx0aWYgKCFvUHJvcGVydHlQYXRoIHx8IHR5cGVvZiBvUHJvcGVydHlQYXRoID09PSBcInN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuRXhwcmVzc2lvbiA9IGNvbnN0YW50KGZhbHNlKTtcblx0fSBlbHNlIHtcblx0XHRsZXQgZGF0YUZpZWxkUmVxdWlyZWRFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudCh0cnVlKTtcblx0XHRpZiAob0RhdGFGaWVsZENvbnZlcnRlZCAhPT0gbnVsbCkge1xuXHRcdFx0ZGF0YUZpZWxkUmVxdWlyZWRFeHByZXNzaW9uID0gaXNSZXF1aXJlZEV4cHJlc3Npb24ob0RhdGFGaWVsZENvbnZlcnRlZCk7XG5cdFx0fVxuXHRcdGxldCByZXF1aXJlZFByb3BlcnR5RnJvbUluc2VydFJlc3RyaWN0aW9uc0V4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiA9IGNvbnN0YW50KGZhbHNlKTtcblx0XHRsZXQgcmVxdWlyZWRQcm9wZXJ0eUZyb21VcGRhdGVSZXN0cmljdGlvbnNFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudChmYWxzZSk7XG5cblx0XHRjb25zdCBvUHJvcGVydHk6IFByb3BlcnR5ID0gKGlzUGF0aEV4cHJlc3Npb24ob1Byb3BlcnR5UGF0aCkgJiYgb1Byb3BlcnR5UGF0aC4kdGFyZ2V0KSB8fCAob1Byb3BlcnR5UGF0aCBhcyBQcm9wZXJ0eSk7XG5cdFx0Ly8gRW5hYmxlbWVudCBkZXBlbmRzIG9uIHRoZSBmaWVsZCBjb250cm9sIGV4cHJlc3Npb25cblx0XHQvLyBJZiB0aGUgRmllbGQgY29udHJvbCBpcyBzdGF0aWNhbGx5IGluIEluYXBwbGljYWJsZSAoZGlzYWJsZWQpIC0+IG5vdCBlbmFibGVkXG5cdFx0Y29uc3QgcmVxdWlyZWRFeHByZXNzaW9uID0gaXNSZXF1aXJlZEV4cHJlc3Npb24ob1Byb3BlcnR5KTtcblx0XHRjb25zdCBlZGl0TW9kZSA9IGZvcmNlRWRpdE1vZGUgfHwgVUkuSXNFZGl0YWJsZTtcblx0XHRpZiAoXG5cdFx0XHRhUmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUluc2VydFJlc3RyaWN0aW9ucy5sZW5ndGggJiZcblx0XHRcdGFSZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zLmluY2x1ZGVzKChvUHJvcGVydHlQYXRoIGFzIGFueSkubmFtZSlcblx0XHQpIHtcblx0XHRcdHJlcXVpcmVkUHJvcGVydHlGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zRXhwcmVzc2lvbiA9IGFuZChjb25zdGFudCh0cnVlKSwgVUkuSXNDcmVhdGVNb2RlKTtcblx0XHR9XG5cdFx0aWYgKFxuXHRcdFx0YVJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnMubGVuZ3RoICYmXG5cdFx0XHRhUmVxdWlyZWRQcm9wZXJ0aWVzRnJvbVVwZGF0ZVJlc3RyaWN0aW9ucy5pbmNsdWRlcygob1Byb3BlcnR5UGF0aCBhcyBhbnkpLm5hbWUpXG5cdFx0KSB7XG5cdFx0XHRyZXF1aXJlZFByb3BlcnR5RnJvbVVwZGF0ZVJlc3RyaWN0aW9uc0V4cHJlc3Npb24gPSBhbmQoY29uc3RhbnQodHJ1ZSksIG5vdEVxdWFsKFVJLklzQ3JlYXRlTW9kZSwgdHJ1ZSkpO1xuXHRcdH1cblx0XHRyZXR1cm5FeHByZXNzaW9uID0gb3IoXG5cdFx0XHRhbmQob3IocmVxdWlyZWRFeHByZXNzaW9uLCBkYXRhRmllbGRSZXF1aXJlZEV4cHJlc3Npb24pLCBlZGl0TW9kZSksXG5cdFx0XHRyZXF1aXJlZFByb3BlcnR5RnJvbUluc2VydFJlc3RyaWN0aW9uc0V4cHJlc3Npb24sXG5cdFx0XHRyZXF1aXJlZFByb3BlcnR5RnJvbVVwZGF0ZVJlc3RyaWN0aW9uc0V4cHJlc3Npb25cblx0XHQpO1xuXHR9XG5cblx0aWYgKGJBc09iamVjdCkge1xuXHRcdHJldHVybiByZXR1cm5FeHByZXNzaW9uO1xuXHR9XG5cdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihyZXR1cm5FeHByZXNzaW9uKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZXF1aXJlZEV4cHJlc3Npb25Gb3JDb25uZWN0ZWREYXRhRmllbGQgPSBmdW5jdGlvbiAoXG5cdGRhdGFGaWVsZE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGhcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0Y29uc3QgZGF0YSA9IGRhdGFGaWVsZE9iamVjdFBhdGg/LnRhcmdldE9iamVjdD8uJHRhcmdldD8uRGF0YTtcblx0Y29uc3Qga2V5czogQXJyYXk8c3RyaW5nPiA9IE9iamVjdC5rZXlzKGRhdGEpO1xuXHRjb25zdCBkYXRhRmllbGRzID0gW107XG5cdGxldCBwcm9wZXJ0eVBhdGg7XG5cdGNvbnN0IGlzUmVxdWlyZWRFeHByZXNzaW9uczogKENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+KVtdIHwgdW5kZWZpbmVkID0gW107XG5cdGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcblx0XHRpZiAoZGF0YVtrZXldW1wiJFR5cGVcIl0gJiYgZGF0YVtrZXldW1wiJFR5cGVcIl0uaW5kZXhPZihcIkRhdGFGaWVsZFwiKSA+IC0xKSB7XG5cdFx0XHRkYXRhRmllbGRzLnB1c2goZGF0YVtrZXldKTtcblx0XHR9XG5cdH1cblx0Zm9yIChjb25zdCBkYXRhRmllbGQgb2YgZGF0YUZpZWxkcykge1xuXHRcdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uOlxuXHRcdFx0XHRpZiAodHlwZW9mIGRhdGFGaWVsZC5WYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdHByb3BlcnR5UGF0aCA9IGRhdGFGaWVsZC5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdFx0XHRpZiAoZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0KSB7XG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQgfHxcblx0XHRcdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQuVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlQYXRoID0gZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LlZhbHVlLiR0YXJnZXQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgZGF0YUZpZWxkLlRhcmdldCA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVBhdGggPSBkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHQvLyBubyBkZWZhdWx0XG5cdFx0fVxuXHRcdGlzUmVxdWlyZWRFeHByZXNzaW9ucy5wdXNoKGdldFJlcXVpcmVkRXhwcmVzc2lvbkFzT2JqZWN0KHByb3BlcnR5UGF0aCwgZGF0YUZpZWxkLCBmYWxzZSkpO1xuXHR9XG5cdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihvciguLi4oaXNSZXF1aXJlZEV4cHJlc3Npb25zIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPltdKSkpO1xufTtcbiJdfQ==