@sapui5/sap.fe.core 1.102.3 → 1.105.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 (359) hide show
  1. package/package.json +6 -6
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +120 -0
  4. package/src/sap/fe/core/ActionRuntime.ts +108 -0
  5. package/src/sap/fe/core/AppComponent.js +81 -35
  6. package/src/sap/fe/core/AppComponent.ts +68 -44
  7. package/src/sap/fe/core/AppStateHandler.js +82 -70
  8. package/src/sap/fe/core/AppStateHandler.ts +32 -37
  9. package/src/sap/fe/core/BaseController.js +12 -10
  10. package/src/sap/fe/core/BaseController.ts +15 -13
  11. package/src/sap/fe/core/CommonUtils.js +291 -218
  12. package/src/sap/fe/core/CommonUtils.ts +315 -251
  13. package/src/sap/fe/core/ExtensionAPI.js +25 -28
  14. package/src/sap/fe/core/ExtensionAPI.ts +36 -38
  15. package/src/sap/fe/core/PageController.js +5 -5
  16. package/src/sap/fe/core/PageController.ts +4 -5
  17. package/src/sap/fe/core/TemplateComponent.js +21 -10
  18. package/src/sap/fe/core/TemplateComponent.ts +9 -6
  19. package/src/sap/fe/core/TemplateModel.js +2 -2
  20. package/src/sap/fe/core/TemplateModel.ts +1 -1
  21. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +11 -3
  22. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +8 -2
  23. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +197 -43
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +164 -24
  25. package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +14 -0
  26. package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.ts +5 -0
  27. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +609 -230
  28. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +275 -128
  29. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +30 -30
  30. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +32 -29
  31. package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
  32. package/src/sap/fe/core/controllerextensions/EditFlow.js +761 -700
  33. package/src/sap/fe/core/controllerextensions/EditFlow.ts +478 -514
  34. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +10 -10
  35. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
  36. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +104 -75
  37. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +71 -79
  38. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +68 -68
  39. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +76 -76
  40. package/src/sap/fe/core/controllerextensions/InternalRouting.js +162 -102
  41. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +177 -121
  42. package/src/sap/fe/core/controllerextensions/KPIManagement.js +67 -69
  43. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
  44. package/src/sap/fe/core/controllerextensions/MassEdit.js +10 -10
  45. package/src/sap/fe/core/controllerextensions/MassEdit.ts +20 -27
  46. package/src/sap/fe/core/controllerextensions/MessageHandler.js +21 -13
  47. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -14
  48. package/src/sap/fe/core/controllerextensions/PageReady.js +98 -26
  49. package/src/sap/fe/core/controllerextensions/PageReady.ts +98 -34
  50. package/src/sap/fe/core/controllerextensions/Paginator.js +31 -32
  51. package/src/sap/fe/core/controllerextensions/Paginator.ts +33 -34
  52. package/src/sap/fe/core/controllerextensions/Placeholder.js +5 -7
  53. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  54. package/src/sap/fe/core/controllerextensions/Routing.js +11 -12
  55. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  56. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  57. package/src/sap/fe/core/controllerextensions/Share.js +171 -140
  58. package/src/sap/fe/core/controllerextensions/Share.ts +117 -118
  59. package/src/sap/fe/core/controllerextensions/SideEffects.js +47 -51
  60. package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
  61. package/src/sap/fe/core/controllerextensions/ViewState.js +201 -132
  62. package/src/sap/fe/core/controllerextensions/ViewState.ts +141 -148
  63. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
  64. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
  65. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +13 -12
  66. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +17 -20
  67. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +13 -12
  68. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +15 -15
  69. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +57 -18
  70. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +60 -28
  71. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +29 -21
  72. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1424 -940
  73. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +799 -836
  74. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +410 -377
  75. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +275 -358
  76. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +309 -0
  77. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +320 -0
  78. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +752 -579
  79. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +631 -599
  80. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +92 -74
  81. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +49 -52
  82. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +78 -41
  83. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +110 -84
  84. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +69 -81
  85. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +64 -73
  86. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +18 -2
  87. package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +35 -0
  88. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +25 -24
  89. package/src/sap/fe/core/controls/Any.js +9 -5
  90. package/src/sap/fe/core/controls/Any.ts +10 -4
  91. package/src/sap/fe/core/controls/CommandExecution.js +12 -26
  92. package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
  93. package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -3
  94. package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
  95. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +26 -26
  96. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
  97. package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -3
  98. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
  99. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
  100. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
  101. package/src/sap/fe/core/controls/FieldWrapper.js +3 -3
  102. package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
  103. package/src/sap/fe/core/controls/FileWrapper.js +9 -4
  104. package/src/sap/fe/core/controls/FileWrapper.ts +16 -12
  105. package/src/sap/fe/core/controls/FilterBar.js +7 -3
  106. package/src/sap/fe/core/controls/FilterBar.ts +13 -9
  107. package/src/sap/fe/core/controls/FormElementWrapper.js +2 -2
  108. package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
  109. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  110. package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
  111. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -1
  112. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +44 -19
  113. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +2 -2
  114. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +17 -13
  115. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
  116. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +4 -4
  117. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
  118. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +49 -49
  119. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +54 -54
  120. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
  121. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +22 -35
  122. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
  123. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
  124. package/src/sap/fe/core/converters/ConverterContext.js +48 -34
  125. package/src/sap/fe/core/converters/ConverterContext.ts +81 -67
  126. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  127. package/src/sap/fe/core/converters/ManifestSettings.ts +18 -15
  128. package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
  129. package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
  130. package/src/sap/fe/core/converters/MetaModelConverter.js +74 -40
  131. package/src/sap/fe/core/converters/MetaModelConverter.ts +176 -140
  132. package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
  133. package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
  134. package/src/sap/fe/core/converters/annotations/DataField.js +58 -35
  135. package/src/sap/fe/core/converters/annotations/DataField.ts +102 -76
  136. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1956 -1494
  137. package/src/sap/fe/core/converters/controls/Common/Action.js +78 -51
  138. package/src/sap/fe/core/converters/controls/Common/Action.ts +87 -52
  139. package/src/sap/fe/core/converters/controls/Common/Chart.js +22 -16
  140. package/src/sap/fe/core/converters/controls/Common/Chart.ts +42 -43
  141. package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
  142. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
  143. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +65 -29
  144. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +93 -62
  145. package/src/sap/fe/core/converters/controls/Common/Form.js +31 -31
  146. package/src/sap/fe/core/converters/controls/Common/Form.ts +46 -57
  147. package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
  148. package/src/sap/fe/core/converters/controls/Common/KPI.ts +49 -52
  149. package/src/sap/fe/core/converters/controls/Common/Table.js +251 -264
  150. package/src/sap/fe/core/converters/controls/Common/Table.ts +344 -370
  151. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
  152. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +147 -144
  153. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +89 -59
  154. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +118 -71
  155. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
  156. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
  157. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
  158. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
  159. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +131 -95
  160. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +123 -87
  161. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +98 -87
  162. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +121 -117
  163. package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
  164. package/src/sap/fe/core/converters/helpers/Aggregation.ts +12 -15
  165. package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
  166. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
  167. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +8 -6
  168. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +18 -10
  169. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +136 -0
  170. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +139 -0
  171. package/src/sap/fe/core/converters/helpers/ID.js +48 -46
  172. package/src/sap/fe/core/converters/helpers/ID.ts +26 -25
  173. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  174. package/src/sap/fe/core/converters/helpers/Key.js +7 -7
  175. package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
  176. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  177. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -5
  178. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
  179. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
  180. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +53 -75
  181. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +59 -90
  182. package/src/sap/fe/core/converters/templates/ListReportConverter.js +58 -57
  183. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +93 -86
  184. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +58 -44
  185. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +87 -80
  186. package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
  187. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
  188. package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
  189. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
  190. package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
  191. package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
  192. package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
  193. package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
  194. package/src/sap/fe/core/formatters/StandardFormatter.js +96 -0
  195. package/src/sap/fe/core/formatters/StandardFormatter.ts +70 -0
  196. package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
  197. package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
  198. package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -1
  199. package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
  200. package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
  201. package/src/sap/fe/core/fpm/Component.js +33 -7
  202. package/src/sap/fe/core/fpm/Component.ts +14 -0
  203. package/src/sap/fe/core/helpers/AnnotationEnum.js +1 -1
  204. package/src/sap/fe/core/helpers/AppStartupHelper.js +19 -18
  205. package/src/sap/fe/core/helpers/AppStartupHelper.ts +41 -43
  206. package/src/sap/fe/core/helpers/BindingToolkit.js +1836 -0
  207. package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +397 -270
  208. package/src/sap/fe/core/helpers/ClassSupport.js +49 -12
  209. package/src/sap/fe/core/helpers/ClassSupport.ts +37 -10
  210. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
  211. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
  212. package/src/sap/fe/core/helpers/EditState.js +1 -6
  213. package/src/sap/fe/core/helpers/EditState.ts +5 -10
  214. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
  215. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
  216. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  217. package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
  218. package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
  219. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
  220. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -1
  221. package/src/sap/fe/core/helpers/MassEditHelper.js +306 -280
  222. package/src/sap/fe/core/helpers/MassEditHelper.ts +380 -360
  223. package/src/sap/fe/core/helpers/MessageStrip.js +81 -0
  224. package/src/sap/fe/core/helpers/MessageStrip.ts +79 -0
  225. package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
  226. package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
  227. package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
  228. package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
  229. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  230. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
  231. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
  232. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
  233. package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
  234. package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
  235. package/src/sap/fe/core/helpers/Synchronization.js +1 -1
  236. package/src/sap/fe/core/helpers/ToES6Promise.js +32 -0
  237. package/src/sap/fe/core/helpers/ToES6Promise.ts +19 -0
  238. package/src/sap/fe/core/jsx-runtime/Fragment.js +16 -0
  239. package/src/sap/fe/core/jsx-runtime/Fragment.ts +3 -0
  240. package/src/sap/fe/core/jsx-runtime/ViewLoader.js +109 -0
  241. package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +47 -0
  242. package/src/sap/fe/core/jsx-runtime/jsx-control.js +110 -0
  243. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +92 -0
  244. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +105 -0
  245. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +89 -0
  246. package/src/sap/fe/core/jsx-runtime/jsx.js +12 -90
  247. package/src/sap/fe/core/jsx-runtime/jsx.ts +24 -85
  248. package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
  249. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +179 -0
  250. package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +150 -0
  251. package/src/sap/fe/core/library.js +42 -3
  252. package/src/sap/fe/core/library.support.js +1 -1
  253. package/src/sap/fe/core/library.ts +38 -0
  254. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
  255. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
  256. package/src/sap/fe/core/messagebundle.properties +39 -67
  257. package/src/sap/fe/core/messagebundle_ar.properties +27 -44
  258. package/src/sap/fe/core/messagebundle_bg.properties +27 -44
  259. package/src/sap/fe/core/messagebundle_ca.properties +27 -44
  260. package/src/sap/fe/core/messagebundle_cs.properties +27 -44
  261. package/src/sap/fe/core/messagebundle_cy.properties +26 -43
  262. package/src/sap/fe/core/messagebundle_da.properties +27 -44
  263. package/src/sap/fe/core/messagebundle_de.properties +25 -42
  264. package/src/sap/fe/core/messagebundle_el.properties +28 -45
  265. package/src/sap/fe/core/messagebundle_en.properties +27 -44
  266. package/src/sap/fe/core/messagebundle_en_GB.properties +27 -44
  267. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +25 -42
  268. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +26 -40
  269. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +25 -42
  270. package/src/sap/fe/core/messagebundle_es.properties +27 -44
  271. package/src/sap/fe/core/messagebundle_es_MX.properties +27 -44
  272. package/src/sap/fe/core/messagebundle_et.properties +27 -44
  273. package/src/sap/fe/core/messagebundle_fi.properties +27 -44
  274. package/src/sap/fe/core/messagebundle_fr.properties +26 -43
  275. package/src/sap/fe/core/messagebundle_fr_CA.properties +25 -42
  276. package/src/sap/fe/core/messagebundle_hi.properties +27 -44
  277. package/src/sap/fe/core/messagebundle_hr.properties +27 -44
  278. package/src/sap/fe/core/messagebundle_hu.properties +27 -44
  279. package/src/sap/fe/core/messagebundle_id.properties +27 -44
  280. package/src/sap/fe/core/messagebundle_it.properties +43 -60
  281. package/src/sap/fe/core/messagebundle_iw.properties +27 -44
  282. package/src/sap/fe/core/messagebundle_ja.properties +27 -44
  283. package/src/sap/fe/core/messagebundle_kk.properties +27 -44
  284. package/src/sap/fe/core/messagebundle_ko.properties +30 -47
  285. package/src/sap/fe/core/messagebundle_lt.properties +27 -44
  286. package/src/sap/fe/core/messagebundle_lv.properties +27 -44
  287. package/src/sap/fe/core/messagebundle_ms.properties +27 -44
  288. package/src/sap/fe/core/messagebundle_nl.properties +29 -46
  289. package/src/sap/fe/core/messagebundle_no.properties +27 -44
  290. package/src/sap/fe/core/messagebundle_pl.properties +28 -45
  291. package/src/sap/fe/core/messagebundle_pt.properties +28 -45
  292. package/src/sap/fe/core/messagebundle_pt_PT.properties +27 -44
  293. package/src/sap/fe/core/messagebundle_ro.properties +27 -44
  294. package/src/sap/fe/core/messagebundle_ru.properties +27 -44
  295. package/src/sap/fe/core/messagebundle_sh.properties +27 -44
  296. package/src/sap/fe/core/messagebundle_sk.properties +27 -44
  297. package/src/sap/fe/core/messagebundle_sl.properties +27 -44
  298. package/src/sap/fe/core/messagebundle_sv.properties +27 -44
  299. package/src/sap/fe/core/messagebundle_th.properties +25 -42
  300. package/src/sap/fe/core/messagebundle_tr.properties +27 -44
  301. package/src/sap/fe/core/messagebundle_uk.properties +27 -44
  302. package/src/sap/fe/core/messagebundle_vi.properties +27 -44
  303. package/src/sap/fe/core/messagebundle_zh_CN.properties +27 -44
  304. package/src/sap/fe/core/messagebundle_zh_TW.properties +27 -44
  305. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -3
  306. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
  307. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +103 -75
  308. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +72 -73
  309. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +2 -2
  310. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
  311. package/src/sap/fe/core/services/NavigationServiceFactory.js +62 -50
  312. package/src/sap/fe/core/services/NavigationServiceFactory.ts +63 -52
  313. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -3
  314. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
  315. package/src/sap/fe/core/services/RoutingServiceFactory.js +56 -56
  316. package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
  317. package/src/sap/fe/core/services/ShellServicesFactory.js +93 -77
  318. package/src/sap/fe/core/services/ShellServicesFactory.ts +95 -82
  319. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +64 -64
  320. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
  321. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +232 -200
  322. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +145 -142
  323. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -2
  324. package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
  325. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
  326. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
  327. package/src/sap/fe/core/support/CommonHelper.js +3 -2
  328. package/src/sap/fe/core/support/CommonHelper.ts +9 -13
  329. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  330. package/src/sap/fe/core/support/Diagnostics.ts +5 -5
  331. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
  332. package/src/sap/fe/core/templating/CommonFormatters.js +85 -0
  333. package/src/sap/fe/core/templating/CommonFormatters.ts +90 -0
  334. package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
  335. package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
  336. package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
  337. package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
  338. package/src/sap/fe/core/templating/DataModelPathHelper.js +23 -15
  339. package/src/sap/fe/core/templating/DataModelPathHelper.ts +47 -34
  340. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  341. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
  342. package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
  343. package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
  344. package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
  345. package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
  346. package/src/sap/fe/core/templating/FilterHelper.js +18 -17
  347. package/src/sap/fe/core/templating/FilterHelper.ts +18 -18
  348. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  349. package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
  350. package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
  351. package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
  352. package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
  353. package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
  354. package/src/sap/fe/core/templating/UIFormatters.js +152 -95
  355. package/src/sap/fe/core/templating/UIFormatters.ts +202 -128
  356. package/src/sap/fe/core/type/DateTimeWithTimezone.js +2 -2
  357. package/src/sap/fe/core/type/Email.js +3 -3
  358. package/src/sap/fe/core/type/Email.ts +2 -2
  359. package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/collaboration/ActivitySync", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler", "sap/fe/core/helpers/EditState", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageBox", "sap/m/Text", "sap/ui/core/Core"], function (Log, CommonUtils, ActivitySync, messageHandling, DataLossOrDraftDiscardHandler, EditState, Button, Dialog, MessageBox, Text, Core) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/collaboration/ActivitySync", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageBox", "sap/m/Text", "sap/ui/core/Core", "./draftDataLossPopup"], function (Log, CommonUtils, ActivitySync, messageHandling, Button, Dialog, MessageBox, Text, Core, draftDataLossPopup) {
6
6
  "use strict";
7
7
 
8
8
  function _catch(body, recover) {
@@ -19,6 +19,117 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
19
19
  return result;
20
20
  }
21
21
 
22
+ /**
23
+ * Creates an active document from a draft document.
24
+ *
25
+ * The function supports several hooks as there is a certain choreography defined.
26
+ *
27
+ * @function
28
+ * @name sap.fe.core.actions.draft#activateDocument
29
+ * @memberof sap.fe.core.actions.draft
30
+ * @static
31
+ * @param oContext Context of the active document for the new draft
32
+ * @param oAppComponent The AppComponent
33
+ * @param mParameters The parameters
34
+ * @param [mParameters.fnBeforeActivateDocument] Callback that allows a veto before the 'Create' request is executed
35
+ * @param [mParameters.fnAfterActivateDocument] Callback for postprocessing after document was activated.
36
+ * @param messageHandler The message handler
37
+ * @returns Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
38
+ * @private
39
+ * @ui5-restricted
40
+ */
41
+ var activateDocument = function (oContext, oAppComponent, mParameters, messageHandler) {
42
+ try {
43
+ function _temp22(bExecute) {
44
+ var _exit5 = false;
45
+
46
+ function _temp20(_result8) {
47
+ return _exit5 ? _result8 : mParam.fnAfterActivateDocument ? mParam.fnAfterActivateDocument(oContext, oActiveDocumentContext) : oActiveDocumentContext;
48
+ }
49
+
50
+ if (!bExecute) {
51
+ throw new Error("Activation of the document was aborted by extension for document: ".concat(oContext.getPath()));
52
+ }
53
+
54
+ var oActiveDocumentContext;
55
+
56
+ var _temp19 = function () {
57
+ if (!hasPrepareAction(oContext)) {
58
+ return Promise.resolve(executeDraftActivationAction(oContext, oAppComponent)).then(function (_executeDraftActivati) {
59
+ oActiveDocumentContext = _executeDraftActivati;
60
+ });
61
+ } else {
62
+ /* activation requires preparation */
63
+ var sBatchGroup = "draft"; // we use the same batchGroup to force prepare and activate in a same batch but with different changeset
64
+
65
+ var oPreparePromise = draft.executeDraftPreparationAction(oContext, sBatchGroup, false);
66
+ oContext.getModel().submitBatch(sBatchGroup);
67
+ var oActivatePromise = draft.executeDraftActivationAction(oContext, oAppComponent, sBatchGroup);
68
+ return _catch(function () {
69
+ return Promise.resolve(Promise.all([oPreparePromise, oActivatePromise])).then(function (values) {
70
+ oActiveDocumentContext = values[1];
71
+ });
72
+ }, function (err) {
73
+ function _temp18() {
74
+ throw err;
75
+ }
76
+
77
+ // BCP 2270084075
78
+ // if the Activation fails, then the messages are retrieved from PREPARATION action
79
+ var sMessagesPath = getMessagePath(oContext);
80
+
81
+ var _temp17 = function () {
82
+ if (sMessagesPath) {
83
+ oPreparePromise = draft.executeDraftPreparationAction(oContext, sBatchGroup, true);
84
+ oContext.getModel().submitBatch(sBatchGroup);
85
+ return Promise.resolve(oPreparePromise).then(function () {
86
+ return Promise.resolve(oContext.requestObject()).then(function (data) {
87
+ if (data[sMessagesPath].length > 0) {
88
+ //if messages are available from the PREPARATION action, then previous transition messages are removed
89
+ messageHandler === null || messageHandler === void 0 ? void 0 : messageHandler.removeTransitionMessages(false, false, oContext.getPath());
90
+ }
91
+ });
92
+ });
93
+ }
94
+ }();
95
+
96
+ return _temp17 && _temp17.then ? _temp17.then(_temp18) : _temp18(_temp17);
97
+ });
98
+ }
99
+ }();
100
+
101
+ return _temp19 && _temp19.then ? _temp19.then(_temp20) : _temp20(_temp19);
102
+ }
103
+
104
+ var mParam = mParameters || {};
105
+
106
+ if (!oContext) {
107
+ throw new Error("Binding context to draft document is required");
108
+ }
109
+
110
+ var _mParam$fnBeforeActiv2 = mParam.fnBeforeActivateDocument;
111
+ return Promise.resolve(_mParam$fnBeforeActiv2 ? Promise.resolve(mParam.fnBeforeActivateDocument(oContext)).then(_temp22) : _temp22(true));
112
+ } catch (e) {
113
+ return Promise.reject(e);
114
+ }
115
+ };
116
+ /**
117
+ * HTTP POST call when DraftAction is present for Draft Delete; HTTP DELETE call when there is no DraftAction
118
+ * and Active Instance always uses DELETE.
119
+ *
120
+ * @function
121
+ * @name sap.fe.core.actions.draft#deleteDraft
122
+ * @memberof sap.fe.core.actions.draft
123
+ * @static
124
+ * @param oContext Context of the document to be discarded
125
+ * @param oAppComponent Context of the document to be discarded
126
+ * @param bEnableStrictHandling
127
+ * @private
128
+ * @returns A Promise resolved when the context is deleted
129
+ * @ui5-restricted
130
+ */
131
+
132
+
22
133
  /**
23
134
  * Creates a draft document from an existing document.
24
135
  *
@@ -28,15 +139,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
28
139
  * @name sap.fe.core.actions.draft#createDraftFromActiveDocument
29
140
  * @memberof sap.fe.core.actions.draft
30
141
  * @static
31
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
32
- * @param {AppComponent} oAppComponent The AppComponent
33
- * @param {object} mParameters The parameters
34
- * @param {boolean} [mParameters.oView] The view
35
- * @param {boolean} [mParameters.bPreserveChanges] Preserve changes of an existing draft of another user
36
- * @param {sap.fe.core.actions.draft.ICallback.beforeCreateDraftFromActiveDocument} [mParameters.fnBeforeCreateDraftFromActiveDocument] Callback that allows veto before create request is executed
37
- * @param {sap.fe.core.actions.draft.ICallback.afterCreateDraftFromActiveDocument} [mParameters.fnAfterCreateDraftFromActiveDocument] Callback for postprocessiong after draft document was created
38
- * @param {sap.fe.core.actions.draft.ICallback.whenDecisionToOverwriteDocumentIsRequired} [mParameters.fnWhenDecisionToOverwriteDocumentIsRequired] Callback for deciding on overwriting an unsaved change by another user
39
- * @returns {Promise} Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
142
+ * @param oContext Context of the active document for the new draft
143
+ * @param oAppComponent The AppComponent
144
+ * @param mParameters The parameters
145
+ * @param [mParameters.oView] The view
146
+ * @param [mParameters.bPreserveChanges] Preserve changes of an existing draft of another user
147
+ * @param [mParameters.fnBeforeCreateDraftFromActiveDocument] Callback that allows veto before create request is executed
148
+ * @param [mParameters.fnAfterCreateDraftFromActiveDocument] Callback for postprocessiong after draft document was created
149
+ * @param [mParameters.fnWhenDecisionToOverwriteDocumentIsRequired] Callback for deciding on overwriting an unsaved change by another user
150
+ * @returns Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
40
151
  * @private
41
152
  * @ui5-restricted
42
153
  */
@@ -49,47 +160,63 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
49
160
  /**
50
161
  * Overwrite or reject based on fnWhenDecisionToOverwriteDocumentIsRequired.
51
162
  *
52
- * @param {*} bOverwrite Overwrite the change or not
53
- * @returns {Promise} Resolves with result of {@link sap.fe.core.actions#executeDraftEditAction}
163
+ * @param bOverwrite Overwrite the change or not
164
+ * @returns Resolves with result of {@link sap.fe.core.actions#executeDraftEditAction}
54
165
  */
55
- function overwriteOnDemand(bOverwrite) {
56
- if (bOverwrite) {
57
- //Overwrite existing changes
58
- var oModel = oContext.getModel();
59
- var draftDataContext = oModel.bindContext(oContext.getPath() + "/DraftAdministrativeData").getBoundContext();
60
- var oResourceBundle;
61
- return mParameters.oView.getModel("sap.fe.i18n").getResourceBundle().then(function (_oResourceBundle) {
62
- oResourceBundle = _oResourceBundle;
63
- return draftDataContext.requestObject();
64
- }).then(function (draftAdminData) {
65
- if (draftAdminData) {
66
- // remove all unbound transition messages as we show a special dialog
67
- messageHandling.removeUnboundTransitionMessages();
68
- var sInfo = draftAdminData.InProcessByUserDescription || draftAdminData.InProcessByUser;
69
- var sEntitySet = mParameters.oView.getViewData().entitySet;
166
+ var overwriteOnDemand = function (bOverwrite) {
167
+ try {
168
+ var _exit4 = false;
70
169
 
71
- if (sInfo) {
72
- var sLockedByUserMsg = CommonUtils.getTranslatedText("C_DRAFT_OBJECT_PAGE_DRAFT_LOCKED_BY_USER", oResourceBundle, sInfo, sEntitySet);
73
- MessageBox.error(sLockedByUserMsg);
74
- throw new Error(sLockedByUserMsg);
75
- } else {
76
- sInfo = draftAdminData.CreatedByUserDescription || draftAdminData.CreatedByUser;
77
- var sUnsavedChangesMsg = CommonUtils.getTranslatedText("C_DRAFT_OBJECT_PAGE_DRAFT_UNSAVED_CHANGES", oResourceBundle, sInfo, sEntitySet);
78
- return showMessageBox(sUnsavedChangesMsg).then(function () {
79
- return executeDraftEditAction(oContext, false);
170
+ function _temp15(_result6) {
171
+ if (_exit4) return _result6;
172
+ throw new Error("Draft creation aborted for document: ".concat(oContext.getPath()));
173
+ }
174
+
175
+ var _temp16 = function () {
176
+ if (bOverwrite) {
177
+ //Overwrite existing changes
178
+ var oModel = oContext.getModel();
179
+ var draftDataContext = oModel.bindContext("".concat(oContext.getPath(), "/DraftAdministrativeData")).getBoundContext();
180
+ return Promise.resolve(mParameters.oView.getModel("sap.fe.i18n").getResourceBundle()).then(function (oResourceBundle) {
181
+ return Promise.resolve(draftDataContext.requestObject()).then(function (draftAdminData) {
182
+ return function () {
183
+ if (draftAdminData) {
184
+ // remove all unbound transition messages as we show a special dialog
185
+ messageHandling.removeUnboundTransitionMessages();
186
+ var sInfo = draftAdminData.InProcessByUserDescription || draftAdminData.InProcessByUser;
187
+ var sEntitySet = mParameters.oView.getViewData().entitySet;
188
+
189
+ if (sInfo) {
190
+ var sLockedByUserMsg = CommonUtils.getTranslatedText("C_DRAFT_OBJECT_PAGE_DRAFT_LOCKED_BY_USER", oResourceBundle, sInfo, sEntitySet);
191
+ MessageBox.error(sLockedByUserMsg);
192
+ throw new Error(sLockedByUserMsg);
193
+ } else {
194
+ sInfo = draftAdminData.CreatedByUserDescription || draftAdminData.CreatedByUser;
195
+ var sUnsavedChangesMsg = CommonUtils.getTranslatedText("C_DRAFT_OBJECT_PAGE_DRAFT_UNSAVED_CHANGES", oResourceBundle, sInfo, sEntitySet);
196
+ return Promise.resolve(showMessageBox(sUnsavedChangesMsg)).then(function () {
197
+ var _executeDraftEditActi = executeDraftEditAction(oContext, false, mParameters.oView);
198
+
199
+ _exit4 = true;
200
+ return _executeDraftEditActi;
201
+ });
202
+ }
203
+ }
204
+ }();
80
205
  });
81
- }
206
+ });
82
207
  }
83
- });
84
- }
208
+ }();
85
209
 
86
- return Promise.reject(new Error("Draft creation aborted for document: " + oContext.getPath()));
87
- }
210
+ return Promise.resolve(_temp16 && _temp16.then ? _temp16.then(_temp15) : _temp15(_temp16));
211
+ } catch (e) {
212
+ return Promise.reject(e);
213
+ }
214
+ };
88
215
 
89
216
  function showMessageBox(sUnsavedChangesMsg) {
90
217
  return new Promise(function (resolve, reject) {
91
218
  var oDialog = new Dialog({
92
- title: localI18nRef.getText("C_DRAFT_OBJECT_PAGE_WARNING"),
219
+ title: localI18nRef.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_WARNING"),
93
220
  state: "Warning",
94
221
  content: new Text({
95
222
  text: sUnsavedChangesMsg
@@ -106,7 +233,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
106
233
  text: localI18nRef.getText("C_COMMON_OBJECT_PAGE_CANCEL"),
107
234
  press: function () {
108
235
  oDialog.close();
109
- reject("Draft creation aborted for document: " + oContext.getPath());
236
+ reject("Draft creation aborted for document: ".concat(oContext.getPath()));
110
237
  }
111
238
  }),
112
239
  afterClose: function () {
@@ -129,12 +256,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
129
256
  var bExecute = mParam.fnBeforeCreateDraftFromActiveDocument ? mParam.fnBeforeCreateDraftFromActiveDocument(oContext, bRunPreserveChangesFlow) : true;
130
257
 
131
258
  if (!bExecute) {
132
- throw new Error("Draft creation was aborted by extension for document: " + oContext.getPath());
259
+ throw new Error("Draft creation was aborted by extension for document: ".concat(oContext.getPath()));
133
260
  }
134
261
 
135
262
  var openingSiblingContext = false;
136
263
  return Promise.resolve(_catch(function () {
137
- function _temp2(_result) {
264
+ function _temp12(_result) {
138
265
  if (_exit2) return _result;
139
266
 
140
267
  if (openingSiblingContext) {
@@ -160,10 +287,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
160
287
  }();
161
288
  }
162
289
 
163
- var oDraftContext = null;
290
+ var oDraftContext;
164
291
 
165
- var _temp = _catch(function () {
166
- return Promise.resolve(draft.executeDraftEditAction(oContext, bRunPreserveChangesFlow)).then(function (_draft$executeDraftEd) {
292
+ var _temp11 = _catch(function () {
293
+ return Promise.resolve(draft.executeDraftEditAction(oContext, bRunPreserveChangesFlow, mParameters.oView)).then(function (_draft$executeDraftEd) {
167
294
  oDraftContext = _draft$executeDraftEd;
168
295
  });
169
296
  }, function (oResponse) {
@@ -186,15 +313,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
186
313
  });
187
314
  }
188
315
  }();
189
- } else {
190
- if (!(oResponse && oResponse.canceled)) {
191
- throw new Error(oResponse);
192
- }
316
+ } else if (!(oResponse && oResponse.canceled)) {
317
+ throw new Error(oResponse);
193
318
  }
194
319
  }();
195
320
  });
196
321
 
197
- return _temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp);
322
+ return _temp11 && _temp11.then ? _temp11.then(_temp12) : _temp12(_temp11);
198
323
  }, function (exc) {
199
324
  return Promise.reject(exc);
200
325
  }));
@@ -202,33 +327,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
202
327
  return Promise.reject(e);
203
328
  }
204
329
  };
205
- /**
206
- * Creates an active document from a draft document.
207
- *
208
- * The function supports several hooks as there is a certain choreography defined.
209
- *
210
- * @function
211
- * @name sap.fe.core.actions.draft#activateDocument
212
- * @memberof sap.fe.core.actions.draft
213
- * @static
214
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
215
- * @param {object} oAppComponent The AppComponent
216
- * @param {object} mParameters The parameters
217
- * @param {sap.fe.core.actions.draft.ICallback.fnBeforeActivateDocument} [mParameters.fnBeforeActivateDocument] Callback that allows veto before create request is executed
218
- * @param {sap.fe.core.actions.draft.ICallback.fnAfterActivateDocument} [mParameters.fnAfterActivateDocument] Callback for postprocessiong after document was activated.
219
- * @returns {Promise} Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
220
- * @private
221
- * @ui5-restricted
222
- */
223
-
224
330
 
225
331
  /**
226
332
  * This method creates a sibling context for a subobject page and calculates a sibling path for all intermediate paths
227
333
  * between the object page and the subobject page.
228
334
  *
229
- * @param {object} rootCurrentContext The context for the root of the draft
230
- * @param {object} rightmostCurrentContext The context of the subobject page
231
- * @returns {Promise} returns the siblingInformation object
335
+ * @param rootCurrentContext The context for the root of the draft
336
+ * @param rightmostCurrentContext The context of the subobject page
337
+ * @returns The siblingInformation object
232
338
  */
233
339
  var computeSiblingInformation = function (rootCurrentContext, rightmostCurrentContext) {
234
340
  try {
@@ -249,7 +355,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
249
355
  var segments = additionalPath ? additionalPath.substring(1).split("/") : []; // First segment is always the full path of the root object, which can contain '/' in case of a parametrized entity
250
356
 
251
357
  segments.unshift(rootCurrentContext.getPath().substring(1)); // //////////////////////////////////////////////////////////////////
252
- // 2. Request canonical paths of the sibling entity for eah segment
358
+ // 2. Request canonical paths of the sibling entity for each segment
253
359
  // Example: for ["Param(aa)/Entity(bb)", "_Nav(cc)", "_SubNav(dd)"]
254
360
  // --> request canonical paths for "Param(aa)/Entity(bb)/SiblingEntity", "Param(aa)/Entity(bb)/_Nav(cc)/SiblingEntity", "Param(aa)/Entity(bb)/_Nav(cc)/_SubNav(dd)/SiblingEntity"
255
361
 
@@ -259,8 +365,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
259
365
  var canonicalPathPromises = segments.map(function (segment) {
260
366
  currentPath += "/".concat(segment);
261
367
  oldPaths.unshift(currentPath);
262
- var siblingContext = model.bindContext(currentPath + "/SiblingEntity").getBoundContext();
263
- return siblingContext.requestCanonicalPath();
368
+
369
+ if (currentPath.endsWith(")")) {
370
+ var siblingContext = model.bindContext("".concat(currentPath, "/SiblingEntity")).getBoundContext();
371
+ return siblingContext.requestCanonicalPath();
372
+ } else {
373
+ return Promise.resolve(undefined); // 1-1 relation
374
+ }
264
375
  }); // //////////////////////////////////////////////////////////////////
265
376
  // 3. Reconstruct the full paths from canonical paths (for path mapping)
266
377
  // Example: for canonical paths "/Param(aa)/Entity(bb-sibling)", "/Entity2(cc-sibling)", "/Entity3(dd-sibling)"
@@ -271,11 +382,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
271
382
  var siblingPath = "";
272
383
  canonicalPaths.forEach(function (canonicalPath, index) {
273
384
  if (index !== 0) {
274
- var navigation = segments[index].replace(/\(.*$/, ""); // Keep only navigation name from the segment, i.e. aaa(xxx) --> aaa
385
+ if (segments[index].endsWith(")")) {
386
+ var navigation = segments[index].replace(/\(.*$/, ""); // Keep only navigation name from the segment, i.e. aaa(xxx) --> aaa
275
387
 
276
- var keys = canonicalPath.replace(/.*\(/, "("); // Keep only the keys fmro the canonical path, i.e. aaa(xxx) --> (xxx)
388
+ var keys = canonicalPath.replace(/.*\(/, "("); // Keep only the keys from the canonical path, i.e. aaa(xxx) --> (xxx)
277
389
 
278
- siblingPath += "/".concat(navigation).concat(keys);
390
+ siblingPath += "/".concat(navigation).concat(keys);
391
+ } else {
392
+ siblingPath += "/".concat(segments[index]); // 1-1 relation
393
+ }
279
394
  } else {
280
395
  siblingPath = canonicalPath; // To manage parametrized entities
281
396
  }
@@ -302,6 +417,166 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
302
417
  }
303
418
  };
304
419
 
420
+ /**
421
+ * Executes discard of a draft function using HTTP Post.
422
+ *
423
+ * @function
424
+ * @param oContext Context for which the action should be performed
425
+ * @param oAppComponent App Component
426
+ * @param bEnableStrictHandling
427
+ * @returns Resolve function returns the context of the operation
428
+ * @private
429
+ * @ui5-restricted
430
+ */
431
+ var executeDraftDiscardAction = function (oContext, oAppComponent, bEnableStrictHandling) {
432
+ try {
433
+ if (!oContext.getProperty("IsActiveEntity")) {
434
+ function _temp10(oResourceBundle) {
435
+ var sGroupId = "direct";
436
+ var sActionName = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_DRAFT_DISCARD_BUTTON", oResourceBundle); // as the discard action doesnt' send the active version in the response we do not use the replace in cache
437
+
438
+ var oDiscardPromise = !bEnableStrictHandling ? oDiscardOperation.execute(sGroupId) : oDiscardOperation.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(draft, sGroupId, {
439
+ label: sActionName,
440
+ model: oContext.getModel()
441
+ }, oResourceBundle), false);
442
+ oContext.getModel().submitBatch(sGroupId);
443
+ return oDiscardPromise;
444
+ }
445
+
446
+ var oDiscardOperation = draft.createOperation(oContext, draftOperations.DISCARD);
447
+ return Promise.resolve(oAppComponent ? Promise.resolve(oAppComponent.getModel("sap.fe.i18n").getResourceBundle()).then(_temp10) : _temp10(oAppComponent));
448
+ } else {
449
+ throw new Error("The discard action cannot be executed on an active document");
450
+ }
451
+ } catch (e) {
452
+ return Promise.reject(e);
453
+ }
454
+ };
455
+
456
+ /**
457
+ * Activates a draft document. The draft will replace the sibling entity and will be deleted by the back end.
458
+ *
459
+ * @function
460
+ * @param oContext Context for which the action should be performed
461
+ * @param oAppComponent The AppComponent
462
+ * @param [sGroupId] The optional batch group in which the operation is to be executed
463
+ * @returns Resolve function returns the context of the operation
464
+ * @private
465
+ * @ui5-restricted
466
+ */
467
+ var executeDraftActivationAction = function (oContext, oAppComponent, sGroupId) {
468
+ try {
469
+ var bHasPrepareAction = hasPrepareAction(oContext); // According to the draft spec if the service contains a prepare action and we trigger both prepare and
470
+ // activate in one $batch the activate action is called with iF-Match=*
471
+
472
+ var bIgnoreEtag = bHasPrepareAction;
473
+
474
+ if (!oContext.getProperty("IsActiveEntity")) {
475
+ var oOperation = createOperation(oContext, draftOperations.ACTIVATION, {
476
+ $$inheritExpandSelect: true
477
+ });
478
+ return Promise.resolve(oAppComponent.getModel("sap.fe.i18n").getResourceBundle()).then(function (oResourceBundle) {
479
+ var sActionName = CommonUtils.getTranslatedText("C_OP_OBJECT_PAGE_SAVE", oResourceBundle);
480
+ return _catch(function () {
481
+ return Promise.resolve(oOperation.execute(sGroupId, bIgnoreEtag, sGroupId ? CommonUtils.fnOnStrictHandlingFailed.bind(draft, sGroupId, {
482
+ label: sActionName,
483
+ model: oContext.getModel()
484
+ }, oResourceBundle) : undefined, oContext.getBinding().isA("sap.ui.model.odata.v4.ODataListBinding")));
485
+ }, function (e) {
486
+ function _temp5() {
487
+ throw e;
488
+ }
489
+
490
+ var _temp4 = function () {
491
+ if (bHasPrepareAction) {
492
+ var actionName = getActionName(oContext, draftOperations.PREPARE),
493
+ oSideEffectsService = oAppComponent.getSideEffectsService(),
494
+ oBindingParameters = oSideEffectsService.getODataActionSideEffects(actionName, oContext),
495
+ aTargetPaths = oBindingParameters && oBindingParameters.pathExpressions;
496
+
497
+ var _temp6 = function () {
498
+ if (aTargetPaths && aTargetPaths.length > 0) {
499
+ var _temp7 = _catch(function () {
500
+ return Promise.resolve(oSideEffectsService.requestSideEffects(aTargetPaths, oContext)).then(function () {});
501
+ }, function (oError) {
502
+ Log.error("Error while requesting side effects", oError);
503
+ });
504
+
505
+ if (_temp7 && _temp7.then) return _temp7.then(function () {});
506
+ } else {
507
+ var _temp8 = _catch(function () {
508
+ return Promise.resolve(requestMessages(oContext, oSideEffectsService)).then(function () {});
509
+ }, function (oError) {
510
+ Log.error("Error while requesting messages", oError);
511
+ });
512
+
513
+ if (_temp8 && _temp8.then) return _temp8.then(function () {});
514
+ }
515
+ }();
516
+
517
+ if (_temp6 && _temp6.then) return _temp6.then(function () {});
518
+ }
519
+ }();
520
+
521
+ return _temp4 && _temp4.then ? _temp4.then(_temp5) : _temp5(_temp4);
522
+ });
523
+ });
524
+ } else {
525
+ throw new Error("The activation action cannot be executed on an active document");
526
+ }
527
+ } catch (e) {
528
+ return Promise.reject(e);
529
+ }
530
+ };
531
+ /**
532
+ * Check if a message property path is defined for a context.
533
+ *
534
+ * @function
535
+ * @param oContext Context to be checked
536
+ * @returns Path to the message
537
+ * @private
538
+ * @ui5-restricted
539
+ */
540
+
541
+
542
+ /**
543
+ * Creates a new draft from an active document.
544
+ *
545
+ * @function
546
+ * @param oContext Context for which the action should be performed
547
+ * @param bPreserveChanges If true - existing changes from another user that are not locked are preserved and an error message (http status 409) is send from the backend, otherwise false - existing changes from another user that are not locked are overwritten</li>
548
+ * @param oView If true - existing changes from another
549
+ * @returns Resolve function returns the context of the operation
550
+ * @private
551
+ * @ui5-restricted
552
+ */
553
+ var executeDraftEditAction = function (oContext, bPreserveChanges, oView) {
554
+ try {
555
+ if (oContext.getProperty("IsActiveEntity")) {
556
+ var oOptions = {
557
+ $$inheritExpandSelect: true
558
+ };
559
+ var oOperation = createOperation(oContext, draftOperations.EDIT, oOptions);
560
+ oOperation.setParameter("PreserveChanges", bPreserveChanges);
561
+ var sGroupId = "direct";
562
+ return Promise.resolve(oView.getModel("sap.fe.i18n").getResourceBundle()).then(function (oResourceBundle) {
563
+ var sActionName = CommonUtils.getTranslatedText("C_COMMON_OBJECT_PAGE_EDIT", oResourceBundle); //If the context is coming from a list binding we pass the flag true to replace the context by the active one
564
+
565
+ var oEditPromise = oOperation.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(draft, sGroupId, {
566
+ label: sActionName,
567
+ model: oContext.getModel()
568
+ }, oResourceBundle), oContext.getBinding().isA("sap.ui.model.odata.v4.ODataListBinding"));
569
+ oOperation.getModel().submitBatch(sGroupId);
570
+ return Promise.resolve(oEditPromise);
571
+ });
572
+ } else {
573
+ throw new Error("You cannot edit this draft document");
574
+ }
575
+ } catch (e) {
576
+ return Promise.reject(e);
577
+ }
578
+ };
579
+
305
580
  /**
306
581
  * Interface for callbacks used in the functions
307
582
  *
@@ -315,18 +590,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
315
590
 
316
591
  /**
317
592
  * Callback to approve or reject the creation of a draft
593
+ *
318
594
  * @name sap.fe.core.actions.draft.ICallback.beforeCreateDraftFromActiveDocument
319
595
  * @function
320
596
  * @static
321
597
  * @abstract
322
598
  * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
323
599
  * @returns {(boolean|Promise)} Approval of draft creation [true|false] or Promise that resolves with the boolean value
324
- *
325
600
  * @private
326
601
  */
327
602
 
328
603
  /**
329
604
  * Callback after a draft was successully created
605
+ *
330
606
  * @name sap.fe.core.actions.draft.ICallback.afterCreateDraftFromActiveDocument
331
607
  * @function
332
608
  * @static
@@ -334,21 +610,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
334
610
  * @param {sap.ui.model.odata.v4.Context} oContext Context of the new draft
335
611
  * @param {sap.ui.model.odata.v4.Context} oActiveDocumentContext Context of the active document for the new draft
336
612
  * @returns {sap.ui.model.odata.v4.Context} oActiveDocumentContext
337
- *
338
613
  * @private
339
614
  */
340
615
 
341
616
  /**
342
617
  * Callback to approve or reject overwriting an unsaved draft of another user
618
+ *
343
619
  * @name sap.fe.core.actions.draft.ICallback.whenDecisionToOverwriteDocumentIsRequired
344
620
  * @function
345
621
  * @public
346
622
  * @static
347
623
  * @abstract
348
- *
349
624
  * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
350
625
  * @returns {(boolean|Promise)} Approval to overwrite unsaved draft [true|false] or Promise that resolves with the boolean value
351
- *
352
626
  * @ui5-restricted
353
627
  */
354
628
 
@@ -359,9 +633,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
359
633
  DISCARD: "DiscardAction",
360
634
  PREPARE: "PreparationAction"
361
635
  };
362
- /* Enum for navigation types */
363
-
364
- var NavigationType;
365
636
  /**
366
637
  * Static functions for the draft programming model
367
638
  *
@@ -375,147 +646,85 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
375
646
  /**
376
647
  * Determines action name for a draft operation.
377
648
  *
378
- * @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
379
- * @param {string} sOperation The operation name
380
- * @returns {string} The name of the draft operation
649
+ * @param oContext The context that should be bound to the operation
650
+ * @param sOperation The operation name
651
+ * @returns The name of the draft operation
381
652
  */
382
653
 
383
- (function (NavigationType) {
384
- NavigationType["BackNavigation"] = "BackNavigation";
385
- NavigationType["ForwardNavigation"] = "ForwardNavigation";
386
- })(NavigationType || (NavigationType = {}));
387
-
388
654
  function getActionName(oContext, sOperation) {
389
655
  var oModel = oContext.getModel(),
390
656
  oMetaModel = oModel.getMetaModel(),
391
657
  sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
392
- return oMetaModel.getObject(sEntitySetPath + "@com.sap.vocabularies.Common.v1.DraftRoot/" + sOperation);
658
+ return oMetaModel.getObject("".concat(sEntitySetPath, "@com.sap.vocabularies.Common.v1.DraftRoot/").concat(sOperation));
393
659
  }
394
660
  /**
395
661
  * Creates an operation context binding for the given context and operation.
396
662
  *
397
- * @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
398
- * @param {string} sOperation The operation (action or function import)
663
+ * @param oContext The context that should be bound to the operation
664
+ * @param sOperation The operation (action or function import)
399
665
  * @param oOptions Options to create the operation context
400
- * @returns {sap.ui.model.odata.v4.ODataContextBinding} The context binding of the bound operation
666
+ * @returns The context binding of the bound operation
401
667
  */
402
668
 
403
669
 
404
670
  function createOperation(oContext, sOperation, oOptions) {
405
671
  var sOperationName = getActionName(oContext, sOperation);
406
- return oContext.getModel().bindContext(sOperationName + "(...)", oContext, oOptions);
672
+ return oContext.getModel().bindContext("".concat(sOperationName, "(...)"), oContext, oOptions);
407
673
  }
408
674
  /**
409
- * Check if optional draft prepare action exists.
675
+ * Determines the return type for a draft operation.
410
676
  *
411
- * @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
412
- * @returns {boolean} True if a a prepare action exists
677
+ * @param oContext The context that should be bound to the operation
678
+ * @param sOperation The operation name
679
+ * @returns The return type of the draft operation
413
680
  */
414
681
 
415
682
 
416
- function hasPrepareAction(oContext) {
417
- return !!getActionName(oContext, draftOperations.PREPARE);
683
+ function getReturnType(oContext, sOperation) {
684
+ var oModel = oContext.getModel(),
685
+ oMetaModel = oModel.getMetaModel(),
686
+ sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
687
+ return oMetaModel.getObject("".concat(sEntitySetPath, "@com.sap.vocabularies.Common.v1.DraftRoot/").concat(sOperation, "/$ReturnType"));
418
688
  }
419
689
  /**
420
- * Creates a new draft from an active document.
690
+ * Check if optional draft prepare action exists.
421
691
  *
422
- * @function
423
- * @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
424
- * @param {boolean} bPreserveChanges If true - existing changes from another user that are not locked are preserved and an error message (http status 409) is send from the backend, otherwise false - existing changes from another user that are not locked are overwritten</li>
425
- * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
426
- * @private
427
- * @ui5-restricted
692
+ * @param oContext The context that should be bound to the operation
693
+ * @returns True if a a prepare action exists
428
694
  */
429
695
 
430
696
 
431
- function executeDraftEditAction(oContext, bPreserveChanges) {
432
- if (oContext.getProperty("IsActiveEntity")) {
433
- var oOptions = {
434
- $$inheritExpandSelect: true
435
- };
436
- var oOperation = createOperation(oContext, draftOperations.EDIT, oOptions);
437
- oOperation.setParameter("PreserveChanges", bPreserveChanges);
438
- var sGroupId = "direct";
439
- var localI18nRef = Core.getLibraryResourceBundle("sap.fe.core");
440
- var sActionName = localI18nRef.getText("C_COMMON_OBJECT_PAGE_EDIT"); //If the context is coming from a list binding we pass the flag true to replace the context by the active one
441
-
442
- var oEditPromise = oOperation.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(draft, sGroupId, sActionName, oContext.getModel()), oContext.getBinding().isA("sap.ui.model.odata.v4.ODataListBinding")).then(function (oDraftDocumentContext) {
443
- return oDraftDocumentContext;
444
- });
445
- oOperation.getModel().submitBatch(sGroupId);
446
- return oEditPromise;
447
- } else {
448
- throw new Error("You cannot edit this draft document");
449
- }
697
+ function hasPrepareAction(oContext) {
698
+ return !!getActionName(oContext, draftOperations.PREPARE);
450
699
  }
451
- /**
452
- * Activates a draft document. The draft will replace the sibling entity and will be deleted by the back end.
453
- *
454
- * @function
455
- * @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
456
- * @param {object} oAppComponent The AppComponent
457
- * @param {string} [sGroupId] The optional batch group in which the operation is to be executed
458
- * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
459
- * @private
460
- * @ui5-restricted
461
- */
462
-
463
-
464
- function executeDraftActivationAction(oContext, oAppComponent, sGroupId) {
465
- var bHasPrepareAction = hasPrepareAction(oContext); // According to the draft spec if the service contains a prepare action and we trigger both prepare and
466
- // activate in one $batch the activate action is called with iF-Match=*
467
700
 
468
- var bIgnoreEtag = bHasPrepareAction;
469
-
470
- if (!oContext.getProperty("IsActiveEntity")) {
471
- var oOperation = createOperation(oContext, draftOperations.ACTIVATION, {
472
- $$inheritExpandSelect: true
473
- });
474
- var localI18nRef = Core.getLibraryResourceBundle("sap.fe.core");
475
- var sActionName = localI18nRef.getText("C_OP_OBJECT_PAGE_SAVE");
476
- return oOperation.execute(sGroupId, bIgnoreEtag, sGroupId ? CommonUtils.fnOnStrictHandlingFailed.bind(draft, sGroupId, sActionName, oContext.getModel()) : undefined, oContext.getBinding().isA("sap.ui.model.odata.v4.ODataListBinding")) //3rd parameter<------
477
- .then(function (oActiveDocumentContext) {
478
- return oActiveDocumentContext;
479
- }).catch( //if ACTIVATE action fails then we request either the sideEffects against PREPARE action (if annotated) or the messages as fallback:
480
- function () {
481
- if (bHasPrepareAction) {
482
- var _sActionName = getActionName(oContext, draftOperations.PREPARE),
483
- oSideEffectsService = oAppComponent.getSideEffectsService(),
484
- oBindingParameters = oSideEffectsService.getODataActionSideEffects(_sActionName, oContext),
485
- aTargetPaths = oBindingParameters && oBindingParameters.pathExpressions;
486
-
487
- if (aTargetPaths && aTargetPaths.length > 0) {
488
- oSideEffectsService.requestSideEffects(aTargetPaths, oContext).catch(function (oError) {
489
- Log.error("Error while requesting side effects", oError);
490
- });
491
- } else {
492
- requestMessages(oContext, oSideEffectsService).catch(function (oError) {
493
- Log.error("Error while requesting messages", oError);
494
- });
495
- }
496
- }
701
+ function getMessagePath(oContext) {
702
+ var oMetaModel = oContext.getModel().getMetaModel();
703
+ var sContextPath = oMetaModel.getMetaPath(oContext.getPath());
704
+ var oReturnType = getReturnType(oContext, draftOperations.PREPARE); // If there is no return parameter, it is not possible to request Messages.
705
+ // RAP draft prepare has no return parameter
497
706
 
498
- return Promise.reject();
499
- });
500
- } else {
501
- throw new Error("The activation action cannot be executed on an active document");
502
- }
707
+ return !!oReturnType ? oMetaModel.getObject("".concat(sContextPath, "/@").concat("com.sap.vocabularies.Common.v1.Messages", "/$Path")) : null;
503
708
  }
504
709
  /**
505
710
  * Execute a preparation action.
506
711
  *
507
712
  * @function
508
- * @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
509
- * @param {string} groupId The optional batch group in which we want to execute the operation
510
- * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
713
+ * @param oContext Context for which the action should be performed
714
+ * @param groupId The optional batch group in which we want to execute the operation
715
+ * @param bMessages If set to true, the PREPARE action retrieves SAP_Messages
716
+ * @returns Resolve function returns the context of the operation
511
717
  * @private
512
718
  * @ui5-restricted
513
719
  */
514
720
 
515
721
 
516
- function executeDraftPreparationAction(oContext, groupId) {
722
+ function executeDraftPreparationAction(oContext, groupId, bMessages) {
517
723
  if (!oContext.getProperty("IsActiveEntity")) {
518
- var oOperation = createOperation(oContext, draftOperations.PREPARE); // TODO: side effects qualifier shall be even deprecated to be checked
724
+ var sMessagesPath = bMessages ? getMessagePath(oContext) : null;
725
+ var oOperation = createOperation(oContext, draftOperations.PREPARE, sMessagesPath ? {
726
+ $select: sMessagesPath
727
+ } : null); // TODO: side effects qualifier shall be even deprecated to be checked
519
728
 
520
729
  oOperation.setParameter("SideEffectsQualifier", "");
521
730
  var sGroupId = groupId || oOperation.getGroupId();
@@ -532,8 +741,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
532
741
  * Determines the message path for a context.
533
742
  *
534
743
  * @function
535
- * @param {sap.ui.model.odata.v4.Context} oContext Context for which the path shall be determined
536
- * @returns {string} Message path, empty if not annotated
744
+ * @param oContext Context for which the path shall be determined
745
+ * @returns Message path, empty if not annotated
537
746
  * @private
538
747
  * @ui5-restricted
539
748
  */
@@ -543,15 +752,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
543
752
  var oModel = oContext.getModel(),
544
753
  oMetaModel = oModel.getMetaModel(),
545
754
  sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
546
- return oMetaModel.getObject(sEntitySetPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path");
755
+ return oMetaModel.getObject("".concat(sEntitySetPath, "/@com.sap.vocabularies.Common.v1.Messages/$Path"));
547
756
  }
548
757
  /**
549
758
  * Requests the messages if annotated for a given context.
550
759
  *
551
760
  * @function
552
- * @param {sap.ui.model.odata.v4.Context} oContext Context for which the messages shall be requested
553
- * @param {object} oSideEffectsService Service for the SideEffects on SAP Fiori elements
554
- * @returns {Promise} Promise which is resolved once messages were requested
761
+ * @param oContext Context for which the messages shall be requested
762
+ * @param oSideEffectsService Service for the SideEffects on SAP Fiori elements
763
+ * @returns Promise which is resolved once messages were requested
555
764
  * @private
556
765
  * @ui5-restricted
557
766
  */
@@ -568,84 +777,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
568
777
 
569
778
  return Promise.resolve();
570
779
  }
571
- /**
572
- * Executes the discard of a draft function using HTTP POST.
573
- *
574
- * @function
575
- * @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
576
- * @param {boolean} bEnableStrictHandling
577
- * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
578
- * @private
579
- * @ui5-restricted
580
- */
581
-
582
-
583
- function executeDraftDiscardAction(oContext, bEnableStrictHandling) {
584
- if (!oContext.getProperty("IsActiveEntity")) {
585
- var oDiscardOperation = draft.createOperation(oContext, draftOperations.DISCARD);
586
- var localI18nRef = Core.getLibraryResourceBundle("sap.fe.core");
587
- var sGroupId = "direct";
588
- var sActionName = localI18nRef.getText("C_TRANSACTION_HELPER_DRAFT_DISCARD_BUTTON"); // as the discard action doesnt' send the active version in the response we do not use the replace in cache
589
-
590
- var oDiscardPromise = !bEnableStrictHandling ? oDiscardOperation.execute(sGroupId) : oDiscardOperation.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(draft, sGroupId, sActionName, oContext.getModel()), false);
591
- oContext.getModel().submitBatch(sGroupId);
592
- return oDiscardPromise;
593
- } else {
594
- throw new Error("The discard action cannot be executed on an active document");
595
- }
596
- }
597
-
598
- function activateDocument(oContext, oAppComponent, mParameters) {
599
- var mParam = mParameters || {};
600
-
601
- if (!oContext) {
602
- return Promise.reject(new Error("Binding context to draft document is required"));
603
- }
604
-
605
- return Promise.resolve(mParam.fnBeforeActivateDocument ? mParam.fnBeforeActivateDocument(oContext) : true).then(function (bExecute) {
606
- if (!bExecute) {
607
- return Promise.reject(new Error("Activation of the document was aborted by extension for document: " + oContext.getPath()));
608
- }
609
-
610
- if (!hasPrepareAction(oContext)) {
611
- return executeDraftActivationAction(oContext, oAppComponent);
612
- }
613
- /* activation requires preparation */
614
-
615
-
616
- var sBatchGroup = "draft"; // we use the same batchGroup to force prepare and activate in a same batch but with different changeset
617
-
618
- var oPreparePromise = executeDraftPreparationAction(oContext, sBatchGroup);
619
- oContext.getModel().submitBatch(sBatchGroup);
620
- var oActivatePromise = executeDraftActivationAction(oContext, oAppComponent, sBatchGroup);
621
- return Promise.all([oPreparePromise, oActivatePromise]).then(function (values) {
622
- return values[1];
623
- }).catch(function (exc) {
624
- return Promise.reject(exc);
625
- });
626
- }).then(function (oActiveDocumentContext) {
627
- return Promise.resolve(mParam.fnAfterActivateDocument ? mParam.fnAfterActivateDocument(oContext, oActiveDocumentContext) : oActiveDocumentContext);
628
- }).catch(function (exc) {
629
- return Promise.reject(exc);
630
- });
631
- }
632
- /**
633
- * HTTP POST call when DraftAction is present for Draft Delete; HTTP DELETE for Draft(when no DraftAction)
634
- * and Active Instance uses DELETE always.
635
- *
636
- * @function
637
- * @name sap.fe.core.actions.draft#deleteDraft
638
- * @memberof sap.fe.core.actions.draft
639
- * @static
640
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be discarded
641
- * @param {boolean} bEnableStrictHandling
642
- * @private
643
- * @returns {Promise}
644
- * @ui5-restricted
645
- */
646
780
 
647
-
648
- function deleteDraft(oContext, bEnableStrictHandling) {
781
+ function deleteDraft(oContext, oAppComponent, bEnableStrictHandling) {
649
782
  var sDiscardAction = getActionName(oContext, draftOperations.DISCARD),
650
783
  bIsActiveEntity = oContext.getObject().IsActiveEntity;
651
784
 
@@ -662,110 +795,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
662
795
  }
663
796
  } else {
664
797
  //Use Discard Post Action if it is a draft entity and discard action exists
665
- return executeDraftDiscardAction(oContext, bEnableStrictHandling);
666
- }
667
- }
668
- /**
669
- * @param fnProcessFunction
670
- * @param fnCancelFunction
671
- * @param oContext
672
- * @param oController
673
- * @param bSkipBindingToView
674
- * @param navigationType
675
- */
676
-
677
-
678
- function processDataLossOrDraftDiscardConfirmation(fnProcessFunction, fnCancelFunction, oContext, oController, bSkipBindingToView) {
679
- var navigationType = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : NavigationType.BackNavigation;
680
- var oModel = oContext.getModel();
681
- var draftDataContext = oModel.bindContext(oContext.getPath() + "/DraftAdministrativeData").getBoundContext();
682
- var collaborationConnected = ActivitySync.isConnected(oController.getView());
683
- var processFunctionForDrafts = !collaborationConnected ? fnProcessFunction : function () {
684
- ActivitySync.disconnect(oController.getView());
685
-
686
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
687
- args[_key] = arguments[_key];
688
- }
689
-
690
- fnProcessFunction.apply.apply(fnProcessFunction, [null].concat(args));
691
- };
692
-
693
- if (oContext && oContext.getObject() && (!oContext.getObject().DraftAdministrativeData || oContext.getObject().IsActiveEntity === true)) {
694
- fnProcessFunction();
695
- } else {
696
- draftDataContext.requestObject().then(function (draftAdminData) {
697
- if (draftAdminData) {
698
- if (oController.getAppComponent().getRootViewController().isFclEnabled()) {
699
- // The application is running in FCL mode so in this case we fall back to
700
- // the old logic since the dirty state handling is not properly working
701
- // for FCL.
702
- if (!(draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime)) {
703
- DataLossOrDraftDiscardHandler.performAfterDiscardorKeepDraft(processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView);
704
- } else {
705
- processFunctionForDrafts();
706
- }
707
- } else {
708
- if (!oContext.getObject().HasActiveEntity) {
709
- // There is no active entity so we are editing either newly created data or
710
- // a draft which has never been saved to active version
711
- // Since we want to react differently in the two situations, we have to check the
712
- // dirty state
713
- if (EditState.isEditStateDirty()) {
714
- // In this case data is being newly created and then we always want to
715
- // show the dataloss dialog on navigation
716
- DataLossOrDraftDiscardHandler.performAfterDiscardorKeepDraft(processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView);
717
- } else {
718
- // We are editing a draft which has been created earlier but never saved to active
719
- // version and since the edit state is not dirty, there have been no user changes
720
- // so in this case we want to silently navigate and do nothing
721
- processFunctionForDrafts();
722
- }
723
- } else {
724
- // We are editing a draft for an existing active entity
725
- if (draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime) {
726
- // The CreationDateTime and LastChangeDateTime are equal, so this draft was
727
- // never saved before, hence we're currently editing a newly created draft for
728
- // an existing active entity for the first time.
729
- // Also there have so far been no changes made to the draft and in this
730
- // case we want to silently navigate and delete the draft in case of a back
731
- // navigation but in case of a forward navigation we want to silently keep it!
732
- if (navigationType === NavigationType.BackNavigation) {
733
- var mParameters = {
734
- skipDiscardPopover: true
735
- };
736
- oController.editFlow.cancelDocument(oContext, mParameters).then(function () {
737
- processFunctionForDrafts();
738
- }).catch(function (error) {
739
- Log.error("Error while canceling the document", error);
740
- });
741
- } else {
742
- // In case of a forward navigation we silently keep the draft and only
743
- // execute the followup function.
744
- processFunctionForDrafts();
745
- }
746
- } else {
747
- // The CreationDateTime and LastChangeDateTime are NOT equal, so we are currently editing
748
- // an existing draft and need to distinguish depending on if any changes
749
- // have been made in the current editing session or not
750
- if (EditState.isEditStateDirty()) {
751
- // Changes have been made in the current editing session so we want
752
- // to show the dataloss dialog and let the user decide
753
- DataLossOrDraftDiscardHandler.performAfterDiscardorKeepDraft(processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView);
754
- } else {
755
- // The user started editing the existing draft but did not make any changes
756
- // in the current editing session, so in this case we do not want
757
- // to show the dataloss dialog but just keep the draft
758
- processFunctionForDrafts();
759
- }
760
- }
761
- }
762
- }
763
- } else {
764
- fnProcessFunction();
765
- }
766
- }).catch(function (oError) {
767
- Log.error("Cannot retrieve draftDataContext information", oError);
768
- });
798
+ return executeDraftDiscardAction(oContext, oAppComponent, bEnableStrictHandling);
769
799
  }
770
800
  }
771
801
 
@@ -774,12 +804,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
774
804
  activateDocument: activateDocument,
775
805
  deleteDraft: deleteDraft,
776
806
  executeDraftEditAction: executeDraftEditAction,
807
+ executeDraftPreparationAction: executeDraftPreparationAction,
808
+ executeDraftActivationAction: executeDraftActivationAction,
777
809
  computeSiblingInformation: computeSiblingInformation,
778
- processDataLossOrDraftDiscardConfirmation: processDataLossOrDraftDiscardConfirmation,
810
+ processDataLossOrDraftDiscardConfirmation: draftDataLossPopup.processDataLossOrDraftDiscardConfirmation,
811
+ silentlyKeepDraftOnForwardNavigation: draftDataLossPopup.silentlyKeepDraftOnForwardNavigation,
779
812
  createOperation: createOperation,
780
813
  executeDraftDiscardAction: executeDraftDiscardAction,
781
- NavigationType: NavigationType
814
+ NavigationType: draftDataLossPopup.NavigationType
782
815
  };
783
816
  return draft;
784
817
  }, false);
785
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRyYWZ0LnRzIl0sIm5hbWVzIjpbImJvZHkiLCJyZWNvdmVyIiwicmVzdWx0IiwiZSIsInRoZW4iLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsIm9Db250ZXh0Iiwib0FwcENvbXBvbmVudCIsIm1QYXJhbWV0ZXJzIiwib3ZlcndyaXRlT25EZW1hbmQiLCJiT3ZlcndyaXRlIiwib01vZGVsIiwiZ2V0TW9kZWwiLCJkcmFmdERhdGFDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRQYXRoIiwiZ2V0Qm91bmRDb250ZXh0Iiwib1Jlc291cmNlQnVuZGxlIiwib1ZpZXciLCJnZXRSZXNvdXJjZUJ1bmRsZSIsIl9vUmVzb3VyY2VCdW5kbGUiLCJyZXF1ZXN0T2JqZWN0IiwiZHJhZnRBZG1pbkRhdGEiLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwic0luZm8iLCJJblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiIsIkluUHJvY2Vzc0J5VXNlciIsInNFbnRpdHlTZXQiLCJnZXRWaWV3RGF0YSIsImVudGl0eVNldCIsInNMb2NrZWRCeVVzZXJNc2ciLCJDb21tb25VdGlscyIsImdldFRyYW5zbGF0ZWRUZXh0IiwiTWVzc2FnZUJveCIsImVycm9yIiwiRXJyb3IiLCJDcmVhdGVkQnlVc2VyRGVzY3JpcHRpb24iLCJDcmVhdGVkQnlVc2VyIiwic1Vuc2F2ZWRDaGFuZ2VzTXNnIiwic2hvd01lc3NhZ2VCb3giLCJleGVjdXRlRHJhZnRFZGl0QWN0aW9uIiwiUHJvbWlzZSIsInJlamVjdCIsInJlc29sdmUiLCJvRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJsb2NhbEkxOG5SZWYiLCJnZXRUZXh0Iiwic3RhdGUiLCJjb250ZW50IiwiVGV4dCIsInRleHQiLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsInR5cGUiLCJwcmVzcyIsImNsb3NlIiwiZW5kQnV0dG9uIiwiYWZ0ZXJDbG9zZSIsImRlc3Ryb3kiLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsIm1QYXJhbSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyIsImJQcmVzZXJ2ZUNoYW5nZXMiLCJiRXhlY3V0ZSIsImZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQiLCJvcGVuaW5nU2libGluZ0NvbnRleHQiLCJvRHJhZnRDb250ZXh0IiwiZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50Iiwic0VkaXRBY3Rpb25OYW1lIiwiZ2V0QWN0aW9uTmFtZSIsImRyYWZ0T3BlcmF0aW9ucyIsIkVESVQiLCJvU2lkZUVmZmVjdHMiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwidHJpZ2dlckFjdGlvbnMiLCJsZW5ndGgiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JPRGF0YUFjdGlvbiIsImRyYWZ0Iiwib1Jlc3BvbnNlIiwic3RhdHVzIiwicmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJBY3Rpdml0eVN5bmMiLCJpc0NvbGxhYm9yYXRpb25FbmFibGVkIiwiY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsInNpYmxpbmdJbmZvIiwic2libGluZ0NvbnRleHQiLCJnZXRDb250cm9sbGVyIiwiX3JvdXRpbmciLCJfY3JlYXRlQmluZGluZ0NvbnRleHQiLCJ0YXJnZXRDb250ZXh0IiwiZm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZCIsImNhbmNlbGVkIiwiZXhjIiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJzdGFydHNXaXRoIiwiTG9nIiwibW9kZWwiLCJhZGRpdGlvbmFsUGF0aCIsInJlcGxhY2UiLCJzZWdtZW50cyIsInN1YnN0cmluZyIsInNwbGl0IiwidW5zaGlmdCIsIm9sZFBhdGhzIiwibmV3UGF0aHMiLCJjdXJyZW50UGF0aCIsImNhbm9uaWNhbFBhdGhQcm9taXNlcyIsIm1hcCIsInNlZ21lbnQiLCJyZXF1ZXN0Q2Fub25pY2FsUGF0aCIsImFsbCIsImNhbm9uaWNhbFBhdGhzIiwic2libGluZ1BhdGgiLCJmb3JFYWNoIiwiY2Fub25pY2FsUGF0aCIsImluZGV4IiwibmF2aWdhdGlvbiIsImtleXMiLCJwYXRoTWFwcGluZyIsIm9sZFBhdGgiLCJuZXdQYXRoIiwidW5kZWZpbmVkIiwiQUNUSVZBVElPTiIsIkRJU0NBUkQiLCJQUkVQQVJFIiwiTmF2aWdhdGlvblR5cGUiLCJzT3BlcmF0aW9uIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRPYmplY3QiLCJjcmVhdGVPcGVyYXRpb24iLCJvT3B0aW9ucyIsInNPcGVyYXRpb25OYW1lIiwiaGFzUHJlcGFyZUFjdGlvbiIsImdldFByb3BlcnR5IiwiJCRpbmhlcml0RXhwYW5kU2VsZWN0Iiwib09wZXJhdGlvbiIsInNldFBhcmFtZXRlciIsInNHcm91cElkIiwic0FjdGlvbk5hbWUiLCJvRWRpdFByb21pc2UiLCJleGVjdXRlIiwiZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkIiwiYmluZCIsImdldEJpbmRpbmciLCJpc0EiLCJvRHJhZnREb2N1bWVudENvbnRleHQiLCJzdWJtaXRCYXRjaCIsImV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24iLCJiSGFzUHJlcGFyZUFjdGlvbiIsImJJZ25vcmVFdGFnIiwib0FjdGl2ZURvY3VtZW50Q29udGV4dCIsImNhdGNoIiwib1NpZGVFZmZlY3RzU2VydmljZSIsIm9CaW5kaW5nUGFyYW1ldGVycyIsImFUYXJnZXRQYXRocyIsInBhdGhFeHByZXNzaW9ucyIsInJlcXVlc3RTaWRlRWZmZWN0cyIsIm9FcnJvciIsInJlcXVlc3RNZXNzYWdlcyIsImV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uIiwiZ3JvdXBJZCIsImdldEdyb3VwSWQiLCJnZXRNZXNzYWdlc1BhdGgiLCJzTWVzc2FnZXNQYXRoIiwiJFByb3BlcnR5UGF0aCIsImV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb24iLCJiRW5hYmxlU3RyaWN0SGFuZGxpbmciLCJvRGlzY2FyZE9wZXJhdGlvbiIsIm9EaXNjYXJkUHJvbWlzZSIsImFjdGl2YXRlRG9jdW1lbnQiLCJmbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQiLCJzQmF0Y2hHcm91cCIsIm9QcmVwYXJlUHJvbWlzZSIsIm9BY3RpdmF0ZVByb21pc2UiLCJ2YWx1ZXMiLCJmbkFmdGVyQWN0aXZhdGVEb2N1bWVudCIsImRlbGV0ZURyYWZ0Iiwic0Rpc2NhcmRBY3Rpb24iLCJiSXNBY3RpdmVFbnRpdHkiLCJJc0FjdGl2ZUVudGl0eSIsImhhc1BlbmRpbmdDaGFuZ2VzIiwicmVzZXRDaGFuZ2VzIiwiZGVsZXRlIiwicHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJmblByb2Nlc3NGdW5jdGlvbiIsImZuQ2FuY2VsRnVuY3Rpb24iLCJvQ29udHJvbGxlciIsImJTa2lwQmluZGluZ1RvVmlldyIsIm5hdmlnYXRpb25UeXBlIiwiQmFja05hdmlnYXRpb24iLCJjb2xsYWJvcmF0aW9uQ29ubmVjdGVkIiwiaXNDb25uZWN0ZWQiLCJnZXRWaWV3IiwicHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzIiwiZGlzY29ubmVjdCIsImFyZ3MiLCJhcHBseSIsIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhIiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiaXNGY2xFbmFibGVkIiwiQ3JlYXRpb25EYXRlVGltZSIsIkxhc3RDaGFuZ2VEYXRlVGltZSIsIkRhdGFMb3NzT3JEcmFmdERpc2NhcmRIYW5kbGVyIiwicGVyZm9ybUFmdGVyRGlzY2FyZG9yS2VlcERyYWZ0IiwiSGFzQWN0aXZlRW50aXR5IiwiRWRpdFN0YXRlIiwiaXNFZGl0U3RhdGVEaXJ0eSIsInNraXBEaXNjYXJkUG9wb3ZlciIsImVkaXRGbG93IiwiY2FuY2VsRG9jdW1lbnQiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFnakJPLGtCQUFnQkEsSUFBaEIsRUFBc0JDLE9BQXRCLEVBQStCO0FBQ3JDLFFBQUk7QUFDSCxVQUFJQyxNQUFNLEdBQUdGLElBQUksRUFBakI7QUFDQSxLQUZELENBRUUsT0FBTUcsQ0FBTixFQUFTO0FBQ1YsYUFBT0YsT0FBTyxDQUFDRSxDQUFELENBQWQ7QUFDQTs7QUFDRCxRQUFJRCxNQUFNLElBQUlBLE1BQU0sQ0FBQ0UsSUFBckIsRUFBMkI7QUFDMUIsYUFBT0YsTUFBTSxDQUFDRSxJQUFQLENBQVksS0FBSyxDQUFqQixFQUFvQkgsT0FBcEIsQ0FBUDtBQUNBOztBQUNELFdBQU9DLE1BQVA7QUFDQTs7QUFoTEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO01BQ2VHLDZCLGFBQ2RDLFEsRUFDQUMsYSxFQUNBQyxXO1FBT0M7QUFBQTs7QUFJOEg7O0FBRS9IO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDLGVBQVNDLGlCQUFULENBQTJCQyxVQUEzQixFQUE0QztBQUMzQyxZQUFJQSxVQUFKLEVBQWdCO0FBQ2Y7QUFDQSxjQUFNQyxNQUFNLEdBQUdMLFFBQVEsQ0FBQ00sUUFBVCxFQUFmO0FBQ0EsY0FBTUMsZ0JBQWdCLEdBQUdGLE1BQU0sQ0FBQ0csV0FBUCxDQUFtQlIsUUFBUSxDQUFDUyxPQUFULEtBQXFCLDBCQUF4QyxFQUFvRUMsZUFBcEUsRUFBekI7QUFDQSxjQUFJQyxlQUFKO0FBRUEsaUJBQVNULFdBQVcsQ0FBQ1UsS0FBWixDQUFrQk4sUUFBbEIsQ0FBMkIsYUFBM0IsQ0FBRCxDQUE2RE8saUJBQTdELEVBQUQsQ0FDTGYsSUFESyxDQUNBLFVBQVVnQixnQkFBVixFQUFpQztBQUN0Q0gsWUFBQUEsZUFBZSxHQUFHRyxnQkFBbEI7QUFDQSxtQkFBT1AsZ0JBQWdCLENBQUNRLGFBQWpCLEVBQVA7QUFDQSxXQUpLLEVBS0xqQixJQUxLLENBS0EsVUFBVWtCLGNBQVYsRUFBK0I7QUFDcEMsZ0JBQUlBLGNBQUosRUFBb0I7QUFDbkI7QUFDQUMsY0FBQUEsZUFBZSxDQUFDQywrQkFBaEI7QUFDQSxrQkFBSUMsS0FBSyxHQUFHSCxjQUFjLENBQUNJLDBCQUFmLElBQTZDSixjQUFjLENBQUNLLGVBQXhFO0FBQ0Esa0JBQU1DLFVBQVUsR0FBSXBCLFdBQVcsQ0FBQ1UsS0FBWixDQUFrQlcsV0FBbEIsRUFBRCxDQUF5Q0MsU0FBNUQ7O0FBQ0Esa0JBQUlMLEtBQUosRUFBVztBQUNWLG9CQUFNTSxnQkFBZ0IsR0FBR0MsV0FBVyxDQUFDQyxpQkFBWixDQUN4QiwwQ0FEd0IsRUFFeEJoQixlQUZ3QixFQUd4QlEsS0FId0IsRUFJeEJHLFVBSndCLENBQXpCO0FBTUFNLGdCQUFBQSxVQUFVLENBQUNDLEtBQVgsQ0FBaUJKLGdCQUFqQjtBQUNBLHNCQUFNLElBQUlLLEtBQUosQ0FBVUwsZ0JBQVYsQ0FBTjtBQUNBLGVBVEQsTUFTTztBQUNOTixnQkFBQUEsS0FBSyxHQUFHSCxjQUFjLENBQUNlLHdCQUFmLElBQTJDZixjQUFjLENBQUNnQixhQUFsRTtBQUNBLG9CQUFNQyxrQkFBa0IsR0FBR1AsV0FBVyxDQUFDQyxpQkFBWixDQUMxQiwyQ0FEMEIsRUFFMUJoQixlQUYwQixFQUcxQlEsS0FIMEIsRUFJMUJHLFVBSjBCLENBQTNCO0FBTUEsdUJBQU9ZLGNBQWMsQ0FBQ0Qsa0JBQUQsQ0FBZCxDQUFtQ25DLElBQW5DLENBQXdDLFlBQVk7QUFDMUQseUJBQU9xQyxzQkFBc0IsQ0FBQ25DLFFBQUQsRUFBVyxLQUFYLENBQTdCO0FBQ0EsaUJBRk0sQ0FBUDtBQUdBO0FBQ0Q7QUFDRCxXQWpDSyxDQUFQO0FBa0NBOztBQUNELGVBQU9vQyxPQUFPLENBQUNDLE1BQVIsQ0FBZSxJQUFJUCxLQUFKLENBQVUsMENBQTBDOUIsUUFBUSxDQUFDUyxPQUFULEVBQXBELENBQWYsQ0FBUDtBQUNBOztBQUVELGVBQVN5QixjQUFULENBQXdCRCxrQkFBeEIsRUFBaUQ7QUFDaEQsZUFBTyxJQUFJRyxPQUFKLENBQVksVUFBVUUsT0FBVixFQUF5Q0QsTUFBekMsRUFBeUU7QUFDM0YsY0FBTUUsT0FBTyxHQUFHLElBQUlDLE1BQUosQ0FBVztBQUMxQkMsWUFBQUEsS0FBSyxFQUFFQyxZQUFZLENBQUNDLE9BQWIsQ0FBcUIsNkJBQXJCLENBRG1CO0FBRTFCQyxZQUFBQSxLQUFLLEVBQUUsU0FGbUI7QUFHMUJDLFlBQUFBLE9BQU8sRUFBRSxJQUFJQyxJQUFKLENBQVM7QUFDakJDLGNBQUFBLElBQUksRUFBRWQ7QUFEVyxhQUFULENBSGlCO0FBTTFCZSxZQUFBQSxXQUFXLEVBQUUsSUFBSUMsTUFBSixDQUFXO0FBQ3ZCRixjQUFBQSxJQUFJLEVBQUVMLFlBQVksQ0FBQ0MsT0FBYixDQUFxQiwyQkFBckIsQ0FEaUI7QUFFdkJPLGNBQUFBLElBQUksRUFBRSxZQUZpQjtBQUd2QkMsY0FBQUEsS0FBSyxFQUFFLFlBQVk7QUFDbEJaLGdCQUFBQSxPQUFPLENBQUNhLEtBQVI7QUFDQWQsZ0JBQUFBLE9BQU8sQ0FBQyxJQUFELENBQVA7QUFDQTtBQU5zQixhQUFYLENBTmE7QUFjMUJlLFlBQUFBLFNBQVMsRUFBRSxJQUFJSixNQUFKLENBQVc7QUFDckJGLGNBQUFBLElBQUksRUFBRUwsWUFBWSxDQUFDQyxPQUFiLENBQXFCLDZCQUFyQixDQURlO0FBRXJCUSxjQUFBQSxLQUFLLEVBQUUsWUFBWTtBQUNsQlosZ0JBQUFBLE9BQU8sQ0FBQ2EsS0FBUjtBQUNBZixnQkFBQUEsTUFBTSxDQUFDLDBDQUEwQ3JDLFFBQVEsQ0FBQ1MsT0FBVCxFQUEzQyxDQUFOO0FBQ0E7QUFMb0IsYUFBWCxDQWRlO0FBcUIxQjZDLFlBQUFBLFVBQVUsRUFBRSxZQUFZO0FBQ3ZCZixjQUFBQSxPQUFPLENBQUNnQixPQUFSO0FBQ0E7QUF2QnlCLFdBQVgsQ0FBaEI7QUF5QkFoQixVQUFBQSxPQUFPLENBQUNpQixhQUFSLENBQXNCLHFCQUF0QjtBQUNBakIsVUFBQUEsT0FBTyxDQUFDa0IsSUFBUjtBQUNBLFNBNUJNLENBQVA7QUE2QkE7O0FBdEZELFVBQU1DLE1BQU0sR0FBR3hELFdBQVcsSUFBSSxFQUE5QjtBQUFBLFVBQ0N3QyxZQUFZLEdBQUlpQixJQUFELENBQWlCQyx3QkFBakIsQ0FBMEMsYUFBMUMsQ0FEaEI7QUFBQSxVQUVDQyx1QkFBdUIsR0FDdEIsT0FBT0gsTUFBTSxDQUFDSSxnQkFBZCxLQUFtQyxXQUFuQyxJQUFtRCxPQUFPSixNQUFNLENBQUNJLGdCQUFkLEtBQW1DLFNBQW5DLElBQWdESixNQUFNLENBQUNJLGdCQUg1Rzs7QUF3RkEsVUFBSSxDQUFDOUQsUUFBTCxFQUFlO0FBQ2QsZUFBT29DLE9BQU8sQ0FBQ0MsTUFBUixDQUFlLElBQUlQLEtBQUosQ0FBVSxnREFBVixDQUFmLENBQVA7QUFDQTs7QUFFRCxVQUFNaUMsUUFBUSxHQUFHTCxNQUFNLENBQUNNLHFDQUFQLEdBQ2ROLE1BQU0sQ0FBQ00scUNBQVAsQ0FBNkNoRSxRQUE3QyxFQUF1RDZELHVCQUF2RCxDQURjLEdBRWQsSUFGSDs7QUFJQSxVQUFJLENBQUNFLFFBQUwsRUFBZTtBQUNkLGNBQU0sSUFBSWpDLEtBQUosQ0FBVSwyREFBMkQ5QixRQUFRLENBQUNTLE9BQVQsRUFBckUsQ0FBTjtBQUNBOztBQUNELFVBQUl3RCxxQkFBcUIsR0FBRyxLQUE1QjtBQXBHQyxnREFxR0c7QUFBQTtBQUFBOztBQTRCSCxjQUFJQSxxQkFBSixFQUEyQjtBQUMxQixtQkFBT0MsYUFBUDtBQUNBOztBQUVEQSxVQUFBQSxhQUFhLEdBQ1pBLGFBQWEsSUFBSVIsTUFBTSxDQUFDUyxvQ0FBeEIsR0FDR1QsTUFBTSxDQUFDUyxvQ0FBUCxDQUE0Q25FLFFBQTVDLEVBQXNEa0UsYUFBdEQsQ0FESCxHQUVHQSxhQUhKO0FBaENHO0FBQUEsZ0JBcUNDQSxhQXJDRDtBQUFBOztBQXNDRixrQkFBTUUsZUFBZSxHQUFHQyxhQUFhLENBQUNILGFBQUQsRUFBZ0JJLGVBQWUsQ0FBQ0MsSUFBaEMsQ0FBckM7QUFDQSxrQkFBTUMsWUFBWSxHQUFHdkUsYUFBYSxDQUFDd0UscUJBQWQsR0FBc0NDLHlCQUF0QyxDQUFnRU4sZUFBaEUsRUFBaUZGLGFBQWpGLENBQXJCOztBQXZDRSxrQkF3Q0VNLFlBeENGLGFBd0NFQSxZQXhDRix3Q0F3Q0VBLFlBQVksQ0FBRUcsY0F4Q2hCLGtEQXdDRSxzQkFBOEJDLE1BeENoQztBQUFBLHVDQXlDSzNFLGFBQWEsQ0FBQ3dFLHFCQUFkLEdBQXNDSSxnQ0FBdEMsQ0FBdUVMLFlBQXZFLEVBQXFGTixhQUFyRixDQXpDTDtBQTJDRCx5QkFBT0EsYUFBUDtBQTNDQztBQUFBO0FBNkNELHVCQUFPQSxhQUFQO0FBN0NDO0FBQUE7QUFBQTtBQUFBOztBQUNILFlBQUlBLGFBQTZCLEdBQUcsSUFBcEM7O0FBREcsdUNBRUM7QUFBQSxpQ0FDbUJZLEtBQUssQ0FBQzNDLHNCQUFOLENBQTZCbkMsUUFBN0IsRUFBdUM2RCx1QkFBdkMsQ0FEbkI7QUFDSEssWUFBQUEsYUFBYSx3QkFBYjtBQURHO0FBRUgsU0FKRSxZQUlNYSxTQUpOLEVBSXNCO0FBQUE7QUFBQSxnQkFFcEJsQix1QkFBdUIsSUFBSWtCLFNBQVMsQ0FBQ0MsTUFBVixLQUFxQixHQUY1QjtBQUd2Qi9ELGNBQUFBLGVBQWUsQ0FBQ2dFLDZCQUFoQjtBQUNBaEUsY0FBQUEsZUFBZSxDQUFDQywrQkFBaEI7QUFKdUI7QUFBQSxvQkFLbkJnRSxZQUFZLENBQUNDLHNCQUFiLENBQW9DakYsV0FBVyxDQUFDVSxLQUFoRCxDQUxtQjtBQUFBLHlDQU1Ja0UsS0FBSyxDQUFDTSx5QkFBTixDQUFnQ3BGLFFBQWhDLEVBQTBDQSxRQUExQyxDQU5KLGlCQU1oQnFGLFdBTmdCO0FBT3RCLHdCQUFNQyxjQUFjLEdBQUlwRixXQUFXLENBQUNVLEtBQVosQ0FBa0IyRSxhQUFsQixFQUFELENBQTJDQyxRQUEzQyxDQUFvREMscUJBQXBELENBQ3RCSixXQURzQixhQUN0QkEsV0FEc0IsdUJBQ3RCQSxXQUFXLENBQUVLLGFBQWIsQ0FBMkJqRixPQUEzQixFQURzQixFQUV0QlQsUUFBUSxDQUFDTSxRQUFULEVBRnNCLENBQXZCOztBQUlBMkQsb0JBQUFBLHFCQUFxQixHQUFHLElBQXhCO0FBWHNCO0FBQUEsMkJBWWZxQixjQVplO0FBQUE7QUFBQTtBQUFBLHlDQWNBbkYsaUJBQWlCLENBQ3RDdUQsTUFBTSxDQUFDaUMsMkNBQVAsR0FBcURqQyxNQUFNLENBQUNpQywyQ0FBUCxFQUFyRCxHQUE0RyxJQUR0RSxDQWRqQjtBQWN0QnpCLG9CQUFBQSxhQUFhLHFCQUFiO0FBZHNCO0FBQUE7QUFBQTtBQUFBO0FBQUEsa0JBbUJuQixFQUFFYSxTQUFTLElBQUlBLFNBQVMsQ0FBQ2EsUUFBekIsQ0FuQm1CO0FBb0J0QixzQkFBTSxJQUFJOUQsS0FBSixDQUFVaUQsU0FBVixDQUFOO0FBcEJzQjtBQUFBO0FBQUE7QUF1QnhCLFNBM0JFOztBQUFBO0FBZ0RILE9BckpBLFlBcUpRYyxHQXJKUixFQXFKa0I7QUFDbEIsZUFBT3pELE9BQU8sQ0FBQ0MsTUFBUixDQUFld0QsR0FBZixDQUFQO0FBQ0EsT0F2SkE7QUF3SkQsSzs7OztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBdFJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7TUFDZVQseUIsYUFDZFUsa0IsRUFDQUMsdUI7UUFDMEM7QUFDMUMsVUFBSSxDQUFDQSx1QkFBdUIsQ0FBQ3RGLE9BQXhCLEdBQWtDdUYsVUFBbEMsQ0FBNkNGLGtCQUFrQixDQUFDckYsT0FBbkIsRUFBN0MsQ0FBTCxFQUFpRjtBQUNoRjtBQUNBd0YsUUFBQUEsR0FBRyxDQUFDcEUsS0FBSixDQUFVLDBDQUFWO0FBQ0EsY0FBTSxJQUFJQyxLQUFKLENBQVUsMENBQVYsQ0FBTjtBQUNBOztBQUVELFVBQU1vRSxLQUFLLEdBQUdKLGtCQUFrQixDQUFDeEYsUUFBbkIsRUFBZDtBQVAwQyxnREFRdEM7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0EsWUFBTTZGLGNBQWMsR0FBR0osdUJBQXVCLENBQUN0RixPQUF4QixHQUFrQzJGLE9BQWxDLENBQTBDTixrQkFBa0IsQ0FBQ3JGLE9BQW5CLEVBQTFDLEVBQXdFLEVBQXhFLENBQXZCO0FBQ0EsWUFBTTRGLFFBQVEsR0FBR0YsY0FBYyxHQUFHQSxjQUFjLENBQUNHLFNBQWYsQ0FBeUIsQ0FBekIsRUFBNEJDLEtBQTVCLENBQWtDLEdBQWxDLENBQUgsR0FBNEMsRUFBM0UsQ0FSRyxDQVNIOztBQUNBRixRQUFBQSxRQUFRLENBQUNHLE9BQVQsQ0FBaUJWLGtCQUFrQixDQUFDckYsT0FBbkIsR0FBNkI2RixTQUE3QixDQUF1QyxDQUF2QyxDQUFqQixFQVZHLENBWUg7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsWUFBTUcsUUFBa0IsR0FBRyxFQUEzQjtBQUNBLFlBQU1DLFFBQWtCLEdBQUcsRUFBM0I7QUFDQSxZQUFJQyxXQUFXLEdBQUcsRUFBbEI7QUFDQSxZQUFNQyxxQkFBcUIsR0FBR1AsUUFBUSxDQUFDUSxHQUFULENBQWEsVUFBQ0MsT0FBRCxFQUFhO0FBQ3ZESCxVQUFBQSxXQUFXLGVBQVFHLE9BQVIsQ0FBWDtBQUNBTCxVQUFBQSxRQUFRLENBQUNELE9BQVQsQ0FBaUJHLFdBQWpCO0FBQ0EsY0FBTXJCLGNBQWMsR0FBR1ksS0FBSyxDQUFDMUYsV0FBTixDQUFrQm1HLFdBQVcsR0FBRyxnQkFBaEMsRUFBa0RqRyxlQUFsRCxFQUF2QjtBQUNBLGlCQUFPNEUsY0FBYyxDQUFDeUIsb0JBQWYsRUFBUDtBQUNBLFNBTDZCLENBQTlCLENBbkJHLENBMEJIO0FBQ0E7QUFDQTtBQUNBOztBQTdCRywrQkE4QjJCM0UsT0FBTyxDQUFDNEUsR0FBUixDQUFZSixxQkFBWixDQTlCM0I7QUE4QkgsY0FBTUssY0FBYyxlQUFwQjtBQUNBLGNBQUlDLFdBQVcsR0FBRyxFQUFsQjtBQUNBRCxVQUFBQSxjQUFjLENBQUNFLE9BQWYsQ0FBdUIsVUFBQ0MsYUFBRCxFQUFnQkMsS0FBaEIsRUFBMEI7QUFDaEQsZ0JBQUlBLEtBQUssS0FBSyxDQUFkLEVBQWlCO0FBQ2hCLGtCQUFNQyxVQUFVLEdBQUdqQixRQUFRLENBQUNnQixLQUFELENBQVIsQ0FBZ0JqQixPQUFoQixDQUF3QixPQUF4QixFQUFpQyxFQUFqQyxDQUFuQixDQURnQixDQUN5Qzs7QUFDekQsa0JBQU1tQixJQUFJLEdBQUdILGFBQWEsQ0FBQ2hCLE9BQWQsQ0FBc0IsTUFBdEIsRUFBOEIsR0FBOUIsQ0FBYixDQUZnQixDQUVpQzs7QUFDakRjLGNBQUFBLFdBQVcsZUFBUUksVUFBUixTQUFxQkMsSUFBckIsQ0FBWDtBQUNBLGFBSkQsTUFJTztBQUNOTCxjQUFBQSxXQUFXLEdBQUdFLGFBQWQsQ0FETSxDQUN1QjtBQUM3Qjs7QUFDRFYsWUFBQUEsUUFBUSxDQUFDRixPQUFULENBQWlCVSxXQUFqQjtBQUNBLFdBVEQ7QUFXQSxpQkFBTztBQUNOeEIsWUFBQUEsYUFBYSxFQUFFUSxLQUFLLENBQUMxRixXQUFOLENBQWtCMEcsV0FBbEIsRUFBK0J4RyxlQUEvQixFQURUO0FBQ3NFO0FBQzVFOEcsWUFBQUEsV0FBVyxFQUFFZixRQUFRLENBQUNJLEdBQVQsQ0FBYSxVQUFDWSxPQUFELEVBQVVKLEtBQVYsRUFBb0I7QUFDN0MscUJBQU87QUFDTkksZ0JBQUFBLE9BQU8sRUFBUEEsT0FETTtBQUVOQyxnQkFBQUEsT0FBTyxFQUFFaEIsUUFBUSxDQUFDVyxLQUFEO0FBRlgsZUFBUDtBQUlBLGFBTFk7QUFGUCxXQUFQO0FBM0NHO0FBb0RILE9BNUR5QyxjQTREMUI7QUFDZjtBQUNBLGVBQU9NLFNBQVA7QUFDQSxPQS9EeUM7QUFnRTFDLEs7Ozs7O0FBalhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0EsTUFBTXJELGVBQWUsR0FBRztBQUN2QkMsSUFBQUEsSUFBSSxFQUFFLFlBRGlCO0FBRXZCcUQsSUFBQUEsVUFBVSxFQUFFLGtCQUZXO0FBR3ZCQyxJQUFBQSxPQUFPLEVBQUUsZUFIYztBQUl2QkMsSUFBQUEsT0FBTyxFQUFFO0FBSmMsR0FBeEI7QUFNQTs7TUFDS0MsYztBQUlMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7YUFwQktBLGM7QUFBQUEsSUFBQUEsYztBQUFBQSxJQUFBQSxjO0tBQUFBLGMsS0FBQUEsYzs7QUFxQkwsV0FBUzFELGFBQVQsQ0FBdUJyRSxRQUF2QixFQUFzQ2dJLFVBQXRDLEVBQTBEO0FBQ3pELFFBQU0zSCxNQUFNLEdBQUdMLFFBQVEsQ0FBQ00sUUFBVCxFQUFmO0FBQUEsUUFDQzJILFVBQVUsR0FBRzVILE1BQU0sQ0FBQzZILFlBQVAsRUFEZDtBQUFBLFFBRUNDLGNBQWMsR0FBR0YsVUFBVSxDQUFDRyxXQUFYLENBQXVCcEksUUFBUSxDQUFDUyxPQUFULEVBQXZCLENBRmxCO0FBSUEsV0FBT3dILFVBQVUsQ0FBQ0ksU0FBWCxDQUFxQkYsY0FBYyxHQUFHLDRDQUFqQixHQUFnRUgsVUFBckYsQ0FBUDtBQUNBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsV0FBU00sZUFBVCxDQUF5QnRJLFFBQXpCLEVBQXdDZ0ksVUFBeEMsRUFBNERPLFFBQTVELEVBQTRFO0FBQzNFLFFBQU1DLGNBQWMsR0FBR25FLGFBQWEsQ0FBQ3JFLFFBQUQsRUFBV2dJLFVBQVgsQ0FBcEM7QUFFQSxXQUFPaEksUUFBUSxDQUFDTSxRQUFULEdBQW9CRSxXQUFwQixDQUFnQ2dJLGNBQWMsR0FBRyxPQUFqRCxFQUEwRHhJLFFBQTFELEVBQW9FdUksUUFBcEUsQ0FBUDtBQUNBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxXQUFTRSxnQkFBVCxDQUEwQnpJLFFBQTFCLEVBQXlDO0FBQ3hDLFdBQU8sQ0FBQyxDQUFDcUUsYUFBYSxDQUFDckUsUUFBRCxFQUFXc0UsZUFBZSxDQUFDd0QsT0FBM0IsQ0FBdEI7QUFDQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxXQUFTM0Ysc0JBQVQsQ0FBZ0NuQyxRQUFoQyxFQUErQzhELGdCQUEvQyxFQUEwRTtBQUN6RSxRQUFJOUQsUUFBUSxDQUFDMEksV0FBVCxDQUFxQixnQkFBckIsQ0FBSixFQUE0QztBQUMzQyxVQUFNSCxRQUFRLEdBQUc7QUFBRUksUUFBQUEscUJBQXFCLEVBQUU7QUFBekIsT0FBakI7QUFDQSxVQUFNQyxVQUFVLEdBQUdOLGVBQWUsQ0FBQ3RJLFFBQUQsRUFBV3NFLGVBQWUsQ0FBQ0MsSUFBM0IsRUFBaUNnRSxRQUFqQyxDQUFsQztBQUNBSyxNQUFBQSxVQUFVLENBQUNDLFlBQVgsQ0FBd0IsaUJBQXhCLEVBQTJDL0UsZ0JBQTNDO0FBQ0EsVUFBTWdGLFFBQVEsR0FBRyxRQUFqQjtBQUNBLFVBQU1wRyxZQUFZLEdBQUlpQixJQUFELENBQWlCQyx3QkFBakIsQ0FBMEMsYUFBMUMsQ0FBckI7QUFDQSxVQUFNbUYsV0FBVyxHQUFHckcsWUFBWSxDQUFDQyxPQUFiLENBQXFCLDJCQUFyQixDQUFwQixDQU4yQyxDQU8zQzs7QUFDQSxVQUFNcUcsWUFBWSxHQUFHSixVQUFVLENBQzdCSyxPQURtQixDQUVuQkgsUUFGbUIsRUFHbkJuQixTQUhtQixFQUluQmpHLFdBQVcsQ0FBQ3dILHdCQUFaLENBQXFDQyxJQUFyQyxDQUEwQ3JFLEtBQTFDLEVBQWlEZ0UsUUFBakQsRUFBMkRDLFdBQTNELEVBQXdFL0ksUUFBUSxDQUFDTSxRQUFULEVBQXhFLENBSm1CLEVBS25CTixRQUFRLENBQUNvSixVQUFULEdBQXNCQyxHQUF0QixDQUEwQix3Q0FBMUIsQ0FMbUIsRUFPbkJ2SixJQVBtQixDQU9kLFVBQVV3SixxQkFBVixFQUFzQztBQUMzQyxlQUFPQSxxQkFBUDtBQUNBLE9BVG1CLENBQXJCO0FBVUFWLE1BQUFBLFVBQVUsQ0FBQ3RJLFFBQVgsR0FBc0JpSixXQUF0QixDQUFrQ1QsUUFBbEM7QUFDQSxhQUFPRSxZQUFQO0FBQ0EsS0FwQkQsTUFvQk87QUFDTixZQUFNLElBQUlsSCxLQUFKLENBQVUscUNBQVYsQ0FBTjtBQUNBO0FBQ0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxXQUFTMEgsNEJBQVQsQ0FBc0N4SixRQUF0QyxFQUFxREMsYUFBckQsRUFBa0Y2SSxRQUFsRixFQUFxRztBQUNwRyxRQUFNVyxpQkFBaUIsR0FBR2hCLGdCQUFnQixDQUFDekksUUFBRCxDQUExQyxDQURvRyxDQUdwRztBQUNBOztBQUNBLFFBQU0wSixXQUFXLEdBQUdELGlCQUFwQjs7QUFFQSxRQUFJLENBQUN6SixRQUFRLENBQUMwSSxXQUFULENBQXFCLGdCQUFyQixDQUFMLEVBQTZDO0FBQzVDLFVBQU1FLFVBQVUsR0FBR04sZUFBZSxDQUFDdEksUUFBRCxFQUFXc0UsZUFBZSxDQUFDc0QsVUFBM0IsRUFBdUM7QUFBRWUsUUFBQUEscUJBQXFCLEVBQUU7QUFBekIsT0FBdkMsQ0FBbEM7QUFDQSxVQUFNakcsWUFBWSxHQUFJaUIsSUFBRCxDQUFpQkMsd0JBQWpCLENBQTBDLGFBQTFDLENBQXJCO0FBQ0EsVUFBTW1GLFdBQVcsR0FBR3JHLFlBQVksQ0FBQ0MsT0FBYixDQUFxQix1QkFBckIsQ0FBcEI7QUFDQSxhQUFPaUcsVUFBVSxDQUNmSyxPQURLLENBRUxILFFBRkssRUFHTFksV0FISyxFQUlMWixRQUFRLEdBQUdwSCxXQUFXLENBQUN3SCx3QkFBWixDQUFxQ0MsSUFBckMsQ0FBMENyRSxLQUExQyxFQUFpRGdFLFFBQWpELEVBQTJEQyxXQUEzRCxFQUF3RS9JLFFBQVEsQ0FBQ00sUUFBVCxFQUF4RSxDQUFILEdBQWtHcUgsU0FKckcsRUFLTDNILFFBQVEsQ0FBQ29KLFVBQVQsR0FBc0JDLEdBQXRCLENBQTBCLHdDQUExQixDQUxLLEVBTUo7QUFOSSxPQU9MdkosSUFQSyxDQU9BLFVBQVU2SixzQkFBVixFQUF1QztBQUM1QyxlQUFPQSxzQkFBUDtBQUNBLE9BVEssRUFVTEMsS0FWSyxFQVdMO0FBQ0Esa0JBQVk7QUFDWCxZQUFJSCxpQkFBSixFQUF1QjtBQUN0QixjQUFNVixZQUFXLEdBQUcxRSxhQUFhLENBQUNyRSxRQUFELEVBQVdzRSxlQUFlLENBQUN3RCxPQUEzQixDQUFqQztBQUFBLGNBQ0MrQixtQkFBbUIsR0FBRzVKLGFBQWEsQ0FBQ3dFLHFCQUFkLEVBRHZCO0FBQUEsY0FFQ3FGLGtCQUFrQixHQUFHRCxtQkFBbUIsQ0FBQ25GLHlCQUFwQixDQUE4Q3FFLFlBQTlDLEVBQTJEL0ksUUFBM0QsQ0FGdEI7QUFBQSxjQUdDK0osWUFBWSxHQUFHRCxrQkFBa0IsSUFBSUEsa0JBQWtCLENBQUNFLGVBSHpEOztBQUlBLGNBQUlELFlBQVksSUFBSUEsWUFBWSxDQUFDbkYsTUFBYixHQUFzQixDQUExQyxFQUE2QztBQUM1Q2lGLFlBQUFBLG1CQUFtQixDQUFDSSxrQkFBcEIsQ0FBdUNGLFlBQXZDLEVBQXFEL0osUUFBckQsRUFBK0Q0SixLQUEvRCxDQUFxRSxVQUFVTSxNQUFWLEVBQXVCO0FBQzNGakUsY0FBQUEsR0FBRyxDQUFDcEUsS0FBSixDQUFVLHFDQUFWLEVBQWlEcUksTUFBakQ7QUFDQSxhQUZEO0FBR0EsV0FKRCxNQUlPO0FBQ05DLFlBQUFBLGVBQWUsQ0FBQ25LLFFBQUQsRUFBVzZKLG1CQUFYLENBQWYsQ0FBK0NELEtBQS9DLENBQXFELFVBQVVNLE1BQVYsRUFBdUI7QUFDM0VqRSxjQUFBQSxHQUFHLENBQUNwRSxLQUFKLENBQVUsaUNBQVYsRUFBNkNxSSxNQUE3QztBQUNBLGFBRkQ7QUFHQTtBQUNEOztBQUNELGVBQU85SCxPQUFPLENBQUNDLE1BQVIsRUFBUDtBQUNBLE9BN0JJLENBQVA7QUErQkEsS0FuQ0QsTUFtQ087QUFDTixZQUFNLElBQUlQLEtBQUosQ0FBVSxnRUFBVixDQUFOO0FBQ0E7QUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxXQUFTc0ksNkJBQVQsQ0FBdUNwSyxRQUF2QyxFQUEwRHFLLE9BQTFELEVBQTRFO0FBQzNFLFFBQUksQ0FBQ3JLLFFBQVEsQ0FBQzBJLFdBQVQsQ0FBcUIsZ0JBQXJCLENBQUwsRUFBNkM7QUFDNUMsVUFBTUUsVUFBVSxHQUFHTixlQUFlLENBQUN0SSxRQUFELEVBQVdzRSxlQUFlLENBQUN3RCxPQUEzQixDQUFsQyxDQUQ0QyxDQUc1Qzs7QUFDQWMsTUFBQUEsVUFBVSxDQUFDQyxZQUFYLENBQXdCLHNCQUF4QixFQUFnRCxFQUFoRDtBQUVBLFVBQU1DLFFBQVEsR0FBR3VCLE9BQU8sSUFBSXpCLFVBQVUsQ0FBQzBCLFVBQVgsRUFBNUI7QUFDQSxhQUFPMUIsVUFBVSxDQUNmSyxPQURLLENBQ0dILFFBREgsRUFFTGhKLElBRkssQ0FFQSxZQUFZO0FBQ2pCLGVBQU84SSxVQUFQO0FBQ0EsT0FKSyxFQUtMZ0IsS0FMSyxDQUtDLFVBQVVNLE1BQVYsRUFBdUI7QUFDN0JqRSxRQUFBQSxHQUFHLENBQUNwRSxLQUFKLENBQVUscUNBQVYsRUFBaURxSSxNQUFqRDtBQUNBLE9BUEssQ0FBUDtBQVFBLEtBZkQsTUFlTztBQUNOLFlBQU0sSUFBSXBJLEtBQUosQ0FBVSxpRUFBVixDQUFOO0FBQ0E7QUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsV0FBU3lJLGVBQVQsQ0FBeUJ2SyxRQUF6QixFQUFvRDtBQUNuRCxRQUFNSyxNQUFNLEdBQUdMLFFBQVEsQ0FBQ00sUUFBVCxFQUFmO0FBQUEsUUFDQzJILFVBQVUsR0FBRzVILE1BQU0sQ0FBQzZILFlBQVAsRUFEZDtBQUFBLFFBRUNDLGNBQWMsR0FBR0YsVUFBVSxDQUFDRyxXQUFYLENBQXVCcEksUUFBUSxDQUFDUyxPQUFULEVBQXZCLENBRmxCO0FBR0EsV0FBT3dILFVBQVUsQ0FBQ0ksU0FBWCxDQUFxQkYsY0FBYyxHQUFHLGlEQUF0QyxDQUFQO0FBQ0E7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsV0FBU2dDLGVBQVQsQ0FBeUJuSyxRQUF6QixFQUF3QzZKLG1CQUF4QyxFQUFpRjtBQUNoRixRQUFNVyxhQUFhLEdBQUdELGVBQWUsQ0FBQ3ZLLFFBQUQsQ0FBckM7O0FBQ0EsUUFBSXdLLGFBQUosRUFBbUI7QUFDbEIsYUFBT1gsbUJBQW1CLENBQUNJLGtCQUFwQixDQUF1QyxDQUFDO0FBQUVRLFFBQUFBLGFBQWEsRUFBRUQ7QUFBakIsT0FBRCxDQUF2QyxFQUFrRnhLLFFBQWxGLENBQVA7QUFDQTs7QUFDRCxXQUFPb0MsT0FBTyxDQUFDRSxPQUFSLEVBQVA7QUFDQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxXQUFTb0kseUJBQVQsQ0FBbUMxSyxRQUFuQyxFQUFrRDJLLHFCQUFsRCxFQUFxRztBQUNwRyxRQUFJLENBQUMzSyxRQUFRLENBQUMwSSxXQUFULENBQXFCLGdCQUFyQixDQUFMLEVBQTZDO0FBQzVDLFVBQU1rQyxpQkFBaUIsR0FBRzlGLEtBQUssQ0FBQ3dELGVBQU4sQ0FBc0J0SSxRQUF0QixFQUFnQ3NFLGVBQWUsQ0FBQ3VELE9BQWhELENBQTFCO0FBQ0EsVUFBTW5GLFlBQVksR0FBSWlCLElBQUQsQ0FBaUJDLHdCQUFqQixDQUEwQyxhQUExQyxDQUFyQjtBQUNBLFVBQU1rRixRQUFRLEdBQUcsUUFBakI7QUFDQSxVQUFNQyxXQUFXLEdBQUdyRyxZQUFZLENBQUNDLE9BQWIsQ0FBcUIsMkNBQXJCLENBQXBCLENBSjRDLENBSzVDOztBQUNBLFVBQU1rSSxlQUFlLEdBQUcsQ0FBQ0YscUJBQUQsR0FDckJDLGlCQUFpQixDQUFDM0IsT0FBbEIsQ0FBMEJILFFBQTFCLENBRHFCLEdBRXJCOEIsaUJBQWlCLENBQUMzQixPQUFsQixDQUNBSCxRQURBLEVBRUFuQixTQUZBLEVBR0FqRyxXQUFXLENBQUN3SCx3QkFBWixDQUFxQ0MsSUFBckMsQ0FBMENyRSxLQUExQyxFQUFpRGdFLFFBQWpELEVBQTJEQyxXQUEzRCxFQUF3RS9JLFFBQVEsQ0FBQ00sUUFBVCxFQUF4RSxDQUhBLEVBSUEsS0FKQSxDQUZIO0FBUUFOLE1BQUFBLFFBQVEsQ0FBQ00sUUFBVCxHQUFvQmlKLFdBQXBCLENBQWdDVCxRQUFoQztBQUNBLGFBQU8rQixlQUFQO0FBQ0EsS0FoQkQsTUFnQk87QUFDTixZQUFNLElBQUkvSSxLQUFKLENBQVUsNkRBQVYsQ0FBTjtBQUNBO0FBQ0Q7O0FBeVJELFdBQVNnSixnQkFBVCxDQUNDOUssUUFERCxFQUVDQyxhQUZELEVBR0NDLFdBSEQsRUFJRTtBQUNELFFBQU13RCxNQUFNLEdBQUd4RCxXQUFXLElBQUksRUFBOUI7O0FBRUEsUUFBSSxDQUFDRixRQUFMLEVBQWU7QUFDZCxhQUFPb0MsT0FBTyxDQUFDQyxNQUFSLENBQWUsSUFBSVAsS0FBSixDQUFVLCtDQUFWLENBQWYsQ0FBUDtBQUNBOztBQUNELFdBQU9NLE9BQU8sQ0FBQ0UsT0FBUixDQUFnQm9CLE1BQU0sQ0FBQ3FILHdCQUFQLEdBQWtDckgsTUFBTSxDQUFDcUgsd0JBQVAsQ0FBZ0MvSyxRQUFoQyxDQUFsQyxHQUE4RSxJQUE5RixFQUNMRixJQURLLENBQ0EsVUFBVWlFLFFBQVYsRUFBeUI7QUFDOUIsVUFBSSxDQUFDQSxRQUFMLEVBQWU7QUFDZCxlQUFPM0IsT0FBTyxDQUFDQyxNQUFSLENBQWUsSUFBSVAsS0FBSixDQUFVLHVFQUF1RTlCLFFBQVEsQ0FBQ1MsT0FBVCxFQUFqRixDQUFmLENBQVA7QUFDQTs7QUFFRCxVQUFJLENBQUNnSSxnQkFBZ0IsQ0FBQ3pJLFFBQUQsQ0FBckIsRUFBaUM7QUFDaEMsZUFBT3dKLDRCQUE0QixDQUFDeEosUUFBRCxFQUFXQyxhQUFYLENBQW5DO0FBQ0E7QUFFRDs7O0FBQ0EsVUFBTStLLFdBQVcsR0FBRyxPQUFwQixDQVY4QixDQVc5Qjs7QUFDQSxVQUFNQyxlQUFlLEdBQUdiLDZCQUE2QixDQUFDcEssUUFBRCxFQUFXZ0wsV0FBWCxDQUFyRDtBQUNBaEwsTUFBQUEsUUFBUSxDQUFDTSxRQUFULEdBQW9CaUosV0FBcEIsQ0FBZ0N5QixXQUFoQztBQUVBLFVBQU1FLGdCQUFnQixHQUFHMUIsNEJBQTRCLENBQUN4SixRQUFELEVBQVdDLGFBQVgsRUFBMEIrSyxXQUExQixDQUFyRDtBQUVBLGFBQU81SSxPQUFPLENBQUM0RSxHQUFSLENBQVksQ0FBQ2lFLGVBQUQsRUFBa0JDLGdCQUFsQixDQUFaLEVBQ0xwTCxJQURLLENBQ0EsVUFBVXFMLE1BQVYsRUFBOEI7QUFDbkMsZUFBT0EsTUFBTSxDQUFDLENBQUQsQ0FBYjtBQUNBLE9BSEssRUFJTHZCLEtBSkssQ0FJQyxVQUFVL0QsR0FBVixFQUFvQjtBQUMxQixlQUFPekQsT0FBTyxDQUFDQyxNQUFSLENBQWV3RCxHQUFmLENBQVA7QUFDQSxPQU5LLENBQVA7QUFPQSxLQXpCSyxFQTBCTC9GLElBMUJLLENBMEJBLFVBQVU2SixzQkFBVixFQUF1QztBQUM1QyxhQUFPdkgsT0FBTyxDQUFDRSxPQUFSLENBQ05vQixNQUFNLENBQUMwSCx1QkFBUCxHQUFpQzFILE1BQU0sQ0FBQzBILHVCQUFQLENBQStCcEwsUUFBL0IsRUFBeUMySixzQkFBekMsQ0FBakMsR0FBb0dBLHNCQUQ5RixDQUFQO0FBR0EsS0E5QkssRUErQkxDLEtBL0JLLENBK0JDLFVBQVUvRCxHQUFWLEVBQW9CO0FBQzFCLGFBQU96RCxPQUFPLENBQUNDLE1BQVIsQ0FBZXdELEdBQWYsQ0FBUDtBQUNBLEtBakNLLENBQVA7QUFrQ0E7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxXQUFTd0YsV0FBVCxDQUFxQnJMLFFBQXJCLEVBQW9DMksscUJBQXBDLEVBQXVGO0FBQ3RGLFFBQU1XLGNBQWMsR0FBR2pILGFBQWEsQ0FBQ3JFLFFBQUQsRUFBV3NFLGVBQWUsQ0FBQ3VELE9BQTNCLENBQXBDO0FBQUEsUUFDQzBELGVBQWUsR0FBR3ZMLFFBQVEsQ0FBQ3FJLFNBQVQsR0FBcUJtRCxjQUR4Qzs7QUFHQSxRQUFJRCxlQUFlLElBQUssQ0FBQ0EsZUFBRCxJQUFvQixDQUFDRCxjQUE3QyxFQUE4RDtBQUM3RDtBQUNBLFVBQUl0TCxRQUFRLENBQUN5TCxpQkFBVCxFQUFKLEVBQWtDO0FBQ2pDLGVBQU96TCxRQUFRLENBQ2JvSixVQURLLEdBRUxzQyxZQUZLLEdBR0w1TCxJQUhLLENBR0EsWUFBWTtBQUNqQixpQkFBT0UsUUFBUSxDQUFDMkwsTUFBVCxFQUFQO0FBQ0EsU0FMSyxFQU1ML0IsS0FOSyxDQU1DLFVBQVUvSCxLQUFWLEVBQXNCO0FBQzVCLGlCQUFPTyxPQUFPLENBQUNDLE1BQVIsQ0FBZVIsS0FBZixDQUFQO0FBQ0EsU0FSSyxDQUFQO0FBU0EsT0FWRCxNQVVPO0FBQ04sZUFBTzdCLFFBQVEsQ0FBQzJMLE1BQVQsRUFBUDtBQUNBO0FBQ0QsS0FmRCxNQWVPO0FBQ047QUFDQSxhQUFPakIseUJBQXlCLENBQUMxSyxRQUFELEVBQVcySyxxQkFBWCxDQUFoQztBQUNBO0FBQ0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxXQUFTaUIseUNBQVQsQ0FDQ0MsaUJBREQsRUFFQ0MsZ0JBRkQsRUFHQzlMLFFBSEQsRUFJQytMLFdBSkQsRUFLQ0Msa0JBTEQsRUFPRTtBQUFBLFFBRERDLGNBQ0MsdUVBRGdDbEUsY0FBYyxDQUFDbUUsY0FDL0M7QUFDRCxRQUFNN0wsTUFBTSxHQUFHTCxRQUFRLENBQUNNLFFBQVQsRUFBZjtBQUNBLFFBQU1DLGdCQUFnQixHQUFHRixNQUFNLENBQUNHLFdBQVAsQ0FBbUJSLFFBQVEsQ0FBQ1MsT0FBVCxLQUFxQiwwQkFBeEMsRUFBb0VDLGVBQXBFLEVBQXpCO0FBRUEsUUFBTXlMLHNCQUFzQixHQUFHakgsWUFBWSxDQUFDa0gsV0FBYixDQUF5QkwsV0FBVyxDQUFDTSxPQUFaLEVBQXpCLENBQS9CO0FBQ0EsUUFBTUMsd0JBQXdCLEdBQUcsQ0FBQ0gsc0JBQUQsR0FDOUJOLGlCQUQ4QixHQUU5QixZQUEwQjtBQUMxQjNHLE1BQUFBLFlBQVksQ0FBQ3FILFVBQWIsQ0FBd0JSLFdBQVcsQ0FBQ00sT0FBWixFQUF4Qjs7QUFEMEIsd0NBQWJHLElBQWE7QUFBYkEsUUFBQUEsSUFBYTtBQUFBOztBQUUxQlgsTUFBQUEsaUJBQWlCLENBQUNZLEtBQWxCLE9BQUFaLGlCQUFpQixHQUFPLElBQVAsU0FBZ0JXLElBQWhCLEVBQWpCO0FBQ0MsS0FMSjs7QUFPQSxRQUNDeE0sUUFBUSxJQUNSQSxRQUFRLENBQUNxSSxTQUFULEVBREEsS0FFQyxDQUFDckksUUFBUSxDQUFDcUksU0FBVCxHQUFxQnFFLHVCQUF0QixJQUFpRDFNLFFBQVEsQ0FBQ3FJLFNBQVQsR0FBcUJtRCxjQUFyQixLQUF3QyxJQUYxRixDQURELEVBSUU7QUFDREssTUFBQUEsaUJBQWlCO0FBQ2pCLEtBTkQsTUFNTztBQUNOdEwsTUFBQUEsZ0JBQWdCLENBQ2RRLGFBREYsR0FFRWpCLElBRkYsQ0FFTyxVQUFVa0IsY0FBVixFQUErQjtBQUNwQyxZQUFJQSxjQUFKLEVBQW9CO0FBQ25CLGNBQUkrSyxXQUFXLENBQUNZLGVBQVosR0FBOEJDLHFCQUE5QixHQUFzREMsWUFBdEQsRUFBSixFQUEwRTtBQUN6RTtBQUNBO0FBQ0E7QUFDQSxnQkFBSSxFQUFFN0wsY0FBYyxDQUFDOEwsZ0JBQWYsS0FBb0M5TCxjQUFjLENBQUMrTCxrQkFBckQsQ0FBSixFQUE4RTtBQUM3RUMsY0FBQUEsNkJBQTZCLENBQUNDLDhCQUE5QixDQUNDWCx3QkFERCxFQUVDUixnQkFGRCxFQUdDQyxXQUhELEVBSUNDLGtCQUpEO0FBTUEsYUFQRCxNQU9PO0FBQ05NLGNBQUFBLHdCQUF3QjtBQUN4QjtBQUNELFdBZEQsTUFjTztBQUNOLGdCQUFJLENBQUN0TSxRQUFRLENBQUNxSSxTQUFULEdBQXFCNkUsZUFBMUIsRUFBMkM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBSUMsU0FBUyxDQUFDQyxnQkFBVixFQUFKLEVBQWtDO0FBQ2pDO0FBQ0E7QUFDQUosZ0JBQUFBLDZCQUE2QixDQUFDQyw4QkFBOUIsQ0FDQ1gsd0JBREQsRUFFQ1IsZ0JBRkQsRUFHQ0MsV0FIRCxFQUlDQyxrQkFKRDtBQU1BLGVBVEQsTUFTTztBQUNOO0FBQ0E7QUFDQTtBQUNBTSxnQkFBQUEsd0JBQXdCO0FBQ3hCO0FBQ0QsYUFwQkQsTUFvQk87QUFDTjtBQUNBLGtCQUFJdEwsY0FBYyxDQUFDOEwsZ0JBQWYsS0FBb0M5TCxjQUFjLENBQUMrTCxrQkFBdkQsRUFBMkU7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQUlkLGNBQWMsS0FBS2xFLGNBQWMsQ0FBQ21FLGNBQXRDLEVBQXNEO0FBQ3JELHNCQUFNaE0sV0FBVyxHQUFHO0FBQ25CbU4sb0JBQUFBLGtCQUFrQixFQUFFO0FBREQsbUJBQXBCO0FBR0F0QixrQkFBQUEsV0FBVyxDQUFDdUIsUUFBWixDQUNFQyxjQURGLENBQ2lCdk4sUUFEakIsRUFDMkJFLFdBRDNCLEVBRUVKLElBRkYsQ0FFTyxZQUFNO0FBQ1h3TSxvQkFBQUEsd0JBQXdCO0FBQ3hCLG1CQUpGLEVBS0UxQyxLQUxGLENBS1EsVUFBQy9ILEtBQUQsRUFBZ0I7QUFDdEJvRSxvQkFBQUEsR0FBRyxDQUFDcEUsS0FBSixDQUFVLG9DQUFWLEVBQWdEQSxLQUFoRDtBQUNBLG1CQVBGO0FBUUEsaUJBWkQsTUFZTztBQUNOO0FBQ0E7QUFDQXlLLGtCQUFBQSx3QkFBd0I7QUFDeEI7QUFDRCxlQXhCRCxNQXdCTztBQUNOO0FBQ0E7QUFDQTtBQUNBLG9CQUFJYSxTQUFTLENBQUNDLGdCQUFWLEVBQUosRUFBa0M7QUFDakM7QUFDQTtBQUNBSixrQkFBQUEsNkJBQTZCLENBQUNDLDhCQUE5QixDQUNDWCx3QkFERCxFQUVDUixnQkFGRCxFQUdDQyxXQUhELEVBSUNDLGtCQUpEO0FBTUEsaUJBVEQsTUFTTztBQUNOO0FBQ0E7QUFDQTtBQUNBTSxrQkFBQUEsd0JBQXdCO0FBQ3hCO0FBQ0Q7QUFDRDtBQUNEO0FBQ0QsU0FwRkQsTUFvRk87QUFDTlQsVUFBQUEsaUJBQWlCO0FBQ2pCO0FBQ0QsT0ExRkYsRUEyRkVqQyxLQTNGRixDQTJGUSxVQUFVTSxNQUFWLEVBQXVCO0FBQzdCakUsUUFBQUEsR0FBRyxDQUFDcEUsS0FBSixDQUFVLDhDQUFWLEVBQTBEcUksTUFBMUQ7QUFDQSxPQTdGRjtBQThGQTtBQUNEOztBQUVELE1BQU1wRixLQUFLLEdBQUc7QUFDYi9FLElBQUFBLDZCQUE2QixFQUFFQSw2QkFEbEI7QUFFYitLLElBQUFBLGdCQUFnQixFQUFFQSxnQkFGTDtBQUdiTyxJQUFBQSxXQUFXLEVBQUVBLFdBSEE7QUFJYmxKLElBQUFBLHNCQUFzQixFQUFFQSxzQkFKWDtBQUtiaUQsSUFBQUEseUJBQXlCLEVBQUVBLHlCQUxkO0FBTWJ3RyxJQUFBQSx5Q0FBeUMsRUFBRUEseUNBTjlCO0FBT2J0RCxJQUFBQSxlQUFlLEVBQUVBLGVBUEo7QUFRYm9DLElBQUFBLHlCQUF5QixFQUFFQSx5QkFSZDtBQVNiM0MsSUFBQUEsY0FBYyxFQUFFQTtBQVRILEdBQWQ7U0FZZWpELEsiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBBY3Rpdml0eVN5bmMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQWN0aXZpdHlTeW5jXCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9tZXNzYWdlSGFuZGxlci9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCBEYXRhTG9zc09yRHJhZnREaXNjYXJkSGFuZGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbHMvRGF0YUxvc3NPckRyYWZ0RGlzY2FyZC9EYXRhTG9zc09yRHJhZnREaXNjYXJkSGFuZGxlclwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCB7IFNpZGVFZmZlY3RzU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL3Jlc291cmNlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCB7IENvcmVFeCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgU2libGluZ0luZm9ybWF0aW9uID0ge1xuXHR0YXJnZXRDb250ZXh0OiBDb250ZXh0O1xuXHRwYXRoTWFwcGluZzogeyBvbGRQYXRoOiBzdHJpbmc7IG5ld1BhdGg6IHN0cmluZyB9W107XG59O1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgY2FsbGJhY2tzIHVzZWQgaW4gdGhlIGZ1bmN0aW9uc1xuICpcbiAqXG4gKiBAYXV0aG9yIFNBUCBTRVxuICogQHNpbmNlIDEuNTQuMFxuICogQGludGVyZmFjZVxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2tcbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBDYWxsYmFjayB0byBhcHByb3ZlIG9yIHJlamVjdCB0aGUgY3JlYXRpb24gb2YgYSBkcmFmdFxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suYmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcbiAqIEBmdW5jdGlvblxuICogQHN0YXRpY1xuICogQGFic3RyYWN0XG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEByZXR1cm5zIHsoYm9vbGVhbnxQcm9taXNlKX0gQXBwcm92YWwgb2YgZHJhZnQgY3JlYXRpb24gW3RydWV8ZmFsc2VdIG9yIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBib29sZWFuIHZhbHVlXG4gKlxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqIENhbGxiYWNrIGFmdGVyIGEgZHJhZnQgd2FzIHN1Y2Nlc3N1bGx5IGNyZWF0ZWRcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLmFmdGVyQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcbiAqIEBmdW5jdGlvblxuICogQHN0YXRpY1xuICogQGFic3RyYWN0XG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBuZXcgZHJhZnRcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9BY3RpdmVEb2N1bWVudENvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcmV0dXJucyB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9BY3RpdmVEb2N1bWVudENvbnRleHRcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogQ2FsbGJhY2sgdG8gYXBwcm92ZSBvciByZWplY3Qgb3ZlcndyaXRpbmcgYW4gdW5zYXZlZCBkcmFmdCBvZiBhbm90aGVyIHVzZXJcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLndoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkXG4gKiBAZnVuY3Rpb25cbiAqIEBwdWJsaWNcbiAqIEBzdGF0aWNcbiAqIEBhYnN0cmFjdFxuICpcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHJldHVybnMgeyhib29sZWFufFByb21pc2UpfSBBcHByb3ZhbCB0byBvdmVyd3JpdGUgdW5zYXZlZCBkcmFmdCBbdHJ1ZXxmYWxzZV0gb3IgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGJvb2xlYW4gdmFsdWVcbiAqXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuLyogQ29uc3RhbnRzIGZvciBkcmFmdCBvcGVyYXRpb25zICovXG5jb25zdCBkcmFmdE9wZXJhdGlvbnMgPSB7XG5cdEVESVQ6IFwiRWRpdEFjdGlvblwiLFxuXHRBQ1RJVkFUSU9OOiBcIkFjdGl2YXRpb25BY3Rpb25cIixcblx0RElTQ0FSRDogXCJEaXNjYXJkQWN0aW9uXCIsXG5cdFBSRVBBUkU6IFwiUHJlcGFyYXRpb25BY3Rpb25cIlxufTtcbi8qIEVudW0gZm9yIG5hdmlnYXRpb24gdHlwZXMgKi9cbmVudW0gTmF2aWdhdGlvblR5cGUge1xuXHRCYWNrTmF2aWdhdGlvbiA9IFwiQmFja05hdmlnYXRpb25cIixcblx0Rm9yd2FyZE5hdmlnYXRpb24gPSBcIkZvcndhcmROYXZpZ2F0aW9uXCJcbn1cbi8qKlxuICogU3RhdGljIGZ1bmN0aW9ucyBmb3IgdGhlIGRyYWZ0IHByb2dyYW1taW5nIG1vZGVsXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnRcbiAqIEBwcml2YXRlXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgbW9kdWxlIGlzIG9ubHkgZm9yIGV4cGVyaW1lbnRhbCB1c2UhIDxici8+PGI+VGhpcyBpcyBvbmx5IGEgUE9DIGFuZCBtYXliZSBkZWxldGVkPC9iPlxuICogQHNpbmNlIDEuNTQuMFxuICovXG5cbi8qKlxuICogRGV0ZXJtaW5lcyBhY3Rpb24gbmFtZSBmb3IgYSBkcmFmdCBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IHNPcGVyYXRpb24gVGhlIG9wZXJhdGlvbiBuYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgZHJhZnQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldEFjdGlvbk5hbWUob0NvbnRleHQ6IGFueSwgc09wZXJhdGlvbjogc3RyaW5nKSB7XG5cdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRzRW50aXR5U2V0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblxuXHRyZXR1cm4gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0VudGl0eVNldFBhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L1wiICsgc09wZXJhdGlvbik7XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gb3BlcmF0aW9uIGNvbnRleHQgYmluZGluZyBmb3IgdGhlIGdpdmVuIGNvbnRleHQgYW5kIG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIChhY3Rpb24gb3IgZnVuY3Rpb24gaW1wb3J0KVxuICogQHBhcmFtIG9PcHRpb25zIE9wdGlvbnMgdG8gY3JlYXRlIHRoZSBvcGVyYXRpb24gY29udGV4dFxuICogQHJldHVybnMge3NhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nfSBUaGUgY29udGV4dCBiaW5kaW5nIG9mIHRoZSBib3VuZCBvcGVyYXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0OiBhbnksIHNPcGVyYXRpb246IHN0cmluZywgb09wdGlvbnM/OiBhbnkpIHtcblx0Y29uc3Qgc09wZXJhdGlvbk5hbWUgPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBzT3BlcmF0aW9uKTtcblxuXHRyZXR1cm4gb0NvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChzT3BlcmF0aW9uTmFtZSArIFwiKC4uLilcIiwgb0NvbnRleHQsIG9PcHRpb25zKTtcbn1cbi8qKlxuICogQ2hlY2sgaWYgb3B0aW9uYWwgZHJhZnQgcHJlcGFyZSBhY3Rpb24gZXhpc3RzLlxuICpcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGEgYSBwcmVwYXJlIGFjdGlvbiBleGlzdHNcbiAqL1xuZnVuY3Rpb24gaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dDogYW55KSB7XG5cdHJldHVybiAhIWdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBkcmFmdCBmcm9tIGFuIGFjdGl2ZSBkb2N1bWVudC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIHtib29sZWFufSBiUHJlc2VydmVDaGFuZ2VzIElmIHRydWUgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlciB1c2VyIHRoYXQgYXJlIG5vdCBsb2NrZWQgYXJlIHByZXNlcnZlZCBhbmQgYW4gZXJyb3IgbWVzc2FnZSAoaHR0cCBzdGF0dXMgNDA5KSBpcyBzZW5kIGZyb20gdGhlIGJhY2tlbmQsIG90aGVyd2lzZSBmYWxzZSAtIGV4aXN0aW5nIGNoYW5nZXMgZnJvbSBhbm90aGVyIHVzZXIgdGhhdCBhcmUgbm90IGxvY2tlZCBhcmUgb3ZlcndyaXR0ZW48L2xpPlxuICogQHJldHVybnMge1Byb21pc2UuPHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0Pn0gUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihvQ29udGV4dDogYW55LCBiUHJlc2VydmVDaGFuZ2VzOiBib29sZWFuKSB7XG5cdGlmIChvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgb09wdGlvbnMgPSB7ICQkaW5oZXJpdEV4cGFuZFNlbGVjdDogdHJ1ZSB9O1xuXHRcdGNvbnN0IG9PcGVyYXRpb24gPSBjcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5FRElULCBvT3B0aW9ucyk7XG5cdFx0b09wZXJhdGlvbi5zZXRQYXJhbWV0ZXIoXCJQcmVzZXJ2ZUNoYW5nZXNcIiwgYlByZXNlcnZlQ2hhbmdlcyk7XG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBcImRpcmVjdFwiO1xuXHRcdGNvbnN0IGxvY2FsSTE4blJlZiA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0VESVRcIik7XG5cdFx0Ly9JZiB0aGUgY29udGV4dCBpcyBjb21pbmcgZnJvbSBhIGxpc3QgYmluZGluZyB3ZSBwYXNzIHRoZSBmbGFnIHRydWUgdG8gcmVwbGFjZSB0aGUgY29udGV4dCBieSB0aGUgYWN0aXZlIG9uZVxuXHRcdGNvbnN0IG9FZGl0UHJvbWlzZSA9IG9PcGVyYXRpb25cblx0XHRcdC5leGVjdXRlKFxuXHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRDb21tb25VdGlscy5mbk9uU3RyaWN0SGFuZGxpbmdGYWlsZWQuYmluZChkcmFmdCwgc0dyb3VwSWQsIHNBY3Rpb25OYW1lLCBvQ29udGV4dC5nZXRNb2RlbCgpKSxcblx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpXG5cdFx0XHQpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0RyYWZ0RG9jdW1lbnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9EcmFmdERvY3VtZW50Q29udGV4dDtcblx0XHRcdH0pO1xuXHRcdG9PcGVyYXRpb24uZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzR3JvdXBJZCk7XG5cdFx0cmV0dXJuIG9FZGl0UHJvbWlzZTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJZb3UgY2Fubm90IGVkaXQgdGhpcyBkcmFmdCBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIEFjdGl2YXRlcyBhIGRyYWZ0IGRvY3VtZW50LiBUaGUgZHJhZnQgd2lsbCByZXBsYWNlIHRoZSBzaWJsaW5nIGVudGl0eSBhbmQgd2lsbCBiZSBkZWxldGVkIGJ5IHRoZSBiYWNrIGVuZC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIHtvYmplY3R9IG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIHtzdHJpbmd9IFtzR3JvdXBJZF0gVGhlIG9wdGlvbmFsIGJhdGNoIGdyb3VwIGluIHdoaWNoIHRoZSBvcGVyYXRpb24gaXMgdG8gYmUgZXhlY3V0ZWRcbiAqIEByZXR1cm5zIHtQcm9taXNlLjxzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dD59IFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24ob0NvbnRleHQ6IGFueSwgb0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBzR3JvdXBJZD86IHN0cmluZykge1xuXHRjb25zdCBiSGFzUHJlcGFyZUFjdGlvbiA9IGhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQpO1xuXG5cdC8vIEFjY29yZGluZyB0byB0aGUgZHJhZnQgc3BlYyBpZiB0aGUgc2VydmljZSBjb250YWlucyBhIHByZXBhcmUgYWN0aW9uIGFuZCB3ZSB0cmlnZ2VyIGJvdGggcHJlcGFyZSBhbmRcblx0Ly8gYWN0aXZhdGUgaW4gb25lICRiYXRjaCB0aGUgYWN0aXZhdGUgYWN0aW9uIGlzIGNhbGxlZCB3aXRoIGlGLU1hdGNoPSpcblx0Y29uc3QgYklnbm9yZUV0YWcgPSBiSGFzUHJlcGFyZUFjdGlvbjtcblxuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBvT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuQUNUSVZBVElPTiwgeyAkJGluaGVyaXRFeHBhbmRTZWxlY3Q6IHRydWUgfSk7XG5cdFx0Y29uc3QgbG9jYWxJMThuUmVmID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0XHRjb25zdCBzQWN0aW9uTmFtZSA9IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19PUF9PQkpFQ1RfUEFHRV9TQVZFXCIpO1xuXHRcdHJldHVybiBvT3BlcmF0aW9uXG5cdFx0XHQuZXhlY3V0ZShcblx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdGJJZ25vcmVFdGFnLFxuXHRcdFx0XHRzR3JvdXBJZCA/IENvbW1vblV0aWxzLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKGRyYWZ0LCBzR3JvdXBJZCwgc0FjdGlvbk5hbWUsIG9Db250ZXh0LmdldE1vZGVsKCkpIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRvQ29udGV4dC5nZXRCaW5kaW5nKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIilcblx0XHRcdCkgLy8zcmQgcGFyYW1ldGVyPC0tLS0tLVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9BY3RpdmVEb2N1bWVudENvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goXG5cdFx0XHRcdC8vaWYgQUNUSVZBVEUgYWN0aW9uIGZhaWxzIHRoZW4gd2UgcmVxdWVzdCBlaXRoZXIgdGhlIHNpZGVFZmZlY3RzIGFnYWluc3QgUFJFUEFSRSBhY3Rpb24gKGlmIGFubm90YXRlZCkgb3IgdGhlIG1lc3NhZ2VzIGFzIGZhbGxiYWNrOlxuXHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0aWYgKGJIYXNQcmVwYXJlQWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzQWN0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKSxcblx0XHRcdFx0XHRcdFx0b1NpZGVFZmZlY3RzU2VydmljZSA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCksXG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nUGFyYW1ldGVycyA9IG9TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhzQWN0aW9uTmFtZSwgb0NvbnRleHQpLFxuXHRcdFx0XHRcdFx0XHRhVGFyZ2V0UGF0aHMgPSBvQmluZGluZ1BhcmFtZXRlcnMgJiYgb0JpbmRpbmdQYXJhbWV0ZXJzLnBhdGhFeHByZXNzaW9ucztcblx0XHRcdFx0XHRcdGlmIChhVGFyZ2V0UGF0aHMgJiYgYVRhcmdldFBhdGhzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0b1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoYVRhcmdldFBhdGhzLCBvQ29udGV4dCkuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0TWVzc2FnZXMob0NvbnRleHQsIG9TaWRlRWZmZWN0c1NlcnZpY2UpLmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3RpbmcgbWVzc2FnZXNcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBhY3RpdmF0aW9uIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG4vKipcbiAqIEV4ZWN1dGUgYSBwcmVwYXJhdGlvbiBhY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBncm91cElkIFRoZSBvcHRpb25hbCBiYXRjaCBncm91cCBpbiB3aGljaCB3ZSB3YW50IHRvIGV4ZWN1dGUgdGhlIG9wZXJhdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0Pn0gUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24ob0NvbnRleHQ6IENvbnRleHQsIGdyb3VwSWQ/OiBzdHJpbmcpIHtcblx0aWYgKCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgb09wZXJhdGlvbiA9IGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpO1xuXG5cdFx0Ly8gVE9ETzogc2lkZSBlZmZlY3RzIHF1YWxpZmllciBzaGFsbCBiZSBldmVuIGRlcHJlY2F0ZWQgdG8gYmUgY2hlY2tlZFxuXHRcdG9PcGVyYXRpb24uc2V0UGFyYW1ldGVyKFwiU2lkZUVmZmVjdHNRdWFsaWZpZXJcIiwgXCJcIik7XG5cblx0XHRjb25zdCBzR3JvdXBJZCA9IGdyb3VwSWQgfHwgb09wZXJhdGlvbi5nZXRHcm91cElkKCk7XG5cdFx0cmV0dXJuIG9PcGVyYXRpb25cblx0XHRcdC5leGVjdXRlKHNHcm91cElkKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gb09wZXJhdGlvbjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uXCIsIG9FcnJvcik7XG5cdFx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcHJlcGFyYXRpb24gYWN0aW9uIGNhbm5vdCBiZSBleGVjdXRlZCBvbiBhbiBhY3RpdmUgZG9jdW1lbnRcIik7XG5cdH1cbn1cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgbWVzc2FnZSBwYXRoIGZvciBhIGNvbnRleHQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgcGF0aCBzaGFsbCBiZSBkZXRlcm1pbmVkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBNZXNzYWdlIHBhdGgsIGVtcHR5IGlmIG5vdCBhbm5vdGF0ZWRcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZ2V0TWVzc2FnZXNQYXRoKG9Db250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHtcblx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsLFxuXHRcdHNFbnRpdHlTZXRQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRyZXR1cm4gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0VudGl0eVNldFBhdGggKyBcIi9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoXCIpO1xufVxuLyoqXG4gKiBSZXF1ZXN0cyB0aGUgbWVzc2FnZXMgaWYgYW5ub3RhdGVkIGZvciBhIGdpdmVuIGNvbnRleHQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgbWVzc2FnZXMgc2hhbGwgYmUgcmVxdWVzdGVkXG4gKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzU2VydmljZSBTZXJ2aWNlIGZvciB0aGUgU2lkZUVmZmVjdHMgb24gU0FQIEZpb3JpIGVsZW1lbnRzXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCBvbmNlIG1lc3NhZ2VzIHdlcmUgcmVxdWVzdGVkXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIHJlcXVlc3RNZXNzYWdlcyhvQ29udGV4dDogYW55LCBvU2lkZUVmZmVjdHNTZXJ2aWNlOiBTaWRlRWZmZWN0c1NlcnZpY2UpIHtcblx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IGdldE1lc3NhZ2VzUGF0aChvQ29udGV4dCk7XG5cdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0cmV0dXJuIG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICRQcm9wZXJ0eVBhdGg6IHNNZXNzYWdlc1BhdGggfV0gYXMgYW55LCBvQ29udGV4dCk7XG5cdH1cblx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufVxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgZGlzY2FyZCBvZiBhIGRyYWZ0IGZ1bmN0aW9uIHVzaW5nIEhUVFAgUE9TVC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIHtib29sZWFufSBiRW5hYmxlU3RyaWN0SGFuZGxpbmdcbiAqIEByZXR1cm5zIHtQcm9taXNlLjxzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dD59IFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb24ob0NvbnRleHQ6IGFueSwgYkVuYWJsZVN0cmljdEhhbmRsaW5nPzogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBvRGlzY2FyZE9wZXJhdGlvbiA9IGRyYWZ0LmNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkRJU0NBUkQpO1xuXHRcdGNvbnN0IGxvY2FsSTE4blJlZiA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBcImRpcmVjdFwiO1xuXHRcdGNvbnN0IHNBY3Rpb25OYW1lID0gbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9EUkFGVF9ESVNDQVJEX0JVVFRPTlwiKTtcblx0XHQvLyBhcyB0aGUgZGlzY2FyZCBhY3Rpb24gZG9lc250JyBzZW5kIHRoZSBhY3RpdmUgdmVyc2lvbiBpbiB0aGUgcmVzcG9uc2Ugd2UgZG8gbm90IHVzZSB0aGUgcmVwbGFjZSBpbiBjYWNoZVxuXHRcdGNvbnN0IG9EaXNjYXJkUHJvbWlzZSA9ICFiRW5hYmxlU3RyaWN0SGFuZGxpbmdcblx0XHRcdD8gb0Rpc2NhcmRPcGVyYXRpb24uZXhlY3V0ZShzR3JvdXBJZClcblx0XHRcdDogb0Rpc2NhcmRPcGVyYXRpb24uZXhlY3V0ZShcblx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0Q29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQoZHJhZnQsIHNHcm91cElkLCBzQWN0aW9uTmFtZSwgb0NvbnRleHQuZ2V0TW9kZWwoKSksXG5cdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdCAgKTtcblx0XHRvQ29udGV4dC5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKHNHcm91cElkKTtcblx0XHRyZXR1cm4gb0Rpc2NhcmRQcm9taXNlO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBkaXNjYXJkIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIHNpYmxpbmcgY29udGV4dCBmb3IgYSBzdWJvYmplY3QgcGFnZSBhbmQgY2FsY3VsYXRlcyBhIHNpYmxpbmcgcGF0aCBmb3IgYWxsIGludGVybWVkaWF0ZSBwYXRoc1xuICogYmV0d2VlbiB0aGUgb2JqZWN0IHBhZ2UgYW5kIHRoZSBzdWJvYmplY3QgcGFnZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcm9vdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgcm9vdCBvZiB0aGUgZHJhZnRcbiAqIEBwYXJhbSB7b2JqZWN0fSByaWdodG1vc3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgc3Vib2JqZWN0IHBhZ2VcbiAqIEByZXR1cm5zIHtQcm9taXNlfSByZXR1cm5zIHRoZSBzaWJsaW5nSW5mb3JtYXRpb24gb2JqZWN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdHJvb3RDdXJyZW50Q29udGV4dDogQ29udGV4dCxcblx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQ6IENvbnRleHRcbik6IFByb21pc2U8U2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkPiB7XG5cdGlmICghcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkpIHtcblx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdExvZy5lcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0fVxuXG5cdGNvbnN0IG1vZGVsID0gcm9vdEN1cnJlbnRDb250ZXh0LmdldE1vZGVsKCk7XG5cdHRyeSB7XG5cdFx0Ly8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8gMS4gRmluZCBhbGwgc2VnbWVudHMgYmV0d2VlbiB0aGUgcm9vdCBvYmplY3QgYW5kIHRoZSBzdWItb2JqZWN0XG5cdFx0Ly8gRXhhbXBsZTogZm9yIHJvb3QgPSAvUGFyYW0oYWEpL0VudGl0eShiYikgYW5kIHJpZ2h0TW9zdCA9IC9QYXJhbShhYSkvRW50aXR5KGJiKS9fTmF2KGNjKS9fU3ViTmF2KGRkKVxuXHRcdC8vIC0tLT4gW1wiUGFyYW0oYWEpL0VudGl0eShiYilcIiwgXCJfTmF2KGNjKVwiLCBcIl9TdWJOYXYoZGQpXCJdXG5cblx0XHQvLyBGaW5kIGFsbCBzZWdtZW50cyBpbiB0aGUgcmlnaHRtb3N0IHBhdGhcblx0XHRjb25zdCBhZGRpdGlvbmFsUGF0aCA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5yZXBsYWNlKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCksIFwiXCIpO1xuXHRcdGNvbnN0IHNlZ21lbnRzID0gYWRkaXRpb25hbFBhdGggPyBhZGRpdGlvbmFsUGF0aC5zdWJzdHJpbmcoMSkuc3BsaXQoXCIvXCIpIDogW107XG5cdFx0Ly8gRmlyc3Qgc2VnbWVudCBpcyBhbHdheXMgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgcm9vdCBvYmplY3QsIHdoaWNoIGNhbiBjb250YWluICcvJyBpbiBjYXNlIG9mIGEgcGFyYW1ldHJpemVkIGVudGl0eVxuXHRcdHNlZ21lbnRzLnVuc2hpZnQocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdWJzdHJpbmcoMSkpO1xuXG5cdFx0Ly8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8gMi4gUmVxdWVzdCBjYW5vbmljYWwgcGF0aHMgb2YgdGhlIHNpYmxpbmcgZW50aXR5IGZvciBlYWggc2VnbWVudFxuXHRcdC8vIEV4YW1wbGU6IGZvciBbXCJQYXJhbShhYSkvRW50aXR5KGJiKVwiLCBcIl9OYXYoY2MpXCIsIFwiX1N1Yk5hdihkZClcIl1cblx0XHQvLyAtLT4gcmVxdWVzdCBjYW5vbmljYWwgcGF0aHMgZm9yIFwiUGFyYW0oYWEpL0VudGl0eShiYikvU2libGluZ0VudGl0eVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmIpL19OYXYoY2MpL1NpYmxpbmdFbnRpdHlcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiKS9fTmF2KGNjKS9fU3ViTmF2KGRkKS9TaWJsaW5nRW50aXR5XCJcblx0XHRjb25zdCBvbGRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBuZXdQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRsZXQgY3VycmVudFBhdGggPSBcIlwiO1xuXHRcdGNvbnN0IGNhbm9uaWNhbFBhdGhQcm9taXNlcyA9IHNlZ21lbnRzLm1hcCgoc2VnbWVudCkgPT4ge1xuXHRcdFx0Y3VycmVudFBhdGggKz0gYC8ke3NlZ21lbnR9YDtcblx0XHRcdG9sZFBhdGhzLnVuc2hpZnQoY3VycmVudFBhdGgpO1xuXHRcdFx0Y29uc3Qgc2libGluZ0NvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChjdXJyZW50UGF0aCArIFwiL1NpYmxpbmdFbnRpdHlcIikuZ2V0Qm91bmRDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdHJldHVybiBzaWJsaW5nQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpO1xuXHRcdH0pO1xuXG5cdFx0Ly8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8gMy4gUmVjb25zdHJ1Y3QgdGhlIGZ1bGwgcGF0aHMgZnJvbSBjYW5vbmljYWwgcGF0aHMgKGZvciBwYXRoIG1hcHBpbmcpXG5cdFx0Ly8gRXhhbXBsZTogZm9yIGNhbm9uaWNhbCBwYXRocyBcIi9QYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpXCIsIFwiL0VudGl0eTIoY2Mtc2libGluZylcIiwgXCIvRW50aXR5MyhkZC1zaWJsaW5nKVwiXG5cdFx0Ly8gLS0+IFtcIlBhcmFtKGFhKS9FbnRpdHkoYmItc2libGluZylcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpL19OYXYoY2Mtc2libGluZylcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpL19OYXYoY2Mtc2libGluZykvX1N1Yk5hdihkZC1zaWJsaW5nKVwiXVxuXHRcdGNvbnN0IGNhbm9uaWNhbFBhdGhzID0gKGF3YWl0IFByb21pc2UuYWxsKGNhbm9uaWNhbFBhdGhQcm9taXNlcykpIGFzIHN0cmluZ1tdO1xuXHRcdGxldCBzaWJsaW5nUGF0aCA9IFwiXCI7XG5cdFx0Y2Fub25pY2FsUGF0aHMuZm9yRWFjaCgoY2Fub25pY2FsUGF0aCwgaW5kZXgpID0+IHtcblx0XHRcdGlmIChpbmRleCAhPT0gMCkge1xuXHRcdFx0XHRjb25zdCBuYXZpZ2F0aW9uID0gc2VnbWVudHNbaW5kZXhdLnJlcGxhY2UoL1xcKC4qJC8sIFwiXCIpOyAvLyBLZWVwIG9ubHkgbmF2aWdhdGlvbiBuYW1lIGZyb20gdGhlIHNlZ21lbnQsIGkuZS4gYWFhKHh4eCkgLS0+IGFhYVxuXHRcdFx0XHRjb25zdCBrZXlzID0gY2Fub25pY2FsUGF0aC5yZXBsYWNlKC8uKlxcKC8sIFwiKFwiKTsgLy8gS2VlcCBvbmx5IHRoZSBrZXlzIGZtcm8gdGhlIGNhbm9uaWNhbCBwYXRoLCBpLmUuIGFhYSh4eHgpIC0tPiAoeHh4KVxuXHRcdFx0XHRzaWJsaW5nUGF0aCArPSBgLyR7bmF2aWdhdGlvbn0ke2tleXN9YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNpYmxpbmdQYXRoID0gY2Fub25pY2FsUGF0aDsgLy8gVG8gbWFuYWdlIHBhcmFtZXRyaXplZCBlbnRpdGllc1xuXHRcdFx0fVxuXHRcdFx0bmV3UGF0aHMudW5zaGlmdChzaWJsaW5nUGF0aCk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dGFyZ2V0Q29udGV4dDogbW9kZWwuYmluZENvbnRleHQoc2libGluZ1BhdGgpLmdldEJvdW5kQ29udGV4dCgpIGFzIENvbnRleHQsIC8vIENyZWF0ZSB0aGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dCBmcm9tIGl0cyBwYXRoXG5cdFx0XHRwYXRoTWFwcGluZzogb2xkUGF0aHMubWFwKChvbGRQYXRoLCBpbmRleCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdG9sZFBhdGgsXG5cdFx0XHRcdFx0bmV3UGF0aDogbmV3UGF0aHNbaW5kZXhdXG5cdFx0XHRcdH07XG5cdFx0XHR9KVxuXHRcdH07XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gQSBjYW5vbmljYWwgcGF0aCBjb3VsZG4ndCBiZSByZXNvbHZlZCAoYmVjYXVzZSBhIHNpYmxpbmcgZG9lc24ndCBleGlzdClcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRyYWZ0IGRvY3VtZW50IGZyb20gYW4gZXhpc3RpbmcgZG9jdW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIHNldmVyYWwgaG9va3MgYXMgdGhlcmUgaXMgYSBjZXJ0YWluIGNvcmVvZ3JhcGh5IGRlZmluZWQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0I2NyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdFxuICogQHN0YXRpY1xuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcGFyYW0ge0FwcENvbXBvbmVudH0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLm9WaWV3XSBUaGUgdmlld1xuICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYlByZXNlcnZlQ2hhbmdlc10gUHJlc2VydmUgY2hhbmdlcyBvZiBhbiBleGlzdGluZyBkcmFmdCBvZiBhbm90aGVyIHVzZXJcbiAqIEBwYXJhbSB7c2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suYmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnR9IFttUGFyYW1ldGVycy5mbkJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XSBDYWxsYmFjayB0aGF0IGFsbG93cyB2ZXRvIGJlZm9yZSBjcmVhdGUgcmVxdWVzdCBpcyBleGVjdXRlZFxuICogQHBhcmFtIHtzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay5hZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50fSBbbVBhcmFtZXRlcnMuZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XSBDYWxsYmFjayBmb3IgcG9zdHByb2Nlc3Npb25nIGFmdGVyIGRyYWZ0IGRvY3VtZW50IHdhcyBjcmVhdGVkXG4gKiBAcGFyYW0ge3NhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLndoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkfSBbbVBhcmFtZXRlcnMuZm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZF0gQ2FsbGJhY2sgZm9yIGRlY2lkaW5nIG9uIG92ZXJ3cml0aW5nIGFuIHVuc2F2ZWQgY2hhbmdlIGJ5IGFub3RoZXIgdXNlclxuICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgd2l0aCB0aGUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0IGNvbnRleHR9IG9mIHRoZSBuZXcgZHJhZnQgZG9jdW1lbnRcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQoXG5cdG9Db250ZXh0OiBhbnksXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bVBhcmFtZXRlcnM6IHtcblx0XHRvVmlldzogVmlldztcblx0XHRiUHJlc2VydmVDaGFuZ2VzPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0XHRmbkJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50PzogYW55O1xuXHRcdGZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudD86IGFueTtcblx0XHRmbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkPzogYW55O1xuXHR9XG4pIHtcblx0Y29uc3QgbVBhcmFtID0gbVBhcmFtZXRlcnMgfHwge30sXG5cdFx0bG9jYWxJMThuUmVmID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSxcblx0XHRiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyA9XG5cdFx0XHR0eXBlb2YgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMgPT09IFwidW5kZWZpbmVkXCIgfHwgKHR5cGVvZiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyA9PT0gXCJib29sZWFuXCIgJiYgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMpOyAvL2RlZmF1bHQgdHJ1ZVxuXG5cdC8qKlxuXHQgKiBPdmVyd3JpdGUgb3IgcmVqZWN0IGJhc2VkIG9uIGZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gYk92ZXJ3cml0ZSBPdmVyd3JpdGUgdGhlIGNoYW5nZSBvciBub3Rcblx0ICogQHJldHVybnMge1Byb21pc2V9IFJlc29sdmVzIHdpdGggcmVzdWx0IG9mIHtAbGluayBzYXAuZmUuY29yZS5hY3Rpb25zI2V4ZWN1dGVEcmFmdEVkaXRBY3Rpb259XG5cdCAqL1xuXHRmdW5jdGlvbiBvdmVyd3JpdGVPbkRlbWFuZChiT3ZlcndyaXRlOiBhbnkpIHtcblx0XHRpZiAoYk92ZXJ3cml0ZSkge1xuXHRcdFx0Ly9PdmVyd3JpdGUgZXhpc3RpbmcgY2hhbmdlc1xuXHRcdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IGRyYWZ0RGF0YUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpICsgXCIvRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIikuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRsZXQgb1Jlc291cmNlQnVuZGxlOiBSZXNvdXJjZUJ1bmRsZTtcblxuXHRcdFx0cmV0dXJuICgobVBhcmFtZXRlcnMub1ZpZXcuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKSBhcyBSZXNvdXJjZU1vZGVsKS5nZXRSZXNvdXJjZUJ1bmRsZSgpIGFzIFByb21pc2U8UmVzb3VyY2VCdW5kbGU+KVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAoX29SZXNvdXJjZUJ1bmRsZTogYW55KSB7XG5cdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlID0gX29SZXNvdXJjZUJ1bmRsZTtcblx0XHRcdFx0XHRyZXR1cm4gZHJhZnREYXRhQ29udGV4dC5yZXF1ZXN0T2JqZWN0KCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChkcmFmdEFkbWluRGF0YTogYW55KSB7XG5cdFx0XHRcdFx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0XHRcdFx0XHQvLyByZW1vdmUgYWxsIHVuYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBhcyB3ZSBzaG93IGEgc3BlY2lhbCBkaWFsb2dcblx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRsZXQgc0luZm8gPSBkcmFmdEFkbWluRGF0YS5JblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiB8fCBkcmFmdEFkbWluRGF0YS5JblByb2Nlc3NCeVVzZXI7XG5cdFx0XHRcdFx0XHRjb25zdCBzRW50aXR5U2V0ID0gKG1QYXJhbWV0ZXJzLm9WaWV3LmdldFZpZXdEYXRhKCkgYXMgYW55KS5lbnRpdHlTZXQ7XG5cdFx0XHRcdFx0XHRpZiAoc0luZm8pIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc0xvY2tlZEJ5VXNlck1zZyA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19EUkFGVF9PQkpFQ1RfUEFHRV9EUkFGVF9MT0NLRURfQllfVVNFUlwiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRzSW5mbyxcblx0XHRcdFx0XHRcdFx0XHRzRW50aXR5U2V0XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdE1lc3NhZ2VCb3guZXJyb3Ioc0xvY2tlZEJ5VXNlck1zZyk7XG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihzTG9ja2VkQnlVc2VyTXNnKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHNJbmZvID0gZHJhZnRBZG1pbkRhdGEuQ3JlYXRlZEJ5VXNlckRlc2NyaXB0aW9uIHx8IGRyYWZ0QWRtaW5EYXRhLkNyZWF0ZWRCeVVzZXI7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNVbnNhdmVkQ2hhbmdlc01zZyA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19EUkFGVF9PQkpFQ1RfUEFHRV9EUkFGVF9VTlNBVkVEX0NIQU5HRVNcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0c0luZm8sXG5cdFx0XHRcdFx0XHRcdFx0c0VudGl0eVNldFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gc2hvd01lc3NhZ2VCb3goc1Vuc2F2ZWRDaGFuZ2VzTXNnKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihvQ29udGV4dCwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRHJhZnQgY3JlYXRpb24gYWJvcnRlZCBmb3IgZG9jdW1lbnQ6IFwiICsgb0NvbnRleHQuZ2V0UGF0aCgpKSk7XG5cdH1cblxuXHRmdW5jdGlvbiBzaG93TWVzc2FnZUJveChzVW5zYXZlZENoYW5nZXNNc2c6IGFueSkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3Qgb0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHR0aXRsZTogbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX0RSQUZUX09CSkVDVF9QQUdFX1dBUk5JTkdcIiksXG5cdFx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdFx0Y29udGVudDogbmV3IFRleHQoe1xuXHRcdFx0XHRcdHRleHQ6IHNVbnNhdmVkQ2hhbmdlc01zZ1xuXHRcdFx0XHR9KSxcblx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdHRleHQ6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfRURJVFwiKSxcblx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdHRleHQ6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfQ0FOQ0VMXCIpLFxuXHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRyZWplY3QoXCJEcmFmdCBjcmVhdGlvbiBhYm9ydGVkIGZvciBkb2N1bWVudDogXCIgKyBvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSksXG5cdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRvRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0b0RpYWxvZy5vcGVuKCk7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBhY3RpdmUgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIikpO1xuXHR9XG5cblx0Y29uc3QgYkV4ZWN1dGUgPSBtUGFyYW0uZm5CZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuXHRcdD8gbVBhcmFtLmZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQob0NvbnRleHQsIGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93KVxuXHRcdDogdHJ1ZTtcblxuXHRpZiAoIWJFeGVjdXRlKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiRHJhZnQgY3JlYXRpb24gd2FzIGFib3J0ZWQgYnkgZXh0ZW5zaW9uIGZvciBkb2N1bWVudDogXCIgKyBvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHR9XG5cdGxldCBvcGVuaW5nU2libGluZ0NvbnRleHQgPSBmYWxzZTtcblx0dHJ5IHtcblx0XHRsZXQgb0RyYWZ0Q29udGV4dDogQ29udGV4dCB8IG51bGwgPSBudWxsO1xuXHRcdHRyeSB7XG5cdFx0XHRvRHJhZnRDb250ZXh0ID0gYXdhaXQgZHJhZnQuZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihvQ29udGV4dCwgYlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3cpO1xuXHRcdH0gY2F0Y2ggKG9SZXNwb25zZTogYW55KSB7XG5cdFx0XHQvL09ubHkgY2FsbCBiYWNrIGlmIGVycm9yIDQwOVxuXHRcdFx0aWYgKGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93ICYmIG9SZXNwb25zZS5zdGF0dXMgPT09IDQwOSkge1xuXHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0aWYgKEFjdGl2aXR5U3luYy5pc0NvbGxhYm9yYXRpb25FbmFibGVkKG1QYXJhbWV0ZXJzLm9WaWV3KSkge1xuXHRcdFx0XHRcdGNvbnN0IHNpYmxpbmdJbmZvID0gYXdhaXQgZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb0NvbnRleHQpO1xuXHRcdFx0XHRcdGNvbnN0IHNpYmxpbmdDb250ZXh0ID0gKG1QYXJhbWV0ZXJzLm9WaWV3LmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLl9yb3V0aW5nLl9jcmVhdGVCaW5kaW5nQ29udGV4dChcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvPy50YXJnZXRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdG9Db250ZXh0LmdldE1vZGVsKClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdG9wZW5pbmdTaWJsaW5nQ29udGV4dCA9IHRydWU7XG5cdFx0XHRcdFx0cmV0dXJuIHNpYmxpbmdDb250ZXh0O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9EcmFmdENvbnRleHQgPSBhd2FpdCBvdmVyd3JpdGVPbkRlbWFuZChcblx0XHRcdFx0XHRcdG1QYXJhbS5mbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkID8gbVBhcmFtLmZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQoKSA6IHRydWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoIShvUmVzcG9uc2UgJiYgb1Jlc3BvbnNlLmNhbmNlbGVkKSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihvUmVzcG9uc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChvcGVuaW5nU2libGluZ0NvbnRleHQpIHtcblx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0O1xuXHRcdH1cblxuXHRcdG9EcmFmdENvbnRleHQgPVxuXHRcdFx0b0RyYWZ0Q29udGV4dCAmJiBtUGFyYW0uZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XG5cdFx0XHRcdD8gbVBhcmFtLmZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudChvQ29udGV4dCwgb0RyYWZ0Q29udGV4dClcblx0XHRcdFx0OiBvRHJhZnRDb250ZXh0O1xuXG5cdFx0aWYgKG9EcmFmdENvbnRleHQpIHtcblx0XHRcdGNvbnN0IHNFZGl0QWN0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0RyYWZ0Q29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkVESVQpO1xuXHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RzID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHNFZGl0QWN0aW9uTmFtZSwgb0RyYWZ0Q29udGV4dCk7XG5cdFx0XHRpZiAob1NpZGVFZmZlY3RzPy50cmlnZ2VyQWN0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRcdGF3YWl0IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24ob1NpZGVFZmZlY3RzLCBvRHJhZnRDb250ZXh0KTtcblxuXHRcdFx0XHRyZXR1cm4gb0RyYWZ0Q29udGV4dDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblx0fSBjYXRjaCAoZXhjOiBhbnkpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXhjKTtcblx0fVxufVxuLyoqXG4gKiBDcmVhdGVzIGFuIGFjdGl2ZSBkb2N1bWVudCBmcm9tIGEgZHJhZnQgZG9jdW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIHNldmVyYWwgaG9va3MgYXMgdGhlcmUgaXMgYSBjZXJ0YWluIGNob3Jlb2dyYXBoeSBkZWZpbmVkLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdCNhY3RpdmF0ZURvY3VtZW50XG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdFxuICogQHN0YXRpY1xuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcGFyYW0ge29iamVjdH0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7c2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50fSBbbVBhcmFtZXRlcnMuZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50XSBDYWxsYmFjayB0aGF0IGFsbG93cyB2ZXRvIGJlZm9yZSBjcmVhdGUgcmVxdWVzdCBpcyBleGVjdXRlZFxuICogQHBhcmFtIHtzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudH0gW21QYXJhbWV0ZXJzLmZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50XSBDYWxsYmFjayBmb3IgcG9zdHByb2Nlc3Npb25nIGFmdGVyIGRvY3VtZW50IHdhcyBhY3RpdmF0ZWQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQgY29udGV4dH0gb2YgdGhlIG5ldyBkcmFmdCBkb2N1bWVudFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBhY3RpdmF0ZURvY3VtZW50KFxuXHRvQ29udGV4dDogYW55LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiB7IGZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudD86IGFueTsgZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQ/OiBhbnkgfVxuKSB7XG5cdGNvbnN0IG1QYXJhbSA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdGlmICghb0NvbnRleHQpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQmluZGluZyBjb250ZXh0IHRvIGRyYWZ0IGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpKTtcblx0fVxuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1QYXJhbS5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQgPyBtUGFyYW0uZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0KSA6IHRydWUpXG5cdFx0LnRoZW4oZnVuY3Rpb24gKGJFeGVjdXRlOiBhbnkpIHtcblx0XHRcdGlmICghYkV4ZWN1dGUpIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkFjdGl2YXRpb24gb2YgdGhlIGRvY3VtZW50IHdhcyBhYm9ydGVkIGJ5IGV4dGVuc2lvbiBmb3IgZG9jdW1lbnQ6IFwiICsgb0NvbnRleHQuZ2V0UGF0aCgpKSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dCkpIHtcblx0XHRcdFx0cmV0dXJuIGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24ob0NvbnRleHQsIG9BcHBDb21wb25lbnQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvKiBhY3RpdmF0aW9uIHJlcXVpcmVzIHByZXBhcmF0aW9uICovXG5cdFx0XHRjb25zdCBzQmF0Y2hHcm91cCA9IFwiZHJhZnRcIjtcblx0XHRcdC8vIHdlIHVzZSB0aGUgc2FtZSBiYXRjaEdyb3VwIHRvIGZvcmNlIHByZXBhcmUgYW5kIGFjdGl2YXRlIGluIGEgc2FtZSBiYXRjaCBidXQgd2l0aCBkaWZmZXJlbnQgY2hhbmdlc2V0XG5cdFx0XHRjb25zdCBvUHJlcGFyZVByb21pc2UgPSBleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihvQ29udGV4dCwgc0JhdGNoR3JvdXApO1xuXHRcdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzQmF0Y2hHcm91cCk7XG5cblx0XHRcdGNvbnN0IG9BY3RpdmF0ZVByb21pc2UgPSBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKG9Db250ZXh0LCBvQXBwQ29tcG9uZW50LCBzQmF0Y2hHcm91cCk7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLmFsbChbb1ByZXBhcmVQcm9taXNlLCBvQWN0aXZhdGVQcm9taXNlXSlcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKHZhbHVlczogW2FueSwgYW55XSkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZXNbMV07XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXhjOiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXhjKTtcblx0XHRcdFx0fSk7XG5cdFx0fSlcblx0XHQudGhlbihmdW5jdGlvbiAob0FjdGl2ZURvY3VtZW50Q29udGV4dDogYW55KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQgPyBtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpIDogb0FjdGl2ZURvY3VtZW50Q29udGV4dFxuXHRcdFx0KTtcblx0XHR9KVxuXHRcdC5jYXRjaChmdW5jdGlvbiAoZXhjOiBhbnkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChleGMpO1xuXHRcdH0pO1xufVxuLyoqXG4gKiBIVFRQIFBPU1QgY2FsbCB3aGVuIERyYWZ0QWN0aW9uIGlzIHByZXNlbnQgZm9yIERyYWZ0IERlbGV0ZTsgSFRUUCBERUxFVEUgZm9yIERyYWZ0KHdoZW4gbm8gRHJhZnRBY3Rpb24pXG4gKiBhbmQgQWN0aXZlIEluc3RhbmNlIHVzZXMgREVMRVRFIGFsd2F5cy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQjZGVsZXRlRHJhZnRcbiAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0XG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBkaXNjYXJkZWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYkVuYWJsZVN0cmljdEhhbmRsaW5nXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge1Byb21pc2V9XG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZGVsZXRlRHJhZnQob0NvbnRleHQ6IGFueSwgYkVuYWJsZVN0cmljdEhhbmRsaW5nPzogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRjb25zdCBzRGlzY2FyZEFjdGlvbiA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5ESVNDQVJEKSxcblx0XHRiSXNBY3RpdmVFbnRpdHkgPSBvQ29udGV4dC5nZXRPYmplY3QoKS5Jc0FjdGl2ZUVudGl0eTtcblxuXHRpZiAoYklzQWN0aXZlRW50aXR5IHx8ICghYklzQWN0aXZlRW50aXR5ICYmICFzRGlzY2FyZEFjdGlvbikpIHtcblx0XHQvL1VzZSBEZWxldGUgaW4gY2FzZSBvZiBhY3RpdmUgZW50aXR5IGFuZCBubyBkaXNjYXJkIGFjdGlvbiBhdmFpbGFibGUgZm9yIGRyYWZ0XG5cdFx0aWYgKG9Db250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdHJldHVybiBvQ29udGV4dFxuXHRcdFx0XHQuZ2V0QmluZGluZygpXG5cdFx0XHRcdC5yZXNldENoYW5nZXMoKVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LmRlbGV0ZSgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIG9Db250ZXh0LmRlbGV0ZSgpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvL1VzZSBEaXNjYXJkIFBvc3QgQWN0aW9uIGlmIGl0IGlzIGEgZHJhZnQgZW50aXR5IGFuZCBkaXNjYXJkIGFjdGlvbiBleGlzdHNcblx0XHRyZXR1cm4gZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbihvQ29udGV4dCwgYkVuYWJsZVN0cmljdEhhbmRsaW5nKTtcblx0fVxufVxuXG4vKipcbiAqIEBwYXJhbSBmblByb2Nlc3NGdW5jdGlvblxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udGV4dFxuICogQHBhcmFtIG9Db250cm9sbGVyXG4gKiBAcGFyYW0gYlNraXBCaW5kaW5nVG9WaWV3XG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGVcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdGZuUHJvY2Vzc0Z1bmN0aW9uOiBhbnksXG5cdGZuQ2FuY2VsRnVuY3Rpb246IGFueSxcblx0b0NvbnRleHQ6IGFueSxcblx0b0NvbnRyb2xsZXI6IGFueSxcblx0YlNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbixcblx0bmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlID0gTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb25cbikge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRjb25zdCBkcmFmdERhdGFDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSArIFwiL0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCIpLmdldEJvdW5kQ29udGV4dCgpO1xuXG5cdGNvbnN0IGNvbGxhYm9yYXRpb25Db25uZWN0ZWQgPSBBY3Rpdml0eVN5bmMuaXNDb25uZWN0ZWQob0NvbnRyb2xsZXIuZ2V0VmlldygpKTtcblx0Y29uc3QgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzID0gIWNvbGxhYm9yYXRpb25Db25uZWN0ZWRcblx0XHQ/IGZuUHJvY2Vzc0Z1bmN0aW9uXG5cdFx0OiBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcblx0XHRcdFx0QWN0aXZpdHlTeW5jLmRpc2Nvbm5lY3Qob0NvbnRyb2xsZXIuZ2V0VmlldygpKTtcblx0XHRcdFx0Zm5Qcm9jZXNzRnVuY3Rpb24uYXBwbHkobnVsbCwgLi4uYXJncyk7XG5cdFx0ICB9O1xuXG5cdGlmIChcblx0XHRvQ29udGV4dCAmJlxuXHRcdG9Db250ZXh0LmdldE9iamVjdCgpICYmXG5cdFx0KCFvQ29udGV4dC5nZXRPYmplY3QoKS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YSB8fCBvQ29udGV4dC5nZXRPYmplY3QoKS5Jc0FjdGl2ZUVudGl0eSA9PT0gdHJ1ZSlcblx0KSB7XG5cdFx0Zm5Qcm9jZXNzRnVuY3Rpb24oKTtcblx0fSBlbHNlIHtcblx0XHRkcmFmdERhdGFDb250ZXh0XG5cdFx0XHQucmVxdWVzdE9iamVjdCgpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoZHJhZnRBZG1pbkRhdGE6IGFueSkge1xuXHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRcdFx0XHRpZiAob0NvbnRyb2xsZXIuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdC8vIFRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIEZDTCBtb2RlIHNvIGluIHRoaXMgY2FzZSB3ZSBmYWxsIGJhY2sgdG9cblx0XHRcdFx0XHRcdC8vIHRoZSBvbGQgbG9naWMgc2luY2UgdGhlIGRpcnR5IHN0YXRlIGhhbmRsaW5nIGlzIG5vdCBwcm9wZXJseSB3b3JraW5nXG5cdFx0XHRcdFx0XHQvLyBmb3IgRkNMLlxuXHRcdFx0XHRcdFx0aWYgKCEoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lKSkge1xuXHRcdFx0XHRcdFx0XHREYXRhTG9zc09yRHJhZnREaXNjYXJkSGFuZGxlci5wZXJmb3JtQWZ0ZXJEaXNjYXJkb3JLZWVwRHJhZnQoXG5cdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKCFvQ29udGV4dC5nZXRPYmplY3QoKS5IYXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gVGhlcmUgaXMgbm8gYWN0aXZlIGVudGl0eSBzbyB3ZSBhcmUgZWRpdGluZyBlaXRoZXIgbmV3bHkgY3JlYXRlZCBkYXRhIG9yXG5cdFx0XHRcdFx0XHRcdC8vIGEgZHJhZnQgd2hpY2ggaGFzIG5ldmVyIGJlZW4gc2F2ZWQgdG8gYWN0aXZlIHZlcnNpb25cblx0XHRcdFx0XHRcdFx0Ly8gU2luY2Ugd2Ugd2FudCB0byByZWFjdCBkaWZmZXJlbnRseSBpbiB0aGUgdHdvIHNpdHVhdGlvbnMsIHdlIGhhdmUgdG8gY2hlY2sgdGhlXG5cdFx0XHRcdFx0XHRcdC8vIGRpcnR5IHN0YXRlXG5cdFx0XHRcdFx0XHRcdGlmIChFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gSW4gdGhpcyBjYXNlIGRhdGEgaXMgYmVpbmcgbmV3bHkgY3JlYXRlZCBhbmQgdGhlbiB3ZSBhbHdheXMgd2FudCB0b1xuXHRcdFx0XHRcdFx0XHRcdC8vIHNob3cgdGhlIGRhdGFsb3NzIGRpYWxvZyBvbiBuYXZpZ2F0aW9uXG5cdFx0XHRcdFx0XHRcdFx0RGF0YUxvc3NPckRyYWZ0RGlzY2FyZEhhbmRsZXIucGVyZm9ybUFmdGVyRGlzY2FyZG9yS2VlcERyYWZ0KFxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdFx0XHRcdFx0Zm5DYW5jZWxGdW5jdGlvbixcblx0XHRcdFx0XHRcdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRcdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBXZSBhcmUgZWRpdGluZyBhIGRyYWZ0IHdoaWNoIGhhcyBiZWVuIGNyZWF0ZWQgZWFybGllciBidXQgbmV2ZXIgc2F2ZWQgdG8gYWN0aXZlXG5cdFx0XHRcdFx0XHRcdFx0Ly8gdmVyc2lvbiBhbmQgc2luY2UgdGhlIGVkaXQgc3RhdGUgaXMgbm90IGRpcnR5LCB0aGVyZSBoYXZlIGJlZW4gbm8gdXNlciBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gc28gaW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gc2lsZW50bHkgbmF2aWdhdGUgYW5kIGRvIG5vdGhpbmdcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gV2UgYXJlIGVkaXRpbmcgYSBkcmFmdCBmb3IgYW4gZXhpc3RpbmcgYWN0aXZlIGVudGl0eVxuXHRcdFx0XHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVGhlIENyZWF0aW9uRGF0ZVRpbWUgYW5kIExhc3RDaGFuZ2VEYXRlVGltZSBhcmUgZXF1YWwsIHNvIHRoaXMgZHJhZnQgd2FzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gbmV2ZXIgc2F2ZWQgYmVmb3JlLCBoZW5jZSB3ZSdyZSBjdXJyZW50bHkgZWRpdGluZyBhIG5ld2x5IGNyZWF0ZWQgZHJhZnQgZm9yXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYW4gZXhpc3RpbmcgYWN0aXZlIGVudGl0eSBmb3IgdGhlIGZpcnN0IHRpbWUuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQWxzbyB0aGVyZSBoYXZlIHNvIGZhciBiZWVuIG5vIGNoYW5nZXMgbWFkZSB0byB0aGUgZHJhZnQgYW5kIGluIHRoaXNcblx0XHRcdFx0XHRcdFx0XHQvLyBjYXNlIHdlIHdhbnQgdG8gc2lsZW50bHkgbmF2aWdhdGUgYW5kIGRlbGV0ZSB0aGUgZHJhZnQgaW4gY2FzZSBvZiBhIGJhY2tcblx0XHRcdFx0XHRcdFx0XHQvLyBuYXZpZ2F0aW9uIGJ1dCBpbiBjYXNlIG9mIGEgZm9yd2FyZCBuYXZpZ2F0aW9uIHdlIHdhbnQgdG8gc2lsZW50bHkga2VlcCBpdCFcblx0XHRcdFx0XHRcdFx0XHRpZiAobmF2aWdhdGlvblR5cGUgPT09IE5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBtUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0c2tpcERpc2NhcmRQb3BvdmVyOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuZWRpdEZsb3dcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhbmNlbERvY3VtZW50KG9Db250ZXh0LCBtUGFyYW1ldGVycylcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goKGVycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjYW5jZWxpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEluIGNhc2Ugb2YgYSBmb3J3YXJkIG5hdmlnYXRpb24gd2Ugc2lsZW50bHkga2VlcCB0aGUgZHJhZnQgYW5kIG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGV4ZWN1dGUgdGhlIGZvbGxvd3VwIGZ1bmN0aW9uLlxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFRoZSBDcmVhdGlvbkRhdGVUaW1lIGFuZCBMYXN0Q2hhbmdlRGF0ZVRpbWUgYXJlIE5PVCBlcXVhbCwgc28gd2UgYXJlIGN1cnJlbnRseSBlZGl0aW5nXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYW4gZXhpc3RpbmcgZHJhZnQgYW5kIG5lZWQgdG8gZGlzdGluZ3Vpc2ggZGVwZW5kaW5nIG9uIGlmIGFueSBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gaGF2ZSBiZWVuIG1hZGUgaW4gdGhlIGN1cnJlbnQgZWRpdGluZyBzZXNzaW9uIG9yIG5vdFxuXHRcdFx0XHRcdFx0XHRcdGlmIChFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIGluIHRoZSBjdXJyZW50IGVkaXRpbmcgc2Vzc2lvbiBzbyB3ZSB3YW50XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyB0byBzaG93IHRoZSBkYXRhbG9zcyBkaWFsb2cgYW5kIGxldCB0aGUgdXNlciBkZWNpZGVcblx0XHRcdFx0XHRcdFx0XHRcdERhdGFMb3NzT3JEcmFmdERpc2NhcmRIYW5kbGVyLnBlcmZvcm1BZnRlckRpc2NhcmRvcktlZXBEcmFmdChcblx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvQ29udHJvbGxlcixcblx0XHRcdFx0XHRcdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBUaGUgdXNlciBzdGFydGVkIGVkaXRpbmcgdGhlIGV4aXN0aW5nIGRyYWZ0IGJ1dCBkaWQgbm90IG1ha2UgYW55IGNoYW5nZXNcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGluIHRoZSBjdXJyZW50IGVkaXRpbmcgc2Vzc2lvbiwgc28gaW4gdGhpcyBjYXNlIHdlIGRvIG5vdCB3YW50XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyB0byBzaG93IHRoZSBkYXRhbG9zcyBkaWFsb2cgYnV0IGp1c3Qga2VlcCB0aGUgZHJhZnRcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRmblByb2Nlc3NGdW5jdGlvbigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgcmV0cmlldmUgZHJhZnREYXRhQ29udGV4dCBpbmZvcm1hdGlvblwiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cbn1cblxuY29uc3QgZHJhZnQgPSB7XG5cdGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50OiBjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCxcblx0YWN0aXZhdGVEb2N1bWVudDogYWN0aXZhdGVEb2N1bWVudCxcblx0ZGVsZXRlRHJhZnQ6IGRlbGV0ZURyYWZ0LFxuXHRleGVjdXRlRHJhZnRFZGl0QWN0aW9uOiBleGVjdXRlRHJhZnRFZGl0QWN0aW9uLFxuXHRjb21wdXRlU2libGluZ0luZm9ybWF0aW9uOiBjb21wdXRlU2libGluZ0luZm9ybWF0aW9uLFxuXHRwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbjogcHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24sXG5cdGNyZWF0ZU9wZXJhdGlvbjogY3JlYXRlT3BlcmF0aW9uLFxuXHRleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uOiBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uLFxuXHROYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGVcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRyYWZ0O1xuIl19
818
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiYWN0aXZhdGVEb2N1bWVudCIsIm9Db250ZXh0Iiwib0FwcENvbXBvbmVudCIsIm1QYXJhbWV0ZXJzIiwibWVzc2FnZUhhbmRsZXIiLCJiRXhlY3V0ZSIsIm1QYXJhbSIsImZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50Iiwib0FjdGl2ZURvY3VtZW50Q29udGV4dCIsIkVycm9yIiwiZ2V0UGF0aCIsImhhc1ByZXBhcmVBY3Rpb24iLCJleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uIiwic0JhdGNoR3JvdXAiLCJvUHJlcGFyZVByb21pc2UiLCJkcmFmdCIsImV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uIiwiZ2V0TW9kZWwiLCJzdWJtaXRCYXRjaCIsIm9BY3RpdmF0ZVByb21pc2UiLCJQcm9taXNlIiwiYWxsIiwidmFsdWVzIiwiZXJyIiwic01lc3NhZ2VzUGF0aCIsImdldE1lc3NhZ2VQYXRoIiwicmVxdWVzdE9iamVjdCIsImRhdGEiLCJsZW5ndGgiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJmbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQiLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsIm92ZXJ3cml0ZU9uRGVtYW5kIiwiYk92ZXJ3cml0ZSIsIm9Nb2RlbCIsImRyYWZ0RGF0YUNvbnRleHQiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsIm9WaWV3IiwiZ2V0UmVzb3VyY2VCdW5kbGUiLCJvUmVzb3VyY2VCdW5kbGUiLCJkcmFmdEFkbWluRGF0YSIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJzSW5mbyIsIkluUHJvY2Vzc0J5VXNlckRlc2NyaXB0aW9uIiwiSW5Qcm9jZXNzQnlVc2VyIiwic0VudGl0eVNldCIsImdldFZpZXdEYXRhIiwiZW50aXR5U2V0Iiwic0xvY2tlZEJ5VXNlck1zZyIsIkNvbW1vblV0aWxzIiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJNZXNzYWdlQm94IiwiZXJyb3IiLCJDcmVhdGVkQnlVc2VyRGVzY3JpcHRpb24iLCJDcmVhdGVkQnlVc2VyIiwic1Vuc2F2ZWRDaGFuZ2VzTXNnIiwic2hvd01lc3NhZ2VCb3giLCJleGVjdXRlRHJhZnRFZGl0QWN0aW9uIiwicmVzb2x2ZSIsInJlamVjdCIsIm9EaWFsb2ciLCJEaWFsb2ciLCJ0aXRsZSIsImxvY2FsSTE4blJlZiIsImdldFRleHQiLCJzdGF0ZSIsImNvbnRlbnQiLCJUZXh0IiwidGV4dCIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwidHlwZSIsInByZXNzIiwiY2xvc2UiLCJlbmRCdXR0b24iLCJhZnRlckNsb3NlIiwiZGVzdHJveSIsImFkZFN0eWxlQ2xhc3MiLCJvcGVuIiwiQ29yZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsImJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93IiwiYlByZXNlcnZlQ2hhbmdlcyIsImZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQiLCJvcGVuaW5nU2libGluZ0NvbnRleHQiLCJvRHJhZnRDb250ZXh0IiwiZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50Iiwic0VkaXRBY3Rpb25OYW1lIiwiZ2V0QWN0aW9uTmFtZSIsImRyYWZ0T3BlcmF0aW9ucyIsIkVESVQiLCJvU2lkZUVmZmVjdHMiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwidHJpZ2dlckFjdGlvbnMiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JPRGF0YUFjdGlvbiIsIm9SZXNwb25zZSIsInN0YXR1cyIsInJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwiQWN0aXZpdHlTeW5jIiwiaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCIsImNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJzaWJsaW5nSW5mbyIsInNpYmxpbmdDb250ZXh0IiwiZ2V0Q29udHJvbGxlciIsIl9yb3V0aW5nIiwiX2NyZWF0ZUJpbmRpbmdDb250ZXh0IiwidGFyZ2V0Q29udGV4dCIsImZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQiLCJjYW5jZWxlZCIsImV4YyIsInJvb3RDdXJyZW50Q29udGV4dCIsInJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0Iiwic3RhcnRzV2l0aCIsIkxvZyIsIm1vZGVsIiwiYWRkaXRpb25hbFBhdGgiLCJyZXBsYWNlIiwic2VnbWVudHMiLCJzdWJzdHJpbmciLCJzcGxpdCIsInVuc2hpZnQiLCJvbGRQYXRocyIsIm5ld1BhdGhzIiwiY3VycmVudFBhdGgiLCJjYW5vbmljYWxQYXRoUHJvbWlzZXMiLCJtYXAiLCJzZWdtZW50IiwiZW5kc1dpdGgiLCJyZXF1ZXN0Q2Fub25pY2FsUGF0aCIsInVuZGVmaW5lZCIsImNhbm9uaWNhbFBhdGhzIiwic2libGluZ1BhdGgiLCJmb3JFYWNoIiwiY2Fub25pY2FsUGF0aCIsImluZGV4IiwibmF2aWdhdGlvbiIsImtleXMiLCJwYXRoTWFwcGluZyIsIm9sZFBhdGgiLCJuZXdQYXRoIiwiZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbiIsImJFbmFibGVTdHJpY3RIYW5kbGluZyIsImdldFByb3BlcnR5Iiwic0dyb3VwSWQiLCJzQWN0aW9uTmFtZSIsIm9EaXNjYXJkUHJvbWlzZSIsIm9EaXNjYXJkT3BlcmF0aW9uIiwiZXhlY3V0ZSIsImZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZCIsImJpbmQiLCJsYWJlbCIsImNyZWF0ZU9wZXJhdGlvbiIsIkRJU0NBUkQiLCJiSGFzUHJlcGFyZUFjdGlvbiIsImJJZ25vcmVFdGFnIiwib09wZXJhdGlvbiIsIkFDVElWQVRJT04iLCIkJGluaGVyaXRFeHBhbmRTZWxlY3QiLCJnZXRCaW5kaW5nIiwiaXNBIiwiYWN0aW9uTmFtZSIsIlBSRVBBUkUiLCJvU2lkZUVmZmVjdHNTZXJ2aWNlIiwib0JpbmRpbmdQYXJhbWV0ZXJzIiwiYVRhcmdldFBhdGhzIiwicGF0aEV4cHJlc3Npb25zIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwib0Vycm9yIiwicmVxdWVzdE1lc3NhZ2VzIiwib09wdGlvbnMiLCJzZXRQYXJhbWV0ZXIiLCJvRWRpdFByb21pc2UiLCJzT3BlcmF0aW9uIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRPYmplY3QiLCJzT3BlcmF0aW9uTmFtZSIsImdldFJldHVyblR5cGUiLCJzQ29udGV4dFBhdGgiLCJvUmV0dXJuVHlwZSIsImdyb3VwSWQiLCJiTWVzc2FnZXMiLCIkc2VsZWN0IiwiZ2V0R3JvdXBJZCIsImNhdGNoIiwiZ2V0TWVzc2FnZXNQYXRoIiwiJFByb3BlcnR5UGF0aCIsImRlbGV0ZURyYWZ0Iiwic0Rpc2NhcmRBY3Rpb24iLCJiSXNBY3RpdmVFbnRpdHkiLCJJc0FjdGl2ZUVudGl0eSIsImhhc1BlbmRpbmdDaGFuZ2VzIiwicmVzZXRDaGFuZ2VzIiwiZGVsZXRlIiwicHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJkcmFmdERhdGFMb3NzUG9wdXAiLCJzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24iLCJOYXZpZ2F0aW9uVHlwZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiZHJhZnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uQW5ub3RhdGlvblRlcm1zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB0eXBlIFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQWN0aXZpdHlTeW5jIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgdHlwZSB7IFNpZGVFZmZlY3RzU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9yZXNvdXJjZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IENvcmVFeCwgVjRDb250ZXh0IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZUhhbmRsZXIgZnJvbSBcIi4uL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgZHJhZnREYXRhTG9zc1BvcHVwIGZyb20gXCIuL2RyYWZ0RGF0YUxvc3NQb3B1cFwiO1xuXG5leHBvcnQgdHlwZSBTaWJsaW5nSW5mb3JtYXRpb24gPSB7XG5cdHRhcmdldENvbnRleHQ6IFY0Q29udGV4dDtcblx0cGF0aE1hcHBpbmc6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdO1xufTtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGNhbGxiYWNrcyB1c2VkIGluIHRoZSBmdW5jdGlvbnNcbiAqXG4gKlxuICogQGF1dGhvciBTQVAgU0VcbiAqIEBzaW5jZSAxLjU0LjBcbiAqIEBpbnRlcmZhY2VcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogQ2FsbGJhY2sgdG8gYXBwcm92ZSBvciByZWplY3QgdGhlIGNyZWF0aW9uIG9mIGEgZHJhZnRcbiAqXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay5iZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAYWJzdHJhY3RcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHJldHVybnMgeyhib29sZWFufFByb21pc2UpfSBBcHByb3ZhbCBvZiBkcmFmdCBjcmVhdGlvbiBbdHJ1ZXxmYWxzZV0gb3IgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGJvb2xlYW4gdmFsdWVcbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBDYWxsYmFjayBhZnRlciBhIGRyYWZ0IHdhcyBzdWNjZXNzdWxseSBjcmVhdGVkXG4gKlxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suYWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAYWJzdHJhY3RcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0FjdGl2ZURvY3VtZW50Q29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEByZXR1cm5zIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0FjdGl2ZURvY3VtZW50Q29udGV4dFxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqIENhbGxiYWNrIHRvIGFwcHJvdmUgb3IgcmVqZWN0IG92ZXJ3cml0aW5nIGFuIHVuc2F2ZWQgZHJhZnQgb2YgYW5vdGhlciB1c2VyXG4gKlxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2sud2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWRcbiAqIEBmdW5jdGlvblxuICogQHB1YmxpY1xuICogQHN0YXRpY1xuICogQGFic3RyYWN0XG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEByZXR1cm5zIHsoYm9vbGVhbnxQcm9taXNlKX0gQXBwcm92YWwgdG8gb3ZlcndyaXRlIHVuc2F2ZWQgZHJhZnQgW3RydWV8ZmFsc2VdIG9yIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBib29sZWFuIHZhbHVlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuLyogQ29uc3RhbnRzIGZvciBkcmFmdCBvcGVyYXRpb25zICovXG5jb25zdCBkcmFmdE9wZXJhdGlvbnMgPSB7XG5cdEVESVQ6IFwiRWRpdEFjdGlvblwiLFxuXHRBQ1RJVkFUSU9OOiBcIkFjdGl2YXRpb25BY3Rpb25cIixcblx0RElTQ0FSRDogXCJEaXNjYXJkQWN0aW9uXCIsXG5cdFBSRVBBUkU6IFwiUHJlcGFyYXRpb25BY3Rpb25cIlxufTtcblxuLyoqXG4gKiBTdGF0aWMgZnVuY3Rpb25zIGZvciB0aGUgZHJhZnQgcHJvZ3JhbW1pbmcgbW9kZWxcbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdFxuICogQHByaXZhdGVcbiAqIEBleHBlcmltZW50YWwgVGhpcyBtb2R1bGUgaXMgb25seSBmb3IgZXhwZXJpbWVudGFsIHVzZSEgPGJyLz48Yj5UaGlzIGlzIG9ubHkgYSBQT0MgYW5kIG1heWJlIGRlbGV0ZWQ8L2I+XG4gKiBAc2luY2UgMS41NC4wXG4gKi9cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGFjdGlvbiBuYW1lIGZvciBhIGRyYWZ0IG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHNPcGVyYXRpb24gVGhlIG9wZXJhdGlvbiBuYW1lXG4gKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgZHJhZnQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldEFjdGlvbk5hbWUob0NvbnRleHQ6IFY0Q29udGV4dCwgc09wZXJhdGlvbjogc3RyaW5nKSB7XG5cdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRzRW50aXR5U2V0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblxuXHRyZXR1cm4gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0VudGl0eVNldFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvJHtzT3BlcmF0aW9ufWApO1xufVxuLyoqXG4gKiBDcmVhdGVzIGFuIG9wZXJhdGlvbiBjb250ZXh0IGJpbmRpbmcgZm9yIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSBzT3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gKGFjdGlvbiBvciBmdW5jdGlvbiBpbXBvcnQpXG4gKiBAcGFyYW0gb09wdGlvbnMgT3B0aW9ucyB0byBjcmVhdGUgdGhlIG9wZXJhdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgY29udGV4dCBiaW5kaW5nIG9mIHRoZSBib3VuZCBvcGVyYXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0OiBWNENvbnRleHQsIHNPcGVyYXRpb246IHN0cmluZywgb09wdGlvbnM/OiBhbnkpIHtcblx0Y29uc3Qgc09wZXJhdGlvbk5hbWUgPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBzT3BlcmF0aW9uKTtcblxuXHRyZXR1cm4gb0NvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChgJHtzT3BlcmF0aW9uTmFtZX0oLi4uKWAsIG9Db250ZXh0LCBvT3B0aW9ucyk7XG59XG4vKipcbiAqIERldGVybWluZXMgdGhlIHJldHVybiB0eXBlIGZvciBhIGRyYWZ0IG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHNPcGVyYXRpb24gVGhlIG9wZXJhdGlvbiBuYW1lXG4gKiBAcmV0dXJucyBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGRyYWZ0IG9wZXJhdGlvblxuICovXG5mdW5jdGlvbiBnZXRSZXR1cm5UeXBlKG9Db250ZXh0OiBWNENvbnRleHQsIHNPcGVyYXRpb246IHN0cmluZykge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0VudGl0eVNldFBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cblx0cmV0dXJuIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290LyR7c09wZXJhdGlvbn0vJFJldHVyblR5cGVgKTtcbn1cbi8qKlxuICogQ2hlY2sgaWYgb3B0aW9uYWwgZHJhZnQgcHJlcGFyZSBhY3Rpb24gZXhpc3RzLlxuICpcbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcmV0dXJucyBUcnVlIGlmIGEgYSBwcmVwYXJlIGFjdGlvbiBleGlzdHNcbiAqL1xuZnVuY3Rpb24gaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dDogVjRDb250ZXh0KSB7XG5cdHJldHVybiAhIWdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBkcmFmdCBmcm9tIGFuIGFjdGl2ZSBkb2N1bWVudC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSBiUHJlc2VydmVDaGFuZ2VzIElmIHRydWUgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlciB1c2VyIHRoYXQgYXJlIG5vdCBsb2NrZWQgYXJlIHByZXNlcnZlZCBhbmQgYW4gZXJyb3IgbWVzc2FnZSAoaHR0cCBzdGF0dXMgNDA5KSBpcyBzZW5kIGZyb20gdGhlIGJhY2tlbmQsIG90aGVyd2lzZSBmYWxzZSAtIGV4aXN0aW5nIGNoYW5nZXMgZnJvbSBhbm90aGVyIHVzZXIgdGhhdCBhcmUgbm90IGxvY2tlZCBhcmUgb3ZlcndyaXR0ZW48L2xpPlxuICogQHBhcmFtIG9WaWV3IElmIHRydWUgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlclxuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihvQ29udGV4dDogVjRDb250ZXh0LCBiUHJlc2VydmVDaGFuZ2VzOiBib29sZWFuLCBvVmlldzogYW55KTogUHJvbWlzZTxWNENvbnRleHQ+IHtcblx0aWYgKG9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBvT3B0aW9ucyA9IHsgJCRpbmhlcml0RXhwYW5kU2VsZWN0OiB0cnVlIH07XG5cdFx0Y29uc3Qgb09wZXJhdGlvbiA9IGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkVESVQsIG9PcHRpb25zKTtcblx0XHRvT3BlcmF0aW9uLnNldFBhcmFtZXRlcihcIlByZXNlcnZlQ2hhbmdlc1wiLCBiUHJlc2VydmVDaGFuZ2VzKTtcblx0XHRjb25zdCBzR3JvdXBJZCA9IFwiZGlyZWN0XCI7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gYXdhaXQgKChvVmlldy5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpIGFzIFJlc291cmNlTW9kZWwpLmdldFJlc291cmNlQnVuZGxlKCkgYXMgUHJvbWlzZTxSZXNvdXJjZUJ1bmRsZT4pO1xuXHRcdGNvbnN0IHNBY3Rpb25OYW1lID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9FRElUXCIsIG9SZXNvdXJjZUJ1bmRsZSk7XG5cdFx0Ly9JZiB0aGUgY29udGV4dCBpcyBjb21pbmcgZnJvbSBhIGxpc3QgYmluZGluZyB3ZSBwYXNzIHRoZSBmbGFnIHRydWUgdG8gcmVwbGFjZSB0aGUgY29udGV4dCBieSB0aGUgYWN0aXZlIG9uZVxuXHRcdGNvbnN0IG9FZGl0UHJvbWlzZSA9IG9PcGVyYXRpb24uZXhlY3V0ZShcblx0XHRcdHNHcm91cElkLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0Q29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQoZHJhZnQsIHNHcm91cElkLCB7IGxhYmVsOiBzQWN0aW9uTmFtZSwgbW9kZWw6IG9Db250ZXh0LmdldE1vZGVsKCkgfSwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdG9Db250ZXh0LmdldEJpbmRpbmcoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKVxuXHRcdCk7XG5cdFx0b09wZXJhdGlvbi5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKHNHcm91cElkKTtcblx0XHRyZXR1cm4gYXdhaXQgb0VkaXRQcm9taXNlO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIllvdSBjYW5ub3QgZWRpdCB0aGlzIGRyYWZ0IGRvY3VtZW50XCIpO1xuXHR9XG59XG5cbi8qKlxuICogQWN0aXZhdGVzIGEgZHJhZnQgZG9jdW1lbnQuIFRoZSBkcmFmdCB3aWxsIHJlcGxhY2UgdGhlIHNpYmxpbmcgZW50aXR5IGFuZCB3aWxsIGJlIGRlbGV0ZWQgYnkgdGhlIGJhY2sgZW5kLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIFtzR3JvdXBJZF0gVGhlIG9wdGlvbmFsIGJhdGNoIGdyb3VwIGluIHdoaWNoIHRoZSBvcGVyYXRpb24gaXMgdG8gYmUgZXhlY3V0ZWRcbiAqIEByZXR1cm5zIFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24ob0NvbnRleHQ6IFY0Q29udGV4dCwgb0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBzR3JvdXBJZD86IHN0cmluZyk6IFByb21pc2U8VjRDb250ZXh0PiB7XG5cdGNvbnN0IGJIYXNQcmVwYXJlQWN0aW9uID0gaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dCk7XG5cblx0Ly8gQWNjb3JkaW5nIHRvIHRoZSBkcmFmdCBzcGVjIGlmIHRoZSBzZXJ2aWNlIGNvbnRhaW5zIGEgcHJlcGFyZSBhY3Rpb24gYW5kIHdlIHRyaWdnZXIgYm90aCBwcmVwYXJlIGFuZFxuXHQvLyBhY3RpdmF0ZSBpbiBvbmUgJGJhdGNoIHRoZSBhY3RpdmF0ZSBhY3Rpb24gaXMgY2FsbGVkIHdpdGggaUYtTWF0Y2g9KlxuXHRjb25zdCBiSWdub3JlRXRhZyA9IGJIYXNQcmVwYXJlQWN0aW9uO1xuXG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IG9PcGVyYXRpb24gPSBjcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5BQ1RJVkFUSU9OLCB7ICQkaW5oZXJpdEV4cGFuZFNlbGVjdDogdHJ1ZSB9KTtcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBhd2FpdCAoKG9BcHBDb21wb25lbnQuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKSBhcyBSZXNvdXJjZU1vZGVsKS5nZXRSZXNvdXJjZUJ1bmRsZSgpIGFzIGFueSk7XG5cdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfT1BfT0JKRUNUX1BBR0VfU0FWRVwiLCBvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4gYXdhaXQgb09wZXJhdGlvbi5leGVjdXRlKFxuXHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0Yklnbm9yZUV0YWcsXG5cdFx0XHRcdHNHcm91cElkXG5cdFx0XHRcdFx0PyBDb21tb25VdGlscy5mbk9uU3RyaWN0SGFuZGxpbmdGYWlsZWQuYmluZChcblx0XHRcdFx0XHRcdFx0ZHJhZnQsXG5cdFx0XHRcdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRcdFx0XHR7IGxhYmVsOiBzQWN0aW9uTmFtZSwgbW9kZWw6IG9Db250ZXh0LmdldE1vZGVsKCkgfSxcblx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0ICApXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRcdG9Db250ZXh0LmdldEJpbmRpbmcoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKVxuXHRcdFx0KTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRpZiAoYkhhc1ByZXBhcmVBY3Rpb24pIHtcblx0XHRcdFx0Y29uc3QgYWN0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKSxcblx0XHRcdFx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKSxcblx0XHRcdFx0XHRvQmluZGluZ1BhcmFtZXRlcnMgPSBvU2lkZUVmZmVjdHNTZXJ2aWNlLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoYWN0aW9uTmFtZSwgb0NvbnRleHQpLFxuXHRcdFx0XHRcdGFUYXJnZXRQYXRocyA9IG9CaW5kaW5nUGFyYW1ldGVycyAmJiBvQmluZGluZ1BhcmFtZXRlcnMucGF0aEV4cHJlc3Npb25zO1xuXHRcdFx0XHRpZiAoYVRhcmdldFBhdGhzICYmIGFUYXJnZXRQYXRocy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGF3YWl0IG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKGFUYXJnZXRQYXRocywgb0NvbnRleHQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1wiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgcmVxdWVzdE1lc3NhZ2VzKG9Db250ZXh0LCBvU2lkZUVmZmVjdHNTZXJ2aWNlKTtcblx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBtZXNzYWdlc1wiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhyb3cgZTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIGFjdGl2YXRpb24gYWN0aW9uIGNhbm5vdCBiZSBleGVjdXRlZCBvbiBhbiBhY3RpdmUgZG9jdW1lbnRcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIG1lc3NhZ2UgcHJvcGVydHkgcGF0aCBpcyBkZWZpbmVkIGZvciBhIGNvbnRleHQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB0byBiZSBjaGVja2VkXG4gKiBAcmV0dXJucyBQYXRoIHRvIHRoZSBtZXNzYWdlXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGdldE1lc3NhZ2VQYXRoKG9Db250ZXh0OiBWNENvbnRleHQpOiBzdHJpbmcgfCBudWxsIHtcblx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdGNvbnN0IHNDb250ZXh0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0Y29uc3Qgb1JldHVyblR5cGUgPSBnZXRSZXR1cm5UeXBlKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSk7XG5cdC8vIElmIHRoZXJlIGlzIG5vIHJldHVybiBwYXJhbWV0ZXIsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXF1ZXN0IE1lc3NhZ2VzLlxuXHQvLyBSQVAgZHJhZnQgcHJlcGFyZSBoYXMgbm8gcmV0dXJuIHBhcmFtZXRlclxuXHRyZXR1cm4gISFvUmV0dXJuVHlwZSA/IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH0vQCR7Q29tbW9uQW5ub3RhdGlvblRlcm1zLk1lc3NhZ2VzfS8kUGF0aGApIDogbnVsbDtcbn1cblxuLyoqXG4gKiBFeGVjdXRlIGEgcHJlcGFyYXRpb24gYWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIGdyb3VwSWQgVGhlIG9wdGlvbmFsIGJhdGNoIGdyb3VwIGluIHdoaWNoIHdlIHdhbnQgdG8gZXhlY3V0ZSB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gYk1lc3NhZ2VzIElmIHNldCB0byB0cnVlLCB0aGUgUFJFUEFSRSBhY3Rpb24gcmV0cmlldmVzIFNBUF9NZXNzYWdlc1xuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24ob0NvbnRleHQ6IFY0Q29udGV4dCwgZ3JvdXBJZD86IHN0cmluZywgYk1lc3NhZ2VzPzogYm9vbGVhbikge1xuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gYk1lc3NhZ2VzID8gZ2V0TWVzc2FnZVBhdGgob0NvbnRleHQpIDogbnVsbDtcblx0XHRjb25zdCBvT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSwgc01lc3NhZ2VzUGF0aCA/IHsgJHNlbGVjdDogc01lc3NhZ2VzUGF0aCB9IDogbnVsbCk7XG5cblx0XHQvLyBUT0RPOiBzaWRlIGVmZmVjdHMgcXVhbGlmaWVyIHNoYWxsIGJlIGV2ZW4gZGVwcmVjYXRlZCB0byBiZSBjaGVja2VkXG5cdFx0b09wZXJhdGlvbi5zZXRQYXJhbWV0ZXIoXCJTaWRlRWZmZWN0c1F1YWxpZmllclwiLCBcIlwiKTtcblxuXHRcdGNvbnN0IHNHcm91cElkID0gZ3JvdXBJZCB8fCBvT3BlcmF0aW9uLmdldEdyb3VwSWQoKTtcblx0XHRyZXR1cm4gb09wZXJhdGlvblxuXHRcdFx0LmV4ZWN1dGUoc0dyb3VwSWQpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBvT3BlcmF0aW9uO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb25cIiwgb0Vycm9yKTtcblx0XHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBwcmVwYXJhdGlvbiBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSBtZXNzYWdlIHBhdGggZm9yIGEgY29udGV4dC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgcGF0aCBzaGFsbCBiZSBkZXRlcm1pbmVkXG4gKiBAcmV0dXJucyBNZXNzYWdlIHBhdGgsIGVtcHR5IGlmIG5vdCBhbm5vdGF0ZWRcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZ2V0TWVzc2FnZXNQYXRoKG9Db250ZXh0OiBWNENvbnRleHQpOiBzdHJpbmcge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0VudGl0eVNldFBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cdHJldHVybiBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzRW50aXR5U2V0UGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aGApO1xufVxuLyoqXG4gKiBSZXF1ZXN0cyB0aGUgbWVzc2FnZXMgaWYgYW5ub3RhdGVkIGZvciBhIGdpdmVuIGNvbnRleHQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIG1lc3NhZ2VzIHNoYWxsIGJlIHJlcXVlc3RlZFxuICogQHBhcmFtIG9TaWRlRWZmZWN0c1NlcnZpY2UgU2VydmljZSBmb3IgdGhlIFNpZGVFZmZlY3RzIG9uIFNBUCBGaW9yaSBlbGVtZW50c1xuICogQHJldHVybnMgUHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCBvbmNlIG1lc3NhZ2VzIHdlcmUgcmVxdWVzdGVkXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIHJlcXVlc3RNZXNzYWdlcyhvQ29udGV4dDogVjRDb250ZXh0LCBvU2lkZUVmZmVjdHNTZXJ2aWNlOiBTaWRlRWZmZWN0c1NlcnZpY2UpIHtcblx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IGdldE1lc3NhZ2VzUGF0aChvQ29udGV4dCk7XG5cdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0cmV0dXJuIG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICRQcm9wZXJ0eVBhdGg6IHNNZXNzYWdlc1BhdGggfV0gYXMgYW55LCBvQ29udGV4dCk7XG5cdH1cblx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufVxuLyoqXG4gKiBFeGVjdXRlcyBkaXNjYXJkIG9mIGEgZHJhZnQgZnVuY3Rpb24gdXNpbmcgSFRUUCBQb3N0LlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgQXBwIENvbXBvbmVudFxuICogQHBhcmFtIGJFbmFibGVTdHJpY3RIYW5kbGluZ1xuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbihvQ29udGV4dDogVjRDb250ZXh0LCBvQXBwQ29tcG9uZW50PzogYW55LCBiRW5hYmxlU3RyaWN0SGFuZGxpbmc/OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IG9EaXNjYXJkT3BlcmF0aW9uID0gZHJhZnQuY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRElTQ0FSRCk7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID1cblx0XHRcdChvQXBwQ29tcG9uZW50ICYmXG5cdFx0XHRcdChhd2FpdCAoKG9BcHBDb21wb25lbnQuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKSBhcyBSZXNvdXJjZU1vZGVsKS5nZXRSZXNvdXJjZUJ1bmRsZSgpIGFzIFByb21pc2U8UmVzb3VyY2VCdW5kbGU+KSkpIHx8XG5cdFx0XHRudWxsO1xuXHRcdGNvbnN0IHNHcm91cElkID0gXCJkaXJlY3RcIjtcblx0XHRjb25zdCBzQWN0aW9uTmFtZSA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRFJBRlRfRElTQ0FSRF9CVVRUT05cIiwgb1Jlc291cmNlQnVuZGxlKTtcblx0XHQvLyBhcyB0aGUgZGlzY2FyZCBhY3Rpb24gZG9lc250JyBzZW5kIHRoZSBhY3RpdmUgdmVyc2lvbiBpbiB0aGUgcmVzcG9uc2Ugd2UgZG8gbm90IHVzZSB0aGUgcmVwbGFjZSBpbiBjYWNoZVxuXHRcdGNvbnN0IG9EaXNjYXJkUHJvbWlzZSA9ICFiRW5hYmxlU3RyaWN0SGFuZGxpbmdcblx0XHRcdD8gb0Rpc2NhcmRPcGVyYXRpb24uZXhlY3V0ZShzR3JvdXBJZClcblx0XHRcdDogb0Rpc2NhcmRPcGVyYXRpb24uZXhlY3V0ZShcblx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0Q29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQoXG5cdFx0XHRcdFx0XHRkcmFmdCxcblx0XHRcdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRcdFx0eyBsYWJlbDogc0FjdGlvbk5hbWUsIG1vZGVsOiBvQ29udGV4dC5nZXRNb2RlbCgpIH0sXG5cdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGZhbHNlXG5cdFx0XHQgICk7XG5cdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzR3JvdXBJZCk7XG5cdFx0cmV0dXJuIG9EaXNjYXJkUHJvbWlzZTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZGlzY2FyZCBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzaWJsaW5nIGNvbnRleHQgZm9yIGEgc3Vib2JqZWN0IHBhZ2UgYW5kIGNhbGN1bGF0ZXMgYSBzaWJsaW5nIHBhdGggZm9yIGFsbCBpbnRlcm1lZGlhdGUgcGF0aHNcbiAqIGJldHdlZW4gdGhlIG9iamVjdCBwYWdlIGFuZCB0aGUgc3Vib2JqZWN0IHBhZ2UuXG4gKlxuICogQHBhcmFtIHJvb3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHJvb3Qgb2YgdGhlIGRyYWZ0XG4gKiBAcGFyYW0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIHN1Ym9iamVjdCBwYWdlXG4gKiBAcmV0dXJucyBUaGUgc2libGluZ0luZm9ybWF0aW9uIG9iamVjdFxuICovXG5hc3luYyBmdW5jdGlvbiBjb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRyb290Q3VycmVudENvbnRleHQ6IFY0Q29udGV4dCxcblx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQ6IFY0Q29udGV4dFxuKTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0aWYgKCFyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkuc3RhcnRzV2l0aChyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdC8vIFdyb25nIHVzYWdlICEhXG5cdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHR9XG5cblx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0dHJ5IHtcblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyAxLiBGaW5kIGFsbCBzZWdtZW50cyBiZXR3ZWVuIHRoZSByb290IG9iamVjdCBhbmQgdGhlIHN1Yi1vYmplY3Rcblx0XHQvLyBFeGFtcGxlOiBmb3Igcm9vdCA9IC9QYXJhbShhYSkvRW50aXR5KGJiKSBhbmQgcmlnaHRNb3N0ID0gL1BhcmFtKGFhKS9FbnRpdHkoYmIpL19OYXYoY2MpL19TdWJOYXYoZGQpXG5cdFx0Ly8gLS0tPiBbXCJQYXJhbShhYSkvRW50aXR5KGJiKVwiLCBcIl9OYXYoY2MpXCIsIFwiX1N1Yk5hdihkZClcIl1cblxuXHRcdC8vIEZpbmQgYWxsIHNlZ21lbnRzIGluIHRoZSByaWdodG1vc3QgcGF0aFxuXHRcdGNvbnN0IGFkZGl0aW9uYWxQYXRoID0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnJlcGxhY2Uocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSwgXCJcIik7XG5cdFx0Y29uc3Qgc2VnbWVudHMgPSBhZGRpdGlvbmFsUGF0aCA/IGFkZGl0aW9uYWxQYXRoLnN1YnN0cmluZygxKS5zcGxpdChcIi9cIikgOiBbXTtcblx0XHQvLyBGaXJzdCBzZWdtZW50IGlzIGFsd2F5cyB0aGUgZnVsbCBwYXRoIG9mIHRoZSByb290IG9iamVjdCwgd2hpY2ggY2FuIGNvbnRhaW4gJy8nIGluIGNhc2Ugb2YgYSBwYXJhbWV0cml6ZWQgZW50aXR5XG5cdFx0c2VnbWVudHMudW5zaGlmdChyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnN1YnN0cmluZygxKSk7XG5cblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyAyLiBSZXF1ZXN0IGNhbm9uaWNhbCBwYXRocyBvZiB0aGUgc2libGluZyBlbnRpdHkgZm9yIGVhY2ggc2VnbWVudFxuXHRcdC8vIEV4YW1wbGU6IGZvciBbXCJQYXJhbShhYSkvRW50aXR5KGJiKVwiLCBcIl9OYXYoY2MpXCIsIFwiX1N1Yk5hdihkZClcIl1cblx0XHQvLyAtLT4gcmVxdWVzdCBjYW5vbmljYWwgcGF0aHMgZm9yIFwiUGFyYW0oYWEpL0VudGl0eShiYikvU2libGluZ0VudGl0eVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmIpL19OYXYoY2MpL1NpYmxpbmdFbnRpdHlcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiKS9fTmF2KGNjKS9fU3ViTmF2KGRkKS9TaWJsaW5nRW50aXR5XCJcblx0XHRjb25zdCBvbGRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBuZXdQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRsZXQgY3VycmVudFBhdGggPSBcIlwiO1xuXHRcdGNvbnN0IGNhbm9uaWNhbFBhdGhQcm9taXNlcyA9IHNlZ21lbnRzLm1hcCgoc2VnbWVudCkgPT4ge1xuXHRcdFx0Y3VycmVudFBhdGggKz0gYC8ke3NlZ21lbnR9YDtcblx0XHRcdG9sZFBhdGhzLnVuc2hpZnQoY3VycmVudFBhdGgpO1xuXHRcdFx0aWYgKGN1cnJlbnRQYXRoLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0XHRjb25zdCBzaWJsaW5nQ29udGV4dCA9IG1vZGVsLmJpbmRDb250ZXh0KGAke2N1cnJlbnRQYXRofS9TaWJsaW5nRW50aXR5YCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdHJldHVybiBzaWJsaW5nQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpOyAvLyAxLTEgcmVsYXRpb25cblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDMuIFJlY29uc3RydWN0IHRoZSBmdWxsIHBhdGhzIGZyb20gY2Fub25pY2FsIHBhdGhzIChmb3IgcGF0aCBtYXBwaW5nKVxuXHRcdC8vIEV4YW1wbGU6IGZvciBjYW5vbmljYWwgcGF0aHMgXCIvUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKVwiLCBcIi9FbnRpdHkyKGNjLXNpYmxpbmcpXCIsIFwiL0VudGl0eTMoZGQtc2libGluZylcIlxuXHRcdC8vIC0tPiBbXCJQYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpXCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKS9fTmF2KGNjLXNpYmxpbmcpXCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKS9fTmF2KGNjLXNpYmxpbmcpL19TdWJOYXYoZGQtc2libGluZylcIl1cblx0XHRjb25zdCBjYW5vbmljYWxQYXRocyA9IChhd2FpdCBQcm9taXNlLmFsbChjYW5vbmljYWxQYXRoUHJvbWlzZXMpKSBhcyBzdHJpbmdbXTtcblx0XHRsZXQgc2libGluZ1BhdGggPSBcIlwiO1xuXHRcdGNhbm9uaWNhbFBhdGhzLmZvckVhY2goKGNhbm9uaWNhbFBhdGgsIGluZGV4KSA9PiB7XG5cdFx0XHRpZiAoaW5kZXggIT09IDApIHtcblx0XHRcdFx0aWYgKHNlZ21lbnRzW2luZGV4XS5lbmRzV2l0aChcIilcIikpIHtcblx0XHRcdFx0XHRjb25zdCBuYXZpZ2F0aW9uID0gc2VnbWVudHNbaW5kZXhdLnJlcGxhY2UoL1xcKC4qJC8sIFwiXCIpOyAvLyBLZWVwIG9ubHkgbmF2aWdhdGlvbiBuYW1lIGZyb20gdGhlIHNlZ21lbnQsIGkuZS4gYWFhKHh4eCkgLS0+IGFhYVxuXHRcdFx0XHRcdGNvbnN0IGtleXMgPSBjYW5vbmljYWxQYXRoLnJlcGxhY2UoLy4qXFwoLywgXCIoXCIpOyAvLyBLZWVwIG9ubHkgdGhlIGtleXMgZnJvbSB0aGUgY2Fub25pY2FsIHBhdGgsIGkuZS4gYWFhKHh4eCkgLS0+ICh4eHgpXG5cdFx0XHRcdFx0c2libGluZ1BhdGggKz0gYC8ke25hdmlnYXRpb259JHtrZXlzfWA7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c2libGluZ1BhdGggKz0gYC8ke3NlZ21lbnRzW2luZGV4XX1gOyAvLyAxLTEgcmVsYXRpb25cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2libGluZ1BhdGggPSBjYW5vbmljYWxQYXRoOyAvLyBUbyBtYW5hZ2UgcGFyYW1ldHJpemVkIGVudGl0aWVzXG5cdFx0XHR9XG5cdFx0XHRuZXdQYXRocy51bnNoaWZ0KHNpYmxpbmdQYXRoKTtcblx0XHR9KTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXRDb250ZXh0OiBtb2RlbC5iaW5kQ29udGV4dChzaWJsaW5nUGF0aCkuZ2V0Qm91bmRDb250ZXh0KCksIC8vIENyZWF0ZSB0aGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dCBmcm9tIGl0cyBwYXRoXG5cdFx0XHRwYXRoTWFwcGluZzogb2xkUGF0aHMubWFwKChvbGRQYXRoLCBpbmRleCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdG9sZFBhdGgsXG5cdFx0XHRcdFx0bmV3UGF0aDogbmV3UGF0aHNbaW5kZXhdXG5cdFx0XHRcdH07XG5cdFx0XHR9KVxuXHRcdH07XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gQSBjYW5vbmljYWwgcGF0aCBjb3VsZG4ndCBiZSByZXNvbHZlZCAoYmVjYXVzZSBhIHNpYmxpbmcgZG9lc24ndCBleGlzdClcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRyYWZ0IGRvY3VtZW50IGZyb20gYW4gZXhpc3RpbmcgZG9jdW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIHNldmVyYWwgaG9va3MgYXMgdGhlcmUgaXMgYSBjZXJ0YWluIGNvcmVvZ3JhcGh5IGRlZmluZWQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0I2NyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdFxuICogQHN0YXRpY1xuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIG1QYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm9WaWV3XSBUaGUgdmlld1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5iUHJlc2VydmVDaGFuZ2VzXSBQcmVzZXJ2ZSBjaGFuZ2VzIG9mIGFuIGV4aXN0aW5nIGRyYWZ0IG9mIGFub3RoZXIgdXNlclxuICogQHBhcmFtIFttUGFyYW1ldGVycy5mbkJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XSBDYWxsYmFjayB0aGF0IGFsbG93cyB2ZXRvIGJlZm9yZSBjcmVhdGUgcmVxdWVzdCBpcyBleGVjdXRlZFxuICogQHBhcmFtIFttUGFyYW1ldGVycy5mbkFmdGVyQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRdIENhbGxiYWNrIGZvciBwb3N0cHJvY2Vzc2lvbmcgYWZ0ZXIgZHJhZnQgZG9jdW1lbnQgd2FzIGNyZWF0ZWRcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuZm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZF0gQ2FsbGJhY2sgZm9yIGRlY2lkaW5nIG9uIG92ZXJ3cml0aW5nIGFuIHVuc2F2ZWQgY2hhbmdlIGJ5IGFub3RoZXIgdXNlclxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQgY29udGV4dH0gb2YgdGhlIG5ldyBkcmFmdCBkb2N1bWVudFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudChcblx0b0NvbnRleHQ6IGFueSxcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRtUGFyYW1ldGVyczoge1xuXHRcdG9WaWV3OiBWaWV3O1xuXHRcdGJQcmVzZXJ2ZUNoYW5nZXM/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdGZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQ/OiBhbnk7XG5cdFx0Zm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50PzogYW55O1xuXHRcdGZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQ/OiBhbnk7XG5cdH1cbikge1xuXHRjb25zdCBtUGFyYW0gPSBtUGFyYW1ldGVycyB8fCB7fSxcblx0XHRsb2NhbEkxOG5SZWYgPSAoQ29yZSBhcyBDb3JlRXgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpLFxuXHRcdGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93ID1cblx0XHRcdHR5cGVvZiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyA9PT0gXCJ1bmRlZmluZWRcIiB8fCAodHlwZW9mIG1QYXJhbS5iUHJlc2VydmVDaGFuZ2VzID09PSBcImJvb2xlYW5cIiAmJiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyk7IC8vZGVmYXVsdCB0cnVlXG5cblx0LyoqXG5cdCAqIE92ZXJ3cml0ZSBvciByZWplY3QgYmFzZWQgb24gZm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZC5cblx0ICpcblx0ICogQHBhcmFtIGJPdmVyd3JpdGUgT3ZlcndyaXRlIHRoZSBjaGFuZ2Ugb3Igbm90XG5cdCAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggcmVzdWx0IG9mIHtAbGluayBzYXAuZmUuY29yZS5hY3Rpb25zI2V4ZWN1dGVEcmFmdEVkaXRBY3Rpb259XG5cdCAqL1xuXHRhc3luYyBmdW5jdGlvbiBvdmVyd3JpdGVPbkRlbWFuZChiT3ZlcndyaXRlOiBib29sZWFuKSB7XG5cdFx0aWYgKGJPdmVyd3JpdGUpIHtcblx0XHRcdC8vT3ZlcndyaXRlIGV4aXN0aW5nIGNoYW5nZXNcblx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0XHRjb25zdCBkcmFmdERhdGFDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KGAke29Db250ZXh0LmdldFBhdGgoKX0vRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFgKS5nZXRCb3VuZENvbnRleHQoKTtcblxuXHRcdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gYXdhaXQgKG1QYXJhbWV0ZXJzLm9WaWV3LmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIikgYXMgUmVzb3VyY2VNb2RlbCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTtcblx0XHRcdGNvbnN0IGRyYWZ0QWRtaW5EYXRhID0gYXdhaXQgZHJhZnREYXRhQ29udGV4dC5yZXF1ZXN0T2JqZWN0KCk7XG5cdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRcdFx0Ly8gcmVtb3ZlIGFsbCB1bmJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgYXMgd2Ugc2hvdyBhIHNwZWNpYWwgZGlhbG9nXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdGxldCBzSW5mbyA9IGRyYWZ0QWRtaW5EYXRhLkluUHJvY2Vzc0J5VXNlckRlc2NyaXB0aW9uIHx8IGRyYWZ0QWRtaW5EYXRhLkluUHJvY2Vzc0J5VXNlcjtcblx0XHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IChtUGFyYW1ldGVycy5vVmlldy5nZXRWaWV3RGF0YSgpIGFzIGFueSkuZW50aXR5U2V0O1xuXHRcdFx0XHRpZiAoc0luZm8pIHtcblx0XHRcdFx0XHRjb25zdCBzTG9ja2VkQnlVc2VyTXNnID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcIkNfRFJBRlRfT0JKRUNUX1BBR0VfRFJBRlRfTE9DS0VEX0JZX1VTRVJcIixcblx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdHNJbmZvLFxuXHRcdFx0XHRcdFx0c0VudGl0eVNldFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0TWVzc2FnZUJveC5lcnJvcihzTG9ja2VkQnlVc2VyTXNnKTtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3Ioc0xvY2tlZEJ5VXNlck1zZyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c0luZm8gPSBkcmFmdEFkbWluRGF0YS5DcmVhdGVkQnlVc2VyRGVzY3JpcHRpb24gfHwgZHJhZnRBZG1pbkRhdGEuQ3JlYXRlZEJ5VXNlcjtcblx0XHRcdFx0XHRjb25zdCBzVW5zYXZlZENoYW5nZXNNc2cgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFwiQ19EUkFGVF9PQkpFQ1RfUEFHRV9EUkFGVF9VTlNBVkVEX0NIQU5HRVNcIixcblx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdHNJbmZvLFxuXHRcdFx0XHRcdFx0c0VudGl0eVNldFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YXdhaXQgc2hvd01lc3NhZ2VCb3goc1Vuc2F2ZWRDaGFuZ2VzTXNnKTtcblx0XHRcdFx0XHRyZXR1cm4gZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihvQ29udGV4dCwgZmFsc2UsIG1QYXJhbWV0ZXJzLm9WaWV3KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHR0aHJvdyBuZXcgRXJyb3IoYERyYWZ0IGNyZWF0aW9uIGFib3J0ZWQgZm9yIGRvY3VtZW50OiAke29Db250ZXh0LmdldFBhdGgoKX1gKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHNob3dNZXNzYWdlQm94KHNVbnNhdmVkQ2hhbmdlc01zZzogYW55KSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdHRpdGxlOiBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX1dBUk5JTkdcIiksXG5cdFx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdFx0Y29udGVudDogbmV3IFRleHQoe1xuXHRcdFx0XHRcdHRleHQ6IHNVbnNhdmVkQ2hhbmdlc01zZ1xuXHRcdFx0XHR9KSxcblx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdHRleHQ6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfRURJVFwiKSxcblx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdHRleHQ6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfQ0FOQ0VMXCIpLFxuXHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRyZWplY3QoYERyYWZ0IGNyZWF0aW9uIGFib3J0ZWQgZm9yIGRvY3VtZW50OiAke29Db250ZXh0LmdldFBhdGgoKX1gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0b0RpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdG9EaWFsb2cub3BlbigpO1xuXHRcdH0pO1xuXHR9XG5cblx0aWYgKCFvQ29udGV4dCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gYWN0aXZlIGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpKTtcblx0fVxuXG5cdGNvbnN0IGJFeGVjdXRlID0gbVBhcmFtLmZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcblx0XHQ/IG1QYXJhbS5mbkJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KG9Db250ZXh0LCBiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdylcblx0XHQ6IHRydWU7XG5cblx0aWYgKCFiRXhlY3V0ZSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgRHJhZnQgY3JlYXRpb24gd2FzIGFib3J0ZWQgYnkgZXh0ZW5zaW9uIGZvciBkb2N1bWVudDogJHtvQ29udGV4dC5nZXRQYXRoKCl9YCk7XG5cdH1cblx0bGV0IG9wZW5pbmdTaWJsaW5nQ29udGV4dCA9IGZhbHNlO1xuXHR0cnkge1xuXHRcdGxldCBvRHJhZnRDb250ZXh0OiBWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0dHJ5IHtcblx0XHRcdG9EcmFmdENvbnRleHQgPSBhd2FpdCBkcmFmdC5leGVjdXRlRHJhZnRFZGl0QWN0aW9uKG9Db250ZXh0LCBiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdywgbVBhcmFtZXRlcnMub1ZpZXcpO1xuXHRcdH0gY2F0Y2ggKG9SZXNwb25zZTogYW55KSB7XG5cdFx0XHQvL09ubHkgY2FsbCBiYWNrIGlmIGVycm9yIDQwOVxuXHRcdFx0aWYgKGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93ICYmIG9SZXNwb25zZS5zdGF0dXMgPT09IDQwOSkge1xuXHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0aWYgKEFjdGl2aXR5U3luYy5pc0NvbGxhYm9yYXRpb25FbmFibGVkKG1QYXJhbWV0ZXJzLm9WaWV3KSkge1xuXHRcdFx0XHRcdGNvbnN0IHNpYmxpbmdJbmZvID0gYXdhaXQgZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb0NvbnRleHQpO1xuXHRcdFx0XHRcdGNvbnN0IHNpYmxpbmdDb250ZXh0ID0gKG1QYXJhbWV0ZXJzLm9WaWV3LmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLl9yb3V0aW5nLl9jcmVhdGVCaW5kaW5nQ29udGV4dChcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvPy50YXJnZXRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdG9Db250ZXh0LmdldE1vZGVsKClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdG9wZW5pbmdTaWJsaW5nQ29udGV4dCA9IHRydWU7XG5cdFx0XHRcdFx0cmV0dXJuIHNpYmxpbmdDb250ZXh0O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9EcmFmdENvbnRleHQgPSBhd2FpdCBvdmVyd3JpdGVPbkRlbWFuZChcblx0XHRcdFx0XHRcdG1QYXJhbS5mbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkID8gbVBhcmFtLmZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQoKSA6IHRydWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKCEob1Jlc3BvbnNlICYmIG9SZXNwb25zZS5jYW5jZWxlZCkpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKG9SZXNwb25zZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChvcGVuaW5nU2libGluZ0NvbnRleHQpIHtcblx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0O1xuXHRcdH1cblxuXHRcdG9EcmFmdENvbnRleHQgPVxuXHRcdFx0b0RyYWZ0Q29udGV4dCAmJiBtUGFyYW0uZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XG5cdFx0XHRcdD8gbVBhcmFtLmZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudChvQ29udGV4dCwgb0RyYWZ0Q29udGV4dClcblx0XHRcdFx0OiBvRHJhZnRDb250ZXh0O1xuXG5cdFx0aWYgKG9EcmFmdENvbnRleHQpIHtcblx0XHRcdGNvbnN0IHNFZGl0QWN0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0RyYWZ0Q29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkVESVQpO1xuXHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RzID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHNFZGl0QWN0aW9uTmFtZSwgb0RyYWZ0Q29udGV4dCk7XG5cdFx0XHRpZiAob1NpZGVFZmZlY3RzPy50cmlnZ2VyQWN0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRcdGF3YWl0IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24ob1NpZGVFZmZlY3RzLCBvRHJhZnRDb250ZXh0KTtcblxuXHRcdFx0XHRyZXR1cm4gb0RyYWZ0Q29udGV4dDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblx0fSBjYXRjaCAoZXhjOiBhbnkpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXhjKTtcblx0fVxufVxuLyoqXG4gKiBDcmVhdGVzIGFuIGFjdGl2ZSBkb2N1bWVudCBmcm9tIGEgZHJhZnQgZG9jdW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIHNldmVyYWwgaG9va3MgYXMgdGhlcmUgaXMgYSBjZXJ0YWluIGNob3Jlb2dyYXBoeSBkZWZpbmVkLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdCNhY3RpdmF0ZURvY3VtZW50XG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdFxuICogQHN0YXRpY1xuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIG1QYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudF0gQ2FsbGJhY2sgdGhhdCBhbGxvd3MgYSB2ZXRvIGJlZm9yZSB0aGUgJ0NyZWF0ZScgcmVxdWVzdCBpcyBleGVjdXRlZFxuICogQHBhcmFtIFttUGFyYW1ldGVycy5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudF0gQ2FsbGJhY2sgZm9yIHBvc3Rwcm9jZXNzaW5nIGFmdGVyIGRvY3VtZW50IHdhcyBhY3RpdmF0ZWQuXG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlclxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQgY29udGV4dH0gb2YgdGhlIG5ldyBkcmFmdCBkb2N1bWVudFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5hc3luYyBmdW5jdGlvbiBhY3RpdmF0ZURvY3VtZW50KFxuXHRvQ29udGV4dDogVjRDb250ZXh0LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiB7IGZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudD86IGFueTsgZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQ/OiBhbnkgfSxcblx0bWVzc2FnZUhhbmRsZXI/OiBNZXNzYWdlSGFuZGxlclxuKSB7XG5cdGNvbnN0IG1QYXJhbSA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyBjb250ZXh0IHRvIGRyYWZ0IGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpO1xuXHR9XG5cblx0Y29uc3QgYkV4ZWN1dGUgPSBtUGFyYW0uZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50ID8gYXdhaXQgbVBhcmFtLmZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudChvQ29udGV4dCkgOiB0cnVlO1xuXHRpZiAoIWJFeGVjdXRlKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBBY3RpdmF0aW9uIG9mIHRoZSBkb2N1bWVudCB3YXMgYWJvcnRlZCBieSBleHRlbnNpb24gZm9yIGRvY3VtZW50OiAke29Db250ZXh0LmdldFBhdGgoKX1gKTtcblx0fVxuXG5cdGxldCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0OiBhbnk7XG5cdGlmICghaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dCkpIHtcblx0XHRvQWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbihvQ29udGV4dCwgb0FwcENvbXBvbmVudCk7XG5cdH0gZWxzZSB7XG5cdFx0LyogYWN0aXZhdGlvbiByZXF1aXJlcyBwcmVwYXJhdGlvbiAqL1xuXHRcdGNvbnN0IHNCYXRjaEdyb3VwID0gXCJkcmFmdFwiO1xuXHRcdC8vIHdlIHVzZSB0aGUgc2FtZSBiYXRjaEdyb3VwIHRvIGZvcmNlIHByZXBhcmUgYW5kIGFjdGl2YXRlIGluIGEgc2FtZSBiYXRjaCBidXQgd2l0aCBkaWZmZXJlbnQgY2hhbmdlc2V0XG5cdFx0bGV0IG9QcmVwYXJlUHJvbWlzZSA9IGRyYWZ0LmV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uKG9Db250ZXh0LCBzQmF0Y2hHcm91cCwgZmFsc2UpO1xuXHRcdG9Db250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goc0JhdGNoR3JvdXApO1xuXHRcdGNvbnN0IG9BY3RpdmF0ZVByb21pc2UgPSBkcmFmdC5leGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKG9Db250ZXh0LCBvQXBwQ29tcG9uZW50LCBzQmF0Y2hHcm91cCk7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHZhbHVlcyA9IGF3YWl0IFByb21pc2UuYWxsKFtvUHJlcGFyZVByb21pc2UsIG9BY3RpdmF0ZVByb21pc2VdKTtcblx0XHRcdG9BY3RpdmVEb2N1bWVudENvbnRleHQgPSB2YWx1ZXNbMV07XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHQvLyBCQ1AgMjI3MDA4NDA3NVxuXHRcdFx0Ly8gaWYgdGhlIEFjdGl2YXRpb24gZmFpbHMsIHRoZW4gdGhlIG1lc3NhZ2VzIGFyZSByZXRyaWV2ZWQgZnJvbSBQUkVQQVJBVElPTiBhY3Rpb25cblx0XHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBnZXRNZXNzYWdlUGF0aChvQ29udGV4dCk7XG5cdFx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0XHRvUHJlcGFyZVByb21pc2UgPSBkcmFmdC5leGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihvQ29udGV4dCwgc0JhdGNoR3JvdXAsIHRydWUpO1xuXHRcdFx0XHRvQ29udGV4dC5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKHNCYXRjaEdyb3VwKTtcblx0XHRcdFx0YXdhaXQgb1ByZXBhcmVQcm9taXNlO1xuXHRcdFx0XHRjb25zdCBkYXRhID0gYXdhaXQgb0NvbnRleHQucmVxdWVzdE9iamVjdCgpO1xuXHRcdFx0XHRpZiAoZGF0YVtzTWVzc2FnZXNQYXRoXS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0Ly9pZiBtZXNzYWdlcyBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIFBSRVBBUkFUSU9OIGFjdGlvbiwgdGhlbiBwcmV2aW91cyB0cmFuc2l0aW9uIG1lc3NhZ2VzIGFyZSByZW1vdmVkXG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXI/LnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyhmYWxzZSwgZmFsc2UsIG9Db250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRocm93IGVycjtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG1QYXJhbS5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudCA/IG1QYXJhbS5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudChvQ29udGV4dCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCkgOiBvQWN0aXZlRG9jdW1lbnRDb250ZXh0O1xufVxuXG4vKipcbiAqIEhUVFAgUE9TVCBjYWxsIHdoZW4gRHJhZnRBY3Rpb24gaXMgcHJlc2VudCBmb3IgRHJhZnQgRGVsZXRlOyBIVFRQIERFTEVURSBjYWxsIHdoZW4gdGhlcmUgaXMgbm8gRHJhZnRBY3Rpb25cbiAqIGFuZCBBY3RpdmUgSW5zdGFuY2UgYWx3YXlzIHVzZXMgREVMRVRFLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdCNkZWxldGVEcmFmdFxuICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnRcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBkaXNjYXJkZWRcbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIGRpc2NhcmRlZFxuICogQHBhcmFtIGJFbmFibGVTdHJpY3RIYW5kbGluZ1xuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZlZCB3aGVuIHRoZSBjb250ZXh0IGlzIGRlbGV0ZWRcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBkZWxldGVEcmFmdChvQ29udGV4dDogVjRDb250ZXh0LCBvQXBwQ29tcG9uZW50PzogYW55LCBiRW5hYmxlU3RyaWN0SGFuZGxpbmc/OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdGNvbnN0IHNEaXNjYXJkQWN0aW9uID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkRJU0NBUkQpLFxuXHRcdGJJc0FjdGl2ZUVudGl0eSA9IG9Db250ZXh0LmdldE9iamVjdCgpLklzQWN0aXZlRW50aXR5O1xuXG5cdGlmIChiSXNBY3RpdmVFbnRpdHkgfHwgKCFiSXNBY3RpdmVFbnRpdHkgJiYgIXNEaXNjYXJkQWN0aW9uKSkge1xuXHRcdC8vVXNlIERlbGV0ZSBpbiBjYXNlIG9mIGFjdGl2ZSBlbnRpdHkgYW5kIG5vIGRpc2NhcmQgYWN0aW9uIGF2YWlsYWJsZSBmb3IgZHJhZnRcblx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0cmV0dXJuIG9Db250ZXh0XG5cdFx0XHRcdC5nZXRCaW5kaW5nKClcblx0XHRcdFx0LnJlc2V0Q2hhbmdlcygpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHQuZGVsZXRlKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gb0NvbnRleHQuZGVsZXRlKCk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vVXNlIERpc2NhcmQgUG9zdCBBY3Rpb24gaWYgaXQgaXMgYSBkcmFmdCBlbnRpdHkgYW5kIGRpc2NhcmQgYWN0aW9uIGV4aXN0c1xuXHRcdHJldHVybiBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uKG9Db250ZXh0LCBvQXBwQ29tcG9uZW50LCBiRW5hYmxlU3RyaWN0SGFuZGxpbmcpO1xuXHR9XG59XG5cbmNvbnN0IGRyYWZ0ID0ge1xuXHRjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudDogY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQsXG5cdGFjdGl2YXRlRG9jdW1lbnQ6IGFjdGl2YXRlRG9jdW1lbnQsXG5cdGRlbGV0ZURyYWZ0OiBkZWxldGVEcmFmdCxcblx0ZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbjogZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbixcblx0ZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb246IGV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uLFxuXHRleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uOiBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uLFxuXHRjb21wdXRlU2libGluZ0luZm9ybWF0aW9uOiBjb21wdXRlU2libGluZ0luZm9ybWF0aW9uLFxuXHRwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbjogZHJhZnREYXRhTG9zc1BvcHVwLnByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uLFxuXHRzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb246IGRyYWZ0RGF0YUxvc3NQb3B1cC5zaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24sXG5cdGNyZWF0ZU9wZXJhdGlvbjogY3JlYXRlT3BlcmF0aW9uLFxuXHRleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uOiBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uLFxuXHROYXZpZ2F0aW9uVHlwZTogZHJhZnREYXRhTG9zc1BvcHVwLk5hdmlnYXRpb25UeXBlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBkcmFmdDtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7OztFQWtqQk8sZ0JBQWdCQSxJQUFoQixFQUFzQkMsT0FBdEIsRUFBK0I7SUFDckMsSUFBSTtNQUNILElBQUlDLE1BQU0sR0FBR0YsSUFBSSxFQUFqQjtJQUNBLENBRkQsQ0FFRSxPQUFNRyxDQUFOLEVBQVM7TUFDVixPQUFPRixPQUFPLENBQUNFLENBQUQsQ0FBZDtJQUNBOztJQUNELElBQUlELE1BQU0sSUFBSUEsTUFBTSxDQUFDRSxJQUFyQixFQUEyQjtNQUMxQixPQUFPRixNQUFNLENBQUNFLElBQVAsQ0FBWSxLQUFLLENBQWpCLEVBQW9CSCxPQUFwQixDQUFQO0lBQ0E7O0lBQ0QsT0FBT0MsTUFBUDtFQUNB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