@sapui5/sap.fe.core 1.99.0 → 1.100.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 (246) hide show
  1. package/package.json +4 -2
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +1 -69
  4. package/src/sap/fe/core/AnnotationHelper.ts +0 -70
  5. package/src/sap/fe/core/AppComponent.js +388 -399
  6. package/src/sap/fe/core/AppComponent.ts +403 -0
  7. package/src/sap/fe/core/AppStateHandler.js +127 -158
  8. package/src/sap/fe/core/BaseController.js +82 -58
  9. package/src/sap/fe/core/BaseController.ts +68 -0
  10. package/src/sap/fe/core/CommonUtils.js +111 -20
  11. package/src/sap/fe/core/CommonUtils.ts +131 -32
  12. package/src/sap/fe/core/ExtensionAPI.js +278 -274
  13. package/src/sap/fe/core/ExtensionAPI.ts +250 -0
  14. package/src/sap/fe/core/PageController.js +157 -29
  15. package/src/sap/fe/core/PageController.ts +60 -32
  16. package/src/sap/fe/core/RouterProxy.js +694 -756
  17. package/src/sap/fe/core/RouterProxy.ts +11 -9
  18. package/src/sap/fe/core/Synchronization.js +21 -31
  19. package/src/sap/fe/core/TemplateComponent.js +1 -1
  20. package/src/sap/fe/core/TemplateComponent.ts +10 -3
  21. package/src/sap/fe/core/TemplateModel.js +20 -38
  22. package/src/sap/fe/core/TemplateModel.ts +1 -1
  23. package/src/sap/fe/core/TransactionHelper.js +1354 -1370
  24. package/src/sap/fe/core/TransactionHelper.ts +33 -22
  25. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +392 -0
  26. package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
  27. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +136 -0
  28. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
  29. package/src/sap/fe/core/actions/collaboration/Manage.js +262 -0
  30. package/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
  31. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
  32. package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
  33. package/src/sap/fe/core/actions/draft.js +30 -68
  34. package/src/sap/fe/core/actions/draft.ts +44 -71
  35. package/src/sap/fe/core/actions/messageHandling.js +55 -36
  36. package/src/sap/fe/core/actions/messageHandling.ts +66 -46
  37. package/src/sap/fe/core/actions/operations.js +34 -15
  38. package/src/sap/fe/core/actions/operations.ts +48 -18
  39. package/src/sap/fe/core/actions/sticky.js +17 -4
  40. package/src/sap/fe/core/actions/sticky.ts +21 -4
  41. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +69 -66
  42. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
  43. package/src/sap/fe/core/controllerextensions/EditFlow.js +1593 -1669
  44. package/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
  45. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +79 -54
  46. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
  47. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +718 -779
  48. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
  49. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +796 -816
  50. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
  51. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1004 -1005
  52. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
  53. package/src/sap/fe/core/controllerextensions/KPIManagement.js +487 -521
  54. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -2
  55. package/src/sap/fe/core/controllerextensions/MassEdit.js +141 -169
  56. package/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
  57. package/src/sap/fe/core/controllerextensions/MessageHandler.js +233 -244
  58. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
  59. package/src/sap/fe/core/controllerextensions/PageReady.js +301 -336
  60. package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -10
  61. package/src/sap/fe/core/controllerextensions/Paginator.js +188 -175
  62. package/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
  63. package/src/sap/fe/core/controllerextensions/Placeholder.js +157 -149
  64. package/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
  65. package/src/sap/fe/core/controllerextensions/Routing.js +144 -125
  66. package/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
  67. package/src/sap/fe/core/controllerextensions/RoutingListener.js +7 -6
  68. package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
  69. package/src/sap/fe/core/controllerextensions/Share.js +230 -268
  70. package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
  71. package/src/sap/fe/core/controllerextensions/SideEffects.js +592 -633
  72. package/src/sap/fe/core/controllerextensions/SideEffects.ts +8 -7
  73. package/src/sap/fe/core/controllerextensions/ViewState.js +788 -806
  74. package/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
  75. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -2
  76. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
  77. package/src/sap/fe/core/controls/CommandExecution.js +67 -66
  78. package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
  79. package/src/sap/fe/core/controls/ConditionalWrapper.js +90 -75
  80. package/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
  81. package/src/sap/fe/core/controls/CustomQuickViewPage.js +130 -125
  82. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
  83. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +103 -112
  84. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
  85. package/src/sap/fe/core/controls/FieldWrapper.js +122 -135
  86. package/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
  87. package/src/sap/fe/core/controls/FilterBar.js +162 -159
  88. package/src/sap/fe/core/controls/FilterBar.ts +143 -0
  89. package/src/sap/fe/core/controls/FormElementWrapper.js +45 -39
  90. package/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
  91. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +37 -42
  92. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
  93. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +126 -116
  94. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
  95. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +241 -255
  96. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
  97. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +150 -141
  98. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
  99. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +335 -322
  100. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
  101. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +74 -74
  102. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
  103. package/src/sap/fe/core/converters/ConverterContext.js +348 -379
  104. package/src/sap/fe/core/converters/ConverterContext.ts +19 -16
  105. package/src/sap/fe/core/converters/ManifestSettings.js +12 -1
  106. package/src/sap/fe/core/converters/ManifestSettings.ts +12 -1
  107. package/src/sap/fe/core/converters/ManifestWrapper.js +354 -378
  108. package/src/sap/fe/core/converters/ManifestWrapper.ts +10 -0
  109. package/src/sap/fe/core/converters/MetaModelConverter.js +6 -4
  110. package/src/sap/fe/core/converters/MetaModelConverter.ts +5 -2
  111. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  112. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
  113. package/src/sap/fe/core/converters/annotations/DataField.js +26 -12
  114. package/src/sap/fe/core/converters/annotations/DataField.ts +37 -13
  115. package/src/sap/fe/core/converters/controls/Common/Form.js +2 -2
  116. package/src/sap/fe/core/converters/controls/Common/Form.ts +4 -2
  117. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  118. package/src/sap/fe/core/converters/controls/Common/KPI.ts +3 -2
  119. package/src/sap/fe/core/converters/controls/Common/Table.js +130 -23
  120. package/src/sap/fe/core/converters/controls/Common/Table.ts +134 -29
  121. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +118 -53
  122. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +156 -93
  123. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +161 -207
  124. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +148 -206
  125. package/src/sap/fe/core/converters/helpers/Aggregation.js +115 -133
  126. package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
  127. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
  128. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
  129. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
  130. package/src/sap/fe/core/converters/helpers/Key.js +42 -57
  131. package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
  132. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +25 -4
  133. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +20 -3
  134. package/src/sap/fe/core/converters/templates/ListReportConverter.js +10 -4
  135. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +15 -4
  136. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +7 -5
  137. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
  138. package/src/sap/fe/core/designtime/AppComponent.designtime.js +92 -98
  139. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
  140. package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
  141. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
  142. package/src/sap/fe/core/formatters/TableFormatter.js +53 -2
  143. package/src/sap/fe/core/formatters/TableFormatter.ts +51 -0
  144. package/src/sap/fe/core/fpm/Component.js +50 -54
  145. package/src/sap/fe/core/fpm/Component.ts +48 -0
  146. package/src/sap/fe/core/helpers/AppStartupHelper.js +323 -309
  147. package/src/sap/fe/core/helpers/AppStartupHelper.ts +363 -337
  148. package/src/sap/fe/core/helpers/BindingExpression.js +7 -7
  149. package/src/sap/fe/core/helpers/BindingExpression.ts +7 -7
  150. package/src/sap/fe/core/helpers/ClassSupport.js +186 -62
  151. package/src/sap/fe/core/helpers/ClassSupport.ts +168 -52
  152. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +5 -4
  153. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -5
  154. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  155. package/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
  156. package/src/sap/fe/core/helpers/MassEditHelper.js +601 -684
  157. package/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
  158. package/src/sap/fe/core/helpers/ModelHelper.js +25 -1
  159. package/src/sap/fe/core/helpers/ModelHelper.ts +23 -0
  160. package/src/sap/fe/core/helpers/SemanticDateOperators.js +5 -1
  161. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +4 -0
  162. package/src/sap/fe/core/library.js +426 -451
  163. package/src/sap/fe/core/library.support.js +22 -33
  164. package/src/sap/fe/core/library.support.ts +23 -0
  165. package/src/sap/fe/core/library.ts +420 -0
  166. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +5 -3
  167. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +4 -1
  168. package/src/sap/fe/core/messagebundle.properties +22 -5
  169. package/src/sap/fe/core/messagebundle_ar.properties +27 -7
  170. package/src/sap/fe/core/messagebundle_bg.properties +27 -7
  171. package/src/sap/fe/core/messagebundle_ca.properties +27 -7
  172. package/src/sap/fe/core/messagebundle_cs.properties +27 -7
  173. package/src/sap/fe/core/messagebundle_cy.properties +27 -7
  174. package/src/sap/fe/core/messagebundle_da.properties +27 -7
  175. package/src/sap/fe/core/messagebundle_de.properties +27 -7
  176. package/src/sap/fe/core/messagebundle_el.properties +27 -7
  177. package/src/sap/fe/core/messagebundle_en.properties +27 -7
  178. package/src/sap/fe/core/messagebundle_en_GB.properties +27 -7
  179. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +27 -7
  180. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +27 -7
  181. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +27 -7
  182. package/src/sap/fe/core/messagebundle_es.properties +27 -7
  183. package/src/sap/fe/core/messagebundle_es_MX.properties +27 -7
  184. package/src/sap/fe/core/messagebundle_et.properties +27 -7
  185. package/src/sap/fe/core/messagebundle_fi.properties +28 -8
  186. package/src/sap/fe/core/messagebundle_fr.properties +28 -8
  187. package/src/sap/fe/core/messagebundle_fr_CA.properties +29 -9
  188. package/src/sap/fe/core/messagebundle_hi.properties +27 -7
  189. package/src/sap/fe/core/messagebundle_hr.properties +27 -7
  190. package/src/sap/fe/core/messagebundle_hu.properties +27 -7
  191. package/src/sap/fe/core/messagebundle_id.properties +27 -7
  192. package/src/sap/fe/core/messagebundle_it.properties +27 -7
  193. package/src/sap/fe/core/messagebundle_iw.properties +27 -7
  194. package/src/sap/fe/core/messagebundle_ja.properties +26 -6
  195. package/src/sap/fe/core/messagebundle_kk.properties +27 -7
  196. package/src/sap/fe/core/messagebundle_ko.properties +27 -7
  197. package/src/sap/fe/core/messagebundle_lt.properties +27 -7
  198. package/src/sap/fe/core/messagebundle_lv.properties +28 -8
  199. package/src/sap/fe/core/messagebundle_ms.properties +27 -7
  200. package/src/sap/fe/core/messagebundle_nl.properties +27 -7
  201. package/src/sap/fe/core/messagebundle_no.properties +27 -7
  202. package/src/sap/fe/core/messagebundle_pl.properties +27 -7
  203. package/src/sap/fe/core/messagebundle_pt.properties +28 -8
  204. package/src/sap/fe/core/messagebundle_pt_PT.properties +27 -7
  205. package/src/sap/fe/core/messagebundle_ro.properties +27 -7
  206. package/src/sap/fe/core/messagebundle_ru.properties +27 -7
  207. package/src/sap/fe/core/messagebundle_sh.properties +27 -7
  208. package/src/sap/fe/core/messagebundle_sk.properties +27 -7
  209. package/src/sap/fe/core/messagebundle_sl.properties +27 -7
  210. package/src/sap/fe/core/messagebundle_sv.properties +27 -7
  211. package/src/sap/fe/core/messagebundle_th.properties +26 -6
  212. package/src/sap/fe/core/messagebundle_tr.properties +30 -10
  213. package/src/sap/fe/core/messagebundle_uk.properties +27 -7
  214. package/src/sap/fe/core/messagebundle_vi.properties +27 -7
  215. package/src/sap/fe/core/messagebundle_zh_CN.properties +27 -7
  216. package/src/sap/fe/core/messagebundle_zh_TW.properties +27 -7
  217. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +45 -71
  218. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +154 -192
  219. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +4 -4
  220. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +66 -92
  221. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +1 -1
  222. package/src/sap/fe/core/services/NavigationServiceFactory.js +284 -339
  223. package/src/sap/fe/core/services/NavigationServiceFactory.ts +10 -13
  224. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +67 -102
  225. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +5 -2
  226. package/src/sap/fe/core/services/RoutingServiceFactory.js +754 -814
  227. package/src/sap/fe/core/services/RoutingServiceFactory.ts +13 -13
  228. package/src/sap/fe/core/services/ShellServicesFactory.js +649 -736
  229. package/src/sap/fe/core/services/ShellServicesFactory.ts +7 -4
  230. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +567 -592
  231. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +22 -3
  232. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +354 -386
  233. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +21 -14
  234. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
  235. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
  236. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  237. package/src/sap/fe/core/support/CommonHelper.ts +1 -1
  238. package/src/sap/fe/core/support/Diagnostics.js +36 -48
  239. package/src/sap/fe/core/templating/DataModelPathHelper.js +93 -85
  240. package/src/sap/fe/core/templating/DataModelPathHelper.ts +104 -95
  241. package/src/sap/fe/core/templating/FilterHelper.js +25 -32
  242. package/src/sap/fe/core/templating/FilterHelper.ts +36 -35
  243. package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
  244. package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  245. package/src/sap/fe/core/templating/UIFormatters.js +32 -26
  246. package/src/sap/fe/core/templating/UIFormatters.ts +37 -24
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettings", "../../../helpers/BindingHelper", "sap/fe/core/templating/DataModelPathHelper"], function (BindingExpression, ManifestSettings, BindingHelper, DataModelPathHelper) {
5
+ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettings", "../../../helpers/BindingHelper", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/formatters/TableFormatter"], function (BindingExpression, ManifestSettings, BindingHelper, DataModelPathHelper, tableFormatters) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
@@ -14,6 +14,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
14
14
  var singletonPathVisitor = BindingHelper.singletonPathVisitor;
15
15
  var TemplateType = ManifestSettings.TemplateType;
16
16
  var CreationMode = ManifestSettings.CreationMode;
17
+ var formatResult = BindingExpression.formatResult;
17
18
  var greaterThan = BindingExpression.greaterThan;
18
19
  var or = BindingExpression.or;
19
20
  var notEqual = BindingExpression.notEqual;
@@ -30,24 +31,32 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
30
31
  var annotationExpression = BindingExpression.annotationExpression;
31
32
  var and = BindingExpression.and;
32
33
 
34
+ var AnnotationHiddenProperty;
35
+
36
+ (function (AnnotationHiddenProperty) {
37
+ AnnotationHiddenProperty["CreateHidden"] = "CreateHidden";
38
+ AnnotationHiddenProperty["DeleteHidden"] = "DeleteHidden";
39
+ AnnotationHiddenProperty["UpdateHidden"] = "UpdateHidden";
40
+ })(AnnotationHiddenProperty || (AnnotationHiddenProperty = {}));
41
+
33
42
  /**
34
43
  * Generates the context for the standard actions.
35
44
  *
36
45
  * @param {ConverterContext} converterContext
37
- * @param {NavigationSettingsConfiguration} navigationSettings
46
+ * @param {NavigationSettingsConfiguration} creationMode
38
47
  * @param {TableControlConfiguration} tableManifestConfiguration
39
48
  * @param {ViewPathConfiguration} viewConfiguration
40
49
  * @returns The context for table actions
41
50
  */
42
- function generateStandardActionsContext(converterContext, navigationSettings, tableManifestConfiguration, viewConfiguration) {
51
+ function generateStandardActionsContext(converterContext, creationMode, tableManifestConfiguration, viewConfiguration) {
43
52
  return {
44
53
  collectionPath: getTargetObjectPath(converterContext.getDataModelObjectPath()),
45
54
  hiddenAnnotation: {
46
- create: isActionAnnotatedHidden(converterContext, "CreateHidden"),
47
- "delete": isActionAnnotatedHidden(converterContext, "DeleteHidden"),
48
- update: isActionAnnotatedHidden(converterContext, "UpdateHidden")
55
+ create: isActionAnnotatedHidden(converterContext, AnnotationHiddenProperty.CreateHidden),
56
+ "delete": isActionAnnotatedHidden(converterContext, AnnotationHiddenProperty.DeleteHidden),
57
+ update: isActionAnnotatedHidden(converterContext, AnnotationHiddenProperty.UpdateHidden)
49
58
  },
50
- isExternalCreateConfigured: isExternalCreateConfigured(navigationSettings),
59
+ creationMode: creationMode,
51
60
  isDraftOrStickySupported: isDraftOrStickySupported(converterContext),
52
61
  isViewWithMultipleVisualizations: viewConfiguration ? converterContext.getManifestWrapper().hasMultipleVisualizations(viewConfiguration) : false,
53
62
  newAction: getNewAction(converterContext),
@@ -55,20 +64,6 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
55
64
  restrictions: getRestrictions(converterContext)
56
65
  };
57
66
  }
58
- /**
59
- * Checks if an external created is configured for the navigation.
60
- *
61
- * @param {NavigationSettingsConfiguration} navigationSettings
62
- * @returns {boolean}
63
- */
64
-
65
-
66
- _exports.generateStandardActionsContext = generateStandardActionsContext;
67
-
68
- function isExternalCreateConfigured(navigationSettings) {
69
- var navigation = navigationSettings === null || navigationSettings === void 0 ? void 0 : navigationSettings.create;
70
- return (navigation && navigation.outbound && navigation.outboundDetail) !== undefined;
71
- }
72
67
  /**
73
68
  * Checks if draft is supported.
74
69
  *
@@ -77,7 +72,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
77
72
  */
78
73
 
79
74
 
80
- _exports.isExternalCreateConfigured = isExternalCreateConfigured;
75
+ _exports.generateStandardActionsContext = generateStandardActionsContext;
81
76
 
82
77
  function isDraftSupported(converterContext) {
83
78
  var _currentEntitySet$ann, _currentEntitySet$ann2, _currentEntitySet$ann3, _currentEntitySet$ann4, _converterContext$get, _converterContext$get2, _converterContext$get3, _converterContext$get4, _converterContext$get5, _converterContext$get6, _converterContext$get7;
@@ -139,6 +134,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
139
134
  *
140
135
  * @param {ConverterContext} converterContext
141
136
  * @param {string} sAnnotationTerm
137
+ * @param {boolean} bWithNavigationPath
142
138
  * @returns {Expression<boolean>}
143
139
  */
144
140
 
@@ -148,12 +144,14 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
148
144
  function isActionAnnotatedHidden(converterContext, sAnnotationTerm) {
149
145
  var _currentEntitySet$ann11;
150
146
 
147
+ var bWithNavigationPath = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
151
148
  var currentEntitySet = converterContext.getEntitySet();
152
149
  var dataModelObjectPath = converterContext.getDataModelObjectPath(); // Consider only the last level of navigation. The others are already considered in the element binding of the page.
153
150
 
154
- var visitedNavigationPaths = dataModelObjectPath.navigationProperties.length > 0 ? [dataModelObjectPath.navigationProperties[dataModelObjectPath.navigationProperties.length - 1].name] : [];
155
- return currentEntitySet ? annotationExpression((currentEntitySet === null || currentEntitySet === void 0 ? void 0 : (_currentEntitySet$ann11 = currentEntitySet.annotations.UI) === null || _currentEntitySet$ann11 === void 0 ? void 0 : _currentEntitySet$ann11[sAnnotationTerm]) || false, visitedNavigationPaths, undefined, function (path) {
156
- return singletonPathVisitor(path, converterContext, visitedNavigationPaths);
151
+ var visitedNavigationPaths = dataModelObjectPath.navigationProperties.length > 0 && bWithNavigationPath ? [dataModelObjectPath.navigationProperties[dataModelObjectPath.navigationProperties.length - 1].name] : [];
152
+ var actionAnnotationValue = (currentEntitySet === null || currentEntitySet === void 0 ? void 0 : (_currentEntitySet$ann11 = currentEntitySet.annotations.UI) === null || _currentEntitySet$ann11 === void 0 ? void 0 : _currentEntitySet$ann11[sAnnotationTerm]) || false;
153
+ return currentEntitySet ? annotationExpression(actionAnnotationValue, visitedNavigationPaths, undefined, function (path) {
154
+ return singletonPathVisitor(path, converterContext.getConvertedTypes(), visitedNavigationPaths);
157
155
  }) : constant(false);
158
156
  }
159
157
  /**
@@ -180,12 +178,20 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
180
178
  }];
181
179
  var result = {};
182
180
  restrictionsDef.forEach(function (def) {
183
- var _defFunction$apply;
184
-
185
181
  var defFunction = def["function"];
186
182
  result[def.key] = {
187
- expression: defFunction.apply(null, [dataModelObjectPath]),
188
- isOnlyCurrentEntityExpression: !!((_defFunction$apply = defFunction.apply(null, [dataModelObjectPath, undefined, true])) !== null && _defFunction$apply !== void 0 && _defFunction$apply.currentEntityRestriction)
183
+ expression: defFunction.apply(null, [dataModelObjectPath, {
184
+ pathVisitor: function (path, navigationPaths) {
185
+ return singletonPathVisitor(path, converterContext.getConvertedTypes(), navigationPaths);
186
+ }
187
+ }]),
188
+ navigationExpression: defFunction.apply(null, [dataModelObjectPath, {
189
+ ignoreTargetCollection: true,
190
+ authorizeUnresolvable: true,
191
+ pathVisitor: function (path, navigationPaths) {
192
+ return singletonPathVisitor(path, converterContext.getConvertedTypes(), navigationPaths);
193
+ }
194
+ }])
189
195
  };
190
196
  });
191
197
  return result;
@@ -203,7 +209,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
203
209
  _exports.getRestrictions = getRestrictions;
204
210
 
205
211
  function getInsertUpdateActionsTemplating(standardActionsContext, isDraftOrSticky, isCreateAlwaysHidden) {
206
- return (isDraftOrSticky || standardActionsContext.isExternalCreateConfigured) && !isCreateAlwaysHidden;
212
+ return (isDraftOrSticky || standardActionsContext.creationMode === CreationMode.External) && !isCreateAlwaysHidden;
207
213
  }
208
214
  /**
209
215
  * Gets the binding expressions for the properties of the action Create.
@@ -243,6 +249,23 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
243
249
  enabled: compileBinding(getDeleteEnablement(converterContext, standardActionsContext, deleteVisibility))
244
250
  };
245
251
  }
252
+ /**
253
+ * @param converterContext
254
+ * @param standardActionsContext
255
+ * @returns StandardActionConfigType
256
+ */
257
+
258
+
259
+ _exports.getStandardActionDelete = getStandardActionDelete;
260
+
261
+ function getCreationRow(converterContext, standardActionsContext) {
262
+ var creationRowVisibility = getCreateVisibility(converterContext, standardActionsContext, true);
263
+ return {
264
+ isTemplated: compileBinding(getCreateTemplating(standardActionsContext, creationRowVisibility, true)),
265
+ visible: compileBinding(creationRowVisibility),
266
+ enabled: compileBinding(getCreationRowEnablement(converterContext, standardActionsContext, creationRowVisibility))
267
+ };
268
+ }
246
269
  /**
247
270
  * Gets the binding expressions for the properties of the action Paste.
248
271
  *
@@ -253,7 +276,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
253
276
  */
254
277
 
255
278
 
256
- _exports.getStandardActionDelete = getStandardActionDelete;
279
+ _exports.getCreationRow = getCreationRow;
257
280
 
258
281
  function getStandardActionPaste(converterContext, standardActionsContext, isInsertUpdateActionsTemplated) {
259
282
  var createVisibility = getCreateVisibility(converterContext, standardActionsContext);
@@ -288,6 +311,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
288
311
  *
289
312
  * @param {StandardActionsContext} standardActionsContext
290
313
  * @param {Expression<boolean>} createVisibility
314
+ * @param {boolean} isForCreationRow
291
315
  * @returns {Expression<boolean> }
292
316
  */
293
317
 
@@ -295,16 +319,13 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
295
319
  _exports.getStandardActionMassEdit = getStandardActionMassEdit;
296
320
 
297
321
  function getCreateTemplating(standardActionsContext, createVisibility) {
298
- var isCreationRow = standardActionsContext.tableManifestConfiguration.creationMode === CreationMode.CreationRow;
299
- var newAction = standardActionsContext.newAction;
300
- var isInsertable = standardActionsContext.restrictions.isInsertable.expression; //Templating of Create Button is not done:
301
- // - If Button is never visible or CreationMode is on CreationRow
302
- // - Otherwise If new action is configured and never available
303
- // - Otherwise If delete restrictions coming from NavigationRestrictions are constantly false
304
- // - Otherwise If there is no external create action
305
- // - Otherwise if there is delete restrictions on the current entitySet set to false
306
-
307
- return ifElse(or(and(isConstant(createVisibility), equal(createVisibility, false)), isCreationRow), false, ifElse(and(isConstant(newAction === null || newAction === void 0 ? void 0 : newAction.available), equal(newAction === null || newAction === void 0 ? void 0 : newAction.available, false)), false, ifElse(and(not(standardActionsContext.restrictions.isInsertable.isOnlyCurrentEntityExpression), isConstant(isInsertable)), isInsertable, ifElse(standardActionsContext.isExternalCreateConfigured, true, not(and(isConstant(isInsertable), equal(isInsertable, constant(false))))))));
322
+ var isForCreationRow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
323
+ //Templating of Create Button is not done:
324
+ // - If Button is never visible(covered the External create button, new Action)
325
+ // - or CreationMode is on CreationRow for Create Button
326
+ // - or CreationMode is not on CreationRow for CreationRow Button
327
+ return and( //XNOR gate
328
+ or(and(isForCreationRow, standardActionsContext.creationMode === CreationMode.CreationRow), and(!isForCreationRow, standardActionsContext.creationMode !== CreationMode.CreationRow)), or(not(isConstant(createVisibility)), createVisibility));
308
329
  }
309
330
  /**
310
331
  * Gets the binding expression for the templating of the non-Create actions.
@@ -317,13 +338,14 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
317
338
  _exports.getCreateTemplating = getCreateTemplating;
318
339
 
319
340
  function getDefaultTemplating(actionVisibility) {
320
- return not(and(isConstant(actionVisibility), equal(actionVisibility, false)));
341
+ return or(not(isConstant(actionVisibility)), actionVisibility);
321
342
  }
322
343
  /**
323
344
  * Gets the binding expression for the property visible of the action Create.
324
345
  *
325
346
  * @param {ConverterContext} converterContext
326
347
  * @param {StandardActionsContext} standardActionsContext
348
+ * @param {boolean} isForCreationRow
327
349
  * @returns {Expression<boolean> }
328
350
  */
329
351
 
@@ -331,8 +353,9 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
331
353
  _exports.getDefaultTemplating = getDefaultTemplating;
332
354
 
333
355
  function getCreateVisibility(converterContext, standardActionsContext) {
356
+ var isForCreationRow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
334
357
  var isInsertable = standardActionsContext.restrictions.isInsertable.expression;
335
- var isCreateHidden = standardActionsContext.hiddenAnnotation.create;
358
+ var isCreateHidden = isForCreationRow ? isActionAnnotatedHidden(converterContext, AnnotationHiddenProperty.CreateHidden, false) : standardActionsContext.hiddenAnnotation.create;
336
359
  var newAction = standardActionsContext.newAction; //Create Button is visible:
337
360
  // - If the creation mode is external
338
361
  // - If we're on the list report and create is not hidden
@@ -344,7 +367,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
344
367
  // - Otherwise
345
368
  // - This depends on the value of the the UI.IsEditable
346
369
 
347
- return ifElse(standardActionsContext.isExternalCreateConfigured, ifElse(converterContext.getTemplateType() === TemplateType.ListReport, not(isCreateHidden), and(not(isCreateHidden), UI.IsEditable)), ifElse(or(and(isConstant(newAction === null || newAction === void 0 ? void 0 : newAction.available), equal(newAction === null || newAction === void 0 ? void 0 : newAction.available, false)), and(isConstant(isInsertable), equal(isInsertable, false), !newAction), and(isConstant(isCreateHidden), equal(isCreateHidden, true)), standardActionsContext.isViewWithMultipleVisualizations, converterContext.getTemplateType() === TemplateType.AnalyticalListPage), false, ifElse(converterContext.getTemplateType() === TemplateType.ListReport, ifElse(isBinding(isCreateHidden), not(isCreateHidden), true), and(not(isCreateHidden), UI.IsEditable))));
370
+ return ifElse(standardActionsContext.creationMode === CreationMode.External, and(not(isCreateHidden), or(converterContext.getTemplateType() === TemplateType.ListReport, UI.IsEditable)), ifElse(or(and(isConstant(newAction === null || newAction === void 0 ? void 0 : newAction.available), equal(newAction === null || newAction === void 0 ? void 0 : newAction.available, false)), and(isConstant(isInsertable), equal(isInsertable, false), !newAction), and(isConstant(isCreateHidden), equal(isCreateHidden, true)), standardActionsContext.isViewWithMultipleVisualizations, converterContext.getTemplateType() === TemplateType.AnalyticalListPage), false, ifElse(converterContext.getTemplateType() === TemplateType.ListReport, or(not(isBinding(isCreateHidden)), not(isCreateHidden)), and(not(isCreateHidden), UI.IsEditable))));
348
371
  }
349
372
  /**
350
373
  * Gets the binding expression for the property visible of the action Delete.
@@ -372,7 +395,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
372
395
  // - If UI.DeleteHidden points to a property path -> provide a negated binding to this path
373
396
  // - Otherwise, delete is visible
374
397
 
375
- return ifElse(or(standardActionsContext.isViewWithMultipleVisualizations, converterContext.getTemplateType() === TemplateType.AnalyticalListPage), false, ifElse(and(isConstant(pathDeletableExpression), equal(pathDeletableExpression, false)), false, ifElse(and(isConstant(isDeleteHidden), equal(isDeleteHidden, constant(true))), false, ifElse(converterContext.getTemplateType() !== TemplateType.ListReport, and(not(isDeleteHidden), equal(bindingExpression("/editMode", "ui"), "Editable")), ifElse(isBinding(isDeleteHidden), not(isDeleteHidden), true)))));
398
+ return ifElse(or(standardActionsContext.isViewWithMultipleVisualizations, converterContext.getTemplateType() === TemplateType.AnalyticalListPage), false, ifElse(and(isConstant(pathDeletableExpression), equal(pathDeletableExpression, false)), false, ifElse(and(isConstant(isDeleteHidden), equal(isDeleteHidden, constant(true))), false, ifElse(converterContext.getTemplateType() !== TemplateType.ListReport, and(not(isDeleteHidden), equal(bindingExpression("/editMode", "ui"), "Editable")), not(and(isBinding(isDeleteHidden), isDeleteHidden))))));
376
399
  }
377
400
  /**
378
401
  * Gets the binding expression for the property visible of the action Paste.
@@ -391,7 +414,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
391
414
  // If Create is visible, enablePaste is not disabled into manifest and we are on OP/blocks outside Fiori elements templates
392
415
  // Then button will be visible according to insertable restrictions and create visibility
393
416
  // Otherwise it's not visible
394
- return ifElse(and(notEqual(standardActionsContext.tableManifestConfiguration.enablePaste, false), createVisibility, isInsertUpdateActionsTemplated), [TemplateType.ListReport, TemplateType.AnalyticalListPage].indexOf(converterContext.getTemplateType()) === -1 && standardActionsContext.restrictions.isInsertable.expression, false);
417
+ return and(notEqual(standardActionsContext.tableManifestConfiguration.enablePaste, false), createVisibility, isInsertUpdateActionsTemplated, [TemplateType.ListReport, TemplateType.AnalyticalListPage].indexOf(converterContext.getTemplateType()) === -1, standardActionsContext.restrictions.isInsertable.expression);
395
418
  }
396
419
  /**
397
420
  * Gets the binding expression for the property visible of the action MassEdit.
@@ -418,7 +441,49 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
418
441
  // Then MassEdit is always visible in LR or dynamically visible in OP according to ui>Editable and hiddenAnnotation
419
442
  // Button is hidden for all other cases
420
443
 
421
- return ifElse(and(not(and(isConstant(pathUpdatableExpression), equal(pathUpdatableExpression, false))), bMassEditEnabledInManifest), and(templateBindingExpression, not(isUpdateHidden)), false);
444
+ return and(not(and(isConstant(pathUpdatableExpression), equal(pathUpdatableExpression, false))), bMassEditEnabledInManifest, templateBindingExpression, not(isUpdateHidden));
445
+ }
446
+ /**
447
+ * Gets the binding expression for the property enabled of the creationRow.
448
+ *
449
+ * @param {ConverterContext} converterContext
450
+ * @param {StandardActionsContext} standardActionsContext
451
+ * @param {Expression<boolean>} creationRowVisibility
452
+ * @returns {Expression<boolean> }
453
+ */
454
+
455
+
456
+ _exports.getMassEditVisibility = getMassEditVisibility;
457
+
458
+ function getCreationRowEnablement(converterContext, standardActionsContext, creationRowVisibility) {
459
+ var restrictionsInsertable = isPathInsertable(converterContext.getDataModelObjectPath(), {
460
+ ignoreTargetCollection: true,
461
+ authorizeUnresolvable: true,
462
+ pathVisitor: function (path, navigationPaths) {
463
+ if (path.indexOf("/") === 0) {
464
+ path = singletonPathVisitor(path, converterContext.getConvertedTypes(), navigationPaths);
465
+ return path;
466
+ }
467
+
468
+ var navigationProperties = converterContext.getDataModelObjectPath().navigationProperties;
469
+
470
+ if (navigationProperties) {
471
+ var partner = navigationProperties[navigationProperties.length - 1].partner;
472
+
473
+ if (partner) {
474
+ path = "".concat(partner, "/").concat(path);
475
+ }
476
+ }
477
+
478
+ return path;
479
+ }
480
+ });
481
+ var isInsertable = restrictionsInsertable._type === "Unresolvable" ? isPathInsertable(converterContext.getDataModelObjectPath(), {
482
+ pathVisitor: function (path) {
483
+ return singletonPathVisitor(path, converterContext.getConvertedTypes(), []);
484
+ }
485
+ }) : restrictionsInsertable;
486
+ return and(creationRowVisibility, isInsertable, or(!standardActionsContext.tableManifestConfiguration.disableAddRowButtonForEmptyData, formatResult([bindingExpression("creationRowFieldValidity", "internal")], tableFormatters.validateCreationRowFields)));
422
487
  }
423
488
  /**
424
489
  * Gets the binding expression for the property enabled of the action Create.
@@ -430,14 +495,14 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
430
495
  */
431
496
 
432
497
 
433
- _exports.getMassEditVisibility = getMassEditVisibility;
498
+ _exports.getCreationRowEnablement = getCreationRowEnablement;
434
499
 
435
500
  function getCreateEnablement(converterContext, standardActionsContext, createVisibility) {
436
501
  var _converterContext$res;
437
502
 
438
503
  var isInsertable = standardActionsContext.restrictions.isInsertable.expression;
439
504
  var CollectionType = (_converterContext$res = converterContext.resolveAbsolutePath(standardActionsContext.collectionPath).target) === null || _converterContext$res === void 0 ? void 0 : _converterContext$res._type;
440
- return and(createVisibility, ifElse(CollectionType === "EntitySet", true, ifElse(converterContext.getTemplateType() !== TemplateType.ObjectPage, isInsertable, and(isInsertable, equal(bindingExpression("/editMode", "ui"), "Editable")))));
505
+ return and(createVisibility, or(CollectionType === "EntitySet", and(isInsertable, or(converterContext.getTemplateType() !== TemplateType.ObjectPage, equal(bindingExpression("/editMode", "ui"), "Editable")))));
441
506
  }
442
507
  /**
443
508
  * Gets the binding expression for the property enabled of the action Delete.
@@ -453,11 +518,11 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
453
518
 
454
519
  function getDeleteEnablement(converterContext, standardActionsContext, deleteVisibility) {
455
520
  var isDeletable = standardActionsContext.restrictions.isDeletable.expression;
456
- var isOnlyDynamicOnCurrentEntity = standardActionsContext.restrictions.isDeletable.isOnlyCurrentEntityExpression && !isConstant(isDeletable);
521
+ var isOnlyDynamicOnCurrentEntity = !isConstant(isDeletable) && standardActionsContext.restrictions.isDeletable.navigationExpression._type === "Unresolvable";
457
522
  var numberOfSelectedContexts = bindingExpression("numberOfSelectedContexts", "internal");
458
523
  var numberOfDeletableContexts = bindingExpression("deletableContexts", "internal");
459
524
  var numberOfUnSavedContexts = bindingExpression("unSavedContexts", "internal");
460
- return and(deleteVisibility, ifElse(or(converterContext.getTemplateType() !== TemplateType.ObjectPage, isOnlyDynamicOnCurrentEntity), ifElse(or(and(notEqual(numberOfDeletableContexts, undefined), greaterThan(length(numberOfDeletableContexts), 0)), and(notEqual(numberOfUnSavedContexts, undefined), greaterThan(length(numberOfUnSavedContexts), 0))), bindingExpression("deleteEnabled", "internal"), false), and(notEqual(numberOfSelectedContexts, 0), isDeletable)));
525
+ return and(deleteVisibility, ifElse(or(converterContext.getTemplateType() !== TemplateType.ObjectPage, isOnlyDynamicOnCurrentEntity), and(or(and(notEqual(numberOfDeletableContexts, undefined), greaterThan(length(numberOfDeletableContexts), 0)), and(notEqual(numberOfUnSavedContexts, undefined), greaterThan(length(numberOfUnSavedContexts), 0))), bindingExpression("deleteEnabled", "internal")), and(notEqual(numberOfSelectedContexts, 0), isDeletable)));
461
526
  }
462
527
  /**
463
528
  * Gets the binding expression for the property enabled of the action Paste.
@@ -487,7 +552,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
487
552
 
488
553
  function getMassEditEnablement(converterContext, standardActionsContext, massEditVisibility) {
489
554
  var pathUpdatableExpression = standardActionsContext.restrictions.isUpdatable.expression;
490
- var isOnlyDynamicOnCurrentEntity = standardActionsContext.restrictions.isUpdatable.isOnlyCurrentEntityExpression && !isConstant(pathUpdatableExpression);
555
+ var isOnlyDynamicOnCurrentEntity = !isConstant(pathUpdatableExpression) && standardActionsContext.restrictions.isUpdatable.navigationExpression._type === "Unresolvable";
491
556
  var numberOfSelectedContexts = greaterOrEqual(bindingExpression("numberOfSelectedContexts", "internal"), 1);
492
557
  var numberOfUpdatableContexts = greaterOrEqual(length(bindingExpression("updatableContexts", "internal")), 1);
493
558
  var bIsDraftSupported = isDraftSupported(converterContext);
@@ -524,4 +589,4 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettin
524
589
  _exports.isInDisplayMode = isInDisplayMode;
525
590
  return _exports;
526
591
  }, false);
527
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlN0YW5kYXJkQWN0aW9ucy50cyJdLCJuYW1lcyI6WyJnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQiLCJjb252ZXJ0ZXJDb250ZXh0IiwibmF2aWdhdGlvblNldHRpbmdzIiwidGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24iLCJ2aWV3Q29uZmlndXJhdGlvbiIsImNvbGxlY3Rpb25QYXRoIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJoaWRkZW5Bbm5vdGF0aW9uIiwiY3JlYXRlIiwiaXNBY3Rpb25Bbm5vdGF0ZWRIaWRkZW4iLCJ1cGRhdGUiLCJpc0V4dGVybmFsQ3JlYXRlQ29uZmlndXJlZCIsImlzRHJhZnRPclN0aWNreVN1cHBvcnRlZCIsImlzVmlld1dpdGhNdWx0aXBsZVZpc3VhbGl6YXRpb25zIiwiZ2V0TWFuaWZlc3RXcmFwcGVyIiwiaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucyIsIm5ld0FjdGlvbiIsImdldE5ld0FjdGlvbiIsInJlc3RyaWN0aW9ucyIsImdldFJlc3RyaWN0aW9ucyIsIm5hdmlnYXRpb24iLCJvdXRib3VuZCIsIm91dGJvdW5kRGV0YWlsIiwidW5kZWZpbmVkIiwiaXNEcmFmdFN1cHBvcnRlZCIsImN1cnJlbnRFbnRpdHlTZXQiLCJnZXRFbnRpdHlTZXQiLCJiSXNEcmFmdFJvb3QiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIkRyYWZ0Um9vdCIsImJJc0RyYWZ0Tm9kZSIsIkRyYWZ0Tm9kZSIsImJJc0RyYWZ0UGFyZW50RW50aXR5Rm9yQ29udGFpbm1lbnQiLCJ0YXJnZXRPYmplY3QiLCJjb250YWluc1RhcmdldCIsInN0YXJ0aW5nRW50aXR5U2V0IiwiYklzRHJhZnRTdXBwb3J0ZWQiLCJiSXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJuZXdBY3Rpb25OYW1lIiwiTmV3QWN0aW9uIiwidG9TdHJpbmciLCJhdmFpbGFibGVQcm9wZXJ0eSIsImdldEVudGl0eVR5cGUiLCJhY3Rpb25zIiwiQ29yZSIsIk9wZXJhdGlvbkF2YWlsYWJsZSIsIm5hbWUiLCJhdmFpbGFibGUiLCJhbm5vdGF0aW9uRXhwcmVzc2lvbiIsInNBbm5vdGF0aW9uVGVybSIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJ2aXNpdGVkTmF2aWdhdGlvblBhdGhzIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJsZW5ndGgiLCJVSSIsInBhdGgiLCJzaW5nbGV0b25QYXRoVmlzaXRvciIsImNvbnN0YW50IiwicmVzdHJpY3Rpb25zRGVmIiwia2V5IiwiaXNQYXRoSW5zZXJ0YWJsZSIsImlzUGF0aFVwZGF0YWJsZSIsImlzUGF0aERlbGV0YWJsZSIsInJlc3VsdCIsImZvckVhY2giLCJkZWYiLCJkZWZGdW5jdGlvbiIsImV4cHJlc3Npb24iLCJhcHBseSIsImlzT25seUN1cnJlbnRFbnRpdHlFeHByZXNzaW9uIiwiY3VycmVudEVudGl0eVJlc3RyaWN0aW9uIiwiZ2V0SW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRpbmciLCJzdGFuZGFyZEFjdGlvbnNDb250ZXh0IiwiaXNEcmFmdE9yU3RpY2t5IiwiaXNDcmVhdGVBbHdheXNIaWRkZW4iLCJnZXRTdGFuZGFyZEFjdGlvbkNyZWF0ZSIsImNyZWF0ZVZpc2liaWxpdHkiLCJnZXRDcmVhdGVWaXNpYmlsaXR5IiwiaXNUZW1wbGF0ZWQiLCJjb21waWxlQmluZGluZyIsImdldENyZWF0ZVRlbXBsYXRpbmciLCJ2aXNpYmxlIiwiZW5hYmxlZCIsImdldENyZWF0ZUVuYWJsZW1lbnQiLCJnZXRTdGFuZGFyZEFjdGlvbkRlbGV0ZSIsImRlbGV0ZVZpc2liaWxpdHkiLCJnZXREZWxldGVWaXNpYmlsaXR5IiwiZ2V0RGVmYXVsdFRlbXBsYXRpbmciLCJnZXREZWxldGVFbmFibGVtZW50IiwiZ2V0U3RhbmRhcmRBY3Rpb25QYXN0ZSIsImlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZCIsImNyZWF0ZUVuYWJsZW1lbnQiLCJwYXN0ZVZpc2liaWxpdHkiLCJnZXRQYXN0ZVZpc2liaWxpdHkiLCJnZXRQYXN0ZUVuYWJsZW1lbnQiLCJnZXRTdGFuZGFyZEFjdGlvbk1hc3NFZGl0IiwibWFzc0VkaXRWaXNpYmlsaXR5IiwiZ2V0TWFzc0VkaXRWaXNpYmlsaXR5IiwiZ2V0TWFzc0VkaXRFbmFibGVtZW50IiwiaXNDcmVhdGlvblJvdyIsImNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uUm93IiwiaXNJbnNlcnRhYmxlIiwiaWZFbHNlIiwib3IiLCJhbmQiLCJpc0NvbnN0YW50IiwiZXF1YWwiLCJub3QiLCJhY3Rpb25WaXNpYmlsaXR5IiwiaXNDcmVhdGVIaWRkZW4iLCJnZXRUZW1wbGF0ZVR5cGUiLCJUZW1wbGF0ZVR5cGUiLCJMaXN0UmVwb3J0IiwiSXNFZGl0YWJsZSIsIkFuYWx5dGljYWxMaXN0UGFnZSIsImlzQmluZGluZyIsImlzRGVsZXRlSGlkZGVuIiwiZGVsZXRlIiwicGF0aERlbGV0YWJsZUV4cHJlc3Npb24iLCJpc0RlbGV0YWJsZSIsImJpbmRpbmdFeHByZXNzaW9uIiwibm90RXF1YWwiLCJlbmFibGVQYXN0ZSIsImluZGV4T2YiLCJpc1VwZGF0ZUhpZGRlbiIsInBhdGhVcGRhdGFibGVFeHByZXNzaW9uIiwiaXNVcGRhdGFibGUiLCJiTWFzc0VkaXRFbmFibGVkSW5NYW5pZmVzdCIsImVuYWJsZU1hc3NFZGl0IiwidGVtcGxhdGVCaW5kaW5nRXhwcmVzc2lvbiIsIk9iamVjdFBhZ2UiLCJDb2xsZWN0aW9uVHlwZSIsInJlc29sdmVBYnNvbHV0ZVBhdGgiLCJ0YXJnZXQiLCJfdHlwZSIsImlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJudW1iZXJPZkRlbGV0YWJsZUNvbnRleHRzIiwibnVtYmVyT2ZVblNhdmVkQ29udGV4dHMiLCJncmVhdGVyVGhhbiIsImdyZWF0ZXJPckVxdWFsIiwibnVtYmVyT2ZVcGRhdGFibGVDb250ZXh0cyIsImJEaXNwbGF5TW9kZSIsImlzSW5EaXNwbGF5TW9kZSIsInJ1bnRpbWVCaW5kaW5nIiwidGVtcGxhdGVUeXBlIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFTyxXQUFTQSw4QkFBVCxDQUNOQyxnQkFETSxFQUVOQyxrQkFGTSxFQUdOQywwQkFITSxFQUlOQyxpQkFKTSxFQUttQjtBQUN6QixXQUFPO0FBQ05DLE1BQUFBLGNBQWMsRUFBRUMsbUJBQW1CLENBQUNMLGdCQUFnQixDQUFDTSxzQkFBakIsRUFBRCxDQUQ3QjtBQUVOQyxNQUFBQSxnQkFBZ0IsRUFBRTtBQUNqQkMsUUFBQUEsTUFBTSxFQUFFQyx1QkFBdUIsQ0FBQ1QsZ0JBQUQsRUFBbUIsY0FBbkIsQ0FEZDtBQUVqQixrQkFBVVMsdUJBQXVCLENBQUNULGdCQUFELEVBQW1CLGNBQW5CLENBRmhCO0FBR2pCVSxRQUFBQSxNQUFNLEVBQUVELHVCQUF1QixDQUFDVCxnQkFBRCxFQUFtQixjQUFuQjtBQUhkLE9BRlo7QUFPTlcsTUFBQUEsMEJBQTBCLEVBQUVBLDBCQUEwQixDQUFDVixrQkFBRCxDQVBoRDtBQVFOVyxNQUFBQSx3QkFBd0IsRUFBRUEsd0JBQXdCLENBQUNaLGdCQUFELENBUjVDO0FBU05hLE1BQUFBLGdDQUFnQyxFQUFFVixpQkFBaUIsR0FDaERILGdCQUFnQixDQUFDYyxrQkFBakIsR0FBc0NDLHlCQUF0QyxDQUFnRVosaUJBQWhFLENBRGdELEdBRWhELEtBWEc7QUFZTmEsTUFBQUEsU0FBUyxFQUFFQyxZQUFZLENBQUNqQixnQkFBRCxDQVpqQjtBQWFORSxNQUFBQSwwQkFBMEIsRUFBRUEsMEJBYnRCO0FBY05nQixNQUFBQSxZQUFZLEVBQUVDLGVBQWUsQ0FBQ25CLGdCQUFEO0FBZHZCLEtBQVA7QUFnQkE7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FB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QVksR0FBR3RKLGdCQUFnQixDQUFDbUgsZUFBakIsRUFBckI7O0FBQ0EsUUFDQ21DLFlBQVksS0FBS2xDLFlBQVksQ0FBQ0MsVUFBOUIsSUFDQWlDLFlBQVksS0FBS2xDLFlBQVksQ0FBQ0csa0JBRDlCLElBRUNwSCxpQkFBaUIsSUFBSUgsZ0JBQWdCLENBQUNjLGtCQUFqQixHQUFzQ0MseUJBQXRDLENBQWdFWixpQkFBaEUsQ0FIdkIsRUFJRTtBQUNELGFBQU8sSUFBUDtBQUNBLEtBUnNILENBU3ZIOzs7QUFDQSxXQUFPLEtBQVA7QUFDQSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvbnZlcnRlckNvbnRleHQgZnJvbSBcIi4uLy4uLy4uL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB7XG5cdGFuZCxcblx0YW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdGJpbmRpbmdFeHByZXNzaW9uLFxuXHRCaW5kaW5nRXhwcmVzc2lvbixcblx0Y29tcGlsZUJpbmRpbmcsXG5cdGNvbnN0YW50LFxuXHRlcXVhbCxcblx0bGVuZ3RoLFxuXHRFeHByZXNzaW9uLFxuXHRncmVhdGVyT3JFcXVhbCxcblx0aWZFbHNlLFxuXHRpc0JpbmRpbmcsXG5cdGlzQ29uc3RhbnQsXG5cdG5vdCxcblx0bm90RXF1YWwsXG5cdG9yLFxuXHRncmVhdGVyVGhhblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgQ3JlYXRpb25Nb2RlLCBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uLCBUZW1wbGF0ZVR5cGUsIFZpZXdQYXRoQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBzaW5nbGV0b25QYXRoVmlzaXRvciwgVUkgfSBmcm9tIFwiLi4vLi4vLi4vaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgeyBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHsgZ2V0VGFyZ2V0T2JqZWN0UGF0aCwgaXNQYXRoRGVsZXRhYmxlLCBpc1BhdGhJbnNlcnRhYmxlLCBpc1BhdGhVcGRhdGFibGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4uL1RhYmxlXCI7XG5cbmV4cG9ydCB0eXBlIFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZSA9IHtcblx0aXNUZW1wbGF0ZWQ/OiBCaW5kaW5nRXhwcmVzc2lvbjxib29sZWFuPjtcblx0dmlzaWJsZTogQmluZGluZ0V4cHJlc3Npb248Ym9vbGVhbj47XG5cdGVuYWJsZWQ6IEJpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+O1xufTtcblxudHlwZSBFeHByZXNzaW9uUmVzdHJpY3Rpb25zVHlwZSA9IHtcblx0ZXhwcmVzc2lvbjogRXhwcmVzc2lvbjxib29sZWFuPjtcblx0aXNPbmx5Q3VycmVudEVudGl0eUV4cHJlc3Npb246IGJvb2xlYW47XG59O1xudHlwZSBTdGFuZGFyZEFjdGlvbnNSZXN0cmljdGlvbnNUeXBlID0gUmVjb3JkPHN0cmluZywgRXhwcmVzc2lvblJlc3RyaWN0aW9uc1R5cGU+O1xuXG5leHBvcnQgdHlwZSBTdGFuZGFyZEFjdGlvbnNDb250ZXh0ID0ge1xuXHRjb2xsZWN0aW9uUGF0aDogc3RyaW5nO1xuXHRoaWRkZW5Bbm5vdGF0aW9uOiB7XG5cdFx0Y3JlYXRlOiBFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHRcdFwiZGVsZXRlXCI6IEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdFx0dXBkYXRlOiBFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHR9O1xuXHRpc0V4dGVybmFsQ3JlYXRlQ29uZmlndXJlZDogYm9vbGVhbjtcblx0aXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkOiBib29sZWFuO1xuXHRpc1ZpZXdXaXRoTXVsdGlwbGVWaXN1YWxpemF0aW9uczogYm9vbGVhbjtcblx0bmV3QWN0aW9uPzoge1xuXHRcdG5hbWU/OiBzdHJpbmc7XG5cdFx0YXZhaWxhYmxlPzogRXhwcmVzc2lvbjxib29sZWFuPjtcblx0fTtcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb247XG5cdHJlc3RyaWN0aW9uczogU3RhbmRhcmRBY3Rpb25zUmVzdHJpY3Rpb25zVHlwZTtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBjb250ZXh0IGZvciB0aGUgc3RhbmRhcmQgYWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7TmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbn0gbmF2aWdhdGlvblNldHRpbmdzXG4gKiBAcGFyYW0ge1RhYmxlQ29udHJvbENvbmZpZ3VyYXRpb259IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uXG4gKiBAcGFyYW0ge1ZpZXdQYXRoQ29uZmlndXJhdGlvbn0gdmlld0NvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zICBUaGUgY29udGV4dCBmb3IgdGFibGUgYWN0aW9uc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdHZpZXdDb25maWd1cmF0aW9uPzogVmlld1BhdGhDb25maWd1cmF0aW9uXG4pOiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0IHtcblx0cmV0dXJuIHtcblx0XHRjb2xsZWN0aW9uUGF0aDogZ2V0VGFyZ2V0T2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSksXG5cdFx0aGlkZGVuQW5ub3RhdGlvbjoge1xuXHRcdFx0Y3JlYXRlOiBpc0FjdGlvbkFubm90YXRlZEhpZGRlbihjb252ZXJ0ZXJDb250ZXh0LCBcIkNyZWF0ZUhpZGRlblwiKSxcblx0XHRcdFwiZGVsZXRlXCI6IGlzQWN0aW9uQW5ub3RhdGVkSGlkZGVuKGNvbnZlcnRlckNvbnRleHQsIFwiRGVsZXRlSGlkZGVuXCIpLFxuXHRcdFx0dXBkYXRlOiBpc0FjdGlvbkFubm90YXRlZEhpZGRlbihjb252ZXJ0ZXJDb250ZXh0LCBcIlVwZGF0ZUhpZGRlblwiKVxuXHRcdH0sXG5cdFx0aXNFeHRlcm5hbENyZWF0ZUNvbmZpZ3VyZWQ6IGlzRXh0ZXJuYWxDcmVhdGVDb25maWd1cmVkKG5hdmlnYXRpb25TZXR0aW5ncyksXG5cdFx0aXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkOiBpc0RyYWZ0T3JTdGlja3lTdXBwb3J0ZWQoY29udmVydGVyQ29udGV4dCksXG5cdFx0aXNWaWV3V2l0aE11bHRpcGxlVmlzdWFsaXphdGlvbnM6IHZpZXdDb25maWd1cmF0aW9uXG5cdFx0XHQ/IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucyh2aWV3Q29uZmlndXJhdGlvbilcblx0XHRcdDogZmFsc2UsXG5cdFx0bmV3QWN0aW9uOiBnZXROZXdBY3Rpb24oY29udmVydGVyQ29udGV4dCksXG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLFxuXHRcdHJlc3RyaWN0aW9uczogZ2V0UmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQpXG5cdH07XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGV4dGVybmFsIGNyZWF0ZWQgaXMgY29uZmlndXJlZCBmb3IgdGhlIG5hdmlnYXRpb24uXG4gKlxuICogQHBhcmFtIHtOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9ufSBuYXZpZ2F0aW9uU2V0dGluZ3NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFeHRlcm5hbENyZWF0ZUNvbmZpZ3VyZWQobmF2aWdhdGlvblNldHRpbmdzOiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uKTogYm9vbGVhbiB7XG5cdGNvbnN0IG5hdmlnYXRpb24gPSBuYXZpZ2F0aW9uU2V0dGluZ3M/LmNyZWF0ZTtcblx0cmV0dXJuIChuYXZpZ2F0aW9uICYmIG5hdmlnYXRpb24ub3V0Ym91bmQgJiYgbmF2aWdhdGlvbi5vdXRib3VuZERldGFpbCkgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgZHJhZnQgaXMgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RyYWZ0U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBib29sZWFuIHtcblx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IGJJc0RyYWZ0Um9vdCA9IGN1cnJlbnRFbnRpdHlTZXQgJiYgY3VycmVudEVudGl0eVNldC5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3QgPyB0cnVlIDogZmFsc2U7XG5cdGNvbnN0IGJJc0RyYWZ0Tm9kZSA9IGN1cnJlbnRFbnRpdHlTZXQgJiYgY3VycmVudEVudGl0eVNldC5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdE5vZGUgPyB0cnVlIDogZmFsc2U7XG5cdGNvbnN0IGJJc0RyYWZ0UGFyZW50RW50aXR5Rm9yQ29udGFpbm1lbnQgPVxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldE9iamVjdD8uY29udGFpbnNUYXJnZXQgJiZcblx0XHQoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkuc3RhcnRpbmdFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdCB8fFxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkuc3RhcnRpbmdFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Tm9kZSlcblx0XHRcdD8gdHJ1ZVxuXHRcdFx0OiBmYWxzZTtcblxuXHRyZXR1cm4gYklzRHJhZnRSb290IHx8IGJJc0RyYWZ0Tm9kZSB8fCAoIWNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkgJiYgYklzRHJhZnRQYXJlbnRFbnRpdHlGb3JDb250YWlubWVudCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHN0aWNreSBvciBkcmFmdCBpcyBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogYm9vbGVhbiB7XG5cdGNvbnN0IGJJc0RyYWZ0U3VwcG9ydGVkID0gaXNEcmFmdFN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgYklzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnN0YXJ0aW5nRW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uU2Vzc2lvblxuXHRcdD8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHRcdD8gdHJ1ZVxuXHRcdDogZmFsc2U7XG5cblx0cmV0dXJuIGJJc0RyYWZ0U3VwcG9ydGVkIHx8IGJJc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29uZmlndXJlZCBuZXdBY3Rpb24gaW50byBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMge2FueX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5ld0FjdGlvbihjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogYW55IHtcblx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IG5ld0FjdGlvbk5hbWU6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4gPSAoXG5cdFx0Y3VycmVudEVudGl0eVNldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnRSb290Py5OZXdBY3Rpb24gfHxcblx0XHRjdXJyZW50RW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZD8uTmV3QWN0aW9uXG5cdCk/LnRvU3RyaW5nKCk7XG5cdGlmIChuZXdBY3Rpb25OYW1lKSB7XG5cdFx0bGV0IGF2YWlsYWJsZVByb3BlcnR5OiBhbnkgPSBjb252ZXJ0ZXJDb250ZXh0Py5nZXRFbnRpdHlUeXBlKCkuYWN0aW9uc1tuZXdBY3Rpb25OYW1lXT8uYW5ub3RhdGlvbnM/LkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZTtcblx0XHRhdmFpbGFibGVQcm9wZXJ0eSA9IGF2YWlsYWJsZVByb3BlcnR5ICE9PSB1bmRlZmluZWQgPyBhdmFpbGFibGVQcm9wZXJ0eSA6IHRydWU7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG5hbWU6IG5ld0FjdGlvbk5hbWUsXG5cdFx0XHRhdmFpbGFibGU6IGFubm90YXRpb25FeHByZXNzaW9uKGF2YWlsYWJsZVByb3BlcnR5KVxuXHRcdH07XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBhY3Rpb24gdmlzaWJpbGl0eSBjb25maWd1cmVkIGludG8gYW5ub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBzQW5ub3RhdGlvblRlcm1cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBY3Rpb25Bbm5vdGF0ZWRIaWRkZW4oY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgc0Fubm90YXRpb25UZXJtOiBzdHJpbmcpOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0Ly8gQ29uc2lkZXIgb25seSB0aGUgbGFzdCBsZXZlbCBvZiBuYXZpZ2F0aW9uLiBUaGUgb3RoZXJzIGFyZSBhbHJlYWR5IGNvbnNpZGVyZWQgaW4gdGhlIGVsZW1lbnQgYmluZGluZyBvZiB0aGUgcGFnZS5cblx0Y29uc3QgdmlzaXRlZE5hdmlnYXRpb25QYXRocyA9XG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggPiAwXG5cdFx0XHQ/IFtkYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzW2RhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMubGVuZ3RoIC0gMV0ubmFtZV1cblx0XHRcdDogW107XG5cdHJldHVybiBjdXJyZW50RW50aXR5U2V0XG5cdFx0PyBhbm5vdGF0aW9uRXhwcmVzc2lvbihcblx0XHRcdFx0KChjdXJyZW50RW50aXR5U2V0Py5hbm5vdGF0aW9ucy5VSSBhcyBhbnkpPy5bc0Fubm90YXRpb25UZXJtXSBhcyBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZTxib29sZWFuPikgfHwgZmFsc2UsXG5cdFx0XHRcdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsXG5cdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0KHBhdGg6IHN0cmluZykgPT4gc2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dCwgdmlzaXRlZE5hdmlnYXRpb25QYXRocylcblx0XHQgIClcblx0XHQ6IGNvbnN0YW50KGZhbHNlKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBhbm5vdGF0ZWQgcmVzdHJpY3Rpb25zIGZvciB0aGUgYWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIHtTdGFuZGFyZEFjdGlvbnNSZXN0cmljdGlvbnNUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBTdGFuZGFyZEFjdGlvbnNSZXN0cmljdGlvbnNUeXBlIHtcblx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRjb25zdCByZXN0cmljdGlvbnNEZWYgPSBbXG5cdFx0e1xuXHRcdFx0a2V5OiBcImlzSW5zZXJ0YWJsZVwiLFxuXHRcdFx0XCJmdW5jdGlvblwiOiBpc1BhdGhJbnNlcnRhYmxlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRrZXk6IFwiaXNVcGRhdGFibGVcIixcblx0XHRcdFwiZnVuY3Rpb25cIjogaXNQYXRoVXBkYXRhYmxlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRrZXk6IFwiaXNEZWxldGFibGVcIixcblx0XHRcdFwiZnVuY3Rpb25cIjogaXNQYXRoRGVsZXRhYmxlXG5cdFx0fVxuXHRdO1xuXHRjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIEV4cHJlc3Npb25SZXN0cmljdGlvbnNUeXBlPiA9IHt9O1xuXHRyZXN0cmljdGlvbnNEZWYuZm9yRWFjaChmdW5jdGlvbihkZWYpIHtcblx0XHRjb25zdCBkZWZGdW5jdGlvbiA9IGRlZltcImZ1bmN0aW9uXCJdO1xuXHRcdHJlc3VsdFtkZWYua2V5XSA9IHtcblx0XHRcdGV4cHJlc3Npb246IGRlZkZ1bmN0aW9uLmFwcGx5KG51bGwsIFtkYXRhTW9kZWxPYmplY3RQYXRoXSksXG5cdFx0XHRpc09ubHlDdXJyZW50RW50aXR5RXhwcmVzc2lvbjogISEoZGVmRnVuY3Rpb24uYXBwbHkobnVsbCwgW2RhdGFNb2RlbE9iamVjdFBhdGgsIHVuZGVmaW5lZCwgdHJ1ZV0pIGFzIGFueSlcblx0XHRcdFx0Py5jdXJyZW50RW50aXR5UmVzdHJpY3Rpb25cblx0XHR9O1xuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGVtcGxhdGluZyBmb3IgaW5zZXJ0L3VwZGF0ZSBhY3Rpb25zIGlzIG1hbmRhdG9yeS5cbiAqXG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNEcmFmdE9yU3RpY2t5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzQ3JlYXRlQWx3YXlzSGlkZGVuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0aW5nKFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRpc0RyYWZ0T3JTdGlja3k6IGJvb2xlYW4sXG5cdGlzQ3JlYXRlQWx3YXlzSGlkZGVuOiBib29sZWFuXG4pOiBib29sZWFuIHtcblx0cmV0dXJuIChpc0RyYWZ0T3JTdGlja3kgfHwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5pc0V4dGVybmFsQ3JlYXRlQ29uZmlndXJlZCkgJiYgIWlzQ3JlYXRlQWx3YXlzSGlkZGVuO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhY3Rpb24gQ3JlYXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcmV0dXJucyB7U3RhbmRhcmRBY3Rpb25Db25maWdUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25DcmVhdGUoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZSB7XG5cdGNvbnN0IGNyZWF0ZVZpc2liaWxpdHkgPSBnZXRDcmVhdGVWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXHRyZXR1cm4ge1xuXHRcdGlzVGVtcGxhdGVkOiBjb21waWxlQmluZGluZyhnZXRDcmVhdGVUZW1wbGF0aW5nKHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGNyZWF0ZVZpc2liaWxpdHkpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhjcmVhdGVWaXNpYmlsaXR5KSxcblx0XHRlbmFibGVkOiBjb21waWxlQmluZGluZyhnZXRDcmVhdGVFbmFibGVtZW50KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGNyZWF0ZVZpc2liaWxpdHkpKVxuXHR9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhY3Rpb24gRGVsZXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcmV0dXJucyB7U3RhbmRhcmRBY3Rpb25Db25maWdUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25EZWxldGUoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZSB7XG5cdGNvbnN0IGRlbGV0ZVZpc2liaWxpdHkgPSBnZXREZWxldGVWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXG5cdHJldHVybiB7XG5cdFx0aXNUZW1wbGF0ZWQ6IGNvbXBpbGVCaW5kaW5nKGdldERlZmF1bHRUZW1wbGF0aW5nKGRlbGV0ZVZpc2liaWxpdHkpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhkZWxldGVWaXNpYmlsaXR5KSxcblx0XHRlbmFibGVkOiBjb21waWxlQmluZGluZyhnZXREZWxldGVFbmFibGVtZW50KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGRlbGV0ZVZpc2liaWxpdHkpKVxuXHR9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhY3Rpb24gUGFzdGUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkXG4gKiBAcmV0dXJucyB7U3RhbmRhcmRBY3Rpb25Db25maWdUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25QYXN0ZShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0aXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkOiBib29sZWFuXG4pOiBTdGFuZGFyZEFjdGlvbkNvbmZpZ1R5cGUge1xuXHRjb25zdCBjcmVhdGVWaXNpYmlsaXR5ID0gZ2V0Q3JlYXRlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0Y29uc3QgY3JlYXRlRW5hYmxlbWVudCA9IGdldENyZWF0ZUVuYWJsZW1lbnQoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgY3JlYXRlVmlzaWJpbGl0eSk7XG5cdGNvbnN0IHBhc3RlVmlzaWJpbGl0eSA9IGdldFBhc3RlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBjcmVhdGVWaXNpYmlsaXR5LCBpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWQpO1xuXHRyZXR1cm4ge1xuXHRcdHZpc2libGU6IGNvbXBpbGVCaW5kaW5nKHBhc3RlVmlzaWJpbGl0eSksXG5cdFx0ZW5hYmxlZDogY29tcGlsZUJpbmRpbmcoZ2V0UGFzdGVFbmFibGVtZW50KHBhc3RlVmlzaWJpbGl0eSwgY3JlYXRlRW5hYmxlbWVudCkpXG5cdH07XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9ucyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGFjdGlvbiBNYXNzRWRpdC5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7U3RhbmRhcmRBY3Rpb25zQ29udGV4dH0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHJldHVybnMge1N0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZSB7XG5cdGNvbnN0IG1hc3NFZGl0VmlzaWJpbGl0eSA9IGdldE1hc3NFZGl0VmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblxuXHRyZXR1cm4ge1xuXHRcdGlzVGVtcGxhdGVkOiBjb21waWxlQmluZGluZyhnZXREZWZhdWx0VGVtcGxhdGluZyhtYXNzRWRpdFZpc2liaWxpdHkpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhtYXNzRWRpdFZpc2liaWxpdHkpLFxuXHRcdGVuYWJsZWQ6IGNvbXBpbGVCaW5kaW5nKGdldE1hc3NFZGl0RW5hYmxlbWVudChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBtYXNzRWRpdFZpc2liaWxpdHkpKVxuXHR9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHRlbXBsYXRpbmcgb2YgdGhlIGFjdGlvbiBDcmVhdGUuXG4gKlxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGNyZWF0ZVZpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENyZWF0ZVRlbXBsYXRpbmcoXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGNyZWF0ZVZpc2liaWxpdHk6IEV4cHJlc3Npb248Ym9vbGVhbj5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0NyZWF0aW9uUm93ID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC50YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdztcblx0Y29uc3QgbmV3QWN0aW9uID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5uZXdBY3Rpb247XG5cdGNvbnN0IGlzSW5zZXJ0YWJsZSA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzSW5zZXJ0YWJsZS5leHByZXNzaW9uO1xuXG5cdC8vVGVtcGxhdGluZyBvZiBDcmVhdGUgQnV0dG9uIGlzIG5vdCBkb25lOlxuXHQvLyBcdCAtIElmIEJ1dHRvbiBpcyBuZXZlciB2aXNpYmxlIG9yIENyZWF0aW9uTW9kZSBpcyBvbiBDcmVhdGlvblJvd1xuXHQvLyAgIC0gT3RoZXJ3aXNlIElmIG5ldyBhY3Rpb24gaXMgY29uZmlndXJlZCBhbmQgbmV2ZXIgYXZhaWxhYmxlXG5cdC8vXHQgLSBPdGhlcndpc2UgSWYgZGVsZXRlIHJlc3RyaWN0aW9ucyBjb21pbmcgZnJvbSBOYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIGFyZSBjb25zdGFudGx5IGZhbHNlXG5cdC8vICAgLSBPdGhlcndpc2UgSWYgdGhlcmUgaXMgbm8gZXh0ZXJuYWwgY3JlYXRlIGFjdGlvblxuXHQvL1x0IC0gT3RoZXJ3aXNlIGlmIHRoZXJlIGlzIGRlbGV0ZSByZXN0cmljdGlvbnMgb24gdGhlIGN1cnJlbnQgZW50aXR5U2V0IHNldCB0byBmYWxzZVxuXG5cdHJldHVybiBpZkVsc2UoXG5cdFx0b3IoYW5kKGlzQ29uc3RhbnQoY3JlYXRlVmlzaWJpbGl0eSksIGVxdWFsKGNyZWF0ZVZpc2liaWxpdHksIGZhbHNlKSksIGlzQ3JlYXRpb25Sb3cpLFxuXHRcdGZhbHNlLFxuXHRcdGlmRWxzZShcblx0XHRcdGFuZChpc0NvbnN0YW50KG5ld0FjdGlvbj8uYXZhaWxhYmxlKSwgZXF1YWwobmV3QWN0aW9uPy5hdmFpbGFibGUsIGZhbHNlKSksXG5cdFx0XHRmYWxzZSxcblx0XHRcdGlmRWxzZShcblx0XHRcdFx0YW5kKG5vdChzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc0luc2VydGFibGUuaXNPbmx5Q3VycmVudEVudGl0eUV4cHJlc3Npb24pLCBpc0NvbnN0YW50KGlzSW5zZXJ0YWJsZSkpLFxuXHRcdFx0XHRpc0luc2VydGFibGUsXG5cdFx0XHRcdGlmRWxzZShcblx0XHRcdFx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmlzRXh0ZXJuYWxDcmVhdGVDb25maWd1cmVkLFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0bm90KGFuZChpc0NvbnN0YW50KGlzSW5zZXJ0YWJsZSksIGVxdWFsKGlzSW5zZXJ0YWJsZSwgY29uc3RhbnQoZmFsc2UpKSkpXG5cdFx0XHRcdClcblx0XHRcdClcblx0XHQpXG5cdCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgdGVtcGxhdGluZyBvZiB0aGUgbm9uLUNyZWF0ZSBhY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7RXhwcmVzc2lvbjxib29sZWFuPn0gYWN0aW9uVmlzaWJpbGl0eVxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj4gfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFRlbXBsYXRpbmcoYWN0aW9uVmlzaWJpbGl0eTogRXhwcmVzc2lvbjxib29sZWFuPik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gbm90KGFuZChpc0NvbnN0YW50KGFjdGlvblZpc2liaWxpdHkpLCBlcXVhbChhY3Rpb25WaXNpYmlsaXR5LCBmYWxzZSkpKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2aXNpYmxlIG9mIHRoZSBhY3Rpb24gQ3JlYXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDcmVhdGVWaXNpYmlsaXR5KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgaXNJbnNlcnRhYmxlID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNJbnNlcnRhYmxlLmV4cHJlc3Npb247XG5cdGNvbnN0IGlzQ3JlYXRlSGlkZGVuID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5oaWRkZW5Bbm5vdGF0aW9uLmNyZWF0ZTtcblx0Y29uc3QgbmV3QWN0aW9uID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5uZXdBY3Rpb247XG5cblx0Ly9DcmVhdGUgQnV0dG9uIGlzIHZpc2libGU6XG5cdC8vIFx0IC0gSWYgdGhlIGNyZWF0aW9uIG1vZGUgaXMgZXh0ZXJuYWxcblx0Ly8gICAgICAtIElmIHdlJ3JlIG9uIHRoZSBsaXN0IHJlcG9ydCBhbmQgY3JlYXRlIGlzIG5vdCBoaWRkZW5cblx0Ly9cdFx0LSBPdGhlcndpc2UgdGhpcyBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZiB0aGUgdGhlIFVJLklzRWRpdGFibGVcblx0Ly8gICAtIE90aGVyd2lzZVxuXHQvLyBcdCBcdC0gSWYgd2UncmUgb24gdGhlIGxpc3QgcmVwb3J0IC0+XG5cdC8vIFx0IFx0XHQtIElmIFVJLkNyZWF0ZUhpZGRlbiBwb2ludHMgdG8gYSBwcm9wZXJ0eSBwYXRoIC0+IHByb3ZpZGUgYSBuZWdhdGVkIGJpbmRpbmcgdG8gdGhpcyBwYXRoXG5cdC8vIFx0IFx0XHQtIE90aGVyd2lzZSwgY3JlYXRlIGlzIHZpc2libGVcblx0Ly8gXHQgXHQtIE90aGVyd2lzZVxuXHQvLyBcdCAgXHQgLSBUaGlzIGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mIHRoZSB0aGUgVUkuSXNFZGl0YWJsZVxuXHRyZXR1cm4gaWZFbHNlKFxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuaXNFeHRlcm5hbENyZWF0ZUNvbmZpZ3VyZWQsXG5cdFx0aWZFbHNlKFxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQsXG5cdFx0XHRub3QoaXNDcmVhdGVIaWRkZW4pLFxuXHRcdFx0YW5kKG5vdChpc0NyZWF0ZUhpZGRlbiksIFVJLklzRWRpdGFibGUpXG5cdFx0KSxcblx0XHRpZkVsc2UoXG5cdFx0XHRvcihcblx0XHRcdFx0YW5kKGlzQ29uc3RhbnQobmV3QWN0aW9uPy5hdmFpbGFibGUpLCBlcXVhbChuZXdBY3Rpb24/LmF2YWlsYWJsZSwgZmFsc2UpKSxcblx0XHRcdFx0YW5kKGlzQ29uc3RhbnQoaXNJbnNlcnRhYmxlKSwgZXF1YWwoaXNJbnNlcnRhYmxlLCBmYWxzZSksICFuZXdBY3Rpb24pLFxuXHRcdFx0XHRhbmQoaXNDb25zdGFudChpc0NyZWF0ZUhpZGRlbiksIGVxdWFsKGlzQ3JlYXRlSGlkZGVuLCB0cnVlKSksXG5cdFx0XHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuaXNWaWV3V2l0aE11bHRpcGxlVmlzdWFsaXphdGlvbnMsXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2Vcblx0XHRcdCksXG5cdFx0XHRmYWxzZSxcblx0XHRcdGlmRWxzZShcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQsXG5cdFx0XHRcdGlmRWxzZShpc0JpbmRpbmcoaXNDcmVhdGVIaWRkZW4pLCBub3QoaXNDcmVhdGVIaWRkZW4pLCB0cnVlKSxcblx0XHRcdFx0YW5kKG5vdChpc0NyZWF0ZUhpZGRlbiksIFVJLklzRWRpdGFibGUpXG5cdFx0XHQpXG5cdFx0KVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHByb3BlcnR5IHZpc2libGUgb2YgdGhlIGFjdGlvbiBEZWxldGUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlbGV0ZVZpc2liaWxpdHkoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0RlbGV0ZUhpZGRlbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuaGlkZGVuQW5ub3RhdGlvbi5kZWxldGU7XG5cdGNvbnN0IHBhdGhEZWxldGFibGVFeHByZXNzaW9uID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNEZWxldGFibGUuZXhwcmVzc2lvbjtcblxuXHQvL0RlbGV0ZSBCdXR0b24gaXMgdmlzaWJsZTpcblx0Ly8gXHQgUHJlcmVxdWlzaXRlczpcblx0Ly9cdCAtIElmIHdlJ3JlIG5vdCBvbiBtdWx0aXBsZSB2aXN1YWxpemF0aW9ucyBjb25maWd1cmF0aW9uIG9yIEFMUFxuXHQvL1xuXHQvLyAgIC0gSWYgcmVzdHJpY3Rpb25zIG9uIGRlbGV0YWJsZSBzZXQgdG8gZmFsc2UgLT4gbm90IHZpc2libGVcblx0Ly8gICAtIE90aGVyd2lzZVxuXHQvL1x0XHRcdC0gSWYgVUkuRGVsZXRlSGlkZGVuIGlzIHRydWUgLT4gbm90IHZpc2libGVcblx0Ly9cdFx0XHQtIE90aGVyd2lzZVxuXHQvLyBcdCBcdFx0XHQtIElmIHdlJ3JlIG9uIE9QIC0+IGRlcGVuZGluZyBvZiB0aGUgZWRpdE1vZGUgYW5kIHJlc3RyaWN0aW9ucyBvbiBkZWxldGFibGVcblx0Ly9cdFx0XHRcdC0gT3RoZXJ3aXNlXG5cdC8vXHRcdFx0XHQgXHQtIElmIFVJLkRlbGV0ZUhpZGRlbiBwb2ludHMgdG8gYSBwcm9wZXJ0eSBwYXRoIC0+IHByb3ZpZGUgYSBuZWdhdGVkIGJpbmRpbmcgdG8gdGhpcyBwYXRoXG5cdC8vXHQgXHQgXHRcdCBcdC0gT3RoZXJ3aXNlLCBkZWxldGUgaXMgdmlzaWJsZVxuXG5cdHJldHVybiBpZkVsc2UoXG5cdFx0b3Ioc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5pc1ZpZXdXaXRoTXVsdGlwbGVWaXN1YWxpemF0aW9ucywgY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZSksXG5cdFx0ZmFsc2UsXG5cdFx0aWZFbHNlKFxuXHRcdFx0YW5kKGlzQ29uc3RhbnQocGF0aERlbGV0YWJsZUV4cHJlc3Npb24pLCBlcXVhbChwYXRoRGVsZXRhYmxlRXhwcmVzc2lvbiwgZmFsc2UpKSxcblx0XHRcdGZhbHNlLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRhbmQoaXNDb25zdGFudChpc0RlbGV0ZUhpZGRlbiksIGVxdWFsKGlzRGVsZXRlSGlkZGVuLCBjb25zdGFudCh0cnVlKSkpLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0LFxuXHRcdFx0XHRcdGFuZChub3QoaXNEZWxldGVIaWRkZW4pLCBlcXVhbChiaW5kaW5nRXhwcmVzc2lvbihcIi9lZGl0TW9kZVwiLCBcInVpXCIpLCBcIkVkaXRhYmxlXCIpKSxcblx0XHRcdFx0XHRpZkVsc2UoaXNCaW5kaW5nKGlzRGVsZXRlSGlkZGVuKSwgbm90KGlzRGVsZXRlSGlkZGVuKSwgdHJ1ZSlcblx0XHRcdFx0KVxuXHRcdFx0KVxuXHRcdClcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2aXNpYmxlIG9mIHRoZSBhY3Rpb24gUGFzdGUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7RXhwcmVzc2lvbjxib29sZWFuPn0gY3JlYXRlVmlzaWJpbGl0eVxuICogQHBhcmFtIHtib29sZWFufSBpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWRcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhc3RlVmlzaWJpbGl0eShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0Y3JlYXRlVmlzaWJpbGl0eTogRXhwcmVzc2lvbjxib29sZWFuPixcblx0aXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkOiBib29sZWFuXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Ly8gSWYgQ3JlYXRlIGlzIHZpc2libGUsIGVuYWJsZVBhc3RlIGlzIG5vdCBkaXNhYmxlZCBpbnRvIG1hbmlmZXN0IGFuZCB3ZSBhcmUgb24gT1AvYmxvY2tzIG91dHNpZGUgRmlvcmkgZWxlbWVudHMgdGVtcGxhdGVzXG5cdC8vIFRoZW4gYnV0dG9uIHdpbGwgYmUgdmlzaWJsZSBhY2NvcmRpbmcgdG8gaW5zZXJ0YWJsZSByZXN0cmljdGlvbnMgYW5kIGNyZWF0ZSB2aXNpYmlsaXR5XG5cdC8vIE90aGVyd2lzZSBpdCdzIG5vdCB2aXNpYmxlXG5cdHJldHVybiBpZkVsc2UoXG5cdFx0YW5kKFxuXHRcdFx0bm90RXF1YWwoc3RhbmRhcmRBY3Rpb25zQ29udGV4dC50YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5lbmFibGVQYXN0ZSwgZmFsc2UpLFxuXHRcdFx0Y3JlYXRlVmlzaWJpbGl0eSxcblx0XHRcdGlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZFxuXHRcdCksXG5cdFx0W1RlbXBsYXRlVHlwZS5MaXN0UmVwb3J0LCBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXS5pbmRleE9mKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkpID09PSAtMSAmJlxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNJbnNlcnRhYmxlLmV4cHJlc3Npb24sXG5cdFx0ZmFsc2Vcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2aXNpYmxlIG9mIHRoZSBhY3Rpb24gTWFzc0VkaXQuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1hc3NFZGl0VmlzaWJpbGl0eShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGlzVXBkYXRlSGlkZGVuID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5oaWRkZW5Bbm5vdGF0aW9uLnVwZGF0ZSxcblx0XHRwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzVXBkYXRhYmxlLmV4cHJlc3Npb24sXG5cdFx0Yk1hc3NFZGl0RW5hYmxlZEluTWFuaWZlc3Q6IGJvb2xlYW4gPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPy5lbmFibGVNYXNzRWRpdCB8fCBmYWxzZTtcblx0Y29uc3QgdGVtcGxhdGVCaW5kaW5nRXhwcmVzc2lvbiA9XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLk9iamVjdFBhZ2Vcblx0XHRcdD8gZXF1YWwoVUkuSXNFZGl0YWJsZSwgdHJ1ZSlcblx0XHRcdDogY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQ7XG5cdC8vTWFzc0VkaXQgaXMgdmlzaWJsZVxuXHQvLyBJZlxuXHQvL1x0XHQtIHRoZXJlIGlzIG5vIHN0YXRpYyByZXN0cmljdGlvbnMgc2V0IHRvIGZhbHNlXG5cdC8vXHRcdC0gYW5kIGVuYWJsZU1hc3NFZGl0IGlzIG5vdCBzZXQgdG8gZmFsc2UgaW50byB0aGUgbWFuaWZlc3Rcblx0Ly9cdFx0LSBhbmQgdGhlIHNlbGVjdGlvbk1vZGUgaXMgcmVsZXZhbnRcblx0Ly9cdFRoZW4gTWFzc0VkaXQgaXMgYWx3YXlzIHZpc2libGUgaW4gTFIgb3IgZHluYW1pY2FsbHkgdmlzaWJsZSBpbiBPUCBhY2NvcmRpbmcgdG8gdWk+RWRpdGFibGUgYW5kIGhpZGRlbkFubm90YXRpb25cblx0Ly8gIEJ1dHRvbiBpcyBoaWRkZW4gZm9yIGFsbCBvdGhlciBjYXNlc1xuXHRyZXR1cm4gaWZFbHNlKFxuXHRcdGFuZChub3QoYW5kKGlzQ29uc3RhbnQocGF0aFVwZGF0YWJsZUV4cHJlc3Npb24pLCBlcXVhbChwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiwgZmFsc2UpKSksIGJNYXNzRWRpdEVuYWJsZWRJbk1hbmlmZXN0KSxcblx0XHRhbmQodGVtcGxhdGVCaW5kaW5nRXhwcmVzc2lvbiwgbm90KGlzVXBkYXRlSGlkZGVuKSksXG5cdFx0ZmFsc2Vcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSBlbmFibGVkIG9mIHRoZSBhY3Rpb24gQ3JlYXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGNyZWF0ZVZpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENyZWF0ZUVuYWJsZW1lbnQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGNyZWF0ZVZpc2liaWxpdHk6IEV4cHJlc3Npb248Ym9vbGVhbj5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0luc2VydGFibGUgPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc0luc2VydGFibGUuZXhwcmVzc2lvbjtcblx0Y29uc3QgQ29sbGVjdGlvblR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LnJlc29sdmVBYnNvbHV0ZVBhdGg8YW55PihzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmNvbGxlY3Rpb25QYXRoKS50YXJnZXQ/Ll90eXBlO1xuXHRyZXR1cm4gYW5kKFxuXHRcdGNyZWF0ZVZpc2liaWxpdHksXG5cdFx0aWZFbHNlKFxuXHRcdFx0Q29sbGVjdGlvblR5cGUgPT09IFwiRW50aXR5U2V0XCIsXG5cdFx0XHR0cnVlLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuT2JqZWN0UGFnZSxcblx0XHRcdFx0aXNJbnNlcnRhYmxlLFxuXHRcdFx0XHRhbmQoaXNJbnNlcnRhYmxlLCBlcXVhbChiaW5kaW5nRXhwcmVzc2lvbihcIi9lZGl0TW9kZVwiLCBcInVpXCIpLCBcIkVkaXRhYmxlXCIpKVxuXHRcdFx0KVxuXHRcdClcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSBlbmFibGVkIG9mIHRoZSBhY3Rpb24gRGVsZXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGRlbGV0ZVZpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlbGV0ZUVuYWJsZW1lbnQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGRlbGV0ZVZpc2liaWxpdHk6IEV4cHJlc3Npb248Ym9vbGVhbj5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0RlbGV0YWJsZSA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzRGVsZXRhYmxlLmV4cHJlc3Npb247XG5cdGNvbnN0IGlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkgPVxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzRGVsZXRhYmxlLmlzT25seUN1cnJlbnRFbnRpdHlFeHByZXNzaW9uICYmICFpc0NvbnN0YW50KGlzRGVsZXRhYmxlKTtcblx0Y29uc3QgbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID0gYmluZGluZ0V4cHJlc3Npb24oXCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcIiwgXCJpbnRlcm5hbFwiKTtcblx0Y29uc3QgbnVtYmVyT2ZEZWxldGFibGVDb250ZXh0cyA9IGJpbmRpbmdFeHByZXNzaW9uKFwiZGVsZXRhYmxlQ29udGV4dHNcIiwgXCJpbnRlcm5hbFwiKTtcblx0Y29uc3QgbnVtYmVyT2ZVblNhdmVkQ29udGV4dHMgPSBiaW5kaW5nRXhwcmVzc2lvbihcInVuU2F2ZWRDb250ZXh0c1wiLCBcImludGVybmFsXCIpO1xuXG5cdHJldHVybiBhbmQoXG5cdFx0ZGVsZXRlVmlzaWJpbGl0eSxcblx0XHRpZkVsc2UoXG5cdFx0XHRvcihjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuT2JqZWN0UGFnZSwgaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSksXG5cdFx0XHRpZkVsc2UoXG5cdFx0XHRcdG9yKFxuXHRcdFx0XHRcdGFuZChub3RFcXVhbChudW1iZXJPZkRlbGV0YWJsZUNvbnRleHRzLCB1bmRlZmluZWQpLCBncmVhdGVyVGhhbihsZW5ndGgobnVtYmVyT2ZEZWxldGFibGVDb250ZXh0cyksIDApKSxcblx0XHRcdFx0XHRhbmQobm90RXF1YWwobnVtYmVyT2ZVblNhdmVkQ29udGV4dHMsIHVuZGVmaW5lZCksIGdyZWF0ZXJUaGFuKGxlbmd0aChudW1iZXJPZlVuU2F2ZWRDb250ZXh0cyksIDApKVxuXHRcdFx0XHQpLFxuXHRcdFx0XHRiaW5kaW5nRXhwcmVzc2lvbihcImRlbGV0ZUVuYWJsZWRcIiwgXCJpbnRlcm5hbFwiKSxcblx0XHRcdFx0ZmFsc2Vcblx0XHRcdCksXG5cdFx0XHRhbmQobm90RXF1YWwobnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzLCAwKSwgaXNEZWxldGFibGUpXG5cdFx0KVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHByb3BlcnR5IGVuYWJsZWQgb2YgdGhlIGFjdGlvbiBQYXN0ZS5cbiAqXG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IHBhc3RlVmlzaWJpbGl0eVxuICogQHBhcmFtIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBjcmVhdGVFbmFibGVtZW50XG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXN0ZUVuYWJsZW1lbnQocGFzdGVWaXNpYmlsaXR5OiBFeHByZXNzaW9uPGJvb2xlYW4+LCBjcmVhdGVFbmFibGVtZW50OiBFeHByZXNzaW9uPGJvb2xlYW4+KTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBhbmQocGFzdGVWaXNpYmlsaXR5LCBjcmVhdGVFbmFibGVtZW50KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSBlbmFibGVkIG9mIHRoZSBhY3Rpb24gTWFzc0VkaXQuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7RXhwcmVzc2lvbjxib29sZWFuPn0gbWFzc0VkaXRWaXNpYmlsaXR5XG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXNzRWRpdEVuYWJsZW1lbnQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdG1hc3NFZGl0VmlzaWJpbGl0eTogRXhwcmVzc2lvbjxib29sZWFuPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IHBhdGhVcGRhdGFibGVFeHByZXNzaW9uID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNVcGRhdGFibGUuZXhwcmVzc2lvbjtcblx0Y29uc3QgaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eTogYW55ID1cblx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc1VwZGF0YWJsZS5pc09ubHlDdXJyZW50RW50aXR5RXhwcmVzc2lvbiAmJiAhaXNDb25zdGFudChwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbik7XG5cdGNvbnN0IG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9IGdyZWF0ZXJPckVxdWFsKGJpbmRpbmdFeHByZXNzaW9uKFwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXCIsIFwiaW50ZXJuYWxcIiksIDEpO1xuXHRjb25zdCBudW1iZXJPZlVwZGF0YWJsZUNvbnRleHRzID0gZ3JlYXRlck9yRXF1YWwobGVuZ3RoKGJpbmRpbmdFeHByZXNzaW9uKFwidXBkYXRhYmxlQ29udGV4dHNcIiwgXCJpbnRlcm5hbFwiKSksIDEpO1xuXHRjb25zdCBiSXNEcmFmdFN1cHBvcnRlZCA9IGlzRHJhZnRTdXBwb3J0ZWQoY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGJEaXNwbGF5TW9kZSA9IGlzSW5EaXNwbGF5TW9kZShjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHQvLyBudW1iZXJPZlVwZGF0YWJsZUNvbnRleHRzIG5lZWRzIHRvIGJlIGFkZGVkIHRvIHRoZSBiaW5kaW5nIGluIGNhc2Vcblx0Ly8gMS4gVXBkYXRlIGlzIGRlcGVuZGVudCBvbiBjdXJyZW50IGVudGl0eSBwcm9wZXJ0eSAoaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSBpcyB0cnVlKS5cblx0Ly8gMi4gVGhlIHRhYmxlIGlzIHJlYWQgb25seSBhbmQgZHJhZnQgZW5hYmxlZChsaWtlIExSKSwgaW4gdGhpcyBjYXNlIG9ubHkgYWN0aXZlIGNvbnRleHRzIGNhbiBiZSBtYXNzIGVkaXRlZC5cblx0Ly8gICAgU28sIHVwZGF0ZSBkZXBlbmRzIG9uICdJc0FjdGl2ZUVudGl0eScgdmFsdWUgd2hpY2ggbmVlZHMgdG8gYmUgY2hlY2tlZCBydW50aW1lLlxuXHRjb25zdCBydW50aW1lQmluZGluZyA9IGlmRWxzZShcblx0XHRvcihhbmQoYkRpc3BsYXlNb2RlLCBiSXNEcmFmdFN1cHBvcnRlZCksIGlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkpLFxuXHRcdGFuZChudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMsIG51bWJlck9mVXBkYXRhYmxlQ29udGV4dHMpLFxuXHRcdGFuZChudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMpXG5cdCk7XG5cblx0cmV0dXJuIGFuZChtYXNzRWRpdFZpc2liaWxpdHksIGlmRWxzZShpc09ubHlEeW5hbWljT25DdXJyZW50RW50aXR5LCBydW50aW1lQmluZGluZywgYW5kKHJ1bnRpbWVCaW5kaW5nLCBwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbikpKTtcbn1cblxuLyoqXG4gKiBUZWxscyBpZiB0aGUgdGFibGUgaW4gdGVtcGxhdGUgaXMgaW4gZGlzcGxheSBtb2RlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtWaWV3UGF0aENvbmZpZ3VyYXRpb259IHZpZXdDb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5EaXNwbGF5TW9kZShjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCB2aWV3Q29uZmlndXJhdGlvbj86IFZpZXdQYXRoQ29uZmlndXJhdGlvbik6IGJvb2xlYW4ge1xuXHRjb25zdCB0ZW1wbGF0ZVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpO1xuXHRpZiAoXG5cdFx0dGVtcGxhdGVUeXBlID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCB8fFxuXHRcdHRlbXBsYXRlVHlwZSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZSB8fFxuXHRcdCh2aWV3Q29uZmlndXJhdGlvbiAmJiBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmhhc011bHRpcGxlVmlzdWFsaXphdGlvbnModmlld0NvbmZpZ3VyYXRpb24pKVxuXHQpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHQvLyB1cGRhdGFibGUgd2lsbCBiZSBoYW5kbGVkIGF0IHRoZSBwcm9wZXJ0eSBsZXZlbFxuXHRyZXR1cm4gZmFsc2U7XG59XG4iXX0=
592
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlN0YW5kYXJkQWN0aW9ucy50cyJdLCJuYW1lcyI6WyJBbm5vdGF0aW9uSGlkZGVuUHJvcGVydHkiLCJnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQiLCJjb252ZXJ0ZXJDb250ZXh0IiwiY3JlYXRpb25Nb2RlIiwidGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24iLCJ2aWV3Q29uZmlndXJhdGlvbiIsImNvbGxlY3Rpb25QYXRoIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJoaWRkZW5Bbm5vdGF0aW9uIiwiY3JlYXRlIiwiaXNBY3Rpb25Bbm5vdGF0ZWRIaWRkZW4iLCJDcmVhdGVIaWRkZW4iLCJEZWxldGVIaWRkZW4iLCJ1cGRhdGUiLCJVcGRhdGVIaWRkZW4iLCJpc0RyYWZ0T3JTdGlja3lTdXBwb3J0ZWQiLCJpc1ZpZXdXaXRoTXVsdGlwbGVWaXN1YWxpemF0aW9ucyIsImdldE1hbmlmZXN0V3JhcHBlciIsImhhc011bHRpcGxlVmlzdWFsaXphdGlvbnMiLCJuZXdBY3Rpb24iLCJnZXROZXdBY3Rpb24iLCJyZXN0cmljdGlvbnMiLCJnZXRSZXN0cmljdGlvbnMiLCJpc0RyYWZ0U3VwcG9ydGVkIiwiY3VycmVudEVudGl0eVNldCIsImdldEVudGl0eVNldCIsImJJc0RyYWZ0Um9vdCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiRHJhZnRSb290IiwiYklzRHJhZnROb2RlIiwiRHJhZnROb2RlIiwiYklzRHJhZnRQYXJlbnRFbnRpdHlGb3JDb250YWlubWVudCIsInRhcmdldE9iamVjdCIsImNvbnRhaW5zVGFyZ2V0Iiwic3RhcnRpbmdFbnRpdHlTZXQiLCJiSXNEcmFmdFN1cHBvcnRlZCIsImJJc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJTZXNzaW9uIiwiU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsIm5ld0FjdGlvbk5hbWUiLCJOZXdBY3Rpb24iLCJ0b1N0cmluZyIsImF2YWlsYWJsZVByb3BlcnR5IiwiZ2V0RW50aXR5VHlwZSIsImFjdGlvbnMiLCJDb3JlIiwiT3BlcmF0aW9uQXZhaWxhYmxlIiwidW5kZWZpbmVkIiwibmFtZSIsImF2YWlsYWJsZSIsImFubm90YXRpb25FeHByZXNzaW9uIiwic0Fubm90YXRpb25UZXJtIiwiYldpdGhOYXZpZ2F0aW9uUGF0aCIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJ2aXNpdGVkTmF2aWdhdGlvblBhdGhzIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJsZW5ndGgiLCJhY3Rpb25Bbm5vdGF0aW9uVmFsdWUiLCJVSSIsInBhdGgiLCJzaW5nbGV0b25QYXRoVmlzaXRvciIsImdldENvbnZlcnRlZFR5cGVzIiwiY29uc3RhbnQiLCJyZXN0cmljdGlvbnNEZWYiLCJrZXkiLCJpc1BhdGhJbnNlcnRhYmxlIiwiaXNQYXRoVXBkYXRhYmxlIiwiaXNQYXRoRGVsZXRhYmxlIiwicmVzdWx0IiwiZm9yRWFjaCIsImRlZiIsImRlZkZ1bmN0aW9uIiwiZXhwcmVzc2lvbiIsImFwcGx5IiwicGF0aFZpc2l0b3IiLCJuYXZpZ2F0aW9uUGF0aHMiLCJuYXZpZ2F0aW9uRXhwcmVzc2lvbiIsImlnbm9yZVRhcmdldENvbGxlY3Rpb24iLCJhdXRob3JpemVVbnJlc29sdmFibGUiLCJnZXRJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGluZyIsInN0YW5kYXJkQWN0aW9uc0NvbnRleHQiLCJpc0RyYWZ0T3JTdGlja3kiLCJpc0NyZWF0ZUFsd2F5c0hpZGRlbiIsIkNyZWF0aW9uTW9kZSIsIkV4dGVybmFsIiwiZ2V0U3RhbmRhcmRBY3Rpb25DcmVhdGUiLCJjcmVhdGVWaXNpYmlsaXR5IiwiZ2V0Q3JlYXRlVmlzaWJpbGl0eSIsImlzVGVtcGxhdGVkIiwiY29tcGlsZUJpbmRpbmciLCJnZXRDcmVhdGVUZW1wbGF0aW5nIiwidmlzaWJsZSIsImVuYWJsZWQiLCJnZXRDcmVhdGVFbmFibGVtZW50IiwiZ2V0U3RhbmRhcmRBY3Rpb25EZWxldGUiLCJkZWxldGVWaXNpYmlsaXR5IiwiZ2V0RGVsZXRlVmlzaWJpbGl0eSIsImdldERlZmF1bHRUZW1wbGF0aW5nIiwiZ2V0RGVsZXRlRW5hYmxlbWVudCIsImdldENyZWF0aW9uUm93IiwiY3JlYXRpb25Sb3dWaXNpYmlsaXR5IiwiZ2V0Q3JlYXRpb25Sb3dFbmFibGVtZW50IiwiZ2V0U3RhbmRhcmRBY3Rpb25QYXN0ZSIsImlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZCIsImNyZWF0ZUVuYWJsZW1lbnQiLCJwYXN0ZVZpc2liaWxpdHkiLCJnZXRQYXN0ZVZpc2liaWxpdHkiLCJnZXRQYXN0ZUVuYWJsZW1lbnQiLCJnZXRTdGFuZGFyZEFjdGlvbk1hc3NFZGl0IiwibWFzc0VkaXRWaXNpYmlsaXR5IiwiZ2V0TWFzc0VkaXRWaXNpYmlsaXR5IiwiZ2V0TWFzc0VkaXRFbmFibGVtZW50IiwiaXNGb3JDcmVhdGlvblJvdyIsImFuZCIsIm9yIiwiQ3JlYXRpb25Sb3ciLCJub3QiLCJpc0NvbnN0YW50IiwiYWN0aW9uVmlzaWJpbGl0eSIsImlzSW5zZXJ0YWJsZSIsImlzQ3JlYXRlSGlkZGVuIiwiaWZFbHNlIiwiZ2V0VGVtcGxhdGVUeXBlIiwiVGVtcGxhdGVUeXBlIiwiTGlzdFJlcG9ydCIsIklzRWRpdGFibGUiLCJlcXVhbCIsIkFuYWx5dGljYWxMaXN0UGFnZSIsImlzQmluZGluZyIsImlzRGVsZXRlSGlkZGVuIiwiZGVsZXRlIiwicGF0aERlbGV0YWJsZUV4cHJlc3Npb24iLCJpc0RlbGV0YWJsZSIsImJpbmRpbmdFeHByZXNzaW9uIiwibm90RXF1YWwiLCJlbmFibGVQYXN0ZSIsImluZGV4T2YiLCJpc1VwZGF0ZUhpZGRlbiIsInBhdGhVcGRhdGFibGVFeHByZXNzaW9uIiwiaXNVcGRhdGFibGUiLCJiTWFzc0VkaXRFbmFibGVkSW5NYW5pZmVzdCIsImVuYWJsZU1hc3NFZGl0IiwidGVtcGxhdGVCaW5kaW5nRXhwcmVzc2lvbiIsIk9iamVjdFBhZ2UiLCJyZXN0cmljdGlvbnNJbnNlcnRhYmxlIiwicGFydG5lciIsIl90eXBlIiwiZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSIsImZvcm1hdFJlc3VsdCIsInRhYmxlRm9ybWF0dGVycyIsInZhbGlkYXRlQ3JlYXRpb25Sb3dGaWVsZHMiLCJDb2xsZWN0aW9uVHlwZSIsInJlc29sdmVBYnNvbHV0ZVBhdGgiLCJ0YXJnZXQiLCJpc09ubHlEeW5hbWljT25DdXJyZW50RW50aXR5IiwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIiwibnVtYmVyT2ZEZWxldGFibGVDb250ZXh0cyIsIm51bWJlck9mVW5TYXZlZENvbnRleHRzIiwiZ3JlYXRlclRoYW4iLCJncmVhdGVyT3JFcXVhbCIsIm51bWJlck9mVXBkYXRhYmxlQ29udGV4dHMiLCJiRGlzcGxheU1vZGUiLCJpc0luRGlzcGxheU1vZGUiLCJydW50aW1lQmluZGluZyIsInRlbXBsYXRlVHlwZSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BMEJLQSx3Qjs7YUFBQUEsd0I7QUFBQUEsSUFBQUEsd0I7QUFBQUEsSUFBQUEsd0I7QUFBQUEsSUFBQUEsd0I7S0FBQUEsd0IsS0FBQUEsd0I7O0FBb0NMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFdBQVNDLDhCQUFULENBQ05DLGdCQURNLEVBRU5DLFlBRk0sRUFHTkMsMEJBSE0sRUFJTkMsaUJBSk0sRUFLbUI7QUFDekIsV0FBTztBQUNOQyxNQUFBQSxjQUFjLEVBQUVDLG1CQUFtQixDQUFDTCxnQkFBZ0IsQ0FBQ00sc0JBQWpCLEVBQUQsQ0FEN0I7QUFFTkMsTUFBQUEsZ0JBQWdCLEVBQUU7QUFDakJDLFFBQUFBLE1BQU0sRUFBRUMsdUJBQXVCLENBQUNULGdCQUFELEVBQW1CRix3QkFBd0IsQ0FBQ1ksWUFBNUMsQ0FEZDtBQUVqQixrQkFBVUQsdUJBQXVCLENBQUNULGdCQUFELEVBQW1CRix3QkFBd0IsQ0FBQ2EsWUFBNUMsQ0FGaEI7QUFHakJDLFFBQUFBLE1BQU0sRUFBRUgsdUJB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LFVBQTlCLElBQ0F3QyxZQUFZLEtBQUt6QyxZQUFZLENBQUNJLGtCQUQ5QixJQUVDNUgsaUJBQWlCLElBQUlILGdCQUFnQixDQUFDZ0Isa0JBQWpCLEdBQXNDQyx5QkFBdEMsQ0FBZ0VkLGlCQUFoRSxDQUh2QixFQUlFO0FBQ0QsYUFBTyxJQUFQO0FBQ0EsS0FSc0gsQ0FTdkg7OztBQUNBLFdBQU8sS0FBUDtBQUNBIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwiLi4vLi4vLi4vQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHtcblx0YW5kLFxuXHRhbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0YmluZGluZ0V4cHJlc3Npb24sXG5cdEJpbmRpbmdFeHByZXNzaW9uLFxuXHRjb21waWxlQmluZGluZyxcblx0Y29uc3RhbnQsXG5cdGVxdWFsLFxuXHRsZW5ndGgsXG5cdEV4cHJlc3Npb24sXG5cdGdyZWF0ZXJPckVxdWFsLFxuXHRpZkVsc2UsXG5cdGlzQmluZGluZyxcblx0aXNDb25zdGFudCxcblx0bm90LFxuXHRub3RFcXVhbCxcblx0b3IsXG5cdGdyZWF0ZXJUaGFuLFxuXHRmb3JtYXRSZXN1bHRcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ0V4cHJlc3Npb25cIjtcbmltcG9ydCB7IENyZWF0aW9uTW9kZSwgVGVtcGxhdGVUeXBlLCBWaWV3UGF0aENvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi4vLi4vLi4vTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgc2luZ2xldG9uUGF0aFZpc2l0b3IsIFVJIH0gZnJvbSBcIi4uLy4uLy4uL2hlbHBlcnMvQmluZGluZ0hlbHBlclwiO1xuaW1wb3J0IHsgUHJvcGVydHlBbm5vdGF0aW9uVmFsdWUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB7IGdldFRhcmdldE9iamVjdFBhdGgsIGlzUGF0aERlbGV0YWJsZSwgaXNQYXRoSW5zZXJ0YWJsZSwgaXNQYXRoVXBkYXRhYmxlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgVGFibGVDb250cm9sQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuLi9UYWJsZVwiO1xuaW1wb3J0IHRhYmxlRm9ybWF0dGVycyBmcm9tIFwic2FwL2ZlL2NvcmUvZm9ybWF0dGVycy9UYWJsZUZvcm1hdHRlclwiO1xuXG5lbnVtIEFubm90YXRpb25IaWRkZW5Qcm9wZXJ0eSB7XG5cdENyZWF0ZUhpZGRlbiA9IFwiQ3JlYXRlSGlkZGVuXCIsXG5cdERlbGV0ZUhpZGRlbiA9IFwiRGVsZXRlSGlkZGVuXCIsXG5cdFVwZGF0ZUhpZGRlbiA9IFwiVXBkYXRlSGlkZGVuXCJcbn1cblxuZXhwb3J0IHR5cGUgU3RhbmRhcmRBY3Rpb25Db25maWdUeXBlID0ge1xuXHRpc1RlbXBsYXRlZD86IEJpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHR2aXNpYmxlOiBCaW5kaW5nRXhwcmVzc2lvbjxib29sZWFuPjtcblx0ZW5hYmxlZDogQmluZGluZ0V4cHJlc3Npb248Ym9vbGVhbj47XG59O1xuXG50eXBlIEV4cHJlc3Npb25SZXN0cmljdGlvbnNUeXBlID0ge1xuXHRleHByZXNzaW9uOiBFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHRuYXZpZ2F0aW9uRXhwcmVzc2lvbjogRXhwcmVzc2lvbjxib29sZWFuPjtcbn07XG50eXBlIFN0YW5kYXJkQWN0aW9uc1Jlc3RyaWN0aW9uc1R5cGUgPSBSZWNvcmQ8c3RyaW5nLCBFeHByZXNzaW9uUmVzdHJpY3Rpb25zVHlwZT47XG5cbmV4cG9ydCB0eXBlIFN0YW5kYXJkQWN0aW9uc0NvbnRleHQgPSB7XG5cdGNvbGxlY3Rpb25QYXRoOiBzdHJpbmc7XG5cdGhpZGRlbkFubm90YXRpb246IHtcblx0XHRjcmVhdGU6IEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdFx0XCJkZWxldGVcIjogRXhwcmVzc2lvbjxib29sZWFuPjtcblx0XHR1cGRhdGU6IEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdH07XG5cdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlO1xuXHRpc0RyYWZ0T3JTdGlja3lTdXBwb3J0ZWQ6IGJvb2xlYW47XG5cdGlzVmlld1dpdGhNdWx0aXBsZVZpc3VhbGl6YXRpb25zOiBib29sZWFuO1xuXHRuZXdBY3Rpb24/OiB7XG5cdFx0bmFtZT86IHN0cmluZztcblx0XHRhdmFpbGFibGU/OiBFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHR9O1xuXHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbjogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbjtcblx0cmVzdHJpY3Rpb25zOiBTdGFuZGFyZEFjdGlvbnNSZXN0cmljdGlvbnNUeXBlO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIGNvbnRleHQgZm9yIHRoZSBzdGFuZGFyZCBhY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9ufSBjcmVhdGlvbk1vZGVcbiAqIEBwYXJhbSB7VGFibGVDb250cm9sQ29uZmlndXJhdGlvbn0gdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSB7Vmlld1BhdGhDb25maWd1cmF0aW9ufSB2aWV3Q29uZmlndXJhdGlvblxuICogQHJldHVybnMgIFRoZSBjb250ZXh0IGZvciB0YWJsZSBhY3Rpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLFxuXHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbjogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbixcblx0dmlld0NvbmZpZ3VyYXRpb24/OiBWaWV3UGF0aENvbmZpZ3VyYXRpb25cbik6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQge1xuXHRyZXR1cm4ge1xuXHRcdGNvbGxlY3Rpb25QYXRoOiBnZXRUYXJnZXRPYmplY3RQYXRoKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKSxcblx0XHRoaWRkZW5Bbm5vdGF0aW9uOiB7XG5cdFx0XHRjcmVhdGU6IGlzQWN0aW9uQW5ub3RhdGVkSGlkZGVuKGNvbnZlcnRlckNvbnRleHQsIEFubm90YXRpb25IaWRkZW5Qcm9wZXJ0eS5DcmVhdGVIaWRkZW4pLFxuXHRcdFx0XCJkZWxldGVcIjogaXNBY3Rpb25Bbm5vdGF0ZWRIaWRkZW4oY29udmVydGVyQ29udGV4dCwgQW5ub3RhdGlvbkhpZGRlblByb3BlcnR5LkRlbGV0ZUhpZGRlbiksXG5cdFx0XHR1cGRhdGU6IGlzQWN0aW9uQW5ub3RhdGVkSGlkZGVuKGNvbnZlcnRlckNvbnRleHQsIEFubm90YXRpb25IaWRkZW5Qcm9wZXJ0eS5VcGRhdGVIaWRkZW4pXG5cdFx0fSxcblx0XHRjcmVhdGlvbk1vZGU6IGNyZWF0aW9uTW9kZSxcblx0XHRpc0RyYWZ0T3JTdGlja3lTdXBwb3J0ZWQ6IGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHRpc1ZpZXdXaXRoTXVsdGlwbGVWaXN1YWxpemF0aW9uczogdmlld0NvbmZpZ3VyYXRpb25cblx0XHRcdD8gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5oYXNNdWx0aXBsZVZpc3VhbGl6YXRpb25zKHZpZXdDb25maWd1cmF0aW9uKVxuXHRcdFx0OiBmYWxzZSxcblx0XHRuZXdBY3Rpb246IGdldE5ld0FjdGlvbihjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbjogdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24sXG5cdFx0cmVzdHJpY3Rpb25zOiBnZXRSZXN0cmljdGlvbnMoY29udmVydGVyQ29udGV4dClcblx0fTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgZHJhZnQgaXMgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RyYWZ0U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBib29sZWFuIHtcblx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IGJJc0RyYWZ0Um9vdCA9IGN1cnJlbnRFbnRpdHlTZXQgJiYgY3VycmVudEVudGl0eVNldC5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3QgPyB0cnVlIDogZmFsc2U7XG5cdGNvbnN0IGJJc0RyYWZ0Tm9kZSA9IGN1cnJlbnRFbnRpdHlTZXQgJiYgY3VycmVudEVudGl0eVNldC5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdE5vZGUgPyB0cnVlIDogZmFsc2U7XG5cdGNvbnN0IGJJc0RyYWZ0UGFyZW50RW50aXR5Rm9yQ29udGFpbm1lbnQgPVxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldE9iamVjdD8uY29udGFpbnNUYXJnZXQgJiZcblx0XHQoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkuc3RhcnRpbmdFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdCB8fFxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkuc3RhcnRpbmdFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Tm9kZSlcblx0XHRcdD8gdHJ1ZVxuXHRcdFx0OiBmYWxzZTtcblxuXHRyZXR1cm4gYklzRHJhZnRSb290IHx8IGJJc0RyYWZ0Tm9kZSB8fCAoIWNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkgJiYgYklzRHJhZnRQYXJlbnRFbnRpdHlGb3JDb250YWlubWVudCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHN0aWNreSBvciBkcmFmdCBpcyBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogYm9vbGVhbiB7XG5cdGNvbnN0IGJJc0RyYWZ0U3VwcG9ydGVkID0gaXNEcmFmdFN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgYklzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnN0YXJ0aW5nRW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uU2Vzc2lvblxuXHRcdD8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHRcdD8gdHJ1ZVxuXHRcdDogZmFsc2U7XG5cblx0cmV0dXJuIGJJc0RyYWZ0U3VwcG9ydGVkIHx8IGJJc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29uZmlndXJlZCBuZXdBY3Rpb24gaW50byBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMge2FueX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5ld0FjdGlvbihjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogYW55IHtcblx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IG5ld0FjdGlvbk5hbWU6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4gPSAoXG5cdFx0Y3VycmVudEVudGl0eVNldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnRSb290Py5OZXdBY3Rpb24gfHxcblx0XHRjdXJyZW50RW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZD8uTmV3QWN0aW9uXG5cdCk/LnRvU3RyaW5nKCk7XG5cdGlmIChuZXdBY3Rpb25OYW1lKSB7XG5cdFx0bGV0IGF2YWlsYWJsZVByb3BlcnR5OiBhbnkgPSBjb252ZXJ0ZXJDb250ZXh0Py5nZXRFbnRpdHlUeXBlKCkuYWN0aW9uc1tuZXdBY3Rpb25OYW1lXT8uYW5ub3RhdGlvbnM/LkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZTtcblx0XHRhdmFpbGFibGVQcm9wZXJ0eSA9IGF2YWlsYWJsZVByb3BlcnR5ICE9PSB1bmRlZmluZWQgPyBhdmFpbGFibGVQcm9wZXJ0eSA6IHRydWU7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG5hbWU6IG5ld0FjdGlvbk5hbWUsXG5cdFx0XHRhdmFpbGFibGU6IGFubm90YXRpb25FeHByZXNzaW9uKGF2YWlsYWJsZVByb3BlcnR5KVxuXHRcdH07XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBhY3Rpb24gdmlzaWJpbGl0eSBjb25maWd1cmVkIGludG8gYW5ub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBzQW5ub3RhdGlvblRlcm1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYldpdGhOYXZpZ2F0aW9uUGF0aFxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FjdGlvbkFubm90YXRlZEhpZGRlbihcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c0Fubm90YXRpb25UZXJtOiBzdHJpbmcsXG5cdGJXaXRoTmF2aWdhdGlvblBhdGggPSB0cnVlXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0Ly8gQ29uc2lkZXIgb25seSB0aGUgbGFzdCBsZXZlbCBvZiBuYXZpZ2F0aW9uLiBUaGUgb3RoZXJzIGFyZSBhbHJlYWR5IGNvbnNpZGVyZWQgaW4gdGhlIGVsZW1lbnQgYmluZGluZyBvZiB0aGUgcGFnZS5cblx0Y29uc3QgdmlzaXRlZE5hdmlnYXRpb25QYXRocyA9XG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggPiAwICYmIGJXaXRoTmF2aWdhdGlvblBhdGhcblx0XHRcdD8gW2RhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXNbZGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggLSAxXS5uYW1lXVxuXHRcdFx0OiBbXTtcblx0Y29uc3QgYWN0aW9uQW5ub3RhdGlvblZhbHVlID1cblx0XHQoKGN1cnJlbnRFbnRpdHlTZXQ/LmFubm90YXRpb25zLlVJIGFzIGFueSk/LltzQW5ub3RhdGlvblRlcm1dIGFzIFByb3BlcnR5QW5ub3RhdGlvblZhbHVlPGJvb2xlYW4+KSB8fCBmYWxzZTtcblxuXHRyZXR1cm4gY3VycmVudEVudGl0eVNldFxuXHRcdD8gYW5ub3RhdGlvbkV4cHJlc3Npb24oYWN0aW9uQW5ub3RhdGlvblZhbHVlLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCB1bmRlZmluZWQsIChwYXRoOiBzdHJpbmcpID0+XG5cdFx0XHRcdHNpbmdsZXRvblBhdGhWaXNpdG9yKHBhdGgsIGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVkVHlwZXMoKSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocylcblx0XHQgIClcblx0XHQ6IGNvbnN0YW50KGZhbHNlKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBhbm5vdGF0ZWQgcmVzdHJpY3Rpb25zIGZvciB0aGUgYWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIHtTdGFuZGFyZEFjdGlvbnNSZXN0cmljdGlvbnNUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBTdGFuZGFyZEFjdGlvbnNSZXN0cmljdGlvbnNUeXBlIHtcblx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRjb25zdCByZXN0cmljdGlvbnNEZWYgPSBbXG5cdFx0e1xuXHRcdFx0a2V5OiBcImlzSW5zZXJ0YWJsZVwiLFxuXHRcdFx0XCJmdW5jdGlvblwiOiBpc1BhdGhJbnNlcnRhYmxlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRrZXk6IFwiaXNVcGRhdGFibGVcIixcblx0XHRcdFwiZnVuY3Rpb25cIjogaXNQYXRoVXBkYXRhYmxlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRrZXk6IFwiaXNEZWxldGFibGVcIixcblx0XHRcdFwiZnVuY3Rpb25cIjogaXNQYXRoRGVsZXRhYmxlXG5cdFx0fVxuXHRdO1xuXHRjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIEV4cHJlc3Npb25SZXN0cmljdGlvbnNUeXBlPiA9IHt9O1xuXHRyZXN0cmljdGlvbnNEZWYuZm9yRWFjaChmdW5jdGlvbihkZWYpIHtcblx0XHRjb25zdCBkZWZGdW5jdGlvbiA9IGRlZltcImZ1bmN0aW9uXCJdO1xuXHRcdHJlc3VsdFtkZWYua2V5XSA9IHtcblx0XHRcdGV4cHJlc3Npb246IGRlZkZ1bmN0aW9uLmFwcGx5KG51bGwsIFtcblx0XHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHBhdGhWaXNpdG9yOiAocGF0aDogc3RyaW5nLCBuYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdKSA9PlxuXHRcdFx0XHRcdFx0c2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZWRUeXBlcygpLCBuYXZpZ2F0aW9uUGF0aHMpXG5cdFx0XHRcdH1cblx0XHRcdF0pLFxuXHRcdFx0bmF2aWdhdGlvbkV4cHJlc3Npb246IGRlZkZ1bmN0aW9uLmFwcGx5KG51bGwsIFtcblx0XHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlnbm9yZVRhcmdldENvbGxlY3Rpb246IHRydWUsXG5cdFx0XHRcdFx0YXV0aG9yaXplVW5yZXNvbHZhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHBhdGhWaXNpdG9yOiAocGF0aDogc3RyaW5nLCBuYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdKSA9PlxuXHRcdFx0XHRcdFx0c2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZWRUeXBlcygpLCBuYXZpZ2F0aW9uUGF0aHMpXG5cdFx0XHRcdH1cblx0XHRcdF0pXG5cdFx0fTtcblx0fSk7XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRlbXBsYXRpbmcgZm9yIGluc2VydC91cGRhdGUgYWN0aW9ucyBpcyBtYW5kYXRvcnkuXG4gKlxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzRHJhZnRPclN0aWNreVxuICogQHBhcmFtIHtib29sZWFufSBpc0NyZWF0ZUFsd2F5c0hpZGRlblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGluZyhcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0aXNEcmFmdE9yU3RpY2t5OiBib29sZWFuLFxuXHRpc0NyZWF0ZUFsd2F5c0hpZGRlbjogYm9vbGVhblxuKTogYm9vbGVhbiB7XG5cdHJldHVybiAoaXNEcmFmdE9yU3RpY2t5IHx8IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWwpICYmICFpc0NyZWF0ZUFsd2F5c0hpZGRlbjtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgcHJvcGVydGllcyBvZiB0aGUgYWN0aW9uIENyZWF0ZS5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7U3RhbmRhcmRBY3Rpb25zQ29udGV4dH0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHJldHVybnMge1N0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YW5kYXJkQWN0aW9uQ3JlYXRlKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4pOiBTdGFuZGFyZEFjdGlvbkNvbmZpZ1R5cGUge1xuXHRjb25zdCBjcmVhdGVWaXNpYmlsaXR5ID0gZ2V0Q3JlYXRlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0cmV0dXJuIHtcblx0XHRpc1RlbXBsYXRlZDogY29tcGlsZUJpbmRpbmcoZ2V0Q3JlYXRlVGVtcGxhdGluZyhzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBjcmVhdGVWaXNpYmlsaXR5KSksXG5cdFx0dmlzaWJsZTogY29tcGlsZUJpbmRpbmcoY3JlYXRlVmlzaWJpbGl0eSksXG5cdFx0ZW5hYmxlZDogY29tcGlsZUJpbmRpbmcoZ2V0Q3JlYXRlRW5hYmxlbWVudChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBjcmVhdGVWaXNpYmlsaXR5KSlcblx0fTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgcHJvcGVydGllcyBvZiB0aGUgYWN0aW9uIERlbGV0ZS5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7U3RhbmRhcmRBY3Rpb25zQ29udGV4dH0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHJldHVybnMge1N0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YW5kYXJkQWN0aW9uRGVsZXRlKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4pOiBTdGFuZGFyZEFjdGlvbkNvbmZpZ1R5cGUge1xuXHRjb25zdCBkZWxldGVWaXNpYmlsaXR5ID0gZ2V0RGVsZXRlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblxuXHRyZXR1cm4ge1xuXHRcdGlzVGVtcGxhdGVkOiBjb21waWxlQmluZGluZyhnZXREZWZhdWx0VGVtcGxhdGluZyhkZWxldGVWaXNpYmlsaXR5KSksXG5cdFx0dmlzaWJsZTogY29tcGlsZUJpbmRpbmcoZGVsZXRlVmlzaWJpbGl0eSksXG5cdFx0ZW5hYmxlZDogY29tcGlsZUJpbmRpbmcoZ2V0RGVsZXRlRW5hYmxlbWVudChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBkZWxldGVWaXNpYmlsaXR5KSlcblx0fTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3JlYXRpb25Sb3coXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZSB7XG5cdGNvbnN0IGNyZWF0aW9uUm93VmlzaWJpbGl0eSA9IGdldENyZWF0ZVZpc2liaWxpdHkoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgdHJ1ZSk7XG5cblx0cmV0dXJuIHtcblx0XHRpc1RlbXBsYXRlZDogY29tcGlsZUJpbmRpbmcoZ2V0Q3JlYXRlVGVtcGxhdGluZyhzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBjcmVhdGlvblJvd1Zpc2liaWxpdHksIHRydWUpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhjcmVhdGlvblJvd1Zpc2liaWxpdHkpLFxuXHRcdGVuYWJsZWQ6IGNvbXBpbGVCaW5kaW5nKGdldENyZWF0aW9uUm93RW5hYmxlbWVudChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBjcmVhdGlvblJvd1Zpc2liaWxpdHkpKVxuXHR9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhY3Rpb24gUGFzdGUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkXG4gKiBAcmV0dXJucyB7U3RhbmRhcmRBY3Rpb25Db25maWdUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25QYXN0ZShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0aXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkOiBib29sZWFuXG4pOiBTdGFuZGFyZEFjdGlvbkNvbmZpZ1R5cGUge1xuXHRjb25zdCBjcmVhdGVWaXNpYmlsaXR5ID0gZ2V0Q3JlYXRlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0Y29uc3QgY3JlYXRlRW5hYmxlbWVudCA9IGdldENyZWF0ZUVuYWJsZW1lbnQoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgY3JlYXRlVmlzaWJpbGl0eSk7XG5cdGNvbnN0IHBhc3RlVmlzaWJpbGl0eSA9IGdldFBhc3RlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBjcmVhdGVWaXNpYmlsaXR5LCBpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWQpO1xuXHRyZXR1cm4ge1xuXHRcdHZpc2libGU6IGNvbXBpbGVCaW5kaW5nKHBhc3RlVmlzaWJpbGl0eSksXG5cdFx0ZW5hYmxlZDogY29tcGlsZUJpbmRpbmcoZ2V0UGFzdGVFbmFibGVtZW50KHBhc3RlVmlzaWJpbGl0eSwgY3JlYXRlRW5hYmxlbWVudCkpXG5cdH07XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9ucyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGFjdGlvbiBNYXNzRWRpdC5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7U3RhbmRhcmRBY3Rpb25zQ29udGV4dH0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHJldHVybnMge1N0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZSB7XG5cdGNvbnN0IG1hc3NFZGl0VmlzaWJpbGl0eSA9IGdldE1hc3NFZGl0VmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblxuXHRyZXR1cm4ge1xuXHRcdGlzVGVtcGxhdGVkOiBjb21waWxlQmluZGluZyhnZXREZWZhdWx0VGVtcGxhdGluZyhtYXNzRWRpdFZpc2liaWxpdHkpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhtYXNzRWRpdFZpc2liaWxpdHkpLFxuXHRcdGVuYWJsZWQ6IGNvbXBpbGVCaW5kaW5nKGdldE1hc3NFZGl0RW5hYmxlbWVudChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBtYXNzRWRpdFZpc2liaWxpdHkpKVxuXHR9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHRlbXBsYXRpbmcgb2YgdGhlIGFjdGlvbiBDcmVhdGUuXG4gKlxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGNyZWF0ZVZpc2liaWxpdHlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNGb3JDcmVhdGlvblJvd1xuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj4gfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3JlYXRlVGVtcGxhdGluZyhcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0Y3JlYXRlVmlzaWJpbGl0eTogRXhwcmVzc2lvbjxib29sZWFuPixcblx0aXNGb3JDcmVhdGlvblJvdyA9IGZhbHNlXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Ly9UZW1wbGF0aW5nIG9mIENyZWF0ZSBCdXR0b24gaXMgbm90IGRvbmU6XG5cdC8vIFx0IC0gSWYgQnV0dG9uIGlzIG5ldmVyIHZpc2libGUoY292ZXJlZCB0aGUgRXh0ZXJuYWwgY3JlYXRlIGJ1dHRvbiwgbmV3IEFjdGlvbilcblx0Ly9cdCAtIG9yIENyZWF0aW9uTW9kZSBpcyBvbiBDcmVhdGlvblJvdyBmb3IgQ3JlYXRlIEJ1dHRvblxuXHQvL1x0IC0gb3IgQ3JlYXRpb25Nb2RlIGlzIG5vdCBvbiBDcmVhdGlvblJvdyBmb3IgQ3JlYXRpb25Sb3cgQnV0dG9uXG5cblx0cmV0dXJuIGFuZChcblx0XHQvL1hOT1IgZ2F0ZVxuXHRcdG9yKFxuXHRcdFx0YW5kKGlzRm9yQ3JlYXRpb25Sb3csIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cpLFxuXHRcdFx0YW5kKCFpc0ZvckNyZWF0aW9uUm93LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93KVxuXHRcdCksXG5cdFx0b3Iobm90KGlzQ29uc3RhbnQoY3JlYXRlVmlzaWJpbGl0eSkpLCBjcmVhdGVWaXNpYmlsaXR5KVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHRlbXBsYXRpbmcgb2YgdGhlIG5vbi1DcmVhdGUgYWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGFjdGlvblZpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRUZW1wbGF0aW5nKGFjdGlvblZpc2liaWxpdHk6IEV4cHJlc3Npb248Ym9vbGVhbj4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIG9yKG5vdChpc0NvbnN0YW50KGFjdGlvblZpc2liaWxpdHkpKSwgYWN0aW9uVmlzaWJpbGl0eSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgcHJvcGVydHkgdmlzaWJsZSBvZiB0aGUgYWN0aW9uIENyZWF0ZS5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7U3RhbmRhcmRBY3Rpb25zQ29udGV4dH0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHBhcmFtIHtib29sZWFufSBpc0ZvckNyZWF0aW9uUm93XG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDcmVhdGVWaXNpYmlsaXR5KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRpc0ZvckNyZWF0aW9uUm93ID0gZmFsc2Vcbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0luc2VydGFibGUgPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc0luc2VydGFibGUuZXhwcmVzc2lvbjtcblx0Y29uc3QgaXNDcmVhdGVIaWRkZW4gPSBpc0ZvckNyZWF0aW9uUm93XG5cdFx0PyBpc0FjdGlvbkFubm90YXRlZEhpZGRlbihjb252ZXJ0ZXJDb250ZXh0LCBBbm5vdGF0aW9uSGlkZGVuUHJvcGVydHkuQ3JlYXRlSGlkZGVuLCBmYWxzZSlcblx0XHQ6IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuaGlkZGVuQW5ub3RhdGlvbi5jcmVhdGU7XG5cdGNvbnN0IG5ld0FjdGlvbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQubmV3QWN0aW9uO1xuXG5cdC8vQ3JlYXRlIEJ1dHRvbiBpcyB2aXNpYmxlOlxuXHQvLyBcdCAtIElmIHRoZSBjcmVhdGlvbiBtb2RlIGlzIGV4dGVybmFsXG5cdC8vICAgICAgLSBJZiB3ZSdyZSBvbiB0aGUgbGlzdCByZXBvcnQgYW5kIGNyZWF0ZSBpcyBub3QgaGlkZGVuXG5cdC8vXHRcdC0gT3RoZXJ3aXNlIHRoaXMgZGVwZW5kcyBvbiB0aGUgdmFsdWUgb2YgdGhlIHRoZSBVSS5Jc0VkaXRhYmxlXG5cdC8vICAgLSBPdGhlcndpc2Vcblx0Ly8gXHQgXHQtIElmIHdlJ3JlIG9uIHRoZSBsaXN0IHJlcG9ydCAtPlxuXHQvLyBcdCBcdFx0LSBJZiBVSS5DcmVhdGVIaWRkZW4gcG9pbnRzIHRvIGEgcHJvcGVydHkgcGF0aCAtPiBwcm92aWRlIGEgbmVnYXRlZCBiaW5kaW5nIHRvIHRoaXMgcGF0aFxuXHQvLyBcdCBcdFx0LSBPdGhlcndpc2UsIGNyZWF0ZSBpcyB2aXNpYmxlXG5cdC8vIFx0IFx0LSBPdGhlcndpc2Vcblx0Ly8gXHQgIFx0IC0gVGhpcyBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZiB0aGUgdGhlIFVJLklzRWRpdGFibGVcblx0cmV0dXJuIGlmRWxzZShcblx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkV4dGVybmFsLFxuXHRcdGFuZChub3QoaXNDcmVhdGVIaWRkZW4pLCBvcihjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCwgVUkuSXNFZGl0YWJsZSkpLFxuXHRcdGlmRWxzZShcblx0XHRcdG9yKFxuXHRcdFx0XHRhbmQoaXNDb25zdGFudChuZXdBY3Rpb24/LmF2YWlsYWJsZSksIGVxdWFsKG5ld0FjdGlvbj8uYXZhaWxhYmxlLCBmYWxzZSkpLFxuXHRcdFx0XHRhbmQoaXNDb25zdGFudChpc0luc2VydGFibGUpLCBlcXVhbChpc0luc2VydGFibGUsIGZhbHNlKSwgIW5ld0FjdGlvbiksXG5cdFx0XHRcdGFuZChpc0NvbnN0YW50KGlzQ3JlYXRlSGlkZGVuKSwgZXF1YWwoaXNDcmVhdGVIaWRkZW4sIHRydWUpKSxcblx0XHRcdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dC5pc1ZpZXdXaXRoTXVsdGlwbGVWaXN1YWxpemF0aW9ucyxcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZVxuXHRcdFx0KSxcblx0XHRcdGZhbHNlLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCxcblx0XHRcdFx0b3Iobm90KGlzQmluZGluZyhpc0NyZWF0ZUhpZGRlbikpLCBub3QoaXNDcmVhdGVIaWRkZW4pKSxcblx0XHRcdFx0YW5kKG5vdChpc0NyZWF0ZUhpZGRlbiksIFVJLklzRWRpdGFibGUpXG5cdFx0XHQpXG5cdFx0KVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHByb3BlcnR5IHZpc2libGUgb2YgdGhlIGFjdGlvbiBEZWxldGUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlbGV0ZVZpc2liaWxpdHkoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0RlbGV0ZUhpZGRlbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuaGlkZGVuQW5ub3RhdGlvbi5kZWxldGU7XG5cdGNvbnN0IHBhdGhEZWxldGFibGVFeHByZXNzaW9uID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNEZWxldGFibGUuZXhwcmVzc2lvbjtcblxuXHQvL0RlbGV0ZSBCdXR0b24gaXMgdmlzaWJsZTpcblx0Ly8gXHQgUHJlcmVxdWlzaXRlczpcblx0Ly9cdCAtIElmIHdlJ3JlIG5vdCBvbiBtdWx0aXBsZSB2aXN1YWxpemF0aW9ucyBjb25maWd1cmF0aW9uIG9yIEFMUFxuXHQvL1xuXHQvLyAgIC0gSWYgcmVzdHJpY3Rpb25zIG9uIGRlbGV0YWJsZSBzZXQgdG8gZmFsc2UgLT4gbm90IHZpc2libGVcblx0Ly8gICAtIE90aGVyd2lzZVxuXHQvL1x0XHRcdC0gSWYgVUkuRGVsZXRlSGlkZGVuIGlzIHRydWUgLT4gbm90IHZpc2libGVcblx0Ly9cdFx0XHQtIE90aGVyd2lzZVxuXHQvLyBcdCBcdFx0XHQtIElmIHdlJ3JlIG9uIE9QIC0+IGRlcGVuZGluZyBvZiB0aGUgZWRpdE1vZGUgYW5kIHJlc3RyaWN0aW9ucyBvbiBkZWxldGFibGVcblx0Ly9cdFx0XHRcdC0gT3RoZXJ3aXNlXG5cdC8vXHRcdFx0XHQgXHQtIElmIFVJLkRlbGV0ZUhpZGRlbiBwb2ludHMgdG8gYSBwcm9wZXJ0eSBwYXRoIC0+IHByb3ZpZGUgYSBuZWdhdGVkIGJpbmRpbmcgdG8gdGhpcyBwYXRoXG5cdC8vXHQgXHQgXHRcdCBcdC0gT3RoZXJ3aXNlLCBkZWxldGUgaXMgdmlzaWJsZVxuXG5cdHJldHVybiBpZkVsc2UoXG5cdFx0b3Ioc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5pc1ZpZXdXaXRoTXVsdGlwbGVWaXN1YWxpemF0aW9ucywgY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZSksXG5cdFx0ZmFsc2UsXG5cdFx0aWZFbHNlKFxuXHRcdFx0YW5kKGlzQ29uc3RhbnQocGF0aERlbGV0YWJsZUV4cHJlc3Npb24pLCBlcXVhbChwYXRoRGVsZXRhYmxlRXhwcmVzc2lvbiwgZmFsc2UpKSxcblx0XHRcdGZhbHNlLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRhbmQoaXNDb25zdGFudChpc0RlbGV0ZUhpZGRlbiksIGVxdWFsKGlzRGVsZXRlSGlkZGVuLCBjb25zdGFudCh0cnVlKSkpLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0LFxuXHRcdFx0XHRcdGFuZChub3QoaXNEZWxldGVIaWRkZW4pLCBlcXVhbChiaW5kaW5nRXhwcmVzc2lvbihcIi9lZGl0TW9kZVwiLCBcInVpXCIpLCBcIkVkaXRhYmxlXCIpKSxcblx0XHRcdFx0XHRub3QoYW5kKGlzQmluZGluZyhpc0RlbGV0ZUhpZGRlbiksIGlzRGVsZXRlSGlkZGVuKSlcblx0XHRcdFx0KVxuXHRcdFx0KVxuXHRcdClcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2aXNpYmxlIG9mIHRoZSBhY3Rpb24gUGFzdGUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7RXhwcmVzc2lvbjxib29sZWFuPn0gY3JlYXRlVmlzaWJpbGl0eVxuICogQHBhcmFtIHtib29sZWFufSBpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWRcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhc3RlVmlzaWJpbGl0eShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0Y3JlYXRlVmlzaWJpbGl0eTogRXhwcmVzc2lvbjxib29sZWFuPixcblx0aXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkOiBib29sZWFuXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Ly8gSWYgQ3JlYXRlIGlzIHZpc2libGUsIGVuYWJsZVBhc3RlIGlzIG5vdCBkaXNhYmxlZCBpbnRvIG1hbmlmZXN0IGFuZCB3ZSBhcmUgb24gT1AvYmxvY2tzIG91dHNpZGUgRmlvcmkgZWxlbWVudHMgdGVtcGxhdGVzXG5cdC8vIFRoZW4gYnV0dG9uIHdpbGwgYmUgdmlzaWJsZSBhY2NvcmRpbmcgdG8gaW5zZXJ0YWJsZSByZXN0cmljdGlvbnMgYW5kIGNyZWF0ZSB2aXNpYmlsaXR5XG5cdC8vIE90aGVyd2lzZSBpdCdzIG5vdCB2aXNpYmxlXG5cdHJldHVybiBhbmQoXG5cdFx0bm90RXF1YWwoc3RhbmRhcmRBY3Rpb25zQ29udGV4dC50YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5lbmFibGVQYXN0ZSwgZmFsc2UpLFxuXHRcdGNyZWF0ZVZpc2liaWxpdHksXG5cdFx0aXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkLFxuXHRcdFtUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCwgVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZV0uaW5kZXhPZihjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpKSA9PT0gLTEsXG5cdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNJbnNlcnRhYmxlLmV4cHJlc3Npb25cblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2aXNpYmxlIG9mIHRoZSBhY3Rpb24gTWFzc0VkaXQuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1hc3NFZGl0VmlzaWJpbGl0eShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGlzVXBkYXRlSGlkZGVuID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5oaWRkZW5Bbm5vdGF0aW9uLnVwZGF0ZSxcblx0XHRwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzVXBkYXRhYmxlLmV4cHJlc3Npb24sXG5cdFx0Yk1hc3NFZGl0RW5hYmxlZEluTWFuaWZlc3Q6IGJvb2xlYW4gPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPy5lbmFibGVNYXNzRWRpdCB8fCBmYWxzZTtcblx0Y29uc3QgdGVtcGxhdGVCaW5kaW5nRXhwcmVzc2lvbiA9XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLk9iamVjdFBhZ2Vcblx0XHRcdD8gZXF1YWwoVUkuSXNFZGl0YWJsZSwgdHJ1ZSlcblx0XHRcdDogY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQ7XG5cdC8vTWFzc0VkaXQgaXMgdmlzaWJsZVxuXHQvLyBJZlxuXHQvL1x0XHQtIHRoZXJlIGlzIG5vIHN0YXRpYyByZXN0cmljdGlvbnMgc2V0IHRvIGZhbHNlXG5cdC8vXHRcdC0gYW5kIGVuYWJsZU1hc3NFZGl0IGlzIG5vdCBzZXQgdG8gZmFsc2UgaW50byB0aGUgbWFuaWZlc3Rcblx0Ly9cdFx0LSBhbmQgdGhlIHNlbGVjdGlvbk1vZGUgaXMgcmVsZXZhbnRcblx0Ly9cdFRoZW4gTWFzc0VkaXQgaXMgYWx3YXlzIHZpc2libGUgaW4gTFIgb3IgZHluYW1pY2FsbHkgdmlzaWJsZSBpbiBPUCBhY2NvcmRpbmcgdG8gdWk+RWRpdGFibGUgYW5kIGhpZGRlbkFubm90YXRpb25cblx0Ly8gIEJ1dHRvbiBpcyBoaWRkZW4gZm9yIGFsbCBvdGhlciBjYXNlc1xuXHRyZXR1cm4gYW5kKFxuXHRcdG5vdChhbmQoaXNDb25zdGFudChwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiksIGVxdWFsKHBhdGhVcGRhdGFibGVFeHByZXNzaW9uLCBmYWxzZSkpKSxcblx0XHRiTWFzc0VkaXRFbmFibGVkSW5NYW5pZmVzdCxcblx0XHR0ZW1wbGF0ZUJpbmRpbmdFeHByZXNzaW9uLFxuXHRcdG5vdChpc1VwZGF0ZUhpZGRlbilcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSBlbmFibGVkIG9mIHRoZSBjcmVhdGlvblJvdy5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7U3RhbmRhcmRBY3Rpb25zQ29udGV4dH0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHBhcmFtIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBjcmVhdGlvblJvd1Zpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENyZWF0aW9uUm93RW5hYmxlbWVudChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0Y3JlYXRpb25Sb3dWaXNpYmlsaXR5OiBFeHByZXNzaW9uPGJvb2xlYW4+XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgcmVzdHJpY3Rpb25zSW5zZXJ0YWJsZSA9IGlzUGF0aEluc2VydGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksIHtcblx0XHRpZ25vcmVUYXJnZXRDb2xsZWN0aW9uOiB0cnVlLFxuXHRcdGF1dGhvcml6ZVVucmVzb2x2YWJsZTogdHJ1ZSxcblx0XHRwYXRoVmlzaXRvcjogKHBhdGg6IHN0cmluZywgbmF2aWdhdGlvblBhdGhzOiBzdHJpbmdbXSkgPT4ge1xuXHRcdFx0aWYgKHBhdGguaW5kZXhPZihcIi9cIikgPT09IDApIHtcblx0XHRcdFx0cGF0aCA9IHNpbmdsZXRvblBhdGhWaXNpdG9yKHBhdGgsIGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVkVHlwZXMoKSwgbmF2aWdhdGlvblBhdGhzKTtcblx0XHRcdFx0cmV0dXJuIHBhdGg7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllcyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLm5hdmlnYXRpb25Qcm9wZXJ0aWVzO1xuXHRcdFx0aWYgKG5hdmlnYXRpb25Qcm9wZXJ0aWVzKSB7XG5cdFx0XHRcdGNvbnN0IHBhcnRuZXIgPSBuYXZpZ2F0aW9uUHJvcGVydGllc1tuYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggLSAxXS5wYXJ0bmVyO1xuXHRcdFx0XHRpZiAocGFydG5lcikge1xuXHRcdFx0XHRcdHBhdGggPSBgJHtwYXJ0bmVyfS8ke3BhdGh9YDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHBhdGg7XG5cdFx0fVxuXHR9KTtcblx0Y29uc3QgaXNJbnNlcnRhYmxlID1cblx0XHRyZXN0cmljdGlvbnNJbnNlcnRhYmxlLl90eXBlID09PSBcIlVucmVzb2x2YWJsZVwiXG5cdFx0XHQ/IGlzUGF0aEluc2VydGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksIHtcblx0XHRcdFx0XHRwYXRoVmlzaXRvcjogKHBhdGg6IHN0cmluZykgPT4gc2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZWRUeXBlcygpLCBbXSlcblx0XHRcdCAgfSlcblx0XHRcdDogcmVzdHJpY3Rpb25zSW5zZXJ0YWJsZTtcblxuXHRyZXR1cm4gYW5kKFxuXHRcdGNyZWF0aW9uUm93VmlzaWJpbGl0eSxcblx0XHRpc0luc2VydGFibGUsXG5cdFx0b3IoXG5cdFx0XHQhc3RhbmRhcmRBY3Rpb25zQ29udGV4dC50YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5kaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhLFxuXHRcdFx0Zm9ybWF0UmVzdWx0KFtiaW5kaW5nRXhwcmVzc2lvbihcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCBcImludGVybmFsXCIpXSwgdGFibGVGb3JtYXR0ZXJzLnZhbGlkYXRlQ3JlYXRpb25Sb3dGaWVsZHMpXG5cdFx0KVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHByb3BlcnR5IGVuYWJsZWQgb2YgdGhlIGFjdGlvbiBDcmVhdGUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7RXhwcmVzc2lvbjxib29sZWFuPn0gY3JlYXRlVmlzaWJpbGl0eVxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj4gfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3JlYXRlRW5hYmxlbWVudChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0Y3JlYXRlVmlzaWJpbGl0eTogRXhwcmVzc2lvbjxib29sZWFuPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGlzSW5zZXJ0YWJsZSA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzSW5zZXJ0YWJsZS5leHByZXNzaW9uO1xuXHRjb25zdCBDb2xsZWN0aW9uVHlwZSA9IGNvbnZlcnRlckNvbnRleHQucmVzb2x2ZUFic29sdXRlUGF0aDxhbnk+KHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuY29sbGVjdGlvblBhdGgpLnRhcmdldD8uX3R5cGU7XG5cdHJldHVybiBhbmQoXG5cdFx0Y3JlYXRlVmlzaWJpbGl0eSxcblx0XHRvcihcblx0XHRcdENvbGxlY3Rpb25UeXBlID09PSBcIkVudGl0eVNldFwiLFxuXHRcdFx0YW5kKFxuXHRcdFx0XHRpc0luc2VydGFibGUsXG5cdFx0XHRcdG9yKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5PYmplY3RQYWdlLCBlcXVhbChiaW5kaW5nRXhwcmVzc2lvbihcIi9lZGl0TW9kZVwiLCBcInVpXCIpLCBcIkVkaXRhYmxlXCIpKVxuXHRcdFx0KVxuXHRcdClcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSBlbmFibGVkIG9mIHRoZSBhY3Rpb24gRGVsZXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGRlbGV0ZVZpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlbGV0ZUVuYWJsZW1lbnQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGRlbGV0ZVZpc2liaWxpdHk6IEV4cHJlc3Npb248Ym9vbGVhbj5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0RlbGV0YWJsZSA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzRGVsZXRhYmxlLmV4cHJlc3Npb247XG5cdGNvbnN0IGlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkgPVxuXHRcdCFpc0NvbnN0YW50KGlzRGVsZXRhYmxlKSAmJiBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc0RlbGV0YWJsZS5uYXZpZ2F0aW9uRXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJVbnJlc29sdmFibGVcIjtcblx0Y29uc3QgbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID0gYmluZGluZ0V4cHJlc3Npb24oXCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcIiwgXCJpbnRlcm5hbFwiKTtcblx0Y29uc3QgbnVtYmVyT2ZEZWxldGFibGVDb250ZXh0cyA9IGJpbmRpbmdFeHByZXNzaW9uKFwiZGVsZXRhYmxlQ29udGV4dHNcIiwgXCJpbnRlcm5hbFwiKTtcblx0Y29uc3QgbnVtYmVyT2ZVblNhdmVkQ29udGV4dHMgPSBiaW5kaW5nRXhwcmVzc2lvbihcInVuU2F2ZWRDb250ZXh0c1wiLCBcImludGVybmFsXCIpO1xuXG5cdHJldHVybiBhbmQoXG5cdFx0ZGVsZXRlVmlzaWJpbGl0eSxcblx0XHRpZkVsc2UoXG5cdFx0XHRvcihjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuT2JqZWN0UGFnZSwgaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSksXG5cdFx0XHRhbmQoXG5cdFx0XHRcdG9yKFxuXHRcdFx0XHRcdGFuZChub3RFcXVhbChudW1iZXJPZkRlbGV0YWJsZUNvbnRleHRzLCB1bmRlZmluZWQpLCBncmVhdGVyVGhhbihsZW5ndGgobnVtYmVyT2ZEZWxldGFibGVDb250ZXh0cyksIDApKSxcblx0XHRcdFx0XHRhbmQobm90RXF1YWwobnVtYmVyT2ZVblNhdmVkQ29udGV4dHMsIHVuZGVmaW5lZCksIGdyZWF0ZXJUaGFuKGxlbmd0aChudW1iZXJPZlVuU2F2ZWRDb250ZXh0cyksIDApKVxuXHRcdFx0XHQpLFxuXHRcdFx0XHRiaW5kaW5nRXhwcmVzc2lvbihcImRlbGV0ZUVuYWJsZWRcIiwgXCJpbnRlcm5hbFwiKVxuXHRcdFx0KSxcblx0XHRcdGFuZChub3RFcXVhbChudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMsIDApLCBpc0RlbGV0YWJsZSlcblx0XHQpXG5cdCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgcHJvcGVydHkgZW5hYmxlZCBvZiB0aGUgYWN0aW9uIFBhc3RlLlxuICpcbiAqIEBwYXJhbSB7RXhwcmVzc2lvbjxib29sZWFuPn0gcGFzdGVWaXNpYmlsaXR5XG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGNyZWF0ZUVuYWJsZW1lbnRcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhc3RlRW5hYmxlbWVudChwYXN0ZVZpc2liaWxpdHk6IEV4cHJlc3Npb248Ym9vbGVhbj4sIGNyZWF0ZUVuYWJsZW1lbnQ6IEV4cHJlc3Npb248Ym9vbGVhbj4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGFuZChwYXN0ZVZpc2liaWxpdHksIGNyZWF0ZUVuYWJsZW1lbnQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHByb3BlcnR5IGVuYWJsZWQgb2YgdGhlIGFjdGlvbiBNYXNzRWRpdC5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7U3RhbmRhcmRBY3Rpb25zQ29udGV4dH0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHBhcmFtIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBtYXNzRWRpdFZpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1hc3NFZGl0RW5hYmxlbWVudChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0bWFzc0VkaXRWaXNpYmlsaXR5OiBFeHByZXNzaW9uPGJvb2xlYW4+XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgcGF0aFVwZGF0YWJsZUV4cHJlc3Npb24gPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc1VwZGF0YWJsZS5leHByZXNzaW9uO1xuXHRjb25zdCBpc09ubHlEeW5hbWljT25DdXJyZW50RW50aXR5OiBhbnkgPVxuXHRcdCFpc0NvbnN0YW50KHBhdGhVcGRhdGFibGVFeHByZXNzaW9uKSAmJlxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzVXBkYXRhYmxlLm5hdmlnYXRpb25FeHByZXNzaW9uLl90eXBlID09PSBcIlVucmVzb2x2YWJsZVwiO1xuXHRjb25zdCBudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPSBncmVhdGVyT3JFcXVhbChiaW5kaW5nRXhwcmVzc2lvbihcIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1wiLCBcImludGVybmFsXCIpLCAxKTtcblx0Y29uc3QgbnVtYmVyT2ZVcGRhdGFibGVDb250ZXh0cyA9IGdyZWF0ZXJPckVxdWFsKGxlbmd0aChiaW5kaW5nRXhwcmVzc2lvbihcInVwZGF0YWJsZUNvbnRleHRzXCIsIFwiaW50ZXJuYWxcIikpLCAxKTtcblx0Y29uc3QgYklzRHJhZnRTdXBwb3J0ZWQgPSBpc0RyYWZ0U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBiRGlzcGxheU1vZGUgPSBpc0luRGlzcGxheU1vZGUoY29udmVydGVyQ29udGV4dCk7XG5cblx0Ly8gbnVtYmVyT2ZVcGRhdGFibGVDb250ZXh0cyBuZWVkcyB0byBiZSBhZGRlZCB0byB0aGUgYmluZGluZyBpbiBjYXNlXG5cdC8vIDEuIFVwZGF0ZSBpcyBkZXBlbmRlbnQgb24gY3VycmVudCBlbnRpdHkgcHJvcGVydHkgKGlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkgaXMgdHJ1ZSkuXG5cdC8vIDIuIFRoZSB0YWJsZSBpcyByZWFkIG9ubHkgYW5kIGRyYWZ0IGVuYWJsZWQobGlrZSBMUiksIGluIHRoaXMgY2FzZSBvbmx5IGFjdGl2ZSBjb250ZXh0cyBjYW4gYmUgbWFzcyBlZGl0ZWQuXG5cdC8vICAgIFNvLCB1cGRhdGUgZGVwZW5kcyBvbiAnSXNBY3RpdmVFbnRpdHknIHZhbHVlIHdoaWNoIG5lZWRzIHRvIGJlIGNoZWNrZWQgcnVudGltZS5cblx0Y29uc3QgcnVudGltZUJpbmRpbmcgPSBpZkVsc2UoXG5cdFx0b3IoYW5kKGJEaXNwbGF5TW9kZSwgYklzRHJhZnRTdXBwb3J0ZWQpLCBpc09ubHlEeW5hbWljT25DdXJyZW50RW50aXR5KSxcblx0XHRhbmQobnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzLCBudW1iZXJPZlVwZGF0YWJsZUNvbnRleHRzKSxcblx0XHRhbmQobnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzKVxuXHQpO1xuXG5cdHJldHVybiBhbmQobWFzc0VkaXRWaXNpYmlsaXR5LCBpZkVsc2UoaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSwgcnVudGltZUJpbmRpbmcsIGFuZChydW50aW1lQmluZGluZywgcGF0aFVwZGF0YWJsZUV4cHJlc3Npb24pKSk7XG59XG5cbi8qKlxuICogVGVsbHMgaWYgdGhlIHRhYmxlIGluIHRlbXBsYXRlIGlzIGluIGRpc3BsYXkgbW9kZS5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7Vmlld1BhdGhDb25maWd1cmF0aW9ufSB2aWV3Q29uZmlndXJhdGlvblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0luRGlzcGxheU1vZGUoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgdmlld0NvbmZpZ3VyYXRpb24/OiBWaWV3UGF0aENvbmZpZ3VyYXRpb24pOiBib29sZWFuIHtcblx0Y29uc3QgdGVtcGxhdGVUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKTtcblx0aWYgKFxuXHRcdHRlbXBsYXRlVHlwZSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQgfHxcblx0XHR0ZW1wbGF0ZVR5cGUgPT09IFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2UgfHxcblx0XHQodmlld0NvbmZpZ3VyYXRpb24gJiYgY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5oYXNNdWx0aXBsZVZpc3VhbGl6YXRpb25zKHZpZXdDb25maWd1cmF0aW9uKSlcblx0KSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0Ly8gdXBkYXRhYmxlIHdpbGwgYmUgaGFuZGxlZCBhdCB0aGUgcHJvcGVydHkgbGV2ZWxcblx0cmV0dXJuIGZhbHNlO1xufVxuIl19