@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
@@ -5,14 +5,6 @@
5
5
  sap.ui.define(["sap/fe/core/actions/draft", "sap/fe/core/actions/sticky", "sap/fe/core/actions/operations", "sap/ui/model/json/JSONModel", "sap/m/Popover", "sap/m/VBox", "sap/m/CheckBox", "sap/m/Text", "sap/m/Button", "sap/m/MessageToast", "sap/m/Dialog", "sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/BusyLocker", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/core/Fragment", "sap/m/MessageBox", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/library", "sap/ui/core/library", "sap/fe/core/actions/messageHandling", "sap/fe/core/helpers/FPMHelper"], function (draft, sticky, operations, JSONModel, Popover, VBox, CheckBox, Text, Button, MessageToast, Dialog, Log, CommonUtils, BusyLocker, XMLPreprocessor, XMLTemplateProcessor, Fragment, MessageBox, ModelHelper, FELibrary, coreLibrary, messageHandling, FPMHelper) {
6
6
  "use strict";
7
7
 
8
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
9
-
10
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
11
-
12
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
13
-
14
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
15
-
16
8
  var CreationMode = FELibrary.CreationMode;
17
9
  var ProgrammingModel = FELibrary.ProgrammingModel;
18
10
  var ValueState = coreLibrary.ValueState;
@@ -28,1551 +20,1543 @@ sap.ui.define(["sap/fe/core/actions/draft", "sap/fe/core/actions/sticky", "sap/f
28
20
 
29
21
  var TransactionHelper = /*#__PURE__*/function () {
30
22
  function TransactionHelper(oAppComponent, oLockObject) {
31
- _classCallCheck(this, TransactionHelper);
32
-
33
- _defineProperty(this, "_bIsModified", false);
34
-
35
- _defineProperty(this, "_bCreateMode", false);
36
-
37
- _defineProperty(this, "_bContinueDiscard", false);
38
-
23
+ this._bIsModified = false;
24
+ this._bCreateMode = false;
25
+ this._bContinueDiscard = false;
39
26
  this._oAppComponent = oAppComponent;
40
27
  this.oLockObject = oLockObject;
41
28
  }
42
29
 
43
- _createClass(TransactionHelper, [{
44
- key: "getProgrammingModel",
45
- value: function getProgrammingModel(oContext) {
46
- if (!this.sProgrammingModel && oContext) {
47
- var sPath;
30
+ var _proto = TransactionHelper.prototype;
48
31
 
49
- if (oContext.isA("sap.ui.model.odata.v4.Context")) {
50
- sPath = oContext.getPath();
51
- } else {
52
- sPath = oContext.isRelative() ? oContext.getResolvedPath() : oContext.getPath();
53
- }
32
+ _proto.getProgrammingModel = function getProgrammingModel(oContext) {
33
+ if (!this.sProgrammingModel && oContext) {
34
+ var sPath;
54
35
 
55
- if (ModelHelper.isDraftSupported(oContext.getModel().getMetaModel(), sPath)) {
56
- this.sProgrammingModel = ProgrammingModel.Draft;
57
- } else if (ModelHelper.isStickySessionSupported(oContext.getModel().getMetaModel())) {
58
- this.sProgrammingModel = ProgrammingModel.Sticky;
59
- } else {
60
- // as the transaction helper is a singleton we don't store the non draft as the user could
61
- // start with a non draft child page and navigates back to a draft enabled one
62
- return ProgrammingModel.NonDraft;
63
- }
36
+ if (oContext.isA("sap.ui.model.odata.v4.Context")) {
37
+ sPath = oContext.getPath();
38
+ } else {
39
+ sPath = oContext.isRelative() ? oContext.getResolvedPath() : oContext.getPath();
64
40
  }
65
41
 
66
- return this.sProgrammingModel;
67
- }
68
- /**
69
- * Validates a document.
70
- *
71
- * @memberof sap.fe.core.TransactionHelper
72
- * @static
73
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be validated
74
- * @param {object} [mParameters] Can contain the following attributes:
75
- * * @param {object} [mParameters.data] A map of data that should be validated
76
- * * @param {string} [mParameters.customValidationFunction] A string representing the path to the validation function
77
- * @param {object} oView Contains the object of the current view
78
- * @returns {Promise} Promise resolves with result of the custom validation function
79
- * @ui5-restricted
80
- * @final
81
- */
82
-
83
- }, {
84
- key: "validateDocument",
85
- value: function validateDocument(oContext, mParameters, oView) {
86
- var sCustomValidationFunction = mParameters && mParameters.customValidationFunction;
87
-
88
- if (sCustomValidationFunction) {
89
- var sModule = sCustomValidationFunction.substring(0, sCustomValidationFunction.lastIndexOf(".") || -1).replace(/\./gi, "/"),
90
- sFunctionName = sCustomValidationFunction.substring(sCustomValidationFunction.lastIndexOf(".") + 1, sCustomValidationFunction.length),
91
- mData = mParameters.data;
92
- delete mData["@$ui5.context.isTransient"];
93
- return FPMHelper.validationWrapper(sModule, sFunctionName, mData, oView, oContext);
42
+ if (ModelHelper.isDraftSupported(oContext.getModel().getMetaModel(), sPath)) {
43
+ this.sProgrammingModel = ProgrammingModel.Draft;
44
+ } else if (ModelHelper.isStickySessionSupported(oContext.getModel().getMetaModel())) {
45
+ this.sProgrammingModel = ProgrammingModel.Sticky;
46
+ } else {
47
+ // as the transaction helper is a singleton we don't store the non draft as the user could
48
+ // start with a non draft child page and navigates back to a draft enabled one
49
+ return ProgrammingModel.NonDraft;
94
50
  }
51
+ }
95
52
 
96
- return Promise.resolve([]);
53
+ return this.sProgrammingModel;
54
+ }
55
+ /**
56
+ * Validates a document.
57
+ *
58
+ * @memberof sap.fe.core.TransactionHelper
59
+ * @static
60
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be validated
61
+ * @param {object} [mParameters] Can contain the following attributes:
62
+ * * @param {object} [mParameters.data] A map of data that should be validated
63
+ * * @param {string} [mParameters.customValidationFunction] A string representing the path to the validation function
64
+ * @param {object} oView Contains the object of the current view
65
+ * @returns {Promise} Promise resolves with result of the custom validation function
66
+ * @ui5-restricted
67
+ * @final
68
+ */
69
+ ;
70
+
71
+ _proto.validateDocument = function validateDocument(oContext, mParameters, oView) {
72
+ var sCustomValidationFunction = mParameters && mParameters.customValidationFunction;
73
+
74
+ if (sCustomValidationFunction) {
75
+ var sModule = sCustomValidationFunction.substring(0, sCustomValidationFunction.lastIndexOf(".") || -1).replace(/\./gi, "/"),
76
+ sFunctionName = sCustomValidationFunction.substring(sCustomValidationFunction.lastIndexOf(".") + 1, sCustomValidationFunction.length),
77
+ mData = mParameters.data;
78
+ delete mData["@$ui5.context.isTransient"];
79
+ return FPMHelper.validationWrapper(sModule, sFunctionName, mData, oView, oContext);
97
80
  }
98
- /**
99
- * Creates a new document.
100
- *
101
- * @memberof sap.fe.core.TransactionHelper
102
- * @static
103
- * @param {sap.ui.model.odata.v4.ODataListBinding} oMainListBinding OData V4 ListBinding object
104
- * @param {object} [mInParameters] Optional, can contain the following attributes:
105
- * @param {map} [mInParameters.data] A map of data that should be sent within the POST
106
- * @param {string} [mInParameters.busyMode] Global (default), Local, None TODO: to be refactored
107
- * @param {map} [mInParameters.keepTransientContextOnFailed] If set, the context stays in the list if the POST failed and POST will be repeated with the next change
108
- * @param oResourceBundle
109
- * @param messageHandler
110
- * @param bFromCopyPaste
111
- * @param oView The current view
112
- * @returns {Promise} Promise resolves with new binding context
113
- * @ui5-restricted
114
- * @final
115
- */
116
-
117
- }, {
118
- key: "createDocument",
119
- value: function createDocument(oMainListBinding, mInParameters, oResourceBundle, messageHandler, bFromCopyPaste, oView) {
120
- // eslint-disable-next-line @typescript-eslint/no-this-alias
121
- var that = this,
122
- oModel = oMainListBinding.getModel(),
123
- oMetaModel = oModel.getMetaModel(),
124
- sMetaPath = oMetaModel.getMetaPath(oMainListBinding.getHeaderContext().getPath()),
125
- sCreateHash = this._getAppComponent().getRouterProxy().getHash(),
126
- oComponentData = this._getAppComponent().getComponentData(),
127
- oStartupParameters = oComponentData && oComponentData.startupParameters || {},
128
- sNewAction = !oMainListBinding.isRelative() ? this._getNewAction(oStartupParameters, sCreateHash, oMetaModel, sMetaPath) : undefined;
129
-
130
- var oCreationPromise;
131
- var mBindingParameters = {
132
- "$$patchWithoutSideEffects": true
133
- };
134
- var sMessagesPath = oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path");
135
- var sBusyPath = "/busy";
136
- var sFunctionName = oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Common.v1.DefaultValuesFunction") || oMetaModel.getObject(ModelHelper.getTargetEntitySet(oMetaModel.getContext(sMetaPath)) + "@com.sap.vocabularies.Common.v1.DefaultValuesFunction");
137
- var bFunctionOnNavProp;
138
- var oNewDocumentContext;
139
81
 
140
- if (sFunctionName) {
141
- if (oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Common.v1.DefaultValuesFunction") && ModelHelper.getTargetEntitySet(oMetaModel.getContext(sMetaPath)) !== sMetaPath) {
142
- bFunctionOnNavProp = true;
143
- } else {
144
- bFunctionOnNavProp = false;
145
- }
82
+ return Promise.resolve([]);
83
+ }
84
+ /**
85
+ * Creates a new document.
86
+ *
87
+ * @memberof sap.fe.core.TransactionHelper
88
+ * @static
89
+ * @param {sap.ui.model.odata.v4.ODataListBinding} oMainListBinding OData V4 ListBinding object
90
+ * @param {object} [mInParameters] Optional, can contain the following attributes:
91
+ * @param {map} [mInParameters.data] A map of data that should be sent within the POST
92
+ * @param {string} [mInParameters.busyMode] Global (default), Local, None TODO: to be refactored
93
+ * @param {map} [mInParameters.keepTransientContextOnFailed] If set, the context stays in the list if the POST failed and POST will be repeated with the next change
94
+ * @param oResourceBundle
95
+ * @param messageHandler
96
+ * @param bFromCopyPaste
97
+ * @param oView The current view
98
+ * @returns {Promise} Promise resolves with new binding context
99
+ * @ui5-restricted
100
+ * @final
101
+ */
102
+ ;
103
+
104
+ _proto.createDocument = function createDocument(oMainListBinding, mInParameters, oResourceBundle, messageHandler) {
105
+ var bFromCopyPaste = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
106
+ var oView = arguments.length > 5 ? arguments[5] : undefined;
107
+
108
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
109
+ var that = this,
110
+ oModel = oMainListBinding.getModel(),
111
+ oMetaModel = oModel.getMetaModel(),
112
+ sMetaPath = oMetaModel.getMetaPath(oMainListBinding.getHeaderContext().getPath()),
113
+ sCreateHash = this._getAppComponent().getRouterProxy().getHash(),
114
+ oComponentData = this._getAppComponent().getComponentData(),
115
+ oStartupParameters = oComponentData && oComponentData.startupParameters || {},
116
+ sNewAction = !oMainListBinding.isRelative() ? this._getNewAction(oStartupParameters, sCreateHash, oMetaModel, sMetaPath) : undefined;
117
+
118
+ var oCreationPromise;
119
+ var mBindingParameters = {
120
+ "$$patchWithoutSideEffects": true
121
+ };
122
+ var sMessagesPath = oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path");
123
+ var sBusyPath = "/busy";
124
+ var sFunctionName = oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Common.v1.DefaultValuesFunction") || oMetaModel.getObject(ModelHelper.getTargetEntitySet(oMetaModel.getContext(sMetaPath)) + "@com.sap.vocabularies.Common.v1.DefaultValuesFunction");
125
+ var bFunctionOnNavProp;
126
+ var oNewDocumentContext;
127
+
128
+ if (sFunctionName) {
129
+ if (oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Common.v1.DefaultValuesFunction") && ModelHelper.getTargetEntitySet(oMetaModel.getContext(sMetaPath)) !== sMetaPath) {
130
+ bFunctionOnNavProp = true;
131
+ } else {
132
+ bFunctionOnNavProp = false;
146
133
  }
134
+ }
147
135
 
148
- if (sMessagesPath) {
149
- mBindingParameters["$select"] = sMessagesPath;
150
- }
136
+ if (sMessagesPath) {
137
+ mBindingParameters["$select"] = sMessagesPath;
138
+ }
151
139
 
152
- var mParameters = getParameters(mInParameters);
140
+ var mParameters = getParameters(mInParameters);
153
141
 
154
- if (!oMainListBinding) {
155
- return Promise.reject("Binding required for new document creation");
156
- }
142
+ if (!oMainListBinding) {
143
+ return Promise.reject("Binding required for new document creation");
144
+ }
157
145
 
158
- var sProgrammingModel = this.getProgrammingModel(oMainListBinding);
146
+ var sProgrammingModel = this.getProgrammingModel(oMainListBinding);
159
147
 
160
- if (sProgrammingModel !== ProgrammingModel.Draft && sProgrammingModel !== ProgrammingModel.Sticky) {
161
- return Promise.reject("Create document only allowed for draft or sticky session supported services");
162
- }
148
+ if (sProgrammingModel !== ProgrammingModel.Draft && sProgrammingModel !== ProgrammingModel.Sticky) {
149
+ return Promise.reject("Create document only allowed for draft or sticky session supported services");
150
+ }
163
151
 
164
- if (mParameters.busyMode === "Local") {
165
- // in case of local busy mode we use the list binding name
166
- // there's no APY yet so we have to use the .sId TODO provide a public method?
167
- sBusyPath = "/busyLocal/" + oMainListBinding.sId;
168
- }
152
+ if (mParameters.busyMode === "Local") {
153
+ // in case of local busy mode we use the list binding name
154
+ // there's no APY yet so we have to use the .sId TODO provide a public method?
155
+ sBusyPath = "/busyLocal/" + oMainListBinding.sId;
156
+ }
169
157
 
170
- mParameters.beforeCreateCallBack = bFromCopyPaste ? null : mParameters.beforeCreateCallBack;
171
- BusyLocker.lock(this.oLockObject, sBusyPath);
172
- var oResourceBundleCore = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
173
-
174
- if (sNewAction) {
175
- oCreationPromise = this.callAction(sNewAction, {
176
- contexts: oMainListBinding.getHeaderContext(),
177
- showActionParameterDialog: true,
178
- label: this._getSpecificCreateActionDialogLabel(oMetaModel, sMetaPath, sNewAction, oResourceBundleCore),
179
- bindingParameters: mBindingParameters,
180
- parentControl: mParameters.parentControl,
181
- bIsCreateAction: true
182
- }, null, messageHandler);
183
- } else {
184
- var bIsNewPageCreation = mParameters.creationMode !== CreationMode.CreationRow && mParameters.creationMode !== CreationMode.Inline;
185
- var aNonComputedVisibleKeyFields = bIsNewPageCreation ? CommonUtils.getNonComputedVisibleFields(oMetaModel, sMetaPath, oView) : [];
186
- sFunctionName = bFromCopyPaste ? null : sFunctionName;
187
- var sFunctionPath, oFunctionContext;
188
-
189
- if (sFunctionName) {
190
- //bound to the source entity:
191
- if (bFunctionOnNavProp) {
192
- sFunctionPath = oMainListBinding.getContext() && oMetaModel.getMetaPath(oMainListBinding.getContext().getPath()) + "/" + sFunctionName;
193
- oFunctionContext = oMainListBinding.getContext();
194
- } else {
195
- sFunctionPath = oMainListBinding.getHeaderContext() && oMetaModel.getMetaPath(oMainListBinding.getHeaderContext().getPath()) + "/" + sFunctionName;
196
- oFunctionContext = oMainListBinding.getHeaderContext();
197
- }
158
+ mParameters.beforeCreateCallBack = bFromCopyPaste ? null : mParameters.beforeCreateCallBack;
159
+ BusyLocker.lock(this.oLockObject, sBusyPath);
160
+ var oResourceBundleCore = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
161
+
162
+ if (sNewAction) {
163
+ oCreationPromise = this.callAction(sNewAction, {
164
+ contexts: oMainListBinding.getHeaderContext(),
165
+ showActionParameterDialog: true,
166
+ label: this._getSpecificCreateActionDialogLabel(oMetaModel, sMetaPath, sNewAction, oResourceBundleCore),
167
+ bindingParameters: mBindingParameters,
168
+ parentControl: mParameters.parentControl,
169
+ bIsCreateAction: true
170
+ }, null, messageHandler);
171
+ } else {
172
+ var bIsNewPageCreation = mParameters.creationMode !== CreationMode.CreationRow && mParameters.creationMode !== CreationMode.Inline;
173
+ var aNonComputedVisibleKeyFields = bIsNewPageCreation ? CommonUtils.getNonComputedVisibleFields(oMetaModel, sMetaPath, oView) : [];
174
+ sFunctionName = bFromCopyPaste ? null : sFunctionName;
175
+ var sFunctionPath, oFunctionContext;
176
+
177
+ if (sFunctionName) {
178
+ //bound to the source entity:
179
+ if (bFunctionOnNavProp) {
180
+ sFunctionPath = oMainListBinding.getContext() && oMetaModel.getMetaPath(oMainListBinding.getContext().getPath()) + "/" + sFunctionName;
181
+ oFunctionContext = oMainListBinding.getContext();
182
+ } else {
183
+ sFunctionPath = oMainListBinding.getHeaderContext() && oMetaModel.getMetaPath(oMainListBinding.getHeaderContext().getPath()) + "/" + sFunctionName;
184
+ oFunctionContext = oMainListBinding.getHeaderContext();
198
185
  }
186
+ }
187
+
188
+ var oFunction = sFunctionPath && oMetaModel.createBindingContext(sFunctionPath);
199
189
 
200
- var oFunction = sFunctionPath && oMetaModel.createBindingContext(sFunctionPath);
190
+ if (oFunction && oFunction.getObject() && oFunction.getObject()[0].$IsBound) {
191
+ oCreationPromise = operations.callBoundFunction(sFunctionName, oFunctionContext, oModel);
192
+ } else {
193
+ oCreationPromise = operations.callFunctionImport(sFunctionName, oModel);
194
+ }
201
195
 
202
- if (oFunction && oFunction.getObject() && oFunction.getObject()[0].$IsBound) {
203
- oCreationPromise = operations.callBoundFunction(sFunctionName, oFunctionContext, oModel);
196
+ oCreationPromise = oCreationPromise.then(function (oContext) {
197
+ if (oContext) {
198
+ return oContext.getObject();
204
199
  } else {
205
- oCreationPromise = operations.callFunctionImport(sFunctionName, oModel);
200
+ return undefined;
206
201
  }
202
+ }).catch(function (oError) {
203
+ Log.error("Error while executing the function " + sFunctionName, oError);
204
+ throw oError;
205
+ }).then(function (oData) {
206
+ mParameters.data = oData ? Object.assign({}, oData, mParameters.data) : mParameters.data;
207
207
 
208
- oCreationPromise = oCreationPromise.then(function (oContext) {
209
- if (oContext) {
210
- return oContext.getObject();
211
- } else {
212
- return undefined;
213
- }
214
- }).catch(function (oError) {
215
- Log.error("Error while executing the function " + sFunctionName, oError);
216
- throw oError;
217
- }).then(function (oData) {
218
- mParameters.data = oData ? Object.assign({}, oData, mParameters.data) : mParameters.data;
219
-
220
- if (mParameters.data) {
221
- delete mParameters.data["@odata.context"];
222
- }
223
-
224
- if (aNonComputedVisibleKeyFields.length > 0) {
225
- var oTransientListBinding = oModel.bindList(oMainListBinding.getPath(), oMainListBinding.getContext(), [], [], {
226
- $$updateGroupId: "submitLater"
227
- });
208
+ if (mParameters.data) {
209
+ delete mParameters.data["@odata.context"];
210
+ }
228
211
 
229
- oTransientListBinding.refreshInternal = function () {
230
- /* */
231
- };
212
+ if (aNonComputedVisibleKeyFields.length > 0) {
213
+ var oTransientListBinding = oModel.bindList(oMainListBinding.getPath(), oMainListBinding.getContext(), [], [], {
214
+ $$updateGroupId: "submitLater"
215
+ });
232
216
 
233
- oNewDocumentContext = oTransientListBinding.create(mParameters.data, true);
234
- return that._launchDialogWithKeyFields(oMainListBinding, oTransientListBinding, oNewDocumentContext, aNonComputedVisibleKeyFields, oModel, mParameters, messageHandler);
235
- } else {
236
- var onBeforeCreatePromise;
217
+ oTransientListBinding.refreshInternal = function () {
218
+ /* */
219
+ };
237
220
 
238
- if (mParameters.beforeCreateCallBack) {
239
- onBeforeCreatePromise = mParameters.beforeCreateCallBack({
240
- contextPath: oMainListBinding && oMainListBinding.getPath()
241
- });
242
- } else {
243
- onBeforeCreatePromise = Promise.resolve();
244
- }
221
+ oNewDocumentContext = oTransientListBinding.create(mParameters.data, true);
222
+ return that._launchDialogWithKeyFields(oMainListBinding, oTransientListBinding, oNewDocumentContext, aNonComputedVisibleKeyFields, oModel, mParameters, messageHandler);
223
+ } else {
224
+ var onBeforeCreatePromise;
245
225
 
246
- return onBeforeCreatePromise.then(function () {
247
- oNewDocumentContext = oMainListBinding.create(mParameters.data, true, mParameters.createAtEnd);
248
- return that.onAfterCreateCompletion(oMainListBinding, oNewDocumentContext, mParameters);
226
+ if (mParameters.beforeCreateCallBack) {
227
+ onBeforeCreatePromise = mParameters.beforeCreateCallBack({
228
+ contextPath: oMainListBinding && oMainListBinding.getPath()
249
229
  });
230
+ } else {
231
+ onBeforeCreatePromise = Promise.resolve();
250
232
  }
251
- }).catch(function (oError) {
252
- Log.error("Error while creating the new document", oError);
253
- throw oError;
254
- });
255
- }
256
-
257
- return oCreationPromise.then(function (oResult) {
258
- if (!oMainListBinding.isRelative()) {
259
- // the create mode shall currently only be set on creating a root document
260
- that._bCreateMode = true;
261
- }
262
233
 
263
- oNewDocumentContext = oNewDocumentContext || oResult && oResult.response; // TODO: where does this one coming from???
264
-
265
- if (oResult && oResult.bConsiderDocumentModified) {
266
- that.handleDocumentModifications();
234
+ return onBeforeCreatePromise.then(function () {
235
+ oNewDocumentContext = oMainListBinding.create(mParameters.data, true, mParameters.createAtEnd);
236
+ return that.onAfterCreateCompletion(oMainListBinding, oNewDocumentContext, mParameters);
237
+ });
267
238
  }
268
-
269
- return messageHandler.showMessageDialog().then(function () {
270
- return oNewDocumentContext;
271
- });
272
239
  }).catch(function (oError) {
273
- return messageHandler.showMessageDialog().then(function () {
274
- // for instance, on cancel of create dialog, the promise is rejected
275
- // a return here would restore the promise chain and result in errors while routing
276
- // solution - reject here as well
277
- if (oError && oError.bDeleteTransientContext && oNewDocumentContext.isTransient()) {
278
- // This is a workaround suggested by model as Context.delete results in an error
279
- // TODO: remove the $direct once model resolves this issue
280
- // this line shows the expected console error Uncaught (in promise) Error: Request canceled: POST Travel; group: submitLater
281
- oNewDocumentContext.delete("$direct");
282
- }
283
-
284
- return Promise.reject(oError);
285
- });
286
- }).finally(function () {
287
- BusyLocker.unlock(that.oLockObject, sBusyPath);
240
+ Log.error("Error while creating the new document", oError);
241
+ throw oError;
288
242
  });
289
243
  }
290
- /**
291
- * Find the active contexts of the documents, only for the draft roots.
292
- *
293
- * @memberof sap.fe.core.TransactionHelper
294
- * @static
295
- * @param {sap.ui.model.odata.v4.Context[]} aContexts Contexts Either one context or an array with contexts to be deleted
296
- * @param bFindActiveContexts
297
- * @returns {Array} Array of the active contexts
298
- */
299
-
300
- }, {
301
- key: "findActiveDraftRootContexts",
302
- value: function findActiveDraftRootContexts(aContexts, bFindActiveContexts) {
303
- if (!bFindActiveContexts) {
304
- return Promise.resolve();
244
+
245
+ return oCreationPromise.then(function (oResult) {
246
+ if (!oMainListBinding.isRelative()) {
247
+ // the create mode shall currently only be set on creating a root document
248
+ that._bCreateMode = true;
305
249
  }
306
250
 
307
- var activeContexts = aContexts.reduce(function (aResult, oContext) {
308
- var oMetaModel = oContext.getModel().getMetaModel();
309
- var sMetaPath = oMetaModel.getMetaPath(oContext.getPath());
251
+ oNewDocumentContext = oNewDocumentContext || oResult && oResult.response; // TODO: where does this one coming from???
310
252
 
311
- if (oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Common.v1.DraftRoot")) {
312
- var bIsActiveEntity = oContext.getObject().IsActiveEntity,
313
- bHasActiveEntity = oContext.getObject().HasActiveEntity;
253
+ if (oResult && oResult.bConsiderDocumentModified) {
254
+ that.handleDocumentModifications();
255
+ }
314
256
 
315
- if (!bIsActiveEntity && bHasActiveEntity) {
316
- var oActiveContext = oContext.getModel().bindContext(oContext.getPath() + "/SiblingEntity").getBoundContext();
317
- aResult.push(oActiveContext);
318
- }
257
+ return messageHandler.showMessageDialog().then(function () {
258
+ return oNewDocumentContext;
259
+ });
260
+ }).catch(function (oError) {
261
+ return messageHandler.showMessageDialog().then(function () {
262
+ // for instance, on cancel of create dialog, the promise is rejected
263
+ // a return here would restore the promise chain and result in errors while routing
264
+ // solution - reject here as well
265
+ if (oError && oError.bDeleteTransientContext && oNewDocumentContext.isTransient()) {
266
+ // This is a workaround suggested by model as Context.delete results in an error
267
+ // TODO: remove the $direct once model resolves this issue
268
+ // this line shows the expected console error Uncaught (in promise) Error: Request canceled: POST Travel; group: submitLater
269
+ oNewDocumentContext.delete("$direct");
319
270
  }
320
271
 
321
- return aResult;
322
- }, []);
323
- return Promise.all(activeContexts.map(function (oContext) {
324
- return oContext.requestCanonicalPath().then(function () {
325
- return oContext;
326
- }, function () {
327
- return;
328
- });
329
- }));
272
+ return Promise.reject(oError);
273
+ });
274
+ }).finally(function () {
275
+ BusyLocker.unlock(that.oLockObject, sBusyPath);
276
+ });
277
+ }
278
+ /**
279
+ * Find the active contexts of the documents, only for the draft roots.
280
+ *
281
+ * @memberof sap.fe.core.TransactionHelper
282
+ * @static
283
+ * @param {sap.ui.model.odata.v4.Context[]} aContexts Contexts Either one context or an array with contexts to be deleted
284
+ * @param bFindActiveContexts
285
+ * @returns {Array} Array of the active contexts
286
+ */
287
+ ;
288
+
289
+ _proto.findActiveDraftRootContexts = function findActiveDraftRootContexts(aContexts, bFindActiveContexts) {
290
+ if (!bFindActiveContexts) {
291
+ return Promise.resolve();
330
292
  }
331
- }, {
332
- key: "afterDeleteProcess",
333
- value: function afterDeleteProcess(mParameters, checkBox, aContexts, oResourceBundle) {
334
- var oInternalModelContext = mParameters.internalModelContext;
335
-
336
- if (oInternalModelContext && oInternalModelContext.getProperty("deleteEnabled") != undefined) {
337
- if (checkBox.isCheckBoxVisible === true && checkBox.isCheckBoxSelected === false) {
338
- //if unsaved objects are not deleted then we need to set the enabled to true and update the model data for next deletion
339
- oInternalModelContext.setProperty("deleteEnabled", true);
340
- var obj = Object.assign(oInternalModelContext.getObject(), {});
341
- obj.selectedContexts = obj.selectedContexts.filter(function (element) {
342
- return obj.deletableContexts.indexOf(element) === -1;
343
- });
344
- obj.deletableContexts = [];
345
- obj.selectedContexts = [];
346
- obj.numberOfSelectedContexts = obj.selectedContexts.length;
347
- oInternalModelContext.setProperty("", obj);
348
- } else {
349
- oInternalModelContext.setProperty("deleteEnabled", false);
350
- oInternalModelContext.setProperty("selectedContexts", []);
351
- oInternalModelContext.setProperty("numberOfSelectedContexts", 0);
293
+
294
+ var activeContexts = aContexts.reduce(function (aResult, oContext) {
295
+ var oMetaModel = oContext.getModel().getMetaModel();
296
+ var sMetaPath = oMetaModel.getMetaPath(oContext.getPath());
297
+
298
+ if (oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Common.v1.DraftRoot")) {
299
+ var bIsActiveEntity = oContext.getObject().IsActiveEntity,
300
+ bHasActiveEntity = oContext.getObject().HasActiveEntity;
301
+
302
+ if (!bIsActiveEntity && bHasActiveEntity) {
303
+ var oActiveContext = oContext.getModel().bindContext(oContext.getPath() + "/SiblingEntity").getBoundContext();
304
+ aResult.push(oActiveContext);
352
305
  }
353
306
  }
354
307
 
355
- if (aContexts.length === 1) {
356
- MessageToast.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_DELETE_TOAST_SINGULAR", oResourceBundle, null, mParameters.entitySetName));
308
+ return aResult;
309
+ }, []);
310
+ return Promise.all(activeContexts.map(function (oContext) {
311
+ return oContext.requestCanonicalPath().then(function () {
312
+ return oContext;
313
+ }, function () {
314
+ return;
315
+ });
316
+ }));
317
+ };
318
+
319
+ _proto.afterDeleteProcess = function afterDeleteProcess(mParameters, checkBox, aContexts, oResourceBundle) {
320
+ var oInternalModelContext = mParameters.internalModelContext;
321
+
322
+ if (oInternalModelContext && oInternalModelContext.getProperty("deleteEnabled") != undefined) {
323
+ if (checkBox.isCheckBoxVisible === true && checkBox.isCheckBoxSelected === false) {
324
+ //if unsaved objects are not deleted then we need to set the enabled to true and update the model data for next deletion
325
+ oInternalModelContext.setProperty("deleteEnabled", true);
326
+ var obj = Object.assign(oInternalModelContext.getObject(), {});
327
+ obj.selectedContexts = obj.selectedContexts.filter(function (element) {
328
+ return obj.deletableContexts.indexOf(element) === -1;
329
+ });
330
+ obj.deletableContexts = [];
331
+ obj.selectedContexts = [];
332
+ obj.numberOfSelectedContexts = obj.selectedContexts.length;
333
+ oInternalModelContext.setProperty("", obj);
357
334
  } else {
358
- MessageToast.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_DELETE_TOAST_PLURAL", oResourceBundle, null, mParameters.entitySetName));
335
+ oInternalModelContext.setProperty("deleteEnabled", false);
336
+ oInternalModelContext.setProperty("selectedContexts", []);
337
+ oInternalModelContext.setProperty("numberOfSelectedContexts", 0);
359
338
  }
360
339
  }
361
- /**
362
- * Delete one or multiple document(s).
363
- *
364
- * @memberof sap.fe.core.TransactionHelper
365
- * @static
366
- * @param {sap.ui.model.odata.v4.Context} vContexts Contexts Either one context or an array with contexts to be deleted
367
- * @param {object} mParameters Optional, can contain the following attributes:
368
- * @param {string} mParameters.title Title of the object to be deleted
369
- * @param {string} mParameters.description Description of the object to be deleted
370
- * @param {integer} mParameters.numberOfSelectedContexts Number of objects selected
371
- * @param {boolean} mParameters.noDialog To disable the confirmation dialog
372
- * @param oResourceBundle
373
- * @param messageHandler
374
- * @returns {Promise}
375
- */
376
-
377
- }, {
378
- key: "deleteDocument",
379
- value: function deleteDocument(vContexts, mParameters, oResourceBundle, messageHandler) {
380
- var fnReject,
381
- fnResolve,
382
- aDeletableContexts = [],
383
- isCheckBoxVisible = false,
384
- isLockedTextVisible = false,
385
- cannotBeDeletedTextVisible = false,
386
- isCheckBoxSelected,
387
- bDialogConfirmed = false; // eslint-disable-next-line @typescript-eslint/no-this-alias
388
-
389
- var that = this,
390
- oResourceBundleCore = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
391
- var aParams;
392
- var oDeleteMessage = {
393
- title: oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE")
394
- };
395
- BusyLocker.lock(this.oLockObject);
396
340
 
397
- if (!Array.isArray(vContexts)) {
398
- vContexts = [vContexts];
399
- }
341
+ if (aContexts.length === 1) {
342
+ MessageToast.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_DELETE_TOAST_SINGULAR", oResourceBundle, null, mParameters.entitySetName));
343
+ } else {
344
+ MessageToast.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_DELETE_TOAST_PLURAL", oResourceBundle, null, mParameters.entitySetName));
345
+ }
346
+ }
347
+ /**
348
+ * Delete one or multiple document(s).
349
+ *
350
+ * @memberof sap.fe.core.TransactionHelper
351
+ * @static
352
+ * @param {sap.ui.model.odata.v4.Context} vContexts Contexts Either one context or an array with contexts to be deleted
353
+ * @param {object} mParameters Optional, can contain the following attributes:
354
+ * @param {string} mParameters.title Title of the object to be deleted
355
+ * @param {string} mParameters.description Description of the object to be deleted
356
+ * @param {integer} mParameters.numberOfSelectedContexts Number of objects selected
357
+ * @param {boolean} mParameters.noDialog To disable the confirmation dialog
358
+ * @param oResourceBundle
359
+ * @param messageHandler
360
+ * @returns {Promise}
361
+ */
362
+ ;
363
+
364
+ _proto.deleteDocument = function deleteDocument(vContexts, mParameters, oResourceBundle, messageHandler) {
365
+ var fnReject,
366
+ fnResolve,
367
+ aDeletableContexts = [],
368
+ isCheckBoxVisible = false,
369
+ isLockedTextVisible = false,
370
+ cannotBeDeletedTextVisible = false,
371
+ isCheckBoxSelected,
372
+ bDialogConfirmed = false; // eslint-disable-next-line @typescript-eslint/no-this-alias
373
+
374
+ var that = this,
375
+ oResourceBundleCore = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
376
+ var aParams;
377
+ var oDeleteMessage = {
378
+ title: oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE")
379
+ };
380
+ BusyLocker.lock(this.oLockObject);
381
+
382
+ if (!Array.isArray(vContexts)) {
383
+ vContexts = [vContexts];
384
+ }
400
385
 
401
- Promise.resolve(this.getProgrammingModel(vContexts[0])).then(function (sProgrammingModel) {
402
- if (mParameters) {
403
- if (!mParameters.numberOfSelectedContexts) {
404
- if (sProgrammingModel === ProgrammingModel.Draft) {
405
- for (var i = 0; i < vContexts.length; i++) {
406
- var oContextData = vContexts[i].getObject();
407
-
408
- if (oContextData.IsActiveEntity === true && oContextData.HasDraftEntity === true && oContextData.DraftAdministrativeData && oContextData.DraftAdministrativeData.InProcessByUser && !oContextData.DraftAdministrativeData.DraftIsCreatedByMe) {
409
- MessageBox.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_SINGLE_OBJECT_LOCKED", oResourceBundle), {
410
- title: oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE"),
411
- onClose: fnReject
412
- });
413
- return;
414
- }
386
+ Promise.resolve(this.getProgrammingModel(vContexts[0])).then(function (sProgrammingModel) {
387
+ if (mParameters) {
388
+ if (!mParameters.numberOfSelectedContexts) {
389
+ if (sProgrammingModel === ProgrammingModel.Draft) {
390
+ for (var i = 0; i < vContexts.length; i++) {
391
+ var oContextData = vContexts[i].getObject();
392
+
393
+ if (oContextData.IsActiveEntity === true && oContextData.HasDraftEntity === true && oContextData.DraftAdministrativeData && oContextData.DraftAdministrativeData.InProcessByUser && !oContextData.DraftAdministrativeData.DraftIsCreatedByMe) {
394
+ MessageBox.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_SINGLE_OBJECT_LOCKED", oResourceBundle), {
395
+ title: oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE"),
396
+ onClose: fnReject
397
+ });
398
+ return;
415
399
  }
416
400
  }
401
+ }
417
402
 
418
- mParameters = getParameters(mParameters);
403
+ mParameters = getParameters(mParameters);
419
404
 
420
- if (mParameters.title) {
405
+ if (mParameters.title) {
406
+ if (mParameters.description) {
421
407
  aParams = [mParameters.title, mParameters.description];
422
- oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO", oResourceBundle, aParams, mParameters.entitySetName);
423
408
  } else {
424
- oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle);
409
+ aParams = [mParameters.title, ""];
425
410
  }
426
411
 
427
- aDeletableContexts = vContexts;
412
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO", oResourceBundle, aParams, mParameters.entitySetName);
428
413
  } else {
429
- oDeleteMessage = {
430
- title: oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE")
431
- };
432
-
433
- if (mParameters.numberOfSelectedContexts === 1 && mParameters.numberOfSelectedContexts === vContexts.length) {
434
- aDeletableContexts = vContexts;
435
- oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle, null, mParameters.entitySetName);
436
- } else if (mParameters.numberOfSelectedContexts === 1 && mParameters.unSavedContexts.length === 1) {
437
- //only one unsaved object
438
- aDeletableContexts = mParameters.unSavedContexts;
439
- var draftAdminData = aDeletableContexts[0].getObject()["DraftAdministrativeData"];
440
- var sLastChangedByUser = "";
414
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle);
415
+ }
441
416
 
442
- if (draftAdminData) {
443
- sLastChangedByUser = draftAdminData["LastChangedByUserDescription"] || draftAdminData["LastChangedByUser"] || "";
444
- }
417
+ aDeletableContexts = vContexts;
418
+ } else {
419
+ oDeleteMessage = {
420
+ title: oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE")
421
+ };
445
422
 
446
- aParams = [sLastChangedByUser];
447
- oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_UNSAVED_CHANGES", oResourceBundle, aParams);
448
- } else if (mParameters.numberOfSelectedContexts === mParameters.unSavedContexts.length) {
449
- //only multiple unsaved objects
450
- aDeletableContexts = mParameters.unSavedContexts;
451
- oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_UNSAVED_CHANGES_MULTIPLE_OBJECTS", oResourceBundle);
452
- } else if (mParameters.numberOfSelectedContexts === vContexts.concat(mParameters.unSavedContexts.concat(mParameters.lockedContexts)).length) {
453
- //only unsaved, locked ,deletable objects but not non-deletable objects
454
- aDeletableContexts = vContexts.concat(mParameters.unSavedContexts);
455
- oDeleteMessage.text = aDeletableContexts.length === 1 ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle, null, mParameters.entitySetName) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_PLURAL", oResourceBundle, null, mParameters.entitySetName);
456
- } else {
457
- //if non-deletable objects exists along with any of unsaved ,deletable objects
458
- aDeletableContexts = vContexts.concat(mParameters.unSavedContexts);
459
- cannotBeDeletedTextVisible = true;
460
- oDeleteMessage.text = aDeletableContexts.length === 1 ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR_NON_DELETABLE", oResourceBundle, null, mParameters.entitySetName) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_PLURAL_NON_DELETABLE", oResourceBundle, null, mParameters.entitySetName);
461
- oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_NON_DELETABLE", oResourceBundle, [mParameters.numberOfSelectedContexts - vContexts.concat(mParameters.unSavedContexts).length, mParameters.numberOfSelectedContexts]);
423
+ if (mParameters.numberOfSelectedContexts === 1 && mParameters.numberOfSelectedContexts === vContexts.length) {
424
+ aDeletableContexts = vContexts;
425
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle, null, mParameters.entitySetName);
426
+ } else if (mParameters.numberOfSelectedContexts === 1 && mParameters.unSavedContexts.length === 1) {
427
+ //only one unsaved object
428
+ aDeletableContexts = mParameters.unSavedContexts;
429
+ var draftAdminData = aDeletableContexts[0].getObject()["DraftAdministrativeData"];
430
+ var sLastChangedByUser = "";
431
+
432
+ if (draftAdminData) {
433
+ sLastChangedByUser = draftAdminData["LastChangedByUserDescription"] || draftAdminData["LastChangedByUser"] || "";
462
434
  }
463
435
 
464
- if (mParameters.lockedContexts.length == 1) {
465
- //setting the locked text if locked objects exist
466
- isLockedTextVisible = true;
467
- oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_LOCKED", oResourceBundle, [mParameters.numberOfSelectedContexts]);
468
- }
436
+ aParams = [sLastChangedByUser];
437
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_UNSAVED_CHANGES", oResourceBundle, aParams);
438
+ } else if (mParameters.numberOfSelectedContexts === mParameters.unSavedContexts.length) {
439
+ //only multiple unsaved objects
440
+ aDeletableContexts = mParameters.unSavedContexts;
441
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_UNSAVED_CHANGES_MULTIPLE_OBJECTS", oResourceBundle);
442
+ } else if (mParameters.numberOfSelectedContexts === vContexts.concat(mParameters.unSavedContexts.concat(mParameters.lockedContexts)).length) {
443
+ //only unsaved, locked ,deletable objects but not non-deletable objects
444
+ aDeletableContexts = vContexts.concat(mParameters.unSavedContexts);
445
+ oDeleteMessage.text = aDeletableContexts.length === 1 ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle, null, mParameters.entitySetName) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_PLURAL", oResourceBundle, null, mParameters.entitySetName);
446
+ } else {
447
+ //if non-deletable objects exists along with any of unsaved ,deletable objects
448
+ aDeletableContexts = vContexts.concat(mParameters.unSavedContexts);
449
+ cannotBeDeletedTextVisible = true;
450
+ oDeleteMessage.text = aDeletableContexts.length === 1 ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR_NON_DELETABLE", oResourceBundle, null, mParameters.entitySetName) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTTITLE_PLURAL_NON_DELETABLE", oResourceBundle, null, mParameters.entitySetName);
451
+ oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_NON_DELETABLE", oResourceBundle, [mParameters.numberOfSelectedContexts - vContexts.concat(mParameters.unSavedContexts).length, mParameters.numberOfSelectedContexts]);
452
+ }
469
453
 
470
- if (mParameters.lockedContexts.length > 1) {
471
- //setting the locked text if locked objects exist
472
- isLockedTextVisible = true;
473
- oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_LOCKED", oResourceBundle, [mParameters.lockedContexts.length, mParameters.numberOfSelectedContexts]);
474
- }
454
+ if (mParameters.lockedContexts.length == 1) {
455
+ //setting the locked text if locked objects exist
456
+ isLockedTextVisible = true;
457
+ oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_LOCKED", oResourceBundle, [mParameters.numberOfSelectedContexts]);
458
+ }
475
459
 
476
- if (mParameters.unSavedContexts.length > 0 && mParameters.unSavedContexts.length !== mParameters.numberOfSelectedContexts) {
477
- if ((cannotBeDeletedTextVisible || isLockedTextVisible) && aDeletableContexts.length === mParameters.unSavedContexts.length) {
478
- //if only unsaved and either or both of locked and non-deletable objects exist then we hide the check box
479
- isCheckBoxVisible = false;
480
- aDeletableContexts = mParameters.unSavedContexts;
460
+ if (mParameters.lockedContexts.length > 1) {
461
+ //setting the locked text if locked objects exist
462
+ isLockedTextVisible = true;
463
+ oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_LOCKED", oResourceBundle, [mParameters.lockedContexts.length, mParameters.numberOfSelectedContexts]);
464
+ }
481
465
 
482
- if (mParameters.unSavedContexts.length === 1) {
483
- oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_UNSAVED_AND_FEW_OBJECTS_LOCKED_SINGULAR", oResourceBundle);
484
- } else {
485
- oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_UNSAVED_AND_FEW_OBJECTS_LOCKED_PLURAL", oResourceBundle);
486
- }
487
- } else {
488
- if (mParameters.unSavedContexts.length === 1) {
489
- oDeleteMessage.checkBoxText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_UNSAVED_SINGULAR", oResourceBundle);
490
- } else {
491
- oDeleteMessage.checkBoxText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_UNSAVED_PLURAL", oResourceBundle);
492
- }
466
+ if (mParameters.unSavedContexts.length > 0 && mParameters.unSavedContexts.length !== mParameters.numberOfSelectedContexts) {
467
+ if ((cannotBeDeletedTextVisible || isLockedTextVisible) && aDeletableContexts.length === mParameters.unSavedContexts.length) {
468
+ //if only unsaved and either or both of locked and non-deletable objects exist then we hide the check box
469
+ isCheckBoxVisible = false;
470
+ aDeletableContexts = mParameters.unSavedContexts;
493
471
 
494
- isCheckBoxVisible = true;
472
+ if (mParameters.unSavedContexts.length === 1) {
473
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_UNSAVED_AND_FEW_OBJECTS_LOCKED_SINGULAR", oResourceBundle);
474
+ } else {
475
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_UNSAVED_AND_FEW_OBJECTS_LOCKED_PLURAL", oResourceBundle);
476
+ }
477
+ } else {
478
+ if (mParameters.unSavedContexts.length === 1) {
479
+ oDeleteMessage.checkBoxText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_UNSAVED_SINGULAR", oResourceBundle);
480
+ } else {
481
+ oDeleteMessage.checkBoxText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_UNSAVED_PLURAL", oResourceBundle);
495
482
  }
483
+
484
+ isCheckBoxVisible = true;
496
485
  }
486
+ }
497
487
 
498
- if (cannotBeDeletedTextVisible && isLockedTextVisible) {
499
- //if both locked and non-deletable objects exist along with deletable objects
500
- if (mParameters.unSavedContexts.length > 1) {
501
- oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_LOCKED_AND_NON_DELETABLE", oResourceBundle, [mParameters.numberOfSelectedContexts - vContexts.concat(mParameters.unSavedContexts).length - mParameters.lockedContexts.length, mParameters.lockedContexts.length, mParameters.numberOfSelectedContexts]);
502
- }
488
+ if (cannotBeDeletedTextVisible && isLockedTextVisible) {
489
+ //if both locked and non-deletable objects exist along with deletable objects
490
+ if (mParameters.unSavedContexts.length > 1) {
491
+ oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_LOCKED_AND_NON_DELETABLE", oResourceBundle, [mParameters.numberOfSelectedContexts - vContexts.concat(mParameters.unSavedContexts).length - mParameters.lockedContexts.length, mParameters.lockedContexts.length, mParameters.numberOfSelectedContexts]);
492
+ }
503
493
 
504
- if (mParameters.unSavedContexts.length == 1) {
505
- oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_LOCKED_AND_NON_DELETABLE", oResourceBundle, [mParameters.numberOfSelectedContexts - vContexts.concat(mParameters.unSavedContexts).length - mParameters.lockedContexts.length, mParameters.numberOfSelectedContexts]);
506
- }
494
+ if (mParameters.unSavedContexts.length == 1) {
495
+ oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_LOCKED_AND_NON_DELETABLE", oResourceBundle, [mParameters.numberOfSelectedContexts - vContexts.concat(mParameters.unSavedContexts).length - mParameters.lockedContexts.length, mParameters.numberOfSelectedContexts]);
507
496
  }
508
497
  }
509
498
  }
499
+ }
510
500
 
511
- var oNonDeletableMessageTextControl, oDeleteMessageTextControl;
512
- var oContent = new VBox({
513
- items: [oNonDeletableMessageTextControl = new Text({
514
- text: oDeleteMessage.nonDeletableText,
515
- visible: isLockedTextVisible || cannotBeDeletedTextVisible
516
- }), oDeleteMessageTextControl = new Text({
517
- text: oDeleteMessage.text
518
- }), new CheckBox({
519
- text: oDeleteMessage.checkBoxText,
520
- selected: true,
521
- select: function (oEvent) {
522
- var selected = oEvent.getSource().getSelected();
523
-
524
- if (selected) {
525
- aDeletableContexts = vContexts.concat(mParameters.unSavedContexts);
526
- isCheckBoxSelected = true;
527
- } else {
528
- aDeletableContexts = vContexts;
529
- isCheckBoxSelected = false;
530
- }
531
- },
532
- visible: isCheckBoxVisible
533
- })]
534
- });
535
- var sTitle = oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE");
501
+ var oNonDeletableMessageTextControl, oDeleteMessageTextControl;
502
+ var oContent = new VBox({
503
+ items: [oNonDeletableMessageTextControl = new Text({
504
+ text: oDeleteMessage.nonDeletableText,
505
+ visible: isLockedTextVisible || cannotBeDeletedTextVisible
506
+ }), oDeleteMessageTextControl = new Text({
507
+ text: oDeleteMessage.text
508
+ }), new CheckBox({
509
+ text: oDeleteMessage.checkBoxText,
510
+ selected: true,
511
+ select: function (oEvent) {
512
+ var selected = oEvent.getSource().getSelected();
513
+
514
+ if (selected) {
515
+ aDeletableContexts = vContexts.concat(mParameters.unSavedContexts);
516
+ isCheckBoxSelected = true;
517
+ } else {
518
+ aDeletableContexts = vContexts;
519
+ isCheckBoxSelected = false;
520
+ }
521
+ },
522
+ visible: isCheckBoxVisible
523
+ })]
524
+ });
525
+ var sTitle = oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE");
536
526
 
537
- var fnConfirm = function () {
538
- bDialogConfirmed = true;
539
- BusyLocker.lock(that.oLockObject);
540
- var aContexts = aDeletableContexts;
541
- var onBeforeDeletePromise;
527
+ var fnConfirm = function () {
528
+ bDialogConfirmed = true;
529
+ BusyLocker.lock(that.oLockObject);
530
+ var aContexts = aDeletableContexts;
531
+ var onBeforeDeletePromise;
532
+
533
+ if (mParameters.beforeDeleteCallBack) {
534
+ onBeforeDeletePromise = mParameters.beforeDeleteCallBack({
535
+ contexts: aContexts
536
+ });
537
+ } else {
538
+ onBeforeDeletePromise = Promise.resolve();
539
+ }
542
540
 
543
- if (mParameters.beforeDeleteCallBack) {
544
- onBeforeDeletePromise = mParameters.beforeDeleteCallBack({
545
- contexts: aContexts
541
+ return onBeforeDeletePromise.then(that.findActiveDraftRootContexts.bind(that, aContexts, mParameters.bFindActiveContexts)).then(function (activeContexts) {
542
+ //make sure to fetch the active contexts before deleting the drafts
543
+ return Promise.all(aContexts.map(function (oContext) {
544
+ //delete the draft
545
+ return draft.deleteDraft(oContext);
546
+ })).catch(function (oError) {
547
+ return messageHandler.showMessages().then(function () {
548
+ // re-throw error to enforce rejecting the general promise
549
+ throw oError;
546
550
  });
547
- } else {
548
- onBeforeDeletePromise = Promise.resolve();
549
- }
551
+ }).then(function () {
552
+ var checkBox = {
553
+ "isCheckBoxVisible": isCheckBoxVisible,
554
+ "isCheckBoxSelected": isCheckBoxSelected
555
+ };
550
556
 
551
- return onBeforeDeletePromise.then(that.findActiveDraftRootContexts.bind(that, aContexts, mParameters.bFindActiveContexts)).then(function (activeContexts) {
552
- //make sure to fetch the active contexts before deleting the drafts
553
- return Promise.all(aContexts.map(function (oContext) {
554
- //delete the draft
555
- return draft.deleteDraft(oContext);
556
- })).catch(function (oError) {
557
- return messageHandler.showMessages().then(function () {
558
- // re-throw error to enforce rejecting the general promise
559
- throw oError;
560
- });
561
- }).then(function () {
562
- var checkBox = {
563
- "isCheckBoxVisible": isCheckBoxVisible,
564
- "isCheckBoxSelected": isCheckBoxSelected
565
- };
566
-
567
- if (activeContexts && activeContexts.length) {
568
- return Promise.all(activeContexts.map(function (oContext) {
569
- return oContext.delete();
570
- })).then(function () {
571
- that.afterDeleteProcess(mParameters, checkBox, aContexts, oResourceBundle);
572
- return messageHandler.showMessageDialog().then(fnResolve);
573
- });
574
- } else {
557
+ if (activeContexts && activeContexts.length) {
558
+ return Promise.all(activeContexts.map(function (oContext) {
559
+ return oContext.delete();
560
+ })).then(function () {
575
561
  that.afterDeleteProcess(mParameters, checkBox, aContexts, oResourceBundle);
576
562
  return messageHandler.showMessageDialog().then(fnResolve);
577
- }
578
- });
579
- }).catch(function () {
580
- fnReject();
581
- }).finally(function () {
582
- BusyLocker.unlock(that.oLockObject);
583
- });
584
- };
585
-
586
- var oDialog = new Dialog({
587
- title: sTitle,
588
- state: "Warning",
589
- content: [oContent],
590
- ariaLabelledBy: oNonDeletableMessageTextControl.getVisible() ? [oNonDeletableMessageTextControl, oDeleteMessageTextControl] : oDeleteMessageTextControl,
591
- beginButton: new Button({
592
- text: oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE"),
593
- type: "Emphasized",
594
- press: function () {
595
- oDialog.close();
596
- return fnConfirm();
597
- }
598
- }),
599
- endButton: new Button({
600
- text: CommonUtils.getTranslatedText("C_COMMON_OBJECT_PAGE_CANCEL", oResourceBundle),
601
- press: function () {
602
- oDialog.close();
563
+ });
564
+ } else {
565
+ that.afterDeleteProcess(mParameters, checkBox, aContexts, oResourceBundle);
566
+ return messageHandler.showMessageDialog().then(fnResolve);
603
567
  }
604
- }),
605
- afterClose: function () {
606
- oDialog.destroy(); // if dialog is closed unconfirmed (e.g. via "Cancel" or Escape button), ensure to reject promise
568
+ });
569
+ }).catch(function () {
570
+ fnReject();
571
+ }).finally(function () {
572
+ BusyLocker.unlock(that.oLockObject);
573
+ });
574
+ };
607
575
 
608
- if (!bDialogConfirmed) {
609
- fnReject();
610
- }
576
+ var oDialog = new Dialog({
577
+ title: sTitle,
578
+ state: "Warning",
579
+ content: [oContent],
580
+ ariaLabelledBy: oNonDeletableMessageTextControl.getVisible() ? [oNonDeletableMessageTextControl, oDeleteMessageTextControl] : oDeleteMessageTextControl,
581
+ beginButton: new Button({
582
+ text: oResourceBundleCore.getText("C_COMMON_OBJECT_PAGE_DELETE"),
583
+ type: "Emphasized",
584
+ press: function () {
585
+ oDialog.close();
586
+ return fnConfirm();
611
587
  }
612
- });
588
+ }),
589
+ endButton: new Button({
590
+ text: CommonUtils.getTranslatedText("C_COMMON_OBJECT_PAGE_CANCEL", oResourceBundle),
591
+ press: function () {
592
+ oDialog.close();
593
+ }
594
+ }),
595
+ afterClose: function () {
596
+ oDialog.destroy(); // if dialog is closed unconfirmed (e.g. via "Cancel" or Escape button), ensure to reject promise
613
597
 
614
- if (mParameters.noDialog) {
615
- return fnConfirm();
616
- } else {
617
- oDialog.addStyleClass("sapUiContentPadding");
618
- oDialog.open();
598
+ if (!bDialogConfirmed) {
599
+ fnReject();
600
+ }
619
601
  }
620
- }).finally(function () {
621
- BusyLocker.unlock(that.oLockObject);
622
- }).catch(function () {
623
- Log.warning("Couldn't get Programming model");
624
- fnReject();
625
- });
626
- return new Promise(function (resolve, reject) {
627
- fnReject = reject;
628
- fnResolve = resolve;
629
602
  });
630
- }
631
- /**
632
- * Edits a document.
633
- *
634
- * @memberof sap.fe.core.TransactionHelper
635
- * @static
636
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document
637
- * @param {boolean} bPrepareOnEdit Also call the 'prepare' action for draft-based documents
638
- * @param {object} oView Object of current view
639
- * @param messageHandler
640
- * @returns {Promise} Promise resolves with the new draft context in case of draft programming model
641
- * @ui5-restricted
642
- * @final
643
- */
644
-
645
- }, {
646
- key: "editDocument",
647
- value: function editDocument(oContext, bPrepareOnEdit, oView, messageHandler) {
648
- // eslint-disable-next-line @typescript-eslint/no-this-alias
649
- var that = this;
650
- var sProgrammingModel = this.getProgrammingModel(oContext);
651
- var oEditPromise;
652
-
653
- if (!oContext) {
654
- return Promise.reject(new Error("Binding context to active document is required"));
603
+
604
+ if (mParameters.noDialog) {
605
+ return fnConfirm();
606
+ } else {
607
+ oDialog.addStyleClass("sapUiContentPadding");
608
+ oDialog.open();
655
609
  }
610
+ }).finally(function () {
611
+ BusyLocker.unlock(that.oLockObject);
612
+ }).catch(function () {
613
+ Log.warning("Couldn't get Programming model");
614
+ fnReject();
615
+ });
616
+ return new Promise(function (resolve, reject) {
617
+ fnReject = reject;
618
+ fnResolve = resolve;
619
+ });
620
+ }
621
+ /**
622
+ * Edits a document.
623
+ *
624
+ * @memberof sap.fe.core.TransactionHelper
625
+ * @static
626
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document
627
+ * @param {object} oView Current view
628
+ * @param messageHandler
629
+ * @returns {Promise} Promise resolves with the new draft context in case of draft programming model
630
+ * @ui5-restricted
631
+ * @final
632
+ */
633
+ ;
634
+
635
+ _proto.editDocument = function editDocument(oContext, oView, messageHandler) {
636
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
637
+ var that = this;
638
+ var sProgrammingModel = this.getProgrammingModel(oContext);
639
+ var oEditPromise;
640
+
641
+ if (!oContext) {
642
+ return Promise.reject(new Error("Binding context to active document is required"));
643
+ }
656
644
 
657
- this._bIsModified = false;
658
- BusyLocker.lock(that.oLockObject); // before triggering the edit action we'll have to remove all bound transition messages
645
+ this._bIsModified = false;
646
+ BusyLocker.lock(that.oLockObject); // before triggering the edit action we'll have to remove all bound transition messages
659
647
 
660
- messageHandler.removeTransitionMessages();
648
+ messageHandler.removeTransitionMessages();
661
649
 
662
- if (sProgrammingModel === ProgrammingModel.Draft) {
663
- oEditPromise = draft.createDraftFromActiveDocument(oContext, this._getAppComponent(), {
664
- bPreserveChanges: true,
665
- bPrepareOnEdit: bPrepareOnEdit,
666
- oView: oView
667
- });
668
- } else if (sProgrammingModel === ProgrammingModel.Sticky) {
669
- oEditPromise = sticky.editDocumentInStickySession(oContext);
670
- } else {
671
- BusyLocker.unlock(that.oLockObject);
672
- return Promise.reject(new Error("Edit is only allowed for draft or sticky session supported services"));
673
- }
650
+ if (sProgrammingModel === ProgrammingModel.Draft) {
651
+ oEditPromise = draft.createDraftFromActiveDocument(oContext, this._getAppComponent(), {
652
+ bPreserveChanges: true,
653
+ oView: oView
654
+ });
655
+ } else if (sProgrammingModel === ProgrammingModel.Sticky) {
656
+ oEditPromise = sticky.editDocumentInStickySession(oContext, this._getAppComponent());
657
+ } else {
658
+ BusyLocker.unlock(that.oLockObject);
659
+ return Promise.reject(new Error("Edit is only allowed for draft or sticky session supported services"));
660
+ }
674
661
 
675
- return oEditPromise.then(function (oNewContext) {
676
- that._bCreateMode = false;
677
- return messageHandler.showMessageDialog().then(function () {
678
- return oNewContext;
679
- });
680
- }).catch(function (err) {
681
- return messageHandler.showMessages().then(function () {
682
- return Promise.reject(err);
683
- });
684
- }).finally(function () {
685
- BusyLocker.unlock(that.oLockObject);
662
+ return oEditPromise.then(function (oNewContext) {
663
+ that._bCreateMode = false;
664
+ return messageHandler.showMessageDialog().then(function () {
665
+ return oNewContext;
666
+ });
667
+ }).catch(function (err) {
668
+ return messageHandler.showMessages().then(function () {
669
+ return Promise.reject(err);
686
670
  });
671
+ }).finally(function () {
672
+ BusyLocker.unlock(that.oLockObject);
673
+ });
674
+ }
675
+ /**
676
+ * Cancel 'edit' mode of a document.
677
+ *
678
+ * @memberof sap.fe.core.TransactionHelper
679
+ * @static
680
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be canceled or deleted
681
+ * @param {object} [mInParameters] Optional, can contain the following attributes:
682
+ * @param {sap.m.Button} mInParameters.cancelButton Cancel Button of the discard popover (mandatory for now)
683
+ * @param {boolean} mInParameters.skipDiscardPopover Optional, supresses the discard popover incase of draft applications while navigating out of OP
684
+ * @param oResourceBundle
685
+ * @param messageHandler
686
+ * @returns {Promise} Promise resolves with ???
687
+ * @ui5-restricted
688
+ * @final
689
+ */
690
+ ;
691
+
692
+ _proto.cancelDocument = function cancelDocument(oContext, mInParameters, oResourceBundle, messageHandler) {
693
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
694
+ var that = this;
695
+ var sProgrammingModel; //context must always be passed - mandatory parameter
696
+
697
+ if (!oContext) {
698
+ return Promise.reject("No context exists. Pass a meaningful context");
687
699
  }
688
- /**
689
- * Cancel 'edit' mode of a document.
690
- *
691
- * @memberof sap.fe.core.TransactionHelper
692
- * @static
693
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be canceled or deleted
694
- * @param {object} [mInParameters] Optional, can contain the following attributes:
695
- * @param {sap.m.Button} mInParameters.cancelButton Cancel Button of the discard popover (mandatory for now)
696
- * @param {boolean} mInParameters.skipDiscardPopover Optional, supresses the discard popover incase of draft applications while navigating out of OP
697
- * @param oResourceBundle
698
- * @param messageHandler
699
- * @returns {Promise} Promise resolves with ???
700
- * @ui5-restricted
701
- * @final
702
- */
703
-
704
- }, {
705
- key: "cancelDocument",
706
- value: function cancelDocument(oContext, mInParameters, oResourceBundle, messageHandler) {
707
- // eslint-disable-next-line @typescript-eslint/no-this-alias
708
- var that = this;
709
- var sProgrammingModel; //context must always be passed - mandatory parameter
710
-
711
- if (!oContext) {
712
- return Promise.reject("No context exists. Pass a meaningful context");
713
- }
714
700
 
715
- BusyLocker.lock(that.oLockObject);
716
- var mParameters = getParameters(mInParameters);
717
- var oParamsContext = oContext,
718
- oCancelButton = mParameters.cancelButton,
719
- oModel = oParamsContext.getModel();
720
- var onBeforeCancelPromise, sCanonicalPath;
721
- return Promise.resolve(this.getProgrammingModel(oContext)).then(function (sPModel) {
722
- sProgrammingModel = sPModel;
723
-
724
- if (sPModel === ProgrammingModel.Draft) {
725
- var draftDataContext = oModel.bindContext(oParamsContext.getPath() + "/DraftAdministrativeData").getBoundContext();
726
-
727
- if (!that._bIsModified) {
728
- return draftDataContext.requestObject().then(function (draftAdminData) {
729
- if (draftAdminData) {
730
- that._bIsModified = !(draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime);
731
- }
732
- });
733
- }
734
- }
735
- }).then(function () {
736
- if (!mParameters.skipDiscardPopover) {
737
- return that._showDiscardPopover(oCancelButton, that._bIsModified, oResourceBundle);
738
- } else {
739
- return Promise.resolve();
740
- }
741
- }).then(function () {
742
- if (mParameters.beforeCancelCallBack) {
743
- onBeforeCancelPromise = mParameters.beforeCancelCallBack({
744
- context: oContext
701
+ BusyLocker.lock(that.oLockObject);
702
+ var mParameters = getParameters(mInParameters);
703
+ var oParamsContext = oContext,
704
+ oCancelButton = mParameters.cancelButton,
705
+ oModel = oParamsContext.getModel();
706
+ var onBeforeCancelPromise, sCanonicalPath;
707
+ return Promise.resolve(this.getProgrammingModel(oContext)).then(function (sPModel) {
708
+ sProgrammingModel = sPModel;
709
+
710
+ if (sPModel === ProgrammingModel.Draft) {
711
+ var draftDataContext = oModel.bindContext(oParamsContext.getPath() + "/DraftAdministrativeData").getBoundContext();
712
+
713
+ if (!that._bIsModified) {
714
+ return draftDataContext.requestObject().then(function (draftAdminData) {
715
+ if (draftAdminData) {
716
+ that._bIsModified = !(draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime);
717
+ }
745
718
  });
746
- } else {
747
- onBeforeCancelPromise = Promise.resolve();
748
719
  }
720
+ }
721
+ }).then(function () {
722
+ if (!mParameters.skipDiscardPopover) {
723
+ return that._showDiscardPopover(oCancelButton, that._bIsModified, oResourceBundle);
724
+ } else {
725
+ return Promise.resolve();
726
+ }
727
+ }).then(function () {
728
+ if (mParameters.beforeCancelCallBack) {
729
+ onBeforeCancelPromise = mParameters.beforeCancelCallBack({
730
+ context: oContext
731
+ });
732
+ } else {
733
+ onBeforeCancelPromise = Promise.resolve();
734
+ }
749
735
 
750
- return onBeforeCancelPromise;
751
- }).then(function () {
752
- // eslint-disable-next-line default-case
753
- switch (sProgrammingModel) {
754
- case ProgrammingModel.Draft:
755
- return oParamsContext.requestObject("HasActiveEntity").then(function (bHasActiveEntity) {
756
- var oDeletePromise;
736
+ return onBeforeCancelPromise;
737
+ }).then(function () {
738
+ // eslint-disable-next-line default-case
739
+ switch (sProgrammingModel) {
740
+ case ProgrammingModel.Draft:
741
+ return oParamsContext.requestObject("HasActiveEntity").then(function (bHasActiveEntity) {
742
+ var oDeletePromise;
743
+
744
+ if (!bHasActiveEntity) {
745
+ if (oParamsContext && oParamsContext.hasPendingChanges()) {
746
+ oParamsContext.getBinding().resetChanges();
747
+ }
748
+
749
+ oDeletePromise = draft.deleteDraft(oParamsContext);
750
+ return oDeletePromise;
751
+ } else {
752
+ var oActiveContext = oModel.bindContext(oParamsContext.getPath() + "/SiblingEntity").getBoundContext();
753
+ return oActiveContext.requestCanonicalPath().then(function (sPath) {
754
+ sCanonicalPath = sPath;
757
755
 
758
- if (!bHasActiveEntity) {
759
756
  if (oParamsContext && oParamsContext.hasPendingChanges()) {
760
757
  oParamsContext.getBinding().resetChanges();
761
758
  }
762
759
 
763
760
  oDeletePromise = draft.deleteDraft(oParamsContext);
764
761
  return oDeletePromise;
765
- } else {
766
- var oActiveContext = oModel.bindContext(oParamsContext.getPath() + "/SiblingEntity").getBoundContext();
767
- return oActiveContext.requestCanonicalPath().then(function (sPath) {
768
- sCanonicalPath = sPath;
769
-
770
- if (oParamsContext && oParamsContext.hasPendingChanges()) {
771
- oParamsContext.getBinding().resetChanges();
772
- }
773
-
774
- oDeletePromise = draft.deleteDraft(oParamsContext);
775
- return oDeletePromise;
776
- }, function () {
777
- draft.deleteDraft(oParamsContext);
762
+ }, function () {
763
+ draft.deleteDraft(oParamsContext);
764
+ return;
765
+ }).then(function () {
766
+ //oParamsContext.delete() in the previous promise doesnt return anything upon success.
767
+ if (!sCanonicalPath) {
778
768
  return;
779
- }).then(function () {
780
- //oParamsContext.delete() in the previous promise doesnt return anything upon success.
781
- if (!sCanonicalPath) {
782
- return;
783
- }
769
+ }
784
770
 
785
- if (oActiveContext.getPath() !== sCanonicalPath) {
786
- // the active context is using the sibling entity - this path is not accessible anymore as we deleted the draft
787
- // document - therefore we need to create a new context with the canonical path
788
- oActiveContext = oModel.bindContext(sCanonicalPath).getBoundContext();
789
- }
771
+ if (oActiveContext.getPath() !== sCanonicalPath) {
772
+ // the active context is using the sibling entity - this path is not accessible anymore as we deleted the draft
773
+ // document - therefore we need to create a new context with the canonical path
774
+ oActiveContext = oModel.bindContext(sCanonicalPath).getBoundContext();
775
+ }
790
776
 
791
- return oActiveContext;
792
- });
793
- }
794
- });
777
+ return oActiveContext;
778
+ });
779
+ }
780
+ });
795
781
 
796
- case ProgrammingModel.Sticky:
797
- return sticky.discardDocument(oContext).then(function (oContext) {
798
- if (oContext) {
799
- if (oContext.hasPendingChanges()) {
800
- oContext.getBinding().resetChanges();
801
- }
782
+ case ProgrammingModel.Sticky:
783
+ return sticky.discardDocument(oContext).then(function (oContext) {
784
+ if (oContext) {
785
+ if (oContext.hasPendingChanges()) {
786
+ oContext.getBinding().resetChanges();
787
+ }
802
788
 
803
- if (!that._bCreateMode) {
804
- oContext.refresh();
805
- return oContext;
806
- }
789
+ if (!that._bCreateMode) {
790
+ oContext.refresh();
791
+ return oContext;
807
792
  }
793
+ }
808
794
 
809
- return false;
810
- });
795
+ return false;
796
+ });
811
797
 
812
- default:
813
- return Promise.reject("Cancel document only allowed for draft or sticky session supported services");
814
- }
815
- }).then(function (context) {
816
- that._bIsModified = false; // remove existing bound transition messages
798
+ default:
799
+ return Promise.reject("Cancel document only allowed for draft or sticky session supported services");
800
+ }
801
+ }).then(function (context) {
802
+ that._bIsModified = false; // remove existing bound transition messages
817
803
 
818
- messageHandler.removeTransitionMessages(); // show unbound messages
804
+ messageHandler.removeTransitionMessages(); // show unbound messages
819
805
 
820
- return messageHandler.showMessages().then(function () {
821
- return context;
822
- });
823
- }).catch(function (err) {
824
- return messageHandler.showMessages().then(function () {
825
- return Promise.reject(err);
826
- });
827
- }).finally(function () {
828
- BusyLocker.unlock(that.oLockObject);
806
+ return messageHandler.showMessages().then(function () {
807
+ return context;
808
+ });
809
+ }).catch(function (err) {
810
+ return messageHandler.showMessages().then(function () {
811
+ return Promise.reject(err);
829
812
  });
813
+ }).finally(function () {
814
+ BusyLocker.unlock(that.oLockObject);
815
+ });
816
+ }
817
+ /**
818
+ * Saves the document.
819
+ *
820
+ * @memberof sap.fe.core.TransactionHelper
821
+ * @static
822
+ * @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be saved
823
+ * @param oResourceBundle
824
+ * @param bExecuteSideEffectsOnError
825
+ * @param aBindings
826
+ * @param messageHandler
827
+ * @returns {Promise} Promise resolves with ???
828
+ * @ui5-restricted
829
+ * @final
830
+ */
831
+ ;
832
+
833
+ _proto.saveDocument = function saveDocument(oContext, oResourceBundle, bExecuteSideEffectsOnError, aBindings, messageHandler) {
834
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
835
+ var that = this;
836
+ var sProgrammingModel = this.getProgrammingModel(oContext);
837
+ var oSavePromise;
838
+
839
+ if (!oContext) {
840
+ return Promise.reject(new Error("Binding context to draft document is required"));
841
+ } // in case of saving / activating the bound transition messages shall be removed before the PATCH/POST
842
+ // is sent to the backend
843
+
844
+
845
+ messageHandler.removeTransitionMessages();
846
+ BusyLocker.lock(that.oLockObject);
847
+
848
+ if (sProgrammingModel === ProgrammingModel.Draft) {
849
+ oSavePromise = draft.activateDocument(oContext, this._getAppComponent(), {});
850
+ } else if (sProgrammingModel === ProgrammingModel.Sticky) {
851
+ oSavePromise = sticky.activateDocument(oContext);
852
+ } else {
853
+ BusyLocker.unlock(that.oLockObject);
854
+ return Promise.reject(new Error("Save is only allowed for draft or sticky session supported services"));
830
855
  }
831
- /**
832
- * Saves the document.
833
- *
834
- * @memberof sap.fe.core.TransactionHelper
835
- * @static
836
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be saved
837
- * @param oResourceBundle
838
- * @param bExecuteSideEffectsOnError
839
- * @param aBindings
840
- * @param messageHandler
841
- * @returns {Promise} Promise resolves with ???
842
- * @ui5-restricted
843
- * @final
844
- */
845
-
846
- }, {
847
- key: "saveDocument",
848
- value: function saveDocument(oContext, oResourceBundle, bExecuteSideEffectsOnError, aBindings, messageHandler) {
849
- // eslint-disable-next-line @typescript-eslint/no-this-alias
850
- var that = this;
851
- var sProgrammingModel = this.getProgrammingModel(oContext);
852
- var oSavePromise;
853
-
854
- if (!oContext) {
855
- return Promise.reject(new Error("Binding context to draft document is required"));
856
- } // in case of saving / activating the bound transition messages shall be removed before the PATCH/POST
857
- // is sent to the backend
858
-
859
-
860
- messageHandler.removeTransitionMessages();
861
- BusyLocker.lock(that.oLockObject);
862
-
863
- if (sProgrammingModel === ProgrammingModel.Draft) {
864
- oSavePromise = draft.activateDocument(oContext, this._getAppComponent(), {});
865
- } else if (sProgrammingModel === ProgrammingModel.Sticky) {
866
- oSavePromise = sticky.activateDocument(oContext);
867
- } else {
868
- BusyLocker.unlock(that.oLockObject);
869
- return Promise.reject(new Error("Save is only allowed for draft or sticky session supported services"));
870
- }
871
856
 
872
- return oSavePromise.then(function (oActiveDocument) {
873
- var bNewObject = that.sProgrammingModel === ProgrammingModel.Sticky ? that._bCreateMode : !oContext.getObject().HasActiveEntity;
874
- MessageToast.show(bNewObject ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_CREATED", oResourceBundle) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_SAVED", oResourceBundle));
875
- that._bIsModified = false;
876
- return messageHandler.showMessageDialog().then(function () {
877
- return oActiveDocument;
857
+ return oSavePromise.then(function (oActiveDocument) {
858
+ var bNewObject = that.sProgrammingModel === ProgrammingModel.Sticky ? that._bCreateMode : !oContext.getObject().HasActiveEntity;
859
+ MessageToast.show(bNewObject ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_CREATED", oResourceBundle) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_SAVED", oResourceBundle));
860
+ that._bIsModified = false;
861
+ return messageHandler.showMessageDialog().then(function () {
862
+ return oActiveDocument;
863
+ });
864
+ }).catch(function (err) {
865
+ if (aBindings && aBindings.length > 0) {
866
+ /* The sideEffects are executed only for table items in transient state */
867
+ aBindings.forEach(function (oListBinding) {
868
+ if (!CommonUtils.hasTransientContext(oListBinding) && bExecuteSideEffectsOnError) {
869
+ var oAppComponent = that._getAppComponent();
870
+
871
+ oAppComponent.getSideEffectsService().requestSideEffectsForNavigationProperty(oListBinding.getPath(), oContext);
872
+ }
878
873
  });
879
- }).catch(function (err) {
880
- if (aBindings && aBindings.length > 0) {
881
- /* The sideEffects are executed only for table items in transient state */
882
- aBindings.forEach(function (oListBinding) {
883
- if (!CommonUtils.hasTransientContext(oListBinding) && bExecuteSideEffectsOnError) {
884
- var oAppComponent = that._getAppComponent();
885
-
886
- oAppComponent.getSideEffectsService().requestSideEffectsForNavigationProperty(oListBinding.getPath(), oContext);
887
- }
888
- });
889
- }
874
+ }
890
875
 
891
- return messageHandler.showMessages().then(function () {
892
- return Promise.reject(err);
893
- });
894
- }).finally(function () {
895
- BusyLocker.unlock(that.oLockObject);
876
+ return messageHandler.showMessages().then(function () {
877
+ return Promise.reject(err);
896
878
  });
879
+ }).finally(function () {
880
+ BusyLocker.unlock(that.oLockObject);
881
+ });
882
+ }
883
+ /**
884
+ * Calls a bound or unbound action.
885
+ *
886
+ * @function
887
+ * @static
888
+ * @name sap.fe.core.TransactionHelper.callAction
889
+ * @memberof sap.fe.core.TransactionHelper
890
+ * @param {string} sActionName The name of the action to be called
891
+ * @param {map} [mParameters] Contains the following attributes:
892
+ * @param {sap.ui.model.odata.v4.Context} [mParameters.contexts] Mandatory for a bound action: Either one context or an array with contexts for which the action is to be called
893
+ * @param {sap.ui.model.odata.v4.ODataModel} [mParameters.model] Mandatory for an unbound action: An instance of an OData V4 model
894
+ * @param {string} [mParameters.invocationGrouping] Mode how actions are to be called: 'ChangeSet' to put all action calls into one changeset, 'Isolated' to put them into separate changesets
895
+ * @param {string} [mParameters.label] A human-readable label for the action
896
+ * @param {boolean} [mParameters.bGetBoundContext] If specified, the action promise returns the bound context
897
+ * @param {object} oView Contains the object of the current view
898
+ * @param messageHandler
899
+ * @returns {Promise} Promise resolves with an array of response objects (TODO: to be changed)
900
+ * @ui5-restricted
901
+ * @final
902
+ **/
903
+ ;
904
+
905
+ _proto.callAction = function callAction(sActionName, mParameters, oView, messageHandler) {
906
+ mParameters = getParameters(mParameters); // eslint-disable-next-line @typescript-eslint/no-this-alias
907
+
908
+ var that = this;
909
+ var oContext, oModel, oPromise;
910
+ var mBindingParameters = mParameters.bindingParameters;
911
+
912
+ if (!sActionName) {
913
+ return Promise.reject("Provide name of action to be executed");
914
+ } // action imports are not directly obtained from the metaModel by it is present inside the entityContainer
915
+ // and the acions it refers to present outside the entitycontainer, hence to obtain kind of the action
916
+ // split() on its name was required
917
+
918
+
919
+ var sName = sActionName.split("/")[1];
920
+ sActionName = sName || sActionName;
921
+ oContext = sName ? undefined : mParameters.contexts; //checking whether the context is an array with more than 0 length or not an array(create action)
922
+
923
+ if (oContext && (Array.isArray(oContext) && oContext.length || !Array.isArray(oContext))) {
924
+ oContext = Array.isArray(oContext) ? oContext[0] : oContext;
925
+ oModel = oContext.getModel();
897
926
  }
898
- /**
899
- * Calls a bound or unbound action.
900
- *
901
- * @function
902
- * @static
903
- * @name sap.fe.core.TransactionHelper.callAction
904
- * @memberof sap.fe.core.TransactionHelper
905
- * @param {string} sActionName The name of the action to be called
906
- * @param {map} [mParameters] Contains the following attributes:
907
- * @param {sap.ui.model.odata.v4.Context} [mParameters.contexts] Mandatory for a bound action: Either one context or an array with contexts for which the action is to be called
908
- * @param {sap.ui.model.odata.v4.ODataModel} [mParameters.model] Mandatory for an unbound action: An instance of an OData V4 model
909
- * @param {string} [mParameters.invocationGrouping] Mode how actions are to be called: 'ChangeSet' to put all action calls into one changeset, 'Isolated' to put them into separate changesets
910
- * @param {string} [mParameters.label] A human-readable label for the action
911
- * @param {boolean} [mParameters.bGetBoundContext] If specified, the action promise returns the bound context
912
- * @param {object} oView Contains the object of the current view
913
- * @param messageHandler
914
- * @returns {Promise} Promise resolves with an array of response objects (TODO: to be changed)
915
- * @ui5-restricted
916
- * @final
917
- **/
918
-
919
- }, {
920
- key: "callAction",
921
- value: function callAction(sActionName, mParameters, oView, messageHandler) {
922
- mParameters = getParameters(mParameters); // eslint-disable-next-line @typescript-eslint/no-this-alias
923
-
924
- var that = this;
925
- var oContext, oModel, oPromise;
926
- var mBindingParameters = mParameters.bindingParameters;
927
-
928
- if (!sActionName) {
929
- return Promise.reject("Provide name of action to be executed");
930
- } // action imports are not directly obtained from the metaModel by it is present inside the entityContainer
931
- // and the acions it refers to present outside the entitycontainer, hence to obtain kind of the action
932
- // split() on its name was required
933
-
934
-
935
- var sName = sActionName.split("/")[1];
936
- sActionName = sName || sActionName;
937
- oContext = sName ? undefined : mParameters.contexts; //checking whether the context is an array with more than 0 length or not an array(create action)
938
-
939
- if (oContext && (Array.isArray(oContext) && oContext.length || !Array.isArray(oContext))) {
940
- oContext = Array.isArray(oContext) ? oContext[0] : oContext;
941
- oModel = oContext.getModel();
942
- }
943
927
 
944
- if (mParameters.model) {
945
- oModel = mParameters.model;
946
- }
928
+ if (mParameters.model) {
929
+ oModel = mParameters.model;
930
+ }
947
931
 
948
- if (!oModel) {
949
- return Promise.reject("Pass a context for a bound action or pass the model for an unbound action");
950
- } // get the binding parameters $select and $expand for the side effect on this action
951
- // also gather additional property paths to be requested such as text associations
932
+ if (!oModel) {
933
+ return Promise.reject("Pass a context for a bound action or pass the model for an unbound action");
934
+ } // get the binding parameters $select and $expand for the side effect on this action
935
+ // also gather additional property paths to be requested such as text associations
952
936
 
953
937
 
954
- var oAppComponent = that._getAppComponent();
938
+ var oAppComponent = that._getAppComponent();
955
939
 
956
- var mSideEffectsParameters = oAppComponent.getSideEffectsService().getODataActionSideEffects(sActionName, oContext) || {};
940
+ var mSideEffectsParameters = oAppComponent.getSideEffectsService().getODataActionSideEffects(sActionName, oContext) || {};
957
941
 
958
- if (oContext && oModel) {
959
- oPromise = new Promise(function (resolve, reject) {
960
- var oApplicableContextDialog;
961
- var oController = {
962
- onClose: function () {
963
- // User cancels action
964
- oApplicableContextDialog.close();
965
- resolve();
966
- },
967
- onContinue: function () {
968
- // Users continues the action with the bound contexts
969
- oApplicableContextDialog.close();
970
- resolve(mParameters.applicableContext);
971
- }
972
- };
942
+ if (oContext && oModel) {
943
+ oPromise = new Promise(function (resolve, reject) {
944
+ var oApplicableContextDialog;
945
+ var oController = {
946
+ onClose: function () {
947
+ // User cancels action
948
+ oApplicableContextDialog.close();
949
+ resolve();
950
+ },
951
+ onContinue: function () {
952
+ // Users continues the action with the bound contexts
953
+ oApplicableContextDialog.close();
954
+ resolve(mParameters.applicableContext);
955
+ }
956
+ };
973
957
 
974
- var fnOpenAndFillDialog = function () {
975
- var oDialogContent;
976
- var nNotApplicable = mParameters.notApplicableContext.length,
977
- aNotApplicableItems = [];
958
+ var fnOpenAndFillDialog = function () {
959
+ var oDialogContent;
960
+ var nNotApplicable = mParameters.notApplicableContext.length,
961
+ aNotApplicableItems = [];
978
962
 
979
- for (var i = 0; i < mParameters.notApplicableContext.length; i++) {
980
- oDialogContent = mParameters.notApplicableContext[i].getObject();
981
- aNotApplicableItems.push(oDialogContent);
982
- }
963
+ for (var i = 0; i < mParameters.notApplicableContext.length; i++) {
964
+ oDialogContent = mParameters.notApplicableContext[i].getObject();
965
+ aNotApplicableItems.push(oDialogContent);
966
+ }
983
967
 
984
- var oNotApplicableItemsModel = new JSONModel(aNotApplicableItems);
985
- var oTotals = new JSONModel({
986
- total: nNotApplicable,
987
- label: mParameters.label
988
- });
989
- oApplicableContextDialog.setModel(oNotApplicableItemsModel, "notApplicable");
990
- oApplicableContextDialog.setModel(oTotals, "totals");
991
- oApplicableContextDialog.open();
992
- };
968
+ var oNotApplicableItemsModel = new JSONModel(aNotApplicableItems);
969
+ var oTotals = new JSONModel({
970
+ total: nNotApplicable,
971
+ label: mParameters.label
972
+ });
973
+ oApplicableContextDialog.setModel(oNotApplicableItemsModel, "notApplicable");
974
+ oApplicableContextDialog.setModel(oTotals, "totals");
975
+ oApplicableContextDialog.open();
976
+ };
993
977
 
994
- if (mParameters.notApplicableContext && mParameters.notApplicableContext.length >= 1) {
995
- // Show the contexts that are not applicable and will not therefore be processed
996
- var sFragmentName = "sap.fe.core.controls.ActionPartial";
997
- var oDialogFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment");
998
- var oMetaModel = oModel.getMetaModel();
999
- var sCanonicalPath = mParameters.contexts[0].getCanonicalPath();
1000
- var sEntitySet = sCanonicalPath.substr(0, sCanonicalPath.indexOf("(")) + "/";
1001
- var oDialogLabelModel = new JSONModel({
1002
- title: mParameters.label
1003
- });
1004
- Promise.resolve(XMLPreprocessor.process(oDialogFragment, {
1005
- name: sFragmentName
1006
- }, {
1007
- bindingContexts: {
1008
- entityType: oMetaModel.createBindingContext(sEntitySet),
1009
- label: oDialogLabelModel.createBindingContext("/")
1010
- },
1011
- models: {
1012
- entityType: oMetaModel,
1013
- metaModel: oMetaModel,
1014
- label: oDialogLabelModel
1015
- }
1016
- })).then(function (oFragment) {
1017
- return Fragment.load({
1018
- definition: oFragment,
1019
- controller: oController
1020
- });
1021
- }).then(function (oPopover) {
1022
- oApplicableContextDialog = oPopover;
1023
- mParameters.parentControl.addDependent(oPopover);
1024
- fnOpenAndFillDialog();
1025
- }).catch(reject);
1026
- } else {
1027
- resolve(mParameters.contexts);
1028
- }
1029
- }).then(function (contextToProcess) {
1030
- if (contextToProcess) {
1031
- return operations.callBoundAction(sActionName, contextToProcess, oModel, oAppComponent, {
1032
- invocationGrouping: mParameters.invocationGrouping,
1033
- label: mParameters.label,
1034
- showActionParameterDialog: true,
1035
- mBindingParameters: mBindingParameters,
1036
- entitySetName: mParameters.entitySetName,
1037
- additionalSideEffect: mSideEffectsParameters,
1038
- onSubmitted: function () {
1039
- messageHandler.removeTransitionMessages();
1040
- BusyLocker.lock(that.oLockObject);
1041
- },
1042
- onResponse: function () {
1043
- BusyLocker.unlock(that.oLockObject);
1044
- },
1045
- parentControl: mParameters.parentControl,
1046
- internalModelContext: mParameters.internalModelContext,
1047
- operationAvailableMap: mParameters.operationAvailableMap,
1048
- bIsCreateAction: mParameters.bIsCreateAction,
1049
- bGetBoundContext: mParameters.bGetBoundContext,
1050
- bObjectPage: mParameters.bObjectPage,
1051
- messageHandler: messageHandler,
1052
- defaultValuesExtensionFunction: mParameters.defaultValuesExtensionFunction
978
+ if (mParameters.notApplicableContext && mParameters.notApplicableContext.length >= 1) {
979
+ // Show the contexts that are not applicable and will not therefore be processed
980
+ var sFragmentName = "sap.fe.core.controls.ActionPartial";
981
+ var oDialogFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment");
982
+ var oMetaModel = oModel.getMetaModel();
983
+ var sCanonicalPath = mParameters.contexts[0].getCanonicalPath();
984
+ var sEntitySet = sCanonicalPath.substr(0, sCanonicalPath.indexOf("(")) + "/";
985
+ var oDialogLabelModel = new JSONModel({
986
+ title: mParameters.label
987
+ });
988
+ Promise.resolve(XMLPreprocessor.process(oDialogFragment, {
989
+ name: sFragmentName
990
+ }, {
991
+ bindingContexts: {
992
+ entityType: oMetaModel.createBindingContext(sEntitySet),
993
+ label: oDialogLabelModel.createBindingContext("/")
994
+ },
995
+ models: {
996
+ entityType: oMetaModel,
997
+ metaModel: oMetaModel,
998
+ label: oDialogLabelModel
999
+ }
1000
+ })).then(function (oFragment) {
1001
+ return Fragment.load({
1002
+ definition: oFragment,
1003
+ controller: oController
1053
1004
  });
1054
- } else {
1055
- return null;
1056
- }
1057
- });
1058
- } else {
1059
- // TODO: confirm if action import needs side effects.
1060
- oPromise = operations.callActionImport(sActionName, oModel, oAppComponent, {
1061
- label: mParameters.label,
1062
- showActionParameterDialog: true,
1063
- bindingParameters: mBindingParameters,
1064
- entitySetName: mParameters.entitySetName,
1065
- onSubmitted: function () {
1066
- BusyLocker.lock(that.oLockObject);
1067
- },
1068
- onResponse: function () {
1069
- BusyLocker.unlock(that.oLockObject);
1070
- },
1071
- parentControl: mParameters.parentControl,
1072
- internalModelContext: mParameters.internalModelContext,
1073
- operationAvailableMap: mParameters.operationAvailableMap,
1074
- messageHandler: messageHandler,
1075
- bObjectPage: mParameters.bObjectPage
1076
- });
1077
- }
1078
-
1079
- return oPromise.then(function (oResult) {
1080
- // Succeeded
1081
- return that._handleActionResponse(messageHandler, mParameters, sActionName).then(function () {
1082
- return oResult;
1083
- });
1084
- }).catch(function (err) {
1085
- return that._handleActionResponse(messageHandler, mParameters, sActionName).then(function () {
1086
- return Promise.reject(err);
1087
- });
1005
+ }).then(function (oPopover) {
1006
+ oApplicableContextDialog = oPopover;
1007
+ mParameters.parentControl.addDependent(oPopover);
1008
+ fnOpenAndFillDialog();
1009
+ }).catch(reject);
1010
+ } else {
1011
+ resolve(mParameters.contexts);
1012
+ }
1013
+ }).then(function (contextToProcess) {
1014
+ if (contextToProcess) {
1015
+ return operations.callBoundAction(sActionName, contextToProcess, oModel, oAppComponent, {
1016
+ invocationGrouping: mParameters.invocationGrouping,
1017
+ label: mParameters.label,
1018
+ showActionParameterDialog: true,
1019
+ mBindingParameters: mBindingParameters,
1020
+ entitySetName: mParameters.entitySetName,
1021
+ additionalSideEffect: mSideEffectsParameters,
1022
+ onSubmitted: function () {
1023
+ messageHandler.removeTransitionMessages();
1024
+ BusyLocker.lock(that.oLockObject);
1025
+ },
1026
+ onResponse: function () {
1027
+ BusyLocker.unlock(that.oLockObject);
1028
+ },
1029
+ parentControl: mParameters.parentControl,
1030
+ internalModelContext: mParameters.internalModelContext,
1031
+ operationAvailableMap: mParameters.operationAvailableMap,
1032
+ bIsCreateAction: mParameters.bIsCreateAction,
1033
+ bGetBoundContext: mParameters.bGetBoundContext,
1034
+ bObjectPage: mParameters.bObjectPage,
1035
+ messageHandler: messageHandler,
1036
+ defaultValuesExtensionFunction: mParameters.defaultValuesExtensionFunction
1037
+ });
1038
+ } else {
1039
+ return null;
1040
+ }
1041
+ });
1042
+ } else {
1043
+ // TODO: confirm if action import needs side effects.
1044
+ oPromise = operations.callActionImport(sActionName, oModel, oAppComponent, {
1045
+ label: mParameters.label,
1046
+ showActionParameterDialog: true,
1047
+ bindingParameters: mBindingParameters,
1048
+ entitySetName: mParameters.entitySetName,
1049
+ onSubmitted: function () {
1050
+ BusyLocker.lock(that.oLockObject);
1051
+ },
1052
+ onResponse: function () {
1053
+ BusyLocker.unlock(that.oLockObject);
1054
+ },
1055
+ parentControl: mParameters.parentControl,
1056
+ internalModelContext: mParameters.internalModelContext,
1057
+ operationAvailableMap: mParameters.operationAvailableMap,
1058
+ messageHandler: messageHandler,
1059
+ bObjectPage: mParameters.bObjectPage
1088
1060
  });
1089
1061
  }
1090
- /**
1091
- * Handles messages for action call.
1092
- *
1093
- * @function
1094
- * @name sap.fe.core.TransactionHelper#_handleActionResponse
1095
- * @memberof sap.fe.core.TransactionHelper
1096
- * @param messageHandler
1097
- * @param {object} mParameters Parameters to be considered for the action.
1098
- * @param {string} sActionName The name of the action to be called
1099
- * @returns {Promise} Promise after message dialog is opened if required.
1100
- * @ui5-restricted
1101
- * @final
1102
- */
1103
-
1104
- }, {
1105
- key: "_handleActionResponse",
1106
- value: function _handleActionResponse(messageHandler, mParameters, sActionName) {
1107
- var aTransientMessages = messageHandling.getMessages(true, true);
1108
-
1109
- if (aTransientMessages.length > 0 && mParameters && mParameters.internalModelContext) {
1110
- mParameters.internalModelContext.setProperty("sActionName", mParameters.label ? mParameters.label : sActionName);
1111
- }
1112
1062
 
1113
- return messageHandler.showMessages();
1114
- }
1115
- /**
1116
- * Handles validation errors for the 'discard' action.
1117
- *
1118
- * @function
1119
- * @name sap.fe.core.TransactionHelper#handleValidationError
1120
- * @memberof sap.fe.core.TransactionHelper
1121
- * @static
1122
- * @ui5-restricted
1123
- * @final
1124
- */
1125
-
1126
- }, {
1127
- key: "handleValidationError",
1128
- value: function handleValidationError() {
1129
- var oMessageManager = sap.ui.getCore().getMessageManager(),
1130
- errorToRemove = oMessageManager.getMessageModel().getData().filter(function (error) {
1131
- // only needs to handle validation messages, technical and persistent errors needs not to be checked here.
1132
- if (error.validation) {
1133
- return error;
1134
- }
1063
+ return oPromise.then(function (oResult) {
1064
+ // Succeeded
1065
+ return that._handleActionResponse(messageHandler, mParameters, sActionName).then(function () {
1066
+ return oResult;
1067
+ });
1068
+ }).catch(function (err) {
1069
+ return that._handleActionResponse(messageHandler, mParameters, sActionName).then(function () {
1070
+ return Promise.reject(err);
1135
1071
  });
1136
- oMessageManager.removeMessages(errorToRemove);
1072
+ });
1073
+ }
1074
+ /**
1075
+ * Handles messages for action call.
1076
+ *
1077
+ * @function
1078
+ * @name sap.fe.core.TransactionHelper#_handleActionResponse
1079
+ * @memberof sap.fe.core.TransactionHelper
1080
+ * @param messageHandler
1081
+ * @param {object} mParameters Parameters to be considered for the action.
1082
+ * @param {string} sActionName The name of the action to be called
1083
+ * @returns {Promise} Promise after message dialog is opened if required.
1084
+ * @ui5-restricted
1085
+ * @final
1086
+ */
1087
+ ;
1088
+
1089
+ _proto._handleActionResponse = function _handleActionResponse(messageHandler, mParameters, sActionName) {
1090
+ var aTransientMessages = messageHandling.getMessages(true, true);
1091
+
1092
+ if (aTransientMessages.length > 0 && mParameters && mParameters.internalModelContext) {
1093
+ mParameters.internalModelContext.setProperty("sActionName", mParameters.label ? mParameters.label : sActionName);
1137
1094
  }
1138
- /**
1139
- * Shows a popover if it needs to be shown.
1140
- * TODO: Popover is shown if user has modified any data.
1141
- * TODO: Popover is shown if there's a difference from draft admin data.
1142
- * @static
1143
- * @name sap.fe.core.TransactionHelper._showDiscardPopover
1144
- * @memberof sap.fe.core.TransactionHelper
1145
- * @param {sap.ui.core.Control} oCancelButton The control which will open the popover
1146
- * @param bIsModified
1147
- * @param oResourceBundle
1148
- * @returns {Promise} Promise resolves if user confirms discard, rejects if otherwise, rejects if no control passed to open popover
1149
- * @ui5-restricted
1150
- * @final
1151
- */
1152
-
1153
- }, {
1154
- key: "_showDiscardPopover",
1155
- value: function _showDiscardPopover(oCancelButton, bIsModified, oResourceBundle) {
1156
- // TODO: Implement this popover as a fragment as in v2??
1157
- // eslint-disable-next-line @typescript-eslint/no-this-alias
1158
- var that = this;
1159
- that._bContinueDiscard = false; // to be implemented
1160
-
1161
- return new Promise(function (resolve, reject) {
1162
- if (!oCancelButton) {
1163
- reject("Cancel button not found");
1164
- } //Show popover only when data is changed.
1165
-
1166
-
1167
- if (bIsModified) {
1168
- var fnOnAfterDiscard = function () {
1169
- oCancelButton.setEnabled(true);
1170
-
1171
- if (that._bContinueDiscard) {
1172
- resolve();
1173
- } else {
1174
- reject("Discard operation was rejected. Document has not been discarded");
1175
- }
1176
1095
 
1177
- that._oPopover.detachAfterClose(fnOnAfterDiscard);
1178
- };
1179
-
1180
- if (!that._oPopover) {
1181
- var oText = new Text({
1182
- //This text is the same as LR v2.
1183
- //TODO: Display message provided by app developer???
1184
- text: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_DRAFT_DISCARD_MESSAGE", oResourceBundle)
1185
- }),
1186
- oButton = new Button({
1187
- text: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_DRAFT_DISCARD_BUTTON", oResourceBundle),
1188
- width: "100%",
1189
- press: function () {
1190
- that.handleValidationError();
1191
- that._bContinueDiscard = true;
1096
+ return messageHandler.showMessages();
1097
+ }
1098
+ /**
1099
+ * Handles validation errors for the 'discard' action.
1100
+ *
1101
+ * @function
1102
+ * @name sap.fe.core.TransactionHelper#handleValidationError
1103
+ * @memberof sap.fe.core.TransactionHelper
1104
+ * @static
1105
+ * @ui5-restricted
1106
+ * @final
1107
+ */
1108
+ ;
1109
+
1110
+ _proto.handleValidationError = function handleValidationError() {
1111
+ var oMessageManager = sap.ui.getCore().getMessageManager(),
1112
+ errorToRemove = oMessageManager.getMessageModel().getData().filter(function (error) {
1113
+ // only needs to handle validation messages, technical and persistent errors needs not to be checked here.
1114
+ if (error.validation) {
1115
+ return error;
1116
+ }
1117
+ });
1118
+ oMessageManager.removeMessages(errorToRemove);
1119
+ }
1120
+ /**
1121
+ * Shows a popover if it needs to be shown.
1122
+ * TODO: Popover is shown if user has modified any data.
1123
+ * TODO: Popover is shown if there's a difference from draft admin data.
1124
+ * @static
1125
+ * @name sap.fe.core.TransactionHelper._showDiscardPopover
1126
+ * @memberof sap.fe.core.TransactionHelper
1127
+ * @param {sap.ui.core.Control} oCancelButton The control which will open the popover
1128
+ * @param bIsModified
1129
+ * @param oResourceBundle
1130
+ * @returns {Promise} Promise resolves if user confirms discard, rejects if otherwise, rejects if no control passed to open popover
1131
+ * @ui5-restricted
1132
+ * @final
1133
+ */
1134
+ ;
1135
+
1136
+ _proto._showDiscardPopover = function _showDiscardPopover(oCancelButton, bIsModified, oResourceBundle) {
1137
+ // TODO: Implement this popover as a fragment as in v2??
1138
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
1139
+ var that = this;
1140
+ that._bContinueDiscard = false; // to be implemented
1141
+
1142
+ return new Promise(function (resolve, reject) {
1143
+ if (!oCancelButton) {
1144
+ reject("Cancel button not found");
1145
+ } //Show popover only when data is changed.
1146
+
1147
+
1148
+ if (bIsModified) {
1149
+ var fnOnAfterDiscard = function () {
1150
+ oCancelButton.setEnabled(true);
1151
+
1152
+ if (that._bContinueDiscard) {
1153
+ resolve();
1154
+ } else {
1155
+ reject("Discard operation was rejected. Document has not been discarded");
1156
+ }
1192
1157
 
1193
- that._oPopover.close();
1194
- },
1195
- ariaLabelledBy: oText
1196
- });
1197
- that._oPopover = new Popover({
1198
- showHeader: false,
1199
- placement: "Top",
1200
- content: [new VBox({
1201
- items: [oText, oButton]
1202
- })],
1203
- beforeOpen: function () {
1204
- // make sure to NOT trigger multiple cancel flows
1205
- oCancelButton.setEnabled(false);
1206
-
1207
- that._oPopover.setInitialFocus(oButton);
1208
- }
1209
- });
1158
+ that._oPopover.detachAfterClose(fnOnAfterDiscard);
1159
+ };
1210
1160
 
1211
- that._oPopover.addStyleClass("sapUiContentPadding");
1212
- }
1161
+ if (!that._oPopover) {
1162
+ var oText = new Text({
1163
+ //This text is the same as LR v2.
1164
+ //TODO: Display message provided by app developer???
1165
+ text: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_DRAFT_DISCARD_MESSAGE", oResourceBundle)
1166
+ }),
1167
+ oButton = new Button({
1168
+ text: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_DRAFT_DISCARD_BUTTON", oResourceBundle),
1169
+ width: "100%",
1170
+ press: function () {
1171
+ that.handleValidationError();
1172
+ that._bContinueDiscard = true;
1213
1173
 
1214
- that._oPopover.attachAfterClose(fnOnAfterDiscard);
1174
+ that._oPopover.close();
1175
+ },
1176
+ ariaLabelledBy: oText
1177
+ });
1178
+ that._oPopover = new Popover({
1179
+ showHeader: false,
1180
+ placement: "Top",
1181
+ content: [new VBox({
1182
+ items: [oText, oButton]
1183
+ })],
1184
+ beforeOpen: function () {
1185
+ // make sure to NOT trigger multiple cancel flows
1186
+ oCancelButton.setEnabled(false);
1187
+
1188
+ that._oPopover.setInitialFocus(oButton);
1189
+ }
1190
+ });
1215
1191
 
1216
- that._oPopover.openBy(oCancelButton, false);
1217
- } else {
1218
- that.handleValidationError();
1219
- resolve();
1220
- }
1221
- });
1222
- }
1223
- /**
1224
- * Sets the document to modified state on patch event.
1225
- *
1226
- * @function
1227
- * @static
1228
- * @name sap.fe.core.TransactionHelper.handleDocumentModifications
1229
- * @memberof sap.fe.core.TransactionHelper
1230
- * @ui5-restricted
1231
- * @final
1232
- */
1233
-
1234
- }, {
1235
- key: "handleDocumentModifications",
1236
- value: function handleDocumentModifications() {
1237
- this._bIsModified = true;
1238
- }
1239
- /**
1240
- * Retrieves the owner component.
1241
- *
1242
- * @function
1243
- * @static
1244
- * @private
1245
- * @name sap.fe.core.TransactionHelper._getOwnerComponent
1246
- * @memberof sap.fe.core.TransactionHelper
1247
- * @returns {sap.fe.core.AppComponent} The app component
1248
- * @ui5-restricted
1249
- * @final
1250
- **/
1251
-
1252
- }, {
1253
- key: "_getAppComponent",
1254
- value: function _getAppComponent() {
1255
- return this._oAppComponent;
1256
- }
1257
- }, {
1258
- key: "_launchDialogWithKeyFields",
1259
- value: function _launchDialogWithKeyFields(oListBinding, oTransientListBinding, oTransientContext, mFields, oModel, mParameters, messageHandler) {
1260
- // eslint-disable-next-line @typescript-eslint/no-this-alias
1261
- var that = this;
1262
- var oDialog;
1263
- var oParentControl = mParameters.parentControl,
1264
- bSuccess = false;
1265
- return new Promise(function (resolve, reject) {
1266
- var sFragmentName = "sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog";
1267
-
1268
- var oFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment"),
1269
- oResourceBundle = oParentControl.getController().oResourceBundle,
1270
- oMetaModel = oModel.getMetaModel(),
1271
- aImmutableFields = [],
1272
- oAppComponent = that._getAppComponent(),
1273
- sPath = oListBinding.isRelative() ? oListBinding.getResolvedPath() : oListBinding.getPath(),
1274
- oEntitySetContext = oMetaModel.createBindingContext(sPath),
1275
- sMetaPath = oMetaModel.getMetaPath(sPath);
1276
-
1277
- for (var i in mFields) {
1278
- aImmutableFields.push(oMetaModel.createBindingContext(sMetaPath + "/" + mFields[i]));
1192
+ that._oPopover.addStyleClass("sapUiContentPadding");
1279
1193
  }
1280
1194
 
1281
- var oImmutableCtxModel = new JSONModel(aImmutableFields);
1282
- var oImmutableCtx = oImmutableCtxModel.createBindingContext("/");
1283
- return Promise.resolve(XMLPreprocessor.process(oFragment, {
1284
- name: sFragmentName
1285
- }, {
1286
- bindingContexts: {
1287
- entitySet: oEntitySetContext,
1288
- fields: oImmutableCtx
1289
- },
1290
- models: {
1291
- entitySet: oEntitySetContext.getModel(),
1292
- fields: oImmutableCtx.getModel(),
1293
- metaModel: oMetaModel
1294
- }
1295
- })).then(function (oFragment) {
1296
- var aFormElements = [];
1297
- var mFieldValueMap = {};
1298
- var oCreateButton;
1299
-
1300
- var validateRequiredProperties = function () {
1301
- return Promise.all(aFormElements.map(function (oFormElement) {
1302
- return oFormElement.getFields()[0];
1303
- }).filter(function (oField) {
1304
- return oField.getRequired();
1305
- }).map(function (oField) {
1306
- var sFieldId = oField.getId();
1307
-
1308
- if (sFieldId in mFieldValueMap) {
1309
- return Promise.resolve(mFieldValueMap[sFieldId]).then(function (vValue) {
1310
- return vValue;
1311
- }).catch(function () {
1312
- return undefined;
1313
- });
1314
- }
1195
+ that._oPopover.attachAfterClose(fnOnAfterDiscard);
1196
+
1197
+ that._oPopover.openBy(oCancelButton, false);
1198
+ } else {
1199
+ that.handleValidationError();
1200
+ resolve();
1201
+ }
1202
+ });
1203
+ }
1204
+ /**
1205
+ * Sets the document to modified state on patch event.
1206
+ *
1207
+ * @function
1208
+ * @static
1209
+ * @name sap.fe.core.TransactionHelper.handleDocumentModifications
1210
+ * @memberof sap.fe.core.TransactionHelper
1211
+ * @ui5-restricted
1212
+ * @final
1213
+ */
1214
+ ;
1215
+
1216
+ _proto.handleDocumentModifications = function handleDocumentModifications() {
1217
+ this._bIsModified = true;
1218
+ }
1219
+ /**
1220
+ * Retrieves the owner component.
1221
+ *
1222
+ * @function
1223
+ * @static
1224
+ * @private
1225
+ * @name sap.fe.core.TransactionHelper._getOwnerComponent
1226
+ * @memberof sap.fe.core.TransactionHelper
1227
+ * @returns {sap.fe.core.AppComponent} The app component
1228
+ * @ui5-restricted
1229
+ * @final
1230
+ **/
1231
+ ;
1232
+
1233
+ _proto._getAppComponent = function _getAppComponent() {
1234
+ return this._oAppComponent;
1235
+ };
1236
+
1237
+ _proto._launchDialogWithKeyFields = function _launchDialogWithKeyFields(oListBinding, oTransientListBinding, oTransientContext, mFields, oModel, mParameters, messageHandler) {
1238
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
1239
+ var that = this;
1240
+ var oDialog;
1241
+ var oParentControl = mParameters.parentControl,
1242
+ bSuccess = false;
1243
+ return new Promise(function (resolve, reject) {
1244
+ var sFragmentName = "sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog";
1245
+
1246
+ var oFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment"),
1247
+ oResourceBundle = oParentControl.getController().oResourceBundle,
1248
+ oMetaModel = oModel.getMetaModel(),
1249
+ aImmutableFields = [],
1250
+ oAppComponent = that._getAppComponent(),
1251
+ sPath = oListBinding.isRelative() ? oListBinding.getResolvedPath() : oListBinding.getPath(),
1252
+ oEntitySetContext = oMetaModel.createBindingContext(sPath),
1253
+ sMetaPath = oMetaModel.getMetaPath(sPath);
1254
+
1255
+ for (var i in mFields) {
1256
+ aImmutableFields.push(oMetaModel.createBindingContext(sMetaPath + "/" + mFields[i]));
1257
+ }
1315
1258
 
1316
- return oField.getValueState() === ValueState.Error ? undefined : oField.getValue();
1317
- })).then(function (aResults) {
1318
- return aResults.every(function (vValue) {
1319
- return vValue !== undefined && vValue !== null && vValue !== "";
1259
+ var oImmutableCtxModel = new JSONModel(aImmutableFields);
1260
+ var oImmutableCtx = oImmutableCtxModel.createBindingContext("/");
1261
+ return Promise.resolve(XMLPreprocessor.process(oFragment, {
1262
+ name: sFragmentName
1263
+ }, {
1264
+ bindingContexts: {
1265
+ entitySet: oEntitySetContext,
1266
+ fields: oImmutableCtx
1267
+ },
1268
+ models: {
1269
+ entitySet: oEntitySetContext.getModel(),
1270
+ fields: oImmutableCtx.getModel(),
1271
+ metaModel: oMetaModel
1272
+ }
1273
+ })).then(function (oFragment) {
1274
+ var aFormElements = [];
1275
+ var mFieldValueMap = {};
1276
+ var oCreateButton;
1277
+
1278
+ var validateRequiredProperties = function () {
1279
+ return Promise.all(aFormElements.map(function (oFormElement) {
1280
+ return oFormElement.getFields()[0];
1281
+ }).filter(function (oField) {
1282
+ return oField.getRequired();
1283
+ }).map(function (oField) {
1284
+ var sFieldId = oField.getId();
1285
+
1286
+ if (sFieldId in mFieldValueMap) {
1287
+ return Promise.resolve(mFieldValueMap[sFieldId]).then(function (vValue) {
1288
+ return vValue;
1289
+ }).catch(function () {
1290
+ return undefined;
1320
1291
  });
1321
- }).catch(function () {
1322
- return false;
1323
- }).then(function (bEnabled) {
1324
- oCreateButton.setEnabled(bEnabled);
1292
+ }
1293
+
1294
+ return oField.getValueState() === ValueState.Error ? undefined : oField.getValue();
1295
+ })).then(function (aResults) {
1296
+ return aResults.every(function (vValue) {
1297
+ return vValue !== undefined && vValue !== null && vValue !== "";
1325
1298
  });
1326
- };
1299
+ }).catch(function () {
1300
+ return false;
1301
+ }).then(function (bEnabled) {
1302
+ oCreateButton.setEnabled(bEnabled);
1303
+ });
1304
+ };
1327
1305
 
1328
- var oController = {
1329
- /*
1330
- fired on focus out from field or on selecting a value from the valuehelp.
1331
- the create button is enabled when a value is added.
1332
- liveChange is not fired when value is added from valuehelp.
1333
- value validation is not done for create button enablement.
1334
- */
1335
- handleChange: function (oEvent) {
1336
- messageHandler.removeTransitionMessages();
1337
- var oField = oEvent.getSource();
1338
- var sFieldId = oEvent.getParameter("id");
1339
- var oFieldPromise = oEvent.getParameter("promise");
1306
+ var oController = {
1307
+ /*
1308
+ fired on focus out from field or on selecting a value from the valuehelp.
1309
+ the create button is enabled when a value is added.
1310
+ liveChange is not fired when value is added from valuehelp.
1311
+ value validation is not done for create button enablement.
1312
+ */
1313
+ handleChange: function (oEvent) {
1314
+ messageHandler.removeTransitionMessages();
1315
+ var oField = oEvent.getSource();
1316
+ var sFieldId = oEvent.getParameter("id");
1317
+ var oFieldPromise = oEvent.getParameter("promise");
1318
+
1319
+ if (oFieldPromise) {
1320
+ mFieldValueMap[sFieldId] = oFieldPromise.then(function () {
1321
+ return oField.getValue();
1322
+ });
1323
+ }
1340
1324
 
1341
- if (oFieldPromise) {
1342
- mFieldValueMap[sFieldId] = oFieldPromise.then(function () {
1343
- return oField.getValue();
1344
- });
1345
- }
1325
+ validateRequiredProperties();
1326
+ },
1346
1327
 
1347
- validateRequiredProperties();
1348
- },
1328
+ /*
1329
+ fired on key press. the create button is enabled when a value is added.
1330
+ liveChange is not fired when value is added from valuehelp.
1331
+ value validation is not done for create button enablement.
1332
+ */
1333
+ handleLiveChange: function (oEvent) {
1334
+ var sFieldId = oEvent.getParameter("id");
1335
+ var vValue = oEvent.getParameter("value");
1336
+ mFieldValueMap[sFieldId] = vValue;
1337
+ validateRequiredProperties();
1338
+ }
1339
+ };
1340
+ return Fragment.load({
1341
+ definition: oFragment,
1342
+ controller: oController
1343
+ }).then(function (oDialogContent) {
1344
+ oDialog = new Dialog({
1345
+ title: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE", oResourceBundle),
1346
+ content: [oDialogContent],
1347
+ beginButton: {
1348
+ text: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE_BUTTON", oResourceBundle),
1349
+ type: "Emphasized",
1350
+ press: function (oEvent) {
1351
+ var oCreateButton = oEvent.getSource();
1352
+ oCreateButton.setEnabled(false);
1353
+ BusyLocker.lock(oDialog);
1354
+ mParameters.bIsCreateDialog = true;
1355
+ return Promise.all(Object.keys(mFieldValueMap).map(function (sKey) {
1356
+ return mFieldValueMap[sKey].then(function (oValue) {
1357
+ var oDialogValue = {};
1358
+ oDialogValue[sKey] = oValue;
1359
+ return oDialogValue;
1360
+ });
1361
+ })).then(function (aValues) {
1362
+ var onBeforeCreatePromise;
1349
1363
 
1350
- /*
1351
- fired on key press. the create button is enabled when a value is added.
1352
- liveChange is not fired when value is added from valuehelp.
1353
- value validation is not done for create button enablement.
1354
- */
1355
- handleLiveChange: function (oEvent) {
1356
- var sFieldId = oEvent.getParameter("id");
1357
- var vValue = oEvent.getParameter("value");
1358
- mFieldValueMap[sFieldId] = vValue;
1359
- validateRequiredProperties();
1360
- }
1361
- };
1362
- return Fragment.load({
1363
- definition: oFragment,
1364
- controller: oController
1365
- }).then(function (oDialogContent) {
1366
- oDialog = new Dialog({
1367
- title: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE", oResourceBundle),
1368
- content: [oDialogContent],
1369
- beginButton: {
1370
- text: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE_BUTTON", oResourceBundle),
1371
- type: "Emphasized",
1372
- press: function (oEvent) {
1373
- var oCreateButton = oEvent.getSource();
1374
- oCreateButton.setEnabled(false);
1375
- BusyLocker.lock(oDialog);
1376
- return Promise.all(Object.keys(mFieldValueMap).map(function (sKey) {
1377
- return mFieldValueMap[sKey].then(function (oValue) {
1378
- var oDialogValue = {};
1379
- oDialogValue[sKey] = oValue;
1380
- return oDialogValue;
1364
+ if (mParameters.beforeCreateCallBack) {
1365
+ onBeforeCreatePromise = mParameters.beforeCreateCallBack({
1366
+ contextPath: oListBinding && oListBinding.getPath(),
1367
+ createParameters: aValues
1381
1368
  });
1382
- })).then(function (aValues) {
1383
- var onBeforeCreatePromise;
1384
-
1385
- if (mParameters.beforeCreateCallBack) {
1386
- onBeforeCreatePromise = mParameters.beforeCreateCallBack({
1387
- contextPath: oListBinding && oListBinding.getPath(),
1388
- createParameters: aValues
1389
- });
1390
- } else {
1391
- onBeforeCreatePromise = Promise.resolve();
1392
- }
1393
-
1394
- return onBeforeCreatePromise;
1395
- }).then(function () {
1396
- var oPromise = that.onAfterCreateCompletion(oTransientListBinding, oTransientContext, mParameters);
1397
- oModel.submitBatch("submitLater");
1398
- return oPromise;
1399
- }).then(function (oResponse) {
1369
+ } else {
1370
+ onBeforeCreatePromise = Promise.resolve();
1371
+ }
1372
+
1373
+ return onBeforeCreatePromise;
1374
+ }).then(function () {
1375
+ var oPromise = that.onAfterCreateCompletion(oTransientListBinding, oTransientContext, mParameters);
1376
+ oModel.submitBatch("submitLater");
1377
+ return oPromise;
1378
+ }).then(function (oResponse) {
1379
+ if (!oResponse || oResponse && oResponse.bKeepDialogOpen !== true) {
1400
1380
  oDialog.setBindingContext(null);
1401
1381
  oDialog.close();
1402
1382
  resolve(oResponse);
1403
- }).catch(function (oError) {
1404
- reject(oError);
1405
- }).finally(function () {
1406
- BusyLocker.unlock(oDialog);
1407
- oCreateButton.setEnabled(true);
1408
- return messageHandler.showMessages();
1409
- });
1410
- }
1411
- },
1412
- endButton: {
1413
- text: CommonUtils.getTranslatedText("C_COMMON_ACTION_PARAMETER_DIALOG_CANCEL", oResourceBundle),
1414
- press: function () {
1415
- oDialog.close();
1416
- }
1417
- },
1418
- afterClose: function () {
1419
- var _oDialog$getBindingCo;
1383
+ }
1384
+ }).catch(function (oError) {
1385
+ reject(oError);
1386
+ }).finally(function () {
1387
+ BusyLocker.unlock(oDialog);
1388
+ oCreateButton.setEnabled(true);
1389
+ return messageHandler.showMessages();
1390
+ });
1391
+ }
1392
+ },
1393
+ endButton: {
1394
+ text: CommonUtils.getTranslatedText("C_COMMON_ACTION_PARAMETER_DIALOG_CANCEL", oResourceBundle),
1395
+ press: function () {
1396
+ oDialog.close();
1397
+ }
1398
+ },
1399
+ afterClose: function () {
1400
+ var _oDialog$getBindingCo;
1420
1401
 
1421
- // show footer as per UX guidelines when dialog is not open
1422
- (_oDialog$getBindingCo = oDialog.getBindingContext("internal")) === null || _oDialog$getBindingCo === void 0 ? void 0 : _oDialog$getBindingCo.setProperty("isCreateDialogOpen", false);
1423
- oDialog.destroy();
1402
+ // show footer as per UX guidelines when dialog is not open
1403
+ (_oDialog$getBindingCo = oDialog.getBindingContext("internal")) === null || _oDialog$getBindingCo === void 0 ? void 0 : _oDialog$getBindingCo.setProperty("isCreateDialogOpen", false);
1404
+ oDialog.destroy();
1424
1405
 
1425
- if (!bSuccess) {
1426
- reject({
1427
- bDeleteTransientContext: true
1428
- });
1429
- }
1406
+ if (!bSuccess) {
1407
+ reject({
1408
+ bDeleteTransientContext: true,
1409
+ navigateBackFromTransientState: true
1410
+ });
1430
1411
  }
1431
- });
1432
- aFormElements = oDialogContent.getAggregation("form").getAggregation("formContainers")[0].getAggregation("formElements");
1433
-
1434
- if (oParentControl && oParentControl.addDependent) {
1435
- // if there is a parent control specified add the dialog as dependent
1436
- oParentControl.addDependent(oDialog);
1437
1412
  }
1413
+ });
1414
+ aFormElements = oDialogContent.getAggregation("form").getAggregation("formContainers")[0].getAggregation("formElements");
1415
+
1416
+ if (oParentControl && oParentControl.addDependent) {
1417
+ // if there is a parent control specified add the dialog as dependent
1418
+ oParentControl.addDependent(oDialog);
1419
+ }
1438
1420
 
1439
- oCreateButton = oDialog.getBeginButton();
1440
- oDialog.setBindingContext(oTransientContext);
1441
- return CommonUtils.setUserDefaults(oAppComponent, aImmutableFields, oTransientContext, false, mParameters.createAction, mParameters.data).then(function () {
1442
- validateRequiredProperties(); // footer must not be visible when the dialog is open as per UX guidelines
1421
+ oCreateButton = oDialog.getBeginButton();
1422
+ oDialog.setBindingContext(oTransientContext);
1423
+ return CommonUtils.setUserDefaults(oAppComponent, aImmutableFields, oTransientContext, false, mParameters.createAction, mParameters.data).then(function () {
1424
+ validateRequiredProperties(); // footer must not be visible when the dialog is open as per UX guidelines
1443
1425
 
1444
- oDialog.getBindingContext("internal").setProperty("isCreateDialogOpen", true);
1445
- oDialog.open();
1446
- }).catch(function (oError) {
1447
- return messageHandler.showMessages().then(function () {
1448
- return Promise.reject(oError);
1449
- });
1426
+ oDialog.getBindingContext("internal").setProperty("isCreateDialogOpen", true);
1427
+ oDialog.open();
1428
+ }).catch(function (oError) {
1429
+ return messageHandler.showMessages().then(function () {
1430
+ return Promise.reject(oError);
1450
1431
  });
1451
1432
  });
1452
1433
  });
1453
1434
  });
1454
- }
1455
- }, {
1456
- key: "onAfterCreateCompletion",
1457
- value: function onAfterCreateCompletion(oListBinding, oNewDocumentContext, mParameters) {
1458
- var fnResolve, fnReject;
1459
- var oPromise = new Promise(function (resolve, reject) {
1460
- fnResolve = resolve;
1461
- fnReject = reject;
1462
- }); // eslint-disable-next-line @typescript-eslint/no-this-alias
1463
-
1464
- var that = this; // Workaround suggested by OData model v4 colleagues
1465
-
1466
- var fnCreateCompleted = function (oEvent) {
1467
- var oContext = oEvent.getParameter("context"),
1468
- bSuccess = oEvent.getParameter("success");
1469
-
1470
- if (oContext === oNewDocumentContext) {
1471
- oListBinding.detachCreateCompleted(fnCreateCompleted, that);
1472
-
1473
- if (!bSuccess) {
1474
- var oError = {
1475
- bDeleteTransientContext: false
1476
- };
1435
+ });
1436
+ };
1437
+
1438
+ _proto.onAfterCreateCompletion = function onAfterCreateCompletion(oListBinding, oNewDocumentContext, mParameters) {
1439
+ var fnResolve, fnReject;
1440
+ var oPromise = new Promise(function (resolve, reject) {
1441
+ fnResolve = resolve;
1442
+ fnReject = reject;
1443
+ }); // eslint-disable-next-line @typescript-eslint/no-this-alias
1477
1444
 
1478
- if (!mParameters.keepTransientContextOnFailed) {
1479
- // the context is deleted
1480
- oError.bDeleteTransientContext = true; // this is needed to avoid console errors TO be checked with model colleagues
1445
+ var that = this; // Workaround suggested by OData model v4 colleagues
1481
1446
 
1482
- oContext.created().then(undefined, function () {
1483
- Log.trace("transient creation context deleted");
1484
- }).catch(function (oError) {
1485
- Log.trace("transient creation context deletion error", oError);
1486
- }); // if current state is transient (...), browser will come back to previous state
1447
+ var fnCreateCompleted = function (oEvent) {
1448
+ var oContext = oEvent.getParameter("context"),
1449
+ bSuccess = oEvent.getParameter("success");
1487
1450
 
1451
+ if (oContext === oNewDocumentContext) {
1452
+ oListBinding.detachCreateCompleted(fnCreateCompleted, that);
1453
+
1454
+ if (!bSuccess) {
1455
+ var oError = {
1456
+ bDeleteTransientContext: false
1457
+ };
1458
+
1459
+ if (!mParameters.keepTransientContextOnFailed) {
1460
+ // the context is deleted
1461
+ // this is needed to avoid console errors TO be checked with model colleagues
1462
+ oContext.created().then(undefined, function () {
1463
+ Log.trace("transient creation context deleted");
1464
+ }).catch(function (oError) {
1465
+ Log.trace("transient creation context deletion error", oError);
1466
+ });
1467
+
1468
+ if (!mParameters.bIsCreateDialog) {
1469
+ // if current state is transient (...), browser will come back to previous state
1488
1470
  oError.navigateBackFromTransientState = true;
1471
+ oError.bDeleteTransientContext = true;
1472
+ fnReject(oError);
1489
1473
  }
1490
-
1491
- fnReject(oError);
1492
- } else {
1493
- fnResolve();
1494
1474
  }
1495
- }
1496
- };
1497
1475
 
1498
- oListBinding.attachCreateCompleted(fnCreateCompleted, this);
1499
- return oPromise;
1500
- }
1501
- /**
1502
- * Retrieves the name of the NewAction to be executed.
1503
- *
1504
- * @function
1505
- * @static
1506
- * @private
1507
- * @name sap.fe.core.TransactionHelper._getNewAction
1508
- * @memberof sap.fe.core.TransactionHelper
1509
- * @param {object} oStartupParameters Startup parameters of the application
1510
- * @param {string} sCreateHash Hash to be checked for action type
1511
- * @param {object} oMetaModel The MetaModel used to check for NewAction parameter
1512
- * @param {string} sMetaPath The MetaPath
1513
- * @returns {string} The name of the action
1514
- * @ui5-restricted
1515
- * @final
1516
- **/
1517
-
1518
- }, {
1519
- key: "_getNewAction",
1520
- value: function _getNewAction(oStartupParameters, sCreateHash, oMetaModel, sMetaPath) {
1521
- var sNewAction;
1522
-
1523
- if (oStartupParameters && oStartupParameters.preferredMode && sCreateHash.indexOf("i-action=createWith") > -1) {
1524
- var sPreferredMode = oStartupParameters.preferredMode[0];
1525
- sNewAction = sPreferredMode.indexOf("createWith:") > -1 ? sPreferredMode.substr(sPreferredMode.lastIndexOf(":") + 1) : undefined;
1526
- } else {
1527
- sNewAction = oMetaModel && oMetaModel.getObject !== undefined ? oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Session.v1.StickySessionSupported/NewAction") || oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Common.v1.DraftRoot/NewAction") : undefined;
1528
- }
1529
-
1530
- return sNewAction;
1531
- }
1532
- /**
1533
- * Retrieves the label for the title of a specific create action dialog, e.g. Create Sales Order from Quotation.
1534
- *
1535
- * The following priority is applied:
1536
- * 1. label of line-item annotation.
1537
- * 2. label annotated in the action.
1538
- * 3. "Create" as a constant from i18n.
1539
- *
1540
- * @function
1541
- * @static
1542
- * @private
1543
- * @name sap.fe.core.TransactionHelper._getSpecificCreateActionDialogLabel
1544
- * @memberof sap.fe.core.TransactionHelper
1545
- * @param {object} oMetaModel The MetaModel used to check for the NewAction parameter
1546
- * @param {string} sMetaPath The MetaPath
1547
- * @param {string} sNewAction Contains the name of the action to be executed
1548
- * @param {object} oResourceBundleCore ResourceBundle to access the default Create label
1549
- * @returns {string} The label for the Create Action Dialog
1550
- * @ui5-restricted
1551
- * @final
1552
- **/
1553
-
1554
- }, {
1555
- key: "_getSpecificCreateActionDialogLabel",
1556
- value: function _getSpecificCreateActionDialogLabel(oMetaModel, sMetaPath, sNewAction, oResourceBundleCore) {
1557
- var fnGetLabelFromLineItemAnnotation = function () {
1558
- if (oMetaModel && oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.UI.v1.LineItem")) {
1559
- var iLineItemIndex = oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.UI.v1.LineItem").findIndex(function (oLineItem) {
1560
- var aLineItemAction = oLineItem.Action ? oLineItem.Action.split("(") : undefined;
1561
- return aLineItemAction ? aLineItemAction[0] === sNewAction : false;
1476
+ fnResolve({
1477
+ bKeepDialogOpen: true
1562
1478
  });
1563
- return iLineItemIndex > -1 ? oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.UI.v1.LineItem")[iLineItemIndex].Label : undefined;
1564
1479
  } else {
1565
- return undefined;
1480
+ fnResolve();
1566
1481
  }
1567
- };
1482
+ }
1483
+ };
1568
1484
 
1569
- return fnGetLabelFromLineItemAnnotation() || oMetaModel && oMetaModel.getObject(sMetaPath + "/" + sNewAction + "@com.sap.vocabularies.Common.v1.Label") || oResourceBundleCore && oResourceBundleCore.getText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE");
1485
+ oListBinding.attachCreateCompleted(fnCreateCompleted, this);
1486
+ return oPromise;
1487
+ }
1488
+ /**
1489
+ * Retrieves the name of the NewAction to be executed.
1490
+ *
1491
+ * @function
1492
+ * @static
1493
+ * @private
1494
+ * @name sap.fe.core.TransactionHelper._getNewAction
1495
+ * @memberof sap.fe.core.TransactionHelper
1496
+ * @param {object} oStartupParameters Startup parameters of the application
1497
+ * @param {string} sCreateHash Hash to be checked for action type
1498
+ * @param {object} oMetaModel The MetaModel used to check for NewAction parameter
1499
+ * @param {string} sMetaPath The MetaPath
1500
+ * @returns {string} The name of the action
1501
+ * @ui5-restricted
1502
+ * @final
1503
+ **/
1504
+ ;
1505
+
1506
+ _proto._getNewAction = function _getNewAction(oStartupParameters, sCreateHash, oMetaModel, sMetaPath) {
1507
+ var sNewAction;
1508
+
1509
+ if (oStartupParameters && oStartupParameters.preferredMode && sCreateHash.indexOf("i-action=createWith") > -1) {
1510
+ var sPreferredMode = oStartupParameters.preferredMode[0];
1511
+ sNewAction = sPreferredMode.indexOf("createWith:") > -1 ? sPreferredMode.substr(sPreferredMode.lastIndexOf(":") + 1) : undefined;
1512
+ } else {
1513
+ sNewAction = oMetaModel && oMetaModel.getObject !== undefined ? oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Session.v1.StickySessionSupported/NewAction") || oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Common.v1.DraftRoot/NewAction") : undefined;
1570
1514
  }
1571
- }]);
1515
+
1516
+ return sNewAction;
1517
+ }
1518
+ /**
1519
+ * Retrieves the label for the title of a specific create action dialog, e.g. Create Sales Order from Quotation.
1520
+ *
1521
+ * The following priority is applied:
1522
+ * 1. label of line-item annotation.
1523
+ * 2. label annotated in the action.
1524
+ * 3. "Create" as a constant from i18n.
1525
+ *
1526
+ * @function
1527
+ * @static
1528
+ * @private
1529
+ * @name sap.fe.core.TransactionHelper._getSpecificCreateActionDialogLabel
1530
+ * @memberof sap.fe.core.TransactionHelper
1531
+ * @param {object} oMetaModel The MetaModel used to check for the NewAction parameter
1532
+ * @param {string} sMetaPath The MetaPath
1533
+ * @param {string} sNewAction Contains the name of the action to be executed
1534
+ * @param {object} oResourceBundleCore ResourceBundle to access the default Create label
1535
+ * @returns {string} The label for the Create Action Dialog
1536
+ * @ui5-restricted
1537
+ * @final
1538
+ **/
1539
+ ;
1540
+
1541
+ _proto._getSpecificCreateActionDialogLabel = function _getSpecificCreateActionDialogLabel(oMetaModel, sMetaPath, sNewAction, oResourceBundleCore) {
1542
+ var fnGetLabelFromLineItemAnnotation = function () {
1543
+ if (oMetaModel && oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.UI.v1.LineItem")) {
1544
+ var iLineItemIndex = oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.UI.v1.LineItem").findIndex(function (oLineItem) {
1545
+ var aLineItemAction = oLineItem.Action ? oLineItem.Action.split("(") : undefined;
1546
+ return aLineItemAction ? aLineItemAction[0] === sNewAction : false;
1547
+ });
1548
+ return iLineItemIndex > -1 ? oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.UI.v1.LineItem")[iLineItemIndex].Label : undefined;
1549
+ } else {
1550
+ return undefined;
1551
+ }
1552
+ };
1553
+
1554
+ return fnGetLabelFromLineItemAnnotation() || oMetaModel && oMetaModel.getObject(sMetaPath + "/" + sNewAction + "@com.sap.vocabularies.Common.v1.Label") || oResourceBundleCore && oResourceBundleCore.getText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE");
1555
+ };
1572
1556
 
1573
1557
  return TransactionHelper;
1574
1558
  }();
1575
1559
 
1576
1560
  return TransactionHelper;
1577
1561
  }, false);
1578
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRyYW5zYWN0aW9uSGVscGVyLnRzIl0sIm5hbWVzIjpbIkNyZWF0aW9uTW9kZSIsIkZFTGlicmFyeSIsIlByb2dyYW1taW5nTW9kZWwiLCJWYWx1ZVN0YXRlIiwiY29yZUxpYnJhcnkiLCJnZXRQYXJhbWV0ZXJzIiwibVBhcmFtZXRlcnMiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJUcmFuc2FjdGlvbkhlbHBlciIsIm9BcHBDb21wb25lbnQiLCJvTG9ja09iamVjdCIsIl9vQXBwQ29tcG9uZW50Iiwib0NvbnRleHQiLCJzUHJvZ3JhbW1pbmdNb2RlbCIsInNQYXRoIiwiaXNBIiwiZ2V0UGF0aCIsImlzUmVsYXRpdmUiLCJnZXRSZXNvbHZlZFBhdGgiLCJNb2RlbEhlbHBlciIsImlzRHJhZnRTdXBwb3J0ZWQiLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsIkRyYWZ0IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU3RpY2t5IiwiTm9uRHJhZnQiLCJvVmlldyIsInNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJzTW9kdWxlIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJyZXBsYWNlIiwic0Z1bmN0aW9uTmFtZSIsImxlbmd0aCIsIm1EYXRhIiwiZGF0YSIsIkZQTUhlbHBlciIsInZhbGlkYXRpb25XcmFwcGVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJvTWFpbkxpc3RCaW5kaW5nIiwibUluUGFyYW1ldGVycyIsIm9SZXNvdXJjZUJ1bmRsZSIsIm1lc3NhZ2VIYW5kbGVyIiwiYkZyb21Db3B5UGFzdGUiLCJ0aGF0Iiwib01vZGVsIiwib01ldGFNb2RlbCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0SGVhZGVyQ29udGV4dCIsInNDcmVhdGVIYXNoIiwiX2dldEFwcENvbXBvbmVudCIsImdldFJvdXRlclByb3h5IiwiZ2V0SGFzaCIsIm9Db21wb25lbnREYXRhIiwiZ2V0Q29tcG9uZW50RGF0YSIsIm9TdGFydHVwUGFyYW1ldGVycyIsInN0YXJ0dXBQYXJhbWV0ZXJzIiwic05ld0FjdGlvbiIsIl9nZXROZXdBY3Rpb24iLCJ1bmRlZmluZWQiLCJvQ3JlYXRpb25Qcm9taXNlIiwibUJpbmRpbmdQYXJhbWV0ZXJzIiwic01lc3NhZ2VzUGF0aCIsImdldE9iamVjdCIsInNCdXN5UGF0aCIsImdldFRhcmdldEVudGl0eVNldCIsImdldENvbnRleHQiLCJiRnVuY3Rpb25Pbk5hdlByb3AiLCJvTmV3RG9jdW1lbnRDb250ZXh0IiwicmVqZWN0IiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsImJ1c3lNb2RlIiwic0lkIiwiYmVmb3JlQ3JlYXRlQ2FsbEJhY2siLCJCdXN5TG9ja2VyIiwibG9jayIsIm9SZXNvdXJjZUJ1bmRsZUNvcmUiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJjYWxsQWN0aW9uIiwiY29udGV4dHMiLCJzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nIiwibGFiZWwiLCJfZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbCIsImJpbmRpbmdQYXJhbWV0ZXJzIiwicGFyZW50Q29udHJvbCIsImJJc0NyZWF0ZUFjdGlvbiIsImJJc05ld1BhZ2VDcmVhdGlvbiIsImNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uUm93IiwiSW5saW5lIiwiYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyIsIkNvbW1vblV0aWxzIiwiZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzIiwic0Z1bmN0aW9uUGF0aCIsIm9GdW5jdGlvbkNvbnRleHQiLCJvRnVuY3Rpb24iLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIiRJc0JvdW5kIiwib3BlcmF0aW9ucyIsImNhbGxCb3VuZEZ1bmN0aW9uIiwiY2FsbEZ1bmN0aW9uSW1wb3J0IiwidGhlbiIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJvRGF0YSIsIk9iamVjdCIsImFzc2lnbiIsIm9UcmFuc2llbnRMaXN0QmluZGluZyIsImJpbmRMaXN0IiwiJCR1cGRhdGVHcm91cElkIiwicmVmcmVzaEludGVybmFsIiwiY3JlYXRlIiwiX2xhdW5jaERpYWxvZ1dpdGhLZXlGaWVsZHMiLCJvbkJlZm9yZUNyZWF0ZVByb21pc2UiLCJjb250ZXh0UGF0aCIsImNyZWF0ZUF0RW5kIiwib25BZnRlckNyZWF0ZUNvbXBsZXRpb24iLCJvUmVzdWx0IiwiX2JDcmVhdGVNb2RlIiwicmVzcG9uc2UiLCJiQ29uc2lkZXJEb2N1bWVudE1vZGlmaWVkIiwiaGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJiRGVsZXRlVHJhbnNpZW50Q29udGV4dCIsImlzVHJhbnNpZW50IiwiZGVsZXRlIiwiZmluYWxseSIsInVubG9jayIsImFDb250ZXh0cyIsImJGaW5kQWN0aXZlQ29udGV4dHMiLCJhY3RpdmVDb250ZXh0cyIsInJlZHVjZSIsImFSZXN1bHQiLCJiSXNBY3RpdmVFbnRpdHkiLCJJc0FjdGl2ZUVudGl0eSIsImJIYXNBY3RpdmVFbnRpdHkiLCJIYXNBY3RpdmVFbnRpdHkiLCJvQWN0aXZlQ29udGV4dCIsImJpbmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0IiwicHVzaCIsImFsbCIsIm1hcCIsInJlcXVlc3RDYW5vbmljYWxQYXRoIiwiY2hlY2tCb3giLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsImdldFByb3BlcnR5IiwiaXNDaGVja0JveFZpc2libGUiLCJpc0NoZWNrQm94U2VsZWN0ZWQiLCJzZXRQcm9wZXJ0eSIsIm9iaiIsInNlbGVjdGVkQ29udGV4dHMiLCJmaWx0ZXIiLCJlbGVtZW50IiwiZGVsZXRhYmxlQ29udGV4dHMiLCJpbmRleE9mIiwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIiwiTWVzc2FnZVRvYXN0Iiwic2hvdyIsImdldFRyYW5zbGF0ZWRUZXh0IiwiZW50aXR5U2V0TmFtZSIsInZDb250ZXh0cyIsImZuUmVqZWN0IiwiZm5SZXNvbHZlIiwiYURlbGV0YWJsZUNvbnRleHRzIiwiaXNMb2NrZWRUZXh0VmlzaWJsZSIsImNhbm5vdEJlRGVsZXRlZFRleHRWaXNpYmxlIiwiYkRpYWxvZ0NvbmZpcm1lZCIsImFQYXJhbXMiLCJvRGVsZXRlTWVzc2FnZSIsInRpdGxlIiwiZ2V0VGV4dCIsIkFycmF5IiwiaXNBcnJheSIsImkiLCJvQ29udGV4dERhdGEiLCJIYXNEcmFmdEVudGl0eSIsIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhIiwiSW5Qcm9jZXNzQnlVc2VyIiwiRHJhZnRJc0NyZWF0ZWRCeU1lIiwiTWVzc2FnZUJveCIsIm9uQ2xvc2UiLCJkZXNjcmlwdGlvbiIsInRleHQiLCJ1blNhdmVkQ29udGV4dHMiLCJkcmFmdEFkbWluRGF0YSIsInNMYXN0Q2hhbmdlZEJ5VXNlciIsImNvbmNhdCIsImxvY2tlZENvbnRleHRzIiwibm9uRGVsZXRhYmxlVGV4dCIsImNoZWNrQm94VGV4dCIsIm9Ob25EZWxldGFibGVNZXNzYWdlVGV4dENvbnRyb2wiLCJvRGVsZXRlTWVzc2FnZVRleHRDb250cm9sIiwib0NvbnRlbnQiLCJWQm94IiwiaXRlbXMiLCJUZXh0IiwidmlzaWJsZSIsIkNoZWNrQm94Iiwic2VsZWN0ZWQiLCJzZWxlY3QiLCJvRXZlbnQiLCJnZXRTb3VyY2UiLCJnZXRTZWxlY3RlZCIsInNUaXRsZSIsImZuQ29uZmlybSIsIm9uQmVmb3JlRGVsZXRlUHJvbWlzZSIsImJlZm9yZURlbGV0ZUNhbGxCYWNrIiwiZmluZEFjdGl2ZURyYWZ0Um9vdENvbnRleHRzIiwiYmluZCIsImRyYWZ0IiwiZGVsZXRlRHJhZnQiLCJzaG93TWVzc2FnZXMiLCJhZnRlckRlbGV0ZVByb2Nlc3MiLCJvRGlhbG9nIiwiRGlhbG9nIiwic3RhdGUiLCJjb250ZW50IiwiYXJpYUxhYmVsbGVkQnkiLCJnZXRWaXNpYmxlIiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJ0eXBlIiwicHJlc3MiLCJjbG9zZSIsImVuZEJ1dHRvbiIsImFmdGVyQ2xvc2UiLCJkZXN0cm95Iiwibm9EaWFsb2ciLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsIndhcm5pbmciLCJiUHJlcGFyZU9uRWRpdCIsIm9FZGl0UHJvbWlzZSIsIkVycm9yIiwiX2JJc01vZGlmaWVkIiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwiY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQiLCJiUHJlc2VydmVDaGFuZ2VzIiwic3RpY2t5IiwiZWRpdERvY3VtZW50SW5TdGlja3lTZXNzaW9uIiwib05ld0NvbnRleHQiLCJlcnIiLCJvUGFyYW1zQ29udGV4dCIsIm9DYW5jZWxCdXR0b24iLCJjYW5jZWxCdXR0b24iLCJvbkJlZm9yZUNhbmNlbFByb21pc2UiLCJzQ2Fub25pY2FsUGF0aCIsInNQTW9kZWwiLCJkcmFmdERhdGFDb250ZXh0IiwicmVxdWVzdE9iamVjdCIsIkNyZWF0aW9uRGF0ZVRpbWUiLCJMYXN0Q2hhbmdlRGF0ZVRpbWUiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJfc2hvd0Rpc2NhcmRQb3BvdmVyIiwiYmVmb3JlQ2FuY2VsQ2FsbEJhY2siLCJjb250ZXh0Iiwib0RlbGV0ZVByb21pc2UiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImdldEJpbmRpbmciLCJyZXNldENoYW5nZXMiLCJkaXNjYXJkRG9jdW1lbnQiLCJyZWZyZXNoIiwiYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IiLCJhQmluZGluZ3MiLCJvU2F2ZVByb21pc2UiLCJhY3RpdmF0ZURvY3VtZW50Iiwib0FjdGl2ZURvY3VtZW50IiwiYk5ld09iamVjdCIsImZvckVhY2giLCJvTGlzdEJpbmRpbmciLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5Iiwic0FjdGlvbk5hbWUiLCJvUHJvbWlzZSIsInNOYW1lIiwic3BsaXQiLCJtb2RlbCIsIm1TaWRlRWZmZWN0c1BhcmFtZXRlcnMiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwib0FwcGxpY2FibGVDb250ZXh0RGlhbG9nIiwib0NvbnRyb2xsZXIiLCJvbkNvbnRpbnVlIiwiYXBwbGljYWJsZUNvbnRleHQiLCJmbk9wZW5BbmRGaWxsRGlhbG9nIiwib0RpYWxvZ0NvbnRlbnQiLCJuTm90QXBwbGljYWJsZSIsIm5vdEFwcGxpY2FibGVDb250ZXh0IiwiYU5vdEFwcGxpY2FibGVJdGVtcyIsIm9Ob3RBcHBsaWNhYmxlSXRlbXNNb2RlbCIsIkpTT05Nb2RlbCIsIm9Ub3RhbHMiLCJ0b3RhbCIsInNldE1vZGVsIiwic0ZyYWdtZW50TmFtZSIsIm9EaWFsb2dGcmFnbWVudCIsIlhNTFRlbXBsYXRlUHJvY2Vzc29yIiwibG9hZFRlbXBsYXRlIiwiZ2V0Q2Fub25pY2FsUGF0aCIsInNFbnRpdHlTZXQiLCJzdWJzdHIiLCJvRGlhbG9nTGFiZWxNb2RlbCIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJuYW1lIiwiYmluZGluZ0NvbnRleHRzIiwiZW50aXR5VHlwZSIsIm1vZGVscyIsIm1ldGFNb2RlbCIsIm9GcmFnbWVudCIsIkZyYWdtZW50IiwibG9hZCIsImRlZmluaXRpb24iLCJjb250cm9sbGVyIiwib1BvcG92ZXIiLCJhZGREZXBlbmRlbnQiLCJjb250ZXh0VG9Qcm9jZXNzIiwiY2FsbEJvdW5kQWN0aW9uIiwiaW52b2NhdGlvbkdyb3VwaW5nIiwiYWRkaXRpb25hbFNpZGVFZmZlY3QiLCJvblN1Ym1pdHRlZCIsIm9uUmVzcG9uc2UiLCJvcGVyYXRpb25BdmFpbGFibGVNYXAiLCJiR2V0Qm91bmRDb250ZXh0IiwiYk9iamVjdFBhZ2UiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJjYWxsQWN0aW9uSW1wb3J0IiwiX2hhbmRsZUFjdGlvblJlc3BvbnNlIiwiYVRyYW5zaWVudE1lc3NhZ2VzIiwibWVzc2FnZUhhbmRsaW5nIiwiZ2V0TWVzc2FnZXMiLCJvTWVzc2FnZU1hbmFnZXIiLCJnZXRNZXNzYWdlTWFuYWdlciIsImVycm9yVG9SZW1vdmUiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwidmFsaWRhdGlvbiIsInJlbW92ZU1lc3NhZ2VzIiwiYklzTW9kaWZpZWQiLCJfYkNvbnRpbnVlRGlzY2FyZCIsImZuT25BZnRlckRpc2NhcmQiLCJzZXRFbmFibGVkIiwiX29Qb3BvdmVyIiwiZGV0YWNoQWZ0ZXJDbG9zZSIsIm9UZXh0Iiwib0J1dHRvbiIsIndpZHRoIiwiaGFuZGxlVmFsaWRhdGlvbkVycm9yIiwiUG9wb3ZlciIsInNob3dIZWFkZXIiLCJwbGFjZW1lbnQiLCJiZWZvcmVPcGVuIiwic2V0SW5pdGlhbEZvY3VzIiwiYXR0YWNoQWZ0ZXJDbG9zZSIsIm9wZW5CeSIsIm9UcmFuc2llbnRDb250ZXh0IiwibUZpZWxkcyIsIm9QYXJlbnRDb250cm9sIiwiYlN1Y2Nlc3MiLCJnZXRDb250cm9sbGVyIiwiYUltbXV0YWJsZUZpZWxkcyIsIm9FbnRpdHlTZXRDb250ZXh0Iiwib0ltbXV0YWJsZUN0eE1vZGVsIiwib0ltbXV0YWJsZUN0eCIsImVudGl0eVNldCIsImZpZWxkcyIsImFGb3JtRWxlbWVudHMiLCJtRmllbGRWYWx1ZU1hcCIsIm9DcmVhdGVCdXR0b24iLCJ2YWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcyIsIm9Gb3JtRWxlbWVudCIsImdldEZpZWxkcyIsIm9GaWVsZCIsImdldFJlcXVpcmVkIiwic0ZpZWxkSWQiLCJnZXRJZCIsInZWYWx1ZSIsImdldFZhbHVlU3RhdGUiLCJnZXRWYWx1ZSIsImFSZXN1bHRzIiwiZXZlcnkiLCJiRW5hYmxlZCIsImhhbmRsZUNoYW5nZSIsImdldFBhcmFtZXRlciIsIm9GaWVsZFByb21pc2UiLCJoYW5kbGVMaXZlQ2hhbmdlIiwia2V5cyIsInNLZXkiLCJvVmFsdWUiLCJvRGlhbG9nVmFsdWUiLCJhVmFsdWVzIiwiY3JlYXRlUGFyYW1ldGVycyIsInN1Ym1pdEJhdGNoIiwib1Jlc3BvbnNlIiwic2V0QmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldEFnZ3JlZ2F0aW9uIiwiZ2V0QmVnaW5CdXR0b24iLCJzZXRVc2VyRGVmYXVsdHMiLCJjcmVhdGVBY3Rpb24iLCJmbkNyZWF0ZUNvbXBsZXRlZCIsImRldGFjaENyZWF0ZUNvbXBsZXRlZCIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJjcmVhdGVkIiwidHJhY2UiLCJuYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUiLCJhdHRhY2hDcmVhdGVDb21wbGV0ZWQiLCJwcmVmZXJyZWRNb2RlIiwic1ByZWZlcnJlZE1vZGUiLCJmbkdldExhYmVsRnJvbUxpbmVJdGVtQW5ub3RhdGlvbiIsImlMaW5lSXRlbUluZGV4IiwiZmluZEluZGV4Iiwib0xpbmVJdGVtIiwiYUxpbmVJdGVtQWN0aW9uIiwiQWN0aW9uIiwiTGFiZWwiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQTBCQSxNQUFNQSxZQUFZLEdBQUdDLFNBQVMsQ0FBQ0QsWUFBL0I7QUFDQSxNQUFNRSxnQkFBZ0IsR0FBR0QsU0FBUyxDQUFDQyxnQkFBbkM7QUFDQSxNQUFNQyxVQUFVLEdBQUdDLFdBQVcsQ0FBQ0QsVUFBL0I7QUFDQTs7QUFDQSxXQUFTRSxhQUFULENBQXVCQyxXQUF2QixFQUF5QztBQUN4QyxRQUFJQSxXQUFXLElBQUlBLFdBQVcsQ0FBQ0MsV0FBM0IsSUFBMENELFdBQVcsQ0FBQ0MsV0FBWixHQUEwQkMsT0FBMUIsT0FBd0MsbUJBQXRGLEVBQTJHO0FBQzFHRixNQUFBQSxXQUFXLEdBQUcsRUFBZDtBQUNBOztBQUNELFdBQU9BLFdBQVcsSUFBSSxFQUF0QjtBQUNBOztNQUVLRyxpQjtBQVFMLCtCQUFZQyxhQUFaLEVBQXlDQyxXQUF6QyxFQUEyRDtBQUFBOztBQUFBLDRDQUpuQyxLQUltQzs7QUFBQSw0Q0FIbkMsS0FHbUM7O0FBQUEsaURBRjlCLEtBRThCOztBQUMxRCxXQUFLQyxjQUFMLEdBQXNCRixhQUF0QjtBQUNBLFdBQUtDLFdBQUwsR0FBbUJBLFdBQW5CO0FBQ0E7Ozs7YUFDRCw2QkFBb0JF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LFNBZEQ7O0FBZ0JBLGVBQ0NxVyxnQ0FBZ0MsTUFDL0JuWCxVQUFVLElBQUlBLFVBQVUsQ0FBQ2tCLFNBQVgsQ0FBcUJqQixTQUFTLEdBQUcsR0FBWixHQUFrQlcsVUFBbEIsR0FBK0IsdUNBQXBELENBRGYsSUFFQ21CLG1CQUFtQixJQUFJQSxtQkFBbUIsQ0FBQ3FHLE9BQXBCLENBQTRCLDBDQUE1QixDQUh6QjtBQUtBOzs7Ozs7U0FHYTdLLGlCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2FjdGlvbnMvZHJhZnRcIjtcbmltcG9ydCBzdGlja3kgZnJvbSBcInNhcC9mZS9jb3JlL2FjdGlvbnMvc3RpY2t5XCI7XG5pbXBvcnQgb3BlcmF0aW9ucyBmcm9tIFwic2FwL2ZlL2NvcmUvYWN0aW9ucy9vcGVyYXRpb25zXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBQb3BvdmVyIGZyb20gXCJzYXAvbS9Qb3BvdmVyXCI7XG5pbXBvcnQgVkJveCBmcm9tIFwic2FwL20vVkJveFwiO1xuaW1wb3J0IENoZWNrQm94IGZyb20gXCJzYXAvbS9DaGVja0JveFwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL0J1c3lMb2NrZXJcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgWE1MVGVtcGxhdGVQcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL1hNTFRlbXBsYXRlUHJvY2Vzc29yXCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IE1vZGVsSGVscGVyLCB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnksIHsgUHJvZ3JhbW1pbmdNb2RlbCBhcyBQcm9ncmFtbWluZ01vZGVsVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgY29yZUxpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBtZXNzYWdlSGFuZGxpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2FjdGlvbnMvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgeyBBcHBDb21wb25lbnQgfSBmcm9tIFwic2FwL2ZlL2NvcmVcIjtcbmltcG9ydCBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IEZQTUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9GUE1IZWxwZXJcIjtcblxuY29uc3QgQ3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZTtcbmNvbnN0IFByb2dyYW1taW5nTW9kZWwgPSBGRUxpYnJhcnkuUHJvZ3JhbW1pbmdNb2RlbDtcbmNvbnN0IFZhbHVlU3RhdGUgPSBjb3JlTGlicmFyeS5WYWx1ZVN0YXRlO1xuLyogTWFrZSBzdXJlIHRoYXQgdGhlIG1QYXJhbWV0ZXJzIGlzIG5vdCB0aGUgb0V2ZW50ICovXG5mdW5jdGlvbiBnZXRQYXJhbWV0ZXJzKG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0aWYgKG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmdldE1ldGFkYXRhICYmIG1QYXJhbWV0ZXJzLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpID09PSBcInNhcC51aS5iYXNlLkV2ZW50XCIpIHtcblx0XHRtUGFyYW1ldGVycyA9IHt9O1xuXHR9XG5cdHJldHVybiBtUGFyYW1ldGVycyB8fCB7fTtcbn1cblxuY2xhc3MgVHJhbnNhY3Rpb25IZWxwZXIge1xuXHRfb0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50O1xuXHRvTG9ja09iamVjdDogYW55O1xuXHRzUHJvZ3JhbW1pbmdNb2RlbD86IFByb2dyYW1taW5nTW9kZWxUeXBlO1xuXHRfYklzTW9kaWZpZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblx0X2JDcmVhdGVNb2RlOiBib29sZWFuID0gZmFsc2U7XG5cdF9iQ29udGludWVEaXNjYXJkOiBib29sZWFuID0gZmFsc2U7XG5cdF9vUG9wb3ZlciE6IFBvcG92ZXI7XG5cdGNvbnN0cnVjdG9yKG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgb0xvY2tPYmplY3Q6IGFueSkge1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSBvQXBwQ29tcG9uZW50O1xuXHRcdHRoaXMub0xvY2tPYmplY3QgPSBvTG9ja09iamVjdDtcblx0fVxuXHRnZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0OiBhbnkpIHtcblx0XHRpZiAoIXRoaXMuc1Byb2dyYW1taW5nTW9kZWwgJiYgb0NvbnRleHQpIHtcblx0XHRcdGxldCBzUGF0aDtcblx0XHRcdGlmIChvQ29udGV4dC5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKSkge1xuXHRcdFx0XHRzUGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNQYXRoID0gb0NvbnRleHQuaXNSZWxhdGl2ZSgpID8gb0NvbnRleHQuZ2V0UmVzb2x2ZWRQYXRoKCkgOiBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLCBzUGF0aCkpIHtcblx0XHRcdFx0dGhpcy5zUHJvZ3JhbW1pbmdNb2RlbCA9IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cdFx0XHR9IGVsc2UgaWYgKE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpKSkge1xuXHRcdFx0XHR0aGlzLnNQcm9ncmFtbWluZ01vZGVsID0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3k7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBhcyB0aGUgdHJhbnNhY3Rpb24gaGVscGVyIGlzIGEgc2luZ2xldG9uIHdlIGRvbid0IHN0b3JlIHRoZSBub24gZHJhZnQgYXMgdGhlIHVzZXIgY291bGRcblx0XHRcdFx0Ly8gc3RhcnQgd2l0aCBhIG5vbiBkcmFmdCBjaGlsZCBwYWdlIGFuZCBuYXZpZ2F0ZXMgYmFjayB0byBhIGRyYWZ0IGVuYWJsZWQgb25lXG5cdFx0XHRcdHJldHVybiBQcm9ncmFtbWluZ01vZGVsLk5vbkRyYWZ0O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5zUHJvZ3JhbW1pbmdNb2RlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBWYWxpZGF0ZXMgYSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgdmFsaWRhdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbbVBhcmFtZXRlcnNdIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogKiBAcGFyYW0ge29iamVjdH0gW21QYXJhbWV0ZXJzLmRhdGFdIEEgbWFwIG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgdmFsaWRhdGVkXG5cdCAqICogQHBhcmFtIHtzdHJpbmd9IFttUGFyYW1ldGVycy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25dIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aCB0byB0aGUgdmFsaWRhdGlvbiBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1ZpZXcgQ29udGFpbnMgdGhlIG9iamVjdCBvZiB0aGUgY3VycmVudCB2aWV3XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIHdpdGggcmVzdWx0IG9mIHRoZSBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvblxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHR2YWxpZGF0ZURvY3VtZW50KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnksIG9WaWV3OiBWaWV3KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uID0gbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uO1xuXHRcdGlmIChzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uKSB7XG5cdFx0XHRjb25zdCBzTW9kdWxlID0gc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5zdWJzdHJpbmcoMCwgc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5sYXN0SW5kZXhPZihcIi5cIikgfHwgLTEpLnJlcGxhY2UoL1xcLi9naSwgXCIvXCIpLFxuXHRcdFx0XHRzRnVuY3Rpb25OYW1lID0gc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5zdWJzdHJpbmcoXG5cdFx0XHRcdFx0c0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5sYXN0SW5kZXhPZihcIi5cIikgKyAxLFxuXHRcdFx0XHRcdHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24ubGVuZ3RoXG5cdFx0XHRcdCksXG5cdFx0XHRcdG1EYXRhID0gbVBhcmFtZXRlcnMuZGF0YTtcblx0XHRcdGRlbGV0ZSBtRGF0YVtcIkAkdWk1LmNvbnRleHQuaXNUcmFuc2llbnRcIl07XG5cdFx0XHRyZXR1cm4gRlBNSGVscGVyLnZhbGlkYXRpb25XcmFwcGVyKHNNb2R1bGUsIHNGdW5jdGlvbk5hbWUsIG1EYXRhLCBvVmlldywgb0NvbnRleHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nfSBvTWFpbkxpc3RCaW5kaW5nIE9EYXRhIFY0IExpc3RCaW5kaW5nIG9iamVjdFxuXHQgKiBAcGFyYW0ge29iamVjdH0gW21JblBhcmFtZXRlcnNdIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSB7bWFwfSBbbUluUGFyYW1ldGVycy5kYXRhXSBBIG1hcCBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHNlbnQgd2l0aGluIHRoZSBQT1NUXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbbUluUGFyYW1ldGVycy5idXN5TW9kZV0gR2xvYmFsIChkZWZhdWx0KSwgTG9jYWwsIE5vbmUgVE9ETzogdG8gYmUgcmVmYWN0b3JlZFxuXHQgKiBAcGFyYW0ge21hcH0gW21JblBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZF0gSWYgc2V0LCB0aGUgY29udGV4dCBzdGF5cyBpbiB0aGUgbGlzdCBpZiB0aGUgUE9TVCBmYWlsZWQgYW5kIFBPU1Qgd2lsbCBiZSByZXBlYXRlZCB3aXRoIHRoZSBuZXh0IGNoYW5nZVxuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcGFyYW0gYkZyb21Db3B5UGFzdGVcblx0ICogQHBhcmFtIG9WaWV3IFRoZSBjdXJyZW50IHZpZXdcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgd2l0aCBuZXcgYmluZGluZyBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGNyZWF0ZURvY3VtZW50KFxuXHRcdG9NYWluTGlzdEJpbmRpbmc6IGFueSxcblx0XHRtSW5QYXJhbWV0ZXJzOiB7IGRhdGE/OiBhbnk7IGJ1c3lNb2RlPzogc3RyaW5nIHwgdW5kZWZpbmVkOyBrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkPzogYW55IH0gfCB1bmRlZmluZWQsXG5cdFx0b1Jlc291cmNlQnVuZGxlOiBhbnksXG5cdFx0bWVzc2FnZUhhbmRsZXI6IGFueSxcblx0XHRiRnJvbUNvcHlQYXN0ZTogYW55LFxuXHRcdG9WaWV3OiBhbnlcblx0KSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXMsXG5cdFx0XHRvTW9kZWwgPSBvTWFpbkxpc3RCaW5kaW5nLmdldE1vZGVsKCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKS5nZXRQYXRoKCkpLFxuXHRcdFx0c0NyZWF0ZUhhc2ggPSB0aGlzLl9nZXRBcHBDb21wb25lbnQoKVxuXHRcdFx0XHQuZ2V0Um91dGVyUHJveHkoKVxuXHRcdFx0XHQuZ2V0SGFzaCgpLFxuXHRcdFx0b0NvbXBvbmVudERhdGEgPSB0aGlzLl9nZXRBcHBDb21wb25lbnQoKS5nZXRDb21wb25lbnREYXRhKCksXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMgPSAob0NvbXBvbmVudERhdGEgJiYgb0NvbXBvbmVudERhdGEuc3RhcnR1cFBhcmFtZXRlcnMpIHx8IHt9LFxuXHRcdFx0c05ld0FjdGlvbiA9ICFvTWFpbkxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKVxuXHRcdFx0XHQ/IHRoaXMuX2dldE5ld0FjdGlvbihvU3RhcnR1cFBhcmFtZXRlcnMsIHNDcmVhdGVIYXNoLCBvTWV0YU1vZGVsLCBzTWV0YVBhdGgpXG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdGxldCBvQ3JlYXRpb25Qcm9taXNlO1xuXHRcdGNvbnN0IG1CaW5kaW5nUGFyYW1ldGVyczogYW55ID0geyBcIiQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHNcIjogdHJ1ZSB9O1xuXHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGggKyBcIi9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoXCIpO1xuXHRcdGxldCBzQnVzeVBhdGggPSBcIi9idXN5XCI7XG5cdFx0bGV0IHNGdW5jdGlvbk5hbWUgPVxuXHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRlZmF1bHRWYWx1ZXNGdW5jdGlvblwiKSB8fFxuXHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3QoXG5cdFx0XHRcdE1vZGVsSGVscGVyLmdldFRhcmdldEVudGl0eVNldChvTWV0YU1vZGVsLmdldENvbnRleHQoc01ldGFQYXRoKSkgKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVmYXVsdFZhbHVlc0Z1bmN0aW9uXCJcblx0XHRcdCk7XG5cdFx0bGV0IGJGdW5jdGlvbk9uTmF2UHJvcDtcblx0XHRsZXQgb05ld0RvY3VtZW50Q29udGV4dDogYW55O1xuXHRcdGlmIChzRnVuY3Rpb25OYW1lKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNNZXRhUGF0aCArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EZWZhdWx0VmFsdWVzRnVuY3Rpb25cIikgJiZcblx0XHRcdFx0TW9kZWxIZWxwZXIuZ2V0VGFyZ2V0RW50aXR5U2V0KG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzTWV0YVBhdGgpKSAhPT0gc01ldGFQYXRoXG5cdFx0XHQpIHtcblx0XHRcdFx0YkZ1bmN0aW9uT25OYXZQcm9wID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJGdW5jdGlvbk9uTmF2UHJvcCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0bUJpbmRpbmdQYXJhbWV0ZXJzW1wiJHNlbGVjdFwiXSA9IHNNZXNzYWdlc1BhdGg7XG5cdFx0fVxuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtSW5QYXJhbWV0ZXJzKTtcblx0XHRpZiAoIW9NYWluTGlzdEJpbmRpbmcpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkJpbmRpbmcgcmVxdWlyZWQgZm9yIG5ldyBkb2N1bWVudCBjcmVhdGlvblwiKTtcblx0XHR9XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob01haW5MaXN0QmluZGluZyk7XG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmIHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQ3JlYXRlIGRvY3VtZW50IG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblx0XHRpZiAobVBhcmFtZXRlcnMuYnVzeU1vZGUgPT09IFwiTG9jYWxcIikge1xuXHRcdFx0Ly8gaW4gY2FzZSBvZiBsb2NhbCBidXN5IG1vZGUgd2UgdXNlIHRoZSBsaXN0IGJpbmRpbmcgbmFtZVxuXHRcdFx0Ly8gdGhlcmUncyBubyBBUFkgeWV0IHNvIHdlIGhhdmUgdG8gdXNlIHRoZSAuc0lkIFRPRE8gcHJvdmlkZSBhIHB1YmxpYyBtZXRob2Q/XG5cdFx0XHRzQnVzeVBhdGggPSBcIi9idXN5TG9jYWwvXCIgKyBvTWFpbkxpc3RCaW5kaW5nLnNJZDtcblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgPSBiRnJvbUNvcHlQYXN0ZSA/IG51bGwgOiBtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaztcblx0XHRCdXN5TG9ja2VyLmxvY2sodGhpcy5vTG9ja09iamVjdCwgc0J1c3lQYXRoKTtcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGVDb3JlID0gc2FwLnVpLmdldENvcmUoKS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0XHRpZiAoc05ld0FjdGlvbikge1xuXHRcdFx0b0NyZWF0aW9uUHJvbWlzZSA9IHRoaXMuY2FsbEFjdGlvbihcblx0XHRcdFx0c05ld0FjdGlvbixcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNvbnRleHRzOiBvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSxcblx0XHRcdFx0XHRzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nOiB0cnVlLFxuXHRcdFx0XHRcdGxhYmVsOiB0aGlzLl9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsKFxuXHRcdFx0XHRcdFx0b01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdHNNZXRhUGF0aCxcblx0XHRcdFx0XHRcdHNOZXdBY3Rpb24sXG5cdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVDb3JlIGFzIFJlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVyczogbUJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0YklzQ3JlYXRlQWN0aW9uOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBiSXNOZXdQYWdlQ3JlYXRpb24gPVxuXHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyAmJiBtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5JbmxpbmU7XG5cdFx0XHRjb25zdCBhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzID0gYklzTmV3UGFnZUNyZWF0aW9uXG5cdFx0XHRcdD8gQ29tbW9uVXRpbHMuZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzKG9NZXRhTW9kZWwsIHNNZXRhUGF0aCwgb1ZpZXcpXG5cdFx0XHRcdDogW107XG5cdFx0XHRzRnVuY3Rpb25OYW1lID0gYkZyb21Db3B5UGFzdGUgPyBudWxsIDogc0Z1bmN0aW9uTmFtZTtcblx0XHRcdGxldCBzRnVuY3Rpb25QYXRoLCBvRnVuY3Rpb25Db250ZXh0O1xuXHRcdFx0aWYgKHNGdW5jdGlvbk5hbWUpIHtcblx0XHRcdFx0Ly9ib3VuZCB0byB0aGUgc291cmNlIGVudGl0eTpcblx0XHRcdFx0aWYgKGJGdW5jdGlvbk9uTmF2UHJvcCkge1xuXHRcdFx0XHRcdHNGdW5jdGlvblBhdGggPVxuXHRcdFx0XHRcdFx0b01haW5MaXN0QmluZGluZy5nZXRDb250ZXh0KCkgJiZcblx0XHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob01haW5MaXN0QmluZGluZy5nZXRDb250ZXh0KCkuZ2V0UGF0aCgpKSArIFwiL1wiICsgc0Z1bmN0aW9uTmFtZTtcblx0XHRcdFx0XHRvRnVuY3Rpb25Db250ZXh0ID0gb01haW5MaXN0QmluZGluZy5nZXRDb250ZXh0KCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c0Z1bmN0aW9uUGF0aCA9XG5cdFx0XHRcdFx0XHRvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSAmJlxuXHRcdFx0XHRcdFx0b01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKS5nZXRQYXRoKCkpICsgXCIvXCIgKyBzRnVuY3Rpb25OYW1lO1xuXHRcdFx0XHRcdG9GdW5jdGlvbkNvbnRleHQgPSBvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgb0Z1bmN0aW9uID0gc0Z1bmN0aW9uUGF0aCAmJiBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNGdW5jdGlvblBhdGgpO1xuXHRcdFx0aWYgKG9GdW5jdGlvbiAmJiBvRnVuY3Rpb24uZ2V0T2JqZWN0KCkgJiYgb0Z1bmN0aW9uLmdldE9iamVjdCgpWzBdLiRJc0JvdW5kKSB7XG5cdFx0XHRcdG9DcmVhdGlvblByb21pc2UgPSBvcGVyYXRpb25zLmNhbGxCb3VuZEZ1bmN0aW9uKHNGdW5jdGlvbk5hbWUsIG9GdW5jdGlvbkNvbnRleHQsIG9Nb2RlbCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvQ3JlYXRpb25Qcm9taXNlID0gb3BlcmF0aW9ucy5jYWxsRnVuY3Rpb25JbXBvcnQoc0Z1bmN0aW9uTmFtZSwgb01vZGVsKTtcblx0XHRcdH1cblxuXHRcdFx0b0NyZWF0aW9uUHJvbWlzZSA9IG9DcmVhdGlvblByb21pc2Vcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24ob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZXhlY3V0aW5nIHRoZSBmdW5jdGlvbiBcIiArIHNGdW5jdGlvbk5hbWUsIG9FcnJvcik7XG5cdFx0XHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbihvRGF0YTogYW55KSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGF0YSA9IG9EYXRhID8gT2JqZWN0LmFzc2lnbih7fSwgb0RhdGEsIG1QYXJhbWV0ZXJzLmRhdGEpIDogbVBhcmFtZXRlcnMuZGF0YTtcblx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuZGF0YSkge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIG1QYXJhbWV0ZXJzLmRhdGFbXCJAb2RhdGEuY29udGV4dFwiXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1RyYW5zaWVudExpc3RCaW5kaW5nID0gb01vZGVsLmJpbmRMaXN0KG9NYWluTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBvTWFpbkxpc3RCaW5kaW5nLmdldENvbnRleHQoKSwgW10sIFtdLCB7XG5cdFx0XHRcdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCJzdWJtaXRMYXRlclwiXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdG9UcmFuc2llbnRMaXN0QmluZGluZy5yZWZyZXNoSW50ZXJuYWwgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0LyogKi9cblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRvTmV3RG9jdW1lbnRDb250ZXh0ID0gb1RyYW5zaWVudExpc3RCaW5kaW5nLmNyZWF0ZShtUGFyYW1ldGVycy5kYXRhLCB0cnVlKTtcblx0XHRcdFx0XHRcdHJldHVybiB0aGF0Ll9sYXVuY2hEaWFsb2dXaXRoS2V5RmllbGRzKFxuXHRcdFx0XHRcdFx0XHRvTWFpbkxpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdFx0XHRvVHJhbnNpZW50TGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdG9OZXdEb2N1bWVudENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdGFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMsXG5cdFx0XHRcdFx0XHRcdG9Nb2RlbCxcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRsZXQgb25CZWZvcmVDcmVhdGVQcm9taXNlO1xuXHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKSB7XG5cdFx0XHRcdFx0XHRcdG9uQmVmb3JlQ3JlYXRlUHJvbWlzZSA9IG1QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKHtcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogb01haW5MaXN0QmluZGluZyAmJiBvTWFpbkxpc3RCaW5kaW5nLmdldFBhdGgoKVxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG9uQmVmb3JlQ3JlYXRlUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIG9uQmVmb3JlQ3JlYXRlUHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRvTmV3RG9jdW1lbnRDb250ZXh0ID0gb01haW5MaXN0QmluZGluZy5jcmVhdGUobVBhcmFtZXRlcnMuZGF0YSwgdHJ1ZSwgbVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhhdC5vbkFmdGVyQ3JlYXRlQ29tcGxldGlvbihvTWFpbkxpc3RCaW5kaW5nLCBvTmV3RG9jdW1lbnRDb250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbihvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBuZXcgZG9jdW1lbnRcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gb0NyZWF0aW9uUHJvbWlzZVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24ob1Jlc3VsdDogYW55KSB7XG5cdFx0XHRcdGlmICghb01haW5MaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0XHQvLyB0aGUgY3JlYXRlIG1vZGUgc2hhbGwgY3VycmVudGx5IG9ubHkgYmUgc2V0IG9uIGNyZWF0aW5nIGEgcm9vdCBkb2N1bWVudFxuXHRcdFx0XHRcdHRoYXQuX2JDcmVhdGVNb2RlID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvTmV3RG9jdW1lbnRDb250ZXh0ID0gb05ld0RvY3VtZW50Q29udGV4dCB8fCAob1Jlc3VsdCAmJiBvUmVzdWx0LnJlc3BvbnNlKTtcblx0XHRcdFx0Ly8gVE9ETzogd2hlcmUgZG9lcyB0aGlzIG9uZSBjb21pbmcgZnJvbT8/P1xuXHRcdFx0XHRpZiAob1Jlc3VsdCAmJiBvUmVzdWx0LmJDb25zaWRlckRvY3VtZW50TW9kaWZpZWQpIHtcblx0XHRcdFx0XHR0aGF0LmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9OZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbihvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coKS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdC8vIGZvciBpbnN0YW5jZSwgb24gY2FuY2VsIG9mIGNyZWF0ZSBkaWFsb2csIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkXG5cdFx0XHRcdFx0Ly8gYSByZXR1cm4gaGVyZSB3b3VsZCByZXN0b3JlIHRoZSBwcm9taXNlIGNoYWluIGFuZCByZXN1bHQgaW4gZXJyb3JzIHdoaWxlIHJvdXRpbmdcblx0XHRcdFx0XHQvLyBzb2x1dGlvbiAtICByZWplY3QgaGVyZSBhcyB3ZWxsXG5cdFx0XHRcdFx0aWYgKG9FcnJvciAmJiBvRXJyb3IuYkRlbGV0ZVRyYW5zaWVudENvbnRleHQgJiYgb05ld0RvY3VtZW50Q29udGV4dC5pc1RyYW5zaWVudCgpKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBzdWdnZXN0ZWQgYnkgbW9kZWwgYXMgQ29udGV4dC5kZWxldGUgcmVzdWx0cyBpbiBhbiBlcnJvclxuXHRcdFx0XHRcdFx0Ly8gVE9ETzogcmVtb3ZlIHRoZSAkZGlyZWN0IG9uY2UgbW9kZWwgcmVzb2x2ZXMgdGhpcyBpc3N1ZVxuXHRcdFx0XHRcdFx0Ly8gdGhpcyBsaW5lIHNob3dzIHRoZSBleHBlY3RlZCBjb25zb2xlIGVycm9yIFVuY2F1Z2h0IChpbiBwcm9taXNlKSBFcnJvcjogUmVxdWVzdCBjYW5jZWxlZDogUE9TVCBUcmF2ZWw7IGdyb3VwOiBzdWJtaXRMYXRlclxuXHRcdFx0XHRcdFx0b05ld0RvY3VtZW50Q29udGV4dC5kZWxldGUoXCIkZGlyZWN0XCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3Qob0Vycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoYXQub0xvY2tPYmplY3QsIHNCdXN5UGF0aCk7XG5cdFx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogRmluZCB0aGUgYWN0aXZlIGNvbnRleHRzIG9mIHRoZSBkb2N1bWVudHMsIG9ubHkgZm9yIHRoZSBkcmFmdCByb290cy5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFtdfSBhQ29udGV4dHMgQ29udGV4dHMgRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gYkZpbmRBY3RpdmVDb250ZXh0c1xuXHQgKiBAcmV0dXJucyB7QXJyYXl9IEFycmF5IG9mIHRoZSBhY3RpdmUgY29udGV4dHNcblx0ICovXG5cdGZpbmRBY3RpdmVEcmFmdFJvb3RDb250ZXh0cyhhQ29udGV4dHM6IGFueVtdLCBiRmluZEFjdGl2ZUNvbnRleHRzOiBhbnkpIHtcblx0XHRpZiAoIWJGaW5kQWN0aXZlQ29udGV4dHMpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdFx0Y29uc3QgYWN0aXZlQ29udGV4dHMgPSBhQ29udGV4dHMucmVkdWNlKGZ1bmN0aW9uKGFSZXN1bHQ6IGFueSwgb0NvbnRleHQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRpZiAob01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiKSkge1xuXHRcdFx0XHRjb25zdCBiSXNBY3RpdmVFbnRpdHkgPSBvQ29udGV4dC5nZXRPYmplY3QoKS5Jc0FjdGl2ZUVudGl0eSxcblx0XHRcdFx0XHRiSGFzQWN0aXZlRW50aXR5ID0gb0NvbnRleHQuZ2V0T2JqZWN0KCkuSGFzQWN0aXZlRW50aXR5O1xuXHRcdFx0XHRpZiAoIWJJc0FjdGl2ZUVudGl0eSAmJiBiSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0FjdGl2ZUNvbnRleHQgPSBvQ29udGV4dFxuXHRcdFx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0XHRcdC5iaW5kQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCkgKyBcIi9TaWJsaW5nRW50aXR5XCIpXG5cdFx0XHRcdFx0XHQuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0YVJlc3VsdC5wdXNoKG9BY3RpdmVDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGFSZXN1bHQ7XG5cdFx0fSwgW10pO1xuXHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdGFjdGl2ZUNvbnRleHRzLm1hcChmdW5jdGlvbihvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpLnRoZW4oXG5cdFx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHQ7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cdFx0XHR9KVxuXHRcdCk7XG5cdH1cblx0YWZ0ZXJEZWxldGVQcm9jZXNzKG1QYXJhbWV0ZXJzOiBhbnksIGNoZWNrQm94OiBhbnksIGFDb250ZXh0czogYW55LCBvUmVzb3VyY2VCdW5kbGU6IGFueSkge1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGlmIChvSW50ZXJuYWxNb2RlbENvbnRleHQgJiYgb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwiZGVsZXRlRW5hYmxlZFwiKSAhPSB1bmRlZmluZWQpIHtcblx0XHRcdGlmIChjaGVja0JveC5pc0NoZWNrQm94VmlzaWJsZSA9PT0gdHJ1ZSAmJiBjaGVja0JveC5pc0NoZWNrQm94U2VsZWN0ZWQgPT09IGZhbHNlKSB7XG5cdFx0XHRcdC8vaWYgdW5zYXZlZCBvYmplY3RzIGFyZSBub3QgZGVsZXRlZCB0aGVuIHdlIG5lZWQgdG8gc2V0IHRoZSBlbmFibGVkIHRvIHRydWUgYW5kIHVwZGF0ZSB0aGUgbW9kZWwgZGF0YSBmb3IgbmV4dCBkZWxldGlvblxuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJkZWxldGVFbmFibGVkXCIsIHRydWUpO1xuXHRcdFx0XHRjb25zdCBvYmogPSBPYmplY3QuYXNzaWduKG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRPYmplY3QoKSwge30pO1xuXHRcdFx0XHRvYmouc2VsZWN0ZWRDb250ZXh0cyA9IG9iai5zZWxlY3RlZENvbnRleHRzLmZpbHRlcihmdW5jdGlvbihlbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb2JqLmRlbGV0YWJsZUNvbnRleHRzLmluZGV4T2YoZWxlbWVudCkgPT09IC0xO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0b2JqLmRlbGV0YWJsZUNvbnRleHRzID0gW107XG5cdFx0XHRcdG9iai5zZWxlY3RlZENvbnRleHRzID0gW107XG5cdFx0XHRcdG9iai5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPSBvYmouc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGg7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIlwiLCBvYmopO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiZGVsZXRlRW5hYmxlZFwiLCBmYWxzZSk7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNlbGVjdGVkQ29udGV4dHNcIiwgW10pO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcIiwgMCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChhQ29udGV4dHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhcblx0XHRcdFx0Q29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9ERUxFVEVfVE9BU1RfU0lOR1VMQVJcIixcblx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KFxuXHRcdFx0XHRDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0RFTEVURV9UT0FTVF9QTFVSQUxcIixcblx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQgKiBEZWxldGUgb25lIG9yIG11bHRpcGxlIGRvY3VtZW50KHMpLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSB2Q29udGV4dHMgQ29udGV4dHMgRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLnRpdGxlIFRpdGxlIG9mIHRoZSBvYmplY3QgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbVBhcmFtZXRlcnMuZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdCB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSB7aW50ZWdlcn0gbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIE51bWJlciBvZiBvYmplY3RzIHNlbGVjdGVkXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbVBhcmFtZXRlcnMubm9EaWFsb2cgVG8gZGlzYWJsZSB0aGUgY29uZmlybWF0aW9uIGRpYWxvZ1xuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX1cblx0ICovXG5cdGRlbGV0ZURvY3VtZW50KHZDb250ZXh0czogYW55LCBtUGFyYW1ldGVyczogYW55LCBvUmVzb3VyY2VCdW5kbGU6IGFueSwgbWVzc2FnZUhhbmRsZXI6IGFueSkge1xuXHRcdGxldCBmblJlamVjdDogRnVuY3Rpb24sXG5cdFx0XHRmblJlc29sdmU6IEZ1bmN0aW9uLFxuXHRcdFx0YURlbGV0YWJsZUNvbnRleHRzOiBhbnlbXSA9IFtdLFxuXHRcdFx0aXNDaGVja0JveFZpc2libGUgPSBmYWxzZSxcblx0XHRcdGlzTG9ja2VkVGV4dFZpc2libGUgPSBmYWxzZSxcblx0XHRcdGNhbm5vdEJlRGVsZXRlZFRleHRWaXNpYmxlID0gZmFsc2UsXG5cdFx0XHRpc0NoZWNrQm94U2VsZWN0ZWQ6IGJvb2xlYW4sXG5cdFx0XHRiRGlhbG9nQ29uZmlybWVkID0gZmFsc2U7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXMsXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGVDb3JlID0gc2FwLnVpLmdldENvcmUoKS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSBhcyBSZXNvdXJjZUJ1bmRsZTtcblx0XHRsZXQgYVBhcmFtcztcblx0XHRsZXQgb0RlbGV0ZU1lc3NhZ2U6IGFueSA9IHtcblx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGVDb3JlLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9ERUxFVEVcIilcblx0XHR9O1xuXHRcdEJ1c3lMb2NrZXIubG9jayh0aGlzLm9Mb2NrT2JqZWN0KTtcblx0XHRpZiAoIUFycmF5LmlzQXJyYXkodkNvbnRleHRzKSkge1xuXHRcdFx0dkNvbnRleHRzID0gW3ZDb250ZXh0c107XG5cdFx0fVxuXHRcdFByb21pc2UucmVzb2x2ZSh0aGlzLmdldFByb2dyYW1taW5nTW9kZWwodkNvbnRleHRzWzBdKSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uKHNQcm9ncmFtbWluZ01vZGVsOiBhbnkpIHtcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMpIHtcblx0XHRcdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZDb250ZXh0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IHZDb250ZXh0c1tpXS5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRvQ29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgPT09IHRydWUgJiZcblx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRvQ29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEuSW5Qcm9jZXNzQnlVc2VyICYmXG5cdFx0XHRcdFx0XHRcdFx0XHQhb0NvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkRyYWZ0SXNDcmVhdGVkQnlNZVxuXHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0TWVzc2FnZUJveC5zaG93KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfU0lOR0xFX09CSkVDVF9MT0NLRURcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGVDb3JlLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9ERUxFVEVcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b25DbG9zZTogZm5SZWplY3Rcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMudGl0bGUpIHtcblx0XHRcdFx0XHRcdFx0YVBhcmFtcyA9IFttUGFyYW1ldGVycy50aXRsZSwgbVBhcmFtZXRlcnMuZGVzY3JpcHRpb25dO1xuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9cIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0YVBhcmFtcyxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMgPSB2Q29udGV4dHM7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlID0ge1xuXHRcdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfREVMRVRFXCIpXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9PT0gMSAmJiBtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPT09IHZDb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gdkNvbnRleHRzO1xuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPT09IDEgJiYgbVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdFx0XHQvL29ubHkgb25lIHVuc2F2ZWQgb2JqZWN0XG5cdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cztcblx0XHRcdFx0XHRcdFx0Y29uc3QgZHJhZnRBZG1pbkRhdGEgPSBhRGVsZXRhYmxlQ29udGV4dHNbMF0uZ2V0T2JqZWN0KClbXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiXTtcblx0XHRcdFx0XHRcdFx0bGV0IHNMYXN0Q2hhbmdlZEJ5VXNlciA9IFwiXCI7XG5cdFx0XHRcdFx0XHRcdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdHNMYXN0Q2hhbmdlZEJ5VXNlciA9XG5cdFx0XHRcdFx0XHRcdFx0XHRkcmFmdEFkbWluRGF0YVtcIkxhc3RDaGFuZ2VkQnlVc2VyRGVzY3JpcHRpb25cIl0gfHwgZHJhZnRBZG1pbkRhdGFbXCJMYXN0Q2hhbmdlZEJ5VXNlclwiXSB8fCBcIlwiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGFQYXJhbXMgPSBbc0xhc3RDaGFuZ2VkQnlVc2VyXTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9VTlNBVkVEX0NIQU5HRVNcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0YVBhcmFtc1xuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPT09IG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0Ly9vbmx5IG11bHRpcGxlIHVuc2F2ZWQgb2JqZWN0c1xuXHRcdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMgPSBtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHM7XG5cdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLnRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9DSEFOR0VTX01VTFRJUExFX09CSkVDVFNcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9PT1cblx0XHRcdFx0XHRcdFx0dkNvbnRleHRzLmNvbmNhdChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMuY29uY2F0KG1QYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzKSkubGVuZ3RoXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0Ly9vbmx5IHVuc2F2ZWQsIGxvY2tlZCAsZGVsZXRhYmxlIG9iamVjdHMgYnV0IG5vdCBub24tZGVsZXRhYmxlIG9iamVjdHNcblx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gdkNvbnRleHRzLmNvbmNhdChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMpO1xuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID1cblx0XHRcdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMubGVuZ3RoID09PSAxXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdCAgKVxuXHRcdFx0XHRcdFx0XHRcdFx0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfUExVUkFMXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0ICApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly9pZiBub24tZGVsZXRhYmxlIG9iamVjdHMgZXhpc3RzIGFsb25nIHdpdGggYW55IG9mIHVuc2F2ZWQgLGRlbGV0YWJsZSBvYmplY3RzXG5cdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IHZDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzKTtcblx0XHRcdFx0XHRcdFx0Y2Fubm90QmVEZWxldGVkVGV4dFZpc2libGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID1cblx0XHRcdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMubGVuZ3RoID09PSAxXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUl9OT05fREVMRVRBQkxFXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0ICApXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9QTFVSQUxfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdCAgKTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2Uubm9uRGVsZXRhYmxlVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9GRVdfT0JKRUNUU19OT05fREVMRVRBQkxFXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyAtIHZDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzKS5sZW5ndGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcblx0XHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMubG9ja2VkQ29udGV4dHMubGVuZ3RoID09IDEpIHtcblx0XHRcdFx0XHRcdFx0Ly9zZXR0aW5nIHRoZSBsb2NrZWQgdGV4dCBpZiBsb2NrZWQgb2JqZWN0cyBleGlzdFxuXHRcdFx0XHRcdFx0XHRpc0xvY2tlZFRleHRWaXNpYmxlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2Uubm9uRGVsZXRhYmxlVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9PTkVfT0JKRUNUX0xPQ0tFRFwiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRbbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdFx0Ly9zZXR0aW5nIHRoZSBsb2NrZWQgdGV4dCBpZiBsb2NrZWQgb2JqZWN0cyBleGlzdFxuXHRcdFx0XHRcdFx0XHRpc0xvY2tlZFRleHRWaXNpYmxlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2Uubm9uRGVsZXRhYmxlVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9GRVdfT0JKRUNUU19MT0NLRURcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0W21QYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzLmxlbmd0aCwgbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoID4gMCAmJlxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoICE9PSBtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0KGNhbm5vdEJlRGVsZXRlZFRleHRWaXNpYmxlIHx8IGlzTG9ja2VkVGV4dFZpc2libGUpICYmXG5cdFx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzLmxlbmd0aCA9PT0gbVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHQvL2lmIG9ubHkgdW5zYXZlZCBhbmQgZWl0aGVyIG9yIGJvdGggb2YgbG9ja2VkIGFuZCBub24tZGVsZXRhYmxlIG9iamVjdHMgZXhpc3QgdGhlbiB3ZSBoaWRlIHRoZSBjaGVjayBib3hcblx0XHRcdFx0XHRcdFx0XHRpc0NoZWNrQm94VmlzaWJsZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cztcblx0XHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9BTkRfRkVXX09CSkVDVFNfTE9DS0VEX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9BTkRfRkVXX09CSkVDVFNfTE9DS0VEX1BMVVJBTFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS5jaGVja0JveFRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX0ZFV19PQkpFQ1RTX1VOU0FWRURfU0lOR1VMQVJcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS5jaGVja0JveFRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX0ZFV19PQkpFQ1RTX1VOU0FWRURfUExVUkFMXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aXNDaGVja0JveFZpc2libGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoY2Fubm90QmVEZWxldGVkVGV4dFZpc2libGUgJiYgaXNMb2NrZWRUZXh0VmlzaWJsZSkge1xuXHRcdFx0XHRcdFx0XHQvL2lmIGJvdGggbG9ja2VkIGFuZCBub24tZGVsZXRhYmxlIG9iamVjdHMgZXhpc3QgYWxvbmcgd2l0aCBkZWxldGFibGUgb2JqZWN0c1xuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS5ub25EZWxldGFibGVUZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfRkVXX09CSkVDVFNfTE9DS0VEX0FORF9OT05fREVMRVRBQkxFXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyAtXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dkNvbnRleHRzLmNvbmNhdChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMpLmxlbmd0aCAtXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubG9ja2VkQ29udGV4dHMubGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5sb2NrZWRDb250ZXh0cy5sZW5ndGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1xuXHRcdFx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPT0gMSkge1xuXHRcdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLm5vbkRlbGV0YWJsZVRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9PTkVfT0JKRUNUX0xPQ0tFRF9BTkRfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgLVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzKS5sZW5ndGggLVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzLmxlbmd0aCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXG5cdFx0XHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRsZXQgb05vbkRlbGV0YWJsZU1lc3NhZ2VUZXh0Q29udHJvbCwgb0RlbGV0ZU1lc3NhZ2VUZXh0Q29udHJvbDtcblx0XHRcdFx0Y29uc3Qgb0NvbnRlbnQgPSBuZXcgVkJveCh7XG5cdFx0XHRcdFx0aXRlbXM6IFtcblx0XHRcdFx0XHRcdChvTm9uRGVsZXRhYmxlTWVzc2FnZVRleHRDb250cm9sID0gbmV3IFRleHQoe1xuXHRcdFx0XHRcdFx0XHR0ZXh0OiBvRGVsZXRlTWVzc2FnZS5ub25EZWxldGFibGVUZXh0LFxuXHRcdFx0XHRcdFx0XHR2aXNpYmxlOiBpc0xvY2tlZFRleHRWaXNpYmxlIHx8IGNhbm5vdEJlRGVsZXRlZFRleHRWaXNpYmxlXG5cdFx0XHRcdFx0XHR9KSksXG5cdFx0XHRcdFx0XHQob0RlbGV0ZU1lc3NhZ2VUZXh0Q29udHJvbCA9IG5ldyBUZXh0KHtcblx0XHRcdFx0XHRcdFx0dGV4dDogb0RlbGV0ZU1lc3NhZ2UudGV4dFxuXHRcdFx0XHRcdFx0fSkpLFxuXHRcdFx0XHRcdFx0bmV3IENoZWNrQm94KHtcblx0XHRcdFx0XHRcdFx0dGV4dDogb0RlbGV0ZU1lc3NhZ2UuY2hlY2tCb3hUZXh0LFxuXHRcdFx0XHRcdFx0XHRzZWxlY3RlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0c2VsZWN0OiBmdW5jdGlvbihvRXZlbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNlbGVjdGVkID0gb0V2ZW50LmdldFNvdXJjZSgpLmdldFNlbGVjdGVkKCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNlbGVjdGVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMgPSB2Q29udGV4dHMuY29uY2F0KG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRpc0NoZWNrQm94U2VsZWN0ZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMgPSB2Q29udGV4dHM7XG5cdFx0XHRcdFx0XHRcdFx0XHRpc0NoZWNrQm94U2VsZWN0ZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHZpc2libGU6IGlzQ2hlY2tCb3hWaXNpYmxlXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdGNvbnN0IHNUaXRsZSA9IG9SZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0RFTEVURVwiKTtcblx0XHRcdFx0Y29uc3QgZm5Db25maXJtID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0YkRpYWxvZ0NvbmZpcm1lZCA9IHRydWU7XG5cdFx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0XHRcdGNvbnN0IGFDb250ZXh0cyA9IGFEZWxldGFibGVDb250ZXh0cztcblx0XHRcdFx0XHRsZXQgb25CZWZvcmVEZWxldGVQcm9taXNlO1xuXHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjaykge1xuXHRcdFx0XHRcdFx0b25CZWZvcmVEZWxldGVQcm9taXNlID0gbVBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2soeyBjb250ZXh0czogYUNvbnRleHRzIH0pO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvbkJlZm9yZURlbGV0ZVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG9uQmVmb3JlRGVsZXRlUHJvbWlzZVxuXHRcdFx0XHRcdFx0LnRoZW4odGhhdC5maW5kQWN0aXZlRHJhZnRSb290Q29udGV4dHMuYmluZCh0aGF0LCBhQ29udGV4dHMsIG1QYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHMpKVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oYWN0aXZlQ29udGV4dHM6IGFueSkge1xuXHRcdFx0XHRcdFx0XHQvL21ha2Ugc3VyZSB0byBmZXRjaCB0aGUgYWN0aXZlIGNvbnRleHRzIGJlZm9yZSBkZWxldGluZyB0aGUgZHJhZnRzXG5cdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdFx0XHRhQ29udGV4dHMubWFwKGZ1bmN0aW9uKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vZGVsZXRlIHRoZSBkcmFmdFxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGRyYWZ0LmRlbGV0ZURyYWZ0KG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCkudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gcmUtdGhyb3cgZXJyb3IgdG8gZW5mb3JjZSByZWplY3RpbmcgdGhlIGdlbmVyYWwgcHJvbWlzZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgY2hlY2tCb3ggPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiaXNDaGVja0JveFZpc2libGVcIjogaXNDaGVja0JveFZpc2libGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiaXNDaGVja0JveFNlbGVjdGVkXCI6IGlzQ2hlY2tCb3hTZWxlY3RlZFxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChhY3RpdmVDb250ZXh0cyAmJiBhY3RpdmVDb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFjdGl2ZUNvbnRleHRzLm1hcChmdW5jdGlvbihvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHQuZGVsZXRlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0KS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoYXQuYWZ0ZXJEZWxldGVQcm9jZXNzKG1QYXJhbWV0ZXJzLCBjaGVja0JveCwgYUNvbnRleHRzLCBvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpLnRoZW4oZm5SZXNvbHZlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGF0LmFmdGVyRGVsZXRlUHJvY2VzcyhtUGFyYW1ldGVycywgY2hlY2tCb3gsIGFDb250ZXh0cywgb1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKCkudGhlbihmblJlc29sdmUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0Zm5SZWplY3QoKTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQuZmluYWxseShmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3Qgb0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdHRpdGxlOiBzVGl0bGUsXG5cdFx0XHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0XHRcdGNvbnRlbnQ6IFtvQ29udGVudF0sXG5cdFx0XHRcdFx0YXJpYUxhYmVsbGVkQnk6IG9Ob25EZWxldGFibGVNZXNzYWdlVGV4dENvbnRyb2wuZ2V0VmlzaWJsZSgpXG5cdFx0XHRcdFx0XHQ/IFtvTm9uRGVsZXRhYmxlTWVzc2FnZVRleHRDb250cm9sLCBvRGVsZXRlTWVzc2FnZVRleHRDb250cm9sXVxuXHRcdFx0XHRcdFx0OiBvRGVsZXRlTWVzc2FnZVRleHRDb250cm9sLFxuXHRcdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdHRleHQ6IG9SZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0RFTEVURVwiKSxcblx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmbkNvbmZpcm0oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9DQU5DRUxcIiwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHQvLyBpZiBkaWFsb2cgaXMgY2xvc2VkIHVuY29uZmlybWVkIChlLmcuIHZpYSBcIkNhbmNlbFwiIG9yIEVzY2FwZSBidXR0b24pLCBlbnN1cmUgdG8gcmVqZWN0IHByb21pc2Vcblx0XHRcdFx0XHRcdGlmICghYkRpYWxvZ0NvbmZpcm1lZCkge1xuXHRcdFx0XHRcdFx0XHRmblJlamVjdCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBhcyBhbnkpO1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMubm9EaWFsb2cpIHtcblx0XHRcdFx0XHRyZXR1cm4gZm5Db25maXJtKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b0RpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdFx0XHRvRGlhbG9nLm9wZW4oKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdExvZy53YXJuaW5nKFwiQ291bGRuJ3QgZ2V0IFByb2dyYW1taW5nIG1vZGVsXCIpO1xuXHRcdFx0XHRmblJlamVjdCgpO1xuXHRcdFx0fSk7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGZuUmVqZWN0ID0gcmVqZWN0O1xuXHRcdFx0Zm5SZXNvbHZlID0gcmVzb2x2ZTtcblx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogRWRpdHMgYSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYlByZXBhcmVPbkVkaXQgQWxzbyBjYWxsIHRoZSAncHJlcGFyZScgYWN0aW9uIGZvciBkcmFmdC1iYXNlZCBkb2N1bWVudHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9WaWV3IE9iamVjdCBvZiBjdXJyZW50IHZpZXdcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIHdpdGggdGhlIG5ldyBkcmFmdCBjb250ZXh0IGluIGNhc2Ugb2YgZHJhZnQgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0ZWRpdERvY3VtZW50KG9Db250ZXh0OiBhbnksIGJQcmVwYXJlT25FZGl0OiBib29sZWFuLCBvVmlldzogb2JqZWN0LCBtZXNzYWdlSGFuZGxlcjogYW55KSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdGxldCBvRWRpdFByb21pc2U7XG5cdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBhY3RpdmUgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIikpO1xuXHRcdH1cblx0XHR0aGlzLl9iSXNNb2RpZmllZCA9IGZhbHNlO1xuXHRcdEJ1c3lMb2NrZXIubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHQvLyBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgZWRpdCBhY3Rpb24gd2UnbGwgaGF2ZSB0byByZW1vdmUgYWxsIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXNcblx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdG9FZGl0UHJvbWlzZSA9IGRyYWZ0LmNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KG9Db250ZXh0LCB0aGlzLl9nZXRBcHBDb21wb25lbnQoKSwge1xuXHRcdFx0XHRiUHJlc2VydmVDaGFuZ2VzOiB0cnVlLFxuXHRcdFx0XHRiUHJlcGFyZU9uRWRpdDogYlByZXBhcmVPbkVkaXQsXG5cdFx0XHRcdG9WaWV3OiBvVmlld1xuXHRcdFx0fSBhcyBhbnkpO1xuXHRcdH0gZWxzZSBpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRvRWRpdFByb21pc2UgPSBzdGlja3kuZWRpdERvY3VtZW50SW5TdGlja3lTZXNzaW9uKG9Db250ZXh0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRWRpdCBpcyBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKSk7XG5cdFx0fVxuXHRcdHJldHVybiBvRWRpdFByb21pc2Vcblx0XHRcdC50aGVuKGZ1bmN0aW9uKG9OZXdDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0dGhhdC5fYkNyZWF0ZU1vZGUgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKCkudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gb05ld0NvbnRleHQ7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbihlcnI6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCkudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIENhbmNlbCAnZWRpdCcgbW9kZSBvZiBhIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBjYW5jZWxlZCBvciBkZWxldGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbbUluUGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHtzYXAubS5CdXR0b259IG1JblBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uIENhbmNlbCBCdXR0b24gb2YgdGhlIGRpc2NhcmQgcG9wb3ZlciAobWFuZGF0b3J5IGZvciBub3cpXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbUluUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgT3B0aW9uYWwsIHN1cHJlc3NlcyB0aGUgZGlzY2FyZCBwb3BvdmVyIGluY2FzZSBvZiBkcmFmdCBhcHBsaWNhdGlvbnMgd2hpbGUgbmF2aWdhdGluZyBvdXQgb2YgT1Bcblx0ICogQHBhcmFtIG9SZXNvdXJjZUJ1bmRsZVxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgd2l0aCA/Pz9cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0Y2FuY2VsRG9jdW1lbnQoXG5cdFx0b0NvbnRleHQ6IGFueSxcblx0XHRtSW5QYXJhbWV0ZXJzOiB7IGNhbmNlbEJ1dHRvbjogYW55OyBza2lwRGlzY2FyZFBvcG92ZXI6IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCxcblx0XHRvUmVzb3VyY2VCdW5kbGU6IGFueSxcblx0XHRtZXNzYWdlSGFuZGxlcjogYW55XG5cdCkge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdGxldCBzUHJvZ3JhbW1pbmdNb2RlbDogUHJvZ3JhbW1pbmdNb2RlbFR5cGU7XG5cdFx0Ly9jb250ZXh0IG11c3QgYWx3YXlzIGJlIHBhc3NlZCAtIG1hbmRhdG9yeSBwYXJhbWV0ZXJcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJObyBjb250ZXh0IGV4aXN0cy4gUGFzcyBhIG1lYW5pbmdmdWwgY29udGV4dFwiKTtcblx0XHR9XG5cdFx0QnVzeUxvY2tlci5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtSW5QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBvUGFyYW1zQ29udGV4dCA9IG9Db250ZXh0LFxuXHRcdFx0b0NhbmNlbEJ1dHRvbiA9IG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbixcblx0XHRcdG9Nb2RlbCA9IG9QYXJhbXNDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0bGV0IG9uQmVmb3JlQ2FuY2VsUHJvbWlzZSwgc0Nhbm9uaWNhbFBhdGg6IHN0cmluZztcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkpXG5cdFx0XHQudGhlbihmdW5jdGlvbihzUE1vZGVsOiBhbnkpIHtcblx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwgPSBzUE1vZGVsO1xuXHRcdFx0XHRpZiAoc1BNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRcdGNvbnN0IGRyYWZ0RGF0YUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQob1BhcmFtc0NvbnRleHQuZ2V0UGF0aCgpICsgXCIvRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIikuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0aWYgKCF0aGF0Ll9iSXNNb2RpZmllZCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGRyYWZ0RGF0YUNvbnRleHQucmVxdWVzdE9iamVjdCgpLnRoZW4oZnVuY3Rpb24oZHJhZnRBZG1pbkRhdGE6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGF0Ll9iSXNNb2RpZmllZCA9ICEoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoYXQuX3Nob3dEaXNjYXJkUG9wb3ZlcihvQ2FuY2VsQnV0dG9uLCB0aGF0Ll9iSXNNb2RpZmllZCwgb1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmJlZm9yZUNhbmNlbENhbGxCYWNrKSB7XG5cdFx0XHRcdFx0b25CZWZvcmVDYW5jZWxQcm9taXNlID0gbVBhcmFtZXRlcnMuYmVmb3JlQ2FuY2VsQ2FsbEJhY2soeyBjb250ZXh0OiBvQ29udGV4dCB9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvbkJlZm9yZUNhbmNlbFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gb25CZWZvcmVDYW5jZWxQcm9taXNlO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVmYXVsdC1jYXNlXG5cdFx0XHRcdHN3aXRjaCAoc1Byb2dyYW1taW5nTW9kZWwpIHtcblx0XHRcdFx0XHRjYXNlIFByb2dyYW1taW5nTW9kZWwuRHJhZnQ6XG5cdFx0XHRcdFx0XHRyZXR1cm4gb1BhcmFtc0NvbnRleHQucmVxdWVzdE9iamVjdChcIkhhc0FjdGl2ZUVudGl0eVwiKS50aGVuKGZ1bmN0aW9uKGJIYXNBY3RpdmVFbnRpdHk6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRsZXQgb0RlbGV0ZVByb21pc2U7XG5cdFx0XHRcdFx0XHRcdGlmICghYkhhc0FjdGl2ZUVudGl0eSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChvUGFyYW1zQ29udGV4dCAmJiBvUGFyYW1zQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvUGFyYW1zQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdG9EZWxldGVQcm9taXNlID0gZHJhZnQuZGVsZXRlRHJhZnQob1BhcmFtc0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRGVsZXRlUHJvbWlzZTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRsZXQgb0FjdGl2ZUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQob1BhcmFtc0NvbnRleHQuZ2V0UGF0aCgpICsgXCIvU2libGluZ0VudGl0eVwiKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0FjdGl2ZUNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpXG5cdFx0XHRcdFx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24oc1BhdGg6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNDYW5vbmljYWxQYXRoID0gc1BhdGg7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9QYXJhbXNDb250ZXh0ICYmIG9QYXJhbXNDb250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9QYXJhbXNDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZVByb21pc2UgPSBkcmFmdC5kZWxldGVEcmFmdChvUGFyYW1zQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9EZWxldGVQcm9taXNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkcmFmdC5kZWxldGVEcmFmdChvUGFyYW1zQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9vUGFyYW1zQ29udGV4dC5kZWxldGUoKSBpbiB0aGUgcHJldmlvdXMgcHJvbWlzZSBkb2VzbnQgcmV0dXJuIGFueXRoaW5nIHVwb24gc3VjY2Vzcy5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFzQ2Fub25pY2FsUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob0FjdGl2ZUNvbnRleHQuZ2V0UGF0aCgpICE9PSBzQ2Fub25pY2FsUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHRoZSBhY3RpdmUgY29udGV4dCBpcyB1c2luZyB0aGUgc2libGluZyBlbnRpdHkgLSB0aGlzIHBhdGggaXMgbm90IGFjY2Vzc2libGUgYW55bW9yZSBhcyB3ZSBkZWxldGVkIHRoZSBkcmFmdFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGRvY3VtZW50IC0gdGhlcmVmb3JlIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGNvbnRleHQgd2l0aCB0aGUgY2Fub25pY2FsIHBhdGhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvQWN0aXZlQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChzQ2Fub25pY2FsUGF0aCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9BY3RpdmVDb250ZXh0O1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGNhc2UgUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3k6XG5cdFx0XHRcdFx0XHRyZXR1cm4gc3RpY2t5LmRpc2NhcmREb2N1bWVudChvQ29udGV4dCkudGhlbihmdW5jdGlvbihvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChvQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlmICghdGhhdC5fYkNyZWF0ZU1vZGUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0LnJlZnJlc2goKTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvQ29udGV4dDtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkNhbmNlbCBkb2N1bWVudCBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uKGNvbnRleHQ6IGFueSkge1xuXHRcdFx0XHR0aGF0Ll9iSXNNb2RpZmllZCA9IGZhbHNlO1xuXHRcdFx0XHQvLyByZW1vdmUgZXhpc3RpbmcgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlc1xuXHRcdFx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0Ly8gc2hvdyB1bmJvdW5kIG1lc3NhZ2VzXG5cdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBjb250ZXh0O1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24oZXJyOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBTYXZlcyB0aGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIHNhdmVkXG5cdCAqIEBwYXJhbSBvUmVzb3VyY2VCdW5kbGVcblx0ICogQHBhcmFtIGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yXG5cdCAqIEBwYXJhbSBhQmluZGluZ3Ncblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIHdpdGggPz8/XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdHNhdmVEb2N1bWVudChvQ29udGV4dDogYW55LCBvUmVzb3VyY2VCdW5kbGU6IGFueSwgYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3I6IGFueSwgYUJpbmRpbmdzOiBhbnksIG1lc3NhZ2VIYW5kbGVyOiBhbnkpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0bGV0IG9TYXZlUHJvbWlzZTtcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQmluZGluZyBjb250ZXh0IHRvIGRyYWZ0IGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpKTtcblx0XHR9XG5cdFx0Ly8gaW4gY2FzZSBvZiBzYXZpbmcgLyBhY3RpdmF0aW5nIHRoZSBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzIHNoYWxsIGJlIHJlbW92ZWQgYmVmb3JlIHRoZSBQQVRDSC9QT1NUXG5cdFx0Ly8gaXMgc2VudCB0byB0aGUgYmFja2VuZFxuXHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdG9TYXZlUHJvbWlzZSA9IGRyYWZ0LmFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQsIHRoaXMuX2dldEFwcENvbXBvbmVudCgpLCB7fSk7XG5cdFx0fSBlbHNlIGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdG9TYXZlUHJvbWlzZSA9IHN0aWNreS5hY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiU2F2ZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKSk7XG5cdFx0fVxuXHRcdHJldHVybiBvU2F2ZVByb21pc2Vcblx0XHRcdC50aGVuKGZ1bmN0aW9uKG9BY3RpdmVEb2N1bWVudDogYW55KSB7XG5cdFx0XHRcdGNvbnN0IGJOZXdPYmplY3QgPVxuXHRcdFx0XHRcdHRoYXQuc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5ID8gdGhhdC5fYkNyZWF0ZU1vZGUgOiAhb0NvbnRleHQuZ2V0T2JqZWN0KCkuSGFzQWN0aXZlRW50aXR5O1xuXHRcdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhcblx0XHRcdFx0XHRiTmV3T2JqZWN0XG5cdFx0XHRcdFx0XHQ/IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX0NSRUFURURcIiwgb1Jlc291cmNlQnVuZGxlKVxuXHRcdFx0XHRcdFx0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9TQVZFRFwiLCBvUmVzb3VyY2VCdW5kbGUpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHRoYXQuX2JJc01vZGlmaWVkID0gZmFsc2U7XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudDtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKGVycjogYW55KSB7XG5cdFx0XHRcdGlmIChhQmluZGluZ3MgJiYgYUJpbmRpbmdzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHQvKiBUaGUgc2lkZUVmZmVjdHMgYXJlIGV4ZWN1dGVkIG9ubHkgZm9yIHRhYmxlIGl0ZW1zIGluIHRyYW5zaWVudCBzdGF0ZSAqL1xuXHRcdFx0XHRcdGFCaW5kaW5ncy5mb3JFYWNoKGZ1bmN0aW9uKG9MaXN0QmluZGluZzogYW55KSB7XG5cdFx0XHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQob0xpc3RCaW5kaW5nKSAmJiBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcikge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhhdC5fZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KG9MaXN0QmluZGluZy5nZXRQYXRoKCksIG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCkudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIENhbGxzIGEgYm91bmQgb3IgdW5ib3VuZCBhY3Rpb24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAc3RhdGljXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyLmNhbGxBY3Rpb25cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuXHQgKiBAcGFyYW0ge21hcH0gW21QYXJhbWV0ZXJzXSBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IFttUGFyYW1ldGVycy5jb250ZXh0c10gTWFuZGF0b3J5IGZvciBhIGJvdW5kIGFjdGlvbjogRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWx9IFttUGFyYW1ldGVycy5tb2RlbF0gTWFuZGF0b3J5IGZvciBhbiB1bmJvdW5kIGFjdGlvbjogQW4gaW5zdGFuY2Ugb2YgYW4gT0RhdGEgVjQgbW9kZWxcblx0ICogQHBhcmFtIHtzdHJpbmd9IFttUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmddIE1vZGUgaG93IGFjdGlvbnMgYXJlIHRvIGJlIGNhbGxlZDogJ0NoYW5nZVNldCcgdG8gcHV0IGFsbCBhY3Rpb24gY2FsbHMgaW50byBvbmUgY2hhbmdlc2V0LCAnSXNvbGF0ZWQnIHRvIHB1dCB0aGVtIGludG8gc2VwYXJhdGUgY2hhbmdlc2V0c1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gW21QYXJhbWV0ZXJzLmxhYmVsXSBBIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHRdIElmIHNwZWNpZmllZCwgdGhlIGFjdGlvbiBwcm9taXNlIHJldHVybnMgdGhlIGJvdW5kIGNvbnRleHRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9WaWV3IENvbnRhaW5zIHRoZSBvYmplY3Qgb2YgdGhlIGN1cnJlbnQgdmlld1xuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiByZXNwb25zZSBvYmplY3RzIChUT0RPOiB0byBiZSBjaGFuZ2VkKVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqKi9cblx0Y2FsbEFjdGlvbihzQWN0aW9uTmFtZTogc3RyaW5nLCBtUGFyYW1ldGVyczogYW55LCBvVmlldzogVmlldyB8IG51bGwsIG1lc3NhZ2VIYW5kbGVyOiBhbnkpIHtcblx0XHRtUGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMobVBhcmFtZXRlcnMpO1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdGxldCBvQ29udGV4dCwgb01vZGVsOiBhbnksIG9Qcm9taXNlO1xuXHRcdGNvbnN0IG1CaW5kaW5nUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLmJpbmRpbmdQYXJhbWV0ZXJzO1xuXHRcdGlmICghc0FjdGlvbk5hbWUpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIlByb3ZpZGUgbmFtZSBvZiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWRcIik7XG5cdFx0fVxuXHRcdC8vIGFjdGlvbiBpbXBvcnRzIGFyZSBub3QgZGlyZWN0bHkgb2J0YWluZWQgZnJvbSB0aGUgbWV0YU1vZGVsIGJ5IGl0IGlzIHByZXNlbnQgaW5zaWRlIHRoZSBlbnRpdHlDb250YWluZXJcblx0XHQvLyBhbmQgdGhlIGFjaW9ucyBpdCByZWZlcnMgdG8gcHJlc2VudCBvdXRzaWRlIHRoZSBlbnRpdHljb250YWluZXIsIGhlbmNlIHRvIG9idGFpbiBraW5kIG9mIHRoZSBhY3Rpb25cblx0XHQvLyBzcGxpdCgpIG9uIGl0cyBuYW1lIHdhcyByZXF1aXJlZFxuXHRcdGNvbnN0IHNOYW1lID0gc0FjdGlvbk5hbWUuc3BsaXQoXCIvXCIpWzFdO1xuXHRcdHNBY3Rpb25OYW1lID0gc05hbWUgfHwgc0FjdGlvbk5hbWU7XG5cdFx0b0NvbnRleHQgPSBzTmFtZSA/IHVuZGVmaW5lZCA6IG1QYXJhbWV0ZXJzLmNvbnRleHRzO1xuXHRcdC8vY2hlY2tpbmcgd2hldGhlciB0aGUgY29udGV4dCBpcyBhbiBhcnJheSB3aXRoIG1vcmUgdGhhbiAwIGxlbmd0aCBvciBub3QgYW4gYXJyYXkoY3JlYXRlIGFjdGlvbilcblx0XHRpZiAob0NvbnRleHQgJiYgKChBcnJheS5pc0FycmF5KG9Db250ZXh0KSAmJiBvQ29udGV4dC5sZW5ndGgpIHx8ICFBcnJheS5pc0FycmF5KG9Db250ZXh0KSkpIHtcblx0XHRcdG9Db250ZXh0ID0gQXJyYXkuaXNBcnJheShvQ29udGV4dCkgPyBvQ29udGV4dFswXSA6IG9Db250ZXh0O1xuXHRcdFx0b01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHR9XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLm1vZGVsKSB7XG5cdFx0XHRvTW9kZWwgPSBtUGFyYW1ldGVycy5tb2RlbDtcblx0XHR9XG5cdFx0aWYgKCFvTW9kZWwpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIlBhc3MgYSBjb250ZXh0IGZvciBhIGJvdW5kIGFjdGlvbiBvciBwYXNzIHRoZSBtb2RlbCBmb3IgYW4gdW5ib3VuZCBhY3Rpb25cIik7XG5cdFx0fVxuXHRcdC8vIGdldCB0aGUgYmluZGluZyBwYXJhbWV0ZXJzICRzZWxlY3QgYW5kICRleHBhbmQgZm9yIHRoZSBzaWRlIGVmZmVjdCBvbiB0aGlzIGFjdGlvblxuXHRcdC8vIGFsc28gZ2F0aGVyIGFkZGl0aW9uYWwgcHJvcGVydHkgcGF0aHMgdG8gYmUgcmVxdWVzdGVkIHN1Y2ggYXMgdGV4dCBhc3NvY2lhdGlvbnNcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhhdC5fZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Y29uc3QgbVNpZGVFZmZlY3RzUGFyYW1ldGVycyA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkuZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhzQWN0aW9uTmFtZSwgb0NvbnRleHQpIHx8IHt9O1xuXHRcdGlmIChvQ29udGV4dCAmJiBvTW9kZWwpIHtcblx0XHRcdG9Qcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0XHRcdGxldCBvQXBwbGljYWJsZUNvbnRleHREaWFsb2c6IERpYWxvZztcblx0XHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSB7XG5cdFx0XHRcdFx0b25DbG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHQvLyBVc2VyIGNhbmNlbHMgYWN0aW9uXG5cdFx0XHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9uQ29udGludWU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0Ly8gVXNlcnMgY29udGludWVzIHRoZSBhY3Rpb24gd2l0aCB0aGUgYm91bmQgY29udGV4dHNcblx0XHRcdFx0XHRcdG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShtUGFyYW1ldGVycy5hcHBsaWNhYmxlQ29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb25zdCBmbk9wZW5BbmRGaWxsRGlhbG9nID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0bGV0IG9EaWFsb2dDb250ZW50O1xuXHRcdFx0XHRcdGNvbnN0IG5Ob3RBcHBsaWNhYmxlID0gbVBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHQubGVuZ3RoLFxuXHRcdFx0XHRcdFx0YU5vdEFwcGxpY2FibGVJdGVtcyA9IFtdO1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbVBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHQubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdG9EaWFsb2dDb250ZW50ID0gbVBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRbaV0uZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRhTm90QXBwbGljYWJsZUl0ZW1zLnB1c2gob0RpYWxvZ0NvbnRlbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBvTm90QXBwbGljYWJsZUl0ZW1zTW9kZWwgPSBuZXcgSlNPTk1vZGVsKGFOb3RBcHBsaWNhYmxlSXRlbXMpO1xuXHRcdFx0XHRcdGNvbnN0IG9Ub3RhbHMgPSBuZXcgSlNPTk1vZGVsKHsgdG90YWw6IG5Ob3RBcHBsaWNhYmxlLCBsYWJlbDogbVBhcmFtZXRlcnMubGFiZWwgfSk7XG5cdFx0XHRcdFx0b0FwcGxpY2FibGVDb250ZXh0RGlhbG9nLnNldE1vZGVsKG9Ob3RBcHBsaWNhYmxlSXRlbXNNb2RlbCwgXCJub3RBcHBsaWNhYmxlXCIpO1xuXHRcdFx0XHRcdG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZy5zZXRNb2RlbChvVG90YWxzLCBcInRvdGFsc1wiKTtcblx0XHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cub3BlbigpO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHQgJiYgbVBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHQubGVuZ3RoID49IDEpIHtcblx0XHRcdFx0XHQvLyBTaG93IHRoZSBjb250ZXh0cyB0aGF0IGFyZSBub3QgYXBwbGljYWJsZSBhbmQgd2lsbCBub3QgdGhlcmVmb3JlIGJlIHByb2Nlc3NlZFxuXHRcdFx0XHRcdGNvbnN0IHNGcmFnbWVudE5hbWUgPSBcInNhcC5mZS5jb3JlLmNvbnRyb2xzLkFjdGlvblBhcnRpYWxcIjtcblx0XHRcdFx0XHRjb25zdCBvRGlhbG9nRnJhZ21lbnQgPSBYTUxUZW1wbGF0ZVByb2Nlc3Nvci5sb2FkVGVtcGxhdGUoc0ZyYWdtZW50TmFtZSwgXCJmcmFnbWVudFwiKTtcblx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdGNvbnN0IHNDYW5vbmljYWxQYXRoID0gbVBhcmFtZXRlcnMuY29udGV4dHNbMF0uZ2V0Q2Fub25pY2FsUGF0aCgpO1xuXHRcdFx0XHRcdGNvbnN0IHNFbnRpdHlTZXQgPSBzQ2Fub25pY2FsUGF0aC5zdWJzdHIoMCwgc0Nhbm9uaWNhbFBhdGguaW5kZXhPZihcIihcIikpICsgXCIvXCI7XG5cdFx0XHRcdFx0Y29uc3Qgb0RpYWxvZ0xhYmVsTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHtcblx0XHRcdFx0XHRcdHRpdGxlOiBtUGFyYW1ldGVycy5sYWJlbFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFByb21pc2UucmVzb2x2ZShcblx0XHRcdFx0XHRcdFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKFxuXHRcdFx0XHRcdFx0XHRvRGlhbG9nRnJhZ21lbnQsXG5cdFx0XHRcdFx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRlbnRpdHlUeXBlOiBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNFbnRpdHlTZXQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IG9EaWFsb2dMYWJlbE1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKVxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRlbnRpdHlUeXBlOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IG9EaWFsb2dMYWJlbE1vZGVsXG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24ob0ZyYWdtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIEZyYWdtZW50LmxvYWQoeyBkZWZpbml0aW9uOiBvRnJhZ21lbnQsIGNvbnRyb2xsZXI6IG9Db250cm9sbGVyIH0pO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKG9Qb3BvdmVyOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0b0FwcGxpY2FibGVDb250ZXh0RGlhbG9nID0gb1BvcG92ZXI7XG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wuYWRkRGVwZW5kZW50KG9Qb3BvdmVyKTtcblx0XHRcdFx0XHRcdFx0Zm5PcGVuQW5kRmlsbERpYWxvZygpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5jYXRjaChyZWplY3QpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlc29sdmUobVBhcmFtZXRlcnMuY29udGV4dHMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KS50aGVuKGZ1bmN0aW9uKGNvbnRleHRUb1Byb2Nlc3M6IGFueSkge1xuXHRcdFx0XHRpZiAoY29udGV4dFRvUHJvY2Vzcykge1xuXHRcdFx0XHRcdHJldHVybiBvcGVyYXRpb25zLmNhbGxCb3VuZEFjdGlvbihzQWN0aW9uTmFtZSwgY29udGV4dFRvUHJvY2Vzcywgb01vZGVsLCBvQXBwQ29tcG9uZW50LCB7XG5cdFx0XHRcdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc6IG1QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyxcblx0XHRcdFx0XHRcdGxhYmVsOiBtUGFyYW1ldGVycy5sYWJlbCxcblx0XHRcdFx0XHRcdHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c6IHRydWUsXG5cdFx0XHRcdFx0XHRtQmluZGluZ1BhcmFtZXRlcnM6IG1CaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdGVudGl0eVNldE5hbWU6IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUsXG5cdFx0XHRcdFx0XHRhZGRpdGlvbmFsU2lkZUVmZmVjdDogbVNpZGVFZmZlY3RzUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdG9uU3VibWl0dGVkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRvblJlc3BvbnNlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0cGFyZW50Q29udHJvbDogbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCxcblx0XHRcdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0OiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogbVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwLFxuXHRcdFx0XHRcdFx0YklzQ3JlYXRlQWN0aW9uOiBtUGFyYW1ldGVycy5iSXNDcmVhdGVBY3Rpb24sXG5cdFx0XHRcdFx0XHRiR2V0Qm91bmRDb250ZXh0OiBtUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0LFxuXHRcdFx0XHRcdFx0Yk9iamVjdFBhZ2U6IG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlLFxuXHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXI6IG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOiBtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb25cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRPRE86IGNvbmZpcm0gaWYgYWN0aW9uIGltcG9ydCBuZWVkcyBzaWRlIGVmZmVjdHMuXG5cdFx0XHRvUHJvbWlzZSA9IG9wZXJhdGlvbnMuY2FsbEFjdGlvbkltcG9ydChzQWN0aW9uTmFtZSwgb01vZGVsLCBvQXBwQ29tcG9uZW50LCB7XG5cdFx0XHRcdGxhYmVsOiBtUGFyYW1ldGVycy5sYWJlbCxcblx0XHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZzogdHJ1ZSxcblx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IG1CaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0ZW50aXR5U2V0TmFtZTogbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSxcblx0XHRcdFx0b25TdWJtaXR0ZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdEJ1c3lMb2NrZXIubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0b25SZXNwb25zZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHBhcmVudENvbnRyb2w6IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0OiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXAsXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0Yk9iamVjdFBhZ2U6IG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIG9Qcm9taXNlXG5cdFx0XHQudGhlbihmdW5jdGlvbihvUmVzdWx0OiBhbnkpIHtcblx0XHRcdFx0Ly8gU3VjY2VlZGVkXG5cdFx0XHRcdHJldHVybiB0aGF0Ll9oYW5kbGVBY3Rpb25SZXNwb25zZShtZXNzYWdlSGFuZGxlciwgbVBhcmFtZXRlcnMsIHNBY3Rpb25OYW1lKS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBvUmVzdWx0O1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24oZXJyOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIHRoYXQuX2hhbmRsZUFjdGlvblJlc3BvbnNlKG1lc3NhZ2VIYW5kbGVyLCBtUGFyYW1ldGVycywgc0FjdGlvbk5hbWUpLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIEhhbmRsZXMgbWVzc2FnZXMgZm9yIGFjdGlvbiBjYWxsLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIjX2hhbmRsZUFjdGlvblJlc3BvbnNlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIFBhcmFtZXRlcnMgdG8gYmUgY29uc2lkZXJlZCBmb3IgdGhlIGFjdGlvbi5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIGFmdGVyIG1lc3NhZ2UgZGlhbG9nIGlzIG9wZW5lZCBpZiByZXF1aXJlZC5cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2hhbmRsZUFjdGlvblJlc3BvbnNlKG1lc3NhZ2VIYW5kbGVyOiBhbnksIG1QYXJhbWV0ZXJzOiBhbnksIHNBY3Rpb25OYW1lOiBzdHJpbmcpIHtcblx0XHRjb25zdCBhVHJhbnNpZW50TWVzc2FnZXMgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXModHJ1ZSwgdHJ1ZSk7XG5cdFx0aWYgKGFUcmFuc2llbnRNZXNzYWdlcy5sZW5ndGggPiAwICYmIG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNBY3Rpb25OYW1lXCIsIG1QYXJhbWV0ZXJzLmxhYmVsID8gbVBhcmFtZXRlcnMubGFiZWwgOiBzQWN0aW9uTmFtZSk7XG5cdFx0fVxuXHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKTtcblx0fVxuXHQvKipcblx0ICogSGFuZGxlcyB2YWxpZGF0aW9uIGVycm9ycyBmb3IgdGhlICdkaXNjYXJkJyBhY3Rpb24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlciNoYW5kbGVWYWxpZGF0aW9uRXJyb3Jcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0aGFuZGxlVmFsaWRhdGlvbkVycm9yKCkge1xuXHRcdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IChzYXAudWkuZ2V0Q29yZSgpIGFzIGFueSkuZ2V0TWVzc2FnZU1hbmFnZXIoKSxcblx0XHRcdGVycm9yVG9SZW1vdmUgPSBvTWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbihlcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0Ly8gb25seSBuZWVkcyB0byBoYW5kbGUgdmFsaWRhdGlvbiBtZXNzYWdlcywgdGVjaG5pY2FsIGFuZCBwZXJzaXN0ZW50IGVycm9ycyBuZWVkcyBub3QgdG8gYmUgY2hlY2tlZCBoZXJlLlxuXHRcdFx0XHRcdGlmIChlcnJvci52YWxpZGF0aW9uKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRvTWVzc2FnZU1hbmFnZXIucmVtb3ZlTWVzc2FnZXMoZXJyb3JUb1JlbW92ZSk7XG5cdH1cblx0LyoqXG5cdCAqIFNob3dzIGEgcG9wb3ZlciBpZiBpdCBuZWVkcyB0byBiZSBzaG93bi5cblx0ICogVE9ETzogUG9wb3ZlciBpcyBzaG93biBpZiB1c2VyIGhhcyBtb2RpZmllZCBhbnkgZGF0YS5cblx0ICogVE9ETzogUG9wb3ZlciBpcyBzaG93biBpZiB0aGVyZSdzIGEgZGlmZmVyZW5jZSBmcm9tIGRyYWZ0IGFkbWluIGRhdGEuXG5cdCAqIEBzdGF0aWNcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIuX3Nob3dEaXNjYXJkUG9wb3ZlclxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHBhcmFtIHtzYXAudWkuY29yZS5Db250cm9sfSBvQ2FuY2VsQnV0dG9uIFRoZSBjb250cm9sIHdoaWNoIHdpbGwgb3BlbiB0aGUgcG9wb3ZlclxuXHQgKiBAcGFyYW0gYklzTW9kaWZpZWRcblx0ICogQHBhcmFtIG9SZXNvdXJjZUJ1bmRsZVxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBpZiB1c2VyIGNvbmZpcm1zIGRpc2NhcmQsIHJlamVjdHMgaWYgb3RoZXJ3aXNlLCByZWplY3RzIGlmIG5vIGNvbnRyb2wgcGFzc2VkIHRvIG9wZW4gcG9wb3ZlclxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfc2hvd0Rpc2NhcmRQb3BvdmVyKG9DYW5jZWxCdXR0b246IGFueSwgYklzTW9kaWZpZWQ6IGFueSwgb1Jlc291cmNlQnVuZGxlOiBhbnkpIHtcblx0XHQvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcyBwb3BvdmVyIGFzIGEgZnJhZ21lbnQgYXMgaW4gdjI/P1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdHRoYXQuX2JDb250aW51ZURpc2NhcmQgPSBmYWxzZTtcblx0XHQvLyB0byBiZSBpbXBsZW1lbnRlZFxuXHRcdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdGlmICghb0NhbmNlbEJ1dHRvbikge1xuXHRcdFx0XHRyZWplY3QoXCJDYW5jZWwgYnV0dG9uIG5vdCBmb3VuZFwiKTtcblx0XHRcdH1cblx0XHRcdC8vU2hvdyBwb3BvdmVyIG9ubHkgd2hlbiBkYXRhIGlzIGNoYW5nZWQuXG5cdFx0XHRpZiAoYklzTW9kaWZpZWQpIHtcblx0XHRcdFx0Y29uc3QgZm5PbkFmdGVyRGlzY2FyZCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdG9DYW5jZWxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTtcblx0XHRcdFx0XHRpZiAodGhhdC5fYkNvbnRpbnVlRGlzY2FyZCkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZWplY3QoXCJEaXNjYXJkIG9wZXJhdGlvbiB3YXMgcmVqZWN0ZWQuIERvY3VtZW50IGhhcyBub3QgYmVlbiBkaXNjYXJkZWRcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoYXQuX29Qb3BvdmVyLmRldGFjaEFmdGVyQ2xvc2UoZm5PbkFmdGVyRGlzY2FyZCk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdGlmICghdGhhdC5fb1BvcG92ZXIpIHtcblx0XHRcdFx0XHRjb25zdCBvVGV4dCA9IG5ldyBUZXh0KHtcblx0XHRcdFx0XHRcdFx0Ly9UaGlzIHRleHQgaXMgdGhlIHNhbWUgYXMgTFIgdjIuXG5cdFx0XHRcdFx0XHRcdC8vVE9ETzogRGlzcGxheSBtZXNzYWdlIHByb3ZpZGVkIGJ5IGFwcCBkZXZlbG9wZXI/Pz9cblx0XHRcdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9EUkFGVF9ESVNDQVJEX01FU1NBR0VcIiwgb1Jlc291cmNlQnVuZGxlKVxuXHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRvQnV0dG9uID0gbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRFJBRlRfRElTQ0FSRF9CVVRUT05cIiwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdFx0XHRcdFx0d2lkdGg6IFwiMTAwJVwiLFxuXHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhhdC5oYW5kbGVWYWxpZGF0aW9uRXJyb3IoKTtcblx0XHRcdFx0XHRcdFx0XHR0aGF0Ll9iQ29udGludWVEaXNjYXJkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR0aGF0Ll9vUG9wb3Zlci5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRhcmlhTGFiZWxsZWRCeTogb1RleHRcblx0XHRcdFx0XHRcdH0gYXMgYW55KTtcblx0XHRcdFx0XHR0aGF0Ll9vUG9wb3ZlciA9IG5ldyBQb3BvdmVyKHtcblx0XHRcdFx0XHRcdHNob3dIZWFkZXI6IGZhbHNlLFxuXHRcdFx0XHRcdFx0cGxhY2VtZW50OiBcIlRvcFwiLFxuXHRcdFx0XHRcdFx0Y29udGVudDogW1xuXHRcdFx0XHRcdFx0XHRuZXcgVkJveCh7XG5cdFx0XHRcdFx0XHRcdFx0aXRlbXM6IFtvVGV4dCwgb0J1dHRvbl1cblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHRiZWZvcmVPcGVuOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0Ly8gbWFrZSBzdXJlIHRvIE5PVCB0cmlnZ2VyIG11bHRpcGxlIGNhbmNlbCBmbG93c1xuXHRcdFx0XHRcdFx0XHRvQ2FuY2VsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO1xuXHRcdFx0XHRcdFx0XHR0aGF0Ll9vUG9wb3Zlci5zZXRJbml0aWFsRm9jdXMob0J1dHRvbik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0dGhhdC5fb1BvcG92ZXIuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhhdC5fb1BvcG92ZXIuYXR0YWNoQWZ0ZXJDbG9zZShmbk9uQWZ0ZXJEaXNjYXJkKTtcblx0XHRcdFx0dGhhdC5fb1BvcG92ZXIub3BlbkJ5KG9DYW5jZWxCdXR0b24sIGZhbHNlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoYXQuaGFuZGxlVmFsaWRhdGlvbkVycm9yKCk7XG5cdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogU2V0cyB0aGUgZG9jdW1lbnQgdG8gbW9kaWZpZWQgc3RhdGUgb24gcGF0Y2ggZXZlbnQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAc3RhdGljXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyLmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9uc1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0aGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zKCkge1xuXHRcdHRoaXMuX2JJc01vZGlmaWVkID0gdHJ1ZTtcblx0fVxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBvd25lciBjb21wb25lbnQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAc3RhdGljXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyLl9nZXRPd25lckNvbXBvbmVudFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHJldHVybnMge3NhcC5mZS5jb3JlLkFwcENvbXBvbmVudH0gVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKiovXG5cdF9nZXRBcHBDb21wb25lbnQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX29BcHBDb21wb25lbnQ7XG5cdH1cblx0X2xhdW5jaERpYWxvZ1dpdGhLZXlGaWVsZHMoXG5cdFx0b0xpc3RCaW5kaW5nOiBhbnksXG5cdFx0b1RyYW5zaWVudExpc3RCaW5kaW5nOiBhbnksXG5cdFx0b1RyYW5zaWVudENvbnRleHQ6IGFueSxcblx0XHRtRmllbGRzOiBhbnksXG5cdFx0b01vZGVsOiBhbnksXG5cdFx0bVBhcmFtZXRlcnM6IGFueSxcblx0XHRtZXNzYWdlSGFuZGxlcjogYW55XG5cdCkge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdGxldCBvRGlhbG9nOiBEaWFsb2c7XG5cdFx0Y29uc3Qgb1BhcmVudENvbnRyb2wgPSBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0YlN1Y2Nlc3MgPSBmYWxzZTtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IFwic2FwL2ZlL2NvcmUvY29udHJvbHMvTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzRGlhbG9nXCI7XG5cdFx0XHRjb25zdCBvRnJhZ21lbnQgPSBYTUxUZW1wbGF0ZVByb2Nlc3Nvci5sb2FkVGVtcGxhdGUoc0ZyYWdtZW50TmFtZSwgXCJmcmFnbWVudFwiKSxcblx0XHRcdFx0b1Jlc291cmNlQnVuZGxlID0gb1BhcmVudENvbnRyb2wuZ2V0Q29udHJvbGxlcigpLm9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0YUltbXV0YWJsZUZpZWxkczogYW55W10gPSBbXSxcblx0XHRcdFx0b0FwcENvbXBvbmVudCA9IHRoYXQuX2dldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHRzUGF0aCA9IG9MaXN0QmluZGluZy5pc1JlbGF0aXZlKCkgPyBvTGlzdEJpbmRpbmcuZ2V0UmVzb2x2ZWRQYXRoKCkgOiBvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRvRW50aXR5U2V0Q29udGV4dCA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc1BhdGgpLFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoKTtcblx0XHRcdGZvciAoY29uc3QgaSBpbiBtRmllbGRzKSB7XG5cdFx0XHRcdGFJbW11dGFibGVGaWVsZHMucHVzaChvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNNZXRhUGF0aCArIFwiL1wiICsgbUZpZWxkc1tpXSkpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgb0ltbXV0YWJsZUN0eE1vZGVsID0gbmV3IEpTT05Nb2RlbChhSW1tdXRhYmxlRmllbGRzKTtcblx0XHRcdGNvbnN0IG9JbW11dGFibGVDdHggPSBvSW1tdXRhYmxlQ3R4TW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcblx0XHRcdFx0WE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoXG5cdFx0XHRcdFx0b0ZyYWdtZW50LFxuXHRcdFx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IG9FbnRpdHlTZXRDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRmaWVsZHM6IG9JbW11dGFibGVDdHhcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBvRW50aXR5U2V0Q29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0XHRmaWVsZHM6IG9JbW11dGFibGVDdHguZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpXG5cdFx0XHQpLnRoZW4oZnVuY3Rpb24ob0ZyYWdtZW50OiBhbnkpIHtcblx0XHRcdFx0bGV0IGFGb3JtRWxlbWVudHM6IGFueVtdID0gW107XG5cdFx0XHRcdGNvbnN0IG1GaWVsZFZhbHVlTWFwOiBhbnkgPSB7fTtcblx0XHRcdFx0bGV0IG9DcmVhdGVCdXR0b246IEJ1dHRvbjtcblx0XHRcdFx0Y29uc3QgdmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0XHRhRm9ybUVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdC5tYXAoZnVuY3Rpb24ob0Zvcm1FbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0Zvcm1FbGVtZW50LmdldEZpZWxkcygpWzBdO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uKG9GaWVsZDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9GaWVsZC5nZXRSZXF1aXJlZCgpO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQubWFwKGZ1bmN0aW9uKG9GaWVsZDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc0ZpZWxkSWQgPSBvRmllbGQuZ2V0SWQoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc0ZpZWxkSWQgaW4gbUZpZWxkVmFsdWVNYXApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobUZpZWxkVmFsdWVNYXBbc0ZpZWxkSWRdKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbih2VmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB2VmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9GaWVsZC5nZXRWYWx1ZVN0YXRlKCkgPT09IFZhbHVlU3RhdGUuRXJyb3IgPyB1bmRlZmluZWQgOiBvRmllbGQuZ2V0VmFsdWUoKTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihhUmVzdWx0czogYW55W10pIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFSZXN1bHRzLmV2ZXJ5KGZ1bmN0aW9uKHZWYWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHZWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZWYWx1ZSAhPT0gbnVsbCAmJiB2VmFsdWUgIT09IFwiXCI7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKGJFbmFibGVkOiBib29sZWFuKSB7XG5cdFx0XHRcdFx0XHRcdG9DcmVhdGVCdXR0b24uc2V0RW5hYmxlZChiRW5hYmxlZCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSB7XG5cdFx0XHRcdFx0LypcbiAgICBcdFx0XHRcdFx0XHRcdFx0XHRmaXJlZCBvbiBmb2N1cyBvdXQgZnJvbSBmaWVsZCBvciBvbiBzZWxlY3RpbmcgYSB2YWx1ZSBmcm9tIHRoZSB2YWx1ZWhlbHAuXG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0dGhlIGNyZWF0ZSBidXR0b24gaXMgZW5hYmxlZCB3aGVuIGEgdmFsdWUgaXMgYWRkZWQuXG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0bGl2ZUNoYW5nZSBpcyBub3QgZmlyZWQgd2hlbiB2YWx1ZSBpcyBhZGRlZCBmcm9tIHZhbHVlaGVscC5cbiAgICBcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSB2YWxpZGF0aW9uIGlzIG5vdCBkb25lIGZvciBjcmVhdGUgYnV0dG9uIGVuYWJsZW1lbnQuXG4gICAgXHRcdFx0XHRcdFx0XHRcdCovXG5cdFx0XHRcdFx0aGFuZGxlQ2hhbmdlOiBmdW5jdGlvbihvRXZlbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBvRmllbGQgPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBzRmllbGRJZCA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJpZFwiKTtcblx0XHRcdFx0XHRcdGNvbnN0IG9GaWVsZFByb21pc2UgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicHJvbWlzZVwiKTtcblx0XHRcdFx0XHRcdGlmIChvRmllbGRQcm9taXNlKSB7XG5cdFx0XHRcdFx0XHRcdG1GaWVsZFZhbHVlTWFwW3NGaWVsZElkXSA9IG9GaWVsZFByb21pc2UudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0ZpZWxkLmdldFZhbHVlKCk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdC8qXG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0ZmlyZWQgb24ga2V5IHByZXNzLiB0aGUgY3JlYXRlIGJ1dHRvbiBpcyBlbmFibGVkIHdoZW4gYSB2YWx1ZSBpcyBhZGRlZC5cbiAgICBcdFx0XHRcdFx0XHRcdFx0XHRsaXZlQ2hhbmdlIGlzIG5vdCBmaXJlZCB3aGVuIHZhbHVlIGlzIGFkZGVkIGZyb20gdmFsdWVoZWxwLlxuICAgIFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlIHZhbGlkYXRpb24gaXMgbm90IGRvbmUgZm9yIGNyZWF0ZSBidXR0b24gZW5hYmxlbWVudC5cbiAgICBcdFx0XHRcdFx0XHRcdFx0Ki9cblx0XHRcdFx0XHRoYW5kbGVMaXZlQ2hhbmdlOiBmdW5jdGlvbihvRXZlbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0ZpZWxkSWQgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiaWRcIik7XG5cdFx0XHRcdFx0XHRjb25zdCB2VmFsdWUgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwidmFsdWVcIik7XG5cdFx0XHRcdFx0XHRtRmllbGRWYWx1ZU1hcFtzRmllbGRJZF0gPSB2VmFsdWU7XG5cdFx0XHRcdFx0XHR2YWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0cmV0dXJuIEZyYWdtZW50LmxvYWQoe1xuXHRcdFx0XHRcdGRlZmluaXRpb246IG9GcmFnbWVudCxcblx0XHRcdFx0XHRjb250cm9sbGVyOiBvQ29udHJvbGxlclxuXHRcdFx0XHR9KS50aGVuKGZ1bmN0aW9uKG9EaWFsb2dDb250ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRvRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdFx0XHR0aXRsZTogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9TQVBGRV9BQ1RJT05fQ1JFQVRFXCIsIG9SZXNvdXJjZUJ1bmRsZSksXG5cdFx0XHRcdFx0XHRjb250ZW50OiBbb0RpYWxvZ0NvbnRlbnRdLFxuXHRcdFx0XHRcdFx0YmVnaW5CdXR0b246IHtcblx0XHRcdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9TQVBGRV9BQ1RJT05fQ1JFQVRFX0JVVFRPTlwiLCBvUmVzb3VyY2VCdW5kbGUpLFxuXHRcdFx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0NyZWF0ZUJ1dHRvbiA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdFx0XHRcdFx0XHRvQ3JlYXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO1xuXHRcdFx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIubG9jayhvRGlhbG9nKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0XHRcdFx0XHRPYmplY3Qua2V5cyhtRmllbGRWYWx1ZU1hcCkubWFwKGZ1bmN0aW9uKHNLZXk6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbUZpZWxkVmFsdWVNYXBbc0tleV0udGhlbihmdW5jdGlvbihvVmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9EaWFsb2dWYWx1ZTogYW55ID0ge307XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZ1ZhbHVlW3NLZXldID0gb1ZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRGlhbG9nVmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihhVmFsdWVzOiBhbnlbXSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgb25CZWZvcmVDcmVhdGVQcm9taXNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2spIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvbkJlZm9yZUNyZWF0ZVByb21pc2UgPSBtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogb0xpc3RCaW5kaW5nICYmIG9MaXN0QmluZGluZy5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzOiBhVmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b25CZWZvcmVDcmVhdGVQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9uQmVmb3JlQ3JlYXRlUHJvbWlzZTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1Byb21pc2UgPSB0aGF0Lm9uQWZ0ZXJDcmVhdGVDb21wbGV0aW9uKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9UcmFuc2llbnRMaXN0QmluZGluZyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvVHJhbnNpZW50Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVyc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvTW9kZWwuc3VibWl0QmF0Y2goXCJzdWJtaXRMYXRlclwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Qcm9taXNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKG9SZXNwb25zZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0QmluZGluZ0NvbnRleHQobnVsbCBhcyBhbnkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUob1Jlc3BvbnNlKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24ob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9EaWFsb2cpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvQ3JlYXRlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0ZW5kQnV0dG9uOiB7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19DT01NT05fQUNUSU9OX1BBUkFNRVRFUl9ESUFMT0dfQ0FOQ0VMXCIsIG9SZXNvdXJjZUJ1bmRsZSksXG5cdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0Ly8gc2hvdyBmb290ZXIgYXMgcGVyIFVYIGd1aWRlbGluZXMgd2hlbiBkaWFsb2cgaXMgbm90IG9wZW5cblx0XHRcdFx0XHRcdFx0KG9EaWFsb2cuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCk/LnNldFByb3BlcnR5KFwiaXNDcmVhdGVEaWFsb2dPcGVuXCIsIGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdGlmICghYlN1Y2Nlc3MpIHtcblx0XHRcdFx0XHRcdFx0XHRyZWplY3Qoe1xuXHRcdFx0XHRcdFx0XHRcdFx0YkRlbGV0ZVRyYW5zaWVudENvbnRleHQ6IHRydWVcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gYXMgYW55KTtcblx0XHRcdFx0XHRhRm9ybUVsZW1lbnRzID0gb0RpYWxvZ0NvbnRlbnRcblx0XHRcdFx0XHRcdC5nZXRBZ2dyZWdhdGlvbihcImZvcm1cIilcblx0XHRcdFx0XHRcdC5nZXRBZ2dyZWdhdGlvbihcImZvcm1Db250YWluZXJzXCIpWzBdXG5cdFx0XHRcdFx0XHQuZ2V0QWdncmVnYXRpb24oXCJmb3JtRWxlbWVudHNcIik7XG5cdFx0XHRcdFx0aWYgKG9QYXJlbnRDb250cm9sICYmIG9QYXJlbnRDb250cm9sLmFkZERlcGVuZGVudCkge1xuXHRcdFx0XHRcdFx0Ly8gaWYgdGhlcmUgaXMgYSBwYXJlbnQgY29udHJvbCBzcGVjaWZpZWQgYWRkIHRoZSBkaWFsb2cgYXMgZGVwZW5kZW50XG5cdFx0XHRcdFx0XHRvUGFyZW50Q29udHJvbC5hZGREZXBlbmRlbnQob0RpYWxvZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9DcmVhdGVCdXR0b24gPSBvRGlhbG9nLmdldEJlZ2luQnV0dG9uKCk7XG5cdFx0XHRcdFx0b0RpYWxvZy5zZXRCaW5kaW5nQ29udGV4dChvVHJhbnNpZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0cmV0dXJuIENvbW1vblV0aWxzLnNldFVzZXJEZWZhdWx0cyhcblx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRhSW1tdXRhYmxlRmllbGRzLFxuXHRcdFx0XHRcdFx0b1RyYW5zaWVudENvbnRleHQsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbixcblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGFcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0dmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMoKTtcblx0XHRcdFx0XHRcdFx0Ly8gZm9vdGVyIG11c3Qgbm90IGJlIHZpc2libGUgd2hlbiB0aGUgZGlhbG9nIGlzIG9wZW4gYXMgcGVyIFVYIGd1aWRlbGluZXNcblx0XHRcdFx0XHRcdFx0KG9EaWFsb2cuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCkuc2V0UHJvcGVydHkoXCJpc0NyZWF0ZURpYWxvZ09wZW5cIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdG9EaWFsb2cub3BlbigpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbihvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCkudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3Qob0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXHRvbkFmdGVyQ3JlYXRlQ29tcGxldGlvbihvTGlzdEJpbmRpbmc6IGFueSwgb05ld0RvY3VtZW50Q29udGV4dDogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0bGV0IGZuUmVzb2x2ZTogRnVuY3Rpb24sIGZuUmVqZWN0OiBGdW5jdGlvbjtcblx0XHRjb25zdCBvUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0Zm5SZXNvbHZlID0gcmVzb2x2ZTtcblx0XHRcdGZuUmVqZWN0ID0gcmVqZWN0O1xuXHRcdH0pO1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdC8vIFdvcmthcm91bmQgc3VnZ2VzdGVkIGJ5IE9EYXRhIG1vZGVsIHY0IGNvbGxlYWd1ZXNcblx0XHRjb25zdCBmbkNyZWF0ZUNvbXBsZXRlZCA9IGZ1bmN0aW9uKG9FdmVudDogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dCA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJjb250ZXh0XCIpLFxuXHRcdFx0XHRiU3VjY2VzcyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0aWYgKG9Db250ZXh0ID09PSBvTmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdG9MaXN0QmluZGluZy5kZXRhY2hDcmVhdGVDb21wbGV0ZWQoZm5DcmVhdGVDb21wbGV0ZWQsIHRoYXQpO1xuXHRcdFx0XHRpZiAoIWJTdWNjZXNzKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0Vycm9yOiBhbnkgPSB7IGJEZWxldGVUcmFuc2llbnRDb250ZXh0OiBmYWxzZSB9O1xuXHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCkge1xuXHRcdFx0XHRcdFx0Ly8gdGhlIGNvbnRleHQgaXMgZGVsZXRlZFxuXHRcdFx0XHRcdFx0b0Vycm9yLmJEZWxldGVUcmFuc2llbnRDb250ZXh0ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdC8vIHRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIGNvbnNvbGUgZXJyb3JzIFRPIGJlIGNoZWNrZWQgd2l0aCBtb2RlbCBjb2xsZWFndWVzXG5cdFx0XHRcdFx0XHRvQ29udGV4dFxuXHRcdFx0XHRcdFx0XHQuY3JlYXRlZCgpXG5cdFx0XHRcdFx0XHRcdC50aGVuKHVuZGVmaW5lZCwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLnRyYWNlKFwidHJhbnNpZW50IGNyZWF0aW9uIGNvbnRleHQgZGVsZXRlZFwiKTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLnRyYWNlKFwidHJhbnNpZW50IGNyZWF0aW9uIGNvbnRleHQgZGVsZXRpb24gZXJyb3JcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHQvLyBpZiBjdXJyZW50IHN0YXRlIGlzIHRyYW5zaWVudCAoLi4uKSwgYnJvd3NlciB3aWxsIGNvbWUgYmFjayB0byBwcmV2aW91cyBzdGF0ZVxuXHRcdFx0XHRcdFx0b0Vycm9yLm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGZuUmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Zm5SZXNvbHZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHRcdG9MaXN0QmluZGluZy5hdHRhY2hDcmVhdGVDb21wbGV0ZWQoZm5DcmVhdGVDb21wbGV0ZWQsIHRoaXMpO1xuXHRcdHJldHVybiBvUHJvbWlzZTtcblx0fVxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBOZXdBY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAc3RhdGljXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyLl9nZXROZXdBY3Rpb25cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU3RhcnR1cFBhcmFtZXRlcnMgU3RhcnR1cCBwYXJhbWV0ZXJzIG9mIHRoZSBhcHBsaWNhdGlvblxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0NyZWF0ZUhhc2ggSGFzaCB0byBiZSBjaGVja2VkIGZvciBhY3Rpb24gdHlwZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb01ldGFNb2RlbCBUaGUgTWV0YU1vZGVsIHVzZWQgdG8gY2hlY2sgZm9yIE5ld0FjdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNNZXRhUGF0aCBUaGUgTWV0YVBhdGhcblx0ICogQHJldHVybnMge3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqKi9cblx0X2dldE5ld0FjdGlvbihvU3RhcnR1cFBhcmFtZXRlcnM6IGFueSwgc0NyZWF0ZUhhc2g6IHN0cmluZywgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIHNNZXRhUGF0aDogc3RyaW5nKSB7XG5cdFx0bGV0IHNOZXdBY3Rpb247XG5cblx0XHRpZiAob1N0YXJ0dXBQYXJhbWV0ZXJzICYmIG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlICYmIHNDcmVhdGVIYXNoLmluZGV4T2YoXCJpLWFjdGlvbj1jcmVhdGVXaXRoXCIpID4gLTEpIHtcblx0XHRcdGNvbnN0IHNQcmVmZXJyZWRNb2RlID0gb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVbMF07XG5cdFx0XHRzTmV3QWN0aW9uID1cblx0XHRcdFx0c1ByZWZlcnJlZE1vZGUuaW5kZXhPZihcImNyZWF0ZVdpdGg6XCIpID4gLTEgPyBzUHJlZmVycmVkTW9kZS5zdWJzdHIoc1ByZWZlcnJlZE1vZGUubGFzdEluZGV4T2YoXCI6XCIpICsgMSkgOiB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNOZXdBY3Rpb24gPVxuXHRcdFx0XHRvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0ICE9PSB1bmRlZmluZWRcblx0XHRcdFx0XHQ/IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNNZXRhUGF0aCArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZC9OZXdBY3Rpb25cIikgfHxcblx0XHRcdFx0XHQgIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNNZXRhUGF0aCArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvTmV3QWN0aW9uXCIpXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiBzTmV3QWN0aW9uO1xuXHR9XG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGxhYmVsIGZvciB0aGUgdGl0bGUgb2YgYSBzcGVjaWZpYyBjcmVhdGUgYWN0aW9uIGRpYWxvZywgZS5nLiBDcmVhdGUgU2FsZXMgT3JkZXIgZnJvbSBRdW90YXRpb24uXG5cdCAqXG5cdCAqIFRoZSBmb2xsb3dpbmcgcHJpb3JpdHkgaXMgYXBwbGllZDpcblx0ICogMS4gbGFiZWwgb2YgbGluZS1pdGVtIGFubm90YXRpb24uXG5cdCAqIDIuIGxhYmVsIGFubm90YXRlZCBpbiB0aGUgYWN0aW9uLlxuXHQgKiAzLiBcIkNyZWF0ZVwiIGFzIGEgY29uc3RhbnQgZnJvbSBpMThuLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHN0YXRpY1xuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlci5fZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHBhcmFtIHtvYmplY3R9IG9NZXRhTW9kZWwgVGhlIE1ldGFNb2RlbCB1c2VkIHRvIGNoZWNrIGZvciB0aGUgTmV3QWN0aW9uIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc01ldGFQYXRoIFRoZSBNZXRhUGF0aFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc05ld0FjdGlvbiBDb250YWlucyB0aGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvUmVzb3VyY2VCdW5kbGVDb3JlIFJlc291cmNlQnVuZGxlIHRvIGFjY2VzcyB0aGUgZGVmYXVsdCBDcmVhdGUgbGFiZWxcblx0ICogQHJldHVybnMge3N0cmluZ30gVGhlIGxhYmVsIGZvciB0aGUgQ3JlYXRlIEFjdGlvbiBEaWFsb2dcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKiovXG5cdF9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsKFxuXHRcdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRcdHNNZXRhUGF0aDogc3RyaW5nLFxuXHRcdHNOZXdBY3Rpb246IHN0cmluZyxcblx0XHRvUmVzb3VyY2VCdW5kbGVDb3JlOiBSZXNvdXJjZUJ1bmRsZVxuXHQpIHtcblx0XHRjb25zdCBmbkdldExhYmVsRnJvbUxpbmVJdGVtQW5ub3RhdGlvbiA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtXCIpKSB7XG5cdFx0XHRcdGNvbnN0IGlMaW5lSXRlbUluZGV4ID0gb01ldGFNb2RlbFxuXHRcdFx0XHRcdC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtXCIpXG5cdFx0XHRcdFx0LmZpbmRJbmRleChmdW5jdGlvbihvTGluZUl0ZW06IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgYUxpbmVJdGVtQWN0aW9uID0gb0xpbmVJdGVtLkFjdGlvbiA/IG9MaW5lSXRlbS5BY3Rpb24uc3BsaXQoXCIoXCIpIDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGFMaW5lSXRlbUFjdGlvbiA/IGFMaW5lSXRlbUFjdGlvblswXSA9PT0gc05ld0FjdGlvbiA6IGZhbHNlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gaUxpbmVJdGVtSW5kZXggPiAtMVxuXHRcdFx0XHRcdD8gb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtXCIpW2lMaW5lSXRlbUluZGV4XS5MYWJlbFxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0cmV0dXJuIChcblx0XHRcdGZuR2V0TGFiZWxGcm9tTGluZUl0ZW1Bbm5vdGF0aW9uKCkgfHxcblx0XHRcdChvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNNZXRhUGF0aCArIFwiL1wiICsgc05ld0FjdGlvbiArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5MYWJlbFwiKSkgfHxcblx0XHRcdChvUmVzb3VyY2VCdW5kbGVDb3JlICYmIG9SZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX1NBUEZFX0FDVElPTl9DUkVBVEVcIikpXG5cdFx0KTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBUcmFuc2FjdGlvbkhlbHBlcjtcbiJdfQ==
1562
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRyYW5zYWN0aW9uSGVscGVyLnRzIl0sIm5hbWVzIjpbIkNyZWF0aW9uTW9kZSIsIkZFTGlicmFyeSIsIlByb2dyYW1taW5nTW9kZWwiLCJWYWx1ZVN0YXRlIiwiY29yZUxpYnJhcnkiLCJnZXRQYXJhbWV0ZXJzIiwibVBhcmFtZXRlcnMiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJUcmFuc2FjdGlvbkhlbHBlciIsIm9BcHBDb21wb25lbnQiLCJvTG9ja09iamVjdCIsIl9iSXNNb2RpZmllZCIsIl9iQ3JlYXRlTW9kZSIsIl9iQ29udGludWVEaXNjYXJkIiwiX29BcHBDb21wb25lbnQiLCJnZXRQcm9ncmFtbWluZ01vZGVsIiwib0NvbnRleHQiLCJzUHJvZ3JhbW1pbmdNb2RlbCIsInNQYXRoIiwiaXNBIiwiZ2V0UGF0aCIsImlzUmVsYXRpdmUiLCJnZXRSZXNvbHZlZFBhdGgiLCJNb2RlbEhlbHBlciIsImlzRHJhZnRTdXBwb3J0ZWQiLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsIkRyYWZ0IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU3RpY2t5IiwiTm9uRHJhZnQiLCJ2YWxpZGF0ZURvY3VtZW50Iiwib1ZpZXciLCJzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwic01vZHVsZSIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwicmVwbGFjZSIsInNGdW5jdGlvbk5hbWUiLCJsZW5ndGgiLCJtRGF0YSIsImRhdGEiLCJGUE1IZWxwZXIiLCJ2YWxpZGF0aW9uV3JhcHBlciIsIlByb21pc2UiLCJyZXNvbHZlIiwiY3JlYXRlRG9jdW1lbnQiLCJvTWFpbkxpc3RCaW5kaW5nIiwibUluUGFyYW1ldGVycyIsIm9SZXNvdXJjZUJ1bmRsZSIsIm1lc3NhZ2VIYW5kbGVyIiwiYkZyb21Db3B5UGFzdGUiLCJ0aGF0Iiwib01vZGVsIiwib01ldGFNb2RlbCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0SGVhZGVyQ29udGV4dCIsInNDcmVhdGVIYXNoIiwiX2dldEFwcENvbXBvbmVudCIsImdldFJvdXRlclByb3h5IiwiZ2V0SGFzaCIsIm9Db21wb25lbnREYXRhIiwiZ2V0Q29tcG9uZW50RGF0YSIsIm9TdGFydHVwUGFyYW1ldGVycyIsInN0YXJ0dXBQYXJhbWV0ZXJzIiwic05ld0FjdGlvbiIsIl9nZXROZXdBY3Rpb24iLCJ1bmRlZmluZWQiLCJvQ3JlYXRpb25Qcm9taXNlIiwibUJpbmRpbmdQYXJhbWV0ZXJzIiwic01lc3NhZ2VzUGF0aCIsImdldE9iamVjdCIsInNCdXN5UGF0aCIsImdldFRhcmdldEVudGl0eVNldCIsImdldENvbnRleHQiLCJiRnVuY3Rpb25Pbk5hdlByb3AiLCJvTmV3RG9jdW1lbnRDb250ZXh0IiwicmVqZWN0IiwiYnVzeU1vZGUiLCJzSWQiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwib1Jlc291cmNlQnVuZGxlQ29yZSIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsImNhbGxBY3Rpb24iLCJjb250ZXh0cyIsInNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2ciLCJsYWJlbCIsIl9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsIiwiYmluZGluZ1BhcmFtZXRlcnMiLCJwYXJlbnRDb250cm9sIiwiYklzQ3JlYXRlQWN0aW9uIiwiYklzTmV3UGFnZUNyZWF0aW9uIiwiY3JlYXRpb25Nb2RlIiwiQ3JlYXRpb25Sb3ciLCJJbmxpbmUiLCJhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzIiwiQ29tbW9uVXRpbHMiLCJnZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMiLCJzRnVuY3Rpb25QYXRoIiwib0Z1bmN0aW9uQ29udGV4dCIsIm9GdW5jdGlvbiIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiJElzQm91bmQiLCJvcGVyYXRpb25zIiwiY2FsbEJvdW5kRnVuY3Rpb24iLCJjYWxsRnVuY3Rpb25JbXBvcnQiLCJ0aGVuIiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsIm9EYXRhIiwiT2JqZWN0IiwiYXNzaWduIiwib1RyYW5zaWVudExpc3RCaW5kaW5nIiwiYmluZExpc3QiLCIkJHVwZGF0ZUdyb3VwSWQiLCJyZWZyZXNoSW50ZXJuYWwiLCJjcmVhdGUiLCJfbGF1bmNoRGlhbG9nV2l0aEtleUZpZWxkcyIsIm9uQmVmb3JlQ3JlYXRlUHJvbWlzZSIsImNvbnRleHRQYXRoIiwiY3JlYXRlQXRFbmQiLCJvbkFmdGVyQ3JlYXRlQ29tcGxldGlvbiIsIm9SZXN1bHQiLCJyZXNwb25zZSIsImJDb25zaWRlckRvY3VtZW50TW9kaWZpZWQiLCJoYW5kbGVEb2N1bWVudE1vZGlmaWNhdGlvbnMiLCJzaG93TWVzc2FnZURpYWxvZyIsImJEZWxldGVUcmFuc2llbnRDb250ZXh0IiwiaXNUcmFuc2llbnQiLCJkZWxldGUiLCJmaW5hbGx5IiwidW5sb2NrIiwiZmluZEFjdGl2ZURyYWZ0Um9vdENvbnRleHRzIiwiYUNvbnRleHRzIiwiYkZpbmRBY3RpdmVDb250ZXh0cyIsImFjdGl2ZUNvbnRleHRzIiwicmVkdWNlIiwiYVJlc3VsdCIsImJJc0FjdGl2ZUVudGl0eSIsIklzQWN0aXZlRW50aXR5IiwiYkhhc0FjdGl2ZUVudGl0eSIsIkhhc0FjdGl2ZUVudGl0eSIsIm9BY3RpdmVDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJwdXNoIiwiYWxsIiwibWFwIiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJhZnRlckRlbGV0ZVByb2Nlc3MiLCJjaGVja0JveCIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsImludGVybmFsTW9kZWxDb250ZXh0IiwiZ2V0UHJvcGVydHkiLCJpc0NoZWNrQm94VmlzaWJsZSIsImlzQ2hlY2tCb3hTZWxlY3RlZCIsInNldFByb3BlcnR5Iiwib2JqIiwic2VsZWN0ZWRDb250ZXh0cyIsImZpbHRlciIsImVsZW1lbnQiLCJkZWxldGFibGVDb250ZXh0cyIsImluZGV4T2YiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJlbnRpdHlTZXROYW1lIiwiZGVsZXRlRG9jdW1lbnQiLCJ2Q29udGV4dHMiLCJmblJlamVjdCIsImZuUmVzb2x2ZSIsImFEZWxldGFibGVDb250ZXh0cyIsImlzTG9ja2VkVGV4dFZpc2libGUiLCJjYW5ub3RCZURlbGV0ZWRUZXh0VmlzaWJsZSIsImJEaWFsb2dDb25maXJtZWQiLCJhUGFyYW1zIiwib0RlbGV0ZU1lc3NhZ2UiLCJ0aXRsZSIsImdldFRleHQiLCJBcnJheSIsImlzQXJyYXkiLCJpIiwib0NvbnRleHREYXRhIiwiSGFzRHJhZnRFbnRpdHkiLCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSIsIkluUHJvY2Vzc0J5VXNlciIsIkRyYWZ0SXNDcmVhdGVkQnlNZSIsIk1lc3NhZ2VCb3giLCJvbkNsb3NlIiwiZGVzY3JpcHRpb24iLCJ0ZXh0IiwidW5TYXZlZENvbnRleHRzIiwiZHJhZnRBZG1pbkRhdGEiLCJzTGFzdENoYW5nZWRCeVVzZXIiLCJjb25jYXQiLCJsb2NrZWRDb250ZXh0cyIsIm5vbkRlbGV0YWJsZVRleHQiLCJjaGVja0JveFRleHQiLCJvTm9uRGVsZXRhYmxlTWVzc2FnZVRleHRDb250cm9sIiwib0RlbGV0ZU1lc3NhZ2VUZXh0Q29udHJvbCIsIm9Db250ZW50IiwiVkJveCIsIml0ZW1zIiwiVGV4dCIsInZpc2libGUiLCJDaGVja0JveCIsInNlbGVjdGVkIiwic2VsZWN0Iiwib0V2ZW50IiwiZ2V0U291cmNlIiwiZ2V0U2VsZWN0ZWQiLCJzVGl0bGUiLCJmbkNvbmZpcm0iLCJvbkJlZm9yZURlbGV0ZVByb21pc2UiLCJiZWZvcmVEZWxldGVDYWxsQmFjayIsImJpbmQiLCJkcmFmdCIsImRlbGV0ZURyYWZ0Iiwic2hvd01lc3NhZ2VzIiwib0RpYWxvZyIsIkRpYWxvZyIsInN0YXRlIiwiY29udGVudCIsImFyaWFMYWJlbGxlZEJ5IiwiZ2V0VmlzaWJsZSIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwidHlwZSIsInByZXNzIiwiY2xvc2UiLCJlbmRCdXR0b24iLCJhZnRlckNsb3NlIiwiZGVzdHJveSIsIm5vRGlhbG9nIiwiYWRkU3R5bGVDbGFzcyIsIm9wZW4iLCJ3YXJuaW5nIiwiZWRpdERvY3VtZW50Iiwib0VkaXRQcm9taXNlIiwiRXJyb3IiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsImJQcmVzZXJ2ZUNoYW5nZXMiLCJzdGlja3kiLCJlZGl0RG9jdW1lbnRJblN0aWNreVNlc3Npb24iLCJvTmV3Q29udGV4dCIsImVyciIsImNhbmNlbERvY3VtZW50Iiwib1BhcmFtc0NvbnRleHQiLCJvQ2FuY2VsQnV0dG9uIiwiY2FuY2VsQnV0dG9uIiwib25CZWZvcmVDYW5jZWxQcm9taXNlIiwic0Nhbm9uaWNhbFBhdGgiLCJzUE1vZGVsIiwiZHJhZnREYXRhQ29udGV4dCIsInJlcXVlc3RPYmplY3QiLCJDcmVhdGlvbkRhdGVUaW1lIiwiTGFzdENoYW5nZURhdGVUaW1lIiwic2tpcERpc2NhcmRQb3BvdmVyIiwiX3Nob3dEaXNjYXJkUG9wb3ZlciIsImJlZm9yZUNhbmNlbENhbGxCYWNrIiwiY29udGV4dCIsIm9EZWxldGVQcm9taXNlIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJnZXRCaW5kaW5nIiwicmVzZXRDaGFuZ2VzIiwiZGlzY2FyZERvY3VtZW50IiwicmVmcmVzaCIsInNhdmVEb2N1bWVudCIsImJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwiYUJpbmRpbmdzIiwib1NhdmVQcm9taXNlIiwiYWN0aXZhdGVEb2N1bWVudCIsIm9BY3RpdmVEb2N1bWVudCIsImJOZXdPYmplY3QiLCJmb3JFYWNoIiwib0xpc3RCaW5kaW5nIiwiaGFzVHJhbnNpZW50Q29udGV4dCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsInNBY3Rpb25OYW1lIiwib1Byb21pc2UiLCJzTmFtZSIsInNwbGl0IiwibW9kZWwiLCJtU2lkZUVmZmVjdHNQYXJhbWV0ZXJzIiwiZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyIsIm9BcHBsaWNhYmxlQ29udGV4dERpYWxvZyIsIm9Db250cm9sbGVyIiwib25Db250aW51ZSIsImFwcGxpY2FibGVDb250ZXh0IiwiZm5PcGVuQW5kRmlsbERpYWxvZyIsIm9EaWFsb2dDb250ZW50Iiwibk5vdEFwcGxpY2FibGUiLCJub3RBcHBsaWNhYmxlQ29udGV4dCIsImFOb3RBcHBsaWNhYmxlSXRlbXMiLCJvTm90QXBwbGljYWJsZUl0ZW1zTW9kZWwiLCJKU09OTW9kZWwiLCJvVG90YWxzIiwidG90YWwiLCJzZXRNb2RlbCIsInNGcmFnbWVudE5hbWUiLCJvRGlhbG9nRnJhZ21lbnQiLCJYTUxUZW1wbGF0ZVByb2Nlc3NvciIsImxvYWRUZW1wbGF0ZSIsImdldENhbm9uaWNhbFBhdGgiLCJzRW50aXR5U2V0Iiwic3Vic3RyIiwib0RpYWxvZ0xhYmVsTW9kZWwiLCJYTUxQcmVwcm9jZXNzb3IiLCJwcm9jZXNzIiwibmFtZSIsImJpbmRpbmdDb250ZXh0cyIsImVudGl0eVR5cGUiLCJtb2RlbHMiLCJtZXRhTW9kZWwiLCJvRnJhZ21lbnQiLCJGcmFnbWVudCIsImxvYWQiLCJkZWZpbml0aW9uIiwiY29udHJvbGxlciIsIm9Qb3BvdmVyIiwiYWRkRGVwZW5kZW50IiwiY29udGV4dFRvUHJvY2VzcyIsImNhbGxCb3VuZEFjdGlvbiIsImludm9jYXRpb25Hcm91cGluZyIsImFkZGl0aW9uYWxTaWRlRWZmZWN0Iiwib25TdWJtaXR0ZWQiLCJvblJlc3BvbnNlIiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiYkdldEJvdW5kQ29udGV4dCIsImJPYmplY3RQYWdlIiwiZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIiwiY2FsbEFjdGlvbkltcG9ydCIsIl9oYW5kbGVBY3Rpb25SZXNwb25zZSIsImFUcmFuc2llbnRNZXNzYWdlcyIsIm1lc3NhZ2VIYW5kbGluZyIsImdldE1lc3NhZ2VzIiwiaGFuZGxlVmFsaWRhdGlvbkVycm9yIiwib01lc3NhZ2VNYW5hZ2VyIiwiZ2V0TWVzc2FnZU1hbmFnZXIiLCJlcnJvclRvUmVtb3ZlIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsInZhbGlkYXRpb24iLCJyZW1vdmVNZXNzYWdlcyIsImJJc01vZGlmaWVkIiwiZm5PbkFmdGVyRGlzY2FyZCIsInNldEVuYWJsZWQiLCJfb1BvcG92ZXIiLCJkZXRhY2hBZnRlckNsb3NlIiwib1RleHQiLCJvQnV0dG9uIiwid2lkdGgiLCJQb3BvdmVyIiwic2hvd0hlYWRlciIsInBsYWNlbWVudCIsImJlZm9yZU9wZW4iLCJzZXRJbml0aWFsRm9jdXMiLCJhdHRhY2hBZnRlckNsb3NlIiwib3BlbkJ5Iiwib1RyYW5zaWVudENvbnRleHQiLCJtRmllbGRzIiwib1BhcmVudENvbnRyb2wiLCJiU3VjY2VzcyIsImdldENvbnRyb2xsZXIiLCJhSW1tdXRhYmxlRmllbGRzIiwib0VudGl0eVNldENvbnRleHQiLCJvSW1tdXRhYmxlQ3R4TW9kZWwiLCJvSW1tdXRhYmxlQ3R4IiwiZW50aXR5U2V0IiwiZmllbGRzIiwiYUZvcm1FbGVtZW50cyIsIm1GaWVsZFZhbHVlTWFwIiwib0NyZWF0ZUJ1dHRvbiIsInZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzIiwib0Zvcm1FbGVtZW50IiwiZ2V0RmllbGRzIiwib0ZpZWxkIiwiZ2V0UmVxdWlyZWQiLCJzRmllbGRJZCIsImdldElkIiwidlZhbHVlIiwiZ2V0VmFsdWVTdGF0ZSIsImdldFZhbHVlIiwiYVJlc3VsdHMiLCJldmVyeSIsImJFbmFibGVkIiwiaGFuZGxlQ2hhbmdlIiwiZ2V0UGFyYW1ldGVyIiwib0ZpZWxkUHJvbWlzZSIsImhhbmRsZUxpdmVDaGFuZ2UiLCJiSXNDcmVhdGVEaWFsb2ciLCJrZXlzIiwic0tleSIsIm9WYWx1ZSIsIm9EaWFsb2dWYWx1ZSIsImFWYWx1ZXMiLCJjcmVhdGVQYXJhbWV0ZXJzIiwic3VibWl0QmF0Y2giLCJvUmVzcG9uc2UiLCJiS2VlcERpYWxvZ09wZW4iLCJzZXRCaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwiZ2V0QWdncmVnYXRpb24iLCJnZXRCZWdpbkJ1dHRvbiIsInNldFVzZXJEZWZhdWx0cyIsImNyZWF0ZUFjdGlvbiIsImZuQ3JlYXRlQ29tcGxldGVkIiwiZGV0YWNoQ3JlYXRlQ29tcGxldGVkIiwia2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCIsImNyZWF0ZWQiLCJ0cmFjZSIsImF0dGFjaENyZWF0ZUNvbXBsZXRlZCIsInByZWZlcnJlZE1vZGUiLCJzUHJlZmVycmVkTW9kZSIsImZuR2V0TGFiZWxGcm9tTGluZUl0ZW1Bbm5vdGF0aW9uIiwiaUxpbmVJdGVtSW5kZXgiLCJmaW5kSW5kZXgiLCJvTGluZUl0ZW0iLCJhTGluZUl0ZW1BY3Rpb24iLCJBY3Rpb24iLCJMYWJlbCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7OztBQTJCQSxNQUFNQSxZQUFZLEdBQUdDLFNBQVMsQ0FBQ0QsWUFBL0I7QUFDQSxNQUFNRSxnQkFBZ0IsR0FBR0QsU0FBUyxDQUFDQyxnQkFBbkM7QUFDQSxNQUFNQyxVQUFVLEdBQUdDLFdBQVcsQ0FBQ0QsVUFBL0I7QUFDQTs7QUFDQSxXQUFTRSxhQUFULENBQXVCQyxXQUF2QixFQUF5QztBQUN4QyxRQUFJQSxXQUFXLElBQUlBLFdBQVcsQ0FBQ0MsV0FBM0IsSUFBMENELFdBQVcsQ0FBQ0MsV0FBWixHQUEwQkMsT0FBMUIsT0FBd0MsbUJBQXRGLEVBQTJHO0FBQzFHRixNQUFBQSxXQUFXLEdBQUcsRUFBZDtBQUNBOztBQUNELFdBQU9BLFdBQVcsSUFBSSxFQUF0QjtBQUNBOztNQUVLRyxpQjtBQVFMLCtCQUFZQyxhQUFaLEVBQXlDQyxXQUF6QyxFQUEyRDtBQUFBLFdBSjNEQyxZQUkyRCxHQUpuQyxLQUltQztBQUFBLFdBSDNEQyxZQUcyRCxHQUhuQyxLQUdtQztBQUFBLFdBRjNEQyxpQkFFMkQsR0FGOUIsS0FFOEI7QUFDMUQsV0FBS0MsY0FBTCxHQUFzQkwsYUFBdEI7QUFDQSxXQUFLQyxXQUFMLEdBQW1CQSxXQUFuQjtBQUNBOzs7O1dBQ0RLLG1CLEdBQUEsNkJBQW9CQyxRQUFwQixFQUE0RDtBQUMzRCxVQUFJLENBQUMsS0FBS0MsaUJBQU4sSUFBMkJELFFBQS9CLEVBQXlDO0FBQ3hDLFlBQUlFLEtBQUo7O0FBQ0EsWUFBSUYsUUFBUSxDQUFDRyxHQUFULENBQWEsK0JBQWIsQ0FBSixFQUFtRDtBQUNsREQsVUFBQUEsS0FBSyxHQUFHRixRQUFRLENBQUNJLE9BQVQsRUFBUjtBQUNBLFNBRkQsTUFFTztBQUNORixVQUFBQSxLQUFLLEdBQUdGLFFBQVEsQ0FBQ0ssVUFBVCxLQUF3QkwsUUFBUSxDQUFDTSxlQUFULEVBQXhCLEdBQXFETixRQUFRLENBQUNJLE9BQVQsRUFBN0Q7QUFDQTs7QUFDRCxZQUFJRyxXQUFXLENBQUNDLGdCQUFaLENBQTZCUixRQUFRLENBQUNTLFFBQVQsR0FBb0JDLFlBQXBCLEVBQTdCLEVBQWlFUixLQUFqRSxDQUFKLEVBQTZFO0FBQzVFLGVBQUtELGlCQUFMLEdBQXlCaEIsZ0JBQWdCLENBQUMwQixLQUExQztBQUNBLFNBRkQsTUFFTyxJQUFJSixXQUFXLENBQUNLLHdCQUFaLENBQXFDWixRQUFRLENBQUNTLFFBQVQsR0FBb0JDLFlBQXBCLEVBQXJDLENBQUosRUFBOEU7QUFDcEYsZUFBS1QsaUJBQUwsR0FBeUJoQixnQkFBZ0IsQ0FBQzRCLE1BQTFDO0FBQ0EsU0FGTSxNQUVBO0FBQ047QUFDQTtBQUNBLGlCQUFPNUIsZ0JBQWdCLENBQUM2QixRQUF4QjtBQUNBO0FBQ0Q7O0FBQ0QsYUFBTyxLQUFLYixpQkFBWjtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0NjLGdCLEdBQUEsMEJBQWlCZixRQUFqQixFQUFnQ1gsV0FBaEMsRUFBa0QyQixLQUFsRCxFQUE2RTtBQUM1RSxVQUFNQyx5QkFBeUIsR0FBRzVCLFdBQVcsSUFBSUEsV0FBVyxDQUFDNkIsd0JBQTdEOztBQUNBLFVBQUlELHlCQUFKLEVBQStCO0FBQzlCLFlBQU1FLE9BQU8sR0FBR0YseUJBQXlCLENBQUNHLFNBQTFCLENBQW9DLENBQXBDLEVBQXVDSCx5QkFBeUIsQ0FBQ0ksV0FBMUIsQ0FBc0MsR0FBdEMsS0FBOEMsQ0FBQyxDQUF0RixFQUF5RkMsT0FBekYsQ0FBaUcsTUFBakcsRUFBeUcsR0FBekcsQ0FBaEI7QUFBQSxZQUNDQyxhQUFhLEdBQUdOLHlCQUF5QixDQUFDRyxTQUExQixDQUNmSCx5QkFBeUIsQ0FBQ0ksV0FBMUIsQ0FBc0MsR0FBdEMsSUFBNkMsQ0FEOUIsRUFFZkoseUJBQXlCLENBQUNPLE1BRlgsQ0FEakI7QUFBQSxZQUtDQyxLQUFLLEdBQUdwQyxXQUFXLENBQUNxQyxJQUxyQjtBQU1BLGVBQU9ELEtBQUssQ0FBQywyQkFBRCxDQUFaO0FBQ0EsZUFBT0UsU0FBUyxDQUFDQyxpQkFBVixDQUE0QlQsT0FBNUIsRUFBcUNJLGFBQXJDLEVBQW9ERSxLQUFwRCxFQUEyRFQsS0FBM0QsRUFBa0VoQixRQUFsRSxDQUFQO0FBQ0E7O0FBQ0QsYUFBTzZCLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQixFQUFoQixDQUFQO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNDQyxjLEdBQUEsd0JBQ0NDLGdCQURELEVBRUNDLGFBRkQsRUFHQ0MsZUFIRCxFQUlDQyxjQUpELEVBT0U7QUFBQSxVQUZEQyxjQUVDLHVFQUZ5QixLQUV6QjtBQUFBLFVBRERwQixLQUNDOztBQUNEO0FBQ0EsVUFBTXFCLElBQUksR0FBRyxJQUFiO0FBQUEsVUFDQ0MsTUFBTSxHQUFHTixnQkFBZ0IsQ0FBQ3ZCLFFBQWpCLEVBRFY7QUFBQSxVQUVDOEIsVUFBVSxHQUFHRCxNQUFNLENBQUM1QixZQUFQLEVBRmQ7QUFBQSxVQUdDOEIsU0FBUyxHQUFHRCxVQUFVLENBQUNFLFdBQVgsQ0FBdUJULGdCQUFnQixDQUFDVSxnQkFBakIsR0FBb0N0QyxPQUFwQyxFQUF2QixDQUhiO0FBQUEsVUFJQ3VDLFdBQVcsR0FBRyxLQUFLQyxnQkFBTCxHQUNaQyxjQURZLEdBRVpDLE9BRlksRUFKZjtBQUFBLFVBT0NDLGNBQWMsR0FBRyxLQUFLSCxnQkFBTCxHQUF3QkksZ0JBQXhCLEVBUGxCO0FBQUEsVUFRQ0Msa0JBQWtCLEdBQUlGLGNBQWMsSUFBSUEsY0FBYyxDQUFDRyxpQkFBbEMsSUFBd0QsRUFSOUU7QUFBQSxVQVNDQyxVQUFVLEdBQUcsQ0FBQ25CLGdCQUFnQixDQUFDM0IsVUFBakIsRUFBRCxHQUNWLEtBQUsrQyxhQUFMLENBQW1CSCxrQkFBbkIsRUFBdUNOLFdBQXZDLEVBQW9ESixVQUFwRCxFQUFnRUMsU0FBaEUsQ0FEVSxHQUVWYSxTQVhKOztBQVlBLFVBQUlDLGdCQUFKO0FBQ0EsVUFBTUMsa0JBQXVCLEdBQUc7QUFBRSxxQ0FBNkI7QUFBL0IsT0FBaEM7QUFDQSxVQUFNQyxhQUFhLEdBQUdqQixVQUFVLENBQUNrQixTQUFYLENBQXFCakIsU0FBUyxHQUFHLGlEQUFqQyxDQUF0QjtBQUNBLFVBQUlrQixTQUFTLEdBQUcsT0FBaEI7QUFDQSxVQUFJbkMsYUFBYSxHQUNoQmdCLFVBQVUsQ0FBQ2tCLFNBQVgsQ0FBcUJqQixTQUFTLEdBQUcsdURBQWpDLEtBQ0FELFVBQVUsQ0FBQ2tCLFNBQVgsQ0FDQ2xELFdBQVcsQ0FBQ29ELGtCQUFaLENBQStCcEIsVUFBVSxDQUFDcUIsVUFBWCxDQUFzQnBCLFNBQXRCLENBQS9CLElBQW1FLHVEQURwRSxDQUZEO0FBS0EsVUFBSXFCLGtCQUFKO0FBQ0EsVUFBSUMsbUJBQUo7O0FBQ0EsVUFBSXZDLGFBQUosRUFBbUI7QUFDbEIsWUFDQ2dCLFVBQVUsQ0FBQ2tCLFNBQVgsQ0FBcUJqQixTQUFTLEdBQUcsdURBQWpDLEtBQ0FqQyxXQUFXLENBQUNvRCxrQkFBWixDQUErQnBCLFVBQVUsQ0FBQ3FCLFVBQVgsQ0FBc0JwQixTQUF0QixDQUEvQixNQUFxRUEsU0FGdEUsRUFHRTtBQUNEcUIsVUFBQUEsa0JBQWtCLEdBQUcsSUFBckI7QUFDQSxTQUxELE1BS087QUFDTkEsVUFBQUEsa0JBQWtCLEdBQUcsS0FBckI7QUFDQTtBQUNEOztBQUNELFVBQUlMLGFBQUosRUFBbUI7QUFDbEJELFFBQUFBLGtCQUFrQixDQUFDLFNBQUQsQ0FBbEIsR0FBZ0NDLGFBQWhDO0FBQ0E7O0FBQ0QsVUFBTW5FLFdBQVcsR0FBR0QsYUFBYSxDQUFDNkMsYUFBRCxDQUFqQzs7QUFDQSxVQUFJLENBQUNELGdCQUFMLEVBQXVCO0FBQ3RCLGVBQU9ILE9BQU8sQ0FBQ2tDLE1BQVIsQ0FBZSw0Q0FBZixDQUFQO0FBQ0E7O0FBQ0QsVUFBTTlELGlCQUFpQixHQUFHLEtBQUtGLG1CQUFMLENBQXlCaUMsZ0JBQXpCLENBQTFCOztBQUNBLFVBQUkvQixpQkFBaUIsS0FBS2hCLGdCQUFnQixDQUFDMEIsS0FBdkMsSUFBZ0RWLGlCQUFpQixLQUFLaEIsZ0JBQWdCLENBQUM0QixNQUEzRixFQUFtRztBQUNsRyxlQUFPZ0IsT0FBTyxDQUFDa0MsTUFBUixDQUFlLDZFQUFmLENBQVA7QUFDQTs7QUFDRCxVQUFJMUUsV0FBVyxDQUFDMkUsUUFBWixLQUF5QixPQUE3QixFQUFzQztBQUNyQztBQUNBO0FBQ0FOLFFBQUFBLFNBQVMsR0FBRyxnQkFBZ0IxQixnQkFBZ0IsQ0FBQ2lDLEdBQTdDO0FBQ0E7O0FBQ0Q1RSxNQUFBQSxXQUFXLENBQUM2RSxvQkFBWixHQUFtQzlCLGNBQWMsR0FBRyxJQUFILEdBQVUvQyxXQUFXLENBQUM2RSxvQkFBdkU7QUFDQUMsTUFBQUEsVUFBVSxDQUFDQyxJQUFYLENBQWdCLEtBQUsxRSxXQUFyQixFQUFrQ2dFLFNBQWxDO0FBQ0EsVUFBTVcsbUJBQW1CLEdBQUdDLEdBQUcsQ0FBQ0MsRUFBSixDQUFPQyxPQUFQLEdBQWlCQyx3QkFBakIsQ0FBMEMsYUFBMUMsQ0FBNUI7O0FBQ0EsVUFBSXRCLFVBQUosRUFBZ0I7QUFDZkcsUUFBQUEsZ0JBQWdCLEdBQUcsS0FBS29CLFVBQUwsQ0FDbEJ2QixVQURrQixFQUVsQjtBQUNDd0IsVUFBQUEsUUFBUSxFQUFFM0MsZ0JBQWdCLENBQUNVLGdCQUFqQixFQURYO0FBRUNrQyxVQUFBQSx5QkFBeUIsRUFBRSxJQUY1QjtBQUdDQyxVQUFBQSxLQUFLLEVBQUUsS0FBS0MsbUNBQUwsQ0FDTnZDLFVBRE0sRUFFTkMsU0FGTSxFQUdOVyxVQUhNLEVBSU5rQixtQkFKTSxDQUhSO0FBU0NVLFVBQUFBLGlCQUFpQixFQUFFeEIsa0JBVHBCO0FBVUN5QixVQUFBQSxhQUFhLEVBQUUzRixXQUFXLENBQUMyRixhQVY1QjtBQVdDQyxVQUFBQSxlQUFlLEVBQUU7QUFYbEIsU0FGa0IsRUFlbEIsSUFma0IsRUFnQmxCOUMsY0FoQmtCLENBQW5CO0FBa0JBLE9BbkJELE1BbUJPO0FBQ04sWUFBTStDLGtCQUFrQixHQUN2QjdGLFdBQVcsQ0FBQzhGLFlBQVosS0FBNkJwRyxZQUFZLENBQUNxRyxXQUExQyxJQUF5RC9GLFdBQVcsQ0FBQzhGLFlBQVosS0FBNkJwRyxZQUFZLENBQUNzRyxNQURwRztBQUVBLFlBQU1DLDRCQUE0QixHQUFHSixrQkFBa0IsR0FDcERLLFdBQVcsQ0FBQ0MsMkJBQVosQ0FBd0NqRCxVQUF4QyxFQUFvREMsU0FBcEQsRUFBK0R4QixLQUEvRCxDQURvRCxHQUVwRCxFQUZIO0FBR0FPLFFBQUFBLGFBQWEsR0FBR2EsY0FBYyxHQUFHLElBQUgsR0FBVWIsYUFBeEM7QUFDQSxZQUFJa0UsYUFBSixFQUFtQkMsZ0JBQW5COztBQUNBLFlBQUluRSxhQUFKLEVBQW1CO0FBQ2xCO0FBQ0EsY0FBSXNDLGtCQUFKLEVBQXdCO0FBQ3ZCNEIsWUFBQUEsYUFBYSxHQUNaekQsZ0JBQWdCLENBQUM0QixVQUFqQixNQUNBckIsVUFBVSxDQUFDRSxXQUFYLENBQXVCVCxnQkFBZ0IsQ0FBQzRCLFVBQWpCLEdBQThCeEQsT0FBOUIsRUFBdkIsSUFBa0UsR0FBbEUsR0FBd0VtQixhQUZ6RTtBQUdBbUUsWUFBQUEsZ0JBQWdCLEdBQUcxRCxnQkFBZ0IsQ0FBQzRCLFVBQWpCLEVBQW5CO0FBQ0EsV0FMRCxNQUtPO0FBQ042QixZQUFBQSxhQUFhLEdBQ1p6RCxnQkFBZ0IsQ0FBQ1UsZ0JBQWpCLE1BQ0FILFVBQVUsQ0FBQ0UsV0FBWCxDQUF1QlQsZ0JBQWdCLENBQUNVLGdCQUFqQixHQUFvQ3RDLE9BQXBDLEVBQXZCLElBQXdFLEdBQXhFLEdBQThFbUIsYUFGL0U7QUFHQW1FLFlBQUFBLGdCQUFnQixHQUFHMUQsZ0JBQWdCLENBQUNVLGdCQUFqQixFQUFuQjtBQUNBO0FBQ0Q7O0FBQ0QsWUFBTWlELFNBQVMsR0FBR0YsYUFBYSxJQUFJbEQsVUFBVSxDQUFDcUQsb0JBQVgsQ0FBZ0NILGFBQWhDLENBQW5DOztBQUNBLFlBQUlFLFNBQVMsSUFBSUEsU0FBUyxDQUFDbEMsU0FBVixFQUFiLElBQXNDa0MsU0FBUyxDQUFDbEMsU0FBVixHQUFzQixDQUF0QixFQUF5Qm9DLFFBQW5FLEVBQTZFO0FBQzVFdkMsVUFBQUEsZ0JBQWdCLEdBQUd3QyxVQUFVLENBQUNDLGlCQUFYLENBQTZCeEUsYUFBN0IsRUFBNENtRSxnQkFBNUMsRUFBOERwRCxNQUE5RCxDQUFuQjtBQUNBLFNBRkQsTUFFTztBQUNOZ0IsVUFBQUEsZ0JBQWdCLEdBQUd3QyxVQUFVLENBQUNFLGtCQUFYLENBQThCekUsYUFBOUIsRUFBNkNlLE1BQTdDLENBQW5CO0FBQ0E7O0FBRURnQixRQUFBQSxnQkFBZ0IsR0FBR0EsZ0JBQWdCLENBQ2pDMkMsSUFEaUIsQ0FDWixVQUFTakcsUUFBVCxFQUF3QjtBQUM3QixjQUFJQSxRQUFKLEVBQWM7QUFDYixtQkFBT0EsUUFBUSxDQUFDeUQsU0FBVCxFQUFQO0FBQ0EsV0FGRCxNQUVPO0FBQ04sbUJBQU9KLFNBQVA7QUFDQTtBQUNELFNBUGlCLEVBUWpCNkMsS0FSaUIsQ0FRWCxVQUFTQyxNQUFULEVBQXNCO0FBQzVCQyxVQUFBQSxHQUFHLENBQUNDLEtBQUosQ0FBVSx3Q0FBd0M5RSxhQUFsRCxFQUFpRTRFLE1BQWpFO0FBQ0EsZ0JBQU1BLE1BQU47QUFDQSxTQVhpQixFQVlqQkYsSUFaaUIsQ0FZWixVQUFTSyxLQUFULEVBQXFCO0FBQzFCakgsVUFBQUEsV0FBVyxDQUFDcUMsSUFBWixHQUFtQjRFLEtBQUssR0FBR0MsTUFBTSxDQUFDQyxNQUFQLENBQWMsRUFBZCxFQUFrQkYsS0FBbEIsRUFBeUJqSCxXQUFXLENBQUNxQyxJQUFyQyxDQUFILEdBQWdEckMsV0FBVyxDQUFDcUMsSUFBcEY7O0FBQ0EsY0FBSXJDLFdBQVcsQ0FBQ3FDLElBQWhCLEVBQXNCO0FBQ3JCLG1CQUFPckMsV0FBVyxDQUFDcUMsSUFBWixDQUFpQixnQkFBakIsQ0FBUDtBQUNBOztBQUNELGNBQUk0RCw0QkFBNEIsQ0FBQzlELE1BQTdCLEdBQXNDLENBQTFDLEVBQTZDO0FBQzVDLGdCQUFNaUYscUJBQXFCLEdBQUduRSxNQUFNLENBQUNvRSxRQUFQLENBQWdCMUUsZ0JBQWdCLENBQUM1QixPQUFqQixFQUFoQixFQUE0QzRCLGdCQUFnQixDQUFDNEIsVUFBakIsRUFBNUMsRUFBMkUsRUFBM0UsRUFBK0UsRUFBL0UsRUFBbUY7QUFDaEgrQyxjQUFBQSxlQUFlLEVBQUU7QUFEK0YsYUFBbkYsQ0FBOUI7O0FBR0FGLFlBQUFBLHFCQUFxQixDQUFDRyxlQUF0QixHQUF3QyxZQUFXO0FBQ2xEO0FBQ0EsYUFGRDs7QUFHQTlDLFlBQUFBLG1CQUFtQixHQUFHMkMscUJBQXFCLENBQUNJLE1BQXRCLENBQTZCeEgsV0FBVyxDQUFDcUMsSUFBekMsRUFBK0MsSUFBL0MsQ0FBdEI7QUFDQSxtQkFBT1csSUFBSSxDQUFDeUUsMEJBQUwsQ0FDTjlFLGdCQURNLEVBRU55RSxxQkFGTSxFQUdOM0MsbUJBSE0sRUFJTndCLDRCQUpNLEVBS05oRCxNQUxNLEVBTU5qRCxXQU5NLEVBT044QyxjQVBNLENBQVA7QUFTQSxXQWpCRCxNQWlCTztBQUNOLGdCQUFJNEUscUJBQUo7O0FBQ0EsZ0JBQUkxSCxXQUFXLENBQUM2RSxvQkFBaEIsRUFBc0M7QUFDckM2QyxjQUFBQSxxQkFBcUIsR0FBRzFILFdBQVcsQ0FBQzZFLG9CQUFaLENBQWlDO0FBQ3hEOEMsZ0JBQUFBLFdBQVcsRUFBRWhGLGdCQUFnQixJQUFJQSxnQkFBZ0IsQ0FBQzVCLE9BQWpCO0FBRHVCLGVBQWpDLENBQXhCO0FBR0EsYUFKRCxNQUlPO0FBQ04yRyxjQUFBQSxxQkFBcUIsR0FBR2xGLE9BQU8sQ0FBQ0MsT0FBUixFQUF4QjtBQUNBOztBQUNELG1CQUFPaUYscUJBQXFCLENBQUNkLElBQXRCLENBQTJCLFlBQVc7QUFDNUNuQyxjQUFBQSxtQkFBbUIsR0FBRzlCLGdCQUFnQixDQUFDNkUsTUFBakIsQ0FBd0J4SCxXQUFXLENBQUNxQyxJQUFwQyxFQUEwQyxJQUExQyxFQUFnRHJDLFdBQVcsQ0FBQzRILFdBQTVELENBQXRCO0FBQ0EscUJBQU81RSxJQUFJLENBQUM2RSx1QkFBTCxDQUE2QmxGLGdCQUE3QixFQUErQzhCLG1CQUEvQyxFQUFvRXpFLFdBQXBFLENBQVA7QUFDQSxhQUhNLENBQVA7QUFJQTtBQUNELFNBaERpQixFQWlEakI2RyxLQWpEaUIsQ0FpRFgsVUFBU0MsTUFBVCxFQUFzQjtBQUM1QkMsVUFBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVUsdUNBQVYsRUFBbURGLE1BQW5EO0FBQ0EsZ0JBQU1BLE1BQU47QUFDQSxTQXBEaUIsQ0FBbkI7QUFxREE7O0FBQ0QsYUFBTzdDLGdCQUFnQixDQUNyQjJDLElBREssQ0FDQSxVQUFTa0IsT0FBVCxFQUF1QjtBQUM1QixZQUFJLENBQUNuRixnQkFBZ0IsQ0FBQzNCLFVBQWpCLEVBQUwsRUFBb0M7QUFDbkM7QUFDQWdDLFVBQUFBLElBQUksQ0FBQ3pDLFlBQUwsR0FBb0IsSUFBcEI7QUFDQTs7QUFDRGtFLFFBQUFBLG1CQUFtQixHQUFHQSxtQkFBbUIsSUFBS3FELE9BQU8sSUFBSUEsT0FBTyxDQUFDQyxRQUFqRSxDQUw0QixDQU01Qjs7QUFDQSxZQUFJRCxPQUFPLElBQUlBLE9BQU8sQ0FBQ0UseUJBQXZCLEVBQWtEO0FBQ2pEaEYsVUFBQUEsSUFBSSxDQUFDaUYsMkJBQUw7QUFDQTs7QUFDRCxlQUFPbkYsY0FBYyxDQUFDb0YsaUJBQWYsR0FBbUN0QixJQUFuQyxDQUF3QyxZQUFXO0FBQ3pELGlCQUFPbkMsbUJBQVA7QUFDQSxTQUZNLENBQVA7QUFHQSxPQWRLLEVBZUxvQyxLQWZLLENBZUMsVUFBU0MsTUFBVCxFQUFzQjtBQUM1QixlQUFPaEUsY0FBYyxDQUFDb0YsaUJBQWYsR0FBbUN0QixJQUFuQyxDQUF3QyxZQUFXO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBLGNBQUlFLE1BQU0sSUFBSUEsTUFBTSxDQUFDcUIsdUJBQWpCLElBQTRDMUQsbUJBQW1CLENBQUMyRCxXQUFwQixFQUFoRCxFQUFtRjtBQUNsRjtBQUNBO0FBQ0E7QUFDQTNELFlBQUFBLG1CQUFtQixDQUFDNEQsTUFBcEIsQ0FBMkIsU0FBM0I7QUFDQTs7QUFDRCxpQkFBTzdGLE9BQU8sQ0FBQ2tDLE1BQVIsQ0FBZW9DLE1BQWYsQ0FBUDtBQUNBLFNBWE0sQ0FBUDtBQVlBLE9BNUJLLEVBNkJMd0IsT0E3QkssQ0E2QkcsWUFBVztBQUNuQnhELFFBQUFBLFVBQVUsQ0FBQ3lELE1BQVgsQ0FBa0J2RixJQUFJLENBQUMzQyxXQUF2QixFQUFvQ2dFLFNBQXBDO0FBQ0EsT0EvQkssQ0FBUDtBQWdDQTtBQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0NtRSwyQixHQUFBLHFDQUE0QkMsU0FBNUIsRUFBOENDLG1CQUE5QyxFQUF3RTtBQUN2RSxVQUFJLENBQUNBLG1CQUFMLEVBQTBCO0FBQ3pCLGVBQU9sRyxPQUFPLENBQUNDLE9BQVIsRUFBUDtBQUNBOztBQUNELFVBQU1rRyxjQUFjLEdBQUdGLFNBQVMsQ0FBQ0csTUFBVixDQUFpQixVQUFTQyxPQUFULEVBQXVCbEksUUFBdkIsRUFBc0M7QUFDN0UsWUFBTXVDLFVBQVUsR0FBR3ZDLFFBQVEsQ0FBQ1MsUUFBVCxHQUFvQkMsWUFBcEIsRUFBbkI7QUFDQSxZQUFNOEIsU0FBUyxHQUFHRCxVQUFVLENBQUNFLFdBQVgsQ0FBdUJ6QyxRQUFRLENBQUNJLE9BQVQsRUFBdkIsQ0FBbEI7O0FBQ0EsWUFBSW1DLFVBQVUsQ0FBQ2tCLFNBQVgsQ0FBcUJqQixTQUFTLEdBQUcsMkNBQWpDLENBQUosRUFBbUY7QUFDbEYsY0FBTTJGLGVBQWUsR0FBR25JLFFBQVEsQ0FBQ3lELFNBQVQsR0FBcUIyRSxjQUE3QztBQUFBLGNBQ0NDLGdCQUFnQixHQUFHckksUUFBUSxDQUFDeUQsU0FBVCxHQUFxQjZFLGVBRHpDOztBQUVBLGNBQUksQ0FBQ0gsZUFBRCxJQUFvQkUsZ0JBQXhCLEVBQTBDO0FBQ3pDLGdCQUFNRSxjQUFjLEdBQUd2SSxRQUFRLENBQzdCUyxRQURxQixHQUVyQitILFdBRnFCLENBRVR4SSxRQUFRLENBQUNJLE9BQVQsS0FBcUIsZ0JBRlosRUFHckJxSSxlQUhxQixFQUF2QjtBQUlBUCxZQUFBQSxPQUFPLENBQUNRLElBQVIsQ0FBYUgsY0FBYjtBQUNBO0FBQ0Q7O0FBQ0QsZUFBT0wsT0FBUDtBQUNBLE9BZnNCLEVBZXBCLEVBZm9CLENBQXZCO0FBZ0JBLGFBQU9yRyxPQUFPLENBQUM4RyxHQUFSLENBQ05YLGNBQWMsQ0FBQ1ksR0FBZixDQUFtQixVQUFTNUksUUFBVCxFQUF3QjtBQUMxQyxlQUFPQSxRQUFRLENBQUM2SSxvQkFBVCxHQUFnQzVDLElBQWhDLENBQ04sWUFBVztBQUNWLGlCQUFPakcsUUFBUDtBQUNBLFNBSEssRUFJTixZQUFXO0FBQ1Y7QUFDQSxTQU5LLENBQVA7QUFRQSxPQVRELENBRE0sQ0FBUDtBQVlBLEs7O1dBQ0Q4SSxrQixHQUFBLDRCQUFtQnpKLFdBQW5CLEVBQXFDMEosUUFBckMsRUFBb0RqQixTQUFwRCxFQUFvRTVGLGVBQXBFLEVBQTBGO0FBQ3pGLFVBQU04RyxxQkFBcUIsR0FBRzNKLFdBQVcsQ0FBQzRKLG9CQUExQzs7QUFDQSxVQUFJRCxxQkFBcUIsSUFBSUEscUJBQXFCLENBQUNFLFdBQXRCLENBQWtDLGVBQWxDLEtBQXNEN0YsU0FBbkYsRUFBOEY7QUFDN0YsWUFBSTBGLFFBQVEsQ0FBQ0ksaUJBQVQsS0FBK0IsSUFBL0IsSUFBdUNKLFFBQVEsQ0FBQ0ssa0JBQVQsS0FBZ0MsS0FBM0UsRUFBa0Y7QUFDakY7QUFDQUosVUFBQUEscUJBQXFCLENBQUNLLFdBQXRCLENBQWtDLGVBQWxDLEVBQW1ELElBQW5EO0FBQ0EsY0FBTUMsR0FBRyxHQUFHL0MsTUFBTSxDQUFDQyxNQUFQLENBQWN3QyxxQkFBcUIsQ0FBQ3ZGLFNBQXRCLEVBQWQsRUFBaUQsRUFBakQsQ0FBWjtBQUNBNkYsVUFBQUEsR0FBRyxDQUFDQyxnQkFBSixHQUF1QkQsR0FBRyxDQUFDQyxnQkFBSixDQUFxQkMsTUFBckIsQ0FBNEIsVUFBU0MsT0FBVCxFQUF1QjtBQUN6RSxtQkFBT0gsR0FBRyxDQUFDSSxpQkFBSixDQUFzQkMsT0FBdEIsQ0FBOEJGLE9BQTlCLE1BQTJDLENBQUMsQ0FBbkQ7QUFDQSxXQUZzQixDQUF2QjtBQUdBSCxVQUFBQSxHQUFHLENBQUNJLGlCQUFKLEdBQXdCLEVBQXhCO0FBQ0FKLFVBQUFBLEdBQUcsQ0FBQ0MsZ0JBQUosR0FBdUIsRUFBdkI7QUFDQUQsVUFBQUEsR0FBRyxDQUFDTSx3QkFBSixHQUErQk4sR0FBRyxDQUFDQyxnQkFBSixDQUFxQi9ILE1BQXBEO0FBQ0F3SCxVQUFBQSxxQkFBcUIsQ0FBQ0ssV0FBdEIsQ0FBa0MsRUFBbEMsRUFBc0NDLEdBQXRDO0FBQ0EsU0FYRCxNQVdPO0FBQ05OLFVBQUFBLHFCQUFxQixDQUFDSyxXQUF0QixDQUFrQyxlQUFsQyxFQUFtRCxLQUFuRDtBQUNBTCxVQUFBQSxxQkFBcUIsQ0FBQ0ssV0FBdEIsQ0FBa0Msa0JBQWxDLEVBQXNELEVBQXREO0FBQ0FMLFVBQUFBLHFCQUFxQixDQUFDSyxXQUF0QixDQUFrQywwQkFBbEMsRUFBOEQsQ0FBOUQ7QUFDQTtBQUNEOztBQUNELFVBQUl2QixTQUFTLENBQUN0RyxNQUFWLEtBQXFCLENBQXpCLEVBQTRCO0FBQzNCcUksUUFBQUEsWUFBWSxDQUFDQyxJQUFiLENBQ0N2RSxXQUFXLENBQUN3RSxpQkFBWixDQUNDLHdEQURELEVBRUM3SCxlQUZELEVBR0MsSUFIRCxFQUlDN0MsV0FBVyxDQUFDMkssYUFKYixDQUREO0FBUUEsT0FURCxNQVNPO0FBQ05ILFFBQUFBLFlBQVksQ0FBQ0MsSUFBYixDQUNDdkUsV0FBVyxDQUFDd0UsaUJBQVosQ0FDQyxzREFERCxFQUVDN0gsZUFGRCxFQUdDLElBSEQsRUFJQzdDLFdBQVcsQ0FBQzJLLGFBSmIsQ0FERDtBQVFBO0FBQ0Q7QUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNDQyxjLEdBQUEsd0JBQWVDLFNBQWYsRUFBK0I3SyxXQUEvQixFQUFpRDZDLGVBQWpELEVBQXVFQyxjQUF2RSxFQUE0RjtBQUMzRixVQUFJZ0ksUUFBSjtBQUFBLFVBQ0NDLFNBREQ7QUFBQSxVQUVDQyxrQkFBeUIsR0FBRyxFQUY3QjtBQUFBLFVBR0NsQixpQkFBaUIsR0FBRyxLQUhyQjtBQUFBLFVBSUNtQixtQkFBbUIsR0FBRyxLQUp2QjtBQUFBLFVBS0NDLDBCQUEwQixHQUFHLEtBTDlCO0FBQUEsVUFNQ25CLGtCQU5EO0FBQUEsVUFPQ29CLGdCQUFnQixHQUFHLEtBUHBCLENBRDJGLENBUzNGOztBQUNBLFVBQU1uSSxJQUFJLEdBQUcsSUFBYjtBQUFBLFVBQ0NnQyxtQkFBbUIsR0FBR0MsR0FBRyxDQUFDQyxFQUFKLENBQU9DLE9BQVAsR0FBaUJDLHdCQUFqQixDQUEwQyxhQUExQyxDQUR2QjtBQUVBLFVBQUlnRyxPQUFKO0FBQ0EsVUFBSUMsY0FBbUIsR0FBRztBQUN6QkMsUUFBQUEsS0FBSyxFQUFFdEcsbUJBQW1CLENBQUN1RyxPQUFwQixDQUE0Qiw2QkFBNUI7QUFEa0IsT0FBMUI7QUFHQXpHLE1BQUFBLFVBQVUsQ0FBQ0MsSUFBWCxDQUFnQixLQUFLMUUsV0FBckI7O0FBQ0EsVUFBSSxDQUFDbUwsS0FBSyxDQUFDQyxPQUFOLENBQWNaLFNBQWQsQ0FBTCxFQUErQjtBQUM5QkEsUUFBQUEsU0FBUyxHQUFHLENBQUNBLFNBQUQsQ0FBWjtBQUNBOztBQUNEckksTUFBQUEsT0FBTyxDQUFDQyxPQUFSLENBQWdCLEtBQUsvQixtQkFBTCxDQUF5Qm1LLFNBQVMsQ0FBQyxDQUFELENBQWxDLENBQWhCLEVBQ0VqRSxJQURGLENBQ08sVUFBU2hHLGlCQUFULEVBQWlDO0FBQ3RDLFlBQUlaLFdBQUosRUFBaUI7QUFDaEIsY0FBSSxDQUFDQSxXQUFXLENBQUN1Syx3QkFBakIsRUFBMkM7QUFDMUMsZ0JBQUkzSixpQkFBaUIsS0FBS2hCLGdCQUFnQixDQUFDMEIsS0FBM0MsRUFBa0Q7QUFDakQsbUJBQUssSUFBSW9LLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdiLFNBQVMsQ0FBQzFJLE1BQTlCLEVBQXNDdUosQ0FBQyxFQUF2QyxFQUEyQztBQUMxQyxvQkFBTUMsWUFBWSxHQUFHZCxTQUFTLENBQUNhLENBQUQsQ0FBVCxDQUFhdEgsU0FBYixFQUFyQjs7QUFDQSxvQkFDQ3VILFlBQVksQ0FBQzVDLGNBQWIsS0FBZ0MsSUFBaEMsSUFDQTRDLFlBQVksQ0FBQ0MsY0FBYixLQUFnQyxJQURoQyxJQUVBRCxZQUFZLENBQUNFLHVCQUZiLElBR0FGLFlBQVksQ0FBQ0UsdUJBQWIsQ0FBcUNDLGVBSHJDLElBSUEsQ0FBQ0gsWUFBWSxDQUFDRSx1QkFBYixDQUFxQ0Usa0JBTHZDLEVBTUU7QUFDREMsa0JBQUFBLFVBQVUsQ0FBQ3ZCLElBQVgsQ0FDQ3ZFLFdBQVcsQ0FBQ3dFLGlCQUFaLENBQ0MsMkVBREQsRUFFQzdILGVBRkQsQ0FERCxFQUtDO0FBQ0N5SSxvQkFBQUEsS0FBSyxFQUFFdEcsbUJBQW1CLENBQUN1RyxPQUFwQixDQUE0Qiw2QkFBNUIsQ0FEUjtBQUVDVSxvQkFBQUEsT0FBTyxFQUFFbkI7QUFGVixtQkFMRDtBQVVBO0FBQ0E7QUFDRDtBQUNEOztBQUNEOUssWUFBQUEsV0FBVyxHQUFHRCxhQUFhLENBQUNDLFdBQUQsQ0FBM0I7O0FBQ0EsZ0JBQUlBLFdBQVcsQ0FBQ3NMLEtBQWhCLEVBQXVCO0FBQ3RCLGtCQUFJdEwsV0FBVyxDQUFDa00sV0FBaEIsRUFBNkI7QUFDNUJkLGdCQUFBQSxPQUFPLEdBQUcsQ0FBQ3BMLFdBQVcsQ0FBQ3NMLEtBQWIsRUFBb0J0TCxXQUFXLENBQUNrTSxXQUFoQyxDQUFWO0FBQ0EsZUFGRCxNQUVPO0FBQ05kLGdCQUFBQSxPQUFPLEdBQUcsQ0FBQ3BMLFdBQVcsQ0FBQ3NMLEtBQWIsRUFBb0IsRUFBcEIsQ0FBVjtBQUNBOztBQUNERCxjQUFBQSxjQUFjLENBQUNjLElBQWYsR0FBc0JqRyxXQUFXLENBQUN3RSxpQkFBWixDQUNyQixpRUFEcUIsRUFFckI3SCxlQUZxQixFQUdyQnVJLE9BSHFCLEVBSXJCcEwsV0FBVyxDQUFDMkssYUFKUyxDQUF0QjtBQU1BLGFBWkQsTUFZTztBQUNOVSxjQUFBQSxjQUFjLENBQUNjLElBQWYsR0FBc0JqRyxXQUFXLENBQUN3RSxpQkFBWixDQUNyQiwyRUFEcUIsRUFFckI3SCxlQUZxQixDQUF0QjtBQUlBOztBQUNEbUksWUFBQUEsa0JBQWtCLEdBQUdILFNBQXJCO0FBQ0EsV0E3Q0QsTUE2Q087QUFDTlEsWUFBQUEsY0FBYyxHQUFHO0FBQ2hCQyxjQUFBQSxLQUFLLEVBQUV0RyxtQkFBbUIsQ0FBQ3VHLE9BQXBCLENBQTRCLDZCQUE1QjtBQURTLGFBQWpCOztBQUdBLGdCQUFJdkwsV0FBVyxDQUFDdUssd0JBQVosS0FBeUMsQ0FBekMsSUFBOEN2SyxXQUFXLENBQUN1Syx3QkFBWixLQUF5Q00sU0FBUyxDQUFDMUksTUFBckcsRUFBNkc7QUFDNUc2SSxjQUFBQSxrQkFBa0IsR0FBR0gsU0FBckI7QUFDQVEsY0FBQUEsY0FBYyxDQUFDYyxJQUFmLEdBQXNCakcsV0FBVyxDQUFDd0UsaUJBQVosQ0FDckIsMkVBRHFCLEVBRXJCN0gsZUFGcUIsRUFHckIsSUFIcUIsRUFJckI3QyxXQUFXLENBQUMySyxhQUpTLENBQXRCO0FBTUEsYUFSRCxNQVFPLElBQUkzSyxXQUFXLENBQUN1Syx3QkFBWixLQUF5QyxDQUF6QyxJQUE4Q3ZLLFdBQVcsQ0FBQ29NLGVBQVosQ0FBNEJqSyxNQUE1QixLQUF1QyxDQUF6RixFQUE0RjtBQUNsRztBQUNBNkksY0FBQUEsa0JBQWtCLEdBQUdoTCxXQUFXLENBQUNvTSxlQUFqQztBQUNBLGtCQUFNQyxjQUFjLEdBQUdyQixrQkFBa0IsQ0FBQyxDQUFELENBQWxCLENBQXNCNUcsU0FBdEIsR0FBa0MseUJBQWxDLENBQXZCO0FBQ0Esa0JBQUlrSSxrQkFBa0IsR0FBRyxFQUF6Qjs7QUFDQSxrQkFBSUQsY0FBSixFQUFvQjtBQUNuQkMsZ0JBQUFBLGtCQUFrQixHQUNqQkQsY0FBYyxDQUFDLDhCQUFELENBQWQsSUFBa0RBLGNBQWMsQ0FBQyxtQkFBRCxDQUFoRSxJQUF5RixFQUQxRjtBQUVBOztBQUNEakIsY0FBQUEsT0FBTyxHQUFHLENBQUNrQixrQkFBRCxDQUFWO0FBQ0FqQixjQUFBQSxjQUFjLENBQUNjLElBQWYsR0FBc0JqRyxXQUFXLENBQUN3RSxpQkFBWixDQUNyQixzRUFEcUIsRUFFckI3SCxlQUZxQixFQUdyQnVJLE9BSHFCLENBQXRCO0FBS0EsYUFmTSxNQWVBLElBQUlwTCxXQUFXLENBQUN1Syx3QkFBWixLQUF5Q3ZLLFdBQVcsQ0FBQ29NLGVBQVosQ0FBNEJqSyxNQUF6RSxFQUFpRjtBQUN2RjtBQUNBNkksY0FBQUEsa0JBQWtCLEdBQUdoTCxXQUFXLENBQUNvTSxlQUFqQztBQUNBZixjQUFBQSxjQUFjLENBQUNjLElBQWYsR0FBc0JqRyxXQUFXLENBQUN3RSxpQkFBWixDQUNyQix1RkFEcUIsRUFFckI3SCxlQUZxQixDQUF0QjtBQUlBLGFBUE0sTUFPQSxJQUNON0MsV0FBVyxDQUFDdUssd0JBQVosS0FDQU0sU0FBUyxDQUFDMEIsTUFBVixDQUFpQnZNLFdBQVcsQ0FBQ29NLGVBQVosQ0FBNEJHLE1BQTVCLENBQW1Ddk0sV0FBVyxDQUFDd00sY0FBL0MsQ0FBakIsRUFBaUZySyxNQUYzRSxFQUdMO0FBQ0Q7QUFDQTZJLGNBQUFBLGtCQUFrQixHQUFHSCxTQUFTLENBQUMwQixNQUFWLENBQWlCdk0sV0FBVyxDQUFDb00sZUFBN0IsQ0FBckI7QUFDQWYsY0FBQUEsY0FBYyxDQUFDYyxJQUFmLEdBQ0NuQixrQkFBa0IsQ0FBQzdJLE1BQW5CLEtBQThCLENBQTlCLEdBQ0crRCxXQUFXLENBQUN3RSxpQkFBWixDQUNBLDJFQURBLEVBRUE3SCxlQUZBLEVBR0EsSUFIQSxFQUlBN0MsV0FBVyxDQUFDMkssYUFKWixDQURILEdBT0d6RSxXQUFXLENBQUN3RSxpQkFBWixDQUNBLHlFQURBLEVBRUE3SCxlQUZBLEVBR0EsSUFIQSxFQUlBN0MsV0FBVyxDQUFDMkssYUFKWixDQVJKO0FBY0EsYUFwQk0sTUFvQkE7QUFDTjtBQUNBSyxjQUFBQSxrQkFBa0IsR0FBR0gsU0FBUyxDQUFDMEIsTUFBVixDQUFpQnZNLFdBQVcsQ0FBQ29NLGVBQTdCLENBQXJCO0FBQ0FsQixjQUFBQSwwQkFBMEIsR0FBRyxJQUE3QjtBQUNBRyxjQUFBQSxjQUFjLENBQUNjLElBQWYsR0FDQ25CLGtCQUFrQixDQUFDN0ksTUFBbkIsS0FBOEIsQ0FBOUIsR0FDRytELFdBQVcsQ0FBQ3dFLGlCQUFaLENBQ0EseUZBREEsRUFFQTdILGVBRkEsRUFHQSxJQUhBLEVBSUE3QyxXQUFXLENBQUMySyxhQUpaLENBREgsR0FPR3pFLFdBQVcsQ0FBQ3dFLGlCQUFaLENBQ0EsdUZBREEsRUFFQTdILGVBRkEsRUFHQSxJQUhBLEVBSUE3QyxXQUFXLENBQUMySyxhQUpaLENBUko7QUFjQVUsY0FBQUEsY0FBYyxDQUFDb0IsZ0JBQWYsR0FBa0N2RyxXQUFXLENBQUN3RSxpQkFBWixDQUNqQywrRkFEaUMsRUFFakM3SCxlQUZpQyxFQUdqQyxDQUNDN0MsV0FBVyxDQUFDdUssd0JBQVosR0FBdUNNLFNBQVMsQ0FBQzBCLE1BQVYsQ0FBaUJ2TSxXQUFXLENBQUNvTSxlQUE3QixFQUE4Q2pLLE1BRHRGLEVBRUNuQyxXQUFXLENBQUN1Syx3QkFGYixDQUhpQyxDQUFsQztBQVFBOztBQUNELGdCQUFJdkssV0FBVyxDQUFDd00sY0FBWixDQUEyQnJLLE1BQTNCLElBQXFDLENBQXpDLEVBQTRDO0FBQzNDO0FBQ0E4SSxjQUFBQSxtQkFBbUIsR0FBRyxJQUF0QjtBQUNBSSxjQUFBQSxjQUFjLENBQUNvQixnQkFBZixHQUFrQ3ZHLFdBQVcsQ0FBQ3dFLGlCQUFaLENBQ2pDLHVGQURpQyxFQUVqQzdILGVBRmlDLEVBR2pDLENBQUM3QyxXQUFXLENBQUN1Syx3QkFBYixDQUhpQyxDQUFsQztBQUtBOztBQUNELGdCQUFJdkssV0FBVyxDQUFDd00sY0FBWixDQUEyQnJLLE1BQTNCLEdBQW9DLENBQXhDLEVBQTJDO0FBQzFDO0FBQ0E4SSxjQUFBQSxtQkFBbUIsR0FBRyxJQUF0QjtBQUNBSSxjQUFBQSxjQUFjLENBQUNvQixnQkFBZixHQUFrQ3ZHLFdBQVcsQ0FBQ3dFLGlCQUFaLENBQ2pDLHdGQURpQyxFQUVqQzdILGVBRmlDLEVBR2pDLENBQUM3QyxXQUFXLENBQUN3TSxjQUFaLENBQTJCckssTUFBNUIsRUFBb0NuQyxXQUFXLENBQUN1Syx3QkFBaEQsQ0FIaUMsQ0FBbEM7QUFLQTs7QUFDRCxnQkFDQ3ZLLFdBQVcsQ0FBQ29NLGVBQVosQ0FBNEJqSyxNQUE1QixHQUFxQyxDQUFyQyxJQUNBbkMsV0FBVyxDQUFDb00sZUFBWixDQUE0QmpLLE1BQTVCLEtBQXVDbkMsV0FBVyxDQUFDdUssd0JBRnBELEVBR0U7QUFDRCxrQkFDQyxDQUFDVywwQkFBMEIsSUFBSUQsbUJBQS9CLEtBQ0FELGtCQUFrQixDQUFDN0ksTUFBbkIsS0FBOEJuQyxXQUFXLENBQUNvTSxlQUFaLENBQTRCakssTUFGM0QsRUFHRTtBQUNEO0FBQ0EySCxnQkFBQUEsaUJBQWlCLEdBQUcsS0FBcEI7QUFDQWtCLGdCQUFBQSxrQkFBa0IsR0FBR2hMLFdBQVcsQ0FBQ29NLGVBQWpDOztBQUNBLG9CQUFJcE0sV0FBVyxDQUFDb00sZUFBWixDQUE0QmpLLE1BQTVCLEtBQXVDLENBQTNDLEVBQThDO0FBQzdDa0osa0JBQUFBLGNBQWMsQ0FBQ2MsSUFBZixHQUFzQmpHLFdBQVcsQ0FBQ3dFLGlCQUFaLENBQ3JCLDhGQURxQixFQUVyQjdILGVBRnFCLENBQXRCO0FBSUEsaUJBTEQsTUFLTztBQUNOd0ksa0JBQUFBLGNBQWMsQ0FBQ2MsSUFBZixHQUFzQmpHLFdBQVcsQ0FBQ3dFLGlCQUFaLENBQ3JCLDRGQURxQixFQUVyQjdILGVBRnFCLENBQXRCO0FBSUE7QUFDRCxlQWxCRCxNQWtCTztBQUNOLG9CQUFJN0MsV0FBVyxDQUFDb00sZUFBWixDQUE0QmpLLE1BQTVCLEtBQXVDLENBQTNDLEVBQThDO0FBQzdDa0osa0JBQUFBLGNBQWMsQ0FBQ3FCLFlBQWYsR0FBOEJ4RyxXQUFXLENBQUN3RSxpQkFBWixDQUM3QixrR0FENkIsRUFFN0I3SCxlQUY2QixDQUE5QjtBQUlBLGlCQUxELE1BS087QUFDTndJLGtCQUFBQSxjQUFjLENBQUNxQixZQUFmLEdBQThCeEcsV0FBVyxDQUFDd0UsaUJBQVosQ0FDN0IsZ0dBRDZCLEVBRTdCN0gsZUFGNkIsQ0FBOUI7QUFJQTs7QUFDRGlILGdCQUFBQSxpQkFBaUIsR0FBRyxJQUFwQjtBQUNBO0FBQ0Q7O0FBQ0QsZ0JBQUlvQiwwQkFBMEIsSUFBSUQsbUJBQWxDLEVBQXVEO0FBQ3REO0FBQ0Esa0JBQUlqTCxXQUFXLENBQUNvTSxlQUFaLENBQTRCakssTUFBNUIsR0FBcUMsQ0FBekMsRUFBNEM7QUFDM0NrSixnQkFBQUEsY0FBYyxDQUFDb0IsZ0JBQWYsR0FBa0N2RyxXQUFXLENBQUN3RSxpQkFBWixDQUNqQywwR0FEaUMsRUFFakM3SCxlQUZpQyxFQUdqQyxDQUNDN0MsV0FBVyxDQUFDdUssd0JBQVosR0FDQ00sU0FBUyxDQUFDMEIsTUFBVixDQUFpQnZNLFdBQVcsQ0FBQ29NLGVBQTdCLEVBQThDakssTUFEL0MsR0FFQ25DLFdBQVcsQ0FBQ3dNLGNBQVosQ0FBMkJySyxNQUg3QixFQUlDbkMsV0FBVyxDQUFDd00sY0FBWixDQUEyQnJLLE1BSjVCLEVBS0NuQyxXQUFXLENBQUN1Syx3QkFMYixDQUhpQyxDQUFsQztBQVdBOztBQUNELGtCQUFJdkssV0FBVyxDQUFDb00sZUFBWixDQUE0QmpLLE1BQTVCLElBQXNDLENBQTFDLEVBQTZDO0FBQzVDa0osZ0JBQUFBLGNBQWMsQ0FBQ29CLGdCQUFmLEdBQWtDdkcsV0FBVyxDQUFDd0UsaUJBQVosQ0FDakMseUdBRGlDLEVBRWpDN0gsZUFGaUMsRUFHakMsQ0FDQzdDLFdBQVcsQ0FBQ3VLLHdCQUFaLEdBQ0NNLFNBQVMsQ0FBQzBCLE1BQVYsQ0FBaUJ2TSxXQUFXLENBQUNvTSxlQUE3QixFQUE4Q2pLLE1BRC9DLEdBRUNuQyxXQUFXLENBQUN3TSxjQUFaLENBQTJCckssTUFIN0IsRUFJQ25DLFdBQVcsQ0FBQ3VLLHdCQUpiLENBSGlDLENBQWxDO0FBVUE7QUFDRDtBQUNEO0FBQ0Q7O0FBQ0QsWUFBSW9DLCtCQUFKLEVBQXFDQyx5QkFBckM7QUFDQSxZQUFNQyxRQUFRLEdBQUcsSUFBSUMsSUFBSixDQUFTO0FBQ3pCQyxVQUFBQSxLQUFLLEVBQUUsQ0FDTEosK0JBQStCLEdBQUcsSUFBSUssSUFBSixDQUFTO0FBQzNDYixZQUFBQSxJQUFJLEVBQUVkLGNBQWMsQ0FBQ29CLGdCQURzQjtBQUUzQ1EsWUFBQUEsT0FBTyxFQUFFaEMsbUJBQW1CLElBQUlDO0FBRlcsV0FBVCxDQUQ3QixFQUtMMEIseUJBQXlCLEdBQUcsSUFBSUksSUFBSixDQUFTO0FBQ3JDYixZQUFBQSxJQUFJLEVBQUVkLGNBQWMsQ0FBQ2M7QUFEZ0IsV0FBVCxDQUx2QixFQVFOLElBQUllLFFBQUosQ0FBYTtBQUNaZixZQUFBQSxJQUFJLEVBQUVkLGNBQWMsQ0FBQ3FCLFlBRFQ7QUFFWlMsWUFBQUEsUUFBUSxFQUFFLElBRkU7QUFHWkMsWUFBQUEsTUFBTSxFQUFFLFVBQVNDLE1BQVQsRUFBc0I7QUFDN0Isa0JBQU1GLFFBQVEsR0FBR0UsTUFBTSxDQUFDQyxTQUFQLEdBQW1CQyxXQUFuQixFQUFqQjs7QUFDQSxrQkFBSUosUUFBSixFQUFjO0FBQ2JuQyxnQkFBQUEsa0JBQWtCLEdBQUdILFNBQVMsQ0FBQzBCLE1BQVYsQ0FBaUJ2TSxXQUFXLENBQUNvTSxlQUE3QixDQUFyQjtBQUNBckMsZ0JBQUFBLGtCQUFrQixHQUFHLElBQXJCO0FBQ0EsZUFIRCxNQUdPO0FBQ05pQixnQkFBQUEsa0JBQWtCLEdBQUdILFNBQXJCO0FBQ0FkLGdCQUFBQSxrQkFBa0IsR0FBRyxLQUFyQjtBQUNBO0FBQ0QsYUFaVztBQWFaa0QsWUFBQUEsT0FBTyxFQUFFbkQ7QUFiRyxXQUFiLENBUk07QUFEa0IsU0FBVCxDQUFqQjtBQTBCQSxZQUFNMEQsTUFBTSxHQUFHeEksbUJBQW1CLENBQUN1RyxPQUFwQixDQUE0Qiw2QkFBNUIsQ0FBZjs7QUFDQSxZQUFNa0MsU0FBUyxHQUFHLFlBQVc7QUFDNUJ0QyxVQUFBQSxnQkFBZ0IsR0FBRyxJQUFuQjtBQUNBckcsVUFBQUEsVUFBVSxDQUFDQyxJQUFYLENBQWdCL0IsSUFBSSxDQUFDM0MsV0FBckI7QUFDQSxjQUFNb0ksU0FBUyxHQUFHdUMsa0JBQWxCO0FBQ0EsY0FBSTBDLHFCQUFKOztBQUNBLGNBQUkxTixXQUFXLENBQUMyTixvQkFBaEIsRUFBc0M7QUFDckNELFlBQUFBLHFCQUFxQixHQUFHMU4sV0FBVyxDQUFDMk4sb0JBQVosQ0FBaUM7QUFBRXJJLGNBQUFBLFFBQVEsRUFBRW1EO0FBQVosYUFBakMsQ0FBeEI7QUFDQSxXQUZELE1BRU87QUFDTmlGLFlBQUFBLHFCQUFxQixHQUFHbEwsT0FBTyxDQUFDQyxPQUFSLEVBQXhCO0FBQ0E7O0FBQ0QsaUJBQU9pTCxxQkFBcUIsQ0FDMUI5RyxJQURLLENBQ0E1RCxJQUFJLENBQUN3RiwyQkFBTCxDQUFpQ29GLElBQWpDLENBQXNDNUssSUFBdEMsRUFBNEN5RixTQUE1QyxFQUF1RHpJLFdBQVcsQ0FBQzBJLG1CQUFuRSxDQURBLEVBRUw5QixJQUZLLENBRUEsVUFBUytCLGNBQVQsRUFBOEI7QUFDbkM7QUFDQSxtQkFBT25HLE9BQU8sQ0FBQzhHLEdBQVIsQ0FDTmIsU0FBUyxDQUFDYyxHQUFWLENBQWMsVUFBUzVJLFFBQVQsRUFBd0I7QUFDckM7QUFDQSxxQkFBT2tOLEtBQUssQ0FBQ0MsV0FBTixDQUFrQm5OLFFBQWxCLENBQVA7QUFDQSxhQUhELENBRE0sRUFNTGtHLEtBTkssQ0FNQyxVQUFTQyxNQUFULEVBQXNCO0FBQzVCLHFCQUFPaEUsY0FBYyxDQUFDaUwsWUFBZixHQUE4Qm5ILElBQTlCLENBQW1DLFlBQVc7QUFDcEQ7QUFDQSxzQkFBTUUsTUFBTjtBQUNBLGVBSE0sQ0FBUDtBQUlBLGFBWEssRUFZTEYsSUFaSyxDQVlBLFlBQVc7QUFDaEIsa0JBQU04QyxRQUFRLEdBQUc7QUFDaEIscUNBQXFCSSxpQkFETDtBQUVoQixzQ0FBc0JDO0FBRk4sZUFBakI7O0FBSUEsa0JBQUlwQixjQUFjLElBQUlBLGNBQWMsQ0FBQ3hHLE1BQXJDLEVBQTZDO0FBQzVDLHVCQUFPSyxPQUFPLENBQUM4RyxHQUFSLENBQ05YLGNBQWMsQ0FBQ1ksR0FBZixDQUFtQixVQUFTNUksUUFBVCxFQUF3QjtBQUMxQyx5QkFBT0EsUUFBUSxDQUFDMEgsTUFBVCxFQUFQO0FBQ0EsaUJBRkQsQ0FETSxFQUlMekIsSUFKSyxDQUlBLFlBQVc7QUFDakI1RCxrQkFBQUEsSUFBSSxDQUFDeUcsa0JBQUwsQ0FBd0J6SixXQUF4QixFQUFxQzBKLFFBQXJDLEVBQStDakIsU0FBL0MsRUFBMEQ1RixlQUExRDtBQUNBLHlCQUFPQyxjQUFjLENBQUNvRixpQkFBZixHQUFtQ3RCLElBQW5DLENBQXdDbUUsU0FBeEMsQ0FBUDtBQUNBLGlCQVBNLENBQVA7QUFRQSxlQVRELE1BU087QUFDTi9ILGdCQUFBQSxJQUFJLENBQUN5RyxrQkFBTCxDQUF3QnpKLFdBQXhCLEVBQXFDMEosUUFBckMsRUFBK0NqQixTQUEvQyxFQUEwRDVGLGVBQTFEO0FBQ0EsdUJBQU9DLGNBQWMsQ0FBQ29GLGlCQUFmLEdBQW1DdEIsSUFBbkMsQ0FBd0NtRSxTQUF4QyxDQUFQO0FBQ0E7QUFDRCxhQTlCSyxDQUFQO0FBK0JBLFdBbkNLLEVBb0NMbEUsS0FwQ0ssQ0FvQ0MsWUFBVztBQUNqQmlFLFlBQUFBLFFBQVE7QUFDUixXQXRDSyxFQXVDTHhDLE9BdkNLLENBdUNHLFlBQVc7QUFDbkJ4RCxZQUFBQSxVQUFVLENBQUN5RCxNQUFYLENBQWtCdkYsSUFBSSxDQUFDM0MsV0FBdkI7QUFDQSxXQXpDSyxDQUFQO0FBMENBLFNBcEREOztBQXFEQSxZQUFNMk4sT0FBTyxHQUFHLElBQUlDLE1BQUosQ0FBVztBQUMxQjNDLFVBQUFBLEtBQUssRUFBRWtDLE1BRG1CO0FBRTFCVSxVQUFBQSxLQUFLLEVBQUUsU0FGbUI7QUFHMUJDLFVBQUFBLE9BQU8sRUFBRSxDQUFDdEIsUUFBRCxDQUhpQjtBQUkxQnVCLFVBQUFBLGNBQWMsRUFBRXpCLCtCQUErQixDQUFDMEIsVUFBaEMsS0FDYixDQUFDMUIsK0JBQUQsRUFBa0NDLHlCQUFsQyxDQURhLEdBRWJBLHlCQU51QjtBQU8xQjBCLFVBQUFBLFdBQVcsRUFBRSxJQUFJQyxNQUFKLENBQVc7QUFDdkJwQyxZQUFBQSxJQUFJLEVBQUVuSCxtQkFBbUIsQ0FBQ3VHLE9BQXBCLENBQTRCLDZCQUE1QixDQURpQjtBQUV2QmlELFlBQUFBLElBQUksRUFBRSxZQUZpQjtBQUd2QkMsWUFBQUEsS0FBSyxFQUFFLFlBQVc7QUFDakJULGNBQUFBLE9BQU8sQ0FBQ1UsS0FBUjtBQUNBLHFCQUFPakIsU0FBUyxFQUFoQjtBQUNBO0FBTnNCLFdBQVgsQ0FQYTtBQWUxQmtCLFVBQUFBLFNBQVMsRUFBRSxJQUFJSixNQUFKLENBQVc7QUFDckJwQyxZQUFBQSxJQUFJLEVBQUVqRyxXQUFXLENBQUN3RSxpQkFBWixDQUE4Qiw2QkFBOUIsRUFBNkQ3SCxlQUE3RCxDQURlO0FBRXJCNEwsWUFBQUEsS0FBSyxFQUFFLFlBQVc7QUFDakJULGNBQUFBLE9BQU8sQ0FBQ1UsS0FBUjtBQUNBO0FBSm9CLFdBQVgsQ0FmZTtBQXFCMUJFLFVBQUFBLFVBQVUsRUFBRSxZQUFXO0FBQ3RCWixZQUFBQSxPQUFPLENBQUNhLE9BQVIsR0FEc0IsQ0FFdEI7O0FBQ0EsZ0JBQUksQ0FBQzFELGdCQUFMLEVBQXVCO0FBQ3RCTCxjQUFBQSxRQUFRO0FBQ1I7QUFDRDtBQTNCeUIsU0FBWCxDQUFoQjs7QUE2QkEsWUFBSTlLLFdBQVcsQ0FBQzhPLFFBQWhCLEVBQTBCO0FBQ3pCLGlCQUFPckIsU0FBUyxFQUFoQjtBQUNBLFNBRkQsTUFFTztBQUNOTyxVQUFBQSxPQUFPLENBQUNlLGFBQVIsQ0FBc0IscUJBQXRCO0FBQ0FmLFVBQUFBLE9BQU8sQ0FBQ2dCLElBQVI7QUFDQTtBQUNELE9BMVVGLEVBMlVFMUcsT0EzVUYsQ0EyVVUsWUFBVztBQUNuQnhELFFBQUFBLFVBQVUsQ0FBQ3lELE1BQVgsQ0FBa0J2RixJQUFJLENBQUMzQyxXQUF2QjtBQUNBLE9BN1VGLEVBOFVFd0csS0E5VUYsQ0E4VVEsWUFBVztBQUNqQkUsUUFBQUEsR0FBRyxDQUFDa0ksT0FBSixDQUFZLGdDQUFaO0FBQ0FuRSxRQUFBQSxRQUFRO0FBQ1IsT0FqVkY7QUFrVkEsYUFBTyxJQUFJdEksT0FBSixDQUFZLFVBQVNDLE9BQVQsRUFBd0NpQyxNQUF4QyxFQUF3RTtBQUMxRm9HLFFBQUFBLFFBQVEsR0FBR3BHLE1BQVg7QUFDQXFHLFFBQUFBLFNBQVMsR0FBR3RJLE9BQVo7QUFDQSxPQUhNLENBQVA7QUFJQTtBQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0N5TSxZLEdBQUEsc0JBQWF2TyxRQUFiLEVBQTRCZ0IsS0FBNUIsRUFBMkNtQixjQUEzQyxFQUFnRTtBQUMvRDtBQUNBLFVBQU1FLElBQUksR0FBRyxJQUFiO0FBQ0EsVUFBTXBDLGlCQUFpQixHQUFHLEtBQUtGLG1CQUFMLENBQXlCQyxRQUF6QixDQUExQjtBQUNBLFVBQUl3TyxZQUFKOztBQUNBLFVBQUksQ0FBQ3hPLFFBQUwsRUFBZTtBQUNkLGVBQU82QixPQUFPLENBQUNrQyxNQUFSLENBQWUsSUFBSTBLLEtBQUosQ0FBVSxnREFBVixDQUFmLENBQVA7QUFDQTs7QUFDRCxXQUFLOU8sWUFBTCxHQUFvQixLQUFwQjtBQUNBd0UsTUFBQUEsVUFBVSxDQUFDQyxJQUFYLENBQWdCL0IsSUFBSSxDQUFDM0MsV0FBckIsRUFUK0QsQ0FVL0Q7O0FBQ0F5QyxNQUFBQSxjQUFjLENBQUN1TSx3QkFBZjs7QUFDQSxVQUFJek8saUJBQWlCLEtBQUtoQixnQkFBZ0IsQ0FBQzBCLEtBQTNDLEVBQWtEO0FBQ2pENk4sUUFBQUEsWUFBWSxHQUFHdEIsS0FBSyxDQUFDeUIsNkJBQU4sQ0FBb0MzTyxRQUFwQyxFQUE4QyxLQUFLNEMsZ0JBQUwsRUFBOUMsRUFBdUU7QUFDckZnTSxVQUFBQSxnQkFBZ0IsRUFBRSxJQURtRTtBQUVyRjVOLFVBQUFBLEtBQUssRUFBRUE7QUFGOEUsU0FBdkUsQ0FBZjtBQUlBLE9BTEQsTUFLTyxJQUFJZixpQkFBaUIsS0FBS2hCLGdCQUFnQixDQUFDNEIsTUFBM0MsRUFBbUQ7QUFDekQyTixRQUFBQSxZQUFZLEdBQUdLLE1BQU0sQ0FBQ0MsMkJBQVAsQ0FBbUM5TyxRQUFuQyxFQUE2QyxLQUFLNEMsZ0JBQUwsRUFBN0MsQ0FBZjtBQUNBLE9BRk0sTUFFQTtBQUNOdUIsUUFBQUEsVUFBVSxDQUFDeUQsTUFBWCxDQUFrQnZGLElBQUksQ0FBQzNDLFdBQXZCO0FBQ0EsZUFBT21DLE9BQU8sQ0FBQ2tDLE1BQVIsQ0FBZSxJQUFJMEssS0FBSixDQUFVLHFFQUFWLENBQWYsQ0FBUDtBQUNBOztBQUNELGFBQU9ELFlBQVksQ0FDakJ2SSxJQURLLENBQ0EsVUFBUzhJLFdBQVQsRUFBMkI7QUFDaEMxTSxRQUFBQSxJQUFJLENBQUN6QyxZQUFMLEdBQW9CLEtBQXBCO0FBQ0EsZUFBT3VDLGNBQWMsQ0FBQ29GLGlCQUFmLEdBQW1DdEIsSUFBbkMsQ0FBd0MsWUFBVztBQUN6RCxpQkFBTzhJLFdBQVA7QUFDQSxTQUZNLENBQVA7QUFHQSxPQU5LLEVBT0w3SSxLQVBLLENBT0MsVUFBUzhJLEdBQVQsRUFBbUI7QUFDekIsZUFBTzdNLGNBQWMsQ0FBQ2lMLFlBQWYsR0FBOEJuSCxJQUE5QixDQUFtQyxZQUFXO0FBQ3BELGlCQUFPcEUsT0FBTyxDQUFDa0MsTUFBUixDQUFlaUwsR0FBZixDQUFQO0FBQ0EsU0FGTSxDQUFQO0FBR0EsT0FYSyxFQVlMckgsT0FaSyxDQVlHLFlBQVc7QUFDbkJ4RCxRQUFBQSxVQUFVLENBQUN5RCxNQUFYLENBQWtCdkYsSUFBSSxDQUFDM0MsV0FBdkI7QUFDQSxPQWRLLENBQVA7QUFlQTtBQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0N1UCxjLEdBQUEsd0JBQ0NqUCxRQURELEVBRUNpQyxhQUZELEVBR0NDLGVBSEQsRUFJQ0MsY0FKRCxFQUtFO0FBQ0Q7QUFDQSxVQUFNRSxJQUFJLEdBQUcsSUFBYjtBQUNBLFVBQUlwQyxpQkFBSixDQUhDLENBSUQ7O0FBQ0EsVUFBSSxDQUFDRCxRQUFMLEVBQWU7QUFDZCxlQUFPNkIsT0FBTyxDQUFDa0MsTUFBUixDQUFlLDhDQUFmLENBQVA7QUFDQTs7QUFDREksTUFBQUEsVUFBVSxDQUFDQyxJQUFYLENBQWdCL0IsSUFBSSxDQUFDM0MsV0FBckI7QUFDQSxVQUFNTCxXQUFXLEdBQUdELGFBQWEsQ0FBQzZDLGFBQUQsQ0FBakM7QUFDQSxVQUFNaU4sY0FBYyxHQUFHbFAsUUFBdkI7QUFBQSxVQUNDbVAsYUFBYSxHQUFHOVAsV0FBVyxDQUFDK1AsWUFEN0I7QUFBQSxVQUVDOU0sTUFBTSxHQUFHNE0sY0FBYyxDQUFDek8sUUFBZixFQUZWO0FBR0EsVUFBSTRPLHFCQUFKLEVBQTJCQyxjQUEzQjtBQUNBLGFBQU96TixPQUFPLENBQUNDLE9BQVIsQ0FBZ0IsS0FBSy9CLG1CQUFMLENBQXlCQyxRQUF6QixDQUFoQixFQUNMaUcsSUFESyxDQUNBLFVBQVNzSixPQUFULEVBQXVCO0FBQzVCdFAsUUFBQUEsaUJBQWlCLEdBQUdzUCxPQUFwQjs7QUFDQSxZQUFJQSxPQUFPLEtBQUt0USxnQkFBZ0IsQ0FBQzBCLEtBQWpDLEVBQXdDO0FBQ3ZDLGNBQU02TyxnQkFBZ0IsR0FBR2xOLE1BQU0sQ0FBQ2tHLFdBQVAsQ0FBbUIwRyxjQUFjLENBQUM5TyxPQUFmLEtBQTJCLDBCQUE5QyxFQUEwRXFJLGVBQTFFLEVBQXpCOztBQUNBLGNBQUksQ0FBQ3BHLElBQUksQ0FBQzFDLFlBQVYsRUFBd0I7QUFDdkIsbUJBQU82UCxnQkFBZ0IsQ0FBQ0MsYUFBakIsR0FBaUN4SixJQUFqQyxDQUFzQyxVQUFTeUYsY0FBVCxFQUE4QjtBQUMxRSxrQkFBSUEsY0FBSixFQUFvQjtBQUNuQnJKLGdCQUFBQSxJQUFJLENBQUMxQyxZQUFMLEdBQW9CLEVBQUUrTCxjQUFjLENBQUNnRSxnQkFBZixLQUFvQ2hFLGNBQWMsQ0FBQ2lFLGtCQUFyRCxDQUFwQjtBQUNBO0FBQ0QsYUFKTSxDQUFQO0FBS0E7QUFDRDtBQUNELE9BYkssRUFjTDFKLElBZEssQ0FjQSxZQUFXO0FBQ2hCLFlBQUksQ0FBQzVHLFdBQVcsQ0FBQ3VRLGtCQUFqQixFQUFxQztBQUNwQyxpQkFBT3ZOLElBQUksQ0FBQ3dOLG1CQUFMLENBQXlCVixhQUF6QixFQUF3QzlNLElBQUksQ0FBQzFDLFlBQTdDLEVBQTJEdUMsZUFBM0QsQ0FBUDtBQUNBLFNBRkQsTUFFTztBQUNOLGlCQUFPTCxPQUFPLENBQUNDLE9BQVIsRUFBUDtBQUNBO0FBQ0QsT0FwQkssRUFxQkxtRSxJQXJCSyxDQXFCQSxZQUFXO0FBQ2hCLFlBQUk1RyxXQUFXLENBQUN5USxvQkFBaEIsRUFBc0M7QUFDckNULFVBQUFBLHFCQUFxQixHQUFHaFEsV0FBVyxDQUFDeVEsb0JBQVosQ0FBaUM7QUFBRUMsWUFBQUEsT0FBTyxFQUFFL1A7QUFBWCxXQUFqQyxDQUF4QjtBQUNBLFNBRkQsTUFFTztBQUNOcVAsVUFBQUEscUJBQXFCLEdBQUd4TixPQUFPLENBQUNDLE9BQVIsRUFBeEI7QUFDQTs7QUFDRCxlQUFPdU4scUJBQVA7QUFDQSxPQTVCSyxFQTZCTHBKLElBN0JLLENBNkJBLFlBQVc7QUFDaEI7QUFDQSxnQkFBUWhHLGlCQUFSO0FBQ0MsZUFBS2hCLGdCQUFnQixDQUFDMEIsS0FBdEI7QUFDQyxtQkFBT3VPLGNBQWMsQ0FBQ08sYUFBZixDQUE2QixpQkFBN0IsRUFBZ0R4SixJQUFoRCxDQUFxRCxVQUFTb0MsZ0JBQVQsRUFBZ0M7QUFDM0Ysa0JBQUkySCxjQUFKOztBQUNBLGtCQUFJLENBQUMzSCxnQkFBTCxFQUF1QjtBQUN0QixvQkFBSTZHLGNBQWMsSUFBSUEsY0FBYyxDQUFDZSxpQkFBZixFQUF0QixFQUEwRDtBQUN6RGYsa0JBQUFBLGNBQWMsQ0FBQ2dCLFVBQWYsR0FBNEJDLFlBQTVCO0FBQ0E7O0FBQ0RILGdCQUFBQSxjQUFjLEdBQUc5QyxLQUFLLENBQUNDLFdBQU4sQ0FBa0IrQixjQUFsQixDQUFqQjtBQUNBLHVCQUFPYyxjQUFQO0FBQ0EsZUFORCxNQU1PO0FBQ04sb0JBQUl6SCxjQUFjLEdBQUdqRyxNQUFNLENBQUNrRyxXQUFQLENBQW1CMEcsY0FBYyxDQUFDOU8sT0FBZixLQUEyQixnQkFBOUMsRUFBZ0VxSSxlQUFoRSxFQUFyQjtBQUNBLHVCQUFPRixjQUFjLENBQ25CTSxvQkFESyxHQUVMNUMsSUFGSyxDQUdMLFVBQVMvRixLQUFULEVBQXFCO0FBQ3BCb1Asa0JBQUFBLGNBQWMsR0FBR3BQLEtBQWpCOztBQUNBLHNCQUFJZ1AsY0FBYyxJQUFJQSxjQUFjLENBQUNlLGlCQUFmLEVBQXRCLEVBQTBEO0FBQ3pEZixvQkFBQUEsY0FBYyxDQUFDZ0IsVUFBZixHQUE0QkMsWUFBNUI7QUFDQTs7QUFDREgsa0JBQUFBLGNBQWMsR0FBRzlDLEtBQUssQ0FBQ0MsV0FBTixDQUFrQitCLGNBQWxCLENBQWpCO0FBQ0EseUJBQU9jLGNBQVA7QUFDQSxpQkFWSSxFQVdMLFlBQVc7QUFDVjlDLGtCQUFBQSxLQUFLLENBQUNDLFdBQU4sQ0FBa0IrQixjQUFsQjtBQUNBO0FBQ0EsaUJBZEksRUFnQkxqSixJQWhCSyxDQWdCQSxZQUFXO0FBQ2hCO0FBQ0Esc0JBQUksQ0FBQ3FKLGNBQUwsRUFBcUI7QUFDcEI7QUFDQTs7QUFDRCxzQkFBSS9HLGNBQWMsQ0FBQ25JLE9BQWYsT0FBNkJrUCxjQUFqQyxFQUFpRDtBQUNoRDtBQUNBO0FBQ0EvRyxvQkFBQUEsY0FBYyxHQUFHakcsTUFBTSxDQUFDa0csV0FBUCxDQUFtQjhHLGNBQW5CLEVBQW1DN0csZUFBbkMsRUFBakI7QUFDQTs7QUFDRCx5QkFBT0YsY0FBUDtBQUNBLGlCQTNCSyxDQUFQO0FBNEJBO0FBQ0QsYUF2Q00sQ0FBUDs7QUF3Q0QsZUFBS3RKLGdCQUFnQixDQUFDNEIsTUFBdEI7QUFDQyxtQkFBT2dPLE1BQU0sQ0FBQ3VCLGVBQVAsQ0FBdUJwUSxRQUF2QixFQUFpQ2lHLElBQWpDLENBQXNDLFVBQVNqRyxRQUFULEVBQXdCO0FBQ3BFLGtCQUFJQSxRQUFKLEVBQWM7QUFDYixvQkFBSUEsUUFBUSxDQUFDaVEsaUJBQVQsRUFBSixFQUFrQztBQUNqQ2pRLGtCQUFBQSxRQUFRLENBQUNrUSxVQUFULEdBQXNCQyxZQUF0QjtBQUNBOztBQUNELG9CQUFJLENBQUM5TixJQUFJLENBQUN6QyxZQUFWLEVBQXdCO0FBQ3ZCSSxrQkFBQUEsUUFBUSxDQUFDcVEsT0FBVDtBQUNBLHlCQUFPclEsUUFBUDtBQUNBO0FBQ0Q7O0FBQ0QscUJBQU8sS0FBUDtBQUNBLGFBWE0sQ0FBUDs7QUFZRDtBQUNDLG1CQUFPNkIsT0FBTyxDQUFDa0MsTUFBUixDQUFlLDZFQUFmLENBQVA7QUF4REY7QUEwREEsT0F6RkssRUEwRkxrQyxJQTFGSyxDQTBGQSxVQUFTOEosT0FBVCxFQUF1QjtBQUM1QjFOLFFBQUFBLElBQUksQ0FBQzFDLFlBQUwsR0FBb0IsS0FBcEIsQ0FENEIsQ0FFNUI7O0FBQ0F3QyxRQUFBQSxjQUFjLENBQUN1TSx3QkFBZixHQUg0QixDQUk1Qjs7QUFDQSxlQUFPdk0sY0FBYyxDQUFDaUwsWUFBZixHQUE4Qm5ILElBQTlCLENBQW1DLFlBQVc7QUFDcEQsaUJBQU84SixPQUFQO0FBQ0EsU0FGTSxDQUFQO0FBR0EsT0FsR0ssRUFtR0w3SixLQW5HSyxDQW1HQyxVQUFTOEksR0FBVCxFQUFtQjtBQUN6QixlQUFPN00sY0FBYyxDQUFDaUwsWUFBZixHQUE4Qm5ILElBQTlCLENBQW1DLFlBQVc7QUFDcEQsaUJBQU9wRSxPQUFPLENBQUNrQyxNQUFSLENBQWVpTCxHQUFmLENBQVA7QUFDQSxTQUZNLENBQVA7QUFHQSxPQXZHSyxFQXdHTHJILE9BeEdLLENBd0dHLFlBQVc7QUFDbkJ4RCxRQUFBQSxVQUFVLENBQUN5RCxNQUFYLENBQWtCdkYsSUFBSSxDQUFDM0MsV0FBdkI7QUFDQSxPQTFHSyxDQUFQO0FBMkdBO0FBQ0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0M0USxZLEdBQUEsc0JBQWF0USxRQUFiLEVBQTRCa0MsZUFBNUIsRUFBa0RxTywwQkFBbEQsRUFBbUZDLFNBQW5GLEVBQW1Hck8sY0FBbkcsRUFBd0g7QUFDdkg7QUFDQSxVQUFNRSxJQUFJLEdBQUcsSUFBYjtBQUNBLFVBQU1wQyxpQkFBaUIsR0FBRyxLQUFLRixtQkFBTCxDQUF5QkMsUUFBekIsQ0FBMUI7QUFDQSxVQUFJeVEsWUFBSjs7QUFDQSxVQUFJLENBQUN6USxRQUFMLEVBQWU7QUFDZCxlQUFPNkIsT0FBTyxDQUFDa0MsTUFBUixDQUFlLElBQUkwSyxLQUFKLENBQVUsK0NBQVYsQ0FBZixDQUFQO0FBQ0EsT0FQc0gsQ0FRdkg7QUFDQTs7O0FBQ0F0TSxNQUFBQSxjQUFjLENBQUN1TSx3QkFBZjtBQUNBdkssTUFBQUEsVUFBVSxDQUFDQyxJQUFYLENBQWdCL0IsSUFBSSxDQUFDM0MsV0FBckI7O0FBQ0EsVUFBSU8saUJBQWlCLEtBQUtoQixnQkFBZ0IsQ0FBQzBCLEtBQTNDLEVBQWtEO0FBQ2pEOFAsUUFBQUEsWUFBWSxHQUFHdkQsS0FBSyxDQUFDd0QsZ0JBQU4sQ0FBdUIxUSxRQUF2QixFQUFpQyxLQUFLNEMsZ0JBQUwsRUFBakMsRUFBMEQsRUFBMUQsQ0FBZjtBQUNBLE9BRkQsTUFFTyxJQUFJM0MsaUJBQWlCLEtBQUtoQixnQkFBZ0IsQ0FBQzRCLE1BQTNDLEVBQW1EO0FBQ3pENFAsUUFBQUEsWUFBWSxHQUFHNUIsTUFBTSxDQUFDNkIsZ0JBQVAsQ0FBd0IxUSxRQUF4QixDQUFmO0FBQ0EsT0FGTSxNQUVBO0FBQ05tRSxRQUFBQSxVQUFVLENBQUN5RCxNQUFYLENBQWtCdkYsSUFBSSxDQUFDM0MsV0FBdkI7QUFDQSxlQUFPbUMsT0FBTyxDQUFDa0MsTUFBUixDQUFlLElBQUkwSyxLQUFKLENBQVUscUVBQVYsQ0FBZixDQUFQO0FBQ0E7O0FBQ0QsYUFBT2dDLFlBQVksQ0FDakJ4SyxJQURLLENBQ0EsVUFBUzBLLGVBQVQsRUFBK0I7QUFDcEMsWUFBTUMsVUFBVSxHQUNmdk8sSUFBSSxDQUFDcEMsaUJBQUwsS0FBMkJoQixnQkFBZ0IsQ0FBQzRCLE1BQTVDLEdBQXFEd0IsSUFBSSxDQUFDekMsWUFBMUQsR0FBeUUsQ0FBQ0ksUUFBUSxDQUFDeUQsU0FBVCxHQUFxQjZFLGVBRGhHO0FBRUF1QixRQUFBQSxZQUFZLENBQUNDLElBQWIsQ0FDQzhHLFVBQVUsR0FDUHJMLFdBQVcsQ0FBQ3dFLGlCQUFaLENBQThCLHFDQUE5QixFQUFxRTdILGVBQXJFLENBRE8sR0FFUHFELFdBQVcsQ0FBQ3dFLGlCQUFaLENBQThCLG1DQUE5QixFQUFtRTdILGVBQW5FLENBSEo7QUFLQUcsUUFBQUEsSUFBSSxDQUFDMUMsWUFBTCxHQUFvQixLQUFwQjtBQUNBLGVBQU93QyxjQUFjLENBQUNvRixpQkFBZixHQUFtQ3RCLElBQW5DLENBQXdDLFlBQVc7QUFDekQsaUJBQU8wSyxlQUFQO0FBQ0EsU0FGTSxDQUFQO0FBR0EsT0FiSyxFQWNMekssS0FkSyxDQWNDLFVBQVM4SSxHQUFULEVBQW1CO0FBQ3pCLFlBQUl3QixTQUFTLElBQUlBLFNBQVMsQ0FBQ2hQLE1BQVYsR0FBbUIsQ0FBcEMsRUFBdUM7QUFDdEM7QUFDQWdQLFVBQUFBLFNBQVMsQ0FBQ0ssT0FBVixDQUFrQixVQUFTQyxZQUFULEVBQTRCO0FBQzdDLGdCQUFJLENBQUN2TCxXQUFXLENBQUN3TCxtQkFBWixDQUFnQ0QsWUFBaEMsQ0FBRCxJQUFrRFAsMEJBQXRELEVBQWtGO0FBQ2pGLGtCQUFNOVEsYUFBYSxHQUFHNEMsSUFBSSxDQUFDTyxnQkFBTCxFQUF0Qjs7QUFDQW5ELGNBQUFBLGFBQWEsQ0FBQ3VSLHFCQUFkLEdBQXNDQyx1Q0FBdEMsQ0FBOEVILFlBQVksQ0FBQzFRLE9BQWIsRUFBOUUsRUFBc0dKLFFBQXRHO0FBQ0E7QUFDRCxXQUxEO0FBTUE7O0FBQ0QsZUFBT21DLGNBQWMsQ0FBQ2lMLFlBQWYsR0FBOEJuSCxJQUE5QixDQUFtQyxZQUFXO0FBQ3BELGlCQUFPcEUsT0FBTyxDQUFDa0MsTUFBUixDQUFlaUwsR0FBZixDQUFQO0FBQ0EsU0FGTSxDQUFQO0FBR0EsT0EzQkssRUE0QkxySCxPQTVCSyxDQTRCRyxZQUFXO0FBQ25CeEQsUUFBQUEsVUFBVSxDQUFDeUQsTUFBWCxDQUFrQnZGLElBQUksQ0FBQzNDLFdBQXZCO0FBQ0EsT0E5QkssQ0FBUDtBQStCQTtBQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNDZ0YsVSxHQUFBLG9CQUFXd00sV0FBWCxFQUFnQzdSLFdBQWhDLEVBQWtEMkIsS0FBbEQsRUFBc0VtQixjQUF0RSxFQUEyRjtBQUMxRjlDLE1BQUFBLFdBQVcsR0FBR0QsYUFBYSxDQUFDQyxXQUFELENBQTNCLENBRDBGLENBRTFGOztBQUNBLFVBQU1nRCxJQUFJLEdBQUcsSUFBYjtBQUNBLFVBQUlyQyxRQUFKLEVBQWNzQyxNQUFkLEVBQTJCNk8sUUFBM0I7QUFDQSxVQUFNNU4sa0JBQWtCLEdBQUdsRSxXQUFXLENBQUMwRixpQkFBdkM7O0FBQ0EsVUFBSSxDQUFDbU0sV0FBTCxFQUFrQjtBQUNqQixlQUFPclAsT0FBTyxDQUFDa0MsTUFBUixDQUFlLHVDQUFmLENBQVA7QUFDQSxPQVJ5RixDQVMxRjtBQUNBO0FBQ0E7OztBQUNBLFVBQU1xTixLQUFLLEdBQUdGLFdBQVcsQ0FBQ0csS0FBWixDQUFrQixHQUFsQixFQUF1QixDQUF2QixDQUFkO0FBQ0FILE1BQUFBLFdBQVcsR0FBR0UsS0FBSyxJQUFJRixXQUF2QjtBQUNBbFIsTUFBQUEsUUFBUSxHQUFHb1IsS0FBSyxHQUFHL04sU0FBSCxHQUFlaEUsV0FBVyxDQUFDc0YsUUFBM0MsQ0FkMEYsQ0FlMUY7O0FBQ0EsVUFBSTNFLFFBQVEsS0FBTTZLLEtBQUssQ0FBQ0MsT0FBTixDQUFjOUssUUFBZCxLQUEyQkEsUUFBUSxDQUFDd0IsTUFBckMsSUFBZ0QsQ0FBQ3FKLEtBQUssQ0FBQ0MsT0FBTixDQUFjOUssUUFBZCxDQUF0RCxDQUFaLEVBQTRGO0FBQzNGQSxRQUFBQSxRQUFRLEdBQUc2SyxLQUFLLENBQUNDLE9BQU4sQ0FBYzlLLFFBQWQsSUFBMEJBLFFBQVEsQ0FBQyxDQUFELENBQWxDLEdBQXdDQSxRQUFuRDtBQUNBc0MsUUFBQUEsTUFBTSxHQUFHdEMsUUFBUSxDQUFDUyxRQUFULEVBQVQ7QUFDQTs7QUFDRCxVQUFJcEIsV0FBVyxDQUFDaVMsS0FBaEIsRUFBdUI7QUFDdEJoUCxRQUFBQSxNQUFNLEdBQUdqRCxXQUFXLENBQUNpUyxLQUFyQjtBQUNBOztBQUNELFVBQUksQ0FBQ2hQLE1BQUwsRUFBYTtBQUNaLGVBQU9ULE9BQU8sQ0FBQ2tDLE1BQVIsQ0FBZSwyRUFBZixDQUFQO0FBQ0EsT0F6QnlGLENBMEIxRjtBQUNBOzs7QUFDQSxVQUFNdEUsYUFBYSxHQUFHNEMsSUFBSSxDQUFDTyxnQkFBTCxFQUF0Qjs7QUFDQSxVQUFNMk8sc0JBQXNCLEdBQUc5UixhQUFhLENBQUN1UixxQkFBZCxHQUFzQ1EseUJBQXRDLENBQWdFTixXQUFoRSxFQUE2RWxSLFFBQTdFLEtBQTBGLEVBQXpIOztBQUNBLFVBQUlBLFFBQVEsSUFBSXNDLE1BQWhCLEVBQXdCO0FBQ3ZCNk8sUUFBQUEsUUFBUSxHQUFHLElBQUl0UCxPQUFKLENBQWtCLFVBQVNDLE9BQVQsRUFBa0JpQyxNQUFsQixFQUEwQjtBQUN0RCxjQUFJME4sd0JBQUo7QUFDQSxjQUFNQyxXQUFXLEdBQUc7QUFDbkJwRyxZQUFBQSxPQUFPLEVBQUUsWUFBVztBQUNuQjtBQUNBbUcsY0FBQUEsd0JBQXdCLENBQUMxRCxLQUF6QjtBQUNBak0sY0FBQUEsT0FBTztBQUNQLGFBTGtCO0FBTW5CNlAsWUFBQUEsVUFBVSxFQUFFLFlBQVc7QUFDdEI7QUFDQUYsY0FBQUEsd0JBQXdCLENBQUMxRCxLQUF6QjtBQUNBak0sY0FBQUEsT0FBTyxDQUFDekMsV0FBVyxDQUFDdVMsaUJBQWIsQ0FBUDtBQUNBO0FBVmtCLFdBQXBCOztBQVlBLGNBQU1DLG1CQUFtQixHQUFHLFlBQVc7QUFDdEMsZ0JBQUlDLGNBQUo7QUFDQSxnQkFBTUMsY0FBYyxHQUFHMVMsV0FBVyxDQUFDMlMsb0JBQVosQ0FBaUN4USxNQUF4RDtBQUFBLGdCQUNDeVEsbUJBQW1CLEdBQUcsRUFEdkI7O0FBRUEsaUJBQUssSUFBSWxILENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUcxTCxXQUFXLENBQUMyUyxvQkFBWixDQUFpQ3hRLE1BQXJELEVBQTZEdUosQ0FBQyxFQUE5RCxFQUFrRTtBQUNqRStHLGNBQUFBLGNBQWMsR0FBR3pTLFdBQVcsQ0FBQzJTLG9CQUFaLENBQWlDakgsQ0FBakMsRUFBb0N0SCxTQUFwQyxFQUFqQjtBQUNBd08sY0FBQUEsbUJBQW1CLENBQUN2SixJQUFwQixDQUF5Qm9KLGNBQXpCO0FBQ0E7O0FBQ0QsZ0JBQU1JLHdCQUF3QixHQUFHLElBQUlDLFNBQUosQ0FBY0YsbUJBQWQsQ0FBakM7QUFDQSxnQkFBTUcsT0FBTyxHQUFHLElBQUlELFNBQUosQ0FBYztBQUFFRSxjQUFBQSxLQUFLLEVBQUVOLGNBQVQ7QUFBeUJsTixjQUFBQSxLQUFLLEVBQUV4RixXQUFXLENBQUN3RjtBQUE1QyxhQUFkLENBQWhCO0FBQ0E0TSxZQUFBQSx3QkFBd0IsQ0FBQ2EsUUFBekIsQ0FBa0NKLHdCQUFsQyxFQUE0RCxlQUE1RDtBQUNBVCxZQUFBQSx3QkFBd0IsQ0FBQ2EsUUFBekIsQ0FBa0NGLE9BQWxDLEVBQTJDLFFBQTNDO0FBQ0FYLFlBQUFBLHdCQUF3QixDQUFDcEQsSUFBekI7QUFDQSxXQWJEOztBQWNBLGNBQUloUCxXQUFXLENBQUMyUyxvQkFBWixJQUFvQzNTLFdBQVcsQ0FBQzJTLG9CQUFaLENBQWlDeFEsTUFBakMsSUFBMkMsQ0FBbkYsRUFBc0Y7QUFDckY7QUFDQSxnQkFBTStRLGFBQWEsR0FBRyxvQ0FBdEI7QUFDQSxnQkFBTUMsZUFBZSxHQUFHQyxvQkFBb0IsQ0FBQ0MsWUFBckIsQ0FBa0NILGFBQWxDLEVBQWlELFVBQWpELENBQXhCO0FBQ0EsZ0JBQU1oUSxVQUFVLEdBQUdELE1BQU0sQ0FBQzVCLFlBQVAsRUFBbkI7QUFDQSxnQkFBTTRPLGNBQWMsR0FBR2pRLFdBQVcsQ0FBQ3NGLFFBQVosQ0FBcUIsQ0FBckIsRUFBd0JnTyxnQkFBeEIsRUFBdkI7QUFDQSxnQkFBTUMsVUFBVSxHQUFHdEQsY0FBYyxDQUFDdUQsTUFBZixDQUFzQixDQUF0QixFQUF5QnZELGNBQWMsQ0FBQzNGLE9BQWYsQ0FBdUIsR0FBdkIsQ0FBekIsSUFBd0QsR0FBM0U7QUFDQSxnQkFBTW1KLGlCQUFpQixHQUFHLElBQUlYLFNBQUosQ0FBYztBQUN2Q3hILGNBQUFBLEtBQUssRUFBRXRMLFdBQVcsQ0FBQ3dGO0FBRG9CLGFBQWQsQ0FBMUI7QUFHQWhELFlBQUFBLE9BQU8sQ0FBQ0MsT0FBUixDQUNDaVIsZUFBZSxDQUFDQyxPQUFoQixDQUNDUixlQURELEVBRUM7QUFBRVMsY0FBQUEsSUFBSSxFQUFFVjtBQUFSLGFBRkQsRUFHQztBQUNDVyxjQUFBQSxlQUFlLEVBQUU7QUFDaEJDLGdCQUFBQSxVQUFVLEVBQUU1USxVQUFVLENBQUNxRCxvQkFBWCxDQUFnQ2dOLFVBQWhDLENBREk7QUFFaEIvTixnQkFBQUEsS0FBSyxFQUFFaU8saUJBQWlCLENBQUNsTixvQkFBbEIsQ0FBdUMsR0FBdkM7QUFGUyxlQURsQjtBQUtDd04sY0FBQUEsTUFBTSxFQUFFO0FBQ1BELGdCQUFBQSxVQUFVLEVBQUU1USxVQURMO0FBRVA4USxnQkFBQUEsU0FBUyxFQUFFOVEsVUFGSjtBQUdQc0MsZ0JBQUFBLEtBQUssRUFBRWlPO0FBSEE7QUFMVCxhQUhELENBREQsRUFpQkU3TSxJQWpCRixDQWlCTyxVQUFTcU4sU0FBVCxFQUF5QjtBQUM5QixxQkFBT0MsUUFBUSxDQUFDQyxJQUFULENBQWM7QUFBRUMsZ0JBQUFBLFVBQVUsRUFBRUgsU0FBZDtBQUF5QkksZ0JBQUFBLFVBQVUsRUFBRWhDO0FBQXJDLGVBQWQsQ0FBUDtBQUNBLGFBbkJGLEVBb0JFekwsSUFwQkYsQ0FvQk8sVUFBUzBOLFFBQVQsRUFBd0I7QUFDN0JsQyxjQUFBQSx3QkFBd0IsR0FBR2tDLFFBQTNCO0FBQ0F0VSxjQUFBQSxXQUFXLENBQUMyRixhQUFaLENBQTBCNE8sWUFBMUIsQ0FBdUNELFFBQXZDO0FBQ0E5QixjQUFBQSxtQkFBbUI7QUFDbkIsYUF4QkYsRUF5QkUzTCxLQXpCRixDQXlCUW5DLE1BekJSO0FBMEJBLFdBcENELE1Bb0NPO0FBQ05qQyxZQUFBQSxPQUFPLENBQUN6QyxXQUFXLENBQUNzRixRQUFiLENBQVA7QUFDQTtBQUNELFNBbkVVLEVBbUVSc0IsSUFuRVEsQ0FtRUgsVUFBUzROLGdCQUFULEVBQWdDO0FBQ3ZDLGNBQUlBLGdCQUFKLEVBQXNCO0FBQ3JCLG1CQUFPL04sVUFBVSxDQUFDZ08sZUFBWCxDQUEyQjVDLFdBQTNCLEVBQXdDMkMsZ0JBQXhDLEVBQTBEdlIsTUFBMUQsRUFBa0U3QyxhQUFsRSxFQUFpRjtBQUN2RnNVLGNBQUFBLGtCQUFrQixFQUFFMVUsV0FBVyxDQUFDMFUsa0JBRHVEO0FBRXZGbFAsY0FBQUEsS0FBSyxFQUFFeEYsV0FBVyxDQUFDd0YsS0FGb0U7QUFHdkZELGNBQUFBLHlCQUF5QixFQUFFLElBSDREO0FBSXZGckIsY0FBQUEsa0JBQWtCLEVBQUVBLGtCQUptRTtBQUt2RnlHLGNBQUFBLGFBQWEsRUFBRTNLLFdBQVcsQ0FBQzJLLGFBTDREO0FBTXZGZ0ssY0FBQUEsb0JBQW9CLEVBQUV6QyxzQkFOaUU7QUFPdkYwQyxjQUFBQSxXQUFXLEVBQUUsWUFBVztBQUN2QjlSLGdCQUFBQSxjQUFjLENBQUN1TSx3QkFBZjtBQUNBdkssZ0JBQUFBLFVBQVUsQ0FBQ0MsSUFBWCxDQUFnQi9CLElBQUksQ0FBQzNDLFdBQXJCO0FBQ0EsZUFWc0Y7QUFXdkZ3VSxjQUFBQSxVQUFVLEVBQUUsWUFBVztBQUN0Qi9QLGdCQUFBQSxVQUFVLENBQUN5RCxNQUFYLENBQWtCdkYsSUFBSSxDQUFDM0MsV0FBdkI7QUFDQSxlQWJzRjtBQWN2RnNGLGNBQUFBLGFBQWEsRUFBRTNGLFdBQVcsQ0FBQzJGLGFBZDREO0FBZXZGaUUsY0FBQUEsb0JBQW9CLEVBQUU1SixXQUFXLENBQUM0SixvQkFmcUQ7QUFnQnZGa0wsY0FBQUEscUJBQXFCLEVBQUU5VSxXQUFXLENBQUM4VSxxQkFoQm9EO0FBaUJ2RmxQLGNBQUFBLGVBQWUsRUFBRTVGLFdBQVcsQ0FBQzRGLGVBakIwRDtBQWtCdkZtUCxjQUFBQSxnQkFBZ0IsRUFBRS9VLFdBQVcsQ0FBQytVLGdCQWxCeUQ7QUFtQnZGQyxjQUFBQSxXQUFXLEVBQUVoVixXQUFXLENBQUNnVixXQW5COEQ7QUFvQnZGbFMsY0FBQUEsY0FBYyxFQUFFQSxjQXBCdUU7QUFxQnZGbVMsY0FBQUEsOEJBQThCLEVBQUVqVixXQUFXLENBQUNpVjtBQXJCMkMsYUFBakYsQ0FBUDtBQXVCQSxXQXhCRCxNQXdCTztBQUNOLG1CQUFPLElBQVA7QUFDQTtBQUNELFNBL0ZVLENBQVg7QUFnR0EsT0FqR0QsTUFpR087QUFDTjtBQUNBbkQsUUFBQUEsUUFBUSxHQUFHckwsVUFBVSxDQUFDeU8sZ0JBQVgsQ0FBNEJyRCxXQUE1QixFQUF5QzVPLE1BQXpDLEVBQWlEN0MsYUFBakQsRUFBZ0U7QUFDMUVvRixVQUFBQSxLQUFLLEVBQUV4RixXQUFXLENBQUN3RixLQUR1RDtBQUUxRUQsVUFBQUEseUJBQXlCLEVBQUUsSUFGK0M7QUFHMUVHLFVBQUFBLGlCQUFpQixFQUFFeEIsa0JBSHVEO0FBSTFFeUcsVUFBQUEsYUFBYSxFQUFFM0ssV0FBVyxDQUFDMkssYUFKK0M7QUFLMUVpSyxVQUFBQSxXQUFXLEVBQUUsWUFBVztBQUN2QjlQLFlBQUFBLFVBQVUsQ0FBQ0MsSUFBWCxDQUFnQi9CLElBQUksQ0FBQzNDLFdBQXJCO0FBQ0EsV0FQeUU7QUFRMUV3VSxVQUFBQSxVQUFVLEVBQUUsWUFBVztBQUN0Qi9QLFlBQUFBLFVBQVUsQ0FBQ3lELE1BQVgsQ0FBa0J2RixJQUFJLENBQUMzQyxXQUF2QjtBQUNBLFdBVnlFO0FBVzFFc0YsVUFBQUEsYUFBYSxFQUFFM0YsV0FBVyxDQUFDMkYsYUFYK0M7QUFZMUVpRSxVQUFBQSxvQkFBb0IsRUFBRTVKLFdBQVcsQ0FBQzRKLG9CQVp3QztBQWExRWtMLFVBQUFBLHFCQUFxQixFQUFFOVUsV0FBVyxDQUFDOFUscUJBYnVDO0FBYzFFaFMsVUFBQUEsY0FBYyxFQUFFQSxjQWQwRDtBQWUxRWtTLFVBQUFBLFdBQVcsRUFBRWhWLFdBQVcsQ0FBQ2dWO0FBZmlELFNBQWhFLENBQVg7QUFpQkE7O0FBQ0QsYUFBT2xELFFBQVEsQ0FDYmxMLElBREssQ0FDQSxVQUFTa0IsT0FBVCxFQUF1QjtBQUM1QjtBQUNBLGVBQU85RSxJQUFJLENBQUNtUyxxQkFBTCxDQUEyQnJTLGNBQTNCLEVBQTJDOUMsV0FBM0MsRUFBd0Q2UixXQUF4RCxFQUFxRWpMLElBQXJFLENBQTBFLFlBQVc7QUFDM0YsaUJBQU9rQixPQUFQO0FBQ0EsU0FGTSxDQUFQO0FBR0EsT0FOSyxFQU9MakIsS0FQSyxDQU9DLFVBQVM4SSxHQUFULEVBQW1CO0FBQ3pCLGVBQU8zTSxJQUFJLENBQUNtUyxxQkFBTCxDQUEyQnJTLGNBQTNCLEVBQTJDOUMsV0FBM0MsRUFBd0Q2UixXQUF4RCxFQUFxRWpMLElBQXJFLENBQTBFLFlBQVc7QUFDM0YsaUJBQU9wRSxPQUFPLENBQUNrQyxNQUFSLENBQWVpTCxHQUFmLENBQVA7QUFDQSxTQUZNLENBQVA7QUFHQSxPQVhLLENBQVA7QUFZQTtBQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ3dGLHFCLEdBQUEsK0JBQXNCclMsY0FBdEIsRUFBMkM5QyxXQUEzQyxFQUE2RDZSLFdBQTdELEVBQWtGO0FBQ2pGLFVBQU11RCxrQkFBa0IsR0FBR0MsZUFBZSxDQUFDQyxXQUFoQixDQUE0QixJQUE1QixFQUFrQyxJQUFsQyxDQUEzQjs7QUFDQSxVQUFJRixrQkFBa0IsQ0FBQ2pULE1BQW5CLEdBQTRCLENBQTVCLElBQWlDbkMsV0FBakMsSUFBZ0RBLFdBQVcsQ0FBQzRKLG9CQUFoRSxFQUFzRjtBQUNyRjVKLFFBQUFBLFdBQVcsQ0FBQzRKLG9CQUFaLENBQWlDSSxXQUFqQyxDQUE2QyxhQUE3QyxFQUE0RGhLLFdBQVcsQ0FBQ3dGLEtBQVosR0FBb0J4RixXQUFXLENBQUN3RixLQUFoQyxHQUF3Q3FNLFdBQXBHO0FBQ0E7O0FBQ0QsYUFBTy9PLGNBQWMsQ0FBQ2lMLFlBQWYsRUFBUDtBQUNBO0FBQ0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNDd0gscUIsR0FBQSxpQ0FBd0I7QUFDdkIsVUFBTUMsZUFBZSxHQUFJdlEsR0FBRyxDQUFDQyxFQUFKLENBQU9DLE9BQVAsRUFBRCxDQUEwQnNRLGlCQUExQixFQUF4QjtBQUFBLFVBQ0NDLGFBQWEsR0FBR0YsZUFBZSxDQUM3QkcsZUFEYyxHQUVkQyxPQUZjLEdBR2R6TCxNQUhjLENBR1AsVUFBU25ELEtBQVQsRUFBcUI7QUFDNUI7QUFDQSxZQUFJQSxLQUFLLENBQUM2TyxVQUFWLEVBQXNCO0FBQ3JCLGlCQUFPN08sS0FBUDtBQUNBO0FBQ0QsT0FSYyxDQURqQjtBQVVBd08sTUFBQUEsZUFBZSxDQUFDTSxjQUFoQixDQUErQkosYUFBL0I7QUFDQTtBQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNDbEYsbUIsR0FBQSw2QkFBb0JWLGFBQXBCLEVBQXdDaUcsV0FBeEMsRUFBMERsVCxlQUExRCxFQUFnRjtBQUMvRTtBQUNBO0FBQ0EsVUFBTUcsSUFBSSxHQUFHLElBQWI7QUFDQUEsTUFBQUEsSUFBSSxDQUFDeEMsaUJBQUwsR0FBeUIsS0FBekIsQ0FKK0UsQ0FLL0U7O0FBQ0EsYUFBTyxJQUFJZ0MsT0FBSixDQUFrQixVQUFTQyxPQUFULEVBQWtCaUMsTUFBbEIsRUFBMEI7QUFDbEQsWUFBSSxDQUFDb0wsYUFBTCxFQUFvQjtBQUNuQnBMLFVBQUFBLE1BQU0sQ0FBQyx5QkFBRCxDQUFOO0FBQ0EsU0FIaUQsQ0FJbEQ7OztBQUNBLFlBQUlxUixXQUFKLEVBQWlCO0FBQ2hCLGNBQU1DLGdCQUFnQixHQUFHLFlBQVc7QUFDbkNsRyxZQUFBQSxhQUFhLENBQUNtRyxVQUFkLENBQXlCLElBQXpCOztBQUNBLGdCQUFJalQsSUFBSSxDQUFDeEMsaUJBQVQsRUFBNEI7QUFDM0JpQyxjQUFBQSxPQUFPO0FBQ1AsYUFGRCxNQUVPO0FBQ05pQyxjQUFBQSxNQUFNLENBQUMsaUVBQUQsQ0FBTjtBQUNBOztBQUNEMUIsWUFBQUEsSUFBSSxDQUFDa1QsU0FBTCxDQUFlQyxnQkFBZixDQUFnQ0gsZ0JBQWhDO0FBQ0EsV0FSRDs7QUFTQSxjQUFJLENBQUNoVCxJQUFJLENBQUNrVCxTQUFWLEVBQXFCO0FBQ3BCLGdCQUFNRSxLQUFLLEdBQUcsSUFBSXBKLElBQUosQ0FBUztBQUNyQjtBQUNBO0FBQ0FiLGNBQUFBLElBQUksRUFBRWpHLFdBQVcsQ0FBQ3dFLGlCQUFaLENBQThCLDRDQUE5QixFQUE0RTdILGVBQTVFO0FBSGUsYUFBVCxDQUFkO0FBQUEsZ0JBS0N3VCxPQUFPLEdBQUcsSUFBSTlILE1BQUosQ0FBVztBQUNwQnBDLGNBQUFBLElBQUksRUFBRWpHLFdBQVcsQ0FBQ3dFLGlCQUFaLENBQThCLDJDQUE5QixFQUEyRTdILGVBQTNFLENBRGM7QUFFcEJ5VCxjQUFBQSxLQUFLLEVBQUUsTUFGYTtBQUdwQjdILGNBQUFBLEtBQUssRUFBRSxZQUFXO0FBQ2pCekwsZ0JBQUFBLElBQUksQ0FBQ3VTLHFCQUFMO0FBQ0F2UyxnQkFBQUEsSUFBSSxDQUFDeEMsaUJBQUwsR0FBeUIsSUFBekI7O0FBQ0F3QyxnQkFBQUEsSUFBSSxDQUFDa1QsU0FBTCxDQUFleEgsS0FBZjtBQUNBLGVBUG1CO0FBUXBCTixjQUFBQSxjQUFjLEVBQUVnSTtBQVJJLGFBQVgsQ0FMWDtBQWVBcFQsWUFBQUEsSUFBSSxDQUFDa1QsU0FBTCxHQUFpQixJQUFJSyxPQUFKLENBQVk7QUFDNUJDLGNBQUFBLFVBQVUsRUFBRSxLQURnQjtBQUU1QkMsY0FBQUEsU0FBUyxFQUFFLEtBRmlCO0FBRzVCdEksY0FBQUEsT0FBTyxFQUFFLENBQ1IsSUFBSXJCLElBQUosQ0FBUztBQUNSQyxnQkFBQUEsS0FBSyxFQUFFLENBQUNxSixLQUFELEVBQVFDLE9BQVI7QUFEQyxlQUFULENBRFEsQ0FIbUI7QUFRNUJLLGNBQUFBLFVBQVUsRUFBRSxZQUFXO0FBQ3RCO0FBQ0E1RyxnQkFBQUEsYUFBYSxDQUFDbUcsVUFBZCxDQUF5QixLQUF6Qjs7QUFDQWpULGdCQUFBQSxJQUFJLENBQUNrVCxTQUFMLENBQWVTLGVBQWYsQ0FBK0JOLE9BQS9CO0FBQ0E7QUFaMkIsYUFBWixDQUFqQjs7QUFjQXJULFlBQUFBLElBQUksQ0FBQ2tULFNBQUwsQ0FBZW5ILGFBQWYsQ0FBNkIscUJBQTdCO0FBQ0E7O0FBQ0QvTCxVQUFBQSxJQUFJLENBQUNrVCxTQUFMLENBQWVVLGdCQUFmLENBQWdDWixnQkFBaEM7O0FBQ0FoVCxVQUFBQSxJQUFJLENBQUNrVCxTQUFMLENBQWVXLE1BQWYsQ0FBc0IvRyxhQUF0QixFQUFxQyxLQUFyQztBQUNBLFNBNUNELE1BNENPO0FBQ045TSxVQUFBQSxJQUFJLENBQUN1UyxxQkFBTDtBQUNBOVMsVUFBQUEsT0FBTztBQUNQO0FBQ0QsT0FyRE0sQ0FBUDtBQXNEQTtBQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ3dGLDJCLEdBQUEsdUNBQThCO0FBQzdCLFdBQUszSCxZQUFMLEdBQW9CLElBQXBCO0FBQ0E7QUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNDaUQsZ0IsR0FBQSw0QkFBbUI7QUFDbEIsYUFBTyxLQUFLOUMsY0FBWjtBQUNBLEs7O1dBQ0RnSCwwQixHQUFBLG9DQUNDZ0ssWUFERCxFQUVDcksscUJBRkQsRUFHQzBQLGlCQUhELEVBSUNDLE9BSkQsRUFLQzlULE1BTEQsRUFNQ2pELFdBTkQsRUFPQzhDLGNBUEQsRUFRRTtBQUNEO0FBQ0EsVUFBTUUsSUFBSSxHQUFHLElBQWI7QUFDQSxVQUFJZ0wsT0FBSjtBQUNBLFVBQU1nSixjQUFjLEdBQUdoWCxXQUFXLENBQUMyRixhQUFuQztBQUFBLFVBQ0NzUixRQUFRLEdBQUcsS0FEWjtBQUVBLGFBQU8sSUFBSXpVLE9BQUosQ0FBWSxVQUFTQyxPQUFULEVBQXdDaUMsTUFBeEMsRUFBd0U7QUFDMUYsWUFBTXdPLGFBQWEsR0FBRyx3REFBdEI7O0FBQ0EsWUFBTWUsU0FBUyxHQUFHYixvQkFBb0IsQ0FBQ0MsWUFBckIsQ0FBa0NILGFBQWxDLEVBQWlELFVBQWpELENBQWxCO0FBQUEsWUFDQ3JRLGVBQWUsR0FBR21VLGNBQWMsQ0FBQ0UsYUFBZixHQUErQnJVLGVBRGxEO0FBQUEsWUFFQ0ssVUFBVSxHQUFHRCxNQUFNLENBQUM1QixZQUFQLEVBRmQ7QUFBQSxZQUdDOFYsZ0JBQXVCLEdBQUcsRUFIM0I7QUFBQSxZQUlDL1csYUFBYSxHQUFHNEMsSUFBSSxDQUFDTyxnQkFBTCxFQUpqQjtBQUFBLFlBS0MxQyxLQUFLLEdBQUc0USxZQUFZLENBQUN6USxVQUFiLEtBQTRCeVEsWUFBWSxDQUFDeFEsZUFBYixFQUE1QixHQUE2RHdRLFlBQVksQ0FBQzFRLE9BQWIsRUFMdEU7QUFBQSxZQU1DcVcsaUJBQWlCLEdBQUdsVSxVQUFVLENBQUNxRCxvQkFBWCxDQUFnQzFGLEtBQWhDLENBTnJCO0FBQUEsWUFPQ3NDLFNBQVMsR0FBR0QsVUFBVSxDQUFDRSxXQUFYLENBQXVCdkMsS0FBdkIsQ0FQYjs7QUFRQSxhQUFLLElBQU02SyxDQUFYLElBQWdCcUwsT0FBaEIsRUFBeUI7QUFDeEJJLFVBQUFBLGdCQUFnQixDQUFDOU4sSUFBakIsQ0FBc0JuRyxVQUFVLENBQUNxRCxvQkFBWCxDQUFnQ3BELFNBQVMsR0FBRyxHQUFaLEdBQWtCNFQsT0FBTyxDQUFDckwsQ0FBRCxDQUF6RCxDQUF0QjtBQUNBOztBQUNELFlBQU0yTCxrQkFBa0IsR0FBRyxJQUFJdkUsU0FBSixDQUFjcUUsZ0JBQWQsQ0FBM0I7QUFDQSxZQUFNRyxhQUFhLEdBQUdELGtCQUFrQixDQUFDOVEsb0JBQW5CLENBQXdDLEdBQXhDLENBQXRCO0FBQ0EsZUFBTy9ELE9BQU8sQ0FBQ0MsT0FBUixDQUNOaVIsZUFBZSxDQUFDQyxPQUFoQixDQUNDTSxTQURELEVBRUM7QUFBRUwsVUFBQUEsSUFBSSxFQUFFVjtBQUFSLFNBRkQsRUFHQztBQUNDVyxVQUFBQSxlQUFlLEVBQUU7QUFDaEIwRCxZQUFBQSxTQUFTLEVBQUVILGlCQURLO0FBRWhCSSxZQUFBQSxNQUFNLEVBQUVGO0FBRlEsV0FEbEI7QUFLQ3ZELFVBQUFBLE1BQU0sRUFBRTtBQUNQd0QsWUFBQUEsU0FBUyxFQUFFSCxpQkFBaUIsQ0FBQ2hXLFFBQWxCLEVBREo7QUFFUG9XLFlBQUFBLE1BQU0sRUFBRUYsYUFBYSxDQUFDbFcsUUFBZCxFQUZEO0FBR1A0UyxZQUFBQSxTQUFTLEVBQUU5UTtBQUhKO0FBTFQsU0FIRCxDQURNLEVBZ0JMMEQsSUFoQkssQ0FnQkEsVUFBU3FOLFNBQVQsRUFBeUI7QUFDL0IsY0FBSXdELGFBQW9CLEdBQUcsRUFBM0I7QUFDQSxjQUFNQyxjQUFtQixHQUFHLEVBQTVCO0FBQ0EsY0FBSUMsYUFBSjs7QUFDQSxjQUFNQywwQkFBMEIsR0FBRyxZQUFXO0FBQzdDLG1CQUFPcFYsT0FBTyxDQUFDOEcsR0FBUixDQUNObU8sYUFBYSxDQUNYbE8sR0FERixDQUNNLFVBQVNzTyxZQUFULEVBQTRCO0FBQ2hDLHFCQUFPQSxZQUFZLENBQUNDLFNBQWIsR0FBeUIsQ0FBekIsQ0FBUDtBQUNBLGFBSEYsRUFJRTNOLE1BSkYsQ0FJUyxVQUFTNE4sTUFBVCxFQUFzQjtBQUM3QixxQkFBT0EsTUFBTSxDQUFDQyxXQUFQLEVBQVA7QUFDQSxhQU5GLEVBT0V6TyxHQVBGLENBT00sVUFBU3dPLE1BQVQsRUFBc0I7QUFDMUIsa0JBQU1FLFFBQVEsR0FBR0YsTUFBTSxDQUFDRyxLQUFQLEVBQWpCOztBQUNBLGtCQUFJRCxRQUFRLElBQUlQLGNBQWhCLEVBQWdDO0FBQy9CLHVCQUFPbFYsT0FBTyxDQUFDQyxPQUFSLENBQWdCaVYsY0FBYyxDQUFDTyxRQUFELENBQTlCLEVBQ0xyUixJQURLLENBQ0EsVUFBU3VSLE1BQVQsRUFBc0I7QUFDM0IseUJBQU9BLE1BQVA7QUFDQSxpQkFISyxFQUlMdFIsS0FKSyxDQUlDLFlBQVc7QUFDakIseUJBQU83QyxTQUFQO0FBQ0EsaUJBTkssQ0FBUDtBQU9BOztBQUNELHFCQUFPK1QsTUFBTSxDQUFDSyxhQUFQLE9BQTJCdlksVUFBVSxDQUFDdVAsS0FBdEMsR0FBOENwTCxTQUE5QyxHQUEwRCtULE1BQU0sQ0FBQ00sUUFBUCxFQUFqRTtBQUNBLGFBbkJGLENBRE0sRUFzQkx6UixJQXRCSyxDQXNCQSxVQUFTMFIsUUFBVCxFQUEwQjtBQUMvQixxQkFBT0EsUUFBUSxDQUFDQyxLQUFULENBQWUsVUFBU0osTUFBVCxFQUFzQjtBQUMzQyx1QkFBT0EsTUFBTSxLQUFLblUsU0FBWCxJQUF3Qm1VLE1BQU0sS0FBSyxJQUFuQyxJQUEyQ0EsTUFBTSxLQUFLLEVBQTdEO0FBQ0EsZUFGTSxDQUFQO0FBR0EsYUExQkssRUEyQkx0UixLQTNCSyxDQTJCQyxZQUFXO0FBQ2pCLHFCQUFPLEtBQVA7QUFDQSxhQTdCSyxFQThCTEQsSUE5QkssQ0E4QkEsVUFBUzRSLFFBQVQsRUFBNEI7QUFDakNiLGNBQUFBLGFBQWEsQ0FBQzFCLFVBQWQsQ0FBeUJ1QyxRQUF6QjtBQUNBLGFBaENLLENBQVA7QUFpQ0EsV0FsQ0Q7O0FBbUNBLGNBQU1uRyxXQUFXLEdBQUc7QUFDbkI7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0tvRyxZQUFBQSxZQUFZLEVBQUUsVUFBU3BMLE1BQVQsRUFBc0I7QUFDbkN2SyxjQUFBQSxjQUFjLENBQUN1TSx3QkFBZjtBQUNBLGtCQUFNMEksTUFBTSxHQUFHMUssTUFBTSxDQUFDQyxTQUFQLEVBQWY7QUFDQSxrQkFBTTJLLFFBQVEsR0FBRzVLLE1BQU0sQ0FBQ3FMLFlBQVAsQ0FBb0IsSUFBcEIsQ0FBakI7QUFDQSxrQkFBTUMsYUFBYSxHQUFHdEwsTUFBTSxDQUFDcUwsWUFBUCxDQUFvQixTQUFwQixDQUF0Qjs7QUFDQSxrQkFBSUMsYUFBSixFQUFtQjtBQUNsQmpCLGdCQUFBQSxjQUFjLENBQUNPLFFBQUQsQ0FBZCxHQUEyQlUsYUFBYSxDQUFDL1IsSUFBZCxDQUFtQixZQUFXO0FBQ3hELHlCQUFPbVIsTUFBTSxDQUFDTSxRQUFQLEVBQVA7QUFDQSxpQkFGMEIsQ0FBM0I7QUFHQTs7QUFDRFQsY0FBQUEsMEJBQTBCO0FBQzFCLGFBbEJrQjs7QUFtQm5CO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDS2dCLFlBQUFBLGdCQUFnQixFQUFFLFVBQVN2TCxNQUFULEVBQXNCO0FBQ3ZDLGtCQUFNNEssUUFBUSxHQUFHNUssTUFBTSxDQUFDcUwsWUFBUCxDQUFvQixJQUFwQixDQUFqQjtBQUNBLGtCQUFNUCxNQUFNLEdBQUc5SyxNQUFNLENBQUNxTCxZQUFQLENBQW9CLE9BQXBCLENBQWY7QUFDQWhCLGNBQUFBLGNBQWMsQ0FBQ08sUUFBRCxDQUFkLEdBQTJCRSxNQUEzQjtBQUNBUCxjQUFBQSwwQkFBMEI7QUFDMUI7QUE3QmtCLFdBQXBCO0FBK0JBLGlCQUFPMUQsUUFBUSxDQUFDQyxJQUFULENBQWM7QUFDcEJDLFlBQUFBLFVBQVUsRUFBRUgsU0FEUTtBQUVwQkksWUFBQUEsVUFBVSxFQUFFaEM7QUFGUSxXQUFkLEVBR0p6TCxJQUhJLENBR0MsVUFBUzZMLGNBQVQsRUFBOEI7QUFDckN6RSxZQUFBQSxPQUFPLEdBQUcsSUFBSUMsTUFBSixDQUFXO0FBQ3BCM0MsY0FBQUEsS0FBSyxFQUFFcEYsV0FBVyxDQUFDd0UsaUJBQVosQ0FBOEIsMENBQTlCLEVBQTBFN0gsZUFBMUUsQ0FEYTtBQUVwQnNMLGNBQUFBLE9BQU8sRUFBRSxDQUFDc0UsY0FBRCxDQUZXO0FBR3BCbkUsY0FBQUEsV0FBVyxFQUFFO0FBQ1puQyxnQkFBQUEsSUFBSSxFQUFFakcsV0FBVyxDQUFDd0UsaUJBQVosQ0FBOEIsaURBQTlCLEVBQWlGN0gsZUFBakYsQ0FETTtBQUVaMkwsZ0JBQUFBLElBQUksRUFBRSxZQUZNO0FBR1pDLGdCQUFBQSxLQUFLLEVBQUUsVUFBU3BCLE1BQVQsRUFBc0I7QUFDNUIsc0JBQU1zSyxhQUFhLEdBQUd0SyxNQUFNLENBQUNDLFNBQVAsRUFBdEI7QUFDQXFLLGtCQUFBQSxhQUFhLENBQUMxQixVQUFkLENBQXlCLEtBQXpCO0FBQ0FuUixrQkFBQUEsVUFBVSxDQUFDQyxJQUFYLENBQWdCaUosT0FBaEI7QUFDQWhPLGtCQUFBQSxXQUFXLENBQUM2WSxlQUFaLEdBQThCLElBQTlCO0FBQ0EseUJBQU9yVyxPQUFPLENBQUM4RyxHQUFSLENBQ05wQyxNQUFNLENBQUM0UixJQUFQLENBQVlwQixjQUFaLEVBQTRCbk8sR0FBNUIsQ0FBZ0MsVUFBU3dQLElBQVQsRUFBdUI7QUFDdEQsMkJBQU9yQixjQUFjLENBQUNxQixJQUFELENBQWQsQ0FBcUJuUyxJQUFyQixDQUEwQixVQUFTb1MsTUFBVCxFQUFzQjtBQUN0RCwwQkFBTUMsWUFBaUIsR0FBRyxFQUExQjtBQUNBQSxzQkFBQUEsWUFBWSxDQUFDRixJQUFELENBQVosR0FBcUJDLE1BQXJCO0FBQ0EsNkJBQU9DLFlBQVA7QUFDQSxxQkFKTSxDQUFQO0FBS0EsbUJBTkQsQ0FETSxFQVNMclMsSUFUSyxDQVNBLFVBQVNzUyxPQUFULEVBQXlCO0FBQzlCLHdCQUFJeFIscUJBQUo7O0FBQ0Esd0JBQUkxSCxXQUFXLENBQUM2RSxvQkFBaEIsRUFBc0M7QUFDckM2QyxzQkFBQUEscUJBQXFCLEdBQUcxSCxXQUFXLENBQUM2RSxvQkFBWixDQUFpQztBQUN4RDhDLHdCQUFBQSxXQUFXLEVBQUU4SixZQUFZLElBQUlBLFlBQVksQ0FBQzFRLE9BQWIsRUFEMkI7QUFFeERvWSx3QkFBQUEsZ0JBQWdCLEVBQUVEO0FBRnNDLHVCQUFqQyxDQUF4QjtBQUlBLHFCQUxELE1BS087QUFDTnhSLHNCQUFBQSxxQkFBcUIsR0FBR2xGLE9BQU8sQ0FBQ0MsT0FBUixFQUF4QjtBQUNBOztBQUNELDJCQUFPaUYscUJBQVA7QUFDQSxtQkFwQkssRUFxQkxkLElBckJLLENBcUJBLFlBQVc7QUFDaEIsd0JBQU1rTCxRQUFRLEdBQUc5TyxJQUFJLENBQUM2RSx1QkFBTCxDQUNoQlQscUJBRGdCLEVBRWhCMFAsaUJBRmdCLEVBR2hCOVcsV0FIZ0IsQ0FBakI7QUFLQWlELG9CQUFBQSxNQUFNLENBQUNtVyxXQUFQLENBQW1CLGFBQW5CO0FBQ0EsMkJBQU90SCxRQUFQO0FBQ0EsbUJBN0JLLEVBOEJMbEwsSUE5QkssQ0E4QkEsVUFBU3lTLFNBQVQsRUFBeUI7QUFDOUIsd0JBQUksQ0FBQ0EsU0FBRCxJQUFlQSxTQUFTLElBQUlBLFNBQVMsQ0FBQ0MsZUFBVixLQUE4QixJQUE5RCxFQUFxRTtBQUNwRXRMLHNCQUFBQSxPQUFPLENBQUN1TCxpQkFBUixDQUEwQixJQUExQjtBQUNBdkwsc0JBQUFBLE9BQU8sQ0FBQ1UsS0FBUjtBQUNBak0sc0JBQUFBLE9BQU8sQ0FBQzRXLFNBQUQsQ0FBUDtBQUNBO0FBQ0QsbUJBcENLLEVBcUNMeFMsS0FyQ0ssQ0FxQ0MsVUFBU0MsTUFBVCxFQUFzQjtBQUM1QnBDLG9CQUFBQSxNQUFNLENBQUNvQyxNQUFELENBQU47QUFDQSxtQkF2Q0ssRUF3Q0x3QixPQXhDSyxDQXdDRyxZQUFXO0FBQ25CeEQsb0JBQUFBLFVBQVUsQ0FBQ3lELE1BQVgsQ0FBa0J5RixPQUFsQjtBQUNBMkosb0JBQUFBLGFBQWEsQ0FBQzFCLFVBQWQsQ0FBeUIsSUFBekI7QUFDQSwyQkFBT25ULGNBQWMsQ0FBQ2lMLFlBQWYsRUFBUDtBQUNBLG1CQTVDSyxDQUFQO0FBNkNBO0FBckRXLGVBSE87QUEwRHBCWSxjQUFBQSxTQUFTLEVBQUU7QUFDVnhDLGdCQUFBQSxJQUFJLEVBQUVqRyxXQUFXLENBQUN3RSxpQkFBWixDQUE4Qix5Q0FBOUIsRUFBeUU3SCxlQUF6RSxDQURJO0FBRVY0TCxnQkFBQUEsS0FBSyxFQUFFLFlBQVc7QUFDakJULGtCQUFBQSxPQUFPLENBQUNVLEtBQVI7QUFDQTtBQUpTLGVBMURTO0FBZ0VwQkUsY0FBQUEsVUFBVSxFQUFFLFlBQVc7QUFBQTs7QUFDdEI7QUFDQSx5Q0FBQ1osT0FBTyxDQUFDd0wsaUJBQVIsQ0FBMEIsVUFBMUIsQ0FBRCxnRkFBaUV4UCxXQUFqRSxDQUE2RSxvQkFBN0UsRUFBbUcsS0FBbkc7QUFDQWdFLGdCQUFBQSxPQUFPLENBQUNhLE9BQVI7O0FBQ0Esb0JBQUksQ0FBQ29JLFFBQUwsRUFBZTtBQUNkdlMsa0JBQUFBLE1BQU0sQ0FBQztBQUNOeUQsb0JBQUFBLHVCQUF1QixFQUFFLElBRG5CO0FBRU5zUixvQkFBQUEsOEJBQThCLEVBQUU7QUFGMUIsbUJBQUQsQ0FBTjtBQUlBO0FBQ0Q7QUExRW1CLGFBQVgsQ0FBVjtBQTRFQWhDLFlBQUFBLGFBQWEsR0FBR2hGLGNBQWMsQ0FDNUJpSCxjQURjLENBQ0MsTUFERCxFQUVkQSxjQUZjLENBRUMsZ0JBRkQsRUFFbUIsQ0FGbkIsRUFHZEEsY0FIYyxDQUdDLGNBSEQsQ0FBaEI7O0FBSUEsZ0JBQUkxQyxjQUFjLElBQUlBLGNBQWMsQ0FBQ3pDLFlBQXJDLEVBQW1EO0FBQ2xEO0FBQ0F5QyxjQUFBQSxjQUFjLENBQUN6QyxZQUFmLENBQTRCdkcsT0FBNUI7QUFDQTs7QUFDRDJKLFlBQUFBLGFBQWEsR0FBRzNKLE9BQU8sQ0FBQzJMLGNBQVIsRUFBaEI7QUFDQTNMLFlBQUFBLE9BQU8sQ0FBQ3VMLGlCQUFSLENBQTBCekMsaUJBQTFCO0FBQ0EsbUJBQU81USxXQUFXLENBQUMwVCxlQUFaLENBQ054WixhQURNLEVBRU4rVyxnQkFGTSxFQUdOTCxpQkFITSxFQUlOLEtBSk0sRUFLTjlXLFdBQVcsQ0FBQzZaLFlBTE4sRUFNTjdaLFdBQVcsQ0FBQ3FDLElBTk4sRUFRTHVFLElBUkssQ0FRQSxZQUFXO0FBQ2hCZ1IsY0FBQUEsMEJBQTBCLEdBRFYsQ0FFaEI7O0FBQ0M1SixjQUFBQSxPQUFPLENBQUN3TCxpQkFBUixDQUEwQixVQUExQixDQUFELENBQWdFeFAsV0FBaEUsQ0FBNEUsb0JBQTVFLEVBQWtHLElBQWxHO0FBQ0FnRSxjQUFBQSxPQUFPLENBQUNnQixJQUFSO0FBQ0EsYUFiSyxFQWNMbkksS0FkSyxDQWNDLFVBQVNDLE1BQVQsRUFBc0I7QUFDNUIscUJBQU9oRSxjQUFjLENBQUNpTCxZQUFmLEdBQThCbkgsSUFBOUIsQ0FBbUMsWUFBVztBQUNwRCx1QkFBT3BFLE9BQU8sQ0FBQ2tDLE1BQVIsQ0FBZW9DLE1BQWYsQ0FBUDtBQUNBLGVBRk0sQ0FBUDtBQUdBLGFBbEJLLENBQVA7QUFtQkEsV0E3R00sQ0FBUDtBQThHQSxTQXBNTSxDQUFQO0FBcU1BLE9BcE5NLENBQVA7QUFxTkEsSzs7V0FDRGUsdUIsR0FBQSxpQ0FBd0I0SixZQUF4QixFQUEyQ2hOLG1CQUEzQyxFQUFxRXpFLFdBQXJFLEVBQXVGO0FBQ3RGLFVBQUkrSyxTQUFKLEVBQXlCRCxRQUF6QjtBQUNBLFVBQU1nSCxRQUFRLEdBQUcsSUFBSXRQLE9BQUosQ0FBWSxVQUFTQyxPQUFULEVBQWtCaUMsTUFBbEIsRUFBMEI7QUFDdERxRyxRQUFBQSxTQUFTLEdBQUd0SSxPQUFaO0FBQ0FxSSxRQUFBQSxRQUFRLEdBQUdwRyxNQUFYO0FBQ0EsT0FIZ0IsQ0FBakIsQ0FGc0YsQ0FNdEY7O0FBQ0EsVUFBTTFCLElBQUksR0FBRyxJQUFiLENBUHNGLENBUXRGOztBQUNBLFVBQU04VyxpQkFBaUIsR0FBRyxVQUFTek0sTUFBVCxFQUFzQjtBQUMvQyxZQUFNMU0sUUFBUSxHQUFHME0sTUFBTSxDQUFDcUwsWUFBUCxDQUFvQixTQUFwQixDQUFqQjtBQUFBLFlBQ0N6QixRQUFRLEdBQUc1SixNQUFNLENBQUNxTCxZQUFQLENBQW9CLFNBQXBCLENBRFo7O0FBRUEsWUFBSS9YLFFBQVEsS0FBSzhELG1CQUFqQixFQUFzQztBQUNyQ2dOLFVBQUFBLFlBQVksQ0FBQ3NJLHFCQUFiLENBQW1DRCxpQkFBbkMsRUFBc0Q5VyxJQUF0RDs7QUFDQSxjQUFJLENBQUNpVSxRQUFMLEVBQWU7QUFDZCxnQkFBTW5RLE1BQVcsR0FBRztBQUFFcUIsY0FBQUEsdUJBQXVCLEVBQUU7QUFBM0IsYUFBcEI7O0FBQ0EsZ0JBQUksQ0FBQ25JLFdBQVcsQ0FBQ2dhLDRCQUFqQixFQUErQztBQUM5QztBQUVBO0FBQ0FyWixjQUFBQSxRQUFRLENBQ05zWixPQURGLEdBRUVyVCxJQUZGLENBRU81QyxTQUZQLEVBRWtCLFlBQVc7QUFDM0IrQyxnQkFBQUEsR0FBRyxDQUFDbVQsS0FBSixDQUFVLG9DQUFWO0FBQ0EsZUFKRixFQUtFclQsS0FMRixDQUtRLFVBQVNDLE1BQVQsRUFBc0I7QUFDNUJDLGdCQUFBQSxHQUFHLENBQUNtVCxLQUFKLENBQVUsMkNBQVYsRUFBdURwVCxNQUF2RDtBQUNBLGVBUEY7O0FBUUEsa0JBQUksQ0FBQzlHLFdBQVcsQ0FBQzZZLGVBQWpCLEVBQWtDO0FBQ2pDO0FBQ0EvUixnQkFBQUEsTUFBTSxDQUFDMlMsOEJBQVAsR0FBd0MsSUFBeEM7QUFDQTNTLGdCQUFBQSxNQUFNLENBQUNxQix1QkFBUCxHQUFpQyxJQUFqQztBQUNBMkMsZ0JBQUFBLFFBQVEsQ0FBQ2hFLE1BQUQsQ0FBUjtBQUNBO0FBQ0Q7O0FBQ0RpRSxZQUFBQSxTQUFTLENBQUM7QUFBRXVPLGNBQUFBLGVBQWUsRUFBRTtBQUFuQixhQUFELENBQVQ7QUFDQSxXQXRCRCxNQXNCTztBQUNOdk8sWUFBQUEsU0FBUztBQUNUO0FBQ0Q7QUFDRCxPQS9CRDs7QUFnQ0EwRyxNQUFBQSxZQUFZLENBQUMwSSxxQkFBYixDQUFtQ0wsaUJBQW5DLEVBQXNELElBQXREO0FBQ0EsYUFBT2hJLFFBQVA7QUFDQTtBQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQy9OLGEsR0FBQSx1QkFBY0gsa0JBQWQsRUFBdUNOLFdBQXZDLEVBQTRESixVQUE1RCxFQUF3RkMsU0FBeEYsRUFBMkc7QUFDMUcsVUFBSVcsVUFBSjs7QUFFQSxVQUFJRixrQkFBa0IsSUFBSUEsa0JBQWtCLENBQUN3VyxhQUF6QyxJQUEwRDlXLFdBQVcsQ0FBQ2dILE9BQVosQ0FBb0IscUJBQXBCLElBQTZDLENBQUMsQ0FBNUcsRUFBK0c7QUFDOUcsWUFBTStQLGNBQWMsR0FBR3pXLGtCQUFrQixDQUFDd1csYUFBbkIsQ0FBaUMsQ0FBakMsQ0FBdkI7QUFDQXRXLFFBQUFBLFVBQVUsR0FDVHVXLGNBQWMsQ0FBQy9QLE9BQWYsQ0FBdUIsYUFBdkIsSUFBd0MsQ0FBQyxDQUF6QyxHQUE2QytQLGNBQWMsQ0FBQzdHLE1BQWYsQ0FBc0I2RyxjQUFjLENBQUNyWSxXQUFmLENBQTJCLEdBQTNCLElBQWtDLENBQXhELENBQTdDLEdBQTBHZ0MsU0FEM0c7QUFFQSxPQUpELE1BSU87QUFDTkYsUUFBQUEsVUFBVSxHQUNUWixVQUFVLElBQUlBLFVBQVUsQ0FBQ2tCLFNBQVgsS0FBeUJKLFNBQXZDLEdBQ0dkLFVBQVUsQ0FBQ2tCLFNBQVgsQ0FBcUJqQixTQUFTLEdBQUcsbUVBQWpDLEtBQ0FELFVBQVUsQ0FBQ2tCLFNBQVgsQ0FBcUJqQixTQUFTLEdBQUcscURBQWpDLENBRkgsR0FHR2EsU0FKSjtBQUtBOztBQUNELGFBQU9GLFVBQVA7QUFDQTtBQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0MyQixtQyxHQUFBLDZDQUNDdkMsVUFERCxFQUVDQyxTQUZELEVBR0NXLFVBSEQsRUFJQ2tCLG1CQUpELEVBS0U7QUFDRCxVQUFNc1YsZ0NBQWdDLEdBQUcsWUFBVztBQUNuRCxZQUFJcFgsVUFBVSxJQUFJQSxVQUFVLENBQUNrQixTQUFYLENBQXFCakIsU0FBUyxHQUFHLHVDQUFqQyxDQUFsQixFQUE2RjtBQUM1RixjQUFNb1gsY0FBYyxHQUFHclgsVUFBVSxDQUMvQmtCLFNBRHFCLENBQ1hqQixTQUFTLEdBQUcsdUNBREQsRUFFckJxWCxTQUZxQixDQUVYLFVBQVNDLFNBQVQsRUFBeUI7QUFDbkMsZ0JBQU1DLGVBQWUsR0FBR0QsU0FBUyxDQUFDRSxNQUFWLEdBQW1CRixTQUFTLENBQUNFLE1BQVYsQ0FBaUIzSSxLQUFqQixDQUF1QixHQUF2QixDQUFuQixHQUFpRGhPLFNBQXpFO0FBQ0EsbUJBQU8wVyxlQUFlLEdBQUdBLGVBQWUsQ0FBQyxDQUFELENBQWYsS0FBdUI1VyxVQUExQixHQUF1QyxLQUE3RDtBQUNBLFdBTHFCLENBQXZCO0FBTUEsaUJBQU95VyxjQUFjLEdBQUcsQ0FBQyxDQUFsQixHQUNKclgsVUFBVSxDQUFDa0IsU0FBWCxDQUFxQmpCLFNBQVMsR0FBRyx1Q0FBakMsRUFBMEVvWCxjQUExRSxFQUEwRkssS0FEdEYsR0FFSjVXLFNBRkg7QUFHQSxTQVZELE1BVU87QUFDTixpQkFBT0EsU0FBUDtBQUNBO0FBQ0QsT0FkRDs7QUFnQkEsYUFDQ3NXLGdDQUFnQyxNQUMvQnBYLFVBQVUsSUFBSUEsVUFBVSxDQUFDa0IsU0FBWCxDQUFxQmpCLFNBQVMsR0FBRyxHQUFaLEdBQWtCVyxVQUFsQixHQUErQix1Q0FBcEQsQ0FEZixJQUVDa0IsbUJBQW1CLElBQUlBLG1CQUFtQixDQUFDdUcsT0FBcEIsQ0FBNEIsMENBQTVCLENBSHpCO0FBS0EsSzs7Ozs7U0FHYXBMLGlCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2FjdGlvbnMvZHJhZnRcIjtcbmltcG9ydCBzdGlja3kgZnJvbSBcInNhcC9mZS9jb3JlL2FjdGlvbnMvc3RpY2t5XCI7XG5pbXBvcnQgb3BlcmF0aW9ucyBmcm9tIFwic2FwL2ZlL2NvcmUvYWN0aW9ucy9vcGVyYXRpb25zXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBQb3BvdmVyIGZyb20gXCJzYXAvbS9Qb3BvdmVyXCI7XG5pbXBvcnQgVkJveCBmcm9tIFwic2FwL20vVkJveFwiO1xuaW1wb3J0IENoZWNrQm94IGZyb20gXCJzYXAvbS9DaGVja0JveFwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL0J1c3lMb2NrZXJcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgWE1MVGVtcGxhdGVQcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL1hNTFRlbXBsYXRlUHJvY2Vzc29yXCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IE1vZGVsSGVscGVyLCB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBjb3JlTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvYWN0aW9ucy9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgRlBNSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0ZQTUhlbHBlclwiO1xuXG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmNvbnN0IENyZWF0aW9uTW9kZSA9IEZFTGlicmFyeS5DcmVhdGlvbk1vZGU7XG5jb25zdCBQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWw7XG5jb25zdCBWYWx1ZVN0YXRlID0gY29yZUxpYnJhcnkuVmFsdWVTdGF0ZTtcbi8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBtUGFyYW1ldGVycyBpcyBub3QgdGhlIG9FdmVudCAqL1xuZnVuY3Rpb24gZ2V0UGFyYW1ldGVycyhtUGFyYW1ldGVyczogYW55KSB7XG5cdGlmIChtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5nZXRNZXRhZGF0YSAmJiBtUGFyYW1ldGVycy5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKSA9PT0gXCJzYXAudWkuYmFzZS5FdmVudFwiKSB7XG5cdFx0bVBhcmFtZXRlcnMgPSB7fTtcblx0fVxuXHRyZXR1cm4gbVBhcmFtZXRlcnMgfHwge307XG59XG5cbmNsYXNzIFRyYW5zYWN0aW9uSGVscGVyIHtcblx0X29BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudDtcblx0b0xvY2tPYmplY3Q6IGFueTtcblx0c1Byb2dyYW1taW5nTW9kZWw/OiB0eXBlb2YgUHJvZ3JhbW1pbmdNb2RlbDtcblx0X2JJc01vZGlmaWVkOiBib29sZWFuID0gZmFsc2U7XG5cdF9iQ3JlYXRlTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuXHRfYkNvbnRpbnVlRGlzY2FyZDogYm9vbGVhbiA9IGZhbHNlO1xuXHRfb1BvcG92ZXIhOiBQb3BvdmVyO1xuXHRjb25zdHJ1Y3RvcihvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIG9Mb2NrT2JqZWN0OiBhbnkpIHtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gb0FwcENvbXBvbmVudDtcblx0XHR0aGlzLm9Mb2NrT2JqZWN0ID0gb0xvY2tPYmplY3Q7XG5cdH1cblx0Z2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dDogYW55KTogdHlwZW9mIFByb2dyYW1taW5nTW9kZWwge1xuXHRcdGlmICghdGhpcy5zUHJvZ3JhbW1pbmdNb2RlbCAmJiBvQ29udGV4dCkge1xuXHRcdFx0bGV0IHNQYXRoO1xuXHRcdFx0aWYgKG9Db250ZXh0LmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB7XG5cdFx0XHRcdHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c1BhdGggPSBvQ29udGV4dC5pc1JlbGF0aXZlKCkgPyBvQ29udGV4dC5nZXRSZXNvbHZlZFBhdGgoKSA6IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHRcdH1cblx0XHRcdGlmIChNb2RlbEhlbHBlci5pc0RyYWZ0U3VwcG9ydGVkKG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksIHNQYXRoKSkge1xuXHRcdFx0XHR0aGlzLnNQcm9ncmFtbWluZ01vZGVsID0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblx0XHRcdH0gZWxzZSBpZiAoTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkpKSB7XG5cdFx0XHRcdHRoaXMuc1Byb2dyYW1taW5nTW9kZWwgPSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIGFzIHRoZSB0cmFuc2FjdGlvbiBoZWxwZXIgaXMgYSBzaW5nbGV0b24gd2UgZG9uJ3Qgc3RvcmUgdGhlIG5vbiBkcmFmdCBhcyB0aGUgdXNlciBjb3VsZFxuXHRcdFx0XHQvLyBzdGFydCB3aXRoIGEgbm9uIGRyYWZ0IGNoaWxkIHBhZ2UgYW5kIG5hdmlnYXRlcyBiYWNrIHRvIGEgZHJhZnQgZW5hYmxlZCBvbmVcblx0XHRcdFx0cmV0dXJuIFByb2dyYW1taW5nTW9kZWwuTm9uRHJhZnQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLnNQcm9ncmFtbWluZ01vZGVsIGFzIHR5cGVvZiBQcm9ncmFtbWluZ01vZGVsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFZhbGlkYXRlcyBhIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSB2YWxpZGF0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IFttUGFyYW1ldGVyc10gQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiAqIEBwYXJhbSB7b2JqZWN0fSBbbVBhcmFtZXRlcnMuZGF0YV0gQSBtYXAgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSB2YWxpZGF0ZWRcblx0ICogKiBAcGFyYW0ge3N0cmluZ30gW21QYXJhbWV0ZXJzLmN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbl0gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHRvIHRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvVmlldyBDb250YWlucyB0aGUgb2JqZWN0IG9mIHRoZSBjdXJyZW50IHZpZXdcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgd2l0aCByZXN1bHQgb2YgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdHZhbGlkYXRlRG9jdW1lbnQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSwgb1ZpZXc6IFZpZXcpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPSBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb247XG5cdFx0aWYgKHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pIHtcblx0XHRcdGNvbnN0IHNNb2R1bGUgPSBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLnN1YnN0cmluZygwLCBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxhc3RJbmRleE9mKFwiLlwiKSB8fCAtMSkucmVwbGFjZSgvXFwuL2dpLCBcIi9cIiksXG5cdFx0XHRcdHNGdW5jdGlvbk5hbWUgPSBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLnN1YnN0cmluZyhcblx0XHRcdFx0XHRzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxhc3RJbmRleE9mKFwiLlwiKSArIDEsXG5cdFx0XHRcdFx0c0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5sZW5ndGhcblx0XHRcdFx0KSxcblx0XHRcdFx0bURhdGEgPSBtUGFyYW1ldGVycy5kYXRhO1xuXHRcdFx0ZGVsZXRlIG1EYXRhW1wiQCR1aTUuY29udGV4dC5pc1RyYW5zaWVudFwiXTtcblx0XHRcdHJldHVybiBGUE1IZWxwZXIudmFsaWRhdGlvbldyYXBwZXIoc01vZHVsZSwgc0Z1bmN0aW9uTmFtZSwgbURhdGEsIG9WaWV3LCBvQ29udGV4dCk7XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmd9IG9NYWluTGlzdEJpbmRpbmcgT0RhdGEgVjQgTGlzdEJpbmRpbmcgb2JqZWN0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbbUluUGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHttYXB9IFttSW5QYXJhbWV0ZXJzLmRhdGFdIEEgbWFwIG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgc2VudCB3aXRoaW4gdGhlIFBPU1Rcblx0ICogQHBhcmFtIHtzdHJpbmd9IFttSW5QYXJhbWV0ZXJzLmJ1c3lNb2RlXSBHbG9iYWwgKGRlZmF1bHQpLCBMb2NhbCwgTm9uZSBUT0RPOiB0byBiZSByZWZhY3RvcmVkXG5cdCAqIEBwYXJhbSB7bWFwfSBbbUluUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkXSBJZiBzZXQsIHRoZSBjb250ZXh0IHN0YXlzIGluIHRoZSBsaXN0IGlmIHRoZSBQT1NUIGZhaWxlZCBhbmQgUE9TVCB3aWxsIGJlIHJlcGVhdGVkIHdpdGggdGhlIG5leHQgY2hhbmdlXG5cdCAqIEBwYXJhbSBvUmVzb3VyY2VCdW5kbGVcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG5cdCAqIEBwYXJhbSBiRnJvbUNvcHlQYXN0ZVxuXHQgKiBAcGFyYW0gb1ZpZXcgVGhlIGN1cnJlbnQgdmlld1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyB3aXRoIG5ldyBiaW5kaW5nIGNvbnRleHRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0Y3JlYXRlRG9jdW1lbnQoXG5cdFx0b01haW5MaXN0QmluZGluZzogYW55LFxuXHRcdG1JblBhcmFtZXRlcnM6IHsgZGF0YT86IGFueTsgYnVzeU1vZGU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7IGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ/OiBhbnkgfSB8IHVuZGVmaW5lZCxcblx0XHRvUmVzb3VyY2VCdW5kbGU6IGFueSxcblx0XHRtZXNzYWdlSGFuZGxlcjogYW55LFxuXHRcdGJGcm9tQ29weVBhc3RlOiBib29sZWFuID0gZmFsc2UsXG5cdFx0b1ZpZXc6IGFueVxuXHQpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcyxcblx0XHRcdG9Nb2RlbCA9IG9NYWluTGlzdEJpbmRpbmcuZ2V0TW9kZWwoKSxcblx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9NYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpLmdldFBhdGgoKSksXG5cdFx0XHRzQ3JlYXRlSGFzaCA9IHRoaXMuX2dldEFwcENvbXBvbmVudCgpXG5cdFx0XHRcdC5nZXRSb3V0ZXJQcm94eSgpXG5cdFx0XHRcdC5nZXRIYXNoKCksXG5cdFx0XHRvQ29tcG9uZW50RGF0YSA9IHRoaXMuX2dldEFwcENvbXBvbmVudCgpLmdldENvbXBvbmVudERhdGEoKSxcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyA9IChvQ29tcG9uZW50RGF0YSAmJiBvQ29tcG9uZW50RGF0YS5zdGFydHVwUGFyYW1ldGVycykgfHwge30sXG5cdFx0XHRzTmV3QWN0aW9uID0gIW9NYWluTGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpXG5cdFx0XHRcdD8gdGhpcy5fZ2V0TmV3QWN0aW9uKG9TdGFydHVwUGFyYW1ldGVycywgc0NyZWF0ZUhhc2gsIG9NZXRhTW9kZWwsIHNNZXRhUGF0aClcblx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0bGV0IG9DcmVhdGlvblByb21pc2U7XG5cdFx0Y29uc3QgbUJpbmRpbmdQYXJhbWV0ZXJzOiBhbnkgPSB7IFwiJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0c1wiOiB0cnVlIH07XG5cdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNNZXRhUGF0aCArIFwiL0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWVzc2FnZXMvJFBhdGhcIik7XG5cdFx0bGV0IHNCdXN5UGF0aCA9IFwiL2J1c3lcIjtcblx0XHRsZXQgc0Z1bmN0aW9uTmFtZSA9XG5cdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVmYXVsdFZhbHVlc0Z1bmN0aW9uXCIpIHx8XG5cdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChcblx0XHRcdFx0TW9kZWxIZWxwZXIuZ2V0VGFyZ2V0RW50aXR5U2V0KG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzTWV0YVBhdGgpKSArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EZWZhdWx0VmFsdWVzRnVuY3Rpb25cIlxuXHRcdFx0KTtcblx0XHRsZXQgYkZ1bmN0aW9uT25OYXZQcm9wO1xuXHRcdGxldCBvTmV3RG9jdW1lbnRDb250ZXh0OiBhbnk7XG5cdFx0aWYgKHNGdW5jdGlvbk5hbWUpIHtcblx0XHRcdGlmIChcblx0XHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRlZmF1bHRWYWx1ZXNGdW5jdGlvblwiKSAmJlxuXHRcdFx0XHRNb2RlbEhlbHBlci5nZXRUYXJnZXRFbnRpdHlTZXQob01ldGFNb2RlbC5nZXRDb250ZXh0KHNNZXRhUGF0aCkpICE9PSBzTWV0YVBhdGhcblx0XHRcdCkge1xuXHRcdFx0XHRiRnVuY3Rpb25Pbk5hdlByb3AgPSB0cnVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YkZ1bmN0aW9uT25OYXZQcm9wID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRtQmluZGluZ1BhcmFtZXRlcnNbXCIkc2VsZWN0XCJdID0gc01lc3NhZ2VzUGF0aDtcblx0XHR9XG5cdFx0Y29uc3QgbVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1JblBhcmFtZXRlcnMpO1xuXHRcdGlmICghb01haW5MaXN0QmluZGluZykge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQmluZGluZyByZXF1aXJlZCBmb3IgbmV3IGRvY3VtZW50IGNyZWF0aW9uXCIpO1xuXHRcdH1cblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvTWFpbkxpc3RCaW5kaW5nKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJDcmVhdGUgZG9jdW1lbnQgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0fVxuXHRcdGlmIChtUGFyYW1ldGVycy5idXN5TW9kZSA9PT0gXCJMb2NhbFwiKSB7XG5cdFx0XHQvLyBpbiBjYXNlIG9mIGxvY2FsIGJ1c3kgbW9kZSB3ZSB1c2UgdGhlIGxpc3QgYmluZGluZyBuYW1lXG5cdFx0XHQvLyB0aGVyZSdzIG5vIEFQWSB5ZXQgc28gd2UgaGF2ZSB0byB1c2UgdGhlIC5zSWQgVE9ETyBwcm92aWRlIGEgcHVibGljIG1ldGhvZD9cblx0XHRcdHNCdXN5UGF0aCA9IFwiL2J1c3lMb2NhbC9cIiArIG9NYWluTGlzdEJpbmRpbmcuc0lkO1xuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayA9IGJGcm9tQ29weVBhc3RlID8gbnVsbCA6IG1QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrO1xuXHRcdEJ1c3lMb2NrZXIubG9jayh0aGlzLm9Mb2NrT2JqZWN0LCBzQnVzeVBhdGgpO1xuXHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZUNvcmUgPSBzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRcdGlmIChzTmV3QWN0aW9uKSB7XG5cdFx0XHRvQ3JlYXRpb25Qcm9taXNlID0gdGhpcy5jYWxsQWN0aW9uKFxuXHRcdFx0XHRzTmV3QWN0aW9uLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y29udGV4dHM6IG9NYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpLFxuXHRcdFx0XHRcdHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c6IHRydWUsXG5cdFx0XHRcdFx0bGFiZWw6IHRoaXMuX2dldFNwZWNpZmljQ3JlYXRlQWN0aW9uRGlhbG9nTGFiZWwoXG5cdFx0XHRcdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0c01ldGFQYXRoLFxuXHRcdFx0XHRcdFx0c05ld0FjdGlvbixcblx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZUNvcmUgYXMgUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzOiBtQmluZGluZ1BhcmFtZXRlcnMsXG5cdFx0XHRcdFx0cGFyZW50Q29udHJvbDogbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCxcblx0XHRcdFx0XHRiSXNDcmVhdGVBY3Rpb246IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0bWVzc2FnZUhhbmRsZXJcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGJJc05ld1BhZ2VDcmVhdGlvbiA9XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmIG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLklubGluZTtcblx0XHRcdGNvbnN0IGFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMgPSBiSXNOZXdQYWdlQ3JlYXRpb25cblx0XHRcdFx0PyBDb21tb25VdGlscy5nZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMob01ldGFNb2RlbCwgc01ldGFQYXRoLCBvVmlldylcblx0XHRcdFx0OiBbXTtcblx0XHRcdHNGdW5jdGlvbk5hbWUgPSBiRnJvbUNvcHlQYXN0ZSA/IG51bGwgOiBzRnVuY3Rpb25OYW1lO1xuXHRcdFx0bGV0IHNGdW5jdGlvblBhdGgsIG9GdW5jdGlvbkNvbnRleHQ7XG5cdFx0XHRpZiAoc0Z1bmN0aW9uTmFtZSkge1xuXHRcdFx0XHQvL2JvdW5kIHRvIHRoZSBzb3VyY2UgZW50aXR5OlxuXHRcdFx0XHRpZiAoYkZ1bmN0aW9uT25OYXZQcm9wKSB7XG5cdFx0XHRcdFx0c0Z1bmN0aW9uUGF0aCA9XG5cdFx0XHRcdFx0XHRvTWFpbkxpc3RCaW5kaW5nLmdldENvbnRleHQoKSAmJlxuXHRcdFx0XHRcdFx0b01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTWFpbkxpc3RCaW5kaW5nLmdldENvbnRleHQoKS5nZXRQYXRoKCkpICsgXCIvXCIgKyBzRnVuY3Rpb25OYW1lO1xuXHRcdFx0XHRcdG9GdW5jdGlvbkNvbnRleHQgPSBvTWFpbkxpc3RCaW5kaW5nLmdldENvbnRleHQoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzRnVuY3Rpb25QYXRoID1cblx0XHRcdFx0XHRcdG9NYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpICYmXG5cdFx0XHRcdFx0XHRvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9NYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpLmdldFBhdGgoKSkgKyBcIi9cIiArIHNGdW5jdGlvbk5hbWU7XG5cdFx0XHRcdFx0b0Z1bmN0aW9uQ29udGV4dCA9IG9NYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBvRnVuY3Rpb24gPSBzRnVuY3Rpb25QYXRoICYmIG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bmN0aW9uUGF0aCk7XG5cdFx0XHRpZiAob0Z1bmN0aW9uICYmIG9GdW5jdGlvbi5nZXRPYmplY3QoKSAmJiBvRnVuY3Rpb24uZ2V0T2JqZWN0KClbMF0uJElzQm91bmQpIHtcblx0XHRcdFx0b0NyZWF0aW9uUHJvbWlzZSA9IG9wZXJhdGlvbnMuY2FsbEJvdW5kRnVuY3Rpb24oc0Z1bmN0aW9uTmFtZSwgb0Z1bmN0aW9uQ29udGV4dCwgb01vZGVsKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9DcmVhdGlvblByb21pc2UgPSBvcGVyYXRpb25zLmNhbGxGdW5jdGlvbkltcG9ydChzRnVuY3Rpb25OYW1lLCBvTW9kZWwpO1xuXHRcdFx0fVxuXG5cdFx0XHRvQ3JlYXRpb25Qcm9taXNlID0gb0NyZWF0aW9uUHJvbWlzZVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbihvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0aWYgKG9Db250ZXh0KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24ob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIGZ1bmN0aW9uIFwiICsgc0Z1bmN0aW9uTmFtZSwgb0Vycm9yKTtcblx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uKG9EYXRhOiBhbnkpIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhID0gb0RhdGEgPyBPYmplY3QuYXNzaWduKHt9LCBvRGF0YSwgbVBhcmFtZXRlcnMuZGF0YSkgOiBtUGFyYW1ldGVycy5kYXRhO1xuXHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5kYXRhKSB7XG5cdFx0XHRcdFx0XHRkZWxldGUgbVBhcmFtZXRlcnMuZGF0YVtcIkBvZGF0YS5jb250ZXh0XCJdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvVHJhbnNpZW50TGlzdEJpbmRpbmcgPSBvTW9kZWwuYmluZExpc3Qob01haW5MaXN0QmluZGluZy5nZXRQYXRoKCksIG9NYWluTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLCBbXSwgW10sIHtcblx0XHRcdFx0XHRcdFx0JCR1cGRhdGVHcm91cElkOiBcInN1Ym1pdExhdGVyXCJcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0b1RyYW5zaWVudExpc3RCaW5kaW5nLnJlZnJlc2hJbnRlcm5hbCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHQvKiAqL1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdG9OZXdEb2N1bWVudENvbnRleHQgPSBvVHJhbnNpZW50TGlzdEJpbmRpbmcuY3JlYXRlKG1QYXJhbWV0ZXJzLmRhdGEsIHRydWUpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoYXQuX2xhdW5jaERpYWxvZ1dpdGhLZXlGaWVsZHMoXG5cdFx0XHRcdFx0XHRcdG9NYWluTGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdG9UcmFuc2llbnRMaXN0QmluZGluZyxcblx0XHRcdFx0XHRcdFx0b05ld0RvY3VtZW50Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0YU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyxcblx0XHRcdFx0XHRcdFx0b01vZGVsLFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGxldCBvbkJlZm9yZUNyZWF0ZVByb21pc2U7XG5cdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2spIHtcblx0XHRcdFx0XHRcdFx0b25CZWZvcmVDcmVhdGVQcm9taXNlID0gbVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2soe1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBvTWFpbkxpc3RCaW5kaW5nICYmIG9NYWluTGlzdEJpbmRpbmcuZ2V0UGF0aCgpXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b25CZWZvcmVDcmVhdGVQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gb25CZWZvcmVDcmVhdGVQcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdG9OZXdEb2N1bWVudENvbnRleHQgPSBvTWFpbkxpc3RCaW5kaW5nLmNyZWF0ZShtUGFyYW1ldGVycy5kYXRhLCB0cnVlLCBtUGFyYW1ldGVycy5jcmVhdGVBdEVuZCk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0aGF0Lm9uQWZ0ZXJDcmVhdGVDb21wbGV0aW9uKG9NYWluTGlzdEJpbmRpbmcsIG9OZXdEb2N1bWVudENvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIG5ldyBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdHRocm93IG9FcnJvcjtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvQ3JlYXRpb25Qcm9taXNlXG5cdFx0XHQudGhlbihmdW5jdGlvbihvUmVzdWx0OiBhbnkpIHtcblx0XHRcdFx0aWYgKCFvTWFpbkxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0XHRcdC8vIHRoZSBjcmVhdGUgbW9kZSBzaGFsbCBjdXJyZW50bHkgb25seSBiZSBzZXQgb24gY3JlYXRpbmcgYSByb290IGRvY3VtZW50XG5cdFx0XHRcdFx0dGhhdC5fYkNyZWF0ZU1vZGUgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9OZXdEb2N1bWVudENvbnRleHQgPSBvTmV3RG9jdW1lbnRDb250ZXh0IHx8IChvUmVzdWx0ICYmIG9SZXN1bHQucmVzcG9uc2UpO1xuXHRcdFx0XHQvLyBUT0RPOiB3aGVyZSBkb2VzIHRoaXMgb25lIGNvbWluZyBmcm9tPz8/XG5cdFx0XHRcdGlmIChvUmVzdWx0ICYmIG9SZXN1bHQuYkNvbnNpZGVyRG9jdW1lbnRNb2RpZmllZCkge1xuXHRcdFx0XHRcdHRoYXQuaGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKCkudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gb05ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0Ly8gZm9yIGluc3RhbmNlLCBvbiBjYW5jZWwgb2YgY3JlYXRlIGRpYWxvZywgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWRcblx0XHRcdFx0XHQvLyBhIHJldHVybiBoZXJlIHdvdWxkIHJlc3RvcmUgdGhlIHByb21pc2UgY2hhaW4gYW5kIHJlc3VsdCBpbiBlcnJvcnMgd2hpbGUgcm91dGluZ1xuXHRcdFx0XHRcdC8vIHNvbHV0aW9uIC0gIHJlamVjdCBoZXJlIGFzIHdlbGxcblx0XHRcdFx0XHRpZiAob0Vycm9yICYmIG9FcnJvci5iRGVsZXRlVHJhbnNpZW50Q29udGV4dCAmJiBvTmV3RG9jdW1lbnRDb250ZXh0LmlzVHJhbnNpZW50KCkpIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSB3b3JrYXJvdW5kIHN1Z2dlc3RlZCBieSBtb2RlbCBhcyBDb250ZXh0LmRlbGV0ZSByZXN1bHRzIGluIGFuIGVycm9yXG5cdFx0XHRcdFx0XHQvLyBUT0RPOiByZW1vdmUgdGhlICRkaXJlY3Qgb25jZSBtb2RlbCByZXNvbHZlcyB0aGlzIGlzc3VlXG5cdFx0XHRcdFx0XHQvLyB0aGlzIGxpbmUgc2hvd3MgdGhlIGV4cGVjdGVkIGNvbnNvbGUgZXJyb3IgVW5jYXVnaHQgKGluIHByb21pc2UpIEVycm9yOiBSZXF1ZXN0IGNhbmNlbGVkOiBQT1NUIFRyYXZlbDsgZ3JvdXA6IHN1Ym1pdExhdGVyXG5cdFx0XHRcdFx0XHRvTmV3RG9jdW1lbnRDb250ZXh0LmRlbGV0ZShcIiRkaXJlY3RcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChvRXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseShmdW5jdGlvbigpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCwgc0J1c3lQYXRoKTtcblx0XHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBGaW5kIHRoZSBhY3RpdmUgY29udGV4dHMgb2YgdGhlIGRvY3VtZW50cywgb25seSBmb3IgdGhlIGRyYWZ0IHJvb3RzLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0W119IGFDb250ZXh0cyBDb250ZXh0cyBFaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBiRmluZEFjdGl2ZUNvbnRleHRzXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gQXJyYXkgb2YgdGhlIGFjdGl2ZSBjb250ZXh0c1xuXHQgKi9cblx0ZmluZEFjdGl2ZURyYWZ0Um9vdENvbnRleHRzKGFDb250ZXh0czogYW55W10sIGJGaW5kQWN0aXZlQ29udGV4dHM6IGFueSkge1xuXHRcdGlmICghYkZpbmRBY3RpdmVDb250ZXh0cykge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0XHRjb25zdCBhY3RpdmVDb250ZXh0cyA9IGFDb250ZXh0cy5yZWR1Y2UoZnVuY3Rpb24oYVJlc3VsdDogYW55LCBvQ29udGV4dDogYW55KSB7XG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGlmIChvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCIpKSB7XG5cdFx0XHRcdGNvbnN0IGJJc0FjdGl2ZUVudGl0eSA9IG9Db250ZXh0LmdldE9iamVjdCgpLklzQWN0aXZlRW50aXR5LFxuXHRcdFx0XHRcdGJIYXNBY3RpdmVFbnRpdHkgPSBvQ29udGV4dC5nZXRPYmplY3QoKS5IYXNBY3RpdmVFbnRpdHk7XG5cdFx0XHRcdGlmICghYklzQWN0aXZlRW50aXR5ICYmIGJIYXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdFx0XHRjb25zdCBvQWN0aXZlQ29udGV4dCA9IG9Db250ZXh0XG5cdFx0XHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdFx0LmJpbmRDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSArIFwiL1NpYmxpbmdFbnRpdHlcIilcblx0XHRcdFx0XHRcdC5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRhUmVzdWx0LnB1c2gob0FjdGl2ZUNvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYVJlc3VsdDtcblx0XHR9LCBbXSk7XG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0YWN0aXZlQ29udGV4dHMubWFwKGZ1bmN0aW9uKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKCkudGhlbihcblx0XHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQ29udGV4dDtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0KTtcblx0XHRcdH0pXG5cdFx0KTtcblx0fVxuXHRhZnRlckRlbGV0ZVByb2Nlc3MobVBhcmFtZXRlcnM6IGFueSwgY2hlY2tCb3g6IGFueSwgYUNvbnRleHRzOiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogYW55KSB7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0aWYgKG9JbnRlcm5hbE1vZGVsQ29udGV4dCAmJiBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJkZWxldGVFbmFibGVkXCIpICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKGNoZWNrQm94LmlzQ2hlY2tCb3hWaXNpYmxlID09PSB0cnVlICYmIGNoZWNrQm94LmlzQ2hlY2tCb3hTZWxlY3RlZCA9PT0gZmFsc2UpIHtcblx0XHRcdFx0Ly9pZiB1bnNhdmVkIG9iamVjdHMgYXJlIG5vdCBkZWxldGVkIHRoZW4gd2UgbmVlZCB0byBzZXQgdGhlIGVuYWJsZWQgdG8gdHJ1ZSBhbmQgdXBkYXRlIHRoZSBtb2RlbCBkYXRhIGZvciBuZXh0IGRlbGV0aW9uXG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImRlbGV0ZUVuYWJsZWRcIiwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IG9iaiA9IE9iamVjdC5hc3NpZ24ob0ludGVybmFsTW9kZWxDb250ZXh0LmdldE9iamVjdCgpLCB7fSk7XG5cdFx0XHRcdG9iai5zZWxlY3RlZENvbnRleHRzID0gb2JqLnNlbGVjdGVkQ29udGV4dHMuZmlsdGVyKGZ1bmN0aW9uKGVsZW1lbnQ6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBvYmouZGVsZXRhYmxlQ29udGV4dHMuaW5kZXhPZihlbGVtZW50KSA9PT0gLTE7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRvYmouZGVsZXRhYmxlQ29udGV4dHMgPSBbXTtcblx0XHRcdFx0b2JqLnNlbGVjdGVkQ29udGV4dHMgPSBbXTtcblx0XHRcdFx0b2JqLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9IG9iai5zZWxlY3RlZENvbnRleHRzLmxlbmd0aDtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiXCIsIG9iaik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJkZWxldGVFbmFibGVkXCIsIGZhbHNlKTtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwic2VsZWN0ZWRDb250ZXh0c1wiLCBbXSk7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1wiLCAwKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGFDb250ZXh0cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KFxuXHRcdFx0XHRDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0RFTEVURV9UT0FTVF9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0TWVzc2FnZVRvYXN0LnNob3coXG5cdFx0XHRcdENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfREVMRVRFX1RPQVNUX1BMVVJBTFwiLFxuXHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCAqIERlbGV0ZSBvbmUgb3IgbXVsdGlwbGUgZG9jdW1lbnQocykuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IHZDb250ZXh0cyBDb250ZXh0cyBFaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycyBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbVBhcmFtZXRlcnMudGl0bGUgVGl0bGUgb2YgdGhlIG9iamVjdCB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtUGFyYW1ldGVycy5kZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIHtpbnRlZ2VyfSBtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgTnVtYmVyIG9mIG9iamVjdHMgc2VsZWN0ZWRcblx0ICogQHBhcmFtIHtib29sZWFufSBtUGFyYW1ldGVycy5ub0RpYWxvZyBUbyBkaXNhYmxlIHRoZSBjb25maXJtYXRpb24gZGlhbG9nXG5cdCAqIEBwYXJhbSBvUmVzb3VyY2VCdW5kbGVcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfVxuXHQgKi9cblx0ZGVsZXRlRG9jdW1lbnQodkNvbnRleHRzOiBhbnksIG1QYXJhbWV0ZXJzOiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogYW55LCBtZXNzYWdlSGFuZGxlcjogYW55KSB7XG5cdFx0bGV0IGZuUmVqZWN0OiBGdW5jdGlvbixcblx0XHRcdGZuUmVzb2x2ZTogRnVuY3Rpb24sXG5cdFx0XHRhRGVsZXRhYmxlQ29udGV4dHM6IGFueVtdID0gW10sXG5cdFx0XHRpc0NoZWNrQm94VmlzaWJsZSA9IGZhbHNlLFxuXHRcdFx0aXNMb2NrZWRUZXh0VmlzaWJsZSA9IGZhbHNlLFxuXHRcdFx0Y2Fubm90QmVEZWxldGVkVGV4dFZpc2libGUgPSBmYWxzZSxcblx0XHRcdGlzQ2hlY2tCb3hTZWxlY3RlZDogYm9vbGVhbixcblx0XHRcdGJEaWFsb2dDb25maXJtZWQgPSBmYWxzZTtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcyxcblx0XHRcdG9SZXNvdXJjZUJ1bmRsZUNvcmUgPSBzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpIGFzIFJlc291cmNlQnVuZGxlO1xuXHRcdGxldCBhUGFyYW1zO1xuXHRcdGxldCBvRGVsZXRlTWVzc2FnZTogYW55ID0ge1xuXHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0RFTEVURVwiKVxuXHRcdH07XG5cdFx0QnVzeUxvY2tlci5sb2NrKHRoaXMub0xvY2tPYmplY3QpO1xuXHRcdGlmICghQXJyYXkuaXNBcnJheSh2Q29udGV4dHMpKSB7XG5cdFx0XHR2Q29udGV4dHMgPSBbdkNvbnRleHRzXTtcblx0XHR9XG5cdFx0UHJvbWlzZS5yZXNvbHZlKHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbCh2Q29udGV4dHNbMF0pKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24oc1Byb2dyYW1taW5nTW9kZWw6IGFueSkge1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdkNvbnRleHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gdkNvbnRleHRzW2ldLmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRleHREYXRhLkhhc0RyYWZ0RW50aXR5ID09PSB0cnVlICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRvQ29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0RGF0YS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YS5JblByb2Nlc3NCeVVzZXIgJiZcblx0XHRcdFx0XHRcdFx0XHRcdCFvQ29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEuRHJhZnRJc0NyZWF0ZWRCeU1lXG5cdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRNZXNzYWdlQm94LnNob3coXG5cdFx0XHRcdFx0XHRcdFx0XHRcdENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9TSU5HTEVfT0JKRUNUX0xPQ0tFRFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0RFTEVURVwiKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvbkNsb3NlOiBmblJlamVjdFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1QYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy50aXRsZSkge1xuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuZGVzY3JpcHRpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRhUGFyYW1zID0gW21QYXJhbWV0ZXJzLnRpdGxlLCBtUGFyYW1ldGVycy5kZXNjcmlwdGlvbl07XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0YVBhcmFtcyA9IFttUGFyYW1ldGVycy50aXRsZSwgXCJcIl07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdGFQYXJhbXMsXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gdkNvbnRleHRzO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZSA9IHtcblx0XHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0RFTEVURVwiKVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPT09IDEgJiYgbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID09PSB2Q29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IHZDb250ZXh0cztcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAobVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID09PSAxICYmIG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRcdFx0Ly9vbmx5IG9uZSB1bnNhdmVkIG9iamVjdFxuXHRcdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMgPSBtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHM7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGRyYWZ0QWRtaW5EYXRhID0gYURlbGV0YWJsZUNvbnRleHRzWzBdLmdldE9iamVjdCgpW1wiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIl07XG5cdFx0XHRcdFx0XHRcdGxldCBzTGFzdENoYW5nZWRCeVVzZXIgPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRcdFx0XHRcdFx0XHRzTGFzdENoYW5nZWRCeVVzZXIgPVxuXHRcdFx0XHRcdFx0XHRcdFx0ZHJhZnRBZG1pbkRhdGFbXCJMYXN0Q2hhbmdlZEJ5VXNlckRlc2NyaXB0aW9uXCJdIHx8IGRyYWZ0QWRtaW5EYXRhW1wiTGFzdENoYW5nZWRCeVVzZXJcIl0gfHwgXCJcIjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRhUGFyYW1zID0gW3NMYXN0Q2hhbmdlZEJ5VXNlcl07XG5cdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLnRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9DSEFOR0VTXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdGFQYXJhbXNcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAobVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID09PSBtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdC8vb25seSBtdWx0aXBsZSB1bnNhdmVkIG9iamVjdHNcblx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gbVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzO1xuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX1VOU0FWRURfQ0hBTkdFU19NVUxUSVBMRV9PQkpFQ1RTXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPT09XG5cdFx0XHRcdFx0XHRcdHZDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmNvbmNhdChtUGFyYW1ldGVycy5sb2NrZWRDb250ZXh0cykpLmxlbmd0aFxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdC8vb25seSB1bnNhdmVkLCBsb2NrZWQgLGRlbGV0YWJsZSBvYmplY3RzIGJ1dCBub3Qgbm9uLWRlbGV0YWJsZSBvYmplY3RzXG5cdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IHZDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzKTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9XG5cdFx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzLmxlbmd0aCA9PT0gMVxuXHRcdFx0XHRcdFx0XHRcdFx0PyBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfU0lOR1VMQVJcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHQgIClcblx0XHRcdFx0XHRcdFx0XHRcdDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1BMVVJBTFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdCAgKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vaWYgbm9uLWRlbGV0YWJsZSBvYmplY3RzIGV4aXN0cyBhbG9uZyB3aXRoIGFueSBvZiB1bnNhdmVkICxkZWxldGFibGUgb2JqZWN0c1xuXHRcdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMgPSB2Q29udGV4dHMuY29uY2F0KG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cyk7XG5cdFx0XHRcdFx0XHRcdGNhbm5vdEJlRGVsZXRlZFRleHRWaXNpYmxlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9XG5cdFx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzLmxlbmd0aCA9PT0gMVxuXHRcdFx0XHRcdFx0XHRcdFx0PyBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfU0lOR1VMQVJfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdCAgKVxuXHRcdFx0XHRcdFx0XHRcdFx0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfUExVUkFMX05PTl9ERUxFVEFCTEVcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHQgICk7XG5cdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLm5vbkRlbGV0YWJsZVRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfRkVXX09CSkVDVFNfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgLSB2Q29udGV4dHMuY29uY2F0KG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cykubGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXG5cdFx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzLmxlbmd0aCA9PSAxKSB7XG5cdFx0XHRcdFx0XHRcdC8vc2V0dGluZyB0aGUgbG9ja2VkIHRleHQgaWYgbG9ja2VkIG9iamVjdHMgZXhpc3Rcblx0XHRcdFx0XHRcdFx0aXNMb2NrZWRUZXh0VmlzaWJsZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLm5vbkRlbGV0YWJsZVRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfT05FX09CSkVDVF9MT0NLRURcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0W21QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c11cblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5sb2NrZWRDb250ZXh0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdC8vc2V0dGluZyB0aGUgbG9ja2VkIHRleHQgaWYgbG9ja2VkIG9iamVjdHMgZXhpc3Rcblx0XHRcdFx0XHRcdFx0aXNMb2NrZWRUZXh0VmlzaWJsZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLm5vbkRlbGV0YWJsZVRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfRkVXX09CSkVDVFNfTE9DS0VEXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFttUGFyYW1ldGVycy5sb2NrZWRDb250ZXh0cy5sZW5ndGgsIG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c11cblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aCA+IDAgJiZcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aCAhPT0gbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdChjYW5ub3RCZURlbGV0ZWRUZXh0VmlzaWJsZSB8fCBpc0xvY2tlZFRleHRWaXNpYmxlKSAmJlxuXHRcdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cy5sZW5ndGggPT09IG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5sZW5ndGhcblx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly9pZiBvbmx5IHVuc2F2ZWQgYW5kIGVpdGhlciBvciBib3RoIG9mIGxvY2tlZCBhbmQgbm9uLWRlbGV0YWJsZSBvYmplY3RzIGV4aXN0IHRoZW4gd2UgaGlkZSB0aGUgY2hlY2sgYm94XG5cdFx0XHRcdFx0XHRcdFx0aXNDaGVja0JveFZpc2libGUgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMgPSBtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHM7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLnRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX1VOU0FWRURfQU5EX0ZFV19PQkpFQ1RTX0xPQ0tFRF9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLnRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX1VOU0FWRURfQU5EX0ZFV19PQkpFQ1RTX0xPQ0tFRF9QTFVSQUxcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UuY2hlY2tCb3hUZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9GRVdfT0JKRUNUU19VTlNBVkVEX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UuY2hlY2tCb3hUZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9GRVdfT0JKRUNUU19VTlNBVkVEX1BMVVJBTFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlzQ2hlY2tCb3hWaXNpYmxlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGNhbm5vdEJlRGVsZXRlZFRleHRWaXNpYmxlICYmIGlzTG9ja2VkVGV4dFZpc2libGUpIHtcblx0XHRcdFx0XHRcdFx0Ly9pZiBib3RoIGxvY2tlZCBhbmQgbm9uLWRlbGV0YWJsZSBvYmplY3RzIGV4aXN0IGFsb25nIHdpdGggZGVsZXRhYmxlIG9iamVjdHNcblx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2Uubm9uRGVsZXRhYmxlVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfUEFHRV9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX0ZFV19PQkpFQ1RTX0xPQ0tFRF9BTkRfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgLVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzKS5sZW5ndGggLVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzLmxlbmd0aCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubG9ja2VkQ29udGV4dHMubGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcblx0XHRcdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoID09IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS5ub25EZWxldGFibGVUZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9QQUdFX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfT05FX09CSkVDVF9MT0NLRURfQU5EX05PTl9ERUxFVEFCTEVcIixcblx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIC1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2Q29udGV4dHMuY29uY2F0KG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cykubGVuZ3RoIC1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5sb2NrZWRDb250ZXh0cy5sZW5ndGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1xuXHRcdFx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0bGV0IG9Ob25EZWxldGFibGVNZXNzYWdlVGV4dENvbnRyb2wsIG9EZWxldGVNZXNzYWdlVGV4dENvbnRyb2w7XG5cdFx0XHRcdGNvbnN0IG9Db250ZW50ID0gbmV3IFZCb3goe1xuXHRcdFx0XHRcdGl0ZW1zOiBbXG5cdFx0XHRcdFx0XHQob05vbkRlbGV0YWJsZU1lc3NhZ2VUZXh0Q29udHJvbCA9IG5ldyBUZXh0KHtcblx0XHRcdFx0XHRcdFx0dGV4dDogb0RlbGV0ZU1lc3NhZ2Uubm9uRGVsZXRhYmxlVGV4dCxcblx0XHRcdFx0XHRcdFx0dmlzaWJsZTogaXNMb2NrZWRUZXh0VmlzaWJsZSB8fCBjYW5ub3RCZURlbGV0ZWRUZXh0VmlzaWJsZVxuXHRcdFx0XHRcdFx0fSkpLFxuXHRcdFx0XHRcdFx0KG9EZWxldGVNZXNzYWdlVGV4dENvbnRyb2wgPSBuZXcgVGV4dCh7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IG9EZWxldGVNZXNzYWdlLnRleHRcblx0XHRcdFx0XHRcdH0pKSxcblx0XHRcdFx0XHRcdG5ldyBDaGVja0JveCh7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IG9EZWxldGVNZXNzYWdlLmNoZWNrQm94VGV4dCxcblx0XHRcdFx0XHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdHNlbGVjdDogZnVuY3Rpb24ob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzZWxlY3RlZCA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRTZWxlY3RlZCgpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzZWxlY3RlZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gdkNvbnRleHRzLmNvbmNhdChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMpO1xuXHRcdFx0XHRcdFx0XHRcdFx0aXNDaGVja0JveFNlbGVjdGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gdkNvbnRleHRzO1xuXHRcdFx0XHRcdFx0XHRcdFx0aXNDaGVja0JveFNlbGVjdGVkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR2aXNpYmxlOiBpc0NoZWNrQm94VmlzaWJsZVxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRdXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRjb25zdCBzVGl0bGUgPSBvUmVzb3VyY2VCdW5kbGVDb3JlLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9ERUxFVEVcIik7XG5cdFx0XHRcdGNvbnN0IGZuQ29uZmlybSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGJEaWFsb2dDb25maXJtZWQgPSB0cnVlO1xuXHRcdFx0XHRcdEJ1c3lMb2NrZXIubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0XHRjb25zdCBhQ29udGV4dHMgPSBhRGVsZXRhYmxlQ29udGV4dHM7XG5cdFx0XHRcdFx0bGV0IG9uQmVmb3JlRGVsZXRlUHJvbWlzZTtcblx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2spIHtcblx0XHRcdFx0XHRcdG9uQmVmb3JlRGVsZXRlUHJvbWlzZSA9IG1QYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrKHsgY29udGV4dHM6IGFDb250ZXh0cyB9KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0b25CZWZvcmVEZWxldGVQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBvbkJlZm9yZURlbGV0ZVByb21pc2Vcblx0XHRcdFx0XHRcdC50aGVuKHRoYXQuZmluZEFjdGl2ZURyYWZ0Um9vdENvbnRleHRzLmJpbmQodGhhdCwgYUNvbnRleHRzLCBtUGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzKSlcblx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKGFjdGl2ZUNvbnRleHRzOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0Ly9tYWtlIHN1cmUgdG8gZmV0Y2ggdGhlIGFjdGl2ZSBjb250ZXh0cyBiZWZvcmUgZGVsZXRpbmcgdGhlIGRyYWZ0c1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLm1hcChmdW5jdGlvbihvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvL2RlbGV0ZSB0aGUgZHJhZnRcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBkcmFmdC5kZWxldGVEcmFmdChvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbihvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHJlLXRocm93IGVycm9yIHRvIGVuZm9yY2UgcmVqZWN0aW5nIHRoZSBnZW5lcmFsIHByb21pc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNoZWNrQm94ID0ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcImlzQ2hlY2tCb3hWaXNpYmxlXCI6IGlzQ2hlY2tCb3hWaXNpYmxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcImlzQ2hlY2tCb3hTZWxlY3RlZFwiOiBpc0NoZWNrQm94U2VsZWN0ZWRcblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYWN0aXZlQ29udGV4dHMgJiYgYWN0aXZlQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhY3RpdmVDb250ZXh0cy5tYXAoZnVuY3Rpb24ob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LmRlbGV0ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCkudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGF0LmFmdGVyRGVsZXRlUHJvY2VzcyhtUGFyYW1ldGVycywgY2hlY2tCb3gsIGFDb250ZXh0cywgb1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coKS50aGVuKGZuUmVzb2x2ZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhhdC5hZnRlckRlbGV0ZVByb2Nlc3MobVBhcmFtZXRlcnMsIGNoZWNrQm94LCBhQ29udGV4dHMsIG9SZXNvdXJjZUJ1bmRsZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpLnRoZW4oZm5SZXNvbHZlKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdGZuUmVqZWN0KCk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHR0aXRsZTogc1RpdGxlLFxuXHRcdFx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdFx0XHRjb250ZW50OiBbb0NvbnRlbnRdLFxuXHRcdFx0XHRcdGFyaWFMYWJlbGxlZEJ5OiBvTm9uRGVsZXRhYmxlTWVzc2FnZVRleHRDb250cm9sLmdldFZpc2libGUoKVxuXHRcdFx0XHRcdFx0PyBbb05vbkRlbGV0YWJsZU1lc3NhZ2VUZXh0Q29udHJvbCwgb0RlbGV0ZU1lc3NhZ2VUZXh0Q29udHJvbF1cblx0XHRcdFx0XHRcdDogb0RlbGV0ZU1lc3NhZ2VUZXh0Q29udHJvbCxcblx0XHRcdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHR0ZXh0OiBvUmVzb3VyY2VCdW5kbGVDb3JlLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9ERUxFVEVcIiksXG5cdFx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZm5Db25maXJtKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdHRleHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfQ0FOQ0VMXCIsIG9SZXNvdXJjZUJ1bmRsZSksXG5cdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0Ly8gaWYgZGlhbG9nIGlzIGNsb3NlZCB1bmNvbmZpcm1lZCAoZS5nLiB2aWEgXCJDYW5jZWxcIiBvciBFc2NhcGUgYnV0dG9uKSwgZW5zdXJlIHRvIHJlamVjdCBwcm9taXNlXG5cdFx0XHRcdFx0XHRpZiAoIWJEaWFsb2dDb25maXJtZWQpIHtcblx0XHRcdFx0XHRcdFx0Zm5SZWplY3QoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gYXMgYW55KTtcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm5vRGlhbG9nKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZuQ29uZmlybSgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9EaWFsb2cuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdFx0b0RpYWxvZy5vcGVuKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseShmdW5jdGlvbigpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRMb2cud2FybmluZyhcIkNvdWxkbid0IGdldCBQcm9ncmFtbWluZyBtb2RlbFwiKTtcblx0XHRcdFx0Zm5SZWplY3QoKTtcblx0XHRcdH0pO1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRmblJlamVjdCA9IHJlamVjdDtcblx0XHRcdGZuUmVzb2x2ZSA9IHJlc29sdmU7XG5cdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIEVkaXRzIGEgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1ZpZXcgQ3VycmVudCB2aWV3XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSBuZXcgZHJhZnQgY29udGV4dCBpbiBjYXNlIG9mIGRyYWZ0IHByb2dyYW1taW5nIG1vZGVsXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGVkaXREb2N1bWVudChvQ29udGV4dDogYW55LCBvVmlldzogb2JqZWN0LCBtZXNzYWdlSGFuZGxlcjogYW55KSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdGxldCBvRWRpdFByb21pc2U7XG5cdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBhY3RpdmUgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIikpO1xuXHRcdH1cblx0XHR0aGlzLl9iSXNNb2RpZmllZCA9IGZhbHNlO1xuXHRcdEJ1c3lMb2NrZXIubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHQvLyBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgZWRpdCBhY3Rpb24gd2UnbGwgaGF2ZSB0byByZW1vdmUgYWxsIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXNcblx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdG9FZGl0UHJvbWlzZSA9IGRyYWZ0LmNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KG9Db250ZXh0LCB0aGlzLl9nZXRBcHBDb21wb25lbnQoKSwge1xuXHRcdFx0XHRiUHJlc2VydmVDaGFuZ2VzOiB0cnVlLFxuXHRcdFx0XHRvVmlldzogb1ZpZXdcblx0XHRcdH0gYXMgYW55KTtcblx0XHR9IGVsc2UgaWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0b0VkaXRQcm9taXNlID0gc3RpY2t5LmVkaXREb2N1bWVudEluU3RpY2t5U2Vzc2lvbihvQ29udGV4dCwgdGhpcy5fZ2V0QXBwQ29tcG9uZW50KCkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJFZGl0IGlzIG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9FZGl0UHJvbWlzZVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24ob05ld0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHR0aGF0Ll9iQ3JlYXRlTW9kZSA9IGZhbHNlO1xuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coKS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBvTmV3Q29udGV4dDtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKGVycjogYW55KSB7XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseShmdW5jdGlvbigpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogQ2FuY2VsICdlZGl0JyBtb2RlIG9mIGEgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIGNhbmNlbGVkIG9yIGRlbGV0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IFttSW5QYXJhbWV0ZXJzXSBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0ge3NhcC5tLkJ1dHRvbn0gbUluUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gQ2FuY2VsIEJ1dHRvbiBvZiB0aGUgZGlzY2FyZCBwb3BvdmVyIChtYW5kYXRvcnkgZm9yIG5vdylcblx0ICogQHBhcmFtIHtib29sZWFufSBtSW5QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciBPcHRpb25hbCwgc3VwcmVzc2VzIHRoZSBkaXNjYXJkIHBvcG92ZXIgaW5jYXNlIG9mIGRyYWZ0IGFwcGxpY2F0aW9ucyB3aGlsZSBuYXZpZ2F0aW5nIG91dCBvZiBPUFxuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyB3aXRoID8/P1xuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRjYW5jZWxEb2N1bWVudChcblx0XHRvQ29udGV4dDogYW55LFxuXHRcdG1JblBhcmFtZXRlcnM6IHsgY2FuY2VsQnV0dG9uOiBhbnk7IHNraXBEaXNjYXJkUG9wb3ZlcjogYm9vbGVhbiB9IHwgdW5kZWZpbmVkLFxuXHRcdG9SZXNvdXJjZUJ1bmRsZTogYW55LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBhbnlcblx0KSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0bGV0IHNQcm9ncmFtbWluZ01vZGVsOiB0eXBlb2YgUHJvZ3JhbW1pbmdNb2RlbDtcblx0XHQvL2NvbnRleHQgbXVzdCBhbHdheXMgYmUgcGFzc2VkIC0gbWFuZGF0b3J5IHBhcmFtZXRlclxuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIk5vIGNvbnRleHQgZXhpc3RzLiBQYXNzIGEgbWVhbmluZ2Z1bCBjb250ZXh0XCIpO1xuXHRcdH1cblx0XHRCdXN5TG9ja2VyLmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0Y29uc3QgbVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1JblBhcmFtZXRlcnMpO1xuXHRcdGNvbnN0IG9QYXJhbXNDb250ZXh0ID0gb0NvbnRleHQsXG5cdFx0XHRvQ2FuY2VsQnV0dG9uID0gbVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uLFxuXHRcdFx0b01vZGVsID0gb1BhcmFtc0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRsZXQgb25CZWZvcmVDYW5jZWxQcm9taXNlLCBzQ2Fub25pY2FsUGF0aDogc3RyaW5nO1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uKHNQTW9kZWw6IGFueSkge1xuXHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCA9IHNQTW9kZWw7XG5cdFx0XHRcdGlmIChzUE1vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0Y29uc3QgZHJhZnREYXRhQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChvUGFyYW1zQ29udGV4dC5nZXRQYXRoKCkgKyBcIi9EcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRpZiAoIXRoYXQuX2JJc01vZGlmaWVkKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZHJhZnREYXRhQ29udGV4dC5yZXF1ZXN0T2JqZWN0KCkudGhlbihmdW5jdGlvbihkcmFmdEFkbWluRGF0YTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdHRoYXQuX2JJc01vZGlmaWVkID0gIShkcmFmdEFkbWluRGF0YS5DcmVhdGlvbkRhdGVUaW1lID09PSBkcmFmdEFkbWluRGF0YS5MYXN0Q2hhbmdlRGF0ZVRpbWUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIpIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhhdC5fc2hvd0Rpc2NhcmRQb3BvdmVyKG9DYW5jZWxCdXR0b24sIHRoYXQuX2JJc01vZGlmaWVkLCBvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuYmVmb3JlQ2FuY2VsQ2FsbEJhY2spIHtcblx0XHRcdFx0XHRvbkJlZm9yZUNhbmNlbFByb21pc2UgPSBtUGFyYW1ldGVycy5iZWZvcmVDYW5jZWxDYWxsQmFjayh7IGNvbnRleHQ6IG9Db250ZXh0IH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9uQmVmb3JlQ2FuY2VsUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBvbkJlZm9yZUNhbmNlbFByb21pc2U7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZWZhdWx0LWNhc2Vcblx0XHRcdFx0c3dpdGNoIChzUHJvZ3JhbW1pbmdNb2RlbCkge1xuXHRcdFx0XHRcdGNhc2UgUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDpcblx0XHRcdFx0XHRcdHJldHVybiBvUGFyYW1zQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSGFzQWN0aXZlRW50aXR5XCIpLnRoZW4oZnVuY3Rpb24oYkhhc0FjdGl2ZUVudGl0eTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdGxldCBvRGVsZXRlUHJvbWlzZTtcblx0XHRcdFx0XHRcdFx0aWYgKCFiSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG9QYXJhbXNDb250ZXh0ICYmIG9QYXJhbXNDb250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9QYXJhbXNDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZVByb21pc2UgPSBkcmFmdC5kZWxldGVEcmFmdChvUGFyYW1zQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9EZWxldGVQcm9taXNlO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGxldCBvQWN0aXZlQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChvUGFyYW1zQ29udGV4dC5nZXRQYXRoKCkgKyBcIi9TaWJsaW5nRW50aXR5XCIpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvQWN0aXZlQ29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0LnJlcXVlc3RDYW5vbmljYWxQYXRoKClcblx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbihzUGF0aDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c0Nhbm9uaWNhbFBhdGggPSBzUGF0aDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob1BhcmFtc0NvbnRleHQgJiYgb1BhcmFtc0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1BhcmFtc0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlUHJvbWlzZSA9IGRyYWZ0LmRlbGV0ZURyYWZ0KG9QYXJhbXNDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0RlbGV0ZVByb21pc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRyYWZ0LmRlbGV0ZURyYWZ0KG9QYXJhbXNDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvL29QYXJhbXNDb250ZXh0LmRlbGV0ZSgpIGluIHRoZSBwcmV2aW91cyBwcm9taXNlIGRvZXNudCByZXR1cm4gYW55dGhpbmcgdXBvbiBzdWNjZXNzLlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIXNDYW5vbmljYWxQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvQWN0aXZlQ29udGV4dC5nZXRQYXRoKCkgIT09IHNDYW5vbmljYWxQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gdGhlIGFjdGl2ZSBjb250ZXh0IGlzIHVzaW5nIHRoZSBzaWJsaW5nIGVudGl0eSAtIHRoaXMgcGF0aCBpcyBub3QgYWNjZXNzaWJsZSBhbnltb3JlIGFzIHdlIGRlbGV0ZWQgdGhlIGRyYWZ0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gZG9jdW1lbnQgLSB0aGVyZWZvcmUgd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29udGV4dCB3aXRoIHRoZSBjYW5vbmljYWwgcGF0aFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9BY3RpdmVDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KHNDYW5vbmljYWxQYXRoKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0FjdGl2ZUNvbnRleHQ7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0Y2FzZSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreTpcblx0XHRcdFx0XHRcdHJldHVybiBzdGlja3kuZGlzY2FyZERvY3VtZW50KG9Db250ZXh0KS50aGVuKGZ1bmN0aW9uKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9Db250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG9Db250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCF0aGF0Ll9iQ3JlYXRlTW9kZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRleHQucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0O1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQ2FuY2VsIGRvY3VtZW50IG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24oY29udGV4dDogYW55KSB7XG5cdFx0XHRcdHRoYXQuX2JJc01vZGlmaWVkID0gZmFsc2U7XG5cdFx0XHRcdC8vIHJlbW92ZSBleGlzdGluZyBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHQvLyBzaG93IHVuYm91bmQgbWVzc2FnZXNcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbnRleHQ7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbihlcnI6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCkudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIFNhdmVzIHRoZSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgc2F2ZWRcblx0ICogQHBhcmFtIG9SZXNvdXJjZUJ1bmRsZVxuXHQgKiBAcGFyYW0gYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3Jcblx0ICogQHBhcmFtIGFCaW5kaW5nc1xuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgd2l0aCA/Pz9cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0c2F2ZURvY3VtZW50KG9Db250ZXh0OiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogYW55LCBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcjogYW55LCBhQmluZGluZ3M6IGFueSwgbWVzc2FnZUhhbmRsZXI6IGFueSkge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRsZXQgb1NhdmVQcm9taXNlO1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gZHJhZnQgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIikpO1xuXHRcdH1cblx0XHQvLyBpbiBjYXNlIG9mIHNhdmluZyAvIGFjdGl2YXRpbmcgdGhlIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgc2hhbGwgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIFBBVENIL1BPU1Rcblx0XHQvLyBpcyBzZW50IHRvIHRoZSBiYWNrZW5kXG5cdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0QnVzeUxvY2tlci5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0b1NhdmVQcm9taXNlID0gZHJhZnQuYWN0aXZhdGVEb2N1bWVudChvQ29udGV4dCwgdGhpcy5fZ2V0QXBwQ29tcG9uZW50KCksIHt9KTtcblx0XHR9IGVsc2UgaWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0b1NhdmVQcm9taXNlID0gc3RpY2t5LmFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJTYXZlIGlzIG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9TYXZlUHJvbWlzZVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24ob0FjdGl2ZURvY3VtZW50OiBhbnkpIHtcblx0XHRcdFx0Y29uc3QgYk5ld09iamVjdCA9XG5cdFx0XHRcdFx0dGhhdC5zUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgPyB0aGF0Ll9iQ3JlYXRlTW9kZSA6ICFvQ29udGV4dC5nZXRPYmplY3QoKS5IYXNBY3RpdmVFbnRpdHk7XG5cdFx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KFxuXHRcdFx0XHRcdGJOZXdPYmplY3Rcblx0XHRcdFx0XHRcdD8gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfQ1JFQVRFRFwiLCBvUmVzb3VyY2VCdW5kbGUpXG5cdFx0XHRcdFx0XHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1NBVkVEXCIsIG9SZXNvdXJjZUJ1bmRsZSlcblx0XHRcdFx0KTtcblx0XHRcdFx0dGhhdC5fYklzTW9kaWZpZWQgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKCkudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0FjdGl2ZURvY3VtZW50O1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24oZXJyOiBhbnkpIHtcblx0XHRcdFx0aWYgKGFCaW5kaW5ncyAmJiBhQmluZGluZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdC8qIFRoZSBzaWRlRWZmZWN0cyBhcmUgZXhlY3V0ZWQgb25seSBmb3IgdGFibGUgaXRlbXMgaW4gdHJhbnNpZW50IHN0YXRlICovXG5cdFx0XHRcdFx0YUJpbmRpbmdzLmZvckVhY2goZnVuY3Rpb24ob0xpc3RCaW5kaW5nOiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChvTGlzdEJpbmRpbmcpICYmIGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGF0Ll9nZXRBcHBDb21wb25lbnQoKTtcblx0XHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkob0xpc3RCaW5kaW5nLmdldFBhdGgoKSwgb0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseShmdW5jdGlvbigpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogQ2FsbHMgYSBib3VuZCBvciB1bmJvdW5kIGFjdGlvbi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIuY2FsbEFjdGlvblxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSB7bWFwfSBbbVBhcmFtZXRlcnNdIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gW21QYXJhbWV0ZXJzLmNvbnRleHRzXSBNYW5kYXRvcnkgZm9yIGEgYm91bmQgYWN0aW9uOiBFaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbH0gW21QYXJhbWV0ZXJzLm1vZGVsXSBNYW5kYXRvcnkgZm9yIGFuIHVuYm91bmQgYWN0aW9uOiBBbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW21QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZ10gTW9kZSBob3cgYWN0aW9ucyBhcmUgdG8gYmUgY2FsbGVkOiAnQ2hhbmdlU2V0JyB0byBwdXQgYWxsIGFjdGlvbiBjYWxscyBpbnRvIG9uZSBjaGFuZ2VzZXQsICdJc29sYXRlZCcgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbbVBhcmFtZXRlcnMubGFiZWxdIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dF0gSWYgc3BlY2lmaWVkLCB0aGUgYWN0aW9uIHByb21pc2UgcmV0dXJucyB0aGUgYm91bmQgY29udGV4dFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1ZpZXcgQ29udGFpbnMgdGhlIG9iamVjdCBvZiB0aGUgY3VycmVudCB2aWV3XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHJlc3BvbnNlIG9iamVjdHMgKFRPRE86IHRvIGJlIGNoYW5nZWQpXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICoqL1xuXHRjYWxsQWN0aW9uKHNBY3Rpb25OYW1lOiBzdHJpbmcsIG1QYXJhbWV0ZXJzOiBhbnksIG9WaWV3OiBWaWV3IHwgbnVsbCwgbWVzc2FnZUhhbmRsZXI6IGFueSkge1xuXHRcdG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0bGV0IG9Db250ZXh0LCBvTW9kZWw6IGFueSwgb1Byb21pc2U7XG5cdFx0Y29uc3QgbUJpbmRpbmdQYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMuYmluZGluZ1BhcmFtZXRlcnM7XG5cdFx0aWYgKCFzQWN0aW9uTmFtZSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiUHJvdmlkZSBuYW1lIG9mIGFjdGlvbiB0byBiZSBleGVjdXRlZFwiKTtcblx0XHR9XG5cdFx0Ly8gYWN0aW9uIGltcG9ydHMgYXJlIG5vdCBkaXJlY3RseSBvYnRhaW5lZCBmcm9tIHRoZSBtZXRhTW9kZWwgYnkgaXQgaXMgcHJlc2VudCBpbnNpZGUgdGhlIGVudGl0eUNvbnRhaW5lclxuXHRcdC8vIGFuZCB0aGUgYWNpb25zIGl0IHJlZmVycyB0byBwcmVzZW50IG91dHNpZGUgdGhlIGVudGl0eWNvbnRhaW5lciwgaGVuY2UgdG8gb2J0YWluIGtpbmQgb2YgdGhlIGFjdGlvblxuXHRcdC8vIHNwbGl0KCkgb24gaXRzIG5hbWUgd2FzIHJlcXVpcmVkXG5cdFx0Y29uc3Qgc05hbWUgPSBzQWN0aW9uTmFtZS5zcGxpdChcIi9cIilbMV07XG5cdFx0c0FjdGlvbk5hbWUgPSBzTmFtZSB8fCBzQWN0aW9uTmFtZTtcblx0XHRvQ29udGV4dCA9IHNOYW1lID8gdW5kZWZpbmVkIDogbVBhcmFtZXRlcnMuY29udGV4dHM7XG5cdFx0Ly9jaGVja2luZyB3aGV0aGVyIHRoZSBjb250ZXh0IGlzIGFuIGFycmF5IHdpdGggbW9yZSB0aGFuIDAgbGVuZ3RoIG9yIG5vdCBhbiBhcnJheShjcmVhdGUgYWN0aW9uKVxuXHRcdGlmIChvQ29udGV4dCAmJiAoKEFycmF5LmlzQXJyYXkob0NvbnRleHQpICYmIG9Db250ZXh0Lmxlbmd0aCkgfHwgIUFycmF5LmlzQXJyYXkob0NvbnRleHQpKSkge1xuXHRcdFx0b0NvbnRleHQgPSBBcnJheS5pc0FycmF5KG9Db250ZXh0KSA/IG9Db250ZXh0WzBdIDogb0NvbnRleHQ7XG5cdFx0XHRvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdH1cblx0XHRpZiAobVBhcmFtZXRlcnMubW9kZWwpIHtcblx0XHRcdG9Nb2RlbCA9IG1QYXJhbWV0ZXJzLm1vZGVsO1xuXHRcdH1cblx0XHRpZiAoIW9Nb2RlbCkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiUGFzcyBhIGNvbnRleHQgZm9yIGEgYm91bmQgYWN0aW9uIG9yIHBhc3MgdGhlIG1vZGVsIGZvciBhbiB1bmJvdW5kIGFjdGlvblwiKTtcblx0XHR9XG5cdFx0Ly8gZ2V0IHRoZSBiaW5kaW5nIHBhcmFtZXRlcnMgJHNlbGVjdCBhbmQgJGV4cGFuZCBmb3IgdGhlIHNpZGUgZWZmZWN0IG9uIHRoaXMgYWN0aW9uXG5cdFx0Ly8gYWxzbyBnYXRoZXIgYWRkaXRpb25hbCBwcm9wZXJ0eSBwYXRocyB0byBiZSByZXF1ZXN0ZWQgc3VjaCBhcyB0ZXh0IGFzc29jaWF0aW9uc1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGF0Ll9nZXRBcHBDb21wb25lbnQoKTtcblx0XHRjb25zdCBtU2lkZUVmZmVjdHNQYXJhbWV0ZXJzID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHNBY3Rpb25OYW1lLCBvQ29udGV4dCkgfHwge307XG5cdFx0aWYgKG9Db250ZXh0ICYmIG9Nb2RlbCkge1xuXHRcdFx0b1Byb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPihmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdFx0bGV0IG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZzogRGlhbG9nO1xuXHRcdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IHtcblx0XHRcdFx0XHRvbkNsb3NlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdC8vIFVzZXIgY2FuY2VscyBhY3Rpb25cblx0XHRcdFx0XHRcdG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b25Db250aW51ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHQvLyBVc2VycyBjb250aW51ZXMgdGhlIGFjdGlvbiB3aXRoIHRoZSBib3VuZCBjb250ZXh0c1xuXHRcdFx0XHRcdFx0b0FwcGxpY2FibGVDb250ZXh0RGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKG1QYXJhbWV0ZXJzLmFwcGxpY2FibGVDb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHRcdGNvbnN0IGZuT3BlbkFuZEZpbGxEaWFsb2cgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRsZXQgb0RpYWxvZ0NvbnRlbnQ7XG5cdFx0XHRcdFx0Y29uc3Qgbk5vdEFwcGxpY2FibGUgPSBtUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dC5sZW5ndGgsXG5cdFx0XHRcdFx0XHRhTm90QXBwbGljYWJsZUl0ZW1zID0gW107XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBtUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dC5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0b0RpYWxvZ0NvbnRlbnQgPSBtUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dFtpXS5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdGFOb3RBcHBsaWNhYmxlSXRlbXMucHVzaChvRGlhbG9nQ29udGVudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IG9Ob3RBcHBsaWNhYmxlSXRlbXNNb2RlbCA9IG5ldyBKU09OTW9kZWwoYU5vdEFwcGxpY2FibGVJdGVtcyk7XG5cdFx0XHRcdFx0Y29uc3Qgb1RvdGFscyA9IG5ldyBKU09OTW9kZWwoeyB0b3RhbDogbk5vdEFwcGxpY2FibGUsIGxhYmVsOiBtUGFyYW1ldGVycy5sYWJlbCB9KTtcblx0XHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cuc2V0TW9kZWwob05vdEFwcGxpY2FibGVJdGVtc01vZGVsLCBcIm5vdEFwcGxpY2FibGVcIik7XG5cdFx0XHRcdFx0b0FwcGxpY2FibGVDb250ZXh0RGlhbG9nLnNldE1vZGVsKG9Ub3RhbHMsIFwidG90YWxzXCIpO1xuXHRcdFx0XHRcdG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZy5vcGVuKCk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dCAmJiBtUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dC5sZW5ndGggPj0gMSkge1xuXHRcdFx0XHRcdC8vIFNob3cgdGhlIGNvbnRleHRzIHRoYXQgYXJlIG5vdCBhcHBsaWNhYmxlIGFuZCB3aWxsIG5vdCB0aGVyZWZvcmUgYmUgcHJvY2Vzc2VkXG5cdFx0XHRcdFx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IFwic2FwLmZlLmNvcmUuY29udHJvbHMuQWN0aW9uUGFydGlhbFwiO1xuXHRcdFx0XHRcdGNvbnN0IG9EaWFsb2dGcmFnbWVudCA9IFhNTFRlbXBsYXRlUHJvY2Vzc29yLmxvYWRUZW1wbGF0ZShzRnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpO1xuXHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdFx0Y29uc3Qgc0Nhbm9uaWNhbFBhdGggPSBtUGFyYW1ldGVycy5jb250ZXh0c1swXS5nZXRDYW5vbmljYWxQYXRoKCk7XG5cdFx0XHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IHNDYW5vbmljYWxQYXRoLnN1YnN0cigwLCBzQ2Fub25pY2FsUGF0aC5pbmRleE9mKFwiKFwiKSkgKyBcIi9cIjtcblx0XHRcdFx0XHRjb25zdCBvRGlhbG9nTGFiZWxNb2RlbCA9IG5ldyBKU09OTW9kZWwoe1xuXHRcdFx0XHRcdFx0dGl0bGU6IG1QYXJhbWV0ZXJzLmxhYmVsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0UHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRcdFx0WE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoXG5cdFx0XHRcdFx0XHRcdG9EaWFsb2dGcmFnbWVudCxcblx0XHRcdFx0XHRcdFx0eyBuYW1lOiBzRnJhZ21lbnROYW1lIH0sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRcdFx0XHRcdFx0XHRcdGVudGl0eVR5cGU6IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0VudGl0eVNldCksXG5cdFx0XHRcdFx0XHRcdFx0XHRsYWJlbDogb0RpYWxvZ0xhYmVsTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpXG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdFx0XHRcdGVudGl0eVR5cGU6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdFx0XHRsYWJlbDogb0RpYWxvZ0xhYmVsTW9kZWxcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihvRnJhZ21lbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gRnJhZ21lbnQubG9hZCh7IGRlZmluaXRpb246IG9GcmFnbWVudCwgY29udHJvbGxlcjogb0NvbnRyb2xsZXIgfSk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24ob1BvcG92ZXI6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cgPSBvUG9wb3Zlcjtcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMucGFyZW50Q29udHJvbC5hZGREZXBlbmRlbnQob1BvcG92ZXIpO1xuXHRcdFx0XHRcdFx0XHRmbk9wZW5BbmRGaWxsRGlhbG9nKCk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LmNhdGNoKHJlamVjdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVzb2x2ZShtUGFyYW1ldGVycy5jb250ZXh0cyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLnRoZW4oZnVuY3Rpb24oY29udGV4dFRvUHJvY2VzczogYW55KSB7XG5cdFx0XHRcdGlmIChjb250ZXh0VG9Qcm9jZXNzKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9wZXJhdGlvbnMuY2FsbEJvdW5kQWN0aW9uKHNBY3Rpb25OYW1lLCBjb250ZXh0VG9Qcm9jZXNzLCBvTW9kZWwsIG9BcHBDb21wb25lbnQsIHtcblx0XHRcdFx0XHRcdGludm9jYXRpb25Hcm91cGluZzogbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nLFxuXHRcdFx0XHRcdFx0bGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsLFxuXHRcdFx0XHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZzogdHJ1ZSxcblx0XHRcdFx0XHRcdG1CaW5kaW5nUGFyYW1ldGVyczogbUJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0ZW50aXR5U2V0TmFtZTogbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSxcblx0XHRcdFx0XHRcdGFkZGl0aW9uYWxTaWRlRWZmZWN0OiBtU2lkZUVmZmVjdHNQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0b25TdWJtaXR0ZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG9uUmVzcG9uc2U6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ6IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXAsXG5cdFx0XHRcdFx0XHRiSXNDcmVhdGVBY3Rpb246IG1QYXJhbWV0ZXJzLmJJc0NyZWF0ZUFjdGlvbixcblx0XHRcdFx0XHRcdGJHZXRCb3VuZENvbnRleHQ6IG1QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHQsXG5cdFx0XHRcdFx0XHRiT2JqZWN0UGFnZTogbVBhcmFtZXRlcnMuYk9iamVjdFBhZ2UsXG5cdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcjogbWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246IG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvblxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gVE9ETzogY29uZmlybSBpZiBhY3Rpb24gaW1wb3J0IG5lZWRzIHNpZGUgZWZmZWN0cy5cblx0XHRcdG9Qcm9taXNlID0gb3BlcmF0aW9ucy5jYWxsQWN0aW9uSW1wb3J0KHNBY3Rpb25OYW1lLCBvTW9kZWwsIG9BcHBDb21wb25lbnQsIHtcblx0XHRcdFx0bGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsLFxuXHRcdFx0XHRzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nOiB0cnVlLFxuXHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVyczogbUJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHRlbnRpdHlTZXROYW1lOiBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRvblN1Ym1pdHRlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRvblJlc3BvbnNlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0cGFyZW50Q29udHJvbDogbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCxcblx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ6IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA6IG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCxcblx0XHRcdFx0bWVzc2FnZUhhbmRsZXI6IG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRiT2JqZWN0UGFnZTogbVBhcmFtZXRlcnMuYk9iamVjdFBhZ2Vcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gb1Byb21pc2Vcblx0XHRcdC50aGVuKGZ1bmN0aW9uKG9SZXN1bHQ6IGFueSkge1xuXHRcdFx0XHQvLyBTdWNjZWVkZWRcblx0XHRcdFx0cmV0dXJuIHRoYXQuX2hhbmRsZUFjdGlvblJlc3BvbnNlKG1lc3NhZ2VIYW5kbGVyLCBtUGFyYW1ldGVycywgc0FjdGlvbk5hbWUpLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9SZXN1bHQ7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbihlcnI6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gdGhhdC5faGFuZGxlQWN0aW9uUmVzcG9uc2UobWVzc2FnZUhhbmRsZXIsIG1QYXJhbWV0ZXJzLCBzQWN0aW9uTmFtZSkudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogSGFuZGxlcyBtZXNzYWdlcyBmb3IgYWN0aW9uIGNhbGwuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlciNfaGFuZGxlQWN0aW9uUmVzcG9uc2Vcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgUGFyYW1ldGVycyB0byBiZSBjb25zaWRlcmVkIGZvciB0aGUgYWN0aW9uLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgYWZ0ZXIgbWVzc2FnZSBkaWFsb2cgaXMgb3BlbmVkIGlmIHJlcXVpcmVkLlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfaGFuZGxlQWN0aW9uUmVzcG9uc2UobWVzc2FnZUhhbmRsZXI6IGFueSwgbVBhcmFtZXRlcnM6IGFueSwgc0FjdGlvbk5hbWU6IHN0cmluZykge1xuXHRcdGNvbnN0IGFUcmFuc2llbnRNZXNzYWdlcyA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcyh0cnVlLCB0cnVlKTtcblx0XHRpZiAoYVRyYW5zaWVudE1lc3NhZ2VzLmxlbmd0aCA+IDAgJiYgbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwic0FjdGlvbk5hbWVcIiwgbVBhcmFtZXRlcnMubGFiZWwgPyBtUGFyYW1ldGVycy5sYWJlbCA6IHNBY3Rpb25OYW1lKTtcblx0XHR9XG5cdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHR9XG5cdC8qKlxuXHQgKiBIYW5kbGVzIHZhbGlkYXRpb24gZXJyb3JzIGZvciB0aGUgJ2Rpc2NhcmQnIGFjdGlvbi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyI2hhbmRsZVZhbGlkYXRpb25FcnJvclxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRoYW5kbGVWYWxpZGF0aW9uRXJyb3IoKSB7XG5cdFx0Y29uc3Qgb01lc3NhZ2VNYW5hZ2VyID0gKHNhcC51aS5nZXRDb3JlKCkgYXMgYW55KS5nZXRNZXNzYWdlTWFuYWdlcigpLFxuXHRcdFx0ZXJyb3JUb1JlbW92ZSA9IG9NZXNzYWdlTWFuYWdlclxuXHRcdFx0XHQuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uKGVycm9yOiBhbnkpIHtcblx0XHRcdFx0XHQvLyBvbmx5IG5lZWRzIHRvIGhhbmRsZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLCB0ZWNobmljYWwgYW5kIHBlcnNpc3RlbnQgZXJyb3JzIG5lZWRzIG5vdCB0byBiZSBjaGVja2VkIGhlcmUuXG5cdFx0XHRcdFx0aWYgKGVycm9yLnZhbGlkYXRpb24pIHtcblx0XHRcdFx0XHRcdHJldHVybiBlcnJvcjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhlcnJvclRvUmVtb3ZlKTtcblx0fVxuXHQvKipcblx0ICogU2hvd3MgYSBwb3BvdmVyIGlmIGl0IG5lZWRzIHRvIGJlIHNob3duLlxuXHQgKiBUT0RPOiBQb3BvdmVyIGlzIHNob3duIGlmIHVzZXIgaGFzIG1vZGlmaWVkIGFueSBkYXRhLlxuXHQgKiBUT0RPOiBQb3BvdmVyIGlzIHNob3duIGlmIHRoZXJlJ3MgYSBkaWZmZXJlbmNlIGZyb20gZHJhZnQgYWRtaW4gZGF0YS5cblx0ICogQHN0YXRpY1xuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlci5fc2hvd0Rpc2NhcmRQb3BvdmVyXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAcGFyYW0ge3NhcC51aS5jb3JlLkNvbnRyb2x9IG9DYW5jZWxCdXR0b24gVGhlIGNvbnRyb2wgd2hpY2ggd2lsbCBvcGVuIHRoZSBwb3BvdmVyXG5cdCAqIEBwYXJhbSBiSXNNb2RpZmllZFxuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIGlmIHVzZXIgY29uZmlybXMgZGlzY2FyZCwgcmVqZWN0cyBpZiBvdGhlcndpc2UsIHJlamVjdHMgaWYgbm8gY29udHJvbCBwYXNzZWQgdG8gb3BlbiBwb3BvdmVyXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9zaG93RGlzY2FyZFBvcG92ZXIob0NhbmNlbEJ1dHRvbjogYW55LCBiSXNNb2RpZmllZDogYW55LCBvUmVzb3VyY2VCdW5kbGU6IGFueSkge1xuXHRcdC8vIFRPRE86IEltcGxlbWVudCB0aGlzIHBvcG92ZXIgYXMgYSBmcmFnbWVudCBhcyBpbiB2Mj8/XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0dGhhdC5fYkNvbnRpbnVlRGlzY2FyZCA9IGZhbHNlO1xuXHRcdC8vIHRvIGJlIGltcGxlbWVudGVkXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0aWYgKCFvQ2FuY2VsQnV0dG9uKSB7XG5cdFx0XHRcdHJlamVjdChcIkNhbmNlbCBidXR0b24gbm90IGZvdW5kXCIpO1xuXHRcdFx0fVxuXHRcdFx0Ly9TaG93IHBvcG92ZXIgb25seSB3aGVuIGRhdGEgaXMgY2hhbmdlZC5cblx0XHRcdGlmIChiSXNNb2RpZmllZCkge1xuXHRcdFx0XHRjb25zdCBmbk9uQWZ0ZXJEaXNjYXJkID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0b0NhbmNlbEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpO1xuXHRcdFx0XHRcdGlmICh0aGF0Ll9iQ29udGludWVEaXNjYXJkKSB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJlamVjdChcIkRpc2NhcmQgb3BlcmF0aW9uIHdhcyByZWplY3RlZC4gRG9jdW1lbnQgaGFzIG5vdCBiZWVuIGRpc2NhcmRlZFwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhhdC5fb1BvcG92ZXIuZGV0YWNoQWZ0ZXJDbG9zZShmbk9uQWZ0ZXJEaXNjYXJkKTtcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKCF0aGF0Ll9vUG9wb3Zlcikge1xuXHRcdFx0XHRcdGNvbnN0IG9UZXh0ID0gbmV3IFRleHQoe1xuXHRcdFx0XHRcdFx0XHQvL1RoaXMgdGV4dCBpcyB0aGUgc2FtZSBhcyBMUiB2Mi5cblx0XHRcdFx0XHRcdFx0Ly9UT0RPOiBEaXNwbGF5IG1lc3NhZ2UgcHJvdmlkZWQgYnkgYXBwIGRldmVsb3Blcj8/P1xuXHRcdFx0XHRcdFx0XHR0ZXh0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfTUVTU0FHRVwiLCBvUmVzb3VyY2VCdW5kbGUpXG5cdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdG9CdXR0b24gPSBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9EUkFGVF9ESVNDQVJEX0JVVFRPTlwiLCBvUmVzb3VyY2VCdW5kbGUpLFxuXHRcdFx0XHRcdFx0XHR3aWR0aDogXCIxMDAlXCIsXG5cdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGF0LmhhbmRsZVZhbGlkYXRpb25FcnJvcigpO1xuXHRcdFx0XHRcdFx0XHRcdHRoYXQuX2JDb250aW51ZURpc2NhcmQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdHRoYXQuX29Qb3BvdmVyLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdGFyaWFMYWJlbGxlZEJ5OiBvVGV4dFxuXHRcdFx0XHRcdFx0fSBhcyBhbnkpO1xuXHRcdFx0XHRcdHRoYXQuX29Qb3BvdmVyID0gbmV3IFBvcG92ZXIoe1xuXHRcdFx0XHRcdFx0c2hvd0hlYWRlcjogZmFsc2UsXG5cdFx0XHRcdFx0XHRwbGFjZW1lbnQ6IFwiVG9wXCIsXG5cdFx0XHRcdFx0XHRjb250ZW50OiBbXG5cdFx0XHRcdFx0XHRcdG5ldyBWQm94KHtcblx0XHRcdFx0XHRcdFx0XHRpdGVtczogW29UZXh0LCBvQnV0dG9uXVxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdGJlZm9yZU9wZW46IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHQvLyBtYWtlIHN1cmUgdG8gTk9UIHRyaWdnZXIgbXVsdGlwbGUgY2FuY2VsIGZsb3dzXG5cdFx0XHRcdFx0XHRcdG9DYW5jZWxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdHRoYXQuX29Qb3BvdmVyLnNldEluaXRpYWxGb2N1cyhvQnV0dG9uKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR0aGF0Ll9vUG9wb3Zlci5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGF0Ll9vUG9wb3Zlci5hdHRhY2hBZnRlckNsb3NlKGZuT25BZnRlckRpc2NhcmQpO1xuXHRcdFx0XHR0aGF0Ll9vUG9wb3Zlci5vcGVuQnkob0NhbmNlbEJ1dHRvbiwgZmFsc2UpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhhdC5oYW5kbGVWYWxpZGF0aW9uRXJyb3IoKTtcblx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBkb2N1bWVudCB0byBtb2RpZmllZCBzdGF0ZSBvbiBwYXRjaCBldmVudC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIuaGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRoYW5kbGVEb2N1bWVudE1vZGlmaWNhdGlvbnMoKSB7XG5cdFx0dGhpcy5fYklzTW9kaWZpZWQgPSB0cnVlO1xuXHR9XG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIG93bmVyIGNvbXBvbmVudC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIuX2dldE93bmVyQ29tcG9uZW50XG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAcmV0dXJucyB7c2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50fSBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqKi9cblx0X2dldEFwcENvbXBvbmVudCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fb0FwcENvbXBvbmVudDtcblx0fVxuXHRfbGF1bmNoRGlhbG9nV2l0aEtleUZpZWxkcyhcblx0XHRvTGlzdEJpbmRpbmc6IGFueSxcblx0XHRvVHJhbnNpZW50TGlzdEJpbmRpbmc6IGFueSxcblx0XHRvVHJhbnNpZW50Q29udGV4dDogYW55LFxuXHRcdG1GaWVsZHM6IGFueSxcblx0XHRvTW9kZWw6IGFueSxcblx0XHRtUGFyYW1ldGVyczogYW55LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBhbnlcblx0KSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0bGV0IG9EaWFsb2c6IERpYWxvZztcblx0XHRjb25zdCBvUGFyZW50Q29udHJvbCA9IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRiU3VjY2VzcyA9IGZhbHNlO1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRjb25zdCBzRnJhZ21lbnROYW1lID0gXCJzYXAvZmUvY29yZS9jb250cm9scy9Ob25Db21wdXRlZFZpc2libGVLZXlGaWVsZHNEaWFsb2dcIjtcblx0XHRcdGNvbnN0IG9GcmFnbWVudCA9IFhNTFRlbXBsYXRlUHJvY2Vzc29yLmxvYWRUZW1wbGF0ZShzRnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpLFxuXHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUgPSBvUGFyZW50Q29udHJvbC5nZXRDb250cm9sbGVyKCkub1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRhSW1tdXRhYmxlRmllbGRzOiBhbnlbXSA9IFtdLFxuXHRcdFx0XHRvQXBwQ29tcG9uZW50ID0gdGhhdC5fZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHNQYXRoID0gb0xpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSA/IG9MaXN0QmluZGluZy5nZXRSZXNvbHZlZFBhdGgoKSA6IG9MaXN0QmluZGluZy5nZXRQYXRoKCksXG5cdFx0XHRcdG9FbnRpdHlTZXRDb250ZXh0ID0gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzUGF0aCksXG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGgpO1xuXHRcdFx0Zm9yIChjb25zdCBpIGluIG1GaWVsZHMpIHtcblx0XHRcdFx0YUltbXV0YWJsZUZpZWxkcy5wdXNoKG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc01ldGFQYXRoICsgXCIvXCIgKyBtRmllbGRzW2ldKSk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBvSW1tdXRhYmxlQ3R4TW9kZWwgPSBuZXcgSlNPTk1vZGVsKGFJbW11dGFibGVGaWVsZHMpO1xuXHRcdFx0Y29uc3Qgb0ltbXV0YWJsZUN0eCA9IG9JbW11dGFibGVDdHhNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIikgYXMgQ29udGV4dDtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXG5cdFx0XHRcdFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKFxuXHRcdFx0XHRcdG9GcmFnbWVudCxcblx0XHRcdFx0XHR7IG5hbWU6IHNGcmFnbWVudE5hbWUgfSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBvRW50aXR5U2V0Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0ZmllbGRzOiBvSW1tdXRhYmxlQ3R4XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFx0XHRcdGVudGl0eVNldDogb0VudGl0eVNldENvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0ZmllbGRzOiBvSW1tdXRhYmxlQ3R4LmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb01ldGFNb2RlbFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KVxuXHRcdFx0KS50aGVuKGZ1bmN0aW9uKG9GcmFnbWVudDogYW55KSB7XG5cdFx0XHRcdGxldCBhRm9ybUVsZW1lbnRzOiBhbnlbXSA9IFtdO1xuXHRcdFx0XHRjb25zdCBtRmllbGRWYWx1ZU1hcDogYW55ID0ge307XG5cdFx0XHRcdGxldCBvQ3JlYXRlQnV0dG9uOiBCdXR0b247XG5cdFx0XHRcdGNvbnN0IHZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdFx0YUZvcm1FbGVtZW50c1xuXHRcdFx0XHRcdFx0XHQubWFwKGZ1bmN0aW9uKG9Gb3JtRWxlbWVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Gb3JtRWxlbWVudC5nZXRGaWVsZHMoKVswXTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbihvRmllbGQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRmllbGQuZ2V0UmVxdWlyZWQoKTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0Lm1hcChmdW5jdGlvbihvRmllbGQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNGaWVsZElkID0gb0ZpZWxkLmdldElkKCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNGaWVsZElkIGluIG1GaWVsZFZhbHVlTWFwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1GaWVsZFZhbHVlTWFwW3NGaWVsZElkXSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24odlZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdlZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRmllbGQuZ2V0VmFsdWVTdGF0ZSgpID09PSBWYWx1ZVN0YXRlLkVycm9yID8gdW5kZWZpbmVkIDogb0ZpZWxkLmdldFZhbHVlKCk7XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oYVJlc3VsdHM6IGFueVtdKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhUmVzdWx0cy5ldmVyeShmdW5jdGlvbih2VmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB2VmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2VmFsdWUgIT09IG51bGwgJiYgdlZhbHVlICE9PSBcIlwiO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihiRW5hYmxlZDogYm9vbGVhbikge1xuXHRcdFx0XHRcdFx0XHRvQ3JlYXRlQnV0dG9uLnNldEVuYWJsZWQoYkVuYWJsZWQpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0ge1xuXHRcdFx0XHRcdC8qXG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0ZmlyZWQgb24gZm9jdXMgb3V0IGZyb20gZmllbGQgb3Igb24gc2VsZWN0aW5nIGEgdmFsdWUgZnJvbSB0aGUgdmFsdWVoZWxwLlxuICAgIFx0XHRcdFx0XHRcdFx0XHRcdHRoZSBjcmVhdGUgYnV0dG9uIGlzIGVuYWJsZWQgd2hlbiBhIHZhbHVlIGlzIGFkZGVkLlxuICAgIFx0XHRcdFx0XHRcdFx0XHRcdGxpdmVDaGFuZ2UgaXMgbm90IGZpcmVkIHdoZW4gdmFsdWUgaXMgYWRkZWQgZnJvbSB2YWx1ZWhlbHAuXG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgdmFsaWRhdGlvbiBpcyBub3QgZG9uZSBmb3IgY3JlYXRlIGJ1dHRvbiBlbmFibGVtZW50LlxuICAgIFx0XHRcdFx0XHRcdFx0XHQqL1xuXHRcdFx0XHRcdGhhbmRsZUNoYW5nZTogZnVuY3Rpb24ob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0ZpZWxkID0gb0V2ZW50LmdldFNvdXJjZSgpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0ZpZWxkSWQgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiaWRcIik7XG5cdFx0XHRcdFx0XHRjb25zdCBvRmllbGRQcm9taXNlID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInByb21pc2VcIik7XG5cdFx0XHRcdFx0XHRpZiAob0ZpZWxkUHJvbWlzZSkge1xuXHRcdFx0XHRcdFx0XHRtRmllbGRWYWx1ZU1hcFtzRmllbGRJZF0gPSBvRmllbGRQcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9GaWVsZC5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzKCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQvKlxuICAgIFx0XHRcdFx0XHRcdFx0XHRcdGZpcmVkIG9uIGtleSBwcmVzcy4gdGhlIGNyZWF0ZSBidXR0b24gaXMgZW5hYmxlZCB3aGVuIGEgdmFsdWUgaXMgYWRkZWQuXG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0bGl2ZUNoYW5nZSBpcyBub3QgZmlyZWQgd2hlbiB2YWx1ZSBpcyBhZGRlZCBmcm9tIHZhbHVlaGVscC5cbiAgICBcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSB2YWxpZGF0aW9uIGlzIG5vdCBkb25lIGZvciBjcmVhdGUgYnV0dG9uIGVuYWJsZW1lbnQuXG4gICAgXHRcdFx0XHRcdFx0XHRcdCovXG5cdFx0XHRcdFx0aGFuZGxlTGl2ZUNoYW5nZTogZnVuY3Rpb24ob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNGaWVsZElkID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImlkXCIpO1xuXHRcdFx0XHRcdFx0Y29uc3QgdlZhbHVlID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInZhbHVlXCIpO1xuXHRcdFx0XHRcdFx0bUZpZWxkVmFsdWVNYXBbc0ZpZWxkSWRdID0gdlZhbHVlO1xuXHRcdFx0XHRcdFx0dmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHRcdHJldHVybiBGcmFnbWVudC5sb2FkKHtcblx0XHRcdFx0XHRkZWZpbml0aW9uOiBvRnJhZ21lbnQsXG5cdFx0XHRcdFx0Y29udHJvbGxlcjogb0NvbnRyb2xsZXJcblx0XHRcdFx0fSkudGhlbihmdW5jdGlvbihvRGlhbG9nQ29udGVudDogYW55KSB7XG5cdFx0XHRcdFx0b0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdFx0dGl0bGU6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfU0FQRkVfQUNUSU9OX0NSRUFURVwiLCBvUmVzb3VyY2VCdW5kbGUpLFxuXHRcdFx0XHRcdFx0Y29udGVudDogW29EaWFsb2dDb250ZW50XSxcblx0XHRcdFx0XHRcdGJlZ2luQnV0dG9uOiB7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfU0FQRkVfQUNUSU9OX0NSRUFURV9CVVRUT05cIiwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbihvRXZlbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9DcmVhdGVCdXR0b24gPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0XHRcdFx0XHRcdFx0b0NyZWF0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYklzQ3JlYXRlRGlhbG9nID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0XHRcdFx0XHRPYmplY3Qua2V5cyhtRmllbGRWYWx1ZU1hcCkubWFwKGZ1bmN0aW9uKHNLZXk6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbUZpZWxkVmFsdWVNYXBbc0tleV0udGhlbihmdW5jdGlvbihvVmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9EaWFsb2dWYWx1ZTogYW55ID0ge307XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZ1ZhbHVlW3NLZXldID0gb1ZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRGlhbG9nVmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihhVmFsdWVzOiBhbnlbXSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgb25CZWZvcmVDcmVhdGVQcm9taXNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2spIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvbkJlZm9yZUNyZWF0ZVByb21pc2UgPSBtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogb0xpc3RCaW5kaW5nICYmIG9MaXN0QmluZGluZy5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzOiBhVmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b25CZWZvcmVDcmVhdGVQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9uQmVmb3JlQ3JlYXRlUHJvbWlzZTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1Byb21pc2UgPSB0aGF0Lm9uQWZ0ZXJDcmVhdGVDb21wbGV0aW9uKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9UcmFuc2llbnRMaXN0QmluZGluZyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvVHJhbnNpZW50Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVyc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvTW9kZWwuc3VibWl0QmF0Y2goXCJzdWJtaXRMYXRlclwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Qcm9taXNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKG9SZXNwb25zZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICghb1Jlc3BvbnNlIHx8IChvUmVzcG9uc2UgJiYgb1Jlc3BvbnNlLmJLZWVwRGlhbG9nT3BlbiAhPT0gdHJ1ZSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLnNldEJpbmRpbmdDb250ZXh0KG51bGwgYXMgYW55KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZShvUmVzcG9uc2UpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlamVjdChvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvRGlhbG9nKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b0NyZWF0ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGVuZEJ1dHRvbjoge1xuXHRcdFx0XHRcdFx0XHR0ZXh0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfQ09NTU9OX0FDVElPTl9QQVJBTUVURVJfRElBTE9HX0NBTkNFTFwiLCBvUmVzb3VyY2VCdW5kbGUpLFxuXHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdC8vIHNob3cgZm9vdGVyIGFzIHBlciBVWCBndWlkZWxpbmVzIHdoZW4gZGlhbG9nIGlzIG5vdCBvcGVuXG5cdFx0XHRcdFx0XHRcdChvRGlhbG9nLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpPy5zZXRQcm9wZXJ0eShcImlzQ3JlYXRlRGlhbG9nT3BlblwiLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0XHRpZiAoIWJTdWNjZXNzKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVqZWN0KHtcblx0XHRcdFx0XHRcdFx0XHRcdGJEZWxldGVUcmFuc2llbnRDb250ZXh0OiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0bmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGFzIGFueSk7XG5cdFx0XHRcdFx0YUZvcm1FbGVtZW50cyA9IG9EaWFsb2dDb250ZW50XG5cdFx0XHRcdFx0XHQuZ2V0QWdncmVnYXRpb24oXCJmb3JtXCIpXG5cdFx0XHRcdFx0XHQuZ2V0QWdncmVnYXRpb24oXCJmb3JtQ29udGFpbmVyc1wiKVswXVxuXHRcdFx0XHRcdFx0LmdldEFnZ3JlZ2F0aW9uKFwiZm9ybUVsZW1lbnRzXCIpO1xuXHRcdFx0XHRcdGlmIChvUGFyZW50Q29udHJvbCAmJiBvUGFyZW50Q29udHJvbC5hZGREZXBlbmRlbnQpIHtcblx0XHRcdFx0XHRcdC8vIGlmIHRoZXJlIGlzIGEgcGFyZW50IGNvbnRyb2wgc3BlY2lmaWVkIGFkZCB0aGUgZGlhbG9nIGFzIGRlcGVuZGVudFxuXHRcdFx0XHRcdFx0b1BhcmVudENvbnRyb2wuYWRkRGVwZW5kZW50KG9EaWFsb2cpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvQ3JlYXRlQnV0dG9uID0gb0RpYWxvZy5nZXRCZWdpbkJ1dHRvbigpO1xuXHRcdFx0XHRcdG9EaWFsb2cuc2V0QmluZGluZ0NvbnRleHQob1RyYW5zaWVudENvbnRleHQpO1xuXHRcdFx0XHRcdHJldHVybiBDb21tb25VdGlscy5zZXRVc2VyRGVmYXVsdHMoXG5cdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0YUltbXV0YWJsZUZpZWxkcyxcblx0XHRcdFx0XHRcdG9UcmFuc2llbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGVBY3Rpb24sXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzKCk7XG5cdFx0XHRcdFx0XHRcdC8vIGZvb3RlciBtdXN0IG5vdCBiZSB2aXNpYmxlIHdoZW4gdGhlIGRpYWxvZyBpcyBvcGVuIGFzIHBlciBVWCBndWlkZWxpbmVzXG5cdFx0XHRcdFx0XHRcdChvRGlhbG9nLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpLnNldFByb3BlcnR5KFwiaXNDcmVhdGVEaWFsb2dPcGVuXCIsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRvRGlhbG9nLm9wZW4oKTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24ob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblx0b25BZnRlckNyZWF0ZUNvbXBsZXRpb24ob0xpc3RCaW5kaW5nOiBhbnksIG9OZXdEb2N1bWVudENvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGxldCBmblJlc29sdmU6IEZ1bmN0aW9uLCBmblJlamVjdDogRnVuY3Rpb247XG5cdFx0Y29uc3Qgb1Byb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdGZuUmVzb2x2ZSA9IHJlc29sdmU7XG5cdFx0XHRmblJlamVjdCA9IHJlamVjdDtcblx0XHR9KTtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblx0XHQvLyBXb3JrYXJvdW5kIHN1Z2dlc3RlZCBieSBPRGF0YSBtb2RlbCB2NCBjb2xsZWFndWVzXG5cdFx0Y29uc3QgZm5DcmVhdGVDb21wbGV0ZWQgPSBmdW5jdGlvbihvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29udGV4dFwiKSxcblx0XHRcdFx0YlN1Y2Nlc3MgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdGlmIChvQ29udGV4dCA9PT0gb05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRvTGlzdEJpbmRpbmcuZGV0YWNoQ3JlYXRlQ29tcGxldGVkKGZuQ3JlYXRlQ29tcGxldGVkLCB0aGF0KTtcblx0XHRcdFx0aWYgKCFiU3VjY2Vzcykge1xuXHRcdFx0XHRcdGNvbnN0IG9FcnJvcjogYW55ID0geyBiRGVsZXRlVHJhbnNpZW50Q29udGV4dDogZmFsc2UgfTtcblx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQpIHtcblx0XHRcdFx0XHRcdC8vIHRoZSBjb250ZXh0IGlzIGRlbGV0ZWRcblxuXHRcdFx0XHRcdFx0Ly8gdGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgY29uc29sZSBlcnJvcnMgVE8gYmUgY2hlY2tlZCB3aXRoIG1vZGVsIGNvbGxlYWd1ZXNcblx0XHRcdFx0XHRcdG9Db250ZXh0XG5cdFx0XHRcdFx0XHRcdC5jcmVhdGVkKClcblx0XHRcdFx0XHRcdFx0LnRoZW4odW5kZWZpbmVkLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgY3JlYXRpb24gY29udGV4dCBkZWxldGVkXCIpO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24ob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgY3JlYXRpb24gY29udGV4dCBkZWxldGlvbiBlcnJvclwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuYklzQ3JlYXRlRGlhbG9nKSB7XG5cdFx0XHRcdFx0XHRcdC8vIGlmIGN1cnJlbnQgc3RhdGUgaXMgdHJhbnNpZW50ICguLi4pLCBicm93c2VyIHdpbGwgY29tZSBiYWNrIHRvIHByZXZpb3VzIHN0YXRlXG5cdFx0XHRcdFx0XHRcdG9FcnJvci5uYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRvRXJyb3IuYkRlbGV0ZVRyYW5zaWVudENvbnRleHQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRmblJlamVjdChvRXJyb3IpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRmblJlc29sdmUoeyBiS2VlcERpYWxvZ09wZW46IHRydWUgfSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Zm5SZXNvbHZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHRcdG9MaXN0QmluZGluZy5hdHRhY2hDcmVhdGVDb21wbGV0ZWQoZm5DcmVhdGVDb21wbGV0ZWQsIHRoaXMpO1xuXHRcdHJldHVybiBvUHJvbWlzZTtcblx0fVxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBOZXdBY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAc3RhdGljXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyLl9nZXROZXdBY3Rpb25cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU3RhcnR1cFBhcmFtZXRlcnMgU3RhcnR1cCBwYXJhbWV0ZXJzIG9mIHRoZSBhcHBsaWNhdGlvblxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0NyZWF0ZUhhc2ggSGFzaCB0byBiZSBjaGVja2VkIGZvciBhY3Rpb24gdHlwZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb01ldGFNb2RlbCBUaGUgTWV0YU1vZGVsIHVzZWQgdG8gY2hlY2sgZm9yIE5ld0FjdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNNZXRhUGF0aCBUaGUgTWV0YVBhdGhcblx0ICogQHJldHVybnMge3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqKi9cblx0X2dldE5ld0FjdGlvbihvU3RhcnR1cFBhcmFtZXRlcnM6IGFueSwgc0NyZWF0ZUhhc2g6IHN0cmluZywgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIHNNZXRhUGF0aDogc3RyaW5nKSB7XG5cdFx0bGV0IHNOZXdBY3Rpb247XG5cblx0XHRpZiAob1N0YXJ0dXBQYXJhbWV0ZXJzICYmIG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlICYmIHNDcmVhdGVIYXNoLmluZGV4T2YoXCJpLWFjdGlvbj1jcmVhdGVXaXRoXCIpID4gLTEpIHtcblx0XHRcdGNvbnN0IHNQcmVmZXJyZWRNb2RlID0gb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVbMF07XG5cdFx0XHRzTmV3QWN0aW9uID1cblx0XHRcdFx0c1ByZWZlcnJlZE1vZGUuaW5kZXhPZihcImNyZWF0ZVdpdGg6XCIpID4gLTEgPyBzUHJlZmVycmVkTW9kZS5zdWJzdHIoc1ByZWZlcnJlZE1vZGUubGFzdEluZGV4T2YoXCI6XCIpICsgMSkgOiB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNOZXdBY3Rpb24gPVxuXHRcdFx0XHRvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0ICE9PSB1bmRlZmluZWRcblx0XHRcdFx0XHQ/IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNNZXRhUGF0aCArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZC9OZXdBY3Rpb25cIikgfHxcblx0XHRcdFx0XHQgIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNNZXRhUGF0aCArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvTmV3QWN0aW9uXCIpXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiBzTmV3QWN0aW9uO1xuXHR9XG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGxhYmVsIGZvciB0aGUgdGl0bGUgb2YgYSBzcGVjaWZpYyBjcmVhdGUgYWN0aW9uIGRpYWxvZywgZS5nLiBDcmVhdGUgU2FsZXMgT3JkZXIgZnJvbSBRdW90YXRpb24uXG5cdCAqXG5cdCAqIFRoZSBmb2xsb3dpbmcgcHJpb3JpdHkgaXMgYXBwbGllZDpcblx0ICogMS4gbGFiZWwgb2YgbGluZS1pdGVtIGFubm90YXRpb24uXG5cdCAqIDIuIGxhYmVsIGFubm90YXRlZCBpbiB0aGUgYWN0aW9uLlxuXHQgKiAzLiBcIkNyZWF0ZVwiIGFzIGEgY29uc3RhbnQgZnJvbSBpMThuLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHN0YXRpY1xuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlci5fZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHBhcmFtIHtvYmplY3R9IG9NZXRhTW9kZWwgVGhlIE1ldGFNb2RlbCB1c2VkIHRvIGNoZWNrIGZvciB0aGUgTmV3QWN0aW9uIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc01ldGFQYXRoIFRoZSBNZXRhUGF0aFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc05ld0FjdGlvbiBDb250YWlucyB0aGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvUmVzb3VyY2VCdW5kbGVDb3JlIFJlc291cmNlQnVuZGxlIHRvIGFjY2VzcyB0aGUgZGVmYXVsdCBDcmVhdGUgbGFiZWxcblx0ICogQHJldHVybnMge3N0cmluZ30gVGhlIGxhYmVsIGZvciB0aGUgQ3JlYXRlIEFjdGlvbiBEaWFsb2dcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKiovXG5cdF9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsKFxuXHRcdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRcdHNNZXRhUGF0aDogc3RyaW5nLFxuXHRcdHNOZXdBY3Rpb246IHN0cmluZyxcblx0XHRvUmVzb3VyY2VCdW5kbGVDb3JlOiBSZXNvdXJjZUJ1bmRsZVxuXHQpIHtcblx0XHRjb25zdCBmbkdldExhYmVsRnJvbUxpbmVJdGVtQW5ub3RhdGlvbiA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtXCIpKSB7XG5cdFx0XHRcdGNvbnN0IGlMaW5lSXRlbUluZGV4ID0gb01ldGFNb2RlbFxuXHRcdFx0XHRcdC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtXCIpXG5cdFx0XHRcdFx0LmZpbmRJbmRleChmdW5jdGlvbihvTGluZUl0ZW06IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgYUxpbmVJdGVtQWN0aW9uID0gb0xpbmVJdGVtLkFjdGlvbiA/IG9MaW5lSXRlbS5BY3Rpb24uc3BsaXQoXCIoXCIpIDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGFMaW5lSXRlbUFjdGlvbiA/IGFMaW5lSXRlbUFjdGlvblswXSA9PT0gc05ld0FjdGlvbiA6IGZhbHNlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gaUxpbmVJdGVtSW5kZXggPiAtMVxuXHRcdFx0XHRcdD8gb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtXCIpW2lMaW5lSXRlbUluZGV4XS5MYWJlbFxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0cmV0dXJuIChcblx0XHRcdGZuR2V0TGFiZWxGcm9tTGluZUl0ZW1Bbm5vdGF0aW9uKCkgfHxcblx0XHRcdChvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNNZXRhUGF0aCArIFwiL1wiICsgc05ld0FjdGlvbiArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5MYWJlbFwiKSkgfHxcblx0XHRcdChvUmVzb3VyY2VCdW5kbGVDb3JlICYmIG9SZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX1NBUEZFX0FDVElPTl9DUkVBVEVcIikpXG5cdFx0KTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBUcmFuc2FjdGlvbkhlbHBlcjtcbiJdfQ==