@sapui5/sap.fe.core 1.108.2 → 1.110.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/README.md +5 -1
  2. package/package.json +11 -9
  3. package/src/.eslintrc +7 -0
  4. package/src/sap/fe/core/.library +39 -37
  5. package/src/sap/fe/core/.supportrc +3 -3
  6. package/src/sap/fe/core/ActionRuntime.js +72 -27
  7. package/src/sap/fe/core/ActionRuntime.ts +104 -21
  8. package/src/sap/fe/core/AppComponent.js +102 -120
  9. package/src/sap/fe/core/AppComponent.ts +148 -45
  10. package/src/sap/fe/core/AppStateHandler.js +105 -91
  11. package/src/sap/fe/core/AppStateHandler.ts +85 -23
  12. package/src/sap/fe/core/BaseController.js +5 -20
  13. package/src/sap/fe/core/BaseController.ts +11 -2
  14. package/src/sap/fe/core/CommonUtils.js +770 -1079
  15. package/src/sap/fe/core/CommonUtils.ts +750 -491
  16. package/src/sap/fe/core/ExtensionAPI.js +69 -96
  17. package/src/sap/fe/core/ExtensionAPI.ts +15 -17
  18. package/src/sap/fe/core/PageController.js +21 -46
  19. package/src/sap/fe/core/PageController.ts +11 -2
  20. package/src/sap/fe/core/TemplateComponent.js +6 -51
  21. package/src/sap/fe/core/TemplateComponent.ts +27 -16
  22. package/src/sap/fe/core/TemplateModel.js +18 -24
  23. package/src/sap/fe/core/TemplateModel.ts +25 -6
  24. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +8 -23
  25. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +5 -4
  26. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +146 -180
  27. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +144 -57
  28. package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +1 -1
  29. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js +43 -0
  30. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.ts +11 -0
  31. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +436 -556
  32. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +288 -157
  33. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +215 -202
  34. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +93 -51
  35. package/src/sap/fe/core/controllerextensions/BusyLocker.js +11 -26
  36. package/src/sap/fe/core/controllerextensions/EditFlow.js +407 -596
  37. package/src/sap/fe/core/controllerextensions/EditFlow.ts +163 -56
  38. package/src/sap/fe/core/controllerextensions/Feedback.js +70 -0
  39. package/src/sap/fe/core/controllerextensions/Feedback.ts +64 -0
  40. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +12 -23
  41. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +1 -1
  42. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +127 -182
  43. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +65 -32
  44. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +96 -198
  45. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +4 -5
  46. package/src/sap/fe/core/controllerextensions/InternalRouting.js +134 -291
  47. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +21 -12
  48. package/src/sap/fe/core/controllerextensions/KPIManagement.js +111 -214
  49. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +44 -44
  50. package/src/sap/fe/core/controllerextensions/MassEdit.js +24 -44
  51. package/src/sap/fe/core/controllerextensions/MassEdit.ts +3 -2
  52. package/src/sap/fe/core/controllerextensions/MessageHandler.js +39 -52
  53. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +26 -7
  54. package/src/sap/fe/core/controllerextensions/PageReady.js +81 -119
  55. package/src/sap/fe/core/controllerextensions/PageReady.ts +36 -15
  56. package/src/sap/fe/core/controllerextensions/Paginator.js +16 -51
  57. package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -3
  58. package/src/sap/fe/core/controllerextensions/Placeholder.js +7 -33
  59. package/src/sap/fe/core/controllerextensions/Routing.js +24 -32
  60. package/src/sap/fe/core/controllerextensions/Routing.ts +6 -1
  61. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  62. package/src/sap/fe/core/controllerextensions/Share.js +53 -98
  63. package/src/sap/fe/core/controllerextensions/Share.ts +6 -3
  64. package/src/sap/fe/core/controllerextensions/SideEffects.js +103 -174
  65. package/src/sap/fe/core/controllerextensions/SideEffects.ts +37 -22
  66. package/src/sap/fe/core/controllerextensions/ViewState.js +341 -276
  67. package/src/sap/fe/core/controllerextensions/ViewState.ts +236 -84
  68. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +6 -22
  69. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -2
  70. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +66 -88
  71. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +64 -17
  72. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +28 -34
  73. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +22 -1
  74. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +69 -65
  75. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +31 -12
  76. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +15 -13
  77. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +273 -906
  78. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +142 -420
  79. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +49 -115
  80. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +12 -7
  81. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +70 -89
  82. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +313 -320
  83. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +582 -683
  84. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +507 -386
  85. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +111 -102
  86. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +102 -79
  87. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +689 -154
  88. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +866 -31
  89. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +24 -101
  90. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +5 -5
  91. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +91 -217
  92. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +3 -20
  93. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +1 -0
  94. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +46 -46
  95. package/src/sap/fe/core/controls/Any.js +1 -1
  96. package/src/sap/fe/core/controls/AnyElement.js +1 -1
  97. package/src/sap/fe/core/controls/CommandExecution.js +4 -26
  98. package/src/sap/fe/core/controls/ConditionalWrapper.js +16 -33
  99. package/src/sap/fe/core/controls/ConditionalWrapper.ts +16 -2
  100. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +41 -94
  101. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +1 -1
  102. package/src/sap/fe/core/controls/CustomQuickViewPage.js +5 -34
  103. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +5 -7
  104. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +7 -7
  105. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +56 -58
  106. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +53 -33
  107. package/src/sap/fe/core/controls/FieldWrapper.js +6 -49
  108. package/src/sap/fe/core/controls/FileWrapper.js +51 -136
  109. package/src/sap/fe/core/controls/FileWrapper.ts +25 -29
  110. package/src/sap/fe/core/controls/FilterBar.js +19 -54
  111. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -22
  112. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  113. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -5
  114. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +2 -2
  115. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +24 -46
  116. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +14 -41
  117. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +4 -4
  118. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +26 -67
  119. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -20
  120. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +12 -48
  121. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +17 -46
  122. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +3 -3
  123. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +1 -0
  124. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +6 -78
  125. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +4 -4
  126. package/src/sap/fe/core/converters/ConverterContext.js +44 -98
  127. package/src/sap/fe/core/converters/ConverterContext.ts +1 -1
  128. package/src/sap/fe/core/converters/ManifestSettings.js +1 -20
  129. package/src/sap/fe/core/converters/ManifestSettings.ts +16 -9
  130. package/src/sap/fe/core/converters/ManifestWrapper.js +97 -158
  131. package/src/sap/fe/core/converters/ManifestWrapper.ts +4 -0
  132. package/src/sap/fe/core/converters/MetaModelConverter.js +28 -167
  133. package/src/sap/fe/core/converters/MetaModelConverter.ts +9 -3
  134. package/src/sap/fe/core/converters/TemplateConverter.js +10 -22
  135. package/src/sap/fe/core/converters/TemplateConverter.ts +10 -7
  136. package/src/sap/fe/core/converters/annotations/DataField.js +88 -132
  137. package/src/sap/fe/core/converters/annotations/DataField.ts +90 -38
  138. package/src/sap/fe/core/converters/common/AnnotationConverter.js +57 -379
  139. package/src/sap/fe/core/converters/controls/Common/Action.js +45 -115
  140. package/src/sap/fe/core/converters/controls/Common/Action.ts +17 -5
  141. package/src/sap/fe/core/converters/controls/Common/Chart.js +20 -73
  142. package/src/sap/fe/core/converters/controls/Common/Chart.ts +21 -14
  143. package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -9
  144. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +40 -94
  145. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +44 -31
  146. package/src/sap/fe/core/converters/controls/Common/Form.js +26 -63
  147. package/src/sap/fe/core/converters/controls/Common/Form.ts +24 -10
  148. package/src/sap/fe/core/converters/controls/Common/KPI.js +13 -63
  149. package/src/sap/fe/core/converters/controls/Common/Table.js +368 -707
  150. package/src/sap/fe/core/converters/controls/Common/Table.ts +308 -197
  151. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +54 -109
  152. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +15 -9
  153. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +69 -210
  154. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +23 -16
  155. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +12 -80
  156. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +3 -1
  157. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -19
  158. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +45 -136
  159. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +10 -10
  160. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +82 -173
  161. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +48 -22
  162. package/src/sap/fe/core/converters/helpers/Aggregation.js +24 -66
  163. package/src/sap/fe/core/converters/helpers/Aggregation.ts +3 -7
  164. package/src/sap/fe/core/converters/helpers/BindingHelper.js +9 -19
  165. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +0 -1
  166. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +20 -48
  167. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +5 -1
  168. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +12 -51
  169. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +13 -11
  170. package/src/sap/fe/core/converters/helpers/ID.js +3 -17
  171. package/src/sap/fe/core/converters/helpers/ID.ts +2 -3
  172. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -6
  173. package/src/sap/fe/core/converters/helpers/Key.js +10 -19
  174. package/src/sap/fe/core/converters/helpers/Key.ts +3 -3
  175. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +2 -20
  176. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +2 -37
  177. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +126 -131
  178. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +112 -31
  179. package/src/sap/fe/core/converters/templates/ListReportConverter.js +67 -131
  180. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +58 -27
  181. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +106 -183
  182. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +73 -104
  183. package/src/sap/fe/core/designtime/AppComponent.designtime.js +74 -67
  184. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +77 -69
  185. package/src/sap/fe/core/formatters/CollaborationFormatter.js +20 -29
  186. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +21 -0
  187. package/src/sap/fe/core/formatters/FPMFormatter.js +3 -7
  188. package/src/sap/fe/core/formatters/KPIFormatter.js +5 -13
  189. package/src/sap/fe/core/formatters/StandardFormatter.js +3 -18
  190. package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -2
  191. package/src/sap/fe/core/formatters/TableFormatter.js +87 -53
  192. package/src/sap/fe/core/formatters/TableFormatter.ts +96 -9
  193. package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -4
  194. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -37
  195. package/src/sap/fe/core/fpm/Component.js +2 -17
  196. package/src/sap/fe/core/helpers/AnnotationEnum.js +10 -20
  197. package/src/sap/fe/core/helpers/AnnotationEnum.ts +6 -6
  198. package/src/sap/fe/core/helpers/AppStartupHelper.js +16 -52
  199. package/src/sap/fe/core/helpers/AppStartupHelper.ts +1 -1
  200. package/src/sap/fe/core/helpers/BindingToolkit.js +106 -364
  201. package/src/sap/fe/core/helpers/BindingToolkit.ts +30 -7
  202. package/src/sap/fe/core/helpers/ClassSupport.js +16 -97
  203. package/src/sap/fe/core/helpers/ClassSupport.ts +7 -4
  204. package/src/sap/fe/core/helpers/DeleteHelper.js +621 -0
  205. package/src/sap/fe/core/helpers/DeleteHelper.ts +796 -0
  206. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -12
  207. package/src/sap/fe/core/helpers/EditState.js +2 -5
  208. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -10
  209. package/src/sap/fe/core/helpers/FPMHelper.js +3 -8
  210. package/src/sap/fe/core/helpers/FPMHelper.ts +2 -1
  211. package/src/sap/fe/core/helpers/KeepAliveHelper.js +8 -38
  212. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -5
  213. package/src/sap/fe/core/helpers/LoaderUtils.js +1 -7
  214. package/src/sap/fe/core/helpers/MassEditHelper.js +177 -289
  215. package/src/sap/fe/core/helpers/MassEditHelper.ts +124 -91
  216. package/src/sap/fe/core/helpers/MessageStrip.js +12 -28
  217. package/src/sap/fe/core/helpers/MessageStrip.ts +7 -7
  218. package/src/sap/fe/core/helpers/ModelHelper.js +62 -103
  219. package/src/sap/fe/core/helpers/ModelHelper.ts +58 -20
  220. package/src/sap/fe/core/helpers/PasteHelper.js +28 -51
  221. package/src/sap/fe/core/helpers/PasteHelper.ts +10 -9
  222. package/src/sap/fe/core/helpers/SemanticDateOperators.js +112 -136
  223. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +111 -111
  224. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +5 -11
  225. package/src/sap/fe/core/helpers/SideEffectsHelper.js +26 -32
  226. package/src/sap/fe/core/helpers/StableIdHelper.js +166 -218
  227. package/src/sap/fe/core/helpers/StableIdHelper.ts +175 -191
  228. package/src/sap/fe/core/helpers/Synchronization.js +1 -8
  229. package/src/sap/fe/core/helpers/ToES6Promise.js +1 -4
  230. package/src/sap/fe/core/helpers/TypeGuards.js +22 -0
  231. package/src/sap/fe/core/helpers/TypeGuards.ts +9 -0
  232. package/src/sap/fe/core/jsx-runtime/Fragment.js +1 -3
  233. package/src/sap/fe/core/jsx-runtime/ViewLoader.js +3 -23
  234. package/src/sap/fe/core/jsx-runtime/jsx-control.js +3 -23
  235. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +2 -1
  236. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +4 -16
  237. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +1 -1
  238. package/src/sap/fe/core/jsx-runtime/jsx.js +2 -5
  239. package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
  240. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +4 -27
  241. package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +1 -1
  242. package/src/sap/fe/core/library.js +9 -48
  243. package/src/sap/fe/core/library.support.js +3 -2
  244. package/src/sap/fe/core/library.support.ts +3 -1
  245. package/src/sap/fe/core/library.ts +3 -8
  246. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +74 -39
  247. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +71 -26
  248. package/src/sap/fe/core/messagebundle.properties +113 -67
  249. package/src/sap/fe/core/messagebundle_ar.properties +20 -3
  250. package/src/sap/fe/core/messagebundle_bg.properties +22 -5
  251. package/src/sap/fe/core/messagebundle_ca.properties +21 -4
  252. package/src/sap/fe/core/messagebundle_cs.properties +21 -4
  253. package/src/sap/fe/core/messagebundle_cy.properties +22 -5
  254. package/src/sap/fe/core/messagebundle_da.properties +20 -3
  255. package/src/sap/fe/core/messagebundle_de.properties +38 -21
  256. package/src/sap/fe/core/messagebundle_el.properties +20 -3
  257. package/src/sap/fe/core/messagebundle_en.properties +38 -21
  258. package/src/sap/fe/core/messagebundle_en_GB.properties +20 -3
  259. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -28
  260. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +41 -24
  261. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +42 -29
  262. package/src/sap/fe/core/messagebundle_es.properties +40 -23
  263. package/src/sap/fe/core/messagebundle_es_MX.properties +20 -3
  264. package/src/sap/fe/core/messagebundle_et.properties +20 -3
  265. package/src/sap/fe/core/messagebundle_fi.properties +20 -3
  266. package/src/sap/fe/core/messagebundle_fr.properties +21 -4
  267. package/src/sap/fe/core/messagebundle_fr_CA.properties +22 -5
  268. package/src/sap/fe/core/messagebundle_hi.properties +20 -3
  269. package/src/sap/fe/core/messagebundle_hr.properties +22 -5
  270. package/src/sap/fe/core/messagebundle_hu.properties +20 -3
  271. package/src/sap/fe/core/messagebundle_id.properties +20 -3
  272. package/src/sap/fe/core/messagebundle_it.properties +23 -6
  273. package/src/sap/fe/core/messagebundle_iw.properties +20 -3
  274. package/src/sap/fe/core/messagebundle_ja.properties +22 -5
  275. package/src/sap/fe/core/messagebundle_kk.properties +21 -4
  276. package/src/sap/fe/core/messagebundle_ko.properties +20 -3
  277. package/src/sap/fe/core/messagebundle_lt.properties +20 -3
  278. package/src/sap/fe/core/messagebundle_lv.properties +20 -3
  279. package/src/sap/fe/core/messagebundle_ms.properties +20 -3
  280. package/src/sap/fe/core/messagebundle_nl.properties +20 -3
  281. package/src/sap/fe/core/messagebundle_no.properties +20 -3
  282. package/src/sap/fe/core/messagebundle_pl.properties +21 -4
  283. package/src/sap/fe/core/messagebundle_pt.properties +20 -3
  284. package/src/sap/fe/core/messagebundle_pt_PT.properties +20 -3
  285. package/src/sap/fe/core/messagebundle_ro.properties +20 -3
  286. package/src/sap/fe/core/messagebundle_ru.properties +20 -3
  287. package/src/sap/fe/core/messagebundle_sh.properties +20 -3
  288. package/src/sap/fe/core/messagebundle_sk.properties +20 -3
  289. package/src/sap/fe/core/messagebundle_sl.properties +26 -9
  290. package/src/sap/fe/core/messagebundle_sv.properties +20 -3
  291. package/src/sap/fe/core/messagebundle_th.properties +21 -4
  292. package/src/sap/fe/core/messagebundle_tr.properties +20 -3
  293. package/src/sap/fe/core/messagebundle_uk.properties +23 -6
  294. package/src/sap/fe/core/messagebundle_vi.properties +20 -3
  295. package/src/sap/fe/core/messagebundle_zh_CN.properties +20 -3
  296. package/src/sap/fe/core/messagebundle_zh_TW.properties +20 -3
  297. package/src/sap/fe/core/operationsHelper.js +74 -101
  298. package/src/sap/fe/core/operationsHelper.ts +113 -44
  299. package/src/sap/fe/core/rootView/Fcl.controller.js +151 -228
  300. package/src/sap/fe/core/rootView/Fcl.controller.ts +90 -15
  301. package/src/sap/fe/core/rootView/Fcl.view.xml +1 -8
  302. package/src/sap/fe/core/rootView/NavContainer.controller.js +41 -78
  303. package/src/sap/fe/core/rootView/NavContainer.controller.ts +32 -38
  304. package/src/sap/fe/core/rootView/RootViewBaseController.js +110 -181
  305. package/src/sap/fe/core/rootView/RootViewBaseController.ts +37 -17
  306. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -18
  307. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +13 -52
  308. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -22
  309. package/src/sap/fe/core/services/NavigationServiceFactory.js +45 -87
  310. package/src/sap/fe/core/services/NavigationServiceFactory.ts +17 -10
  311. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +4 -28
  312. package/src/sap/fe/core/services/RoutingServiceFactory.js +92 -250
  313. package/src/sap/fe/core/services/RoutingServiceFactory.ts +8 -12
  314. package/src/sap/fe/core/services/ShellServicesFactory.js +122 -251
  315. package/src/sap/fe/core/services/ShellServicesFactory.ts +19 -4
  316. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +188 -273
  317. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +143 -154
  318. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +37 -135
  319. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +59 -94
  320. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -16
  321. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
  322. package/src/sap/fe/core/support/AnnotationIssue.support.js +6 -9
  323. package/src/sap/fe/core/support/AnnotationIssue.support.ts +4 -4
  324. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +6 -9
  325. package/src/sap/fe/core/support/CollectionFacetMissingID.support.ts +3 -3
  326. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +6 -9
  327. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +3 -3
  328. package/src/sap/fe/core/support/CommonHelper.js +7 -16
  329. package/src/sap/fe/core/support/Diagnostics.js +1 -10
  330. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +6 -9
  331. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +3 -3
  332. package/src/sap/fe/core/templating/CommonFormatters.js +1 -15
  333. package/src/sap/fe/core/templating/CriticalityFormatters.js +4 -20
  334. package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -20
  335. package/src/sap/fe/core/templating/DataModelPathHelper.js +49 -121
  336. package/src/sap/fe/core/templating/DataModelPathHelper.ts +41 -31
  337. package/src/sap/fe/core/templating/DisplayModeFormatter.js +8 -15
  338. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +7 -7
  339. package/src/sap/fe/core/templating/EntitySetHelper.js +6 -31
  340. package/src/sap/fe/core/templating/FieldControlHelper.js +4 -21
  341. package/src/sap/fe/core/templating/FieldControlHelper.ts +1 -1
  342. package/src/sap/fe/core/templating/FilterHelper.js +40 -111
  343. package/src/sap/fe/core/templating/FilterHelper.ts +20 -16
  344. package/src/sap/fe/core/templating/FilterTemplating.js +1 -19
  345. package/src/sap/fe/core/templating/FilterTemplating.ts +1 -1
  346. package/src/sap/fe/core/templating/PropertyFormatters.js +1 -34
  347. package/src/sap/fe/core/templating/PropertyHelper.js +120 -163
  348. package/src/sap/fe/core/templating/PropertyHelper.ts +69 -33
  349. package/src/sap/fe/core/templating/SemanticObjectHelper.js +46 -0
  350. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +34 -0
  351. package/src/sap/fe/core/templating/UIFormatters.js +40 -180
  352. package/src/sap/fe/core/templating/UIFormatters.ts +37 -43
  353. package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -14
  354. package/src/sap/fe/core/type/Email.js +1 -10
  355. package/src/sap/fe/core/type/TypeUtil.js +1 -11
  356. package/ui5.yaml +0 -1
  357. package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +0 -35
  358. package/src/sap/fe/core/helpers/LRMessageStrip.js +0 -234
  359. package/src/sap/fe/core/helpers/LRMessageStrip.ts +0 -216
@@ -5,34 +5,26 @@
5
5
  sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/SemanticKeyHelper", "sap/ui/core/Component", "sap/ui/core/Core", "sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "sap/ui/model/Filter", "sap/ui/model/FilterOperator"], function (Log, CommonUtils, BusyLocker, draft, ClassSupport, EditState, ModelHelper, SemanticKeyHelper, Component, Core, ControllerExtension, OverrideExecution, Filter, FilterOperator) {
6
6
  "use strict";
7
7
 
8
- var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _dec23, _dec24, _dec25, _dec26, _dec27, _dec28, _dec29, _class, _class2;
9
-
8
+ var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _dec23, _dec24, _dec25, _dec26, _dec27, _dec28, _dec29, _dec30, _class, _class2;
10
9
  var publicExtension = ClassSupport.publicExtension;
11
10
  var methodOverride = ClassSupport.methodOverride;
12
11
  var finalExtension = ClassSupport.finalExtension;
13
12
  var extensible = ClassSupport.extensible;
14
13
  var defineUI5Class = ClassSupport.defineUI5Class;
15
-
16
14
  function _catch(body, recover) {
17
15
  try {
18
16
  var result = body();
19
17
  } catch (e) {
20
18
  return recover(e);
21
19
  }
22
-
23
20
  if (result && result.then) {
24
21
  return result.then(void 0, recover);
25
22
  }
26
-
27
23
  return result;
28
24
  }
29
-
30
25
  function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
31
-
32
26
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
33
-
34
27
  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
35
-
36
28
  /**
37
29
  * {@link sap.ui.core.mvc.ControllerExtension Controller extension}
38
30
  *
@@ -41,83 +33,69 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
41
33
  * @private
42
34
  * @since 1.74.0
43
35
  */
44
- var InternalRouting = (_dec = defineUI5Class("sap.fe.core.controllerextensions.InternalRouting"), _dec2 = methodOverride(), _dec3 = methodOverride(), _dec4 = publicExtension(), _dec5 = extensible(OverrideExecution.After), _dec6 = publicExtension(), _dec7 = extensible(OverrideExecution.After), _dec8 = publicExtension(), _dec9 = extensible(OverrideExecution.After), _dec10 = publicExtension(), _dec11 = extensible(OverrideExecution.After), _dec12 = publicExtension(), _dec13 = publicExtension(), _dec14 = publicExtension(), _dec15 = finalExtension(), _dec16 = publicExtension(), _dec17 = finalExtension(), _dec18 = publicExtension(), _dec19 = finalExtension(), _dec20 = publicExtension(), _dec21 = finalExtension(), _dec22 = publicExtension(), _dec23 = finalExtension(), _dec24 = publicExtension(), _dec25 = finalExtension(), _dec26 = publicExtension(), _dec27 = finalExtension(), _dec28 = publicExtension(), _dec29 = extensible(OverrideExecution.Before), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
36
+ var InternalRouting = (_dec = defineUI5Class("sap.fe.core.controllerextensions.InternalRouting"), _dec2 = methodOverride(), _dec3 = methodOverride(), _dec4 = publicExtension(), _dec5 = extensible(OverrideExecution.After), _dec6 = publicExtension(), _dec7 = extensible(OverrideExecution.After), _dec8 = publicExtension(), _dec9 = extensible(OverrideExecution.After), _dec10 = publicExtension(), _dec11 = extensible(OverrideExecution.After), _dec12 = publicExtension(), _dec13 = publicExtension(), _dec14 = publicExtension(), _dec15 = finalExtension(), _dec16 = publicExtension(), _dec17 = finalExtension(), _dec18 = publicExtension(), _dec19 = finalExtension(), _dec20 = publicExtension(), _dec21 = finalExtension(), _dec22 = publicExtension(), _dec23 = finalExtension(), _dec24 = publicExtension(), _dec25 = finalExtension(), _dec26 = publicExtension(), _dec27 = publicExtension(), _dec28 = finalExtension(), _dec29 = publicExtension(), _dec30 = extensible(OverrideExecution.Before), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
45
37
  _inheritsLoose(InternalRouting, _ControllerExtension);
46
-
47
38
  function InternalRouting() {
48
39
  return _ControllerExtension.apply(this, arguments) || this;
49
40
  }
50
-
51
41
  var _proto = InternalRouting.prototype;
52
-
53
42
  _proto.onExit = function onExit() {
54
43
  if (this._oRoutingService) {
55
44
  this._oRoutingService.detachRouteMatched(this._fnRouteMatchedBound);
56
45
  }
57
46
  };
58
-
59
47
  _proto.onInit = function onInit() {
60
48
  var _this = this;
61
-
62
49
  this._oView = this.base.getView();
63
50
  this._oAppComponent = CommonUtils.getAppComponent(this._oView);
64
51
  this._oPageComponent = Component.getOwnerComponentFor(this._oView);
65
52
  this._oRouter = this._oAppComponent.getRouter();
66
53
  this._oRouterProxy = this._oAppComponent.getRouterProxy();
67
-
68
54
  if (!this._oAppComponent || !this._oPageComponent) {
69
55
  throw new Error("Failed to initialize controler extension 'sap.fe.core.controllerextesions.InternalRouting");
70
- } // eslint-disable-next-line @typescript-eslint/ban-ts-comment
71
- // @ts-ignore
72
-
56
+ }
73
57
 
58
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
59
+ // @ts-ignore
74
60
  if (this._oAppComponent === this._oPageComponent) {
75
61
  // The view isn't hosted in a dedicated UIComponent, but directly in the app
76
62
  // --> just keep the view
77
63
  this._oPageComponent = null;
78
64
  }
79
-
80
65
  this._oAppComponent.getService("routingService").then(function (oRoutingService) {
81
66
  _this._oRoutingService = oRoutingService;
82
67
  _this._fnRouteMatchedBound = _this._onRouteMatched.bind(_this);
83
-
84
68
  _this._oRoutingService.attachRouteMatched(_this._fnRouteMatchedBound);
85
-
86
69
  _this._oTargetInformation = oRoutingService.getTargetInformationFor(_this._oPageComponent || _this._oView);
87
70
  }).catch(function () {
88
71
  throw new Error("This controller extension cannot work without a 'routingService' on the main AppComponent");
89
72
  });
90
73
  }
74
+
91
75
  /**
92
76
  * Triggered every time this controller is a navigation target.
93
- */
94
- ;
95
-
77
+ */;
96
78
  _proto.onRouteMatched = function onRouteMatched() {
97
79
  /**/
98
80
  };
99
-
100
81
  _proto.onRouteMatchedFinished = function onRouteMatchedFinished() {
101
82
  /**/
102
83
  };
103
-
104
84
  _proto.onBeforeBinding = function onBeforeBinding(oBindingContext, mParameters) {
105
85
  var oRouting = this.base.getView().getController().routing;
106
-
107
86
  if (oRouting && oRouting.onBeforeBinding) {
108
87
  oRouting.onBeforeBinding(oBindingContext, mParameters);
109
88
  }
110
89
  };
111
-
112
90
  _proto.onAfterBinding = function onAfterBinding(oBindingContext, mParameters) {
113
91
  this._oAppComponent.getRootViewController().onContextBoundToView(oBindingContext);
114
-
115
92
  var oRouting = this.base.getView().getController().routing;
116
-
117
93
  if (oRouting && oRouting.onAfterBinding) {
118
94
  oRouting.onAfterBinding(oBindingContext, mParameters);
119
95
  }
120
- } ///////////////////////////////////////////////////////////
96
+ }
97
+
98
+ ///////////////////////////////////////////////////////////
121
99
  // Methods triggering a navigation after a user action
122
100
  // (e.g. click on a table row, button, etc...)
123
101
  ///////////////////////////////////////////////////////////
@@ -126,28 +104,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
126
104
  * Navigates to the specified navigation target.
127
105
  *
128
106
  * @param oContext Context instance
129
- * @param sNavigationTargetName Navigation target name
130
- * @param oSemanticObject Semantic object
107
+ * @param sNavigationTargetName Name of the navigation target
131
108
  * @param bPreserveHistory True to force the new URL to be added at the end of the browser history (no replace)
132
109
  * @ui5-restricted
133
- */
134
- ;
135
-
136
- _proto.navigateToTarget = function navigateToTarget(oContext, sNavigationTargetName, oSemanticObject, bPreserveHistory) {
110
+ */;
111
+ _proto.navigateToTarget = function navigateToTarget(oContext, sNavigationTargetName, bPreserveHistory) {
137
112
  var oNavigationConfiguration = this._oPageComponent && this._oPageComponent.getNavigationConfiguration && this._oPageComponent.getNavigationConfiguration(sNavigationTargetName);
138
-
139
113
  if (oNavigationConfiguration) {
140
114
  var oDetailRoute = oNavigationConfiguration.detail;
141
115
  var sRouteName = oDetailRoute.route;
142
116
  var mParameterMapping = oDetailRoute.parameters;
143
-
144
117
  this._oRoutingService.navigateTo(oContext, sRouteName, mParameterMapping, bPreserveHistory);
145
118
  } else {
146
119
  this._oRoutingService.navigateTo(oContext, null, null, bPreserveHistory);
147
120
  }
148
-
149
121
  this._oView.getViewData();
150
122
  }
123
+
151
124
  /**
152
125
  * Navigates to the specified navigation target route.
153
126
  *
@@ -155,12 +128,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
155
128
  * @param [oParameters] Parameters to be used with route to create the target hash
156
129
  * @returns Promise that is resolved when the navigation is finalized
157
130
  * @ui5-restricted
158
- */
159
- ;
160
-
131
+ */;
161
132
  _proto.navigateToRoute = function navigateToRoute(sTargetRouteName, oParameters) {
162
133
  return this._oRoutingService.navigateToRoute(sTargetRouteName, oParameters);
163
134
  }
135
+
164
136
  /**
165
137
  * Navigates to a specific context.
166
138
  *
@@ -168,22 +140,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
168
140
  * @param [mParameters] Optional navigation parameters
169
141
  * @returns Promise resolved when the navigation has been triggered
170
142
  * @ui5-restricted
171
- */
172
- ;
173
-
143
+ */;
174
144
  _proto.navigateToContext = function navigateToContext(oContext, mParameters) {
175
145
  var _this2 = this;
176
-
177
146
  var oContextInfo = {};
178
147
  mParameters = mParameters || {};
179
-
180
148
  if (oContext.isA("sap.ui.model.odata.v4.ODataListBinding")) {
181
149
  if (mParameters.asyncContext) {
182
150
  // the context is either created async (Promise)
183
151
  // We need to activate the routeMatchSynchro on the RouterProxy to avoid that
184
152
  // the subsequent call to navigateToContext conflicts with the current one
185
153
  this._oRouterProxy.activateRouteMatchSynchronization();
186
-
187
154
  mParameters.asyncContext.then(function (asyncContext) {
188
155
  // once the context is returned we navigate into it
189
156
  _this2.navigateToContext(asyncContext, {
@@ -201,30 +168,25 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
201
168
  throw "navigation to a list binding is not yet supported";
202
169
  }
203
170
  }
204
-
205
171
  if (mParameters.callExtension) {
206
172
  var oInternalModel = this._oView.getModel("internal");
207
-
208
173
  oInternalModel.setProperty("/paginatorCurrentContext", null);
209
174
  oContextInfo.sourceBindingContext = oContext.getObject();
210
175
  oContextInfo.bindingContext = oContext;
211
-
212
176
  if (mParameters.oEvent) {
213
177
  oContextInfo.oEvent = mParameters.oEvent;
214
- } // Storing the selected context to use it in internal route navigation if neccessary.
215
-
216
-
178
+ }
179
+ // Storing the selected context to use it in internal route navigation if neccessary.
217
180
  var bOverrideNav = this.base.getView().getController().routing.onBeforeNavigation(oContextInfo);
218
-
219
181
  if (bOverrideNav) {
220
182
  oInternalModel.setProperty("/paginatorCurrentContext", oContext);
221
183
  return Promise.resolve(true);
222
184
  }
223
185
  }
224
-
225
186
  mParameters.FCLLevel = this._getFCLLevel();
226
187
  return this._oRoutingService.navigateToContext(oContext, mParameters, this._oView.getViewData(), this._oTargetInformation);
227
188
  }
189
+
228
190
  /**
229
191
  * Navigates backwards from a context.
230
192
  *
@@ -232,14 +194,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
232
194
  * @param [mParameters] Optional navigation parameters
233
195
  * @returns Promise resolved when the navigation has been triggered
234
196
  * @ui5-restricted
235
- */
236
- ;
237
-
197
+ */;
238
198
  _proto.navigateBackFromContext = function navigateBackFromContext(oContext, mParameters) {
239
199
  mParameters = mParameters || {};
240
200
  mParameters.updateFCLLevel = -1;
241
201
  return this.navigateToContext(oContext, mParameters);
242
202
  }
203
+
243
204
  /**
244
205
  * Navigates forwards to a context.
245
206
  *
@@ -247,109 +208,92 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
247
208
  * @param mParameters Optional navigation parameters
248
209
  * @returns Promise resolved when the navigation has been triggered
249
210
  * @ui5-restricted
250
- */
251
- ;
252
-
211
+ */;
253
212
  _proto.navigateForwardToContext = function navigateForwardToContext(oContext, mParameters) {
254
213
  var _this$_oView$getBindi;
255
-
256
214
  if (((_this$_oView$getBindi = this._oView.getBindingContext("internal")) === null || _this$_oView$getBindi === void 0 ? void 0 : _this$_oView$getBindi.getProperty("messageFooterContainsErrors")) === true) {
257
215
  return Promise.resolve(true);
258
216
  }
259
-
260
217
  mParameters = mParameters || {};
261
218
  mParameters.updateFCLLevel = 1;
262
219
  return this.navigateToContext(oContext, mParameters);
263
220
  }
221
+
264
222
  /**
265
223
  * Navigates back in history if the current hash corresponds to a transient state.
266
- */
267
- ;
268
-
224
+ */;
269
225
  _proto.navigateBackFromTransientState = function navigateBackFromTransientState() {
270
- var sHash = this._oRouterProxy.getHash(); // if triggered while navigating to (...), we need to navigate back
271
-
226
+ var sHash = this._oRouterProxy.getHash();
272
227
 
228
+ // if triggered while navigating to (...), we need to navigate back
273
229
  if (sHash.indexOf("(...)") !== -1) {
274
230
  this._oRouterProxy.navBack();
275
231
  }
276
232
  };
277
-
278
233
  _proto.navigateToMessagePage = function navigateToMessagePage(sErrorMessage, mParameters) {
279
234
  mParameters = mParameters || {};
280
-
281
235
  if (this._oRouterProxy.getHash().indexOf("i-action=create") > -1 || this._oRouterProxy.getHash().indexOf("i-action=autoCreate") > -1) {
282
236
  return this._oRouterProxy.navToHash(this._oRoutingService.getDefaultCreateHash());
283
237
  } else {
284
238
  mParameters.FCLLevel = this._getFCLLevel();
285
- return this._oAppComponent.getRootViewController().displayMessagePage(sErrorMessage, mParameters);
239
+ return this._oAppComponent.getRootViewController().displayErrorPage(sErrorMessage, mParameters);
286
240
  }
287
241
  }
242
+
288
243
  /**
289
244
  * Checks if one of the current views on the screen is bound to a given context.
290
245
  *
291
246
  * @param oContext
292
247
  * @returns `true` if the state is impacted by the context
293
248
  * @ui5-restricted
294
- */
295
- ;
296
-
249
+ */;
297
250
  _proto.isCurrentStateImpactedBy = function isCurrentStateImpactedBy(oContext) {
298
251
  return this._oRoutingService.isCurrentStateImpactedBy(oContext);
299
252
  };
300
-
301
253
  _proto._isViewPartOfRoute = function _isViewPartOfRoute(routeInformation) {
302
254
  var aTargets = routeInformation === null || routeInformation === void 0 ? void 0 : routeInformation.targets;
303
-
304
255
  if (!aTargets || aTargets.indexOf(this._oTargetInformation.targetName) === -1) {
305
256
  var _this$_oTargetInforma, _routeInformation$rou;
306
-
307
257
  // If the target for this view has a view level greater than the route level, it means this view comes "after" the route
308
258
  // in terms of navigation.
309
259
  // In such case, we remove its binding context, to avoid this view to have data if we navigate to it later on
310
260
  if (((_this$_oTargetInforma = this._oTargetInformation.viewLevel) !== null && _this$_oTargetInforma !== void 0 ? _this$_oTargetInforma : 0) >= ((_routeInformation$rou = routeInformation === null || routeInformation === void 0 ? void 0 : routeInformation.routeLevel) !== null && _routeInformation$rou !== void 0 ? _routeInformation$rou : 0)) {
311
261
  this._setBindingContext(null); // This also call setKeepAlive(false) on the current context
312
-
313
262
  }
314
263
 
315
264
  return false;
316
265
  }
317
-
318
266
  return true;
319
267
  };
320
-
321
268
  _proto._buildBindingPath = function _buildBindingPath(routeArguments, bindingPattern, navigationParameters) {
322
269
  var path = bindingPattern.replace(":?query:", "");
323
270
  var deferred = false;
324
-
325
271
  for (var sKey in routeArguments) {
326
272
  var sValue = routeArguments[sKey];
327
-
328
273
  if (sValue === "..." && bindingPattern.indexOf("{".concat(sKey, "}")) >= 0) {
329
- deferred = true; // Sometimes in preferredMode = create, the edit button is shown in background when the
274
+ deferred = true;
275
+ // Sometimes in preferredMode = create, the edit button is shown in background when the
330
276
  // action parameter dialog shows up, setting bTargetEditable passes editable as true
331
277
  // to onBeforeBinding in _bindTargetPage function
332
-
333
278
  navigationParameters.bTargetEditable = true;
334
279
  }
335
-
336
280
  path = path.replace("{".concat(sKey, "}"), sValue);
337
281
  }
338
-
339
282
  if (routeArguments["?query"] && routeArguments["?query"].hasOwnProperty("i-action")) {
340
283
  navigationParameters.bActionCreate = true;
341
- } // the binding path is always absolute
342
-
284
+ }
343
285
 
286
+ // the binding path is always absolute
344
287
  if (path && path[0] !== "/") {
345
288
  path = "/".concat(path);
346
289
  }
347
-
348
290
  return {
349
291
  path: path,
350
292
  deferred: deferred
351
293
  };
352
- } ///////////////////////////////////////////////////////////
294
+ }
295
+
296
+ ///////////////////////////////////////////////////////////
353
297
  // Methods to bind the page when a route is matched
354
298
  ///////////////////////////////////////////////////////////
355
299
 
@@ -359,59 +303,47 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
359
303
  *
360
304
  * @param oEvent
361
305
  * @ui5-restricted
362
- */
363
- ;
364
-
306
+ */;
365
307
  _proto._onRouteMatched = function _onRouteMatched(oEvent) {
366
308
  var _this3 = this;
367
-
368
309
  // Check if the target for this view is part of the event targets (i.e. is a target for the current route).
369
310
  // If not, we don't need to bind it --> return
370
311
  if (!this._isViewPartOfRoute(oEvent.getParameter("routeInformation"))) {
371
312
  return;
372
- } // Retrieve the binding context pattern
373
-
313
+ }
374
314
 
315
+ // Retrieve the binding context pattern
375
316
  var bindingPattern;
376
-
377
317
  if (this._oPageComponent && this._oPageComponent.getBindingContextPattern) {
378
318
  bindingPattern = this._oPageComponent.getBindingContextPattern();
379
319
  }
380
-
381
320
  bindingPattern = bindingPattern || this._oTargetInformation.contextPattern;
382
-
383
321
  if (bindingPattern === null || bindingPattern === undefined) {
384
322
  // Don't do this if we already got sTarget == '', which is a valid target pattern
385
323
  bindingPattern = oEvent.getParameter("routePattern");
386
- } // Replace the parameters by their values in the binding context pattern
387
-
324
+ }
388
325
 
326
+ // Replace the parameters by their values in the binding context pattern
389
327
  var mArguments = oEvent.getParameters().arguments;
390
328
  var oNavigationParameters = oEvent.getParameter("navigationInfo");
391
-
392
329
  var _this$_buildBindingPa = this._buildBindingPath(mArguments, bindingPattern, oNavigationParameters),
393
- path = _this$_buildBindingPa.path,
394
- deferred = _this$_buildBindingPa.deferred;
395
-
330
+ path = _this$_buildBindingPa.path,
331
+ deferred = _this$_buildBindingPa.deferred;
396
332
  this.onRouteMatched();
397
-
398
333
  var oModel = this._oView.getModel();
399
-
400
334
  var oOut;
401
-
402
335
  if (deferred) {
403
336
  oOut = this._bindDeferred(path, oNavigationParameters);
404
337
  } else {
405
338
  oOut = this._bindPage(path, oModel, oNavigationParameters);
406
- } // eslint-disable-next-line promise/catch-or-return
407
-
408
-
339
+ }
340
+ // eslint-disable-next-line promise/catch-or-return
409
341
  oOut.finally(function () {
410
342
  _this3.onRouteMatchedFinished();
411
343
  });
412
-
413
344
  this._oAppComponent.getRootViewController().updateUIStateForView(this._oView, this._getFCLLevel());
414
345
  }
346
+
415
347
  /**
416
348
  * Deferred binding (during object creation).
417
349
  *
@@ -419,14 +351,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
419
351
  * @param oNavigationParameters Navigation parameters
420
352
  * @returns A Promise
421
353
  * @ui5-restricted
422
- */
423
- ;
424
-
354
+ */;
425
355
  _proto._bindDeferred = function _bindDeferred(sTargetPath, oNavigationParameters) {
426
356
  this.onBeforeBinding(null, {
427
357
  editable: oNavigationParameters.bTargetEditable
428
358
  });
429
-
430
359
  if (oNavigationParameters.bDeferredContext || !oNavigationParameters.oAsyncContext) {
431
360
  // either the context shall be created in the target page (deferred Context) or it shall
432
361
  // be created async but the user refreshed the page / bookmarked this URL
@@ -436,21 +365,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
436
365
  this._oPageComponent.createDeferredContext(sTargetPath, oNavigationParameters.useContext, oNavigationParameters.bActionCreate);
437
366
  }
438
367
  }
439
-
440
368
  var currentBindingContext = this._getBindingContext();
441
-
442
369
  if (currentBindingContext !== null && currentBindingContext !== void 0 && currentBindingContext.hasPendingChanges()) {
443
370
  // For now remove the pending changes to avoid the model raises errors and the object page is at least bound
444
371
  // Ideally the user should be asked for
445
372
  currentBindingContext.getBinding().resetChanges();
446
- } // remove the context to avoid showing old data
447
-
373
+ }
448
374
 
375
+ // remove the context to avoid showing old data
449
376
  this._setBindingContext(null);
450
-
451
377
  this.onAfterBinding(null);
452
378
  return Promise.resolve();
453
379
  }
380
+
454
381
  /**
455
382
  * Sets the binding context of the page from a path.
456
383
  *
@@ -459,12 +386,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
459
386
  * @param oNavigationParameters Navigation parameters
460
387
  * @returns A Promise resolved once the binding has been set on the page
461
388
  * @ui5-restricted
462
- */
463
- ;
464
-
389
+ */;
465
390
  _proto._bindPage = function _bindPage(sTargetPath, oModel, oNavigationParameters) {
466
391
  var _this4 = this;
467
-
468
392
  if (sTargetPath === "") {
469
393
  return Promise.resolve(this._bindPageToContext(null, oModel, oNavigationParameters));
470
394
  } else {
@@ -473,7 +397,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
473
397
  }).catch(function (oError) {
474
398
  // Error handling for erroneous metadata request
475
399
  var oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
476
-
477
400
  _this4.navigateToMessagePage(oResourceBundle.getText("C_COMMON_SAPFE_DATA_RECEIVED_ERROR"), {
478
401
  title: oResourceBundle.getText("C_COMMON_SAPFE_ERROR"),
479
402
  description: oError.message
@@ -481,6 +404,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
481
404
  });
482
405
  }
483
406
  }
407
+
484
408
  /**
485
409
  * Creates the filter to retrieve a context corresponding to a semantic path.
486
410
  *
@@ -489,28 +413,21 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
489
413
  * @param oMetaModel The instance of the meta model
490
414
  * @returns The filter
491
415
  * @ui5-restricted
492
- */
493
- ;
494
-
416
+ */;
495
417
  _proto._createFilterFromSemanticPath = function _createFilterFromSemanticPath(sSemanticPath, aSemanticKeys, oMetaModel) {
496
418
  var fnUnquoteAndDecode = function (sValue) {
497
419
  if (sValue.indexOf("'") === 0 && sValue.lastIndexOf("'") === sValue.length - 1) {
498
420
  // Remove the quotes from the value and decode special chars
499
421
  sValue = decodeURIComponent(sValue.substring(1, sValue.length - 1));
500
422
  }
501
-
502
423
  return sValue;
503
424
  };
504
-
505
425
  var aKeyValues = sSemanticPath.substring(sSemanticPath.indexOf("(") + 1, sSemanticPath.length - 1).split(",");
506
426
  var aFilters;
507
-
508
427
  if (aSemanticKeys.length != aKeyValues.length) {
509
428
  return null;
510
429
  }
511
-
512
430
  var bFilteringCaseSensitive = ModelHelper.isFilteringCaseSensitive(oMetaModel);
513
-
514
431
  if (aSemanticKeys.length === 1) {
515
432
  // Take the first key value
516
433
  var sKeyValue = fnUnquoteAndDecode(aKeyValues[0]);
@@ -521,18 +438,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
521
438
  caseSensitive: bFilteringCaseSensitive
522
439
  })];
523
440
  } else {
524
- var mKeyValues = {}; // Create a map of all key values
525
-
441
+ var mKeyValues = {};
442
+ // Create a map of all key values
526
443
  aKeyValues.forEach(function (sKeyAssignment) {
527
444
  var aParts = sKeyAssignment.split("="),
528
- sKeyValue = fnUnquoteAndDecode(aParts[1]);
445
+ sKeyValue = fnUnquoteAndDecode(aParts[1]);
529
446
  mKeyValues[aParts[0]] = sKeyValue;
530
447
  });
531
448
  var bFailed = false;
532
449
  aFilters = aSemanticKeys.map(function (oSemanticKey) {
533
450
  var sKey = oSemanticKey.$PropertyPath,
534
- sValue = mKeyValues[sKey];
535
-
451
+ sValue = mKeyValues[sKey];
536
452
  if (sValue !== undefined) {
537
453
  return new Filter({
538
454
  path: sKey,
@@ -551,10 +467,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
551
467
  if (bFailed) {
552
468
  return null;
553
469
  }
554
- } // Add a draft filter to make sure we take the draft entity if there is one
555
- // Or the active entity otherwise
556
-
470
+ }
557
471
 
472
+ // Add a draft filter to make sure we take the draft entity if there is one
473
+ // Or the active entity otherwise
558
474
  var oDraftFilter = new Filter({
559
475
  filters: [new Filter("IsActiveEntity", "EQ", false), new Filter("SiblingEntity/IsActiveEntity", "EQ", null)],
560
476
  and: false
@@ -562,6 +478,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
562
478
  aFilters.push(oDraftFilter);
563
479
  return new Filter(aFilters, true);
564
480
  }
481
+
565
482
  /**
566
483
  * Converts a path with semantic keys to a path with technical keys.
567
484
  *
@@ -570,35 +487,29 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
570
487
  * @param aSemanticKeys The semantic keys for the path
571
488
  * @returns A Promise containing the path with technical keys if sSemanticPath could be interpreted as a semantic path, null otherwise
572
489
  * @ui5-restricted
573
- */
574
- ;
575
-
490
+ */;
576
491
  _proto._getTechnicalPathFromSemanticPath = function _getTechnicalPathFromSemanticPath(sSemanticPath, oModel, aSemanticKeys) {
577
492
  var _sEntitySetPath;
578
-
579
493
  var oMetaModel = oModel.getMetaModel();
580
494
  var sEntitySetPath = oMetaModel.getMetaContext(sSemanticPath).getPath();
581
-
582
495
  if (!aSemanticKeys || aSemanticKeys.length === 0) {
583
496
  // No semantic keys
584
497
  return Promise.resolve(null);
585
- } // Create a set of filters corresponding to all keys
586
-
498
+ }
587
499
 
500
+ // Create a set of filters corresponding to all keys
588
501
  var oFilter = this._createFilterFromSemanticPath(sSemanticPath, aSemanticKeys, oMetaModel);
589
-
590
502
  if (oFilter === null) {
591
503
  // Couldn't interpret the path as a semantic one
592
504
  return Promise.resolve(null);
593
- } // Load the corresponding object
594
-
505
+ }
595
506
 
507
+ // Load the corresponding object
596
508
  if (!((_sEntitySetPath = sEntitySetPath) !== null && _sEntitySetPath !== void 0 && _sEntitySetPath.startsWith("/"))) {
597
509
  sEntitySetPath = "/".concat(sEntitySetPath);
598
510
  }
599
-
600
511
  var oListBinding = oModel.bindList(sEntitySetPath, undefined, undefined, oFilter, {
601
- "$$groupId": "$auto.Heroes"
512
+ $$groupId: "$auto.Heroes"
602
513
  });
603
514
  return oListBinding.requestContexts(0, 2).then(function (oContexts) {
604
515
  if (oContexts && oContexts.length) {
@@ -609,6 +520,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
609
520
  }
610
521
  });
611
522
  }
523
+
612
524
  /**
613
525
  * Checks if a path is eligible for semantic bookmarking.
614
526
  *
@@ -616,24 +528,21 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
616
528
  * @param oMetaModel The associated metadata model
617
529
  * @returns `true` if the path is eligible
618
530
  * @ui5-restricted
619
- */
620
- ;
621
-
531
+ */;
622
532
  _proto._checkPathForSemanticBookmarking = function _checkPathForSemanticBookmarking(sPath, oMetaModel) {
623
533
  // Only path on root objects allow semantic bookmarking, i.e. sPath = xxx(yyy)
624
534
  var aMatches = /^[\/]?(\w+)\([^\/]+\)$/.exec(sPath);
625
-
626
535
  if (!aMatches) {
627
536
  return false;
628
- } // Get the entitySet name
629
-
630
-
631
- var sEntitySetPath = "/".concat(aMatches[1]); // Check the entity set supports draft (otherwise we don't support semantic bookmarking)
632
-
537
+ }
538
+ // Get the entitySet name
539
+ var sEntitySetPath = "/".concat(aMatches[1]);
540
+ // Check the entity set supports draft (otherwise we don't support semantic bookmarking)
633
541
  var oDraftRoot = oMetaModel.getObject("".concat(sEntitySetPath, "@com.sap.vocabularies.Common.v1.DraftRoot"));
634
542
  var oDraftNode = oMetaModel.getObject("".concat(sEntitySetPath, "@com.sap.vocabularies.Common.v1.DraftNode"));
635
543
  return oDraftRoot || oDraftNode ? true : false;
636
544
  }
545
+
637
546
  /**
638
547
  * Builds a path with semantic keys from a path with technical keys.
639
548
  *
@@ -641,32 +550,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
641
550
  * @param oModel The OData model
642
551
  * @returns String promise for the new path. If sPathToResolved couldn't be interpreted as a semantic path, it is returned as is.
643
552
  * @ui5-restricted
644
- */
645
- ;
646
-
553
+ */;
647
554
  _proto._resolveSemanticPath = function _resolveSemanticPath(sPathToResolve, oModel) {
648
555
  var _this5 = this;
649
-
650
556
  var oMetaModel = oModel.getMetaModel();
651
-
652
557
  var oLastSemanticMapping = this._oRoutingService.getLastSemanticMapping();
653
-
654
558
  var sCurrentHashNoParams = this._oRouter.getHashChanger().getHash().split("?")[0];
655
-
656
559
  if (sCurrentHashNoParams && sCurrentHashNoParams.lastIndexOf("/") === sCurrentHashNoParams.length - 1) {
657
560
  // Remove trailing '/'
658
561
  sCurrentHashNoParams = sCurrentHashNoParams.substring(0, sCurrentHashNoParams.length - 1);
659
562
  }
660
-
661
563
  var sRootEntityName = sCurrentHashNoParams && sCurrentHashNoParams.substr(0, sCurrentHashNoParams.indexOf("("));
662
-
663
564
  if (sRootEntityName.indexOf("/") === 0) {
664
565
  sRootEntityName = sRootEntityName.substring(1);
665
566
  }
666
-
667
567
  var bAllowSemanticBookmark = this._checkPathForSemanticBookmarking(sCurrentHashNoParams, oMetaModel),
668
- aSemanticKeys = bAllowSemanticBookmark && SemanticKeyHelper.getSemanticKeys(oMetaModel, sRootEntityName);
669
-
568
+ aSemanticKeys = bAllowSemanticBookmark && SemanticKeyHelper.getSemanticKeys(oMetaModel, sRootEntityName);
670
569
  if (!aSemanticKeys) {
671
570
  // No semantic keys available --> use the path as is
672
571
  return Promise.resolve(sPathToResolve);
@@ -682,7 +581,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
682
581
  technicalPath: sTechnicalPath,
683
582
  semanticPath: sPathToResolve
684
583
  });
685
-
686
584
  return sTechnicalPath;
687
585
  } else {
688
586
  return sPathToResolve;
@@ -690,6 +588,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
690
588
  });
691
589
  }
692
590
  }
591
+
693
592
  /**
694
593
  * Sets the binding context of the page from a path.
695
594
  *
@@ -697,19 +596,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
697
596
  * @param oModel The OData model
698
597
  * @param oNavigationParameters Navigation parameters
699
598
  * @ui5-restricted
700
- */
701
- ;
702
-
599
+ */;
703
600
  _proto._bindPageToPath = function _bindPageToPath(sTargetPath, oModel, oNavigationParameters) {
704
601
  var oCurrentContext = this._getBindingContext(),
705
- sCurrentPath = oCurrentContext && oCurrentContext.getPath(),
706
- oUseContext = oNavigationParameters.useContext; // We set the binding context only if it's different from the current one
707
- // or if we have a context already selected
708
-
602
+ sCurrentPath = oCurrentContext && oCurrentContext.getPath(),
603
+ oUseContext = oNavigationParameters.useContext;
709
604
 
605
+ // We set the binding context only if it's different from the current one
606
+ // or if we have a context already selected
710
607
  if (sCurrentPath !== sTargetPath || oUseContext && oUseContext.getPath() === sTargetPath) {
711
608
  var oTargetContext;
712
-
713
609
  if (oUseContext && oUseContext.getPath() === sTargetPath) {
714
610
  // We already have the context to be used
715
611
  oTargetContext = oUseContext;
@@ -717,7 +613,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
717
613
  // Otherwise we need to create it from sTargetPath
718
614
  oTargetContext = this._createContext(sTargetPath, oModel);
719
615
  }
720
-
721
616
  if (oTargetContext !== oCurrentContext) {
722
617
  this._bindPageToContext(oTargetContext, oModel, oNavigationParameters);
723
618
  }
@@ -725,6 +620,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
725
620
  this._refreshBindingContext(oCurrentContext);
726
621
  }
727
622
  }
623
+
728
624
  /**
729
625
  * Binds the page to a context.
730
626
  *
@@ -732,28 +628,21 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
732
628
  * @param oModel The OData model
733
629
  * @param oNavigationParameters Navigation parameters
734
630
  * @ui5-restricted
735
- */
736
- ;
737
-
631
+ */;
738
632
  _proto._bindPageToContext = function _bindPageToContext(oContext, oModel, oNavigationParameters) {
739
633
  var _this6 = this;
740
-
741
634
  if (!oContext) {
742
635
  this.onBeforeBinding(null);
743
636
  this.onAfterBinding(null);
744
637
  return;
745
638
  }
746
-
747
639
  var oParentListBinding = oContext.getBinding();
748
-
749
640
  var oRootViewController = this._oAppComponent.getRootViewController();
750
-
751
641
  if (oRootViewController.isFclEnabled()) {
752
642
  if (!oParentListBinding || !oParentListBinding.isA("sap.ui.model.odata.v4.ODataListBinding")) {
753
643
  // if the parentBinding is not a listBinding, we create a new context
754
644
  oContext = this._createContext(oContext.getPath(), oModel);
755
645
  }
756
-
757
646
  try {
758
647
  this._setKeepAlive(oContext, true, function () {
759
648
  if (oRootViewController.isContextUsedInPages(oContext)) {
@@ -769,9 +658,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
769
658
  } else if (!oParentListBinding || oParentListBinding.isA("sap.ui.model.odata.v4.ODataListBinding")) {
770
659
  // We need to recreate the context otherwise we get errors
771
660
  oContext = this._createContext(oContext.getPath(), oModel);
772
- } // Set the binding context with the proper before/after callbacks
773
-
661
+ }
774
662
 
663
+ // Set the binding context with the proper before/after callbacks
775
664
  this.onBeforeBinding(oContext, {
776
665
  editable: oNavigationParameters.bTargetEditable,
777
666
  listBinding: oParentListBinding,
@@ -779,11 +668,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
779
668
  bDraftNavigation: oNavigationParameters.bDraftNavigation,
780
669
  showPlaceholder: oNavigationParameters.bShowPlaceholder
781
670
  });
782
-
783
671
  this._setBindingContext(oContext);
784
-
785
672
  this.onAfterBinding(oContext);
786
673
  }
674
+
787
675
  /**
788
676
  * Creates a context from a path.
789
677
  *
@@ -791,36 +679,29 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
791
679
  * @param oModel The OData model
792
680
  * @returns The created context
793
681
  * @ui5-restricted
794
- */
795
- ;
796
-
682
+ */;
797
683
  _proto._createContext = function _createContext(sPath, oModel) {
798
684
  var _this7 = this;
799
-
800
685
  var oPageComponent = this._oPageComponent,
801
- sEntitySet = oPageComponent && oPageComponent.getEntitySet && oPageComponent.getEntitySet(),
802
- sContextPath = oPageComponent && oPageComponent.getContextPath && oPageComponent.getContextPath() || sEntitySet && "/".concat(sEntitySet),
803
- oMetaModel = oModel.getMetaModel(),
804
- mParameters = {
805
- $$groupId: "$auto.Heroes",
806
- $$updateGroupId: "$auto",
807
- $$patchWithoutSideEffects: true
808
- }; // In case of draft: $select the state flags (HasActiveEntity, HasDraftEntity, and IsActiveEntity)
809
-
686
+ sEntitySet = oPageComponent && oPageComponent.getEntitySet && oPageComponent.getEntitySet(),
687
+ sContextPath = oPageComponent && oPageComponent.getContextPath && oPageComponent.getContextPath() || sEntitySet && "/".concat(sEntitySet),
688
+ oMetaModel = oModel.getMetaModel(),
689
+ mParameters = {
690
+ $$groupId: "$auto.Heroes",
691
+ $$updateGroupId: "$auto",
692
+ $$patchWithoutSideEffects: true
693
+ };
694
+ // In case of draft: $select the state flags (HasActiveEntity, HasDraftEntity, and IsActiveEntity)
810
695
  var oDraftRoot = oMetaModel.getObject("".concat(sContextPath, "@com.sap.vocabularies.Common.v1.DraftRoot"));
811
696
  var oDraftNode = oMetaModel.getObject("".concat(sContextPath, "@com.sap.vocabularies.Common.v1.DraftNode"));
812
-
813
697
  var oRootViewController = this._oAppComponent.getRootViewController();
814
-
815
698
  if (oRootViewController.isFclEnabled()) {
816
699
  var oContext = this._getKeepAliveContext(oModel, sPath, false, mParameters);
817
-
818
700
  if (!oContext) {
819
701
  throw new Error("Cannot create keepAlive context ".concat(sPath));
820
702
  } else if (oDraftRoot || oDraftNode) {
821
703
  if (oContext.getProperty("IsActiveEntity") === undefined) {
822
704
  oContext.requestProperty(["HasActiveEntity", "HasDraftEntity", "IsActiveEntity"]);
823
-
824
705
  if (oDraftRoot) {
825
706
  oContext.requestObject("DraftAdministrativeData");
826
707
  }
@@ -830,18 +711,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
830
711
  oContext.requestSideEffects(oDraftRoot ? ["HasActiveEntity", "HasDraftEntity", "IsActiveEntity", "DraftAdministrativeData"] : ["HasActiveEntity", "HasDraftEntity", "IsActiveEntity"]);
831
712
  }
832
713
  }
833
-
834
714
  return oContext;
835
715
  } else {
836
716
  if (sEntitySet) {
837
717
  var sMessagesPath = oMetaModel.getObject("".concat(sContextPath, "/@com.sap.vocabularies.Common.v1.Messages/$Path"));
838
-
839
718
  if (sMessagesPath) {
840
719
  mParameters.$select = sMessagesPath;
841
720
  }
842
- } // In case of draft: $select the state flags (HasActiveEntity, HasDraftEntity, and IsActiveEntity)
843
-
721
+ }
844
722
 
723
+ // In case of draft: $select the state flags (HasActiveEntity, HasDraftEntity, and IsActiveEntity)
845
724
  if (oDraftRoot || oDraftNode) {
846
725
  if (mParameters.$select === undefined) {
847
726
  mParameters.$select = "HasActiveEntity,HasDraftEntity,IsActiveEntity";
@@ -849,10 +728,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
849
728
  mParameters.$select += ",HasActiveEntity,HasDraftEntity,IsActiveEntity";
850
729
  }
851
730
  }
852
-
853
731
  if (this._oView.getBindingContext()) {
854
732
  var _this$_oView$getBindi2;
855
-
856
733
  var oPreviousBinding = (_this$_oView$getBindi2 = this._oView.getBindingContext()) === null || _this$_oView$getBindi2 === void 0 ? void 0 : _this$_oView$getBindi2.getBinding();
857
734
  oPreviousBinding === null || oPreviousBinding === void 0 ? void 0 : oPreviousBinding.resetChanges().then(function () {
858
735
  oPreviousBinding.destroy();
@@ -860,35 +737,39 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
860
737
  Log.error("Error while reseting the changes to the binding", oError);
861
738
  });
862
739
  }
863
-
864
740
  var oHiddenBinding = oModel.bindContext(sPath, undefined, mParameters);
865
741
  oHiddenBinding.attachEventOnce("dataRequested", function () {
866
742
  BusyLocker.lock(_this7._oView);
867
743
  });
868
- oHiddenBinding.attachEventOnce("dataReceived", this._dataReceivedEventHandler.bind(this));
744
+ oHiddenBinding.attachEventOnce("dataReceived", this.onDataReceived.bind(this));
869
745
  return oHiddenBinding.getBoundContext();
870
746
  }
871
747
  };
872
-
873
- _proto._dataReceivedEventHandler = function _dataReceivedEventHandler(oEvent) {
748
+ _proto.onDataReceived = function onDataReceived(oEvent) {
874
749
  try {
875
750
  var _this9 = this;
876
-
877
751
  var sErrorDescription = oEvent && oEvent.getParameter("error");
878
- BusyLocker.unlock(_this9._oView);
879
-
752
+ if (BusyLocker.isLocked(_this9._oView)) {
753
+ BusyLocker.unlock(_this9._oView);
754
+ }
880
755
  var _temp3 = function () {
881
756
  if (sErrorDescription) {
882
757
  var _temp4 = _catch(function () {
883
758
  return Promise.resolve(Core.getLibraryResourceBundle("sap.fe.core", true)).then(function (oResourceBundle) {
884
759
  var messageHandler = _this9.base.messageHandler;
885
760
  var mParams = {};
886
-
887
- if (sErrorDescription && sErrorDescription.status === 503) {
761
+ if (sErrorDescription.status === 503) {
888
762
  mParams = {
889
763
  isInitialLoad503Error: true,
890
764
  shellBack: true
891
765
  };
766
+ } else if (sErrorDescription.status === 400) {
767
+ mParams = {
768
+ title: oResourceBundle.getText("C_COMMON_SAPFE_ERROR"),
769
+ description: oResourceBundle.getText("C_COMMON_SAPFE_DATA_RECEIVED_ERROR_DESCRIPTION"),
770
+ isDataReceivedError: true,
771
+ shellBack: true
772
+ };
892
773
  } else {
893
774
  mParams = {
894
775
  title: oResourceBundle.getText("C_COMMON_SAPFE_ERROR"),
@@ -897,17 +778,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
897
778
  shellBack: true
898
779
  };
899
780
  }
900
-
901
781
  return Promise.resolve(messageHandler.showMessages(mParams)).then(function () {});
902
782
  });
903
783
  }, function (oError) {
904
784
  Log.error("Error while getting the core resource bundle", oError);
905
785
  });
906
-
907
786
  if (_temp4 && _temp4.then) return _temp4.then(function () {});
908
787
  }
909
788
  }();
910
-
911
789
  return Promise.resolve(_temp3 && _temp3.then ? _temp3.then(function () {}) : void 0);
912
790
  } catch (e) {
913
791
  return Promise.reject(e);
@@ -925,18 +803,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
925
803
  * @ui5-restricted
926
804
  */
927
805
  ;
928
-
929
806
  _proto._refreshBindingContext = function _refreshBindingContext(oBindingContext) {
930
807
  var oPageComponent = this._oPageComponent;
931
-
932
808
  var oSideEffectsService = this._oAppComponent.getSideEffectsService();
933
-
934
809
  var sRootContextPath = oBindingContext.getPath();
935
810
  var sEntitySet = oPageComponent && oPageComponent.getEntitySet && oPageComponent.getEntitySet();
936
811
  var sContextPath = oPageComponent && oPageComponent.getContextPath && oPageComponent.getContextPath() || sEntitySet && "/".concat(sEntitySet);
937
-
938
812
  var oMetaModel = this._oView.getModel().getMetaModel();
939
-
940
813
  var sMessagesPath;
941
814
  var aNavigationPropertyPaths = [];
942
815
  var aPropertyPaths = [];
@@ -944,18 +817,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
944
817
  TargetProperties: [],
945
818
  TargetEntities: []
946
819
  };
947
-
948
820
  function getBindingPaths(oBinding) {
949
821
  var aDependentBindings;
950
822
  var sRelativePath = (oBinding.getContext() && oBinding.getContext().getPath() || "").replace(sRootContextPath, ""); // If no context, this is an absolute binding so no relative path
951
-
952
823
  var sPath = (sRelativePath ? "".concat(sRelativePath.slice(1), "/") : sRelativePath) + oBinding.getPath();
953
-
954
824
  if (oBinding.isA("sap.ui.model.odata.v4.ODataContextBinding")) {
955
825
  // if (sPath === "") {
956
826
  // now get the dependent bindings
957
827
  aDependentBindings = oBinding.getDependentBindings();
958
-
959
828
  if (aDependentBindings) {
960
829
  // ask the dependent bindings (and only those with the specified groupId
961
830
  //if (aDependentBindings.length > 0) {
@@ -975,51 +844,43 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
975
844
  }
976
845
  }
977
846
  }
978
-
979
847
  if (sContextPath) {
980
848
  sMessagesPath = oMetaModel.getObject("".concat(sContextPath, "/@com.sap.vocabularies.Common.v1.Messages/$Path"));
981
- } // binding of the context must have $$PatchWithoutSideEffects true, this bound context may be needed to be fetched from the dependent binding
982
-
849
+ }
983
850
 
851
+ // binding of the context must have $$PatchWithoutSideEffects true, this bound context may be needed to be fetched from the dependent binding
984
852
  getBindingPaths(oBindingContext.getBinding());
985
853
  var i;
986
-
987
854
  for (i = 0; i < aNavigationPropertyPaths.length; i++) {
988
855
  oSideEffects.TargetEntities.push({
989
856
  $NavigationPropertyPath: aNavigationPropertyPaths[i]
990
857
  });
991
858
  }
992
-
993
859
  oSideEffects.TargetProperties = aPropertyPaths;
994
-
995
860
  if (sMessagesPath) {
996
861
  oSideEffects.TargetProperties.push(sMessagesPath);
997
- } //all this logic to be replaced with a SideEffects request for an empty path (refresh everything), after testing transient contexts
998
-
999
-
862
+ }
863
+ //all this logic to be replaced with a SideEffects request for an empty path (refresh everything), after testing transient contexts
1000
864
  oSideEffects.TargetProperties = oSideEffects.TargetProperties.map(function (sTargetProperty) {
1001
865
  if (sTargetProperty) {
1002
866
  var index = sTargetProperty.indexOf("/");
1003
-
1004
867
  if (index > 0) {
1005
868
  // only request the navigation path and not the property paths further
1006
869
  return sTargetProperty.slice(0, index);
1007
870
  }
1008
-
1009
871
  return sTargetProperty;
1010
872
  }
1011
- }); // OData model will take care of duplicates
1012
-
873
+ });
874
+ // OData model will take care of duplicates
1013
875
  oSideEffectsService.requestSideEffects(oSideEffects.TargetEntities.concat(oSideEffects.TargetProperties), oBindingContext);
1014
876
  }
877
+
1015
878
  /**
1016
879
  * Gets the binding context of the page or the component.
1017
880
  *
1018
881
  * @returns The binding context
1019
882
  * @ui5-restricted
1020
- */
1021
- ;
1022
-
883
+ */;
1023
884
  _proto._getBindingContext = function _getBindingContext() {
1024
885
  if (this._oPageComponent) {
1025
886
  return this._oPageComponent.getBindingContext();
@@ -1027,17 +888,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1027
888
  return this._oView.getBindingContext();
1028
889
  }
1029
890
  }
891
+
1030
892
  /**
1031
893
  * Sets the binding context of the page or the component.
1032
894
  *
1033
895
  * @param oContext The binding context
1034
896
  * @ui5-restricted
1035
- */
1036
- ;
1037
-
897
+ */;
1038
898
  _proto._setBindingContext = function _setBindingContext(oContext) {
1039
899
  var oPreviousContext, oTargetControl;
1040
-
1041
900
  if (this._oPageComponent) {
1042
901
  oPreviousContext = this._oPageComponent.getBindingContext();
1043
902
  oTargetControl = this._oPageComponent;
@@ -1045,25 +904,21 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1045
904
  oPreviousContext = this._oView.getBindingContext();
1046
905
  oTargetControl = this._oView;
1047
906
  }
1048
-
1049
907
  oTargetControl.setBindingContext(oContext);
1050
-
1051
908
  if (oPreviousContext && oPreviousContext.isKeepAlive()) {
1052
909
  this._setKeepAlive(oPreviousContext, false);
1053
910
  }
1054
911
  }
912
+
1055
913
  /**
1056
914
  * Gets the flexible column layout (FCL) level corresponding to the view (-1 if the app is not FCL).
1057
915
  *
1058
916
  * @returns The level
1059
917
  * @ui5-restricted
1060
- */
1061
- ;
1062
-
918
+ */;
1063
919
  _proto._getFCLLevel = function _getFCLLevel() {
1064
920
  return this._oTargetInformation.FCLLevel;
1065
921
  };
1066
-
1067
922
  _proto._setKeepAlive = function _setKeepAlive(oContext, bKeepAlive, fnBeforeDestroy, bRequestMessages) {
1068
923
  if (oContext.getPath().endsWith(")")) {
1069
924
  // We keep the context alive only if they're part of a collection, i.e. if the path ends with a ')'
@@ -1073,24 +928,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1073
928
  oContext.setKeepAlive(bKeepAlive, fnBeforeDestroy, !!sMessagesPath && bRequestMessages);
1074
929
  }
1075
930
  };
1076
-
1077
931
  _proto._getKeepAliveContext = function _getKeepAliveContext(oModel, path, bRequestMessages, parameters) {
1078
932
  // Get the path for the context that is really kept alive (part of a collection)
1079
933
  // i.e. remove all segments not ending with a ')'
1080
934
  var keptAliveSegments = path.split("/");
1081
935
  var additionnalSegments = [];
1082
-
1083
936
  while (keptAliveSegments.length && !keptAliveSegments[keptAliveSegments.length - 1].endsWith(")")) {
1084
937
  additionnalSegments.push(keptAliveSegments.pop());
1085
938
  }
1086
-
1087
939
  if (keptAliveSegments.length === 0) {
1088
940
  return undefined;
1089
941
  }
1090
-
1091
942
  var keptAlivePath = keptAliveSegments.join("/");
1092
943
  var oKeepAliveContext = oModel.getKeepAliveContext(keptAlivePath, bRequestMessages, parameters);
1093
-
1094
944
  if (additionnalSegments.length === 0) {
1095
945
  return oKeepAliveContext;
1096
946
  } else {
@@ -1099,43 +949,37 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1099
949
  return oModel.bindContext(additionnalPath, oKeepAliveContext).getBoundContext();
1100
950
  }
1101
951
  }
952
+
1102
953
  /**
1103
954
  * Switches between column and full-screen mode when FCL is used.
1104
955
  *
1105
956
  * @ui5-restricted
1106
- */
1107
- ;
1108
-
957
+ */;
1109
958
  _proto.switchFullScreen = function switchFullScreen() {
1110
959
  var oSource = this.base.getView();
1111
-
1112
960
  var oFCLHelperModel = oSource.getModel("fclhelper"),
1113
- bIsFullScreen = oFCLHelperModel.getProperty("/actionButtonsInfo/isFullScreen"),
1114
- sNextLayout = oFCLHelperModel.getProperty(bIsFullScreen ? "/actionButtonsInfo/exitFullScreen" : "/actionButtonsInfo/fullScreen"),
1115
- oRootViewController = this._oAppComponent.getRootViewController();
1116
-
961
+ bIsFullScreen = oFCLHelperModel.getProperty("/actionButtonsInfo/isFullScreen"),
962
+ sNextLayout = oFCLHelperModel.getProperty(bIsFullScreen ? "/actionButtonsInfo/exitFullScreen" : "/actionButtonsInfo/fullScreen"),
963
+ oRootViewController = this._oAppComponent.getRootViewController();
1117
964
  var oContext = oRootViewController.getRightmostContext ? oRootViewController.getRightmostContext() : oSource.getBindingContext();
1118
-
1119
965
  this.base._routing.navigateToContext(oContext, {
1120
966
  sLayout: sNextLayout
1121
967
  }).catch(function () {
1122
968
  Log.warning("cannot switch between column and fullscreen");
1123
969
  });
1124
970
  }
971
+
1125
972
  /**
1126
973
  * Closes the column for the current view in a FCL.
1127
974
  *
1128
975
  * @ui5-restricted
1129
- */
1130
- ;
1131
-
976
+ */;
1132
977
  _proto.closeColumn = function closeColumn() {
1133
978
  var oSource = this.base.getView();
1134
979
  var oViewData = oSource.getViewData();
1135
980
  var oContext = oSource.getBindingContext();
1136
981
  var base = this.base;
1137
982
  var oMetaModel = oContext.getModel().getMetaModel();
1138
-
1139
983
  if (oViewData && oViewData.viewLevel === 1 && ModelHelper.isDraftSupported(oMetaModel, oContext.getPath())) {
1140
984
  draft.processDataLossOrDraftDiscardConfirmation(function () {
1141
985
  base._routing.navigateBackFromContext(oContext, {
@@ -1148,9 +992,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1148
992
  });
1149
993
  }
1150
994
  };
1151
-
1152
995
  return InternalRouting;
1153
- }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatched", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatched"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatchedFinished", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatchedFinished"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeBinding", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterBinding", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToTarget", [_dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToTarget"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToRoute", [_dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToRoute"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToContext", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateBackFromContext", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateBackFromContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateForwardToContext", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateForwardToContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateBackFromTransientState", [_dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateBackFromTransientState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToMessagePage", [_dec22, _dec23], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToMessagePage"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isCurrentStateImpactedBy", [_dec24, _dec25], Object.getOwnPropertyDescriptor(_class2.prototype, "isCurrentStateImpactedBy"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "switchFullScreen", [_dec26, _dec27], Object.getOwnPropertyDescriptor(_class2.prototype, "switchFullScreen"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "closeColumn", [_dec28, _dec29], Object.getOwnPropertyDescriptor(_class2.prototype, "closeColumn"), _class2.prototype)), _class2)) || _class);
996
+ }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatched", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatched"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatchedFinished", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatchedFinished"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeBinding", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterBinding", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToTarget", [_dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToTarget"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToRoute", [_dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToRoute"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToContext", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateBackFromContext", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateBackFromContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateForwardToContext", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateForwardToContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateBackFromTransientState", [_dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateBackFromTransientState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToMessagePage", [_dec22, _dec23], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToMessagePage"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isCurrentStateImpactedBy", [_dec24, _dec25], Object.getOwnPropertyDescriptor(_class2.prototype, "isCurrentStateImpactedBy"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onDataReceived", [_dec26], Object.getOwnPropertyDescriptor(_class2.prototype, "onDataReceived"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "switchFullScreen", [_dec27, _dec28], Object.getOwnPropertyDescriptor(_class2.prototype, "switchFullScreen"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "closeColumn", [_dec29, _dec30], Object.getOwnPropertyDescriptor(_class2.prototype, "closeColumn"), _class2.prototype)), _class2)) || _class);
1154
997
  return InternalRouting;
1155
998
  }, false);
1156
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiSW50ZXJuYWxSb3V0aW5nIiwiZGVmaW5lVUk1Q2xhc3MiLCJtZXRob2RPdmVycmlkZSIsInB1YmxpY0V4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiZmluYWxFeHRlbnNpb24iLCJCZWZvcmUiLCJvbkV4aXQiLCJfb1JvdXRpbmdTZXJ2aWNlIiwiZGV0YWNoUm91dGVNYXRjaGVkIiwiX2ZuUm91dGVNYXRjaGVkQm91bmQiLCJvbkluaXQiLCJfb1ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9vQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJfb1BhZ2VDb21wb25lbnQiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsIl9vUm91dGVyIiwiZ2V0Um91dGVyIiwiX29Sb3V0ZXJQcm94eSIsImdldFJvdXRlclByb3h5IiwiRXJyb3IiLCJnZXRTZXJ2aWNlIiwib1JvdXRpbmdTZXJ2aWNlIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwib0JpbmRpbmdDb250ZXh0IiwibVBhcmFtZXRlcnMiLCJvUm91dGluZyIsImdldENvbnRyb2xsZXIiLCJyb3V0aW5nIiwib25BZnRlckJpbmRpbmciLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJvbkNvbnRleHRCb3VuZFRvVmlldyIsIm5hdmlnYXRlVG9UYXJnZXQiLCJvQ29udGV4dCIsInNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSIsIm9TZW1hbnRpY09iamVjdCIsImJQcmVzZXJ2ZUhpc3RvcnkiLCJvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm9EZXRhaWxSb3V0ZSIsImRldGFpbCIsInNSb3V0ZU5hbWUiLCJyb3V0ZSIsIm1QYXJhbWV0ZXJNYXBwaW5nIiwicGFyYW1ldGVycyIsIm5hdmlnYXRlVG8iLCJnZXRWaWV3RGF0YSIsIm5hdmlnYXRlVG9Sb3V0ZSIsInNUYXJnZXRSb3V0ZU5hbWUiLCJvUGFyYW1ldGVycyIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib0NvbnRleHRJbmZvIiwiaXNBIiwiYXN5bmNDb250ZXh0IiwiYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJlZGl0YWJsZSIsImJQZXJzaXN0T1BTY3JvbGwiLCJ1cGRhdGVGQ0xMZXZlbCIsImJGb3JjZUZvY3VzIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJiRGVmZXJyZWRDb250ZXh0IiwiY2FsbEV4dGVuc2lvbiIsIm9JbnRlcm5hbE1vZGVsIiwiZ2V0TW9kZWwiLCJzZXRQcm9wZXJ0eSIsInNvdXJjZUJpbmRpbmdDb250ZXh0IiwiZ2V0T2JqZWN0IiwiYmluZGluZ0NvbnRleHQiLCJvRXZlbnQiLCJiT3ZlcnJpZGVOYXYiLCJvbkJlZm9yZU5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIkZDTExldmVsIiwiX2dldEZDTExldmVsIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldFByb3BlcnR5IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwic0hhc2giLCJnZXRIYXNoIiwiaW5kZXhPZiIsIm5hdkJhY2siLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJzRXJyb3JNZXNzYWdlIiwibmF2VG9IYXNoIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJkaXNwbGF5TWVzc2FnZVBhZ2UiLCJpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkiLCJfaXNWaWV3UGFydE9mUm91dGUiLCJyb3V0ZUluZm9ybWF0aW9uIiwiYVRhcmdldHMiLCJ0YXJnZXRzIiwidGFyZ2V0TmFtZSIsInZpZXdMZXZlbCIsInJvdXRlTGV2ZWwiLCJfc2V0QmluZGluZ0NvbnRleHQiLCJfYnVpbGRCaW5kaW5nUGF0aCIsInJvdXRlQXJndW1lbnRzIiwiYmluZGluZ1BhdHRlcm4iLCJuYXZpZ2F0aW9uUGFyYW1ldGVycyIsInBhdGgiLCJyZXBsYWNlIiwiZGVmZXJyZWQiLCJzS2V5Iiwic1ZhbHVlIiwiYlRhcmdldEVkaXRhYmxlIiwiaGFzT3duUHJvcGVydHkiLCJiQWN0aW9uQ3JlYXRlIiwiZ2V0UGFyYW1ldGVyIiwiZ2V0QmluZGluZ0NvbnRleHRQYXR0ZXJuIiwiY29udGV4dFBhdHRlcm4iLCJ1bmRlZmluZWQiLCJtQXJndW1lbnRzIiwiZ2V0UGFyYW1ldGVycyIsImFyZ3VtZW50cyIsIm9OYXZpZ2F0aW9uUGFyYW1ldGVycyIsIm9Nb2RlbCIsIm9PdXQiLCJfYmluZERlZmVycmVkIiwiX2JpbmRQYWdlIiwiZmluYWxseSIsInVwZGF0ZVVJU3RhdGVGb3JWaWV3Iiwic1RhcmdldFBhdGgiLCJvQXN5bmNDb250ZXh0IiwiY3JlYXRlRGVmZXJyZWRDb250ZXh0IiwidXNlQ29udGV4dCIsImN1cnJlbnRCaW5kaW5nQ29udGV4dCIsIl9nZXRCaW5kaW5nQ29udGV4dCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiZ2V0QmluZGluZyIsInJlc2V0Q2hhbmdlcyIsIl9iaW5kUGFnZVRvQ29udGV4dCIsIl9yZXNvbHZlU2VtYW50aWNQYXRoIiwic1RlY2huaWNhbFBhdGgiLCJfYmluZFBhZ2VUb1BhdGgiLCJvUmVzb3VyY2VCdW5kbGUiLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwiZ2V0VGV4dCIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJtZXNzYWdlIiwiX2NyZWF0ZUZpbHRlckZyb21TZW1hbnRpY1BhdGgiLCJzU2VtYW50aWNQYXRoIiwiYVNlbWFudGljS2V5cyIsIm9NZXRhTW9kZWwiLCJmblVucXVvdGVBbmREZWNvZGUiLCJsYXN0SW5kZXhPZiIsImxlbmd0aCIsImRlY29kZVVSSUNvbXBvbmVudCIsInN1YnN0cmluZyIsImFLZXlWYWx1ZXMiLCJzcGxpdCIsImFGaWx0ZXJzIiwiYkZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJNb2RlbEhlbHBlciIsImlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsInNLZXlWYWx1ZSIsIkZpbHRlciIsIiRQcm9wZXJ0eVBhdGgiLCJvcGVyYXRvciIsIkZpbHRlck9wZXJhdG9yIiwiRVEiLCJ2YWx1ZTEiLCJjYXNlU2Vuc2l0aXZlIiwibUtleVZhbHVlcyIsImZvckVhY2giLCJzS2V5QXNzaWdubWVudCIsImFQYXJ0cyIsImJGYWlsZWQiLCJtYXAiLCJvU2VtYW50aWNLZXkiLCJvRHJhZnRGaWx0ZXIiLCJmaWx0ZXJzIiwiYW5kIiwicHVzaCIsIl9nZXRUZWNobmljYWxQYXRoRnJvbVNlbWFudGljUGF0aCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YUNvbnRleHQiLCJnZXRQYXRoIiwib0ZpbHRlciIsInN0YXJ0c1dpdGgiLCJvTGlzdEJpbmRpbmciLCJiaW5kTGlzdCIsInJlcXVlc3RDb250ZXh0cyIsIm9Db250ZXh0cyIsIl9jaGVja1BhdGhGb3JTZW1hbnRpY0Jvb2ttYXJraW5nIiwic1BhdGgiLCJhTWF0Y2hlcyIsImV4ZWMiLCJvRHJhZnRSb290Iiwib0RyYWZ0Tm9kZSIsInNQYXRoVG9SZXNvbHZlIiwib0xhc3RTZW1hbnRpY01hcHBpbmciLCJnZXRMYXN0U2VtYW50aWNNYXBwaW5nIiwic0N1cnJlbnRIYXNoTm9QYXJhbXMiLCJnZXRIYXNoQ2hhbmdlciIsInNSb290RW50aXR5TmFtZSIsInN1YnN0ciIsImJBbGxvd1NlbWFudGljQm9va21hcmsiLCJTZW1hbnRpY0tleUhlbHBlciIsImdldFNlbWFudGljS2V5cyIsInNlbWFudGljUGF0aCIsInRlY2huaWNhbFBhdGgiLCJzZXRMYXN0U2VtYW50aWNNYXBwaW5nIiwib0N1cnJlbnRDb250ZXh0Iiwic0N1cnJlbnRQYXRoIiwib1VzZUNvbnRleHQiLCJvVGFyZ2V0Q29udGV4dCIsIl9jcmVhdGVDb250ZXh0IiwiYlJlYXNvbklzSWFwcFN0YXRlIiwiRWRpdFN0YXRlIiwiaXNFZGl0U3RhdGVEaXJ0eSIsIl9yZWZyZXNoQmluZGluZ0NvbnRleHQiLCJvUGFyZW50TGlzdEJpbmRpbmciLCJvUm9vdFZpZXdDb250cm9sbGVyIiwiaXNGY2xFbmFibGVkIiwiX3NldEtlZXBBbGl2ZSIsImlzQ29udGV4dFVzZWRJblBhZ2VzIiwibGlzdEJpbmRpbmciLCJiRHJhZnROYXZpZ2F0aW9uIiwic2hvd1BsYWNlaG9sZGVyIiwiYlNob3dQbGFjZWhvbGRlciIsIm9QYWdlQ29tcG9uZW50Iiwic0VudGl0eVNldCIsImdldEVudGl0eVNldCIsInNDb250ZXh0UGF0aCIsImdldENvbnRleHRQYXRoIiwiJCRncm91cElkIiwiJCR1cGRhdGVHcm91cElkIiwiJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyIsIl9nZXRLZWVwQWxpdmVDb250ZXh0IiwicmVxdWVzdFByb3BlcnR5IiwicmVxdWVzdE9iamVjdCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsInNNZXNzYWdlc1BhdGgiLCIkc2VsZWN0Iiwib1ByZXZpb3VzQmluZGluZyIsImRlc3Ryb3kiLCJvSGlkZGVuQmluZGluZyIsImJpbmRDb250ZXh0IiwiYXR0YWNoRXZlbnRPbmNlIiwiQnVzeUxvY2tlciIsImxvY2siLCJfZGF0YVJlY2VpdmVkRXZlbnRIYW5kbGVyIiwiZ2V0Qm91bmRDb250ZXh0Iiwic0Vycm9yRGVzY3JpcHRpb24iLCJ1bmxvY2siLCJtZXNzYWdlSGFuZGxlciIsIm1QYXJhbXMiLCJzdGF0dXMiLCJpc0luaXRpYWxMb2FkNTAzRXJyb3IiLCJzaGVsbEJhY2siLCJpc0RhdGFSZWNlaXZlZEVycm9yIiwic2hvd01lc3NhZ2VzIiwib1NpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInNSb290Q29udGV4dFBhdGgiLCJhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMiLCJhUHJvcGVydHlQYXRocyIsIm9TaWRlRWZmZWN0cyIsIlRhcmdldFByb3BlcnRpZXMiLCJUYXJnZXRFbnRpdGllcyIsImdldEJpbmRpbmdQYXRocyIsIm9CaW5kaW5nIiwiYURlcGVuZGVudEJpbmRpbmdzIiwic1JlbGF0aXZlUGF0aCIsImdldENvbnRleHQiLCJzbGljZSIsImdldERlcGVuZGVudEJpbmRpbmdzIiwiaSIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwic1RhcmdldFByb3BlcnR5IiwiaW5kZXgiLCJjb25jYXQiLCJvUHJldmlvdXNDb250ZXh0Iiwib1RhcmdldENvbnRyb2wiLCJzZXRCaW5kaW5nQ29udGV4dCIsImlzS2VlcEFsaXZlIiwiYktlZXBBbGl2ZSIsImZuQmVmb3JlRGVzdHJveSIsImJSZXF1ZXN0TWVzc2FnZXMiLCJlbmRzV2l0aCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwic2V0S2VlcEFsaXZlIiwia2VwdEFsaXZlU2VnbWVudHMiLCJhZGRpdGlvbm5hbFNlZ21lbnRzIiwicG9wIiwia2VwdEFsaXZlUGF0aCIsImpvaW4iLCJvS2VlcEFsaXZlQ29udGV4dCIsImdldEtlZXBBbGl2ZUNvbnRleHQiLCJyZXZlcnNlIiwiYWRkaXRpb25uYWxQYXRoIiwic3dpdGNoRnVsbFNjcmVlbiIsIm9Tb3VyY2UiLCJvRkNMSGVscGVyTW9kZWwiLCJiSXNGdWxsU2NyZWVuIiwic05leHRMYXlvdXQiLCJnZXRSaWdodG1vc3RDb250ZXh0IiwiX3JvdXRpbmciLCJzTGF5b3V0Iiwid2FybmluZyIsImNsb3NlQ29sdW1uIiwib1ZpZXdEYXRhIiwiaXNEcmFmdFN1cHBvcnRlZCIsImRyYWZ0IiwicHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJub1ByZXNlcnZhdGlvbkNhY2hlIiwiRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJOYXZpZ2F0aW9uVHlwZSIsIkJhY2tOYXZpZ2F0aW9uIiwiQ29udHJvbGxlckV4dGVuc2lvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiSW50ZXJuYWxSb3V0aW5nLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXJQcm94eSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvcm91dGluZy9Sb3V0ZXJQcm94eVwiO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlV2l0aFVJNSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBtZXRob2RPdmVycmlkZSwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgU2VtYW50aWNLZXlIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU2VtYW50aWNLZXlIZWxwZXJcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9Sb3V0aW5nU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIFRlbXBsYXRlQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZUNvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgUm91dGVyIGZyb20gXCJzYXAvdWkvY29yZS9yb3V0aW5nL1JvdXRlclwiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclwiO1xuaW1wb3J0IEZpbHRlck9wZXJhdG9yIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyT3BlcmF0b3JcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcblxuLyoqXG4gKiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLkNvbnRyb2xsZXJFeHRlbnNpb24gQ29udHJvbGxlciBleHRlbnNpb259XG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsUm91dGluZ1xuICogQHByaXZhdGVcbiAqIEBzaW5jZSAxLjc0LjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxSb3V0aW5nXCIpXG5jbGFzcyBJbnRlcm5hbFJvdXRpbmcgZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJpdmF0ZSBiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cdHByaXZhdGUgX29WaWV3ITogVmlldztcblx0cHJpdmF0ZSBfb0FwcENvbXBvbmVudCE6IEFwcENvbXBvbmVudDtcblx0cHJpdmF0ZSBfb1BhZ2VDb21wb25lbnQhOiBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD4gfCBudWxsO1xuXHRwcml2YXRlIF9vUm91dGVyITogUm91dGVyO1xuXHRwcml2YXRlIF9vUm91dGluZ1NlcnZpY2UhOiBSb3V0aW5nU2VydmljZTtcblx0cHJpdmF0ZSBfb1JvdXRlclByb3h5ITogUm91dGVyUHJveHk7XG5cdHByaXZhdGUgX2ZuUm91dGVNYXRjaGVkQm91bmQhOiBGdW5jdGlvbjtcblx0cHJvdGVjdGVkIF9vVGFyZ2V0SW5mb3JtYXRpb246IGFueTtcblxuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkV4aXQoKSB7XG5cdFx0aWYgKHRoaXMuX29Sb3V0aW5nU2VydmljZSkge1xuXHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kKTtcblx0XHR9XG5cdH1cblxuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkluaXQoKSB7XG5cdFx0dGhpcy5fb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5fb1ZpZXcpO1xuXHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKHRoaXMuX29WaWV3KSBhcyBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD47XG5cdFx0dGhpcy5fb1JvdXRlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um91dGVyKCk7XG5cdFx0dGhpcy5fb1JvdXRlclByb3h5ID0gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb3V0ZXJQcm94eSgpO1xuXG5cdFx0aWYgKCF0aGlzLl9vQXBwQ29tcG9uZW50IHx8ICF0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGluaXRpYWxpemUgY29udHJvbGVyIGV4dGVuc2lvbiAnc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVzaW9ucy5JbnRlcm5hbFJvdXRpbmdcIik7XG5cdFx0fVxuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpZiAodGhpcy5fb0FwcENvbXBvbmVudCA9PT0gdGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdC8vIFRoZSB2aWV3IGlzbid0IGhvc3RlZCBpbiBhIGRlZGljYXRlZCBVSUNvbXBvbmVudCwgYnV0IGRpcmVjdGx5IGluIHRoZSBhcHBcblx0XHRcdC8vIC0tPiBqdXN0IGtlZXAgdGhlIHZpZXdcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ID0gbnVsbDtcblx0XHR9XG5cblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHQuZ2V0U2VydmljZShcInJvdXRpbmdTZXJ2aWNlXCIpXG5cdFx0XHQudGhlbigob1JvdXRpbmdTZXJ2aWNlOiBSb3V0aW5nU2VydmljZSkgPT4ge1xuXHRcdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UgPSBvUm91dGluZ1NlcnZpY2U7XG5cdFx0XHRcdHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQgPSB0aGlzLl9vblJvdXRlTWF0Y2hlZC5iaW5kKHRoaXMpO1xuXHRcdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UuYXR0YWNoUm91dGVNYXRjaGVkKHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQpO1xuXHRcdFx0XHR0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24gPSBvUm91dGluZ1NlcnZpY2UuZ2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3IodGhpcy5fb1BhZ2VDb21wb25lbnQgfHwgdGhpcy5fb1ZpZXcpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIlRoaXMgY29udHJvbGxlciBleHRlbnNpb24gY2Fubm90IHdvcmsgd2l0aG91dCBhICdyb3V0aW5nU2VydmljZScgb24gdGhlIG1haW4gQXBwQ29tcG9uZW50XCIpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVHJpZ2dlcmVkIGV2ZXJ5IHRpbWUgdGhpcyBjb250cm9sbGVyIGlzIGEgbmF2aWdhdGlvbiB0YXJnZXQuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUm91dGVNYXRjaGVkKCkge1xuXHRcdC8qKi9cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpIHtcblx0XHQvKiovXG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQmVmb3JlQmluZGluZyhvQmluZGluZ0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpIHtcblx0XHRjb25zdCBvUm91dGluZyA9ICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nICYmIG9Sb3V0aW5nLm9uQmVmb3JlQmluZGluZykge1xuXHRcdFx0b1JvdXRpbmcub25CZWZvcmVCaW5kaW5nKG9CaW5kaW5nQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25BZnRlckJpbmRpbmcob0JpbmRpbmdDb250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KSB7XG5cdFx0KHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5vbkNvbnRleHRCb3VuZFRvVmlldyhvQmluZGluZ0NvbnRleHQpO1xuXHRcdGNvbnN0IG9Sb3V0aW5nID0gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkucm91dGluZztcblx0XHRpZiAob1JvdXRpbmcgJiYgb1JvdXRpbmcub25BZnRlckJpbmRpbmcpIHtcblx0XHRcdG9Sb3V0aW5nLm9uQWZ0ZXJCaW5kaW5nKG9CaW5kaW5nQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHRcdH1cblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIE1ldGhvZHMgdHJpZ2dlcmluZyBhIG5hdmlnYXRpb24gYWZ0ZXIgYSB1c2VyIGFjdGlvblxuXHQvLyAoZS5nLiBjbGljayBvbiBhIHRhYmxlIHJvdywgYnV0dG9uLCBldGMuLi4pXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIG5hdmlnYXRpb24gdGFyZ2V0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gc05hdmlnYXRpb25UYXJnZXROYW1lIE5hdmlnYXRpb24gdGFyZ2V0IG5hbWVcblx0ICogQHBhcmFtIG9TZW1hbnRpY09iamVjdCBTZW1hbnRpYyBvYmplY3Rcblx0ICogQHBhcmFtIGJQcmVzZXJ2ZUhpc3RvcnkgVHJ1ZSB0byBmb3JjZSB0aGUgbmV3IFVSTCB0byBiZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBicm93c2VyIGhpc3RvcnkgKG5vIHJlcGxhY2UpXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9UYXJnZXQob0NvbnRleHQ6IGFueSwgc05hdmlnYXRpb25UYXJnZXROYW1lOiBzdHJpbmcsIG9TZW1hbnRpY09iamVjdD86IG9iamVjdCwgYlByZXNlcnZlSGlzdG9yeT86IGJvb2xlYW4pIHtcblx0XHRjb25zdCBvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gPVxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgJiZcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uICYmXG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihzTmF2aWdhdGlvblRhcmdldE5hbWUpO1xuXHRcdGlmIChvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24pIHtcblx0XHRcdGNvbnN0IG9EZXRhaWxSb3V0ZSA9IG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbi5kZXRhaWw7XG5cdFx0XHRjb25zdCBzUm91dGVOYW1lID0gb0RldGFpbFJvdXRlLnJvdXRlO1xuXHRcdFx0Y29uc3QgbVBhcmFtZXRlck1hcHBpbmcgPSBvRGV0YWlsUm91dGUucGFyYW1ldGVycztcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBzUm91dGVOYW1lLCBtUGFyYW1ldGVyTWFwcGluZywgYlByZXNlcnZlSGlzdG9yeSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBudWxsLCBudWxsLCBiUHJlc2VydmVIaXN0b3J5KTtcblx0XHR9XG5cdFx0dGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gdGhlIHNwZWNpZmllZCBuYXZpZ2F0aW9uIHRhcmdldCByb3V0ZS5cblx0ICpcblx0ICogQHBhcmFtIHNUYXJnZXRSb3V0ZU5hbWUgTmFtZSBvZiB0aGUgdGFyZ2V0IHJvdXRlXG5cdCAqIEBwYXJhbSBbb1BhcmFtZXRlcnNdIFBhcmFtZXRlcnMgdG8gYmUgdXNlZCB3aXRoIHJvdXRlIHRvIGNyZWF0ZSB0aGUgdGFyZ2V0IGhhc2hcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9Sb3V0ZShzVGFyZ2V0Um91dGVOYW1lOiBzdHJpbmcsIG9QYXJhbWV0ZXJzPzogb2JqZWN0KSB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZSwgb1BhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRjb25zdCBvQ29udGV4dEluZm86IGFueSA9IHt9O1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cblx0XHRpZiAob0NvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5hc3luY0NvbnRleHQpIHtcblx0XHRcdFx0Ly8gdGhlIGNvbnRleHQgaXMgZWl0aGVyIGNyZWF0ZWQgYXN5bmMgKFByb21pc2UpXG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gYWN0aXZhdGUgdGhlIHJvdXRlTWF0Y2hTeW5jaHJvIG9uIHRoZSBSb3V0ZXJQcm94eSB0byBhdm9pZCB0aGF0XG5cdFx0XHRcdC8vIHRoZSBzdWJzZXF1ZW50IGNhbGwgdG8gbmF2aWdhdGVUb0NvbnRleHQgY29uZmxpY3RzIHdpdGggdGhlIGN1cnJlbnQgb25lXG5cdFx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5hY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24oKTtcblxuXHRcdFx0XHRtUGFyYW1ldGVycy5hc3luY0NvbnRleHRcblx0XHRcdFx0XHQudGhlbigoYXN5bmNDb250ZXh0OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdC8vIG9uY2UgdGhlIGNvbnRleHQgaXMgcmV0dXJuZWQgd2UgbmF2aWdhdGUgaW50byBpdFxuXHRcdFx0XHRcdFx0dGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChhc3luY0NvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IG1QYXJhbWV0ZXJzLmNoZWNrTm9IYXNoQ2hhbmdlLFxuXHRcdFx0XHRcdFx0XHRlZGl0YWJsZTogbVBhcmFtZXRlcnMuZWRpdGFibGUsXG5cdFx0XHRcdFx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IG1QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRcdFx0XHRcdHVwZGF0ZUZDTExldmVsOiBtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCxcblx0XHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IG1QYXJhbWV0ZXJzLmJGb3JjZUZvY3VzXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdpdGggdGhlIGFzeW5jIGNvbnRleHRcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAoIW1QYXJhbWV0ZXJzLmJEZWZlcnJlZENvbnRleHQpIHtcblx0XHRcdFx0Ly8gTmF2aWdhdGUgdG8gYSBsaXN0IGJpbmRpbmcgbm90IHlldCBzdXBwb3J0ZWRcblx0XHRcdFx0dGhyb3cgXCJuYXZpZ2F0aW9uIHRvIGEgbGlzdCBiaW5kaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNhbGxFeHRlbnNpb24pIHtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBudWxsKTtcblxuXHRcdFx0b0NvbnRleHRJbmZvLnNvdXJjZUJpbmRpbmdDb250ZXh0ID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRvQ29udGV4dEluZm8uYmluZGluZ0NvbnRleHQgPSBvQ29udGV4dDtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5vRXZlbnQpIHtcblx0XHRcdFx0b0NvbnRleHRJbmZvLm9FdmVudCA9IG1QYXJhbWV0ZXJzLm9FdmVudDtcblx0XHRcdH1cblx0XHRcdC8vIFN0b3JpbmcgdGhlIHNlbGVjdGVkIGNvbnRleHQgdG8gdXNlIGl0IGluIGludGVybmFsIHJvdXRlIG5hdmlnYXRpb24gaWYgbmVjY2Vzc2FyeS5cblx0XHRcdGNvbnN0IGJPdmVycmlkZU5hdiA9ICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLnJvdXRpbmcub25CZWZvcmVOYXZpZ2F0aW9uKG9Db250ZXh0SW5mbyk7XG5cdFx0XHRpZiAoYk92ZXJyaWRlTmF2KSB7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3BhZ2luYXRvckN1cnJlbnRDb250ZXh0XCIsIG9Db250ZXh0KTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMuRkNMTGV2ZWwgPSB0aGlzLl9nZXRGQ0xMZXZlbCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgbVBhcmFtZXRlcnMsIHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCksIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbik7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2t3YXJkcyBmcm9tIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgdG8gYmUgbmF2aWdhdGVkIGZyb21cblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpIHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdG1QYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsID0gLTE7XG5cblx0XHRyZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBmb3J3YXJkcyB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwibWVzc2FnZUZvb3RlckNvbnRhaW5zRXJyb3JzXCIpID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHRcdH1cblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdG1QYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsID0gMTtcblxuXHRcdHJldHVybiB0aGlzLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2sgaW4gaGlzdG9yeSBpZiB0aGUgY3VycmVudCBoYXNoIGNvcnJlc3BvbmRzIHRvIGEgdHJhbnNpZW50IHN0YXRlLlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpIHtcblx0XHRjb25zdCBzSGFzaCA9IHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCk7XG5cblx0XHQvLyBpZiB0cmlnZ2VyZWQgd2hpbGUgbmF2aWdhdGluZyB0byAoLi4uKSwgd2UgbmVlZCB0byBuYXZpZ2F0ZSBiYWNrXG5cdFx0aWYgKHNIYXNoLmluZGV4T2YoXCIoLi4uKVwiKSAhPT0gLTEpIHtcblx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5uYXZCYWNrKCk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9NZXNzYWdlUGFnZShzRXJyb3JNZXNzYWdlOiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdGlmIChcblx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCkuaW5kZXhPZihcImktYWN0aW9uPWNyZWF0ZVwiKSA+IC0xIHx8XG5cdFx0XHR0aGlzLl9vUm91dGVyUHJveHkuZ2V0SGFzaCgpLmluZGV4T2YoXCJpLWFjdGlvbj1hdXRvQ3JlYXRlXCIpID4gLTFcblx0XHQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGVyUHJveHkubmF2VG9IYXNoKHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXREZWZhdWx0Q3JlYXRlSGFzaCgpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMuRkNMTGV2ZWwgPSB0aGlzLl9nZXRGQ0xMZXZlbCgpO1xuXG5cdFx0XHRyZXR1cm4gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5kaXNwbGF5TWVzc2FnZVBhZ2Uoc0Vycm9yTWVzc2FnZSwgbVBhcmFtZXRlcnMpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgb25lIG9mIHRoZSBjdXJyZW50IHZpZXdzIG9uIHRoZSBzY3JlZW4gaXMgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHRcblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBzdGF0ZSBpcyBpbXBhY3RlZCBieSB0aGUgY29udGV4dFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkob0NvbnRleHQ6IGFueSkge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UuaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KG9Db250ZXh0KTtcblx0fVxuXG5cdF9pc1ZpZXdQYXJ0T2ZSb3V0ZShyb3V0ZUluZm9ybWF0aW9uOiBhbnkpOiBib29sZWFuIHtcblx0XHRjb25zdCBhVGFyZ2V0cyA9IHJvdXRlSW5mb3JtYXRpb24/LnRhcmdldHM7XG5cdFx0aWYgKCFhVGFyZ2V0cyB8fCBhVGFyZ2V0cy5pbmRleE9mKHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi50YXJnZXROYW1lKSA9PT0gLTEpIHtcblx0XHRcdC8vIElmIHRoZSB0YXJnZXQgZm9yIHRoaXMgdmlldyBoYXMgYSB2aWV3IGxldmVsIGdyZWF0ZXIgdGhhbiB0aGUgcm91dGUgbGV2ZWwsIGl0IG1lYW5zIHRoaXMgdmlldyBjb21lcyBcImFmdGVyXCIgdGhlIHJvdXRlXG5cdFx0XHQvLyBpbiB0ZXJtcyBvZiBuYXZpZ2F0aW9uLlxuXHRcdFx0Ly8gSW4gc3VjaCBjYXNlLCB3ZSByZW1vdmUgaXRzIGJpbmRpbmcgY29udGV4dCwgdG8gYXZvaWQgdGhpcyB2aWV3IHRvIGhhdmUgZGF0YSBpZiB3ZSBuYXZpZ2F0ZSB0byBpdCBsYXRlciBvblxuXHRcdFx0aWYgKCh0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24udmlld0xldmVsID8/IDApID49IChyb3V0ZUluZm9ybWF0aW9uPy5yb3V0ZUxldmVsID8/IDApKSB7XG5cdFx0XHRcdHRoaXMuX3NldEJpbmRpbmdDb250ZXh0KG51bGwpOyAvLyBUaGlzIGFsc28gY2FsbCBzZXRLZWVwQWxpdmUoZmFsc2UpIG9uIHRoZSBjdXJyZW50IGNvbnRleHRcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdF9idWlsZEJpbmRpbmdQYXRoKHJvdXRlQXJndW1lbnRzOiBhbnksIGJpbmRpbmdQYXR0ZXJuOiBzdHJpbmcsIG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBhbnkpOiB7IHBhdGg6IHN0cmluZzsgZGVmZXJyZWQ6IGJvb2xlYW4gfSB7XG5cdFx0bGV0IHBhdGggPSBiaW5kaW5nUGF0dGVybi5yZXBsYWNlKFwiOj9xdWVyeTpcIiwgXCJcIik7XG5cdFx0bGV0IGRlZmVycmVkID0gZmFsc2U7XG5cblx0XHRmb3IgKGNvbnN0IHNLZXkgaW4gcm91dGVBcmd1bWVudHMpIHtcblx0XHRcdGNvbnN0IHNWYWx1ZSA9IHJvdXRlQXJndW1lbnRzW3NLZXldO1xuXHRcdFx0aWYgKHNWYWx1ZSA9PT0gXCIuLi5cIiAmJiBiaW5kaW5nUGF0dGVybi5pbmRleE9mKGB7JHtzS2V5fX1gKSA+PSAwKSB7XG5cdFx0XHRcdGRlZmVycmVkID0gdHJ1ZTtcblx0XHRcdFx0Ly8gU29tZXRpbWVzIGluIHByZWZlcnJlZE1vZGUgPSBjcmVhdGUsIHRoZSBlZGl0IGJ1dHRvbiBpcyBzaG93biBpbiBiYWNrZ3JvdW5kIHdoZW4gdGhlXG5cdFx0XHRcdC8vIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nIHNob3dzIHVwLCBzZXR0aW5nIGJUYXJnZXRFZGl0YWJsZSBwYXNzZXMgZWRpdGFibGUgYXMgdHJ1ZVxuXHRcdFx0XHQvLyB0byBvbkJlZm9yZUJpbmRpbmcgaW4gX2JpbmRUYXJnZXRQYWdlIGZ1bmN0aW9uXG5cdFx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRwYXRoID0gcGF0aC5yZXBsYWNlKGB7JHtzS2V5fX1gLCBzVmFsdWUpO1xuXHRcdH1cblx0XHRpZiAocm91dGVBcmd1bWVudHNbXCI/cXVlcnlcIl0gJiYgcm91dGVBcmd1bWVudHNbXCI/cXVlcnlcIl0uaGFzT3duUHJvcGVydHkoXCJpLWFjdGlvblwiKSkge1xuXHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuYkFjdGlvbkNyZWF0ZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gdGhlIGJpbmRpbmcgcGF0aCBpcyBhbHdheXMgYWJzb2x1dGVcblx0XHRpZiAocGF0aCAmJiBwYXRoWzBdICE9PSBcIi9cIikge1xuXHRcdFx0cGF0aCA9IGAvJHtwYXRofWA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHsgcGF0aCwgZGVmZXJyZWQgfTtcblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIE1ldGhvZHMgdG8gYmluZCB0aGUgcGFnZSB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZFxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiBhIHJvdXRlIGlzIG1hdGNoZWQuXG5cdCAqIEJ1aWxkcyB0aGUgYmluZGluZyBjb250ZXh0IGZyb20gdGhlIG5hdmlnYXRpb24gcGFyYW1ldGVycywgYW5kIGJpbmQgdGhlIHBhZ2UgYWNjb3JkaW5nbHkuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRXZlbnRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfb25Sb3V0ZU1hdGNoZWQob0V2ZW50OiBFdmVudCkge1xuXHRcdC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgZm9yIHRoaXMgdmlldyBpcyBwYXJ0IG9mIHRoZSBldmVudCB0YXJnZXRzIChpLmUuIGlzIGEgdGFyZ2V0IGZvciB0aGUgY3VycmVudCByb3V0ZSkuXG5cdFx0Ly8gSWYgbm90LCB3ZSBkb24ndCBuZWVkIHRvIGJpbmQgaXQgLS0+IHJldHVyblxuXHRcdGlmICghdGhpcy5faXNWaWV3UGFydE9mUm91dGUob0V2ZW50LmdldFBhcmFtZXRlcihcInJvdXRlSW5mb3JtYXRpb25cIikpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmV0cmlldmUgdGhlIGJpbmRpbmcgY29udGV4dCBwYXR0ZXJuXG5cdFx0bGV0IGJpbmRpbmdQYXR0ZXJuO1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4pIHtcblx0XHRcdGJpbmRpbmdQYXR0ZXJuID0gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHRQYXR0ZXJuKCk7XG5cdFx0fVxuXHRcdGJpbmRpbmdQYXR0ZXJuID0gYmluZGluZ1BhdHRlcm4gfHwgdGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLmNvbnRleHRQYXR0ZXJuO1xuXG5cdFx0aWYgKGJpbmRpbmdQYXR0ZXJuID09PSBudWxsIHx8IGJpbmRpbmdQYXR0ZXJuID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIERvbid0IGRvIHRoaXMgaWYgd2UgYWxyZWFkeSBnb3Qgc1RhcmdldCA9PSAnJywgd2hpY2ggaXMgYSB2YWxpZCB0YXJnZXQgcGF0dGVyblxuXHRcdFx0YmluZGluZ1BhdHRlcm4gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVQYXR0ZXJuXCIpO1xuXHRcdH1cblxuXHRcdC8vIFJlcGxhY2UgdGhlIHBhcmFtZXRlcnMgYnkgdGhlaXIgdmFsdWVzIGluIHRoZSBiaW5kaW5nIGNvbnRleHQgcGF0dGVyblxuXHRcdGNvbnN0IG1Bcmd1bWVudHMgPSAob0V2ZW50LmdldFBhcmFtZXRlcnMoKSBhcyBhbnkpLmFyZ3VtZW50cztcblx0XHRjb25zdCBvTmF2aWdhdGlvblBhcmFtZXRlcnMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwibmF2aWdhdGlvbkluZm9cIik7XG5cdFx0Y29uc3QgeyBwYXRoLCBkZWZlcnJlZCB9ID0gdGhpcy5fYnVpbGRCaW5kaW5nUGF0aChtQXJndW1lbnRzLCBiaW5kaW5nUGF0dGVybiwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblxuXHRcdHRoaXMub25Sb3V0ZU1hdGNoZWQoKTtcblxuXHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbDtcblx0XHRsZXQgb091dDtcblx0XHRpZiAoZGVmZXJyZWQpIHtcblx0XHRcdG9PdXQgPSB0aGlzLl9iaW5kRGVmZXJyZWQocGF0aCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b091dCA9IHRoaXMuX2JpbmRQYWdlKHBhdGgsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvY2F0Y2gtb3ItcmV0dXJuXG5cdFx0b091dC5maW5hbGx5KCgpID0+IHtcblx0XHRcdHRoaXMub25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpO1xuXHRcdH0pO1xuXG5cdFx0KHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS51cGRhdGVVSVN0YXRlRm9yVmlldyh0aGlzLl9vVmlldywgdGhpcy5fZ2V0RkNMTGV2ZWwoKSk7XG5cdH1cblxuXHQvKipcblx0ICogRGVmZXJyZWQgYmluZGluZyAoZHVyaW5nIG9iamVjdCBjcmVhdGlvbikuXG5cdCAqXG5cdCAqIEBwYXJhbSBzVGFyZ2V0UGF0aCBUaGUgcGF0aCB0byB0aGUgZGVmZmVyZWQgY29udGV4dFxuXHQgKiBAcGFyYW0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIFByb21pc2Vcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfYmluZERlZmVycmVkKHNUYXJnZXRQYXRoOiBzdHJpbmcsIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogYW55KSB7XG5cdFx0dGhpcy5vbkJlZm9yZUJpbmRpbmcobnVsbCwgeyBlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSB9KTtcblxuXHRcdGlmIChvTmF2aWdhdGlvblBhcmFtZXRlcnMuYkRlZmVycmVkQ29udGV4dCB8fCAhb05hdmlnYXRpb25QYXJhbWV0ZXJzLm9Bc3luY0NvbnRleHQpIHtcblx0XHRcdC8vIGVpdGhlciB0aGUgY29udGV4dCBzaGFsbCBiZSBjcmVhdGVkIGluIHRoZSB0YXJnZXQgcGFnZSAoZGVmZXJyZWQgQ29udGV4dCkgb3IgaXQgc2hhbGxcblx0XHRcdC8vIGJlIGNyZWF0ZWQgYXN5bmMgYnV0IHRoZSB1c2VyIHJlZnJlc2hlZCB0aGUgcGFnZSAvIGJvb2ttYXJrZWQgdGhpcyBVUkxcblx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSB0aGUgdGFyZ2V0IGNvbXBvbmVudCBjcmVhdGVzIHRoaXMgZG9jdW1lbnQgYnV0IHdlIHNoYWxsIG1vdmUgdGhpcyB0b1xuXHRcdFx0Ly8gYSBjZW50cmFsIHBsYWNlXG5cdFx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQgJiYgdGhpcy5fb1BhZ2VDb21wb25lbnQuY3JlYXRlRGVmZXJyZWRDb250ZXh0KSB7XG5cdFx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmNyZWF0ZURlZmVycmVkQ29udGV4dChcblx0XHRcdFx0XHRzVGFyZ2V0UGF0aCxcblx0XHRcdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMudXNlQ29udGV4dCxcblx0XHRcdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMuYkFjdGlvbkNyZWF0ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IGN1cnJlbnRCaW5kaW5nQ29udGV4dCA9IHRoaXMuX2dldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0aWYgKGN1cnJlbnRCaW5kaW5nQ29udGV4dD8uaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0Ly8gRm9yIG5vdyByZW1vdmUgdGhlIHBlbmRpbmcgY2hhbmdlcyB0byBhdm9pZCB0aGUgbW9kZWwgcmFpc2VzIGVycm9ycyBhbmQgdGhlIG9iamVjdCBwYWdlIGlzIGF0IGxlYXN0IGJvdW5kXG5cdFx0XHQvLyBJZGVhbGx5IHRoZSB1c2VyIHNob3VsZCBiZSBhc2tlZCBmb3Jcblx0XHRcdGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXG5cdFx0Ly8gcmVtb3ZlIHRoZSBjb250ZXh0IHRvIGF2b2lkIHNob3dpbmcgb2xkIGRhdGFcblx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblxuXHRcdHRoaXMub25BZnRlckJpbmRpbmcobnVsbCk7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBmcm9tIGEgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHNUYXJnZXRQYXRoIFRoZSBwYXRoIHRvIHRoZSBjb250ZXh0XG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBiaW5kaW5nIGhhcyBiZWVuIHNldCBvbiB0aGUgcGFnZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9iaW5kUGFnZShzVGFyZ2V0UGF0aDogc3RyaW5nLCBvTW9kZWw6IE9EYXRhTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogb2JqZWN0KSB7XG5cdFx0aWYgKHNUYXJnZXRQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KG51bGwsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9yZXNvbHZlU2VtYW50aWNQYXRoKHNUYXJnZXRQYXRoLCBvTW9kZWwpXG5cdFx0XHRcdC50aGVuKChzVGVjaG5pY2FsUGF0aDogYW55KSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fYmluZFBhZ2VUb1BhdGgoc1RlY2huaWNhbFBhdGgsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHRcdC8vIEVycm9yIGhhbmRsaW5nIGZvciBlcnJvbmVvdXMgbWV0YWRhdGEgcmVxdWVzdFxuXHRcdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksIHtcblx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IG9FcnJvci5tZXNzYWdlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSBmaWx0ZXIgdG8gcmV0cmlldmUgYSBjb250ZXh0IGNvcnJlc3BvbmRpbmcgdG8gYSBzZW1hbnRpYyBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1NlbWFudGljUGF0aCBUaGUgc2VtYW50aWMgcGF0aFxuXHQgKiBAcGFyYW0gYVNlbWFudGljS2V5cyBUaGUgc2VtYW50aWMga2V5cyBmb3IgdGhlIHBhdGhcblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIGluc3RhbmNlIG9mIHRoZSBtZXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIFRoZSBmaWx0ZXJcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfY3JlYXRlRmlsdGVyRnJvbVNlbWFudGljUGF0aChzU2VtYW50aWNQYXRoOiBzdHJpbmcsIGFTZW1hbnRpY0tleXM6IGFueVtdLCBvTWV0YU1vZGVsOiBvYmplY3QpIHtcblx0XHRjb25zdCBmblVucXVvdGVBbmREZWNvZGUgPSBmdW5jdGlvbiAoc1ZhbHVlOiBhbnkpIHtcblx0XHRcdGlmIChzVmFsdWUuaW5kZXhPZihcIidcIikgPT09IDAgJiYgc1ZhbHVlLmxhc3RJbmRleE9mKFwiJ1wiKSA9PT0gc1ZhbHVlLmxlbmd0aCAtIDEpIHtcblx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBxdW90ZXMgZnJvbSB0aGUgdmFsdWUgYW5kIGRlY29kZSBzcGVjaWFsIGNoYXJzXG5cdFx0XHRcdHNWYWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChzVmFsdWUuc3Vic3RyaW5nKDEsIHNWYWx1ZS5sZW5ndGggLSAxKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc1ZhbHVlO1xuXHRcdH07XG5cdFx0Y29uc3QgYUtleVZhbHVlcyA9IHNTZW1hbnRpY1BhdGguc3Vic3RyaW5nKHNTZW1hbnRpY1BhdGguaW5kZXhPZihcIihcIikgKyAxLCBzU2VtYW50aWNQYXRoLmxlbmd0aCAtIDEpLnNwbGl0KFwiLFwiKTtcblx0XHRsZXQgYUZpbHRlcnM6IEZpbHRlcltdO1xuXG5cdFx0aWYgKGFTZW1hbnRpY0tleXMubGVuZ3RoICE9IGFLZXlWYWx1ZXMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRjb25zdCBiRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSA9IE1vZGVsSGVscGVyLmlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShvTWV0YU1vZGVsKTtcblxuXHRcdGlmIChhU2VtYW50aWNLZXlzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0Ly8gVGFrZSB0aGUgZmlyc3Qga2V5IHZhbHVlXG5cdFx0XHRjb25zdCBzS2V5VmFsdWUgPSBmblVucXVvdGVBbmREZWNvZGUoYUtleVZhbHVlc1swXSk7XG5cdFx0XHRhRmlsdGVycyA9IFtcblx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0cGF0aDogYVNlbWFudGljS2V5c1swXS4kUHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvci5FUSxcblx0XHRcdFx0XHR2YWx1ZTE6IHNLZXlWYWx1ZSxcblx0XHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBiRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZVxuXHRcdFx0XHR9KVxuXHRcdFx0XTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgbUtleVZhbHVlczogYW55ID0ge307XG5cdFx0XHQvLyBDcmVhdGUgYSBtYXAgb2YgYWxsIGtleSB2YWx1ZXNcblx0XHRcdGFLZXlWYWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAoc0tleUFzc2lnbm1lbnQ6IHN0cmluZykge1xuXHRcdFx0XHRjb25zdCBhUGFydHMgPSBzS2V5QXNzaWdubWVudC5zcGxpdChcIj1cIiksXG5cdFx0XHRcdFx0c0tleVZhbHVlID0gZm5VbnF1b3RlQW5kRGVjb2RlKGFQYXJ0c1sxXSk7XG5cblx0XHRcdFx0bUtleVZhbHVlc1thUGFydHNbMF1dID0gc0tleVZhbHVlO1xuXHRcdFx0fSk7XG5cblx0XHRcdGxldCBiRmFpbGVkID0gZmFsc2U7XG5cdFx0XHRhRmlsdGVycyA9IGFTZW1hbnRpY0tleXMubWFwKGZ1bmN0aW9uIChvU2VtYW50aWNLZXk6IGFueSkge1xuXHRcdFx0XHRjb25zdCBzS2V5ID0gb1NlbWFudGljS2V5LiRQcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0c1ZhbHVlID0gbUtleVZhbHVlc1tzS2V5XTtcblxuXHRcdFx0XHRpZiAoc1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRwYXRoOiBzS2V5LFxuXHRcdFx0XHRcdFx0b3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLkVRLFxuXHRcdFx0XHRcdFx0dmFsdWUxOiBzVmFsdWUsXG5cdFx0XHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBiRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGJGYWlsZWQgPSB0cnVlO1xuXHRcdFx0XHRcdHJldHVybiBuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdHBhdGg6IFwiWFhcIlxuXHRcdFx0XHRcdH0pOyAvLyB3aWxsIGJlIGlnbm9yZSBhbnl3YXkgc2luY2Ugd2UgcmV0dXJuIGFmdGVyXG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoYkZhaWxlZCkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgYSBkcmFmdCBmaWx0ZXIgdG8gbWFrZSBzdXJlIHdlIHRha2UgdGhlIGRyYWZ0IGVudGl0eSBpZiB0aGVyZSBpcyBvbmVcblx0XHQvLyBPciB0aGUgYWN0aXZlIGVudGl0eSBvdGhlcndpc2Vcblx0XHRjb25zdCBvRHJhZnRGaWx0ZXIgPSBuZXcgRmlsdGVyKHtcblx0XHRcdGZpbHRlcnM6IFtuZXcgRmlsdGVyKFwiSXNBY3RpdmVFbnRpdHlcIiwgXCJFUVwiLCBmYWxzZSksIG5ldyBGaWx0ZXIoXCJTaWJsaW5nRW50aXR5L0lzQWN0aXZlRW50aXR5XCIsIFwiRVFcIiwgbnVsbCldLFxuXHRcdFx0YW5kOiBmYWxzZVxuXHRcdH0pO1xuXHRcdGFGaWx0ZXJzLnB1c2gob0RyYWZ0RmlsdGVyKTtcblxuXHRcdHJldHVybiBuZXcgRmlsdGVyKGFGaWx0ZXJzLCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIHBhdGggd2l0aCBzZW1hbnRpYyBrZXlzIHRvIGEgcGF0aCB3aXRoIHRlY2huaWNhbCBrZXlzLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1NlbWFudGljUGF0aCBUaGUgcGF0aCB3aXRoIHNlbWFudGljIGtleXNcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgbW9kZWwgZm9yIHRoZSBwYXRoXG5cdCAqIEBwYXJhbSBhU2VtYW50aWNLZXlzIFRoZSBzZW1hbnRpYyBrZXlzIGZvciB0aGUgcGF0aFxuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgY29udGFpbmluZyB0aGUgcGF0aCB3aXRoIHRlY2huaWNhbCBrZXlzIGlmIHNTZW1hbnRpY1BhdGggY291bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYSBzZW1hbnRpYyBwYXRoLCBudWxsIG90aGVyd2lzZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9nZXRUZWNobmljYWxQYXRoRnJvbVNlbWFudGljUGF0aChzU2VtYW50aWNQYXRoOiBzdHJpbmcsIG9Nb2RlbDogYW55LCBhU2VtYW50aWNLZXlzOiBhbnlbXSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IHNFbnRpdHlTZXRQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChzU2VtYW50aWNQYXRoKS5nZXRQYXRoKCk7XG5cblx0XHRpZiAoIWFTZW1hbnRpY0tleXMgfHwgYVNlbWFudGljS2V5cy5sZW5ndGggPT09IDApIHtcblx0XHRcdC8vIE5vIHNlbWFudGljIGtleXNcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG5cdFx0fVxuXG5cdFx0Ly8gQ3JlYXRlIGEgc2V0IG9mIGZpbHRlcnMgY29ycmVzcG9uZGluZyB0byBhbGwga2V5c1xuXHRcdGNvbnN0IG9GaWx0ZXIgPSB0aGlzLl9jcmVhdGVGaWx0ZXJGcm9tU2VtYW50aWNQYXRoKHNTZW1hbnRpY1BhdGgsIGFTZW1hbnRpY0tleXMsIG9NZXRhTW9kZWwpO1xuXHRcdGlmIChvRmlsdGVyID09PSBudWxsKSB7XG5cdFx0XHQvLyBDb3VsZG4ndCBpbnRlcnByZXQgdGhlIHBhdGggYXMgYSBzZW1hbnRpYyBvbmVcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG5cdFx0fVxuXG5cdFx0Ly8gTG9hZCB0aGUgY29ycmVzcG9uZGluZyBvYmplY3Rcblx0XHRpZiAoIXNFbnRpdHlTZXRQYXRoPy5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0c0VudGl0eVNldFBhdGggPSBgLyR7c0VudGl0eVNldFBhdGh9YDtcblx0XHR9XG5cdFx0Y29uc3Qgb0xpc3RCaW5kaW5nID0gb01vZGVsLmJpbmRMaXN0KHNFbnRpdHlTZXRQYXRoLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgb0ZpbHRlciwge1xuXHRcdFx0XCIkJGdyb3VwSWRcIjogXCIkYXV0by5IZXJvZXNcIlxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIG9MaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwgMikudGhlbihmdW5jdGlvbiAob0NvbnRleHRzOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udGV4dHMgJiYgb0NvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRleHRzWzBdLmdldFBhdGgoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIE5vIGRhdGEgY291bGQgYmUgbG9hZGVkXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIHBhdGggaXMgZWxpZ2libGUgZm9yIHNlbWFudGljIGJvb2ttYXJraW5nLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1BhdGggVGhlIHBhdGggdG8gdGVzdFxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhdGggaXMgZWxpZ2libGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfY2hlY2tQYXRoRm9yU2VtYW50aWNCb29rbWFya2luZyhzUGF0aDogc3RyaW5nLCBvTWV0YU1vZGVsOiBhbnkpIHtcblx0XHQvLyBPbmx5IHBhdGggb24gcm9vdCBvYmplY3RzIGFsbG93IHNlbWFudGljIGJvb2ttYXJraW5nLCBpLmUuIHNQYXRoID0geHh4KHl5eSlcblx0XHRjb25zdCBhTWF0Y2hlcyA9IC9eW1xcL10/KFxcdyspXFwoW15cXC9dK1xcKSQvLmV4ZWMoc1BhdGgpO1xuXHRcdGlmICghYU1hdGNoZXMpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Ly8gR2V0IHRoZSBlbnRpdHlTZXQgbmFtZVxuXHRcdGNvbnN0IHNFbnRpdHlTZXRQYXRoID0gYC8ke2FNYXRjaGVzWzFdfWA7XG5cdFx0Ly8gQ2hlY2sgdGhlIGVudGl0eSBzZXQgc3VwcG9ydHMgZHJhZnQgKG90aGVyd2lzZSB3ZSBkb24ndCBzdXBwb3J0IHNlbWFudGljIGJvb2ttYXJraW5nKVxuXHRcdGNvbnN0IG9EcmFmdFJvb3QgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzRW50aXR5U2V0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdGApO1xuXHRcdGNvbnN0IG9EcmFmdE5vZGUgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzRW50aXR5U2V0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZWApO1xuXHRcdHJldHVybiBvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUgPyB0cnVlIDogZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogQnVpbGRzIGEgcGF0aCB3aXRoIHNlbWFudGljIGtleXMgZnJvbSBhIHBhdGggd2l0aCB0ZWNobmljYWwga2V5cy5cblx0ICpcblx0ICogQHBhcmFtIHNQYXRoVG9SZXNvbHZlIFRoZSBwYXRoIHRvIGJlIHRyYW5zZm9ybWVkXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIFN0cmluZyBwcm9taXNlIGZvciB0aGUgbmV3IHBhdGguIElmIHNQYXRoVG9SZXNvbHZlZCBjb3VsZG4ndCBiZSBpbnRlcnByZXRlZCBhcyBhIHNlbWFudGljIHBhdGgsIGl0IGlzIHJldHVybmVkIGFzIGlzLlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9yZXNvbHZlU2VtYW50aWNQYXRoKHNQYXRoVG9SZXNvbHZlOiBzdHJpbmcsIG9Nb2RlbDogYW55KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG9MYXN0U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmdldExhc3RTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRsZXQgc0N1cnJlbnRIYXNoTm9QYXJhbXMgPSB0aGlzLl9vUm91dGVyLmdldEhhc2hDaGFuZ2VyKCkuZ2V0SGFzaCgpLnNwbGl0KFwiP1wiKVswXTtcblxuXHRcdGlmIChzQ3VycmVudEhhc2hOb1BhcmFtcyAmJiBzQ3VycmVudEhhc2hOb1BhcmFtcy5sYXN0SW5kZXhPZihcIi9cIikgPT09IHNDdXJyZW50SGFzaE5vUGFyYW1zLmxlbmd0aCAtIDEpIHtcblx0XHRcdC8vIFJlbW92ZSB0cmFpbGluZyAnLydcblx0XHRcdHNDdXJyZW50SGFzaE5vUGFyYW1zID0gc0N1cnJlbnRIYXNoTm9QYXJhbXMuc3Vic3RyaW5nKDAsIHNDdXJyZW50SGFzaE5vUGFyYW1zLmxlbmd0aCAtIDEpO1xuXHRcdH1cblxuXHRcdGxldCBzUm9vdEVudGl0eU5hbWUgPSBzQ3VycmVudEhhc2hOb1BhcmFtcyAmJiBzQ3VycmVudEhhc2hOb1BhcmFtcy5zdWJzdHIoMCwgc0N1cnJlbnRIYXNoTm9QYXJhbXMuaW5kZXhPZihcIihcIikpO1xuXHRcdGlmIChzUm9vdEVudGl0eU5hbWUuaW5kZXhPZihcIi9cIikgPT09IDApIHtcblx0XHRcdHNSb290RW50aXR5TmFtZSA9IHNSb290RW50aXR5TmFtZS5zdWJzdHJpbmcoMSk7XG5cdFx0fVxuXHRcdGNvbnN0IGJBbGxvd1NlbWFudGljQm9va21hcmsgPSB0aGlzLl9jaGVja1BhdGhGb3JTZW1hbnRpY0Jvb2ttYXJraW5nKHNDdXJyZW50SGFzaE5vUGFyYW1zLCBvTWV0YU1vZGVsKSxcblx0XHRcdGFTZW1hbnRpY0tleXMgPSBiQWxsb3dTZW1hbnRpY0Jvb2ttYXJrICYmIFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljS2V5cyhvTWV0YU1vZGVsLCBzUm9vdEVudGl0eU5hbWUpO1xuXHRcdGlmICghYVNlbWFudGljS2V5cykge1xuXHRcdFx0Ly8gTm8gc2VtYW50aWMga2V5cyBhdmFpbGFibGUgLS0+IHVzZSB0aGUgcGF0aCBhcyBpc1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShzUGF0aFRvUmVzb2x2ZSk7XG5cdFx0fSBlbHNlIGlmIChvTGFzdFNlbWFudGljTWFwcGluZyAmJiBvTGFzdFNlbWFudGljTWFwcGluZy5zZW1hbnRpY1BhdGggPT09IHNQYXRoVG9SZXNvbHZlKSB7XG5cdFx0XHQvLyBUaGlzIHNlbWFudGljIHBhdGggaGFzIGJlZW4gcmVzb2x2ZWQgcHJldmlvdXNseVxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShvTGFzdFNlbWFudGljTWFwcGluZy50ZWNobmljYWxQYXRoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gV2UgbmVlZCByZXNvbHZlIHRoZSBzZW1hbnRpYyBwYXRoIHRvIGdldCB0aGUgdGVjaG5pY2FsIGtleXNcblx0XHRcdHJldHVybiB0aGlzLl9nZXRUZWNobmljYWxQYXRoRnJvbVNlbWFudGljUGF0aChzQ3VycmVudEhhc2hOb1BhcmFtcywgb01vZGVsLCBhU2VtYW50aWNLZXlzKS50aGVuKChzVGVjaG5pY2FsUGF0aDogYW55KSA9PiB7XG5cdFx0XHRcdGlmIChzVGVjaG5pY2FsUGF0aCAmJiBzVGVjaG5pY2FsUGF0aCAhPT0gc1BhdGhUb1Jlc29sdmUpIHtcblx0XHRcdFx0XHQvLyBUaGUgc2VtYW50aWMgcGF0aCB3YXMgcmVzb2x2ZWQgKG90aGVyd2lzZSBrZWVwIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgdGFyZ2V0KVxuXHRcdFx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5zZXRMYXN0U2VtYW50aWNNYXBwaW5nKHtcblx0XHRcdFx0XHRcdHRlY2huaWNhbFBhdGg6IHNUZWNobmljYWxQYXRoLFxuXHRcdFx0XHRcdFx0c2VtYW50aWNQYXRoOiBzUGF0aFRvUmVzb2x2ZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHJldHVybiBzVGVjaG5pY2FsUGF0aDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gc1BhdGhUb1Jlc29sdmU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2UgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzVGFyZ2V0UGF0aCBUaGUgcGF0aCB0byBidWlsZCB0aGUgY29udGV4dC4gTmVlZHMgdG8gY29udGFpbiB0ZWNobmljYWwga2V5cyBvbmx5LlxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9iaW5kUGFnZVRvUGF0aChzVGFyZ2V0UGF0aDogc3RyaW5nLCBvTW9kZWw6IGFueSwgb05hdmlnYXRpb25QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRjb25zdCBvQ3VycmVudENvbnRleHQgPSB0aGlzLl9nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0c0N1cnJlbnRQYXRoID0gb0N1cnJlbnRDb250ZXh0ICYmIG9DdXJyZW50Q29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRvVXNlQ29udGV4dCA9IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy51c2VDb250ZXh0O1xuXG5cdFx0Ly8gV2Ugc2V0IHRoZSBiaW5kaW5nIGNvbnRleHQgb25seSBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IG9uZVxuXHRcdC8vIG9yIGlmIHdlIGhhdmUgYSBjb250ZXh0IGFscmVhZHkgc2VsZWN0ZWRcblx0XHRpZiAoc0N1cnJlbnRQYXRoICE9PSBzVGFyZ2V0UGF0aCB8fCAob1VzZUNvbnRleHQgJiYgb1VzZUNvbnRleHQuZ2V0UGF0aCgpID09PSBzVGFyZ2V0UGF0aCkpIHtcblx0XHRcdGxldCBvVGFyZ2V0Q29udGV4dDtcblx0XHRcdGlmIChvVXNlQ29udGV4dCAmJiBvVXNlQ29udGV4dC5nZXRQYXRoKCkgPT09IHNUYXJnZXRQYXRoKSB7XG5cdFx0XHRcdC8vIFdlIGFscmVhZHkgaGF2ZSB0aGUgY29udGV4dCB0byBiZSB1c2VkXG5cdFx0XHRcdG9UYXJnZXRDb250ZXh0ID0gb1VzZUNvbnRleHQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBPdGhlcndpc2Ugd2UgbmVlZCB0byBjcmVhdGUgaXQgZnJvbSBzVGFyZ2V0UGF0aFxuXHRcdFx0XHRvVGFyZ2V0Q29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQoc1RhcmdldFBhdGgsIG9Nb2RlbCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob1RhcmdldENvbnRleHQgIT09IG9DdXJyZW50Q29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChvVGFyZ2V0Q29udGV4dCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoIW9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iUmVhc29uSXNJYXBwU3RhdGUgJiYgRWRpdFN0YXRlLmlzRWRpdFN0YXRlRGlydHkoKSkge1xuXHRcdFx0dGhpcy5fcmVmcmVzaEJpbmRpbmdDb250ZXh0KG9DdXJyZW50Q29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEJpbmRzIHRoZSBwYWdlIHRvIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgdG8gYmUgYm91bmRcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfYmluZFBhZ2VUb0NvbnRleHQob0NvbnRleHQ6IENvbnRleHQgfCBudWxsLCBvTW9kZWw6IE9EYXRhTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogYW55KSB7XG5cdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0dGhpcy5vbkJlZm9yZUJpbmRpbmcobnVsbCk7XG5cdFx0XHR0aGlzLm9uQWZ0ZXJCaW5kaW5nKG51bGwpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9QYXJlbnRMaXN0QmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0aWYgKCFvUGFyZW50TGlzdEJpbmRpbmcgfHwgIW9QYXJlbnRMaXN0QmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHQvLyBpZiB0aGUgcGFyZW50QmluZGluZyBpcyBub3QgYSBsaXN0QmluZGluZywgd2UgY3JlYXRlIGEgbmV3IGNvbnRleHRcblx0XHRcdFx0b0NvbnRleHQgPSB0aGlzLl9jcmVhdGVDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSwgb01vZGVsKTtcblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dGhpcy5fc2V0S2VlcEFsaXZlKFxuXHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNDb250ZXh0VXNlZEluUGFnZXMob0NvbnRleHQpKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dHJ1ZSAvLyBMb2FkIG1lc3NhZ2VzLCBvdGhlcndpc2UgdGhleSBkb24ndCBnZXQgcmVmcmVzaGVkIGxhdGVyLCBlLmcuIGZvciBzaWRlIGVmZmVjdHNcblx0XHRcdFx0KTtcblx0XHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0XHQvLyBzZXRLZWVwQWxpdmUgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgcGFyZW50IGxpc3RiaW5kaW5nIGRvZXNuJ3QgaGF2ZSAkJG93blJlcXVlc3Q9dHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIGNhc2UgZm9yIGN1c3RvbSBmcmFnbWVudHMgaXMgc3VwcG9ydGVkLCBidXQgYW4gZXJyb3IgaXMgbG9nZ2VkIHRvIG1ha2UgdGhlIGxhY2sgb2Ygc3luY2hyb25pemF0aW9uIGFwcGFyZW50XG5cdFx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0XHRgVmlldyBmb3IgJHtvQ29udGV4dC5nZXRQYXRoKCl9IHdvbid0IGJlIHN5bmNocm9uaXplZC4gUGFyZW50IGxpc3RCaW5kaW5nIG11c3QgaGF2ZSBiaW5kaW5nIHBhcmFtZXRlciAkJG93blJlcXVlc3Q9dHJ1ZWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKCFvUGFyZW50TGlzdEJpbmRpbmcgfHwgb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHQvLyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZSBjb250ZXh0IG90aGVyd2lzZSB3ZSBnZXQgZXJyb3JzXG5cdFx0XHRvQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpLCBvTW9kZWwpO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgYmluZGluZyBjb250ZXh0IHdpdGggdGhlIHByb3BlciBiZWZvcmUvYWZ0ZXIgY2FsbGJhY2tzXG5cdFx0dGhpcy5vbkJlZm9yZUJpbmRpbmcob0NvbnRleHQsIHtcblx0XHRcdGVkaXRhYmxlOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlLFxuXHRcdFx0bGlzdEJpbmRpbmc6IG9QYXJlbnRMaXN0QmluZGluZyxcblx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iUGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0YkRyYWZ0TmF2aWdhdGlvbjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJEcmFmdE5hdmlnYXRpb24sXG5cdFx0XHRzaG93UGxhY2Vob2xkZXI6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iU2hvd1BsYWNlaG9sZGVyXG5cdFx0fSk7XG5cblx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cdFx0dGhpcy5vbkFmdGVyQmluZGluZyhvQ29udGV4dCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGNvbnRleHQgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzUGF0aCBUaGUgcGF0aFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2NyZWF0ZUNvbnRleHQoc1BhdGg6IHN0cmluZywgb01vZGVsOiBPRGF0YU1vZGVsKSB7XG5cdFx0Y29uc3Qgb1BhZ2VDb21wb25lbnQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudCxcblx0XHRcdHNFbnRpdHlTZXQgPSBvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0KCksXG5cdFx0XHRzQ29udGV4dFBhdGggPVxuXHRcdFx0XHQob1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGggJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSkgfHwgKHNFbnRpdHlTZXQgJiYgYC8ke3NFbnRpdHlTZXR9YCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0bVBhcmFtZXRlcnM6IGFueSA9IHtcblx0XHRcdFx0JCRncm91cElkOiBcIiRhdXRvLkhlcm9lc1wiLFxuXHRcdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwiJGF1dG9cIixcblx0XHRcdFx0JCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0czogdHJ1ZVxuXHRcdFx0fTtcblx0XHQvLyBJbiBjYXNlIG9mIGRyYWZ0OiAkc2VsZWN0IHRoZSBzdGF0ZSBmbGFncyAoSGFzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgYW5kIElzQWN0aXZlRW50aXR5KVxuXHRcdGNvbnN0IG9EcmFmdFJvb3QgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RgKTtcblx0XHRjb25zdCBvRHJhZnROb2RlID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnROb2RlYCk7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9ICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5fZ2V0S2VlcEFsaXZlQ29udGV4dChvTW9kZWwsIHNQYXRoLCBmYWxzZSwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUga2VlcEFsaXZlIGNvbnRleHQgJHtzUGF0aH1gKTtcblx0XHRcdH0gZWxzZSBpZiAob0RyYWZ0Um9vdCB8fCBvRHJhZnROb2RlKSB7XG5cdFx0XHRcdGlmIChvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkoW1wiSGFzQWN0aXZlRW50aXR5XCIsIFwiSGFzRHJhZnRFbnRpdHlcIiwgXCJJc0FjdGl2ZUVudGl0eVwiXSk7XG5cdFx0XHRcdFx0aWYgKG9EcmFmdFJvb3QpIHtcblx0XHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RPYmplY3QoXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBkcmFmdCBhbmQgZWRpdCB3ZSBuZWVkIHRvIGVuc3VyZSB0aG9zZSBwcm9wZXJ0aWVzIGFyZSByZXF1ZXN0ZWQgYWdhaW4gZXZlbiBpZiB0aGV5IGFyZSBpbiB0aGUgYmluZGluZydzIGNhY2hlXG5cdFx0XHRcdFx0Ly8gb3RoZXJ3aXNlIHdoZW4geW91IGVkaXQgYW5kIGdvIHRvIHRoZSBzYXZlZCB2ZXJzaW9uIHlvdSBoYXZlIG5vIHdheSBvZiBzd2l0Y2hpbmcgYmFjayB0byB0aGUgZWRpdCB2ZXJzaW9uXG5cdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKFxuXHRcdFx0XHRcdFx0b0RyYWZ0Um9vdFxuXHRcdFx0XHRcdFx0XHQ/IFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIiwgXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiXVxuXHRcdFx0XHRcdFx0XHQ6IFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIl1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHNFbnRpdHlTZXQpIHtcblx0XHRcdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aGApO1xuXHRcdFx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgPSBzTWVzc2FnZXNQYXRoO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEluIGNhc2Ugb2YgZHJhZnQ6ICRzZWxlY3QgdGhlIHN0YXRlIGZsYWdzIChIYXNBY3RpdmVFbnRpdHksIEhhc0RyYWZ0RW50aXR5LCBhbmQgSXNBY3RpdmVFbnRpdHkpXG5cdFx0XHRpZiAob0RyYWZ0Um9vdCB8fCBvRHJhZnROb2RlKSB7XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy4kc2VsZWN0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy4kc2VsZWN0ID0gXCJIYXNBY3RpdmVFbnRpdHksSGFzRHJhZnRFbnRpdHksSXNBY3RpdmVFbnRpdHlcIjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy4kc2VsZWN0ICs9IFwiLEhhc0FjdGl2ZUVudGl0eSxIYXNEcmFmdEVudGl0eSxJc0FjdGl2ZUVudGl0eVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdFx0XHRjb25zdCBvUHJldmlvdXNCaW5kaW5nID0gKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgYW55KT8uZ2V0QmluZGluZygpO1xuXHRcdFx0XHRvUHJldmlvdXNCaW5kaW5nXG5cdFx0XHRcdFx0Py5yZXNldENoYW5nZXMoKVxuXHRcdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdG9QcmV2aW91c0JpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVzZXRpbmcgdGhlIGNoYW5nZXMgdG8gdGhlIGJpbmRpbmdcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgb0hpZGRlbkJpbmRpbmcgPSBvTW9kZWwuYmluZENvbnRleHQoc1BhdGgsIHVuZGVmaW5lZCwgbVBhcmFtZXRlcnMpO1xuXG5cdFx0XHRvSGlkZGVuQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVxdWVzdGVkXCIsICgpID0+IHtcblx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKHRoaXMuX29WaWV3KTtcblx0XHRcdH0pO1xuXHRcdFx0b0hpZGRlbkJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIHRoaXMuX2RhdGFSZWNlaXZlZEV2ZW50SGFuZGxlci5iaW5kKHRoaXMpKTtcblx0XHRcdHJldHVybiBvSGlkZGVuQmluZGluZy5nZXRCb3VuZENvbnRleHQoKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBfZGF0YVJlY2VpdmVkRXZlbnRIYW5kbGVyKG9FdmVudDogRXZlbnQpIHtcblx0XHRjb25zdCBzRXJyb3JEZXNjcmlwdGlvbiA9IG9FdmVudCAmJiBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiZXJyb3JcIik7XG5cdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5fb1ZpZXcpO1xuXG5cdFx0aWYgKHNFcnJvckRlc2NyaXB0aW9uKSB7XG5cdFx0XHQvLyBUT0RPOiBpbiBjYXNlIG9mIDQwNCB0aGUgdGV4dCBzaGFsbCBiZSBkaWZmZXJlbnRcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IGF3YWl0IENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIiwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGVyID0gdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyO1xuXHRcdFx0XHRsZXQgbVBhcmFtcyA9IHt9O1xuXHRcdFx0XHRpZiAoc0Vycm9yRGVzY3JpcHRpb24gJiYgc0Vycm9yRGVzY3JpcHRpb24uc3RhdHVzID09PSA1MDMpIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0aXNJbml0aWFsTG9hZDUwM0Vycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2hlbGxCYWNrOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogc0Vycm9yRGVzY3JpcHRpb24sXG5cdFx0XHRcdFx0XHRpc0RhdGFSZWNlaXZlZEVycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2hlbGxCYWNrOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMobVBhcmFtcyk7XG5cdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBnZXR0aW5nIHRoZSBjb3JlIHJlc291cmNlIGJ1bmRsZVwiLCBvRXJyb3IpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyBzaWRlIGVmZmVjdHMgb24gYSBiaW5kaW5nIGNvbnRleHQgdG8gXCJyZWZyZXNoXCIgaXQuXG5cdCAqIFRPRE86IGdldCByaWQgb2YgdGhpcyBvbmNlIHByb3ZpZGVkIGJ5IHRoZSBtb2RlbFxuXHQgKiBhIHJlZnJlc2ggb24gdGhlIGJpbmRpbmcgY29udGV4dCBkb2VzIG5vdCB3b3JrIGluIGNhc2UgYSBjcmVhdGlvbiByb3cgd2l0aCBhIHRyYW5zaWVudCBjb250ZXh0IGlzXG5cdCAqIHVzZWQuIGFsc28gYSByZXF1ZXN0U2lkZUVmZmVjdHMgd2l0aCBhbiBlbXB0eSBwYXRoIHdvdWxkIGZhaWwgZHVlIHRvIHRoZSB0cmFuc2llbnQgY29udGV4dFxuXHQgKiB0aGVyZWZvcmUgd2UgZ2V0IGFsbCBkZXBlbmRlbnQgYmluZGluZ3MgKHZpYSBwcml2YXRlIG1vZGVsIG1ldGhvZCkgdG8gZGV0ZXJtaW5lIGFsbCBwYXRocyBhbmQgdGhlblxuXHQgKiByZXF1ZXN0IHRoZW0uXG5cdCAqXG5cdCAqIEBwYXJhbSBvQmluZGluZ0NvbnRleHQgQ29udGV4dCB0byBiZSByZWZyZXNoZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfcmVmcmVzaEJpbmRpbmdDb250ZXh0KG9CaW5kaW5nQ29udGV4dDogYW55KSB7XG5cdFx0Y29uc3Qgb1BhZ2VDb21wb25lbnQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudDtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHNTZXJ2aWNlID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHRjb25zdCBzUm9vdENvbnRleHRQYXRoID0gb0JpbmRpbmdDb250ZXh0LmdldFBhdGgoKTtcblx0XHRjb25zdCBzRW50aXR5U2V0ID0gb1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCgpO1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9XG5cdFx0XHQob1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGggJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSkgfHwgKHNFbnRpdHlTZXQgJiYgYC8ke3NFbnRpdHlTZXR9YCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IHNNZXNzYWdlc1BhdGg7XG5cdFx0Y29uc3QgYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IGFQcm9wZXJ0eVBhdGhzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0czogYW55ID0ge1xuXHRcdFx0VGFyZ2V0UHJvcGVydGllczogW10sXG5cdFx0XHRUYXJnZXRFbnRpdGllczogW11cblx0XHR9O1xuXG5cdFx0ZnVuY3Rpb24gZ2V0QmluZGluZ1BhdGhzKG9CaW5kaW5nOiBhbnkpIHtcblx0XHRcdGxldCBhRGVwZW5kZW50QmluZGluZ3M7XG5cdFx0XHRjb25zdCBzUmVsYXRpdmVQYXRoID0gKChvQmluZGluZy5nZXRDb250ZXh0KCkgJiYgb0JpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKSkgfHwgXCJcIikucmVwbGFjZShzUm9vdENvbnRleHRQYXRoLCBcIlwiKTsgLy8gSWYgbm8gY29udGV4dCwgdGhpcyBpcyBhbiBhYnNvbHV0ZSBiaW5kaW5nIHNvIG5vIHJlbGF0aXZlIHBhdGhcblx0XHRcdGNvbnN0IHNQYXRoID0gKHNSZWxhdGl2ZVBhdGggPyBgJHtzUmVsYXRpdmVQYXRoLnNsaWNlKDEpfS9gIDogc1JlbGF0aXZlUGF0aCkgKyBvQmluZGluZy5nZXRQYXRoKCk7XG5cblx0XHRcdGlmIChvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFDb250ZXh0QmluZGluZ1wiKSkge1xuXHRcdFx0XHQvLyBpZiAoc1BhdGggPT09IFwiXCIpIHtcblx0XHRcdFx0Ly8gbm93IGdldCB0aGUgZGVwZW5kZW50IGJpbmRpbmdzXG5cdFx0XHRcdGFEZXBlbmRlbnRCaW5kaW5ncyA9IG9CaW5kaW5nLmdldERlcGVuZGVudEJpbmRpbmdzKCk7XG5cdFx0XHRcdGlmIChhRGVwZW5kZW50QmluZGluZ3MpIHtcblx0XHRcdFx0XHQvLyBhc2sgdGhlIGRlcGVuZGVudCBiaW5kaW5ncyAoYW5kIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGdyb3VwSWRcblx0XHRcdFx0XHQvL2lmIChhRGVwZW5kZW50QmluZGluZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYURlcGVuZGVudEJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRnZXRCaW5kaW5nUGF0aHMoYURlcGVuZGVudEJpbmRpbmdzW2ldKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmluZGV4T2Yoc1BhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRpZiAoYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmluZGV4T2Yoc1BhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIikpIHtcblx0XHRcdFx0aWYgKGFQcm9wZXJ0eVBhdGhzLmluZGV4T2Yoc1BhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdGFQcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNDb250ZXh0UGF0aCkge1xuXHRcdFx0c01lc3NhZ2VzUGF0aCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aGApO1xuXHRcdH1cblxuXHRcdC8vIGJpbmRpbmcgb2YgdGhlIGNvbnRleHQgbXVzdCBoYXZlICQkUGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMgdHJ1ZSwgdGhpcyBib3VuZCBjb250ZXh0IG1heSBiZSBuZWVkZWQgdG8gYmUgZmV0Y2hlZCBmcm9tIHRoZSBkZXBlbmRlbnQgYmluZGluZ1xuXHRcdGdldEJpbmRpbmdQYXRocyhvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpKTtcblxuXHRcdGxldCBpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdG9TaWRlRWZmZWN0cy5UYXJnZXRFbnRpdGllcy5wdXNoKHtcblx0XHRcdFx0JE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRoc1tpXVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzID0gYVByb3BlcnR5UGF0aHM7XG5cdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzLnB1c2goc01lc3NhZ2VzUGF0aCk7XG5cdFx0fVxuXHRcdC8vYWxsIHRoaXMgbG9naWMgdG8gYmUgcmVwbGFjZWQgd2l0aCBhIFNpZGVFZmZlY3RzIHJlcXVlc3QgZm9yIGFuIGVtcHR5IHBhdGggKHJlZnJlc2ggZXZlcnl0aGluZyksIGFmdGVyIHRlc3RpbmcgdHJhbnNpZW50IGNvbnRleHRzXG5cdFx0b1NpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMgPSBvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcy5tYXAoKHNUYXJnZXRQcm9wZXJ0eTogU3RyaW5nKSA9PiB7XG5cdFx0XHRpZiAoc1RhcmdldFByb3BlcnR5KSB7XG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gc1RhcmdldFByb3BlcnR5LmluZGV4T2YoXCIvXCIpO1xuXHRcdFx0XHRpZiAoaW5kZXggPiAwKSB7XG5cdFx0XHRcdFx0Ly8gb25seSByZXF1ZXN0IHRoZSBuYXZpZ2F0aW9uIHBhdGggYW5kIG5vdCB0aGUgcHJvcGVydHkgcGF0aHMgZnVydGhlclxuXHRcdFx0XHRcdHJldHVybiBzVGFyZ2V0UHJvcGVydHkuc2xpY2UoMCwgaW5kZXgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBzVGFyZ2V0UHJvcGVydHk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Ly8gT0RhdGEgbW9kZWwgd2lsbCB0YWtlIGNhcmUgb2YgZHVwbGljYXRlc1xuXHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKG9TaWRlRWZmZWN0cy5UYXJnZXRFbnRpdGllcy5jb25jYXQob1NpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMpLCBvQmluZGluZ0NvbnRleHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBvciB0aGUgY29tcG9uZW50LlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgYmluZGluZyBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2dldEJpbmRpbmdDb250ZXh0KCk6IENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBvciB0aGUgY29tcG9uZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGJpbmRpbmcgY29udGV4dFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dDogYW55KSB7XG5cdFx0bGV0IG9QcmV2aW91c0NvbnRleHQsIG9UYXJnZXRDb250cm9sO1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0b1ByZXZpb3VzQ29udGV4dCA9IHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdG9UYXJnZXRDb250cm9sID0gdGhpcy5fb1BhZ2VDb21wb25lbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9QcmV2aW91c0NvbnRleHQgPSB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRvVGFyZ2V0Q29udHJvbCA9IHRoaXMuX29WaWV3O1xuXHRcdH1cblxuXHRcdG9UYXJnZXRDb250cm9sLnNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0KTtcblxuXHRcdGlmIChvUHJldmlvdXNDb250ZXh0ICYmIG9QcmV2aW91c0NvbnRleHQuaXNLZWVwQWxpdmUoKSkge1xuXHRcdFx0dGhpcy5fc2V0S2VlcEFsaXZlKG9QcmV2aW91c0NvbnRleHQsIGZhbHNlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZmxleGlibGUgY29sdW1uIGxheW91dCAoRkNMKSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB2aWV3ICgtMSBpZiB0aGUgYXBwIGlzIG5vdCBGQ0wpLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgbGV2ZWxcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfZ2V0RkNMTGV2ZWwoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi5GQ0xMZXZlbDtcblx0fVxuXG5cdF9zZXRLZWVwQWxpdmUob0NvbnRleHQ6IENvbnRleHQsIGJLZWVwQWxpdmU6IGJvb2xlYW4sIGZuQmVmb3JlRGVzdHJveT86IEZ1bmN0aW9uLCBiUmVxdWVzdE1lc3NhZ2VzPzogYm9vbGVhbikge1xuXHRcdGlmIChvQ29udGV4dC5nZXRQYXRoKCkuZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHQvLyBXZSBrZWVwIHRoZSBjb250ZXh0IGFsaXZlIG9ubHkgaWYgdGhleSdyZSBwYXJ0IG9mIGEgY29sbGVjdGlvbiwgaS5lLiBpZiB0aGUgcGF0aCBlbmRzIHdpdGggYSAnKSdcblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aGApO1xuXHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKGJLZWVwQWxpdmUsIGZuQmVmb3JlRGVzdHJveSwgISFzTWVzc2FnZXNQYXRoICYmIGJSZXF1ZXN0TWVzc2FnZXMpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRLZWVwQWxpdmVDb250ZXh0KG9Nb2RlbDogT0RhdGFNb2RlbCwgcGF0aDogc3RyaW5nLCBiUmVxdWVzdE1lc3NhZ2VzPzogYm9vbGVhbiwgcGFyYW1ldGVycz86IGFueSk6IENvbnRleHQgfCB1bmRlZmluZWQge1xuXHRcdC8vIEdldCB0aGUgcGF0aCBmb3IgdGhlIGNvbnRleHQgdGhhdCBpcyByZWFsbHkga2VwdCBhbGl2ZSAocGFydCBvZiBhIGNvbGxlY3Rpb24pXG5cdFx0Ly8gaS5lLiByZW1vdmUgYWxsIHNlZ21lbnRzIG5vdCBlbmRpbmcgd2l0aCBhICcpJ1xuXHRcdGNvbnN0IGtlcHRBbGl2ZVNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi9cIik7XG5cdFx0Y29uc3QgYWRkaXRpb25uYWxTZWdtZW50czogc3RyaW5nW10gPSBbXTtcblx0XHR3aGlsZSAoa2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoICYmICFrZXB0QWxpdmVTZWdtZW50c1trZXB0QWxpdmVTZWdtZW50cy5sZW5ndGggLSAxXS5lbmRzV2l0aChcIilcIikpIHtcblx0XHRcdGFkZGl0aW9ubmFsU2VnbWVudHMucHVzaChrZXB0QWxpdmVTZWdtZW50cy5wb3AoKSEpO1xuXHRcdH1cblxuXHRcdGlmIChrZXB0QWxpdmVTZWdtZW50cy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Y29uc3Qga2VwdEFsaXZlUGF0aCA9IGtlcHRBbGl2ZVNlZ21lbnRzLmpvaW4oXCIvXCIpO1xuXHRcdGNvbnN0IG9LZWVwQWxpdmVDb250ZXh0ID0gb01vZGVsLmdldEtlZXBBbGl2ZUNvbnRleHQoa2VwdEFsaXZlUGF0aCwgYlJlcXVlc3RNZXNzYWdlcywgcGFyYW1ldGVycyk7XG5cblx0XHRpZiAoYWRkaXRpb25uYWxTZWdtZW50cy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBvS2VlcEFsaXZlQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YWRkaXRpb25uYWxTZWdtZW50cy5yZXZlcnNlKCk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbm5hbFBhdGggPSBhZGRpdGlvbm5hbFNlZ21lbnRzLmpvaW4oXCIvXCIpO1xuXHRcdFx0cmV0dXJuIG9Nb2RlbC5iaW5kQ29udGV4dChhZGRpdGlvbm5hbFBhdGgsIG9LZWVwQWxpdmVDb250ZXh0KS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3dpdGNoZXMgYmV0d2VlbiBjb2x1bW4gYW5kIGZ1bGwtc2NyZWVuIG1vZGUgd2hlbiBGQ0wgaXMgdXNlZC5cblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzd2l0Y2hGdWxsU2NyZWVuKCkge1xuXHRcdGNvbnN0IG9Tb3VyY2UgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9GQ0xIZWxwZXJNb2RlbCA9IG9Tb3VyY2UuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIiksXG5cdFx0XHRiSXNGdWxsU2NyZWVuID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2lzRnVsbFNjcmVlblwiKSxcblx0XHRcdHNOZXh0TGF5b3V0ID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFxuXHRcdFx0XHRiSXNGdWxsU2NyZWVuID8gXCIvYWN0aW9uQnV0dG9uc0luZm8vZXhpdEZ1bGxTY3JlZW5cIiA6IFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2Z1bGxTY3JlZW5cIlxuXHRcdFx0KSxcblx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0Y29uc3Qgb0NvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQgPyBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKSA6IG9Tb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKTtcblxuXHRcdHRoaXMuYmFzZS5fcm91dGluZy5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgeyBzTGF5b3V0OiBzTmV4dExheW91dCB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRMb2cud2FybmluZyhcImNhbm5vdCBzd2l0Y2ggYmV0d2VlbiBjb2x1bW4gYW5kIGZ1bGxzY3JlZW5cIik7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2xvc2VzIHRoZSBjb2x1bW4gZm9yIHRoZSBjdXJyZW50IHZpZXcgaW4gYSBGQ0wuXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkJlZm9yZSlcblx0Y2xvc2VDb2x1bW4oKSB7XG5cdFx0Y29uc3Qgb1NvdXJjZSA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0Y29uc3Qgb1ZpZXdEYXRhID0gb1NvdXJjZS5nZXRWaWV3RGF0YSgpIGFzIGFueTtcblx0XHRjb25zdCBvQ29udGV4dCA9IG9Tb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdGNvbnN0IGJhc2UgPSB0aGlzLmJhc2U7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cblx0XHRpZiAob1ZpZXdEYXRhICYmIG9WaWV3RGF0YS52aWV3TGV2ZWwgPT09IDEgJiYgTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChvTWV0YU1vZGVsLCBvQ29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHRkcmFmdC5wcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbihcblx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGJhc2UuX3JvdXRpbmcubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQsIHsgbm9QcmVzZXJ2YXRpb25DYWNoZTogdHJ1ZSB9KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0RnVuY3Rpb24ucHJvdG90eXBlLFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0b1NvdXJjZS5nZXRDb250cm9sbGVyKCksXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRkcmFmdC5OYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvblxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YmFzZS5fcm91dGluZy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCwgeyBub1ByZXNlcnZhdGlvbkNhY2hlOiB0cnVlIH0pO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcm5hbFJvdXRpbmc7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7OztFQWtqQk8sZ0JBQWdCQSxJQUFoQixFQUFzQkMsT0FBdEIsRUFBK0I7SUFDckMsSUFBSTtNQUNILElBQUlDLE1BQU0sR0FBR0YsSUFBSSxFQUFqQjtJQUNBLENBRkQsQ0FFRSxPQUFNRyxDQUFOLEVBQVM7TUFDVixPQUFPRixPQUFPLENBQUNFLENBQUQsQ0FBZDtJQUNBOztJQUNELElBQUlELE1BQU0sSUFBSUEsTUFBTSxDQUFDRSxJQUFyQixFQUEyQjtNQUMxQixPQUFPRixNQUFNLENBQUNFLElBQVAsQ0FBWSxLQUFLLENBQWpCLEVBQW9CSCxPQUFwQixDQUFQO0lBQ0E7O0lBQ0QsT0FBT0MsTUFBUDtFQUNBOzs7Ozs7OztFQWhpQkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtNQUVNRyxlLFdBRExDLGNBQWMsQ0FBQyxrREFBRCxDLFVBWWJDLGNBQWMsRSxVQU9kQSxjQUFjLEUsVUFvQ2RDLGVBQWUsRSxVQUNmQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFuQixDLFVBS1ZILGVBQWUsRSxVQUNmQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFuQixDLFVBS1ZILGVBQWUsRSxVQUNmQyxVQUFV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
999
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiSW50ZXJuYWxSb3V0aW5nIiwiZGVmaW5lVUk1Q2xhc3MiLCJtZXRob2RPdmVycmlkZSIsInB1YmxpY0V4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiZmluYWxFeHRlbnNpb24iLCJCZWZvcmUiLCJvbkV4aXQiLCJfb1JvdXRpbmdTZXJ2aWNlIiwiZGV0YWNoUm91dGVNYXRjaGVkIiwiX2ZuUm91dGVNYXRjaGVkQm91bmQiLCJvbkluaXQiLCJfb1ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9vQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJfb1BhZ2VDb21wb25lbnQiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsIl9vUm91dGVyIiwiZ2V0Um91dGVyIiwiX29Sb3V0ZXJQcm94eSIsImdldFJvdXRlclByb3h5IiwiRXJyb3IiLCJnZXRTZXJ2aWNlIiwib1JvdXRpbmdTZXJ2aWNlIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwib0JpbmRpbmdDb250ZXh0IiwibVBhcmFtZXRlcnMiLCJvUm91dGluZyIsImdldENvbnRyb2xsZXIiLCJyb3V0aW5nIiwib25BZnRlckJpbmRpbmciLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJvbkNvbnRleHRCb3VuZFRvVmlldyIsIm5hdmlnYXRlVG9UYXJnZXQiLCJvQ29udGV4dCIsInNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSIsImJQcmVzZXJ2ZUhpc3RvcnkiLCJvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm9EZXRhaWxSb3V0ZSIsImRldGFpbCIsInNSb3V0ZU5hbWUiLCJyb3V0ZSIsIm1QYXJhbWV0ZXJNYXBwaW5nIiwicGFyYW1ldGVycyIsIm5hdmlnYXRlVG8iLCJnZXRWaWV3RGF0YSIsIm5hdmlnYXRlVG9Sb3V0ZSIsInNUYXJnZXRSb3V0ZU5hbWUiLCJvUGFyYW1ldGVycyIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib0NvbnRleHRJbmZvIiwiaXNBIiwiYXN5bmNDb250ZXh0IiwiYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJlZGl0YWJsZSIsImJQZXJzaXN0T1BTY3JvbGwiLCJ1cGRhdGVGQ0xMZXZlbCIsImJGb3JjZUZvY3VzIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJiRGVmZXJyZWRDb250ZXh0IiwiY2FsbEV4dGVuc2lvbiIsIm9JbnRlcm5hbE1vZGVsIiwiZ2V0TW9kZWwiLCJzZXRQcm9wZXJ0eSIsInNvdXJjZUJpbmRpbmdDb250ZXh0IiwiZ2V0T2JqZWN0IiwiYmluZGluZ0NvbnRleHQiLCJvRXZlbnQiLCJiT3ZlcnJpZGVOYXYiLCJvbkJlZm9yZU5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIkZDTExldmVsIiwiX2dldEZDTExldmVsIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldFByb3BlcnR5IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwic0hhc2giLCJnZXRIYXNoIiwiaW5kZXhPZiIsIm5hdkJhY2siLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJzRXJyb3JNZXNzYWdlIiwibmF2VG9IYXNoIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJkaXNwbGF5RXJyb3JQYWdlIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5IiwiX2lzVmlld1BhcnRPZlJvdXRlIiwicm91dGVJbmZvcm1hdGlvbiIsImFUYXJnZXRzIiwidGFyZ2V0cyIsInRhcmdldE5hbWUiLCJ2aWV3TGV2ZWwiLCJyb3V0ZUxldmVsIiwiX3NldEJpbmRpbmdDb250ZXh0IiwiX2J1aWxkQmluZGluZ1BhdGgiLCJyb3V0ZUFyZ3VtZW50cyIsImJpbmRpbmdQYXR0ZXJuIiwibmF2aWdhdGlvblBhcmFtZXRlcnMiLCJwYXRoIiwicmVwbGFjZSIsImRlZmVycmVkIiwic0tleSIsInNWYWx1ZSIsImJUYXJnZXRFZGl0YWJsZSIsImhhc093blByb3BlcnR5IiwiYkFjdGlvbkNyZWF0ZSIsImdldFBhcmFtZXRlciIsImdldEJpbmRpbmdDb250ZXh0UGF0dGVybiIsImNvbnRleHRQYXR0ZXJuIiwidW5kZWZpbmVkIiwibUFyZ3VtZW50cyIsImdldFBhcmFtZXRlcnMiLCJhcmd1bWVudHMiLCJvTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJvTW9kZWwiLCJvT3V0IiwiX2JpbmREZWZlcnJlZCIsIl9iaW5kUGFnZSIsImZpbmFsbHkiLCJ1cGRhdGVVSVN0YXRlRm9yVmlldyIsInNUYXJnZXRQYXRoIiwib0FzeW5jQ29udGV4dCIsImNyZWF0ZURlZmVycmVkQ29udGV4dCIsInVzZUNvbnRleHQiLCJjdXJyZW50QmluZGluZ0NvbnRleHQiLCJfZ2V0QmluZGluZ0NvbnRleHQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImdldEJpbmRpbmciLCJyZXNldENoYW5nZXMiLCJfYmluZFBhZ2VUb0NvbnRleHQiLCJfcmVzb2x2ZVNlbWFudGljUGF0aCIsInNUZWNobmljYWxQYXRoIiwiX2JpbmRQYWdlVG9QYXRoIiwib1Jlc291cmNlQnVuZGxlIiwiQ29yZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsImdldFRleHQiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwibWVzc2FnZSIsIl9jcmVhdGVGaWx0ZXJGcm9tU2VtYW50aWNQYXRoIiwic1NlbWFudGljUGF0aCIsImFTZW1hbnRpY0tleXMiLCJvTWV0YU1vZGVsIiwiZm5VbnF1b3RlQW5kRGVjb2RlIiwibGFzdEluZGV4T2YiLCJsZW5ndGgiLCJkZWNvZGVVUklDb21wb25lbnQiLCJzdWJzdHJpbmciLCJhS2V5VmFsdWVzIiwic3BsaXQiLCJhRmlsdGVycyIsImJGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwiTW9kZWxIZWxwZXIiLCJpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJzS2V5VmFsdWUiLCJGaWx0ZXIiLCIkUHJvcGVydHlQYXRoIiwib3BlcmF0b3IiLCJGaWx0ZXJPcGVyYXRvciIsIkVRIiwidmFsdWUxIiwiY2FzZVNlbnNpdGl2ZSIsIm1LZXlWYWx1ZXMiLCJmb3JFYWNoIiwic0tleUFzc2lnbm1lbnQiLCJhUGFydHMiLCJiRmFpbGVkIiwibWFwIiwib1NlbWFudGljS2V5Iiwib0RyYWZ0RmlsdGVyIiwiZmlsdGVycyIsImFuZCIsInB1c2giLCJfZ2V0VGVjaG5pY2FsUGF0aEZyb21TZW1hbnRpY1BhdGgiLCJnZXRNZXRhTW9kZWwiLCJzRW50aXR5U2V0UGF0aCIsImdldE1ldGFDb250ZXh0IiwiZ2V0UGF0aCIsIm9GaWx0ZXIiLCJzdGFydHNXaXRoIiwib0xpc3RCaW5kaW5nIiwiYmluZExpc3QiLCIkJGdyb3VwSWQiLCJyZXF1ZXN0Q29udGV4dHMiLCJvQ29udGV4dHMiLCJfY2hlY2tQYXRoRm9yU2VtYW50aWNCb29rbWFya2luZyIsInNQYXRoIiwiYU1hdGNoZXMiLCJleGVjIiwib0RyYWZ0Um9vdCIsIm9EcmFmdE5vZGUiLCJzUGF0aFRvUmVzb2x2ZSIsIm9MYXN0U2VtYW50aWNNYXBwaW5nIiwiZ2V0TGFzdFNlbWFudGljTWFwcGluZyIsInNDdXJyZW50SGFzaE5vUGFyYW1zIiwiZ2V0SGFzaENoYW5nZXIiLCJzUm9vdEVudGl0eU5hbWUiLCJzdWJzdHIiLCJiQWxsb3dTZW1hbnRpY0Jvb2ttYXJrIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY0tleXMiLCJzZW1hbnRpY1BhdGgiLCJ0ZWNobmljYWxQYXRoIiwic2V0TGFzdFNlbWFudGljTWFwcGluZyIsIm9DdXJyZW50Q29udGV4dCIsInNDdXJyZW50UGF0aCIsIm9Vc2VDb250ZXh0Iiwib1RhcmdldENvbnRleHQiLCJfY3JlYXRlQ29udGV4dCIsImJSZWFzb25Jc0lhcHBTdGF0ZSIsIkVkaXRTdGF0ZSIsImlzRWRpdFN0YXRlRGlydHkiLCJfcmVmcmVzaEJpbmRpbmdDb250ZXh0Iiwib1BhcmVudExpc3RCaW5kaW5nIiwib1Jvb3RWaWV3Q29udHJvbGxlciIsImlzRmNsRW5hYmxlZCIsIl9zZXRLZWVwQWxpdmUiLCJpc0NvbnRleHRVc2VkSW5QYWdlcyIsImxpc3RCaW5kaW5nIiwiYkRyYWZ0TmF2aWdhdGlvbiIsInNob3dQbGFjZWhvbGRlciIsImJTaG93UGxhY2Vob2xkZXIiLCJvUGFnZUNvbXBvbmVudCIsInNFbnRpdHlTZXQiLCJnZXRFbnRpdHlTZXQiLCJzQ29udGV4dFBhdGgiLCJnZXRDb250ZXh0UGF0aCIsIiQkdXBkYXRlR3JvdXBJZCIsIiQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMiLCJfZ2V0S2VlcEFsaXZlQ29udGV4dCIsInJlcXVlc3RQcm9wZXJ0eSIsInJlcXVlc3RPYmplY3QiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJzTWVzc2FnZXNQYXRoIiwiJHNlbGVjdCIsIm9QcmV2aW91c0JpbmRpbmciLCJkZXN0cm95Iiwib0hpZGRlbkJpbmRpbmciLCJiaW5kQ29udGV4dCIsImF0dGFjaEV2ZW50T25jZSIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwib25EYXRhUmVjZWl2ZWQiLCJnZXRCb3VuZENvbnRleHQiLCJzRXJyb3JEZXNjcmlwdGlvbiIsImlzTG9ja2VkIiwidW5sb2NrIiwibWVzc2FnZUhhbmRsZXIiLCJtUGFyYW1zIiwic3RhdHVzIiwiaXNJbml0aWFsTG9hZDUwM0Vycm9yIiwic2hlbGxCYWNrIiwiaXNEYXRhUmVjZWl2ZWRFcnJvciIsInNob3dNZXNzYWdlcyIsIm9TaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJzUm9vdENvbnRleHRQYXRoIiwiYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzIiwiYVByb3BlcnR5UGF0aHMiLCJvU2lkZUVmZmVjdHMiLCJUYXJnZXRQcm9wZXJ0aWVzIiwiVGFyZ2V0RW50aXRpZXMiLCJnZXRCaW5kaW5nUGF0aHMiLCJvQmluZGluZyIsImFEZXBlbmRlbnRCaW5kaW5ncyIsInNSZWxhdGl2ZVBhdGgiLCJnZXRDb250ZXh0Iiwic2xpY2UiLCJnZXREZXBlbmRlbnRCaW5kaW5ncyIsImkiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsInNUYXJnZXRQcm9wZXJ0eSIsImluZGV4IiwiY29uY2F0Iiwib1ByZXZpb3VzQ29udGV4dCIsIm9UYXJnZXRDb250cm9sIiwic2V0QmluZGluZ0NvbnRleHQiLCJpc0tlZXBBbGl2ZSIsImJLZWVwQWxpdmUiLCJmbkJlZm9yZURlc3Ryb3kiLCJiUmVxdWVzdE1lc3NhZ2VzIiwiZW5kc1dpdGgiLCJzTWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsInNldEtlZXBBbGl2ZSIsImtlcHRBbGl2ZVNlZ21lbnRzIiwiYWRkaXRpb25uYWxTZWdtZW50cyIsInBvcCIsImtlcHRBbGl2ZVBhdGgiLCJqb2luIiwib0tlZXBBbGl2ZUNvbnRleHQiLCJnZXRLZWVwQWxpdmVDb250ZXh0IiwicmV2ZXJzZSIsImFkZGl0aW9ubmFsUGF0aCIsInN3aXRjaEZ1bGxTY3JlZW4iLCJvU291cmNlIiwib0ZDTEhlbHBlck1vZGVsIiwiYklzRnVsbFNjcmVlbiIsInNOZXh0TGF5b3V0IiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsIl9yb3V0aW5nIiwic0xheW91dCIsIndhcm5pbmciLCJjbG9zZUNvbHVtbiIsIm9WaWV3RGF0YSIsImlzRHJhZnRTdXBwb3J0ZWQiLCJkcmFmdCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsIkZ1bmN0aW9uIiwicHJvdG90eXBlIiwiTmF2aWdhdGlvblR5cGUiLCJCYWNrTmF2aWdhdGlvbiIsIkNvbnRyb2xsZXJFeHRlbnNpb24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkludGVybmFsUm91dGluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQnVzeUxvY2tlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQnVzeUxvY2tlclwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IHR5cGUgUm91dGVyUHJveHkgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL3JvdXRpbmcvUm91dGVyUHJveHlcIjtcbmltcG9ydCB0eXBlIHsgRW5oYW5jZVdpdGhVSTUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgbWV0aG9kT3ZlcnJpZGUsIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFNlbWFudGljS2V5SGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1NlbWFudGljS2V5SGVscGVyXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgUm91dGluZ1NlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCB0eXBlIFJvdXRlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZXJcIjtcbmltcG9ydCBGaWx0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJcIjtcbmltcG9ydCBGaWx0ZXJPcGVyYXRvciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlck9wZXJhdG9yXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuXG4vKipcbiAqIHtAbGluayBzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlckV4dGVuc2lvbiBDb250cm9sbGVyIGV4dGVuc2lvbn1cbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxSb3V0aW5nXG4gKiBAcHJpdmF0ZVxuICogQHNpbmNlIDEuNzQuMFxuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbFJvdXRpbmdcIilcbmNsYXNzIEludGVybmFsUm91dGluZyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblx0cHJpdmF0ZSBfb1ZpZXchOiBWaWV3O1xuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXHRwcml2YXRlIF9vUGFnZUNvbXBvbmVudCE6IEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50PiB8IG51bGw7XG5cdHByaXZhdGUgX29Sb3V0ZXIhOiBSb3V0ZXI7XG5cdHByaXZhdGUgX29Sb3V0aW5nU2VydmljZSE6IFJvdXRpbmdTZXJ2aWNlO1xuXHRwcml2YXRlIF9vUm91dGVyUHJveHkhOiBSb3V0ZXJQcm94eTtcblx0cHJpdmF0ZSBfZm5Sb3V0ZU1hdGNoZWRCb3VuZCE6IEZ1bmN0aW9uO1xuXHRwcm90ZWN0ZWQgX29UYXJnZXRJbmZvcm1hdGlvbjogYW55O1xuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uRXhpdCgpIHtcblx0XHRpZiAodGhpcy5fb1JvdXRpbmdTZXJ2aWNlKSB7XG5cdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UuZGV0YWNoUm91dGVNYXRjaGVkKHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQpO1xuXHRcdH1cblx0fVxuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uSW5pdCgpIHtcblx0XHR0aGlzLl9vVmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLl9vVmlldyk7XG5cdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgPSBDb21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3IodGhpcy5fb1ZpZXcpIGFzIEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50Pjtcblx0XHR0aGlzLl9vUm91dGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb3V0ZXIoKTtcblx0XHR0aGlzLl9vUm91dGVyUHJveHkgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvdXRlclByb3h5KCk7XG5cblx0XHRpZiAoIXRoaXMuX29BcHBDb21wb25lbnQgfHwgIXRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb250cm9sZXIgZXh0ZW5zaW9uICdzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZXNpb25zLkludGVybmFsUm91dGluZ1wiKTtcblx0XHR9XG5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGlmICh0aGlzLl9vQXBwQ29tcG9uZW50ID09PSB0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0Ly8gVGhlIHZpZXcgaXNuJ3QgaG9zdGVkIGluIGEgZGVkaWNhdGVkIFVJQ29tcG9uZW50LCBidXQgZGlyZWN0bHkgaW4gdGhlIGFwcFxuXHRcdFx0Ly8gLS0+IGp1c3Qga2VlcCB0aGUgdmlld1xuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgPSBudWxsO1xuXHRcdH1cblxuXHRcdHRoaXMuX29BcHBDb21wb25lbnRcblx0XHRcdC5nZXRTZXJ2aWNlKFwicm91dGluZ1NlcnZpY2VcIilcblx0XHRcdC50aGVuKChvUm91dGluZ1NlcnZpY2U6IFJvdXRpbmdTZXJ2aWNlKSA9PiB7XG5cdFx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZSA9IG9Sb3V0aW5nU2VydmljZTtcblx0XHRcdFx0dGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCA9IHRoaXMuX29uUm91dGVNYXRjaGVkLmJpbmQodGhpcyk7XG5cdFx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5hdHRhY2hSb3V0ZU1hdGNoZWQodGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdFx0XHRcdHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbiA9IG9Sb3V0aW5nU2VydmljZS5nZXRUYXJnZXRJbmZvcm1hdGlvbkZvcih0aGlzLl9vUGFnZUNvbXBvbmVudCB8fCB0aGlzLl9vVmlldyk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhpcyBjb250cm9sbGVyIGV4dGVuc2lvbiBjYW5ub3Qgd29yayB3aXRob3V0IGEgJ3JvdXRpbmdTZXJ2aWNlJyBvbiB0aGUgbWFpbiBBcHBDb21wb25lbnRcIik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmlnZ2VyZWQgZXZlcnkgdGltZSB0aGlzIGNvbnRyb2xsZXIgaXMgYSBuYXZpZ2F0aW9uIHRhcmdldC5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25Sb3V0ZU1hdGNoZWQoKSB7XG5cdFx0LyoqL1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJvdXRlTWF0Y2hlZEZpbmlzaGVkKCkge1xuXHRcdC8qKi9cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVCaW5kaW5nKG9CaW5kaW5nQ29udGV4dDogYW55LCBtUGFyYW1ldGVycz86IGFueSkge1xuXHRcdGNvbnN0IG9Sb3V0aW5nID0gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkucm91dGluZztcblx0XHRpZiAob1JvdXRpbmcgJiYgb1JvdXRpbmcub25CZWZvcmVCaW5kaW5nKSB7XG5cdFx0XHRvUm91dGluZy5vbkJlZm9yZUJpbmRpbmcob0JpbmRpbmdDb250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkFmdGVyQmluZGluZyhvQmluZGluZ0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpIHtcblx0XHQodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpLm9uQ29udGV4dEJvdW5kVG9WaWV3KG9CaW5kaW5nQ29udGV4dCk7XG5cdFx0Y29uc3Qgb1JvdXRpbmcgPSAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5yb3V0aW5nO1xuXHRcdGlmIChvUm91dGluZyAmJiBvUm91dGluZy5vbkFmdGVyQmluZGluZykge1xuXHRcdFx0b1JvdXRpbmcub25BZnRlckJpbmRpbmcob0JpbmRpbmdDb250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0cmlnZ2VyaW5nIGEgbmF2aWdhdGlvbiBhZnRlciBhIHVzZXIgYWN0aW9uXG5cdC8vIChlLmcuIGNsaWNrIG9uIGEgdGFibGUgcm93LCBidXR0b24sIGV0Yy4uLilcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlvbiB0YXJnZXQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBzTmF2aWdhdGlvblRhcmdldE5hbWUgTmFtZSBvZiB0aGUgbmF2aWdhdGlvbiB0YXJnZXRcblx0ICogQHBhcmFtIGJQcmVzZXJ2ZUhpc3RvcnkgVHJ1ZSB0byBmb3JjZSB0aGUgbmV3IFVSTCB0byBiZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBicm93c2VyIGhpc3RvcnkgKG5vIHJlcGxhY2UpXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9UYXJnZXQob0NvbnRleHQ6IGFueSwgc05hdmlnYXRpb25UYXJnZXROYW1lOiBzdHJpbmcsIGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuKSB7XG5cdFx0Y29uc3Qgb05hdmlnYXRpb25Db25maWd1cmF0aW9uID1cblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ICYmXG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiAmJlxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24oc05hdmlnYXRpb25UYXJnZXROYW1lKTtcblx0XHRpZiAob05hdmlnYXRpb25Db25maWd1cmF0aW9uKSB7XG5cdFx0XHRjb25zdCBvRGV0YWlsUm91dGUgPSBvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24uZGV0YWlsO1xuXHRcdFx0Y29uc3Qgc1JvdXRlTmFtZSA9IG9EZXRhaWxSb3V0ZS5yb3V0ZTtcblx0XHRcdGNvbnN0IG1QYXJhbWV0ZXJNYXBwaW5nID0gb0RldGFpbFJvdXRlLnBhcmFtZXRlcnM7XG5cdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUbyhvQ29udGV4dCwgc1JvdXRlTmFtZSwgbVBhcmFtZXRlck1hcHBpbmcsIGJQcmVzZXJ2ZUhpc3RvcnkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUbyhvQ29udGV4dCwgbnVsbCwgbnVsbCwgYlByZXNlcnZlSGlzdG9yeSk7XG5cdFx0fVxuXHRcdHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlvbiB0YXJnZXQgcm91dGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBzVGFyZ2V0Um91dGVOYW1lIE5hbWUgb2YgdGhlIHRhcmdldCByb3V0ZVxuXHQgKiBAcGFyYW0gW29QYXJhbWV0ZXJzXSBQYXJhbWV0ZXJzIHRvIGJlIHVzZWQgd2l0aCByb3V0ZSB0byBjcmVhdGUgdGhlIHRhcmdldCBoYXNoXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZTogc3RyaW5nLCBvUGFyYW1ldGVycz86IG9iamVjdCkge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUb1JvdXRlKHNUYXJnZXRSb3V0ZU5hbWUsIG9QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3Qgb0NvbnRleHRJbmZvOiBhbnkgPSB7fTtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdFx0aWYgKG9Db250ZXh0LmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuYXN5bmNDb250ZXh0KSB7XG5cdFx0XHRcdC8vIHRoZSBjb250ZXh0IGlzIGVpdGhlciBjcmVhdGVkIGFzeW5jIChQcm9taXNlKVxuXHRcdFx0XHQvLyBXZSBuZWVkIHRvIGFjdGl2YXRlIHRoZSByb3V0ZU1hdGNoU3luY2hybyBvbiB0aGUgUm91dGVyUHJveHkgdG8gYXZvaWQgdGhhdFxuXHRcdFx0XHQvLyB0aGUgc3Vic2VxdWVudCBjYWxsIHRvIG5hdmlnYXRlVG9Db250ZXh0IGNvbmZsaWN0cyB3aXRoIHRoZSBjdXJyZW50IG9uZVxuXHRcdFx0XHR0aGlzLl9vUm91dGVyUHJveHkuYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uKCk7XG5cblx0XHRcdFx0bVBhcmFtZXRlcnMuYXN5bmNDb250ZXh0XG5cdFx0XHRcdFx0LnRoZW4oKGFzeW5jQ29udGV4dDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHQvLyBvbmNlIHRoZSBjb250ZXh0IGlzIHJldHVybmVkIHdlIG5hdmlnYXRlIGludG8gaXRcblx0XHRcdFx0XHRcdHRoaXMubmF2aWdhdGVUb0NvbnRleHQoYXN5bmNDb250ZXh0LCB7XG5cdFx0XHRcdFx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiBtUGFyYW1ldGVycy5jaGVja05vSGFzaENoYW5nZSxcblx0XHRcdFx0XHRcdFx0ZWRpdGFibGU6IG1QYXJhbWV0ZXJzLmVkaXRhYmxlLFxuXHRcdFx0XHRcdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiBtUGFyYW1ldGVycy5iUGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0XHRcdFx0XHR1cGRhdGVGQ0xMZXZlbDogbVBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwsXG5cdFx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiBtUGFyYW1ldGVycy5iRm9yY2VGb2N1c1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aXRoIHRoZSBhc3luYyBjb250ZXh0XCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgaWYgKCFtUGFyYW1ldGVycy5iRGVmZXJyZWRDb250ZXh0KSB7XG5cdFx0XHRcdC8vIE5hdmlnYXRlIHRvIGEgbGlzdCBiaW5kaW5nIG5vdCB5ZXQgc3VwcG9ydGVkXG5cdFx0XHRcdHRocm93IFwibmF2aWdhdGlvbiB0byBhIGxpc3QgYmluZGluZyBpcyBub3QgeWV0IHN1cHBvcnRlZFwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5jYWxsRXh0ZW5zaW9uKSB7XG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHRcdFx0b0ludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgbnVsbCk7XG5cblx0XHRcdG9Db250ZXh0SW5mby5zb3VyY2VCaW5kaW5nQ29udGV4dCA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0b0NvbnRleHRJbmZvLmJpbmRpbmdDb250ZXh0ID0gb0NvbnRleHQ7XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMub0V2ZW50KSB7XG5cdFx0XHRcdG9Db250ZXh0SW5mby5vRXZlbnQgPSBtUGFyYW1ldGVycy5vRXZlbnQ7XG5cdFx0XHR9XG5cdFx0XHQvLyBTdG9yaW5nIHRoZSBzZWxlY3RlZCBjb250ZXh0IHRvIHVzZSBpdCBpbiBpbnRlcm5hbCByb3V0ZSBuYXZpZ2F0aW9uIGlmIG5lY2Nlc3NhcnkuXG5cdFx0XHRjb25zdCBiT3ZlcnJpZGVOYXYgPSAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5yb3V0aW5nLm9uQmVmb3JlTmF2aWdhdGlvbihvQ29udGV4dEluZm8pO1xuXHRcdFx0aWYgKGJPdmVycmlkZU5hdikge1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBvQ29udGV4dCk7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzLkZDTExldmVsID0gdGhpcy5fZ2V0RkNMTGV2ZWwoKTtcblxuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIG1QYXJhbWV0ZXJzLCB0aGlzLl9vVmlldy5nZXRWaWV3RGF0YSgpLCB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBiYWNrd2FyZHMgZnJvbSBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIG5hdmlnYXRlZCBmcm9tXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KSB7XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9IC0xO1xuXG5cdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgZm9yd2FyZHMgdG8gYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChvQ29udGV4dDogYW55LCBtUGFyYW1ldGVycz86IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmICh0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5nZXRQcm9wZXJ0eShcIm1lc3NhZ2VGb290ZXJDb250YWluc0Vycm9yc1wiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBiYWNrIGluIGhpc3RvcnkgaWYgdGhlIGN1cnJlbnQgaGFzaCBjb3JyZXNwb25kcyB0byBhIHRyYW5zaWVudCBzdGF0ZS5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUoKSB7XG5cdFx0Y29uc3Qgc0hhc2ggPSB0aGlzLl9vUm91dGVyUHJveHkuZ2V0SGFzaCgpO1xuXG5cdFx0Ly8gaWYgdHJpZ2dlcmVkIHdoaWxlIG5hdmlnYXRpbmcgdG8gKC4uLiksIHdlIG5lZWQgdG8gbmF2aWdhdGUgYmFja1xuXHRcdGlmIChzSGFzaC5pbmRleE9mKFwiKC4uLilcIikgIT09IC0xKSB7XG5cdFx0XHR0aGlzLl9vUm91dGVyUHJveHkubmF2QmFjaygpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2Uoc0Vycm9yTWVzc2FnZTogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRpZiAoXG5cdFx0XHR0aGlzLl9vUm91dGVyUHJveHkuZ2V0SGFzaCgpLmluZGV4T2YoXCJpLWFjdGlvbj1jcmVhdGVcIikgPiAtMSB8fFxuXHRcdFx0dGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmRleE9mKFwiaS1hY3Rpb249YXV0b0NyZWF0ZVwiKSA+IC0xXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRlclByb3h5Lm5hdlRvSGFzaCh0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0RGVmYXVsdENyZWF0ZUhhc2goKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLkZDTExldmVsID0gdGhpcy5fZ2V0RkNMTGV2ZWwoKTtcblxuXHRcdFx0cmV0dXJuICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuZGlzcGxheUVycm9yUGFnZShzRXJyb3JNZXNzYWdlLCBtUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBvbmUgb2YgdGhlIGN1cnJlbnQgdmlld3Mgb24gdGhlIHNjcmVlbiBpcyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHN0YXRlIGlzIGltcGFjdGVkIGJ5IHRoZSBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShvQ29udGV4dDogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5pc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkob0NvbnRleHQpO1xuXHR9XG5cblx0X2lzVmlld1BhcnRPZlJvdXRlKHJvdXRlSW5mb3JtYXRpb246IGFueSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFUYXJnZXRzID0gcm91dGVJbmZvcm1hdGlvbj8udGFyZ2V0cztcblx0XHRpZiAoIWFUYXJnZXRzIHx8IGFUYXJnZXRzLmluZGV4T2YodGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLnRhcmdldE5hbWUpID09PSAtMSkge1xuXHRcdFx0Ly8gSWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGhhcyBhIHZpZXcgbGV2ZWwgZ3JlYXRlciB0aGFuIHRoZSByb3V0ZSBsZXZlbCwgaXQgbWVhbnMgdGhpcyB2aWV3IGNvbWVzIFwiYWZ0ZXJcIiB0aGUgcm91dGVcblx0XHRcdC8vIGluIHRlcm1zIG9mIG5hdmlnYXRpb24uXG5cdFx0XHQvLyBJbiBzdWNoIGNhc2UsIHdlIHJlbW92ZSBpdHMgYmluZGluZyBjb250ZXh0LCB0byBhdm9pZCB0aGlzIHZpZXcgdG8gaGF2ZSBkYXRhIGlmIHdlIG5hdmlnYXRlIHRvIGl0IGxhdGVyIG9uXG5cdFx0XHRpZiAoKHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi52aWV3TGV2ZWwgPz8gMCkgPj0gKHJvdXRlSW5mb3JtYXRpb24/LnJvdXRlTGV2ZWwgPz8gMCkpIHtcblx0XHRcdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQobnVsbCk7IC8vIFRoaXMgYWxzbyBjYWxsIHNldEtlZXBBbGl2ZShmYWxzZSkgb24gdGhlIGN1cnJlbnQgY29udGV4dFxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X2J1aWxkQmluZGluZ1BhdGgocm91dGVBcmd1bWVudHM6IGFueSwgYmluZGluZ1BhdHRlcm46IHN0cmluZywgbmF2aWdhdGlvblBhcmFtZXRlcnM6IGFueSk6IHsgcGF0aDogc3RyaW5nOyBkZWZlcnJlZDogYm9vbGVhbiB9IHtcblx0XHRsZXQgcGF0aCA9IGJpbmRpbmdQYXR0ZXJuLnJlcGxhY2UoXCI6P3F1ZXJ5OlwiLCBcIlwiKTtcblx0XHRsZXQgZGVmZXJyZWQgPSBmYWxzZTtcblxuXHRcdGZvciAoY29uc3Qgc0tleSBpbiByb3V0ZUFyZ3VtZW50cykge1xuXHRcdFx0Y29uc3Qgc1ZhbHVlID0gcm91dGVBcmd1bWVudHNbc0tleV07XG5cdFx0XHRpZiAoc1ZhbHVlID09PSBcIi4uLlwiICYmIGJpbmRpbmdQYXR0ZXJuLmluZGV4T2YoYHske3NLZXl9fWApID49IDApIHtcblx0XHRcdFx0ZGVmZXJyZWQgPSB0cnVlO1xuXHRcdFx0XHQvLyBTb21ldGltZXMgaW4gcHJlZmVycmVkTW9kZSA9IGNyZWF0ZSwgdGhlIGVkaXQgYnV0dG9uIGlzIHNob3duIGluIGJhY2tncm91bmQgd2hlbiB0aGVcblx0XHRcdFx0Ly8gYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cgc2hvd3MgdXAsIHNldHRpbmcgYlRhcmdldEVkaXRhYmxlIHBhc3NlcyBlZGl0YWJsZSBhcyB0cnVlXG5cdFx0XHRcdC8vIHRvIG9uQmVmb3JlQmluZGluZyBpbiBfYmluZFRhcmdldFBhZ2UgZnVuY3Rpb25cblx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHBhdGggPSBwYXRoLnJlcGxhY2UoYHske3NLZXl9fWAsIHNWYWx1ZSk7XG5cdFx0fVxuXHRcdGlmIChyb3V0ZUFyZ3VtZW50c1tcIj9xdWVyeVwiXSAmJiByb3V0ZUFyZ3VtZW50c1tcIj9xdWVyeVwiXS5oYXNPd25Qcm9wZXJ0eShcImktYWN0aW9uXCIpKSB7XG5cdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyB0aGUgYmluZGluZyBwYXRoIGlzIGFsd2F5cyBhYnNvbHV0ZVxuXHRcdGlmIChwYXRoICYmIHBhdGhbMF0gIT09IFwiL1wiKSB7XG5cdFx0XHRwYXRoID0gYC8ke3BhdGh9YDtcblx0XHR9XG5cblx0XHRyZXR1cm4geyBwYXRoLCBkZWZlcnJlZCB9O1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0byBiaW5kIHRoZSBwYWdlIHdoZW4gYSByb3V0ZSBpcyBtYXRjaGVkXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZC5cblx0ICogQnVpbGRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZnJvbSB0aGUgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzLCBhbmQgYmluZCB0aGUgcGFnZSBhY2NvcmRpbmdseS5cblx0ICpcblx0ICogQHBhcmFtIG9FdmVudFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9vblJvdXRlTWF0Y2hlZChvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGlzIHBhcnQgb2YgdGhlIGV2ZW50IHRhcmdldHMgKGkuZS4gaXMgYSB0YXJnZXQgZm9yIHRoZSBjdXJyZW50IHJvdXRlKS5cblx0XHQvLyBJZiBub3QsIHdlIGRvbid0IG5lZWQgdG8gYmluZCBpdCAtLT4gcmV0dXJuXG5cdFx0aWYgKCF0aGlzLl9pc1ZpZXdQYXJ0T2ZSb3V0ZShvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVJbmZvcm1hdGlvblwiKSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZXRyaWV2ZSB0aGUgYmluZGluZyBjb250ZXh0IHBhdHRlcm5cblx0XHRsZXQgYmluZGluZ1BhdHRlcm47XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0UGF0dGVybikge1xuXHRcdFx0YmluZGluZ1BhdHRlcm4gPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4oKTtcblx0XHR9XG5cdFx0YmluZGluZ1BhdHRlcm4gPSBiaW5kaW5nUGF0dGVybiB8fCB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24uY29udGV4dFBhdHRlcm47XG5cblx0XHRpZiAoYmluZGluZ1BhdHRlcm4gPT09IG51bGwgfHwgYmluZGluZ1BhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gRG9uJ3QgZG8gdGhpcyBpZiB3ZSBhbHJlYWR5IGdvdCBzVGFyZ2V0ID09ICcnLCB3aGljaCBpcyBhIHZhbGlkIHRhcmdldCBwYXR0ZXJuXG5cdFx0XHRiaW5kaW5nUGF0dGVybiA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJyb3V0ZVBhdHRlcm5cIik7XG5cdFx0fVxuXG5cdFx0Ly8gUmVwbGFjZSB0aGUgcGFyYW1ldGVycyBieSB0aGVpciB2YWx1ZXMgaW4gdGhlIGJpbmRpbmcgY29udGV4dCBwYXR0ZXJuXG5cdFx0Y29uc3QgbUFyZ3VtZW50cyA9IChvRXZlbnQuZ2V0UGFyYW1ldGVycygpIGFzIGFueSkuYXJndW1lbnRzO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJuYXZpZ2F0aW9uSW5mb1wiKTtcblx0XHRjb25zdCB7IHBhdGgsIGRlZmVycmVkIH0gPSB0aGlzLl9idWlsZEJpbmRpbmdQYXRoKG1Bcmd1bWVudHMsIGJpbmRpbmdQYXR0ZXJuLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXG5cdFx0dGhpcy5vblJvdXRlTWF0Y2hlZCgpO1xuXG5cdFx0Y29uc3Qgb01vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsO1xuXHRcdGxldCBvT3V0O1xuXHRcdGlmIChkZWZlcnJlZCkge1xuXHRcdFx0b091dCA9IHRoaXMuX2JpbmREZWZlcnJlZChwYXRoLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvT3V0ID0gdGhpcy5fYmluZFBhZ2UocGF0aCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH1cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9jYXRjaC1vci1yZXR1cm5cblx0XHRvT3V0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0dGhpcy5vblJvdXRlTWF0Y2hlZEZpbmlzaGVkKCk7XG5cdFx0fSk7XG5cblx0XHQodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpLnVwZGF0ZVVJU3RhdGVGb3JWaWV3KHRoaXMuX29WaWV3LCB0aGlzLl9nZXRGQ0xMZXZlbCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZlcnJlZCBiaW5kaW5nIChkdXJpbmcgb2JqZWN0IGNyZWF0aW9uKS5cblx0ICpcblx0ICogQHBhcmFtIHNUYXJnZXRQYXRoIFRoZSBwYXRoIHRvIHRoZSBkZWZmZXJlZCBjb250ZXh0XG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9iaW5kRGVmZXJyZWQoc1RhcmdldFBhdGg6IHN0cmluZywgb05hdmlnYXRpb25QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHR0aGlzLm9uQmVmb3JlQmluZGluZyhudWxsLCB7IGVkaXRhYmxlOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlIH0pO1xuXG5cdFx0aWYgKG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iRGVmZXJyZWRDb250ZXh0IHx8ICFvTmF2aWdhdGlvblBhcmFtZXRlcnMub0FzeW5jQ29udGV4dCkge1xuXHRcdFx0Ly8gZWl0aGVyIHRoZSBjb250ZXh0IHNoYWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHRhcmdldCBwYWdlIChkZWZlcnJlZCBDb250ZXh0KSBvciBpdCBzaGFsbFxuXHRcdFx0Ly8gYmUgY3JlYXRlZCBhc3luYyBidXQgdGhlIHVzZXIgcmVmcmVzaGVkIHRoZSBwYWdlIC8gYm9va21hcmtlZCB0aGlzIFVSTFxuXHRcdFx0Ly8gVE9ETzogY3VycmVudGx5IHRoZSB0YXJnZXQgY29tcG9uZW50IGNyZWF0ZXMgdGhpcyBkb2N1bWVudCBidXQgd2Ugc2hhbGwgbW92ZSB0aGlzIHRvXG5cdFx0XHQvLyBhIGNlbnRyYWwgcGxhY2Vcblx0XHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5jcmVhdGVEZWZlcnJlZENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuY3JlYXRlRGVmZXJyZWRDb250ZXh0KFxuXHRcdFx0XHRcdHNUYXJnZXRQYXRoLFxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy51c2VDb250ZXh0LFxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgY3VycmVudEJpbmRpbmdDb250ZXh0ID0gdGhpcy5fZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRpZiAoY3VycmVudEJpbmRpbmdDb250ZXh0Py5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHQvLyBGb3Igbm93IHJlbW92ZSB0aGUgcGVuZGluZyBjaGFuZ2VzIHRvIGF2b2lkIHRoZSBtb2RlbCByYWlzZXMgZXJyb3JzIGFuZCB0aGUgb2JqZWN0IHBhZ2UgaXMgYXQgbGVhc3QgYm91bmRcblx0XHRcdC8vIElkZWFsbHkgdGhlIHVzZXIgc2hvdWxkIGJlIGFza2VkIGZvclxuXHRcdFx0Y3VycmVudEJpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHR9XG5cblx0XHQvLyByZW1vdmUgdGhlIGNvbnRleHQgdG8gYXZvaWQgc2hvd2luZyBvbGQgZGF0YVxuXHRcdHRoaXMuX3NldEJpbmRpbmdDb250ZXh0KG51bGwpO1xuXG5cdFx0dGhpcy5vbkFmdGVyQmluZGluZyhudWxsKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGZyb20gYSBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1RhcmdldFBhdGggVGhlIHBhdGggdG8gdGhlIGNvbnRleHRcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGJpbmRpbmcgaGFzIGJlZW4gc2V0IG9uIHRoZSBwYWdlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2JpbmRQYWdlKHNUYXJnZXRQYXRoOiBzdHJpbmcsIG9Nb2RlbDogT0RhdGFNb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzOiBvYmplY3QpIHtcblx0XHRpZiAoc1RhcmdldFBhdGggPT09IFwiXCIpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYmluZFBhZ2VUb0NvbnRleHQobnVsbCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3Jlc29sdmVTZW1hbnRpY1BhdGgoc1RhcmdldFBhdGgsIG9Nb2RlbClcblx0XHRcdFx0LnRoZW4oKHNUZWNobmljYWxQYXRoOiBhbnkpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9iaW5kUGFnZVRvUGF0aChzVGVjaG5pY2FsUGF0aCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goKG9FcnJvcjogYW55KSA9PiB7XG5cdFx0XHRcdFx0Ly8gRXJyb3IgaGFuZGxpbmcgZm9yIGVycm9uZW91cyBtZXRhZGF0YSByZXF1ZXN0XG5cdFx0XHRcdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblxuXHRcdFx0XHRcdHRoaXMubmF2aWdhdGVUb01lc3NhZ2VQYWdlKG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfREFUQV9SRUNFSVZFRF9FUlJPUlwiKSwge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogb0Vycm9yLm1lc3NhZ2Vcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGhlIGZpbHRlciB0byByZXRyaWV2ZSBhIGNvbnRleHQgY29ycmVzcG9uZGluZyB0byBhIHNlbWFudGljIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzU2VtYW50aWNQYXRoIFRoZSBzZW1hbnRpYyBwYXRoXG5cdCAqIEBwYXJhbSBhU2VtYW50aWNLZXlzIFRoZSBzZW1hbnRpYyBrZXlzIGZvciB0aGUgcGF0aFxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgaW5zdGFuY2Ugb2YgdGhlIG1ldGEgbW9kZWxcblx0ICogQHJldHVybnMgVGhlIGZpbHRlclxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9jcmVhdGVGaWx0ZXJGcm9tU2VtYW50aWNQYXRoKHNTZW1hbnRpY1BhdGg6IHN0cmluZywgYVNlbWFudGljS2V5czogYW55W10sIG9NZXRhTW9kZWw6IG9iamVjdCkge1xuXHRcdGNvbnN0IGZuVW5xdW90ZUFuZERlY29kZSA9IGZ1bmN0aW9uIChzVmFsdWU6IGFueSkge1xuXHRcdFx0aWYgKHNWYWx1ZS5pbmRleE9mKFwiJ1wiKSA9PT0gMCAmJiBzVmFsdWUubGFzdEluZGV4T2YoXCInXCIpID09PSBzVmFsdWUubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHQvLyBSZW1vdmUgdGhlIHF1b3RlcyBmcm9tIHRoZSB2YWx1ZSBhbmQgZGVjb2RlIHNwZWNpYWwgY2hhcnNcblx0XHRcdFx0c1ZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KHNWYWx1ZS5zdWJzdHJpbmcoMSwgc1ZhbHVlLmxlbmd0aCAtIDEpKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBzVmFsdWU7XG5cdFx0fTtcblx0XHRjb25zdCBhS2V5VmFsdWVzID0gc1NlbWFudGljUGF0aC5zdWJzdHJpbmcoc1NlbWFudGljUGF0aC5pbmRleE9mKFwiKFwiKSArIDEsIHNTZW1hbnRpY1BhdGgubGVuZ3RoIC0gMSkuc3BsaXQoXCIsXCIpO1xuXHRcdGxldCBhRmlsdGVyczogRmlsdGVyW107XG5cblx0XHRpZiAoYVNlbWFudGljS2V5cy5sZW5ndGggIT0gYUtleVZhbHVlcy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGNvbnN0IGJGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlID0gTW9kZWxIZWxwZXIuaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKG9NZXRhTW9kZWwpO1xuXG5cdFx0aWYgKGFTZW1hbnRpY0tleXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHQvLyBUYWtlIHRoZSBmaXJzdCBrZXkgdmFsdWVcblx0XHRcdGNvbnN0IHNLZXlWYWx1ZSA9IGZuVW5xdW90ZUFuZERlY29kZShhS2V5VmFsdWVzWzBdKTtcblx0XHRcdGFGaWx0ZXJzID0gW1xuXHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRwYXRoOiBhU2VtYW50aWNLZXlzWzBdLiRQcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0b3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLkVRLFxuXHRcdFx0XHRcdHZhbHVlMTogc0tleVZhbHVlLFxuXHRcdFx0XHRcdGNhc2VTZW5zaXRpdmU6IGJGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlXG5cdFx0XHRcdH0pXG5cdFx0XHRdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBtS2V5VmFsdWVzOiBhbnkgPSB7fTtcblx0XHRcdC8vIENyZWF0ZSBhIG1hcCBvZiBhbGwga2V5IHZhbHVlc1xuXHRcdFx0YUtleVZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5QXNzaWdubWVudDogc3RyaW5nKSB7XG5cdFx0XHRcdGNvbnN0IGFQYXJ0cyA9IHNLZXlBc3NpZ25tZW50LnNwbGl0KFwiPVwiKSxcblx0XHRcdFx0XHRzS2V5VmFsdWUgPSBmblVucXVvdGVBbmREZWNvZGUoYVBhcnRzWzFdKTtcblxuXHRcdFx0XHRtS2V5VmFsdWVzW2FQYXJ0c1swXV0gPSBzS2V5VmFsdWU7XG5cdFx0XHR9KTtcblxuXHRcdFx0bGV0IGJGYWlsZWQgPSBmYWxzZTtcblx0XHRcdGFGaWx0ZXJzID0gYVNlbWFudGljS2V5cy5tYXAoZnVuY3Rpb24gKG9TZW1hbnRpY0tleTogYW55KSB7XG5cdFx0XHRcdGNvbnN0IHNLZXkgPSBvU2VtYW50aWNLZXkuJFByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRzVmFsdWUgPSBtS2V5VmFsdWVzW3NLZXldO1xuXG5cdFx0XHRcdGlmIChzVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJldHVybiBuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdHBhdGg6IHNLZXksXG5cdFx0XHRcdFx0XHRvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuRVEsXG5cdFx0XHRcdFx0XHR2YWx1ZTE6IHNWYWx1ZSxcblx0XHRcdFx0XHRcdGNhc2VTZW5zaXRpdmU6IGJGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YkZhaWxlZCA9IHRydWU7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdFx0cGF0aDogXCJYWFwiXG5cdFx0XHRcdFx0fSk7IC8vIHdpbGwgYmUgaWdub3JlIGFueXdheSBzaW5jZSB3ZSByZXR1cm4gYWZ0ZXJcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGlmIChiRmFpbGVkKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFkZCBhIGRyYWZ0IGZpbHRlciB0byBtYWtlIHN1cmUgd2UgdGFrZSB0aGUgZHJhZnQgZW50aXR5IGlmIHRoZXJlIGlzIG9uZVxuXHRcdC8vIE9yIHRoZSBhY3RpdmUgZW50aXR5IG90aGVyd2lzZVxuXHRcdGNvbnN0IG9EcmFmdEZpbHRlciA9IG5ldyBGaWx0ZXIoe1xuXHRcdFx0ZmlsdGVyczogW25ldyBGaWx0ZXIoXCJJc0FjdGl2ZUVudGl0eVwiLCBcIkVRXCIsIGZhbHNlKSwgbmV3IEZpbHRlcihcIlNpYmxpbmdFbnRpdHkvSXNBY3RpdmVFbnRpdHlcIiwgXCJFUVwiLCBudWxsKV0sXG5cdFx0XHRhbmQ6IGZhbHNlXG5cdFx0fSk7XG5cdFx0YUZpbHRlcnMucHVzaChvRHJhZnRGaWx0ZXIpO1xuXG5cdFx0cmV0dXJuIG5ldyBGaWx0ZXIoYUZpbHRlcnMsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgcGF0aCB3aXRoIHNlbWFudGljIGtleXMgdG8gYSBwYXRoIHdpdGggdGVjaG5pY2FsIGtleXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBzU2VtYW50aWNQYXRoIFRoZSBwYXRoIHdpdGggc2VtYW50aWMga2V5c1xuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBtb2RlbCBmb3IgdGhlIHBhdGhcblx0ICogQHBhcmFtIGFTZW1hbnRpY0tleXMgVGhlIHNlbWFudGljIGtleXMgZm9yIHRoZSBwYXRoXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSBjb250YWluaW5nIHRoZSBwYXRoIHdpdGggdGVjaG5pY2FsIGtleXMgaWYgc1NlbWFudGljUGF0aCBjb3VsZCBiZSBpbnRlcnByZXRlZCBhcyBhIHNlbWFudGljIHBhdGgsIG51bGwgb3RoZXJ3aXNlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2dldFRlY2huaWNhbFBhdGhGcm9tU2VtYW50aWNQYXRoKHNTZW1hbnRpY1BhdGg6IHN0cmluZywgb01vZGVsOiBhbnksIGFTZW1hbnRpY0tleXM6IGFueVtdKSB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRsZXQgc0VudGl0eVNldFBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KHNTZW1hbnRpY1BhdGgpLmdldFBhdGgoKTtcblxuXHRcdGlmICghYVNlbWFudGljS2V5cyB8fCBhU2VtYW50aWNLZXlzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Ly8gTm8gc2VtYW50aWMga2V5c1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgYSBzZXQgb2YgZmlsdGVycyBjb3JyZXNwb25kaW5nIHRvIGFsbCBrZXlzXG5cdFx0Y29uc3Qgb0ZpbHRlciA9IHRoaXMuX2NyZWF0ZUZpbHRlckZyb21TZW1hbnRpY1BhdGgoc1NlbWFudGljUGF0aCwgYVNlbWFudGljS2V5cywgb01ldGFNb2RlbCk7XG5cdFx0aWYgKG9GaWx0ZXIgPT09IG51bGwpIHtcblx0XHRcdC8vIENvdWxkbid0IGludGVycHJldCB0aGUgcGF0aCBhcyBhIHNlbWFudGljIG9uZVxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcblx0XHR9XG5cblx0XHQvLyBMb2FkIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdFxuXHRcdGlmICghc0VudGl0eVNldFBhdGg/LnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG5cdFx0XHRzRW50aXR5U2V0UGF0aCA9IGAvJHtzRW50aXR5U2V0UGF0aH1gO1xuXHRcdH1cblx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvTW9kZWwuYmluZExpc3Qoc0VudGl0eVNldFBhdGgsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBvRmlsdGVyLCB7XG5cdFx0XHQkJGdyb3VwSWQ6IFwiJGF1dG8uSGVyb2VzXCJcblx0XHR9KTtcblxuXHRcdHJldHVybiBvTGlzdEJpbmRpbmcucmVxdWVzdENvbnRleHRzKDAsIDIpLnRoZW4oZnVuY3Rpb24gKG9Db250ZXh0czogYW55KSB7XG5cdFx0XHRpZiAob0NvbnRleHRzICYmIG9Db250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIG9Db250ZXh0c1swXS5nZXRQYXRoKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBObyBkYXRhIGNvdWxkIGJlIGxvYWRlZFxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBwYXRoIGlzIGVsaWdpYmxlIGZvciBzZW1hbnRpYyBib29rbWFya2luZy5cblx0ICpcblx0ICogQHBhcmFtIHNQYXRoIFRoZSBwYXRoIHRvIHRlc3Rcblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEgbW9kZWxcblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBwYXRoIGlzIGVsaWdpYmxlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2NoZWNrUGF0aEZvclNlbWFudGljQm9va21hcmtpbmcoc1BhdGg6IHN0cmluZywgb01ldGFNb2RlbDogYW55KSB7XG5cdFx0Ly8gT25seSBwYXRoIG9uIHJvb3Qgb2JqZWN0cyBhbGxvdyBzZW1hbnRpYyBib29rbWFya2luZywgaS5lLiBzUGF0aCA9IHh4eCh5eXkpXG5cdFx0Y29uc3QgYU1hdGNoZXMgPSAvXltcXC9dPyhcXHcrKVxcKFteXFwvXStcXCkkLy5leGVjKHNQYXRoKTtcblx0XHRpZiAoIWFNYXRjaGVzKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdC8vIEdldCB0aGUgZW50aXR5U2V0IG5hbWVcblx0XHRjb25zdCBzRW50aXR5U2V0UGF0aCA9IGAvJHthTWF0Y2hlc1sxXX1gO1xuXHRcdC8vIENoZWNrIHRoZSBlbnRpdHkgc2V0IHN1cHBvcnRzIGRyYWZ0IChvdGhlcndpc2Ugd2UgZG9uJ3Qgc3VwcG9ydCBzZW1hbnRpYyBib29rbWFya2luZylcblx0XHRjb25zdCBvRHJhZnRSb290ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0VudGl0eVNldFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RgKTtcblx0XHRjb25zdCBvRHJhZnROb2RlID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0VudGl0eVNldFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGVgKTtcblx0XHRyZXR1cm4gb0RyYWZ0Um9vdCB8fCBvRHJhZnROb2RlID8gdHJ1ZSA6IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJ1aWxkcyBhIHBhdGggd2l0aCBzZW1hbnRpYyBrZXlzIGZyb20gYSBwYXRoIHdpdGggdGVjaG5pY2FsIGtleXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBzUGF0aFRvUmVzb2x2ZSBUaGUgcGF0aCB0byBiZSB0cmFuc2Zvcm1lZFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyBTdHJpbmcgcHJvbWlzZSBmb3IgdGhlIG5ldyBwYXRoLiBJZiBzUGF0aFRvUmVzb2x2ZWQgY291bGRuJ3QgYmUgaW50ZXJwcmV0ZWQgYXMgYSBzZW1hbnRpYyBwYXRoLCBpdCBpcyByZXR1cm5lZCBhcyBpcy5cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfcmVzb2x2ZVNlbWFudGljUGF0aChzUGF0aFRvUmVzb2x2ZTogc3RyaW5nLCBvTW9kZWw6IGFueSk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBvTGFzdFNlbWFudGljTWFwcGluZyA9IHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXRMYXN0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0bGV0IHNDdXJyZW50SGFzaE5vUGFyYW1zID0gdGhpcy5fb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLmdldEhhc2goKS5zcGxpdChcIj9cIilbMF07XG5cblx0XHRpZiAoc0N1cnJlbnRIYXNoTm9QYXJhbXMgJiYgc0N1cnJlbnRIYXNoTm9QYXJhbXMubGFzdEluZGV4T2YoXCIvXCIpID09PSBzQ3VycmVudEhhc2hOb1BhcmFtcy5sZW5ndGggLSAxKSB7XG5cdFx0XHQvLyBSZW1vdmUgdHJhaWxpbmcgJy8nXG5cdFx0XHRzQ3VycmVudEhhc2hOb1BhcmFtcyA9IHNDdXJyZW50SGFzaE5vUGFyYW1zLnN1YnN0cmluZygwLCBzQ3VycmVudEhhc2hOb1BhcmFtcy5sZW5ndGggLSAxKTtcblx0XHR9XG5cblx0XHRsZXQgc1Jvb3RFbnRpdHlOYW1lID0gc0N1cnJlbnRIYXNoTm9QYXJhbXMgJiYgc0N1cnJlbnRIYXNoTm9QYXJhbXMuc3Vic3RyKDAsIHNDdXJyZW50SGFzaE5vUGFyYW1zLmluZGV4T2YoXCIoXCIpKTtcblx0XHRpZiAoc1Jvb3RFbnRpdHlOYW1lLmluZGV4T2YoXCIvXCIpID09PSAwKSB7XG5cdFx0XHRzUm9vdEVudGl0eU5hbWUgPSBzUm9vdEVudGl0eU5hbWUuc3Vic3RyaW5nKDEpO1xuXHRcdH1cblx0XHRjb25zdCBiQWxsb3dTZW1hbnRpY0Jvb2ttYXJrID0gdGhpcy5fY2hlY2tQYXRoRm9yU2VtYW50aWNCb29rbWFya2luZyhzQ3VycmVudEhhc2hOb1BhcmFtcywgb01ldGFNb2RlbCksXG5cdFx0XHRhU2VtYW50aWNLZXlzID0gYkFsbG93U2VtYW50aWNCb29rbWFyayAmJiBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMob01ldGFNb2RlbCwgc1Jvb3RFbnRpdHlOYW1lKTtcblx0XHRpZiAoIWFTZW1hbnRpY0tleXMpIHtcblx0XHRcdC8vIE5vIHNlbWFudGljIGtleXMgYXZhaWxhYmxlIC0tPiB1c2UgdGhlIHBhdGggYXMgaXNcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoc1BhdGhUb1Jlc29sdmUpO1xuXHRcdH0gZWxzZSBpZiAob0xhc3RTZW1hbnRpY01hcHBpbmcgJiYgb0xhc3RTZW1hbnRpY01hcHBpbmcuc2VtYW50aWNQYXRoID09PSBzUGF0aFRvUmVzb2x2ZSkge1xuXHRcdFx0Ly8gVGhpcyBzZW1hbnRpYyBwYXRoIGhhcyBiZWVuIHJlc29sdmVkIHByZXZpb3VzbHlcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUob0xhc3RTZW1hbnRpY01hcHBpbmcudGVjaG5pY2FsUGF0aCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFdlIG5lZWQgcmVzb2x2ZSB0aGUgc2VtYW50aWMgcGF0aCB0byBnZXQgdGhlIHRlY2huaWNhbCBrZXlzXG5cdFx0XHRyZXR1cm4gdGhpcy5fZ2V0VGVjaG5pY2FsUGF0aEZyb21TZW1hbnRpY1BhdGgoc0N1cnJlbnRIYXNoTm9QYXJhbXMsIG9Nb2RlbCwgYVNlbWFudGljS2V5cykudGhlbigoc1RlY2huaWNhbFBhdGg6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAoc1RlY2huaWNhbFBhdGggJiYgc1RlY2huaWNhbFBhdGggIT09IHNQYXRoVG9SZXNvbHZlKSB7XG5cdFx0XHRcdFx0Ly8gVGhlIHNlbWFudGljIHBhdGggd2FzIHJlc29sdmVkIChvdGhlcndpc2Uga2VlcCB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIHRhcmdldClcblx0XHRcdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2Uuc2V0TGFzdFNlbWFudGljTWFwcGluZyh7XG5cdFx0XHRcdFx0XHR0ZWNobmljYWxQYXRoOiBzVGVjaG5pY2FsUGF0aCxcblx0XHRcdFx0XHRcdHNlbWFudGljUGF0aDogc1BhdGhUb1Jlc29sdmVcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRyZXR1cm4gc1RlY2huaWNhbFBhdGg7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIHNQYXRoVG9SZXNvbHZlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGZyb20gYSBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1RhcmdldFBhdGggVGhlIHBhdGggdG8gYnVpbGQgdGhlIGNvbnRleHQuIE5lZWRzIHRvIGNvbnRhaW4gdGVjaG5pY2FsIGtleXMgb25seS5cblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfYmluZFBhZ2VUb1BhdGgoc1RhcmdldFBhdGg6IHN0cmluZywgb01vZGVsOiBhbnksIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogYW55KSB7XG5cdFx0Y29uc3Qgb0N1cnJlbnRDb250ZXh0ID0gdGhpcy5fZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdHNDdXJyZW50UGF0aCA9IG9DdXJyZW50Q29udGV4dCAmJiBvQ3VycmVudENvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0b1VzZUNvbnRleHQgPSBvTmF2aWdhdGlvblBhcmFtZXRlcnMudXNlQ29udGV4dDtcblxuXHRcdC8vIFdlIHNldCB0aGUgYmluZGluZyBjb250ZXh0IG9ubHkgaWYgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBvbmVcblx0XHQvLyBvciBpZiB3ZSBoYXZlIGEgY29udGV4dCBhbHJlYWR5IHNlbGVjdGVkXG5cdFx0aWYgKHNDdXJyZW50UGF0aCAhPT0gc1RhcmdldFBhdGggfHwgKG9Vc2VDb250ZXh0ICYmIG9Vc2VDb250ZXh0LmdldFBhdGgoKSA9PT0gc1RhcmdldFBhdGgpKSB7XG5cdFx0XHRsZXQgb1RhcmdldENvbnRleHQ7XG5cdFx0XHRpZiAob1VzZUNvbnRleHQgJiYgb1VzZUNvbnRleHQuZ2V0UGF0aCgpID09PSBzVGFyZ2V0UGF0aCkge1xuXHRcdFx0XHQvLyBXZSBhbHJlYWR5IGhhdmUgdGhlIGNvbnRleHQgdG8gYmUgdXNlZFxuXHRcdFx0XHRvVGFyZ2V0Q29udGV4dCA9IG9Vc2VDb250ZXh0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHdlIG5lZWQgdG8gY3JlYXRlIGl0IGZyb20gc1RhcmdldFBhdGhcblx0XHRcdFx0b1RhcmdldENvbnRleHQgPSB0aGlzLl9jcmVhdGVDb250ZXh0KHNUYXJnZXRQYXRoLCBvTW9kZWwpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9UYXJnZXRDb250ZXh0ICE9PSBvQ3VycmVudENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fYmluZFBhZ2VUb0NvbnRleHQob1RhcmdldENvbnRleHQsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKCFvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlJlYXNvbklzSWFwcFN0YXRlICYmIEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcblx0XHRcdHRoaXMuX3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQ3VycmVudENvbnRleHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBCaW5kcyB0aGUgcGFnZSB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIGJvdW5kXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2JpbmRQYWdlVG9Db250ZXh0KG9Db250ZXh0OiBDb250ZXh0IHwgbnVsbCwgb01vZGVsOiBPRGF0YU1vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRoaXMub25CZWZvcmVCaW5kaW5nKG51bGwpO1xuXHRcdFx0dGhpcy5vbkFmdGVyQmluZGluZyhudWxsKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBvUGFyZW50TGlzdEJpbmRpbmcgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9ICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGlmICghb1BhcmVudExpc3RCaW5kaW5nIHx8ICFvUGFyZW50TGlzdEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0Ly8gaWYgdGhlIHBhcmVudEJpbmRpbmcgaXMgbm90IGEgbGlzdEJpbmRpbmcsIHdlIGNyZWF0ZSBhIG5ldyBjb250ZXh0XG5cdFx0XHRcdG9Db250ZXh0ID0gdGhpcy5fY3JlYXRlQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCksIG9Nb2RlbCk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXMuX3NldEtlZXBBbGl2ZShcblx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzQ29udGV4dFVzZWRJblBhZ2VzKG9Db250ZXh0KSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHRydWUgLy8gTG9hZCBtZXNzYWdlcywgb3RoZXJ3aXNlIHRoZXkgZG9uJ3QgZ2V0IHJlZnJlc2hlZCBsYXRlciwgZS5nLiBmb3Igc2lkZSBlZmZlY3RzXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdFx0Ly8gc2V0S2VlcEFsaXZlIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHBhcmVudCBsaXN0YmluZGluZyBkb2Vzbid0IGhhdmUgJCRvd25SZXF1ZXN0PXRydWVcblx0XHRcdFx0Ly8gVGhpcyBjYXNlIGZvciBjdXN0b20gZnJhZ21lbnRzIGlzIHN1cHBvcnRlZCwgYnV0IGFuIGVycm9yIGlzIGxvZ2dlZCB0byBtYWtlIHRoZSBsYWNrIG9mIHN5bmNocm9uaXphdGlvbiBhcHBhcmVudFxuXHRcdFx0XHRMb2cuZXJyb3IoXG5cdFx0XHRcdFx0YFZpZXcgZm9yICR7b0NvbnRleHQuZ2V0UGF0aCgpfSB3b24ndCBiZSBzeW5jaHJvbml6ZWQuIFBhcmVudCBsaXN0QmluZGluZyBtdXN0IGhhdmUgYmluZGluZyBwYXJhbWV0ZXIgJCRvd25SZXF1ZXN0PXRydWVgXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICghb1BhcmVudExpc3RCaW5kaW5nIHx8IG9QYXJlbnRMaXN0QmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Ly8gV2UgbmVlZCB0byByZWNyZWF0ZSB0aGUgY29udGV4dCBvdGhlcndpc2Ugd2UgZ2V0IGVycm9yc1xuXHRcdFx0b0NvbnRleHQgPSB0aGlzLl9jcmVhdGVDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSwgb01vZGVsKTtcblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIGJpbmRpbmcgY29udGV4dCB3aXRoIHRoZSBwcm9wZXIgYmVmb3JlL2FmdGVyIGNhbGxiYWNrc1xuXHRcdHRoaXMub25CZWZvcmVCaW5kaW5nKG9Db250ZXh0LCB7XG5cdFx0XHRlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSxcblx0XHRcdGxpc3RCaW5kaW5nOiBvUGFyZW50TGlzdEJpbmRpbmcsXG5cdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlBlcnNpc3RPUFNjcm9sbCxcblx0XHRcdGJEcmFmdE5hdmlnYXRpb246IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iRHJhZnROYXZpZ2F0aW9uLFxuXHRcdFx0c2hvd1BsYWNlaG9sZGVyOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlNob3dQbGFjZWhvbGRlclxuXHRcdH0pO1xuXG5cdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQpO1xuXHRcdHRoaXMub25BZnRlckJpbmRpbmcob0NvbnRleHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBjb250ZXh0IGZyb20gYSBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1BhdGggVGhlIHBhdGhcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGV4dFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9jcmVhdGVDb250ZXh0KHNQYXRoOiBzdHJpbmcsIG9Nb2RlbDogT0RhdGFNb2RlbCkge1xuXHRcdGNvbnN0IG9QYWdlQ29tcG9uZW50ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQsXG5cdFx0XHRzRW50aXR5U2V0ID0gb1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCgpLFxuXHRcdFx0c0NvbnRleHRQYXRoID1cblx0XHRcdFx0KG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoKCkpIHx8IChzRW50aXR5U2V0ICYmIGAvJHtzRW50aXR5U2V0fWApLFxuXHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdG1QYXJhbWV0ZXJzOiBhbnkgPSB7XG5cdFx0XHRcdCQkZ3JvdXBJZDogXCIkYXV0by5IZXJvZXNcIixcblx0XHRcdFx0JCR1cGRhdGVHcm91cElkOiBcIiRhdXRvXCIsXG5cdFx0XHRcdCQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHM6IHRydWVcblx0XHRcdH07XG5cdFx0Ly8gSW4gY2FzZSBvZiBkcmFmdDogJHNlbGVjdCB0aGUgc3RhdGUgZmxhZ3MgKEhhc0FjdGl2ZUVudGl0eSwgSGFzRHJhZnRFbnRpdHksIGFuZCBJc0FjdGl2ZUVudGl0eSlcblx0XHRjb25zdCBvRHJhZnRSb290ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290YCk7XG5cdFx0Y29uc3Qgb0RyYWZ0Tm9kZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZWApO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuX2dldEtlZXBBbGl2ZUNvbnRleHQob01vZGVsLCBzUGF0aCwgZmFsc2UsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY3JlYXRlIGtlZXBBbGl2ZSBjb250ZXh0ICR7c1BhdGh9YCk7XG5cdFx0XHR9IGVsc2UgaWYgKG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSkge1xuXHRcdFx0XHRpZiAob0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdFByb3BlcnR5KFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIl0pO1xuXHRcdFx0XHRcdGlmIChvRHJhZnRSb290KSB7XG5cdFx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gZHJhZnQgYW5kIGVkaXQgd2UgbmVlZCB0byBlbnN1cmUgdGhvc2UgcHJvcGVydGllcyBhcmUgcmVxdWVzdGVkIGFnYWluIGV2ZW4gaWYgdGhleSBhcmUgaW4gdGhlIGJpbmRpbmcncyBjYWNoZVxuXHRcdFx0XHRcdC8vIG90aGVyd2lzZSB3aGVuIHlvdSBlZGl0IGFuZCBnbyB0byB0aGUgc2F2ZWQgdmVyc2lvbiB5b3UgaGF2ZSBubyB3YXkgb2Ygc3dpdGNoaW5nIGJhY2sgdG8gdGhlIGVkaXQgdmVyc2lvblxuXHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhcblx0XHRcdFx0XHRcdG9EcmFmdFJvb3Rcblx0XHRcdFx0XHRcdFx0PyBbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCIsIFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIl1cblx0XHRcdFx0XHRcdFx0OiBbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCJdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb0NvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChzRW50aXR5U2V0KSB7XG5cdFx0XHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWVzc2FnZXMvJFBhdGhgKTtcblx0XHRcdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy4kc2VsZWN0ID0gc01lc3NhZ2VzUGF0aDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBJbiBjYXNlIG9mIGRyYWZ0OiAkc2VsZWN0IHRoZSBzdGF0ZSBmbGFncyAoSGFzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgYW5kIElzQWN0aXZlRW50aXR5KVxuXHRcdFx0aWYgKG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSkge1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuJHNlbGVjdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCA9IFwiSGFzQWN0aXZlRW50aXR5LEhhc0RyYWZ0RW50aXR5LElzQWN0aXZlRW50aXR5XCI7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCArPSBcIixIYXNBY3RpdmVFbnRpdHksSGFzRHJhZnRFbnRpdHksSXNBY3RpdmVFbnRpdHlcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdFx0Y29uc3Qgb1ByZXZpb3VzQmluZGluZyA9ICh0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIGFueSk/LmdldEJpbmRpbmcoKTtcblx0XHRcdFx0b1ByZXZpb3VzQmluZGluZ1xuXHRcdFx0XHRcdD8ucmVzZXRDaGFuZ2VzKClcblx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRvUHJldmlvdXNCaW5kaW5nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlc2V0aW5nIHRoZSBjaGFuZ2VzIHRvIHRoZSBiaW5kaW5nXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG9IaWRkZW5CaW5kaW5nID0gb01vZGVsLmJpbmRDb250ZXh0KHNQYXRoLCB1bmRlZmluZWQsIG1QYXJhbWV0ZXJzKTtcblxuXHRcdFx0b0hpZGRlbkJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlcXVlc3RlZFwiLCAoKSA9PiB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIubG9jayh0aGlzLl9vVmlldyk7XG5cdFx0XHR9KTtcblx0XHRcdG9IaWRkZW5CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZWNlaXZlZFwiLCB0aGlzLm9uRGF0YVJlY2VpdmVkLmJpbmQodGhpcykpO1xuXHRcdFx0cmV0dXJuIG9IaWRkZW5CaW5kaW5nLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRhc3luYyBvbkRhdGFSZWNlaXZlZChvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0Y29uc3Qgc0Vycm9yRGVzY3JpcHRpb24gPSBvRXZlbnQgJiYgb0V2ZW50LmdldFBhcmFtZXRlcihcImVycm9yXCIpO1xuXHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKHRoaXMuX29WaWV3KSkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5fb1ZpZXcpO1xuXHRcdH1cblxuXHRcdGlmIChzRXJyb3JEZXNjcmlwdGlvbikge1xuXHRcdFx0Ly8gVE9ETzogaW4gY2FzZSBvZiA0MDQgdGhlIHRleHQgc2hhbGwgYmUgZGlmZmVyZW50XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBhd2FpdCBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIsIHRydWUpO1xuXHRcdFx0XHRjb25zdCBtZXNzYWdlSGFuZGxlciA9IHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcjtcblx0XHRcdFx0bGV0IG1QYXJhbXMgPSB7fTtcblx0XHRcdFx0aWYgKHNFcnJvckRlc2NyaXB0aW9uLnN0YXR1cyA9PT0gNTAzKSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdGlzSW5pdGlhbExvYWQ1MDNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSBpZiAoc0Vycm9yRGVzY3JpcHRpb24uc3RhdHVzID09PSA0MDApIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SX0RFU0NSSVBUSU9OXCIpLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHNFcnJvckRlc2NyaXB0aW9uLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKG1QYXJhbXMpO1xuXHRcdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZ2V0dGluZyB0aGUgY29yZSByZXNvdXJjZSBidW5kbGVcIiwgb0Vycm9yKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgc2lkZSBlZmZlY3RzIG9uIGEgYmluZGluZyBjb250ZXh0IHRvIFwicmVmcmVzaFwiIGl0LlxuXHQgKiBUT0RPOiBnZXQgcmlkIG9mIHRoaXMgb25jZSBwcm92aWRlZCBieSB0aGUgbW9kZWxcblx0ICogYSByZWZyZXNoIG9uIHRoZSBiaW5kaW5nIGNvbnRleHQgZG9lcyBub3Qgd29yayBpbiBjYXNlIGEgY3JlYXRpb24gcm93IHdpdGggYSB0cmFuc2llbnQgY29udGV4dCBpc1xuXHQgKiB1c2VkLiBhbHNvIGEgcmVxdWVzdFNpZGVFZmZlY3RzIHdpdGggYW4gZW1wdHkgcGF0aCB3b3VsZCBmYWlsIGR1ZSB0byB0aGUgdHJhbnNpZW50IGNvbnRleHRcblx0ICogdGhlcmVmb3JlIHdlIGdldCBhbGwgZGVwZW5kZW50IGJpbmRpbmdzICh2aWEgcHJpdmF0ZSBtb2RlbCBtZXRob2QpIHRvIGRldGVybWluZSBhbGwgcGF0aHMgYW5kIHRoZW5cblx0ICogcmVxdWVzdCB0aGVtLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0JpbmRpbmdDb250ZXh0IENvbnRleHQgdG8gYmUgcmVmcmVzaGVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQmluZGluZ0NvbnRleHQ6IGFueSkge1xuXHRcdGNvbnN0IG9QYWdlQ29tcG9uZW50ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQ7XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzU2VydmljZSA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0Y29uc3Qgc1Jvb3RDb250ZXh0UGF0aCA9IG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0Y29uc3Qgc0VudGl0eVNldCA9IG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQoKTtcblx0XHRjb25zdCBzQ29udGV4dFBhdGggPVxuXHRcdFx0KG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoKCkpIHx8IChzRW50aXR5U2V0ICYmIGAvJHtzRW50aXR5U2V0fWApO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdGxldCBzTWVzc2FnZXNQYXRoO1xuXHRcdGNvbnN0IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRoczogYW55W10gPSBbXTtcblx0XHRjb25zdCBhUHJvcGVydHlQYXRoczogYW55W10gPSBbXTtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHM6IGFueSA9IHtcblx0XHRcdFRhcmdldFByb3BlcnRpZXM6IFtdLFxuXHRcdFx0VGFyZ2V0RW50aXRpZXM6IFtdXG5cdFx0fTtcblxuXHRcdGZ1bmN0aW9uIGdldEJpbmRpbmdQYXRocyhvQmluZGluZzogYW55KSB7XG5cdFx0XHRsZXQgYURlcGVuZGVudEJpbmRpbmdzO1xuXHRcdFx0Y29uc3Qgc1JlbGF0aXZlUGF0aCA9ICgob0JpbmRpbmcuZ2V0Q29udGV4dCgpICYmIG9CaW5kaW5nLmdldENvbnRleHQoKS5nZXRQYXRoKCkpIHx8IFwiXCIpLnJlcGxhY2Uoc1Jvb3RDb250ZXh0UGF0aCwgXCJcIik7IC8vIElmIG5vIGNvbnRleHQsIHRoaXMgaXMgYW4gYWJzb2x1dGUgYmluZGluZyBzbyBubyByZWxhdGl2ZSBwYXRoXG5cdFx0XHRjb25zdCBzUGF0aCA9IChzUmVsYXRpdmVQYXRoID8gYCR7c1JlbGF0aXZlUGF0aC5zbGljZSgxKX0vYCA6IHNSZWxhdGl2ZVBhdGgpICsgb0JpbmRpbmcuZ2V0UGF0aCgpO1xuXG5cdFx0XHRpZiAob0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhQ29udGV4dEJpbmRpbmdcIikpIHtcblx0XHRcdFx0Ly8gaWYgKHNQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRcdC8vIG5vdyBnZXQgdGhlIGRlcGVuZGVudCBiaW5kaW5nc1xuXHRcdFx0XHRhRGVwZW5kZW50QmluZGluZ3MgPSBvQmluZGluZy5nZXREZXBlbmRlbnRCaW5kaW5ncygpO1xuXHRcdFx0XHRpZiAoYURlcGVuZGVudEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0Ly8gYXNrIHRoZSBkZXBlbmRlbnQgYmluZGluZ3MgKGFuZCBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBncm91cElkXG5cdFx0XHRcdFx0Ly9pZiAoYURlcGVuZGVudEJpbmRpbmdzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFEZXBlbmRlbnRCaW5kaW5ncy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0Z2V0QmluZGluZ1BhdGhzKGFEZXBlbmRlbnRCaW5kaW5nc1tpXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5pbmRleE9mKHNQYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0aWYgKGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5pbmRleE9mKHNQYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhUHJvcGVydHlCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGlmIChhUHJvcGVydHlQYXRocy5pbmRleE9mKHNQYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRhUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChzQ29udGV4dFBhdGgpIHtcblx0XHRcdHNNZXNzYWdlc1BhdGggPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWVzc2FnZXMvJFBhdGhgKTtcblx0XHR9XG5cblx0XHQvLyBiaW5kaW5nIG9mIHRoZSBjb250ZXh0IG11c3QgaGF2ZSAkJFBhdGNoV2l0aG91dFNpZGVFZmZlY3RzIHRydWUsIHRoaXMgYm91bmQgY29udGV4dCBtYXkgYmUgbmVlZGVkIHRvIGJlIGZldGNoZWQgZnJvbSB0aGUgZGVwZW5kZW50IGJpbmRpbmdcblx0XHRnZXRCaW5kaW5nUGF0aHMob0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKSk7XG5cblx0XHRsZXQgaTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMucHVzaCh7XG5cdFx0XHRcdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHNbaV1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcyA9IGFQcm9wZXJ0eVBhdGhzO1xuXHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcy5wdXNoKHNNZXNzYWdlc1BhdGgpO1xuXHRcdH1cblx0XHQvL2FsbCB0aGlzIGxvZ2ljIHRvIGJlIHJlcGxhY2VkIHdpdGggYSBTaWRlRWZmZWN0cyByZXF1ZXN0IGZvciBhbiBlbXB0eSBwYXRoIChyZWZyZXNoIGV2ZXJ5dGhpbmcpLCBhZnRlciB0ZXN0aW5nIHRyYW5zaWVudCBjb250ZXh0c1xuXHRcdG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzID0gb1NpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMubWFwKChzVGFyZ2V0UHJvcGVydHk6IFN0cmluZykgPT4ge1xuXHRcdFx0aWYgKHNUYXJnZXRQcm9wZXJ0eSkge1xuXHRcdFx0XHRjb25zdCBpbmRleCA9IHNUYXJnZXRQcm9wZXJ0eS5pbmRleE9mKFwiL1wiKTtcblx0XHRcdFx0aWYgKGluZGV4ID4gMCkge1xuXHRcdFx0XHRcdC8vIG9ubHkgcmVxdWVzdCB0aGUgbmF2aWdhdGlvbiBwYXRoIGFuZCBub3QgdGhlIHByb3BlcnR5IHBhdGhzIGZ1cnRoZXJcblx0XHRcdFx0XHRyZXR1cm4gc1RhcmdldFByb3BlcnR5LnNsaWNlKDAsIGluZGV4KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gc1RhcmdldFByb3BlcnR5O1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdC8vIE9EYXRhIG1vZGVsIHdpbGwgdGFrZSBjYXJlIG9mIGR1cGxpY2F0ZXNcblx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMuY29uY2F0KG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzKSwgb0JpbmRpbmdDb250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2Ugb3IgdGhlIGNvbXBvbmVudC5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGJpbmRpbmcgY29udGV4dFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9nZXRCaW5kaW5nQ29udGV4dCgpOiBDb250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2Ugb3IgdGhlIGNvbXBvbmVudC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBiaW5kaW5nIGNvbnRleHRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQ6IGFueSkge1xuXHRcdGxldCBvUHJldmlvdXNDb250ZXh0LCBvVGFyZ2V0Q29udHJvbDtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdG9QcmV2aW91c0NvbnRleHQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRvVGFyZ2V0Q29udHJvbCA9IHRoaXMuX29QYWdlQ29tcG9uZW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvUHJldmlvdXNDb250ZXh0ID0gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0b1RhcmdldENvbnRyb2wgPSB0aGlzLl9vVmlldztcblx0XHR9XG5cblx0XHRvVGFyZ2V0Q29udHJvbC5zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cblx0XHRpZiAob1ByZXZpb3VzQ29udGV4dCAmJiBvUHJldmlvdXNDb250ZXh0LmlzS2VlcEFsaXZlKCkpIHtcblx0XHRcdHRoaXMuX3NldEtlZXBBbGl2ZShvUHJldmlvdXNDb250ZXh0LCBmYWxzZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGZsZXhpYmxlIGNvbHVtbiBsYXlvdXQgKEZDTCkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgdmlldyAoLTEgaWYgdGhlIGFwcCBpcyBub3QgRkNMKS5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGxldmVsXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2dldEZDTExldmVsKCkge1xuXHRcdHJldHVybiB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24uRkNMTGV2ZWw7XG5cdH1cblxuXHRfc2V0S2VlcEFsaXZlKG9Db250ZXh0OiBDb250ZXh0LCBiS2VlcEFsaXZlOiBib29sZWFuLCBmbkJlZm9yZURlc3Ryb3k/OiBGdW5jdGlvbiwgYlJlcXVlc3RNZXNzYWdlcz86IGJvb2xlYW4pIHtcblx0XHRpZiAob0NvbnRleHQuZ2V0UGF0aCgpLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0Ly8gV2Uga2VlcCB0aGUgY29udGV4dCBhbGl2ZSBvbmx5IGlmIHRoZXkncmUgcGFydCBvZiBhIGNvbGxlY3Rpb24sIGkuZS4gaWYgdGhlIHBhdGggZW5kcyB3aXRoIGEgJyknXG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWVzc2FnZXMvJFBhdGhgKTtcblx0XHRcdG9Db250ZXh0LnNldEtlZXBBbGl2ZShiS2VlcEFsaXZlLCBmbkJlZm9yZURlc3Ryb3ksICEhc01lc3NhZ2VzUGF0aCAmJiBiUmVxdWVzdE1lc3NhZ2VzKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0S2VlcEFsaXZlQ29udGV4dChvTW9kZWw6IE9EYXRhTW9kZWwsIHBhdGg6IHN0cmluZywgYlJlcXVlc3RNZXNzYWdlcz86IGJvb2xlYW4sIHBhcmFtZXRlcnM/OiBhbnkpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHQvLyBHZXQgdGhlIHBhdGggZm9yIHRoZSBjb250ZXh0IHRoYXQgaXMgcmVhbGx5IGtlcHQgYWxpdmUgKHBhcnQgb2YgYSBjb2xsZWN0aW9uKVxuXHRcdC8vIGkuZS4gcmVtb3ZlIGFsbCBzZWdtZW50cyBub3QgZW5kaW5nIHdpdGggYSAnKSdcblx0XHRjb25zdCBrZXB0QWxpdmVTZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdGNvbnN0IGFkZGl0aW9ubmFsU2VnbWVudHM6IHN0cmluZ1tdID0gW107XG5cdFx0d2hpbGUgKGtlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCAmJiAha2VwdEFsaXZlU2VnbWVudHNba2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoIC0gMV0uZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHRhZGRpdGlvbm5hbFNlZ21lbnRzLnB1c2goa2VwdEFsaXZlU2VnbWVudHMucG9wKCkhKTtcblx0XHR9XG5cblx0XHRpZiAoa2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGtlcHRBbGl2ZVBhdGggPSBrZXB0QWxpdmVTZWdtZW50cy5qb2luKFwiL1wiKTtcblx0XHRjb25zdCBvS2VlcEFsaXZlQ29udGV4dCA9IG9Nb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KGtlcHRBbGl2ZVBhdGgsIGJSZXF1ZXN0TWVzc2FnZXMsIHBhcmFtZXRlcnMpO1xuXG5cdFx0aWYgKGFkZGl0aW9ubmFsU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gb0tlZXBBbGl2ZUNvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFkZGl0aW9ubmFsU2VnbWVudHMucmV2ZXJzZSgpO1xuXHRcdFx0Y29uc3QgYWRkaXRpb25uYWxQYXRoID0gYWRkaXRpb25uYWxTZWdtZW50cy5qb2luKFwiL1wiKTtcblx0XHRcdHJldHVybiBvTW9kZWwuYmluZENvbnRleHQoYWRkaXRpb25uYWxQYXRoLCBvS2VlcEFsaXZlQ29udGV4dCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN3aXRjaGVzIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsLXNjcmVlbiBtb2RlIHdoZW4gRkNMIGlzIHVzZWQuXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0c3dpdGNoRnVsbFNjcmVlbigpIHtcblx0XHRjb25zdCBvU291cmNlID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCBvRkNMSGVscGVyTW9kZWwgPSBvU291cmNlLmdldE1vZGVsKFwiZmNsaGVscGVyXCIpLFxuXHRcdFx0YklzRnVsbFNjcmVlbiA9IG9GQ0xIZWxwZXJNb2RlbC5nZXRQcm9wZXJ0eShcIi9hY3Rpb25CdXR0b25zSW5mby9pc0Z1bGxTY3JlZW5cIiksXG5cdFx0XHRzTmV4dExheW91dCA9IG9GQ0xIZWxwZXJNb2RlbC5nZXRQcm9wZXJ0eShcblx0XHRcdFx0YklzRnVsbFNjcmVlbiA/IFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2V4aXRGdWxsU2NyZWVuXCIgOiBcIi9hY3Rpb25CdXR0b25zSW5mby9mdWxsU2NyZWVuXCJcblx0XHRcdCksXG5cdFx0XHRvUm9vdFZpZXdDb250cm9sbGVyID0gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdGNvbnN0IG9Db250ZXh0ID0gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0ID8gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBvU291cmNlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHR0aGlzLmJhc2UuX3JvdXRpbmcubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHsgc0xheW91dDogc05leHRMYXlvdXQgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0TG9nLndhcm5pbmcoXCJjYW5ub3Qgc3dpdGNoIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsc2NyZWVuXCIpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsb3NlcyB0aGUgY29sdW1uIGZvciB0aGUgY3VycmVudCB2aWV3IGluIGEgRkNMLlxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5CZWZvcmUpXG5cdGNsb3NlQ29sdW1uKCkge1xuXHRcdGNvbnN0IG9Tb3VyY2UgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9WaWV3RGF0YSA9IG9Tb3VyY2UuZ2V0Vmlld0RhdGEoKSBhcyBhbnk7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSBvU291cmNlLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRjb25zdCBiYXNlID0gdGhpcy5iYXNlO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXG5cdFx0aWYgKG9WaWV3RGF0YSAmJiBvVmlld0RhdGEudmlld0xldmVsID09PSAxICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob01ldGFNb2RlbCwgb0NvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0ZHJhZnQucHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdFx0XHRcdGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRiYXNlLl9yb3V0aW5nLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCB7IG5vUHJlc2VydmF0aW9uQ2FjaGU6IHRydWUgfSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdG9Tb3VyY2UuZ2V0Q29udHJvbGxlcigpLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0ZHJhZnQuTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGJhc2UuX3JvdXRpbmcubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQsIHsgbm9QcmVzZXJ2YXRpb25DYWNoZTogdHJ1ZSB9KTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW50ZXJuYWxSb3V0aW5nO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7O0VBa2pCTyxnQkFBZ0JBLElBQUksRUFBRUMsT0FBTyxFQUFFO0lBQ3JDLElBQUk7TUFDSCxJQUFJQyxNQUFNLEdBQUdGLElBQUksRUFBRTtJQUNwQixDQUFDLENBQUMsT0FBTUcsQ0FBQyxFQUFFO01BQ1YsT0FBT0YsT0FBTyxDQUFDRSxDQUFDLENBQUM7SUFDbEI7SUFDQSxJQUFJRCxNQUFNLElBQUlBLE1BQU0sQ0FBQ0UsSUFBSSxFQUFFO01BQzFCLE9BQU9GLE1BQU0sQ0FBQ0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFSCxPQUFPLENBQUM7SUFDcEM7SUFDQSxPQUFPQyxNQUFNO0VBQ2Q7RUFBQztFQUFBO0VBQUE7RUFoaUJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFQQSxJQVNNRyxlQUFlLFdBRHBCQyxjQUFjLENBQUMsa0RBQWtELENBQUMsVUFZakVDLGNBQWMsRUFBRSxVQU9oQkEsY0FBYyxFQUFFLFVBb0NoQkMsZUFBZSxFQUFFLFVBQ2pCQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsVUFLbkNILGVBQWUsRUFBRSxVQUNqQkMsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLFVBS25DSCxlQUFlLEVBQUUsVUFDakJDLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQUssQ0FBQyxXQVFuQ0gsZUFBZSxFQUFFLFdBQ2pCQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsV0FzQm5DSCxlQUFlLEVBQUUsV0F5QmpCQSxlQUFlLEVBQUUsV0FhakJBLGVBQWUsRUFBRSxXQUNqQkksY0FBYyxFQUFFLFdBNkRoQkosZUFBZSxFQUFFLFdBQ2pCSSxjQUFjLEVBQUUsV0FnQmhCSixlQUFlLEVBQUUsV0FDakJJLGNBQWMsRUFBRSxXQWNoQkosZUFBZSxFQUFFLFdBQ2pCSSxjQUFjLEVBQUUsV0FVaEJKLGVBQWUsRUFBRSxXQUNqQkksY0FBYyxFQUFFLFdBc0JoQkosZUFBZSxFQUFFLFdBQ2pCSSxjQUFjLEVBQUUsV0F3aEJoQkosZUFBZSxFQUFFLFdBd05qQkEsZUFBZSxFQUFFLFdBQ2pCSSxjQUFjLEVBQUUsV0FzQmhCSixlQUFlLEVBQUUsV0FDakJDLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNHLE1BQU0sQ0FBQztJQUFBO0lBQUE7TUFBQTtJQUFBO0lBQUE7SUFBQSxPQXJnQ3JDQyxNQUFNLEdBRE4sa0JBQ1M7TUFDUixJQUFJLElBQUksQ0FBQ0MsZ0JBQWdCLEVBQUU7UUFDMUIsSUFBSSxDQUFDQSxnQkFBZ0IsQ0FBQ0Msa0JBQWtCLENBQUMsSUFBSSxDQUFDQyxvQkFBb0IsQ0FBQztNQUNwRTtJQUNELENBQUM7SUFBQSxPQUdEQyxNQUFNLEdBRE4sa0JBQ1M7TUFBQTtNQUNSLElBQUksQ0FBQ0MsTUFBTSxHQUFHLElBQUksQ0FBQ0MsSUFBSSxDQUFDQyxPQUFPLEVBQUU7TUFDakMsSUFBSSxDQUFDQyxjQUFjLEdBQUdDLFdBQVcsQ0FBQ0MsZUFBZSxDQUFDLElBQUksQ0FBQ0wsTUFBTSxDQUFDO01BQzlELElBQUksQ0FBQ00sZUFBZSxHQUFHQyxTQUFTLENBQUNDLG9CQUFvQixDQUFDLElBQUksQ0FBQ1IsTUFBTSxDQUFzQztNQUN2RyxJQUFJLENBQUNTLFFBQVEsR0FBRyxJQUFJLENBQUNOLGNBQWMsQ0FBQ08sU0FBUyxFQUFFO01BQy9DLElBQUksQ0FBQ0MsYUFBYSxHQUFJLElBQUksQ0FBQ1IsY0FBYyxDQUFTUyxjQUFjLEVBQUU7TUFFbEUsSUFBSSxDQUFDLElBQUksQ0FBQ1QsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDRyxlQUFlLEVBQUU7UUFDbEQsTUFBTSxJQUFJTyxLQUFLLENBQUMsMkZBQTJGLENBQUM7TUFDN0c7O01BRUE7TUFDQTtNQUNBLElBQUksSUFBSSxDQUFDVixjQUFjLEtBQUssSUFBSSxDQUFDRyxlQUFlLEVBQUU7UUFDakQ7UUFDQTtRQUNBLElBQUksQ0FBQ0EsZUFBZSxHQUFHLElBQUk7TUFDNUI7TUFFQSxJQUFJLENBQUNILGNBQWMsQ0FDakJXLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUM1QjdCLElBQUksQ0FBQyxVQUFDOEIsZUFBK0IsRUFBSztRQUMxQyxLQUFJLENBQUNuQixnQkFBZ0IsR0FBR21CLGVBQWU7UUFDdkMsS0FBSSxDQUFDakIsb0JBQW9CLEdBQUcsS0FBSSxDQUFDa0IsZUFBZSxDQUFDQyxJQUFJLENBQUMsS0FBSSxDQUFDO1FBQzNELEtBQUksQ0FBQ3JCLGdCQUFnQixDQUFDc0Isa0JBQWtCLENBQUMsS0FBSSxDQUFDcEIsb0JBQW9CLENBQUM7UUFDbkUsS0FBSSxDQUFDcUIsbUJBQW1CLEdBQUdKLGVBQWUsQ0FBQ0ssdUJBQXVCLENBQUMsS0FBSSxDQUFDZCxlQUFlLElBQUksS0FBSSxDQUFDTixNQUFNLENBQUM7TUFDeEcsQ0FBQyxDQUFDLENBQ0RxQixLQUFLLENBQUMsWUFBWTtRQUNsQixNQUFNLElBQUlSLEtBQUssQ0FBQywyRkFBMkYsQ0FBQztNQUM3RyxDQUFDLENBQUM7SUFDSjs7SUFFQTtBQUNEO0FBQ0EsT0FGQztJQUFBLE9BS0FTLGNBQWMsR0FGZCwwQkFFaUI7TUFDaEI7SUFBQSxDQUNBO0lBQUEsT0FJREMsc0JBQXNCLEdBRnRCLGtDQUV5QjtNQUN4QjtJQUFBLENBQ0E7SUFBQSxPQUlEQyxlQUFlLEdBRmYseUJBRWdCQyxlQUFvQixFQUFFQyxXQUFpQixFQUFFO01BQ3hELElBQU1DLFFBQVEsR0FBSSxJQUFJLENBQUMxQixJQUFJLENBQUNDLE9BQU8sRUFBRSxDQUFDMEIsYUFBYSxFQUFFLENBQVNDLE9BQU87TUFDckUsSUFBSUYsUUFBUSxJQUFJQSxRQUFRLENBQUNILGVBQWUsRUFBRTtRQUN6Q0csUUFBUSxDQUFDSCxlQUFlLENBQUNDLGVBQWUsRUFBRUMsV0FBVyxDQUFDO01BQ3ZEO0lBQ0QsQ0FBQztJQUFBLE9BSURJLGNBQWMsR0FGZCx3QkFFZUwsZUFBb0IsRUFBRUMsV0FBaUIsRUFBRTtNQUN0RCxJQUFJLENBQUN2QixjQUFjLENBQVM0QixxQkFBcUIsRUFBRSxDQUFDQyxvQkFBb0IsQ0FBQ1AsZUFBZSxDQUFDO01BQzFGLElBQU1FLFFBQVEsR0FBSSxJQUFJLENBQUMxQixJQUFJLENBQUNDLE9BQU8sRUFBRSxDQUFDMEIsYUFBYSxFQUFFLENBQVNDLE9BQU87TUFDckUsSUFBSUYsUUFBUSxJQUFJQSxRQUFRLENBQUNHLGNBQWMsRUFBRTtRQUN4Q0gsUUFBUSxDQUFDRyxjQUFjLENBQUNMLGVBQWUsRUFBRUMsV0FBVyxDQUFDO01BQ3REO0lBQ0Q7O0lBRUE7SUFDQTtJQUNBO0lBQ0E7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVBDO0lBQUEsT0FTQU8sZ0JBQWdCLEdBRGhCLDBCQUNpQkMsUUFBYSxFQUFFQyxxQkFBNkIsRUFBRUMsZ0JBQTBCLEVBQUU7TUFDMUYsSUFBTUMsd0JBQXdCLEdBQzdCLElBQUksQ0FBQy9CLGVBQWUsSUFDcEIsSUFBSSxDQUFDQSxlQUFlLENBQUNnQywwQkFBMEIsSUFDL0MsSUFBSSxDQUFDaEMsZUFBZSxDQUFDZ0MsMEJBQTBCLENBQUNILHFCQUFxQixDQUFDO01BQ3ZFLElBQUlFLHdCQUF3QixFQUFFO1FBQzdCLElBQU1FLFlBQVksR0FBR0Ysd0JBQXdCLENBQUNHLE1BQU07UUFDcEQsSUFBTUMsVUFBVSxHQUFHRixZQUFZLENBQUNHLEtBQUs7UUFDckMsSUFBTUMsaUJBQWlCLEdBQUdKLFlBQVksQ0FBQ0ssVUFBVTtRQUNqRCxJQUFJLENBQUNoRCxnQkFBZ0IsQ0FBQ2lELFVBQVUsQ0FBQ1gsUUFBUSxFQUFFTyxVQUFVLEVBQUVFLGlCQUFpQixFQUFFUCxnQkFBZ0IsQ0FBQztNQUM1RixDQUFDLE1BQU07UUFDTixJQUFJLENBQUN4QyxnQkFBZ0IsQ0FBQ2lELFVBQVUsQ0FBQ1gsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUVFLGdCQUFnQixDQUFDO01BQ3pFO01BQ0EsSUFBSSxDQUFDcEMsTUFBTSxDQUFDOEMsV0FBVyxFQUFFO0lBQzFCOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FQQztJQUFBLE9BU0FDLGVBQWUsR0FEZix5QkFDZ0JDLGdCQUF3QixFQUFFQyxXQUFvQixFQUFFO01BQy9ELE9BQU8sSUFBSSxDQUFDckQsZ0JBQWdCLENBQUNtRCxlQUFlLENBQUNDLGdCQUFnQixFQUFFQyxXQUFXLENBQUM7SUFDNUU7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVBDO0lBQUEsT0FVQUMsaUJBQWlCLEdBRmpCLDJCQUVrQmhCLFFBQWEsRUFBRVIsV0FBaUIsRUFBb0I7TUFBQTtNQUNyRSxJQUFNeUIsWUFBaUIsR0FBRyxDQUFDLENBQUM7TUFDNUJ6QixXQUFXLEdBQUdBLFdBQVcsSUFBSSxDQUFDLENBQUM7TUFFL0IsSUFBSVEsUUFBUSxDQUFDa0IsR0FBRyxDQUFDLHdDQUF3QyxDQUFDLEVBQUU7UUFDM0QsSUFBSTFCLFdBQVcsQ0FBQzJCLFlBQVksRUFBRTtVQUM3QjtVQUNBO1VBQ0E7VUFDQSxJQUFJLENBQUMxQyxhQUFhLENBQUMyQyxpQ0FBaUMsRUFBRTtVQUV0RDVCLFdBQVcsQ0FBQzJCLFlBQVksQ0FDdEJwRSxJQUFJLENBQUMsVUFBQ29FLFlBQWlCLEVBQUs7WUFDNUI7WUFDQSxNQUFJLENBQUNILGlCQUFpQixDQUFDRyxZQUFZLEVBQUU7Y0FDcENFLGlCQUFpQixFQUFFN0IsV0FBVyxDQUFDNkIsaUJBQWlCO2NBQ2hEQyxRQUFRLEVBQUU5QixXQUFXLENBQUM4QixRQUFRO2NBQzlCQyxnQkFBZ0IsRUFBRS9CLFdBQVcsQ0FBQytCLGdCQUFnQjtjQUM5Q0MsY0FBYyxFQUFFaEMsV0FBVyxDQUFDZ0MsY0FBYztjQUMxQ0MsV0FBVyxFQUFFakMsV0FBVyxDQUFDaUM7WUFDMUIsQ0FBQyxDQUFDO1VBQ0gsQ0FBQyxDQUFDLENBQ0R0QyxLQUFLLENBQUMsVUFBVXVDLE1BQVcsRUFBRTtZQUM3QkMsR0FBRyxDQUFDQyxLQUFLLENBQUMsOEJBQThCLEVBQUVGLE1BQU0sQ0FBQztVQUNsRCxDQUFDLENBQUM7UUFDSixDQUFDLE1BQU0sSUFBSSxDQUFDbEMsV0FBVyxDQUFDcUMsZ0JBQWdCLEVBQUU7VUFDekM7VUFDQSxNQUFNLG1EQUFtRDtRQUMxRDtNQUNEO01BRUEsSUFBSXJDLFdBQVcsQ0FBQ3NDLGFBQWEsRUFBRTtRQUM5QixJQUFNQyxjQUFjLEdBQUcsSUFBSSxDQUFDakUsTUFBTSxDQUFDa0UsUUFBUSxDQUFDLFVBQVUsQ0FBYztRQUNwRUQsY0FBYyxDQUFDRSxXQUFXLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDO1FBRTVEaEIsWUFBWSxDQUFDaUIsb0JBQW9CLEdBQUdsQyxRQUFRLENBQUNtQyxTQUFTLEVBQUU7UUFDeERsQixZQUFZLENBQUNtQixjQUFjLEdBQUdwQyxRQUFRO1FBQ3RDLElBQUlSLFdBQVcsQ0FBQzZDLE1BQU0sRUFBRTtVQUN2QnBCLFlBQVksQ0FBQ29CLE1BQU0sR0FBRzdDLFdBQVcsQ0FBQzZDLE1BQU07UUFDekM7UUFDQTtRQUNBLElBQU1DLFlBQVksR0FBSSxJQUFJLENBQUN2RSxJQUFJLENBQUNDLE9BQU8sRUFBRSxDQUFDMEIsYUFBYSxFQUFFLENBQVNDLE9BQU8sQ0FBQzRDLGtCQUFrQixDQUFDdEIsWUFBWSxDQUFDO1FBQzFHLElBQUlxQixZQUFZLEVBQUU7VUFDakJQLGNBQWMsQ0FBQ0UsV0FBVyxDQUFDLDBCQUEwQixFQUFFakMsUUFBUSxDQUFDO1VBQ2hFLE9BQU93QyxPQUFPLENBQUNDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDN0I7TUFDRDtNQUNBakQsV0FBVyxDQUFDa0QsUUFBUSxHQUFHLElBQUksQ0FBQ0MsWUFBWSxFQUFFO01BRTFDLE9BQU8sSUFBSSxDQUFDakYsZ0JBQWdCLENBQUNzRCxpQkFBaUIsQ0FBQ2hCLFFBQVEsRUFBRVIsV0FBVyxFQUFFLElBQUksQ0FBQzFCLE1BQU0sQ0FBQzhDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQzNCLG1CQUFtQixDQUFDO0lBQzNIOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FQQztJQUFBLE9BVUEyRCx1QkFBdUIsR0FGdkIsaUNBRXdCNUMsUUFBYSxFQUFFUixXQUFpQixFQUFFO01BQ3pEQSxXQUFXLEdBQUdBLFdBQVcsSUFBSSxDQUFDLENBQUM7TUFDL0JBLFdBQVcsQ0FBQ2dDLGNBQWMsR0FBRyxDQUFDLENBQUM7TUFFL0IsT0FBTyxJQUFJLENBQUNSLGlCQUFpQixDQUFDaEIsUUFBUSxFQUFFUixXQUFXLENBQUM7SUFDckQ7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVBDO0lBQUEsT0FVQXFELHdCQUF3QixHQUZ4QixrQ0FFeUI3QyxRQUFhLEVBQUVSLFdBQWlCLEVBQW9CO01BQUE7TUFDNUUsSUFBSSw4QkFBSSxDQUFDMUIsTUFBTSxDQUFDZ0YsaUJBQWlCLENBQUMsVUFBVSxDQUFDLDBEQUF6QyxzQkFBMkNDLFdBQVcsQ0FBQyw2QkFBNkIsQ0FBQyxNQUFLLElBQUksRUFBRTtRQUNuRyxPQUFPUCxPQUFPLENBQUNDLE9BQU8sQ0FBQyxJQUFJLENBQUM7TUFDN0I7TUFDQWpELFdBQVcsR0FBR0EsV0FBVyxJQUFJLENBQUMsQ0FBQztNQUMvQkEsV0FBVyxDQUFDZ0MsY0FBYyxHQUFHLENBQUM7TUFFOUIsT0FBTyxJQUFJLENBQUNSLGlCQUFpQixDQUFDaEIsUUFBUSxFQUFFUixXQUFXLENBQUM7SUFDckQ7O0lBRUE7QUFDRDtBQUNBLE9BRkM7SUFBQSxPQUtBd0QsOEJBQThCLEdBRjlCLDBDQUVpQztNQUNoQyxJQUFNQyxLQUFLLEdBQUcsSUFBSSxDQUFDeEUsYUFBYSxDQUFDeUUsT0FBTyxFQUFFOztNQUUxQztNQUNBLElBQUlELEtBQUssQ0FBQ0UsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQ2xDLElBQUksQ0FBQzFFLGFBQWEsQ0FBQzJFLE9BQU8sRUFBRTtNQUM3QjtJQUNELENBQUM7SUFBQSxPQUlEQyxxQkFBcUIsR0FGckIsK0JBRXNCQyxhQUFrQixFQUFFOUQsV0FBZ0IsRUFBRTtNQUMzREEsV0FBVyxHQUFHQSxXQUFXLElBQUksQ0FBQyxDQUFDO01BQy9CLElBQ0MsSUFBSSxDQUFDZixhQUFhLENBQUN5RSxPQUFPLEVBQUUsQ0FBQ0MsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQzVELElBQUksQ0FBQzFFLGFBQWEsQ0FBQ3lFLE9BQU8sRUFBRSxDQUFDQyxPQUFPLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDL0Q7UUFDRCxPQUFPLElBQUksQ0FBQzFFLGFBQWEsQ0FBQzhFLFNBQVMsQ0FBQyxJQUFJLENBQUM3RixnQkFBZ0IsQ0FBQzhGLG9CQUFvQixFQUFFLENBQUM7TUFDbEYsQ0FBQyxNQUFNO1FBQ05oRSxXQUFXLENBQUNrRCxRQUFRLEdBQUcsSUFBSSxDQUFDQyxZQUFZLEVBQUU7UUFFMUMsT0FBUSxJQUFJLENBQUMxRSxjQUFjLENBQVM0QixxQkFBcUIsRUFBRSxDQUFDNEQsZ0JBQWdCLENBQUNILGFBQWEsRUFBRTlELFdBQVcsQ0FBQztNQUN6RztJQUNEOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BTkM7SUFBQSxPQVNBa0Usd0JBQXdCLEdBRnhCLGtDQUV5QjFELFFBQWEsRUFBRTtNQUN2QyxPQUFPLElBQUksQ0FBQ3RDLGdCQUFnQixDQUFDZ0csd0JBQXdCLENBQUMxRCxRQUFRLENBQUM7SUFDaEUsQ0FBQztJQUFBLE9BRUQyRCxrQkFBa0IsR0FBbEIsNEJBQW1CQyxnQkFBcUIsRUFBVztNQUNsRCxJQUFNQyxRQUFRLEdBQUdELGdCQUFnQixhQUFoQkEsZ0JBQWdCLHVCQUFoQkEsZ0JBQWdCLENBQUVFLE9BQU87TUFDMUMsSUFBSSxDQUFDRCxRQUFRLElBQUlBLFFBQVEsQ0FBQ1YsT0FBTyxDQUFDLElBQUksQ0FBQ2xFLG1CQUFtQixDQUFDOEUsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7UUFBQTtRQUM5RTtRQUNBO1FBQ0E7UUFDQSxJQUFJLDBCQUFDLElBQUksQ0FBQzlFLG1CQUFtQixDQUFDK0UsU0FBUyx5RUFBSSxDQUFDLCtCQUFNSixnQkFBZ0IsYUFBaEJBLGdCQUFnQix1QkFBaEJBLGdCQUFnQixDQUFFSyxVQUFVLHlFQUFJLENBQUMsQ0FBQyxFQUFFO1VBQ3JGLElBQUksQ0FBQ0Msa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNoQzs7UUFDQSxPQUFPLEtBQUs7TUFDYjtNQUVBLE9BQU8sSUFBSTtJQUNaLENBQUM7SUFBQSxPQUVEQyxpQkFBaUIsR0FBakIsMkJBQWtCQyxjQUFtQixFQUFFQyxjQUFzQixFQUFFQyxvQkFBeUIsRUFBdUM7TUFDOUgsSUFBSUMsSUFBSSxHQUFHRixjQUFjLENBQUNHLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO01BQ2pELElBQUlDLFFBQVEsR0FBRyxLQUFLO01BRXBCLEtBQUssSUFBTUMsSUFBSSxJQUFJTixjQUFjLEVBQUU7UUFDbEMsSUFBTU8sTUFBTSxHQUFHUCxjQUFjLENBQUNNLElBQUksQ0FBQztRQUNuQyxJQUFJQyxNQUFNLEtBQUssS0FBSyxJQUFJTixjQUFjLENBQUNsQixPQUFPLFlBQUt1QixJQUFJLE9BQUksSUFBSSxDQUFDLEVBQUU7VUFDakVELFFBQVEsR0FBRyxJQUFJO1VBQ2Y7VUFDQTtVQUNBO1VBQ0FILG9CQUFvQixDQUFDTSxlQUFlLEdBQUcsSUFBSTtRQUM1QztRQUNBTCxJQUFJLEdBQUdBLElBQUksQ0FBQ0MsT0FBTyxZQUFLRSxJQUFJLFFBQUtDLE1BQU0sQ0FBQztNQUN6QztNQUNBLElBQUlQLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSUEsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDUyxjQUFjLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDcEZQLG9CQUFvQixDQUFDUSxhQUFhLEdBQUcsSUFBSTtNQUMxQzs7TUFFQTtNQUNBLElBQUlQLElBQUksSUFBSUEsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtRQUM1QkEsSUFBSSxjQUFPQSxJQUFJLENBQUU7TUFDbEI7TUFFQSxPQUFPO1FBQUVBLElBQUksRUFBSkEsSUFBSTtRQUFFRSxRQUFRLEVBQVJBO01BQVMsQ0FBQztJQUMxQjs7SUFFQTtJQUNBO0lBQ0E7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FOQztJQUFBLE9BT0EzRixlQUFlLEdBQWYseUJBQWdCdUQsTUFBYSxFQUFFO01BQUE7TUFDOUI7TUFDQTtNQUNBLElBQUksQ0FBQyxJQUFJLENBQUNzQixrQkFBa0IsQ0FBQ3RCLE1BQU0sQ0FBQzBDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUU7UUFDdEU7TUFDRDs7TUFFQTtNQUNBLElBQUlWLGNBQWM7TUFDbEIsSUFBSSxJQUFJLENBQUNqRyxlQUFlLElBQUksSUFBSSxDQUFDQSxlQUFlLENBQUM0Ryx3QkFBd0IsRUFBRTtRQUMxRVgsY0FBYyxHQUFHLElBQUksQ0FBQ2pHLGVBQWUsQ0FBQzRHLHdCQUF3QixFQUFFO01BQ2pFO01BQ0FYLGNBQWMsR0FBR0EsY0FBYyxJQUFJLElBQUksQ0FBQ3BGLG1CQUFtQixDQUFDZ0csY0FBYztNQUUxRSxJQUFJWixjQUFjLEtBQUssSUFBSSxJQUFJQSxjQUFjLEtBQUthLFNBQVMsRUFBRTtRQUM1RDtRQUNBYixjQUFjLEdBQUdoQyxNQUFNLENBQUMwQyxZQUFZLENBQUMsY0FBYyxDQUFDO01BQ3JEOztNQUVBO01BQ0EsSUFBTUksVUFBVSxHQUFJOUMsTUFBTSxDQUFDK0MsYUFBYSxFQUFFLENBQVNDLFNBQVM7TUFDNUQsSUFBTUMscUJBQXFCLEdBQUdqRCxNQUFNLENBQUMwQyxZQUFZLENBQUMsZ0JBQWdCLENBQUM7TUFDbkUsNEJBQTJCLElBQUksQ0FBQ1osaUJBQWlCLENBQUNnQixVQUFVLEVBQUVkLGNBQWMsRUFBRWlCLHFCQUFxQixDQUFDO1FBQTVGZixJQUFJLHlCQUFKQSxJQUFJO1FBQUVFLFFBQVEseUJBQVJBLFFBQVE7TUFFdEIsSUFBSSxDQUFDckYsY0FBYyxFQUFFO01BRXJCLElBQU1tRyxNQUFNLEdBQUcsSUFBSSxDQUFDekgsTUFBTSxDQUFDa0UsUUFBUSxFQUFnQjtNQUNuRCxJQUFJd0QsSUFBSTtNQUNSLElBQUlmLFFBQVEsRUFBRTtRQUNiZSxJQUFJLEdBQUcsSUFBSSxDQUFDQyxhQUFhLENBQUNsQixJQUFJLEVBQUVlLHFCQUFxQixDQUFDO01BQ3ZELENBQUMsTUFBTTtRQUNORSxJQUFJLEdBQUcsSUFBSSxDQUFDRSxTQUFTLENBQUNuQixJQUFJLEVBQUVnQixNQUFNLEVBQUVELHFCQUFxQixDQUFDO01BQzNEO01BQ0E7TUFDQUUsSUFBSSxDQUFDRyxPQUFPLENBQUMsWUFBTTtRQUNsQixNQUFJLENBQUN0RyxzQkFBc0IsRUFBRTtNQUM5QixDQUFDLENBQUM7TUFFRCxJQUFJLENBQUNwQixjQUFjLENBQVM0QixxQkFBcUIsRUFBRSxDQUFDK0Ysb0JBQW9CLENBQUMsSUFBSSxDQUFDOUgsTUFBTSxFQUFFLElBQUksQ0FBQzZFLFlBQVksRUFBRSxDQUFDO0lBQzVHOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FQQztJQUFBLE9BUUE4QyxhQUFhLEdBQWIsdUJBQWNJLFdBQW1CLEVBQUVQLHFCQUEwQixFQUFFO01BQzlELElBQUksQ0FBQ2hHLGVBQWUsQ0FBQyxJQUFJLEVBQUU7UUFBRWdDLFFBQVEsRUFBRWdFLHFCQUFxQixDQUFDVjtNQUFnQixDQUFDLENBQUM7TUFFL0UsSUFBSVUscUJBQXFCLENBQUN6RCxnQkFBZ0IsSUFBSSxDQUFDeUQscUJBQXFCLENBQUNRLGFBQWEsRUFBRTtRQUNuRjtRQUNBO1FBQ0E7UUFDQTtRQUNBLElBQUksSUFBSSxDQUFDMUgsZUFBZSxJQUFJLElBQUksQ0FBQ0EsZUFBZSxDQUFDMkgscUJBQXFCLEVBQUU7VUFDdkUsSUFBSSxDQUFDM0gsZUFBZSxDQUFDMkgscUJBQXFCLENBQ3pDRixXQUFXLEVBQ1hQLHFCQUFxQixDQUFDVSxVQUFVLEVBQ2hDVixxQkFBcUIsQ0FBQ1IsYUFBYSxDQUNuQztRQUNGO01BQ0Q7TUFFQSxJQUFNbUIscUJBQXFCLEdBQUcsSUFBSSxDQUFDQyxrQkFBa0IsRUFBRTtNQUN2RCxJQUFJRCxxQkFBcUIsYUFBckJBLHFCQUFxQixlQUFyQkEscUJBQXFCLENBQUVFLGlCQUFpQixFQUFFLEVBQUU7UUFDL0M7UUFDQTtRQUNBRixxQkFBcUIsQ0FBQ0csVUFBVSxFQUFFLENBQUNDLFlBQVksRUFBRTtNQUNsRDs7TUFFQTtNQUNBLElBQUksQ0FBQ25DLGtCQUFrQixDQUFDLElBQUksQ0FBQztNQUU3QixJQUFJLENBQUN0RSxjQUFjLENBQUMsSUFBSSxDQUFDO01BQ3pCLE9BQU80QyxPQUFPLENBQUNDLE9BQU8sRUFBRTtJQUN6Qjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FSQztJQUFBLE9BU0FpRCxTQUFTLEdBQVQsbUJBQVVHLFdBQW1CLEVBQUVOLE1BQWtCLEVBQUVELHFCQUE2QixFQUFFO01BQUE7TUFDakYsSUFBSU8sV0FBVyxLQUFLLEVBQUUsRUFBRTtRQUN2QixPQUFPckQsT0FBTyxDQUFDQyxPQUFPLENBQUMsSUFBSSxDQUFDNkQsa0JBQWtCLENBQUMsSUFBSSxFQUFFZixNQUFNLEVBQUVELHFCQUFxQixDQUFDLENBQUM7TUFDckYsQ0FBQyxNQUFNO1FBQ04sT0FBTyxJQUFJLENBQUNpQixvQkFBb0IsQ0FBQ1YsV0FBVyxFQUFFTixNQUFNLENBQUMsQ0FDbkR4SSxJQUFJLENBQUMsVUFBQ3lKLGNBQW1CLEVBQUs7VUFDOUIsTUFBSSxDQUFDQyxlQUFlLENBQUNELGNBQWMsRUFBRWpCLE1BQU0sRUFBRUQscUJBQXFCLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQ0RuRyxLQUFLLENBQUMsVUFBQ3VDLE1BQVcsRUFBSztVQUN2QjtVQUNBLElBQU1nRixlQUFlLEdBQUdDLElBQUksQ0FBQ0Msd0JBQXdCLENBQUMsYUFBYSxDQUFDO1VBRXBFLE1BQUksQ0FBQ3ZELHFCQUFxQixDQUFDcUQsZUFBZSxDQUFDRyxPQUFPLENBQUMsb0NBQW9DLENBQUMsRUFBRTtZQUN6RkMsS0FBSyxFQUFFSixlQUFlLENBQUNHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztZQUN0REUsV0FBVyxFQUFFckYsTUFBTSxDQUFDc0Y7VUFDckIsQ0FBQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDO01BQ0o7SUFDRDs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FSQztJQUFBLE9BU0FDLDZCQUE2QixHQUE3Qix1Q0FBOEJDLGFBQXFCLEVBQUVDLGFBQW9CLEVBQUVDLFVBQWtCLEVBQUU7TUFDOUYsSUFBTUMsa0JBQWtCLEdBQUcsVUFBVTFDLE1BQVcsRUFBRTtRQUNqRCxJQUFJQSxNQUFNLENBQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJd0IsTUFBTSxDQUFDMkMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLM0MsTUFBTSxDQUFDNEMsTUFBTSxHQUFHLENBQUMsRUFBRTtVQUMvRTtVQUNBNUMsTUFBTSxHQUFHNkMsa0JBQWtCLENBQUM3QyxNQUFNLENBQUM4QyxTQUFTLENBQUMsQ0FBQyxFQUFFOUMsTUFBTSxDQUFDNEMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3BFO1FBQ0EsT0FBTzVDLE1BQU07TUFDZCxDQUFDO01BQ0QsSUFBTStDLFVBQVUsR0FBR1IsYUFBYSxDQUFDTyxTQUFTLENBQUNQLGFBQWEsQ0FBQy9ELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUrRCxhQUFhLENBQUNLLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQ0ksS0FBSyxDQUFDLEdBQUcsQ0FBQztNQUMvRyxJQUFJQyxRQUFrQjtNQUV0QixJQUFJVCxhQUFhLENBQUNJLE1BQU0sSUFBSUcsVUFBVSxDQUFDSCxNQUFNLEVBQUU7UUFDOUMsT0FBTyxJQUFJO01BQ1o7TUFFQSxJQUFNTSx1QkFBdUIsR0FBR0MsV0FBVyxDQUFDQyx3QkFBd0IsQ0FBQ1gsVUFBVSxDQUFDO01BRWhGLElBQUlELGFBQWEsQ0FBQ0ksTUFBTSxLQUFLLENBQUMsRUFBRTtRQUMvQjtRQUNBLElBQU1TLFNBQVMsR0FBR1gsa0JBQWtCLENBQUNLLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuREUsUUFBUSxHQUFHLENBQ1YsSUFBSUssTUFBTSxDQUFDO1VBQ1YxRCxJQUFJLEVBQUU0QyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUNlLGFBQWE7VUFDcENDLFFBQVEsRUFBRUMsY0FBYyxDQUFDQyxFQUFFO1VBQzNCQyxNQUFNLEVBQUVOLFNBQVM7VUFDakJPLGFBQWEsRUFBRVY7UUFDaEIsQ0FBQyxDQUFDLENBQ0Y7TUFDRixDQUFDLE1BQU07UUFDTixJQUFNVyxVQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQzFCO1FBQ0FkLFVBQVUsQ0FBQ2UsT0FBTyxDQUFDLFVBQVVDLGNBQXNCLEVBQUU7VUFDcEQsSUFBTUMsTUFBTSxHQUFHRCxjQUFjLENBQUNmLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFDdkNLLFNBQVMsR0FBR1gsa0JBQWtCLENBQUNzQixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFFMUNILFVBQVUsQ0FBQ0csTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdYLFNBQVM7UUFDbEMsQ0FBQyxDQUFDO1FBRUYsSUFBSVksT0FBTyxHQUFHLEtBQUs7UUFDbkJoQixRQUFRLEdBQUdULGFBQWEsQ0FBQzBCLEdBQUcsQ0FBQyxVQUFVQyxZQUFpQixFQUFFO1VBQ3pELElBQU1wRSxJQUFJLEdBQUdvRSxZQUFZLENBQUNaLGFBQWE7WUFDdEN2RCxNQUFNLEdBQUc2RCxVQUFVLENBQUM5RCxJQUFJLENBQUM7VUFFMUIsSUFBSUMsTUFBTSxLQUFLTyxTQUFTLEVBQUU7WUFDekIsT0FBTyxJQUFJK0MsTUFBTSxDQUFDO2NBQ2pCMUQsSUFBSSxFQUFFRyxJQUFJO2NBQ1Z5RCxRQUFRLEVBQUVDLGNBQWMsQ0FBQ0MsRUFBRTtjQUMzQkMsTUFBTSxFQUFFM0QsTUFBTTtjQUNkNEQsYUFBYSxFQUFFVjtZQUNoQixDQUFDLENBQUM7VUFDSCxDQUFDLE1BQU07WUFDTmUsT0FBTyxHQUFHLElBQUk7WUFDZCxPQUFPLElBQUlYLE1BQU0sQ0FBQztjQUNqQjFELElBQUksRUFBRTtZQUNQLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFDTDtRQUNELENBQUMsQ0FBQzs7UUFFRixJQUFJcUUsT0FBTyxFQUFFO1VBQ1osT0FBTyxJQUFJO1FBQ1o7TUFDRDs7TUFFQTtNQUNBO01BQ0EsSUFBTUcsWUFBWSxHQUFHLElBQUlkLE1BQU0sQ0FBQztRQUMvQmUsT0FBTyxFQUFFLENBQUMsSUFBSWYsTUFBTSxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJQSxNQUFNLENBQUMsOEJBQThCLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVHZ0IsR0FBRyxFQUFFO01BQ04sQ0FBQyxDQUFDO01BQ0ZyQixRQUFRLENBQUNzQixJQUFJLENBQUNILFlBQVksQ0FBQztNQUUzQixPQUFPLElBQUlkLE1BQU0sQ0FBQ0wsUUFBUSxFQUFFLElBQUksQ0FBQztJQUNsQzs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FSQztJQUFBLE9BU0F1QixpQ0FBaUMsR0FBakMsMkNBQWtDakMsYUFBcUIsRUFBRTNCLE1BQVcsRUFBRTRCLGFBQW9CLEVBQUU7TUFBQTtNQUMzRixJQUFNQyxVQUFVLEdBQUc3QixNQUFNLENBQUM2RCxZQUFZLEVBQUU7TUFDeEMsSUFBSUMsY0FBYyxHQUFHakMsVUFBVSxDQUFDa0MsY0FBYyxDQUFDcEMsYUFBYSxDQUFDLENBQUNxQyxPQUFPLEVBQUU7TUFFdkUsSUFBSSxDQUFDcEMsYUFBYSxJQUFJQSxhQUFhLENBQUNJLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDakQ7UUFDQSxPQUFPL0UsT0FBTyxDQUFDQyxPQUFPLENBQUMsSUFBSSxDQUFDO01BQzdCOztNQUVBO01BQ0EsSUFBTStHLE9BQU8sR0FBRyxJQUFJLENBQUN2Qyw2QkFBNkIsQ0FBQ0MsYUFBYSxFQUFFQyxhQUFhLEVBQUVDLFVBQVUsQ0FBQztNQUM1RixJQUFJb0MsT0FBTyxLQUFLLElBQUksRUFBRTtRQUNyQjtRQUNBLE9BQU9oSCxPQUFPLENBQUNDLE9BQU8sQ0FBQyxJQUFJLENBQUM7TUFDN0I7O01BRUE7TUFDQSxJQUFJLHFCQUFDNEcsY0FBYyw0Q0FBZCxnQkFBZ0JJLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRTtRQUNyQ0osY0FBYyxjQUFPQSxjQUFjLENBQUU7TUFDdEM7TUFDQSxJQUFNSyxZQUFZLEdBQUduRSxNQUFNLENBQUNvRSxRQUFRLENBQUNOLGNBQWMsRUFBRW5FLFNBQVMsRUFBRUEsU0FBUyxFQUFFc0UsT0FBTyxFQUFFO1FBQ25GSSxTQUFTLEVBQUU7TUFDWixDQUFDLENBQUM7TUFFRixPQUFPRixZQUFZLENBQUNHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM5TSxJQUFJLENBQUMsVUFBVStNLFNBQWMsRUFBRTtRQUN4RSxJQUFJQSxTQUFTLElBQUlBLFNBQVMsQ0FBQ3ZDLE1BQU0sRUFBRTtVQUNsQyxPQUFPdUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDUCxPQUFPLEVBQUU7UUFDOUIsQ0FBQyxNQUFNO1VBQ047VUFDQSxPQUFPLElBQUk7UUFDWjtNQUNELENBQUMsQ0FBQztJQUNIOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FQQztJQUFBLE9BUUFRLGdDQUFnQyxHQUFoQywwQ0FBaUNDLEtBQWEsRUFBRTVDLFVBQWUsRUFBRTtNQUNoRTtNQUNBLElBQU02QyxRQUFRLEdBQUcsd0JBQXdCLENBQUNDLElBQUksQ0FBQ0YsS0FBSyxDQUFDO01BQ3JELElBQUksQ0FBQ0MsUUFBUSxFQUFFO1FBQ2QsT0FBTyxLQUFLO01BQ2I7TUFDQTtNQUNBLElBQU1aLGNBQWMsY0FBT1ksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFFO01BQ3hDO01BQ0EsSUFBTUUsVUFBVSxHQUFHL0MsVUFBVSxDQUFDakYsU0FBUyxXQUFJa0gsY0FBYywrQ0FBNEM7TUFDckcsSUFBTWUsVUFBVSxHQUFHaEQsVUFBVSxDQUFDakYsU0FBUyxXQUFJa0gsY0FBYywrQ0FBNEM7TUFDckcsT0FBT2MsVUFBVSxJQUFJQyxVQUFVLEdBQUcsSUFBSSxHQUFHLEtBQUs7SUFDL0M7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQVBDO0lBQUEsT0FRQTdELG9CQUFvQixHQUFwQiw4QkFBcUI4RCxjQUFzQixFQUFFOUUsTUFBVyxFQUFtQjtNQUFBO01BQzFFLElBQU02QixVQUFVLEdBQUc3QixNQUFNLENBQUM2RCxZQUFZLEVBQUU7TUFDeEMsSUFBTWtCLG9CQUFvQixHQUFHLElBQUksQ0FBQzVNLGdCQUFnQixDQUFDNk0sc0JBQXNCLEVBQUU7TUFDM0UsSUFBSUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDak0sUUFBUSxDQUFDa00sY0FBYyxFQUFFLENBQUN2SCxPQUFPLEVBQUUsQ0FBQ3lFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFFakYsSUFBSTZDLG9CQUFvQixJQUFJQSxvQkFBb0IsQ0FBQ2xELFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBS2tELG9CQUFvQixDQUFDakQsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN0RztRQUNBaUQsb0JBQW9CLEdBQUdBLG9CQUFvQixDQUFDL0MsU0FBUyxDQUFDLENBQUMsRUFBRStDLG9CQUFvQixDQUFDakQsTUFBTSxHQUFHLENBQUMsQ0FBQztNQUMxRjtNQUVBLElBQUltRCxlQUFlLEdBQUdGLG9CQUFvQixJQUFJQSxvQkFBb0IsQ0FBQ0csTUFBTSxDQUFDLENBQUMsRUFBRUgsb0JBQW9CLENBQUNySCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7TUFDL0csSUFBSXVILGVBQWUsQ0FBQ3ZILE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDdkN1SCxlQUFlLEdBQUdBLGVBQWUsQ0FBQ2pELFNBQVMsQ0FBQyxDQUFDLENBQUM7TUFDL0M7TUFDQSxJQUFNbUQsc0JBQXNCLEdBQUcsSUFBSSxDQUFDYixnQ0FBZ0MsQ0FBQ1Msb0JBQW9CLEVBQUVwRCxVQUFVLENBQUM7UUFDckdELGFBQWEsR0FBR3lELHNCQUFzQixJQUFJQyxpQkFBaUIsQ0FBQ0MsZUFBZSxDQUFDMUQsVUFBVSxFQUFFc0QsZUFBZSxDQUFDO01BQ3pHLElBQUksQ0FBQ3ZELGFBQWEsRUFBRTtRQUNuQjtRQUNBLE9BQU8zRSxPQUFPLENBQUNDLE9BQU8sQ0FBQzRILGNBQWMsQ0FBQztNQUN2QyxDQUFDLE1BQU0sSUFBSUMsb0JBQW9CLElBQUlBLG9CQUFvQixDQUFDUyxZQUFZLEtBQUtWLGNBQWMsRUFBRTtRQUN4RjtRQUNBLE9BQU83SCxPQUFPLENBQUNDLE9BQU8sQ0FBQzZILG9CQUFvQixDQUFDVSxhQUFhLENBQUM7TUFDM0QsQ0FBQyxNQUFNO1FBQ047UUFDQSxPQUFPLElBQUksQ0FBQzdCLGlDQUFpQyxDQUFDcUIsb0JBQW9CLEVBQUVqRixNQUFNLEVBQUU0QixhQUFhLENBQUMsQ0FBQ3BLLElBQUksQ0FBQyxVQUFDeUosY0FBbUIsRUFBSztVQUN4SCxJQUFJQSxjQUFjLElBQUlBLGNBQWMsS0FBSzZELGNBQWMsRUFBRTtZQUN4RDtZQUNBLE1BQUksQ0FBQzNNLGdCQUFnQixDQUFDdU4sc0JBQXNCLENBQUM7Y0FDNUNELGFBQWEsRUFBRXhFLGNBQWM7Y0FDN0J1RSxZQUFZLEVBQUVWO1lBQ2YsQ0FBQyxDQUFDO1lBQ0YsT0FBTzdELGNBQWM7VUFDdEIsQ0FBQyxNQUFNO1lBQ04sT0FBTzZELGNBQWM7VUFDdEI7UUFDRCxDQUFDLENBQUM7TUFDSDtJQUNEOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FQQztJQUFBLE9BUUE1RCxlQUFlLEdBQWYseUJBQWdCWixXQUFtQixFQUFFTixNQUFXLEVBQUVELHFCQUEwQixFQUFFO01BQzdFLElBQU00RixlQUFlLEdBQUcsSUFBSSxDQUFDaEYsa0JBQWtCLEVBQUU7UUFDaERpRixZQUFZLEdBQUdELGVBQWUsSUFBSUEsZUFBZSxDQUFDM0IsT0FBTyxFQUFFO1FBQzNENkIsV0FBVyxHQUFHOUYscUJBQXFCLENBQUNVLFVBQVU7O01BRS9DO01BQ0E7TUFDQSxJQUFJbUYsWUFBWSxLQUFLdEYsV0FBVyxJQUFLdUYsV0FBVyxJQUFJQSxXQUFXLENBQUM3QixPQUFPLEVBQUUsS0FBSzFELFdBQVksRUFBRTtRQUMzRixJQUFJd0YsY0FBYztRQUNsQixJQUFJRCxXQUFXLElBQUlBLFdBQVcsQ0FBQzdCLE9BQU8sRUFBRSxLQUFLMUQsV0FBVyxFQUFFO1VBQ3pEO1VBQ0F3RixjQUFjLEdBQUdELFdBQVc7UUFDN0IsQ0FBQyxNQUFNO1VBQ047VUFDQUMsY0FBYyxHQUFHLElBQUksQ0FBQ0MsY0FBYyxDQUFDekYsV0FBVyxFQUFFTixNQUFNLENBQUM7UUFDMUQ7UUFDQSxJQUFJOEYsY0FBYyxLQUFLSCxlQUFlLEVBQUU7VUFDdkMsSUFBSSxDQUFDNUUsa0JBQWtCLENBQUMrRSxjQUFjLEVBQUU5RixNQUFNLEVBQUVELHFCQUFxQixDQUFDO1FBQ3ZFO01BQ0QsQ0FBQyxNQUFNLElBQUksQ0FBQ0EscUJBQXFCLENBQUNpRyxrQkFBa0IsSUFBSUMsU0FBUyxDQUFDQyxnQkFBZ0IsRUFBRSxFQUFFO1FBQ3JGLElBQUksQ0FBQ0Msc0JBQXNCLENBQUNSLGVBQWUsQ0FBQztNQUM3QztJQUNEOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FQQztJQUFBLE9BUUE1RSxrQkFBa0IsR0FBbEIsNEJBQW1CdEcsUUFBd0IsRUFBRXVGLE1BQWtCLEVBQUVELHFCQUEwQixFQUFFO01BQUE7TUFDNUYsSUFBSSxDQUFDdEYsUUFBUSxFQUFFO1FBQ2QsSUFBSSxDQUFDVixlQUFlLENBQUMsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQ00sY0FBYyxDQUFDLElBQUksQ0FBQztRQUN6QjtNQUNEO01BRUEsSUFBTStMLGtCQUFrQixHQUFHM0wsUUFBUSxDQUFDb0csVUFBVSxFQUFFO01BQ2hELElBQU13RixtQkFBbUIsR0FBSSxJQUFJLENBQUMzTixjQUFjLENBQVM0QixxQkFBcUIsRUFBRTtNQUNoRixJQUFJK0wsbUJBQW1CLENBQUNDLFlBQVksRUFBRSxFQUFFO1FBQ3ZDLElBQUksQ0FBQ0Ysa0JBQWtCLElBQUksQ0FBQ0Esa0JBQWtCLENBQUN6SyxHQUFHLENBQUMsd0NBQXdDLENBQUMsRUFBRTtVQUM3RjtVQUNBbEIsUUFBUSxHQUFHLElBQUksQ0FBQ3NMLGNBQWMsQ0FBQ3RMLFFBQVEsQ0FBQ3VKLE9BQU8sRUFBRSxFQUFFaEUsTUFBTSxDQUFDO1FBQzNEO1FBRUEsSUFBSTtVQUNILElBQUksQ0FBQ3VHLGFBQWEsQ0FDakI5TCxRQUFRLEVBQ1IsSUFBSSxFQUNKLFlBQU07WUFDTCxJQUFJNEwsbUJBQW1CLENBQUNHLG9CQUFvQixDQUFDL0wsUUFBUSxDQUFDLEVBQUU7Y0FDdkQsTUFBSSxDQUFDNEMsdUJBQXVCLENBQUM1QyxRQUFRLENBQUM7WUFDdkM7VUFDRCxDQUFDLEVBQ0QsSUFBSSxDQUFDO1VBQUEsQ0FDTDtRQUNGLENBQUMsQ0FBQyxPQUFPMEIsTUFBTSxFQUFFO1VBQ2hCO1VBQ0E7VUFDQUMsR0FBRyxDQUFDQyxLQUFLLG9CQUNJNUIsUUFBUSxDQUFDdUosT0FBTyxFQUFFLDhGQUM5QjtRQUNGO01BQ0QsQ0FBQyxNQUFNLElBQUksQ0FBQ29DLGtCQUFrQixJQUFJQSxrQkFBa0IsQ0FBQ3pLLEdBQUcsQ0FBQyx3Q0FBd0MsQ0FBQyxFQUFFO1FBQ25HO1FBQ0FsQixRQUFRLEdBQUcsSUFBSSxDQUFDc0wsY0FBYyxDQUFDdEwsUUFBUSxDQUFDdUosT0FBTyxFQUFFLEVBQUVoRSxNQUFNLENBQUM7TUFDM0Q7O01BRUE7TUFDQSxJQUFJLENBQUNqRyxlQUFlLENBQUNVLFFBQVEsRUFBRTtRQUM5QnNCLFFBQVEsRUFBRWdFLHFCQUFxQixDQUFDVixlQUFlO1FBQy9Db0gsV0FBVyxFQUFFTCxrQkFBa0I7UUFDL0JwSyxnQkFBZ0IsRUFBRStELHFCQUFxQixDQUFDL0QsZ0JBQWdCO1FBQ3hEMEssZ0JBQWdCLEVBQUUzRyxxQkFBcUIsQ0FBQzJHLGdCQUFnQjtRQUN4REMsZUFBZSxFQUFFNUcscUJBQXFCLENBQUM2RztNQUN4QyxDQUFDLENBQUM7TUFFRixJQUFJLENBQUNqSSxrQkFBa0IsQ0FBQ2xFLFFBQVEsQ0FBQztNQUNqQyxJQUFJLENBQUNKLGNBQWMsQ0FBQ0ksUUFBUSxDQUFDO0lBQzlCOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FQQztJQUFBLE9BUUFzTCxjQUFjLEdBQWQsd0JBQWV0QixLQUFhLEVBQUV6RSxNQUFrQixFQUFFO01BQUE7TUFDakQsSUFBTTZHLGNBQWMsR0FBRyxJQUFJLENBQUNoTyxlQUFlO1FBQzFDaU8sVUFBVSxHQUFHRCxjQUFjLElBQUlBLGNBQWMsQ0FBQ0UsWUFBWSxJQUFJRixjQUFjLENBQUNFLFlBQVksRUFBRTtRQUMzRkMsWUFBWSxHQUNWSCxjQUFjLElBQUlBLGNBQWMsQ0FBQ0ksY0FBYyxJQUFJSixjQUFjLENBQUNJLGNBQWMsRUFBRSxJQUFNSCxVQUFVLGVBQVFBLFVBQVUsQ0FBRztRQUN6SGpGLFVBQVUsR0FBRzdCLE1BQU0sQ0FBQzZELFlBQVksRUFBRTtRQUNsQzVKLFdBQWdCLEdBQUc7VUFDbEJvSyxTQUFTLEVBQUUsY0FBYztVQUN6QjZDLGVBQWUsRUFBRSxPQUFPO1VBQ3hCQyx5QkFBeUIsRUFBRTtRQUM1QixDQUFDO01BQ0Y7TUFDQSxJQUFNdkMsVUFBVSxHQUFHL0MsVUFBVSxDQUFDakYsU0FBUyxXQUFJb0ssWUFBWSwrQ0FBNEM7TUFDbkcsSUFBTW5DLFVBQVUsR0FBR2hELFVBQVUsQ0FBQ2pGLFNBQVMsV0FBSW9LLFlBQVksK0NBQTRDO01BQ25HLElBQU1YLG1CQUFtQixHQUFJLElBQUksQ0FBQzNOLGNBQWMsQ0FBUzRCLHFCQUFxQixFQUFFO01BQ2hGLElBQUkrTCxtQkFBbUIsQ0FBQ0MsWUFBWSxFQUFFLEVBQUU7UUFDdkMsSUFBTTdMLFFBQVEsR0FBRyxJQUFJLENBQUMyTSxvQkFBb0IsQ0FBQ3BILE1BQU0sRUFBRXlFLEtBQUssRUFBRSxLQUFLLEVBQUV4SyxXQUFXLENBQUM7UUFDN0UsSUFBSSxDQUFDUSxRQUFRLEVBQUU7VUFDZCxNQUFNLElBQUlyQixLQUFLLDJDQUFvQ3FMLEtBQUssRUFBRztRQUM1RCxDQUFDLE1BQU0sSUFBSUcsVUFBVSxJQUFJQyxVQUFVLEVBQUU7VUFDcEMsSUFBSXBLLFFBQVEsQ0FBQytDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLbUMsU0FBUyxFQUFFO1lBQ3pEbEYsUUFBUSxDQUFDNE0sZUFBZSxDQUFDLENBQUMsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUNqRixJQUFJekMsVUFBVSxFQUFFO2NBQ2ZuSyxRQUFRLENBQUM2TSxhQUFhLENBQUMseUJBQXlCLENBQUM7WUFDbEQ7VUFDRCxDQUFDLE1BQU07WUFDTjtZQUNBO1lBQ0E3TSxRQUFRLENBQUM4TSxrQkFBa0IsQ0FDMUIzQyxVQUFVLEdBQ1AsQ0FBQyxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSx5QkFBeUIsQ0FBQyxHQUNsRixDQUFDLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLENBQzFEO1VBQ0Y7UUFDRDtRQUVBLE9BQU9uSyxRQUFRO01BQ2hCLENBQUMsTUFBTTtRQUNOLElBQUlxTSxVQUFVLEVBQUU7VUFDZixJQUFNVSxhQUFhLEdBQUczRixVQUFVLENBQUNqRixTQUFTLFdBQUlvSyxZQUFZLHFEQUFrRDtVQUM1RyxJQUFJUSxhQUFhLEVBQUU7WUFDbEJ2TixXQUFXLENBQUN3TixPQUFPLEdBQUdELGFBQWE7VUFDcEM7UUFDRDs7UUFFQTtRQUNBLElBQUk1QyxVQUFVLElBQUlDLFVBQVUsRUFBRTtVQUM3QixJQUFJNUssV0FBVyxDQUFDd04sT0FBTyxLQUFLOUgsU0FBUyxFQUFFO1lBQ3RDMUYsV0FBVyxDQUFDd04sT0FBTyxHQUFHLCtDQUErQztVQUN0RSxDQUFDLE1BQU07WUFDTnhOLFdBQVcsQ0FBQ3dOLE9BQU8sSUFBSSxnREFBZ0Q7VUFDeEU7UUFDRDtRQUNBLElBQUksSUFBSSxDQUFDbFAsTUFBTSxDQUFDZ0YsaUJBQWlCLEVBQUUsRUFBRTtVQUFBO1VBQ3BDLElBQU1tSyxnQkFBZ0IsNkJBQUksSUFBSSxDQUFDblAsTUFBTSxDQUFDZ0YsaUJBQWlCLEVBQUUsMkRBQWhDLHVCQUEwQ3NELFVBQVUsRUFBRTtVQUMvRTZHLGdCQUFnQixhQUFoQkEsZ0JBQWdCLHVCQUFoQkEsZ0JBQWdCLENBQ2I1RyxZQUFZLEVBQUUsQ0FDZnRKLElBQUksQ0FBQyxZQUFNO1lBQ1hrUSxnQkFBZ0IsQ0FBQ0MsT0FBTyxFQUFFO1VBQzNCLENBQUMsQ0FBQyxDQUNEL04sS0FBSyxDQUFDLFVBQUN1QyxNQUFXLEVBQUs7WUFDdkJDLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDLGlEQUFpRCxFQUFFRixNQUFNLENBQUM7VUFDckUsQ0FBQyxDQUFDO1FBQ0o7UUFFQSxJQUFNeUwsY0FBYyxHQUFHNUgsTUFBTSxDQUFDNkgsV0FBVyxDQUFDcEQsS0FBSyxFQUFFOUUsU0FBUyxFQUFFMUYsV0FBVyxDQUFDO1FBRXhFMk4sY0FBYyxDQUFDRSxlQUFlLENBQUMsZUFBZSxFQUFFLFlBQU07VUFDckRDLFVBQVUsQ0FBQ0MsSUFBSSxDQUFDLE1BQUksQ0FBQ3pQLE1BQU0sQ0FBQztRQUM3QixDQUFDLENBQUM7UUFDRnFQLGNBQWMsQ0FBQ0UsZUFBZSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUNHLGNBQWMsQ0FBQ3pPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5RSxPQUFPb08sY0FBYyxDQUFDTSxlQUFlLEVBQUU7TUFDeEM7SUFDRCxDQUFDO0lBQUEsT0FHS0QsY0FBYywyQkFBQ25MLE1BQWE7TUFBQSxJQUFFO1FBQUEsYUFFWCxJQUFJO1FBRDVCLElBQU1xTCxpQkFBaUIsR0FBR3JMLE1BQU0sSUFBSUEsTUFBTSxDQUFDMEMsWUFBWSxDQUFDLE9BQU8sQ0FBQztRQUNoRSxJQUFJdUksVUFBVSxDQUFDSyxRQUFRLENBQUMsT0FBSzdQLE1BQU0sQ0FBQyxFQUFFO1VBQ3JDd1AsVUFBVSxDQUFDTSxNQUFNLENBQUMsT0FBSzlQLE1BQU0sQ0FBQztRQUMvQjtRQUFDO1VBQUEsSUFFRzRQLGlCQUFpQjtZQUFBLGdDQUVoQjtjQUFBLHVCQUMyQi9HLElBQUksQ0FBQ0Msd0JBQXdCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxpQkFBMUVGLGVBQWU7Z0JBQ3JCLElBQU1tSCxjQUFjLEdBQUcsT0FBSzlQLElBQUksQ0FBQzhQLGNBQWM7Z0JBQy9DLElBQUlDLE9BQU8sR0FBRyxDQUFDLENBQUM7Z0JBQ2hCLElBQUlKLGlCQUFpQixDQUFDSyxNQUFNLEtBQUssR0FBRyxFQUFFO2tCQUNyQ0QsT0FBTyxHQUFHO29CQUNURSxxQkFBcUIsRUFBRSxJQUFJO29CQUMzQkMsU0FBUyxFQUFFO2tCQUNaLENBQUM7Z0JBQ0YsQ0FBQyxNQUFNLElBQUlQLGlCQUFpQixDQUFDSyxNQUFNLEtBQUssR0FBRyxFQUFFO2tCQUM1Q0QsT0FBTyxHQUFHO29CQUNUaEgsS0FBSyxFQUFFSixlQUFlLENBQUNHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztvQkFDdERFLFdBQVcsRUFBRUwsZUFBZSxDQUFDRyxPQUFPLENBQUMsZ0RBQWdELENBQUM7b0JBQ3RGcUgsbUJBQW1CLEVBQUUsSUFBSTtvQkFDekJELFNBQVMsRUFBRTtrQkFDWixDQUFDO2dCQUNGLENBQUMsTUFBTTtrQkFDTkgsT0FBTyxHQUFHO29CQUNUaEgsS0FBSyxFQUFFSixlQUFlLENBQUNHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztvQkFDdERFLFdBQVcsRUFBRTJHLGlCQUFpQjtvQkFDOUJRLG1CQUFtQixFQUFFLElBQUk7b0JBQ3pCRCxTQUFTLEVBQUU7a0JBQ1osQ0FBQztnQkFDRjtnQkFBQyx1QkFDS0osY0FBYyxDQUFDTSxZQUFZLENBQUNMLE9BQU8sQ0FBQztjQUFBO1lBQzNDLENBQUMsWUFBUXBNLE1BQVcsRUFBRTtjQUNyQkMsR0FBRyxDQUFDQyxLQUFLLENBQUMsOENBQThDLEVBQUVGLE1BQU0sQ0FBQztZQUNsRSxDQUFDO1lBQUE7VUFBQTtRQUFBO1FBQUE7TUFFSCxDQUFDO1FBQUE7TUFBQTtJQUFBO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQVZDO0lBQUEsT0FXQWdLLHNCQUFzQixHQUF0QixnQ0FBdUJuTSxlQUFvQixFQUFFO01BQzVDLElBQU02TSxjQUFjLEdBQUcsSUFBSSxDQUFDaE8sZUFBZTtNQUMzQyxJQUFNZ1EsbUJBQW1CLEdBQUcsSUFBSSxDQUFDblEsY0FBYyxDQUFDb1EscUJBQXFCLEVBQUU7TUFDdkUsSUFBTUMsZ0JBQWdCLEdBQUcvTyxlQUFlLENBQUNnSyxPQUFPLEVBQUU7TUFDbEQsSUFBTThDLFVBQVUsR0FBR0QsY0FBYyxJQUFJQSxjQUFjLENBQUNFLFlBQVksSUFBSUYsY0FBYyxDQUFDRSxZQUFZLEVBQUU7TUFDakcsSUFBTUMsWUFBWSxHQUNoQkgsY0FBYyxJQUFJQSxjQUFjLENBQUNJLGNBQWMsSUFBSUosY0FBYyxDQUFDSSxjQUFjLEVBQUUsSUFBTUgsVUFBVSxlQUFRQSxVQUFVLENBQUc7TUFDekgsSUFBTWpGLFVBQVUsR0FBRyxJQUFJLENBQUN0SixNQUFNLENBQUNrRSxRQUFRLEVBQUUsQ0FBQ29ILFlBQVksRUFBb0I7TUFDMUUsSUFBSTJELGFBQWE7TUFDakIsSUFBTXdCLHdCQUErQixHQUFHLEVBQUU7TUFDMUMsSUFBTUMsY0FBcUIsR0FBRyxFQUFFO01BQ2hDLElBQU1DLFlBQWlCLEdBQUc7UUFDekJDLGdCQUFnQixFQUFFLEVBQUU7UUFDcEJDLGNBQWMsRUFBRTtNQUNqQixDQUFDO01BRUQsU0FBU0MsZUFBZSxDQUFDQyxRQUFhLEVBQUU7UUFDdkMsSUFBSUMsa0JBQWtCO1FBQ3RCLElBQU1DLGFBQWEsR0FBRyxDQUFFRixRQUFRLENBQUNHLFVBQVUsRUFBRSxJQUFJSCxRQUFRLENBQUNHLFVBQVUsRUFBRSxDQUFDekYsT0FBTyxFQUFFLElBQUssRUFBRSxFQUFFL0UsT0FBTyxDQUFDOEosZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4SCxJQUFNdEUsS0FBSyxHQUFHLENBQUMrRSxhQUFhLGFBQU1BLGFBQWEsQ0FBQ0UsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFNRixhQUFhLElBQUlGLFFBQVEsQ0FBQ3RGLE9BQU8sRUFBRTtRQUVqRyxJQUFJc0YsUUFBUSxDQUFDM04sR0FBRyxDQUFDLDJDQUEyQyxDQUFDLEVBQUU7VUFDOUQ7VUFDQTtVQUNBNE4sa0JBQWtCLEdBQUdELFFBQVEsQ0FBQ0ssb0JBQW9CLEVBQUU7VUFDcEQsSUFBSUosa0JBQWtCLEVBQUU7WUFDdkI7WUFDQTtZQUNBLEtBQUssSUFBSUssRUFBQyxHQUFHLENBQUMsRUFBRUEsRUFBQyxHQUFHTCxrQkFBa0IsQ0FBQ3ZILE1BQU0sRUFBRTRILEVBQUMsRUFBRSxFQUFFO2NBQ25EUCxlQUFlLENBQUNFLGtCQUFrQixDQUFDSyxFQUFDLENBQUMsQ0FBQztZQUN2QztVQUNELENBQUMsTUFBTSxJQUFJWix3QkFBd0IsQ0FBQ3BMLE9BQU8sQ0FBQzZHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQzFEdUUsd0JBQXdCLENBQUNyRixJQUFJLENBQUNjLEtBQUssQ0FBQztVQUNyQztRQUNELENBQUMsTUFBTSxJQUFJNkUsUUFBUSxDQUFDM04sR0FBRyxDQUFDLHdDQUF3QyxDQUFDLEVBQUU7VUFDbEUsSUFBSXFOLHdCQUF3QixDQUFDcEwsT0FBTyxDQUFDNkcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDbkR1RSx3QkFBd0IsQ0FBQ3JGLElBQUksQ0FBQ2MsS0FBSyxDQUFDO1VBQ3JDO1FBQ0QsQ0FBQyxNQUFNLElBQUk2RSxRQUFRLENBQUMzTixHQUFHLENBQUMsNENBQTRDLENBQUMsRUFBRTtVQUN0RSxJQUFJc04sY0FBYyxDQUFDckwsT0FBTyxDQUFDNkcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDekN3RSxjQUFjLENBQUN0RixJQUFJLENBQUNjLEtBQUssQ0FBQztVQUMzQjtRQUNEO01BQ0Q7TUFFQSxJQUFJdUMsWUFBWSxFQUFFO1FBQ2pCUSxhQUFhLEdBQUczRixVQUFVLENBQUNqRixTQUFTLFdBQUlvSyxZQUFZLHFEQUFrRDtNQUN2Rzs7TUFFQTtNQUNBcUMsZUFBZSxDQUFDclAsZUFBZSxDQUFDNkcsVUFBVSxFQUFFLENBQUM7TUFFN0MsSUFBSStJLENBQUM7TUFDTCxLQUFLQSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdaLHdCQUF3QixDQUFDaEgsTUFBTSxFQUFFNEgsQ0FBQyxFQUFFLEVBQUU7UUFDckRWLFlBQVksQ0FBQ0UsY0FBYyxDQUFDekYsSUFBSSxDQUFDO1VBQ2hDa0csdUJBQXVCLEVBQUViLHdCQUF3QixDQUFDWSxDQUFDO1FBQ3BELENBQUMsQ0FBQztNQUNIO01BQ0FWLFlBQVksQ0FBQ0MsZ0JBQWdCLEdBQUdGLGNBQWM7TUFDOUMsSUFBSXpCLGFBQWEsRUFBRTtRQUNsQjBCLFlBQVksQ0FBQ0MsZ0JBQWdCLENBQUN4RixJQUFJLENBQUM2RCxhQUFhLENBQUM7TUFDbEQ7TUFDQTtNQUNBMEIsWUFBWSxDQUFDQyxnQkFBZ0IsR0FBR0QsWUFBWSxDQUFDQyxnQkFBZ0IsQ0FBQzdGLEdBQUcsQ0FBQyxVQUFDd0csZUFBdUIsRUFBSztRQUM5RixJQUFJQSxlQUFlLEVBQUU7VUFDcEIsSUFBTUMsS0FBSyxHQUFHRCxlQUFlLENBQUNsTSxPQUFPLENBQUMsR0FBRyxDQUFDO1VBQzFDLElBQUltTSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1lBQ2Q7WUFDQSxPQUFPRCxlQUFlLENBQUNKLEtBQUssQ0FBQyxDQUFDLEVBQUVLLEtBQUssQ0FBQztVQUN2QztVQUNBLE9BQU9ELGVBQWU7UUFDdkI7TUFDRCxDQUFDLENBQUM7TUFDRjtNQUNBakIsbUJBQW1CLENBQUN0QixrQkFBa0IsQ0FBQzJCLFlBQVksQ0FBQ0UsY0FBYyxDQUFDWSxNQUFNLENBQUNkLFlBQVksQ0FBQ0MsZ0JBQWdCLENBQUMsRUFBRW5QLGVBQWUsQ0FBQztJQUMzSDs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FMQztJQUFBLE9BTUEyRyxrQkFBa0IsR0FBbEIsOEJBQWlEO01BQ2hELElBQUksSUFBSSxDQUFDOUgsZUFBZSxFQUFFO1FBQ3pCLE9BQU8sSUFBSSxDQUFDQSxlQUFlLENBQUMwRSxpQkFBaUIsRUFBRTtNQUNoRCxDQUFDLE1BQU07UUFDTixPQUFPLElBQUksQ0FBQ2hGLE1BQU0sQ0FBQ2dGLGlCQUFpQixFQUFFO01BQ3ZDO0lBQ0Q7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BTEM7SUFBQSxPQU1Bb0Isa0JBQWtCLEdBQWxCLDRCQUFtQmxFLFFBQWEsRUFBRTtNQUNqQyxJQUFJd1AsZ0JBQWdCLEVBQUVDLGNBQWM7TUFDcEMsSUFBSSxJQUFJLENBQUNyUixlQUFlLEVBQUU7UUFDekJvUixnQkFBZ0IsR0FBRyxJQUFJLENBQUNwUixlQUFlLENBQUMwRSxpQkFBaUIsRUFBYTtRQUN0RTJNLGNBQWMsR0FBRyxJQUFJLENBQUNyUixlQUFlO01BQ3RDLENBQUMsTUFBTTtRQUNOb1IsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDMVIsTUFBTSxDQUFDZ0YsaUJBQWlCLEVBQWE7UUFDN0QyTSxjQUFjLEdBQUcsSUFBSSxDQUFDM1IsTUFBTTtNQUM3QjtNQUVBMlIsY0FBYyxDQUFDQyxpQkFBaUIsQ0FBQzFQLFFBQVEsQ0FBQztNQUUxQyxJQUFJd1AsZ0JBQWdCLElBQUlBLGdCQUFnQixDQUFDRyxXQUFXLEVBQUUsRUFBRTtRQUN2RCxJQUFJLENBQUM3RCxhQUFhLENBQUMwRCxnQkFBZ0IsRUFBRSxLQUFLLENBQUM7TUFDNUM7SUFDRDs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FMQztJQUFBLE9BTUE3TSxZQUFZLEdBQVosd0JBQWU7TUFDZCxPQUFPLElBQUksQ0FBQzFELG1CQUFtQixDQUFDeUQsUUFBUTtJQUN6QyxDQUFDO0lBQUEsT0FFRG9KLGFBQWEsR0FBYix1QkFBYzlMLFFBQWlCLEVBQUU0UCxVQUFtQixFQUFFQyxlQUEwQixFQUFFQyxnQkFBMEIsRUFBRTtNQUM3RyxJQUFJOVAsUUFBUSxDQUFDdUosT0FBTyxFQUFFLENBQUN3RyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDckM7UUFDQSxJQUFNM0ksVUFBVSxHQUFHcEgsUUFBUSxDQUFDZ0MsUUFBUSxFQUFFLENBQUNvSCxZQUFZLEVBQUU7UUFDckQsSUFBTTRHLFNBQVMsR0FBRzVJLFVBQVUsQ0FBQzZJLFdBQVcsQ0FBQ2pRLFFBQVEsQ0FBQ3VKLE9BQU8sRUFBRSxDQUFDO1FBQzVELElBQU13RCxhQUFhLEdBQUczRixVQUFVLENBQUNqRixTQUFTLFdBQUk2TixTQUFTLHFEQUFrRDtRQUN6R2hRLFFBQVEsQ0FBQ2tRLFlBQVksQ0FBQ04sVUFBVSxFQUFFQyxlQUFlLEVBQUUsQ0FBQyxDQUFDOUMsYUFBYSxJQUFJK0MsZ0JBQWdCLENBQUM7TUFDeEY7SUFDRCxDQUFDO0lBQUEsT0FFRG5ELG9CQUFvQixHQUFwQiw4QkFBcUJwSCxNQUFrQixFQUFFaEIsSUFBWSxFQUFFdUwsZ0JBQTBCLEVBQUVwUCxVQUFnQixFQUF1QjtNQUN6SDtNQUNBO01BQ0EsSUFBTXlQLGlCQUFpQixHQUFHNUwsSUFBSSxDQUFDb0QsS0FBSyxDQUFDLEdBQUcsQ0FBQztNQUN6QyxJQUFNeUksbUJBQTZCLEdBQUcsRUFBRTtNQUN4QyxPQUFPRCxpQkFBaUIsQ0FBQzVJLE1BQU0sSUFBSSxDQUFDNEksaUJBQWlCLENBQUNBLGlCQUFpQixDQUFDNUksTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDd0ksUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ2xHSyxtQkFBbUIsQ0FBQ2xILElBQUksQ0FBQ2lILGlCQUFpQixDQUFDRSxHQUFHLEVBQUUsQ0FBRTtNQUNuRDtNQUVBLElBQUlGLGlCQUFpQixDQUFDNUksTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNuQyxPQUFPckMsU0FBUztNQUNqQjtNQUVBLElBQU1vTCxhQUFhLEdBQUdILGlCQUFpQixDQUFDSSxJQUFJLENBQUMsR0FBRyxDQUFDO01BQ2pELElBQU1DLGlCQUFpQixHQUFHakwsTUFBTSxDQUFDa0wsbUJBQW1CLENBQUNILGFBQWEsRUFBRVIsZ0JBQWdCLEVBQUVwUCxVQUFVLENBQUM7TUFFakcsSUFBSTBQLG1CQUFtQixDQUFDN0ksTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNyQyxPQUFPaUosaUJBQWlCO01BQ3pCLENBQUMsTUFBTTtRQUNOSixtQkFBbUIsQ0FBQ00sT0FBTyxFQUFFO1FBQzdCLElBQU1DLGVBQWUsR0FBR1AsbUJBQW1CLENBQUNHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDckQsT0FBT2hMLE1BQU0sQ0FBQzZILFdBQVcsQ0FBQ3VELGVBQWUsRUFBRUgsaUJBQWlCLENBQUMsQ0FBQy9DLGVBQWUsRUFBRTtNQUNoRjtJQUNEOztJQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsT0FKQztJQUFBLE9BUUFtRCxnQkFBZ0IsR0FGaEIsNEJBRW1CO01BQ2xCLElBQU1DLE9BQU8sR0FBRyxJQUFJLENBQUM5UyxJQUFJLENBQUNDLE9BQU8sRUFBRTtNQUNuQyxJQUFNOFMsZUFBZSxHQUFHRCxPQUFPLENBQUM3TyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3BEK08sYUFBYSxHQUFHRCxlQUFlLENBQUMvTixXQUFXLENBQUMsaUNBQWlDLENBQUM7UUFDOUVpTyxXQUFXLEdBQUdGLGVBQWUsQ0FBQy9OLFdBQVcsQ0FDeENnTyxhQUFhLEdBQUcsbUNBQW1DLEdBQUcsK0JBQStCLENBQ3JGO1FBQ0RuRixtQkFBbUIsR0FBSSxJQUFJLENBQUMzTixjQUFjLENBQVM0QixxQkFBcUIsRUFBRTtNQUUzRSxJQUFNRyxRQUFRLEdBQUc0TCxtQkFBbUIsQ0FBQ3FGLG1CQUFtQixHQUFHckYsbUJBQW1CLENBQUNxRixtQkFBbUIsRUFBRSxHQUFHSixPQUFPLENBQUMvTixpQkFBaUIsRUFBRTtNQUVsSSxJQUFJLENBQUMvRSxJQUFJLENBQUNtVCxRQUFRLENBQUNsUSxpQkFBaUIsQ0FBQ2hCLFFBQVEsRUFBRTtRQUFFbVIsT0FBTyxFQUFFSDtNQUFZLENBQUMsQ0FBQyxDQUFDN1IsS0FBSyxDQUFDLFlBQVk7UUFDMUZ3QyxHQUFHLENBQUN5UCxPQUFPLENBQUMsNkNBQTZDLENBQUM7TUFDM0QsQ0FBQyxDQUFDO0lBQ0g7O0lBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQSxPQUpDO0lBQUEsT0FPQUMsV0FBVyxHQUZYLHVCQUVjO01BQ2IsSUFBTVIsT0FBTyxHQUFHLElBQUksQ0FBQzlTLElBQUksQ0FBQ0MsT0FBTyxFQUFFO01BQ25DLElBQU1zVCxTQUFTLEdBQUdULE9BQU8sQ0FBQ2pRLFdBQVcsRUFBUztNQUM5QyxJQUFNWixRQUFRLEdBQUc2USxPQUFPLENBQUMvTixpQkFBaUIsRUFBYTtNQUN2RCxJQUFNL0UsSUFBSSxHQUFHLElBQUksQ0FBQ0EsSUFBSTtNQUN0QixJQUFNcUosVUFBVSxHQUFHcEgsUUFBUSxDQUFDZ0MsUUFBUSxFQUFFLENBQUNvSCxZQUFZLEVBQUU7TUFFckQsSUFBSWtJLFNBQVMsSUFBSUEsU0FBUyxDQUFDdE4sU0FBUyxLQUFLLENBQUMsSUFBSThELFdBQVcsQ0FBQ3lKLGdCQUFnQixDQUFDbkssVUFBVSxFQUFFcEgsUUFBUSxDQUFDdUosT0FBTyxFQUFFLENBQUMsRUFBRTtRQUMzR2lJLEtBQUssQ0FBQ0MseUNBQXlDLENBQzlDLFlBQVk7VUFDWDFULElBQUksQ0FBQ21ULFFBQVEsQ0FBQ3RPLHVCQUF1QixDQUFDNUMsUUFBUSxFQUFFO1lBQUUwUixtQkFBbUIsRUFBRTtVQUFLLENBQUMsQ0FBQztRQUMvRSxDQUFDLEVBQ0RDLFFBQVEsQ0FBQ0MsU0FBUyxFQUNsQjVSLFFBQVEsRUFDUjZRLE9BQU8sQ0FBQ25SLGFBQWEsRUFBRSxFQUN2QixLQUFLLEVBQ0w4UixLQUFLLENBQUNLLGNBQWMsQ0FBQ0MsY0FBYyxDQUNuQztNQUNGLENBQUMsTUFBTTtRQUNOL1QsSUFBSSxDQUFDbVQsUUFBUSxDQUFDdE8sdUJBQXVCLENBQUM1QyxRQUFRLEVBQUU7VUFBRTBSLG1CQUFtQixFQUFFO1FBQUssQ0FBQyxDQUFDO01BQy9FO0lBQ0QsQ0FBQztJQUFBO0VBQUEsRUF2aUM0QkssbUJBQW1CO0VBQUEsT0EwaUNsQy9VLGVBQWU7QUFBQSJ9