@sapui5/sap.fe.core 1.95.0 → 1.98.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 (207) hide show
  1. package/package.json +5 -5
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +3 -3
  4. package/src/sap/fe/core/AppComponent.js +9 -44
  5. package/src/sap/fe/core/AppStateHandler.js +2 -2
  6. package/src/sap/fe/core/BaseController.js +1 -1
  7. package/src/sap/fe/core/BusyLocker.js +13 -1
  8. package/src/sap/fe/core/CommonUtils.js +129 -219
  9. package/src/sap/fe/core/ExtensionAPI.js +14 -6
  10. package/src/sap/fe/core/PageController.js +9 -35
  11. package/src/sap/fe/core/RouterProxy.js +79 -75
  12. package/src/sap/fe/core/Synchronization.js +1 -1
  13. package/src/sap/fe/core/TemplateComponent.js +16 -7
  14. package/src/sap/fe/core/TemplateModel.js +1 -1
  15. package/src/sap/fe/core/TransactionHelper.js +183 -65
  16. package/src/sap/fe/core/actions/draft.js +50 -23
  17. package/src/sap/fe/core/actions/messageHandling.js +86 -7
  18. package/src/sap/fe/core/actions/nonDraft.js +1 -1
  19. package/src/sap/fe/core/actions/operations.js +75 -33
  20. package/src/sap/fe/core/actions/sticky.js +1 -1
  21. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +1 -1
  22. package/src/sap/fe/core/controllerextensions/EditFlow.js +276 -122
  23. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +1 -1
  24. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +14 -6
  25. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +90 -46
  26. package/src/sap/fe/core/controllerextensions/InternalRouting.js +234 -232
  27. package/src/sap/fe/core/controllerextensions/KPIManagement.js +539 -209
  28. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +550 -213
  29. package/src/sap/fe/core/controllerextensions/MassEdit.js +79 -0
  30. package/src/sap/fe/core/controllerextensions/MessageHandler.js +227 -103
  31. package/src/sap/fe/core/controllerextensions/PageReady.js +2 -2
  32. package/src/sap/fe/core/controllerextensions/PageReady.ts +3 -7
  33. package/src/sap/fe/core/controllerextensions/Paginator.js +38 -12
  34. package/src/sap/fe/core/controllerextensions/Placeholder.js +16 -19
  35. package/src/sap/fe/core/controllerextensions/Routing.js +17 -2
  36. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  37. package/src/sap/fe/core/controllerextensions/Share.js +20 -7
  38. package/src/sap/fe/core/controllerextensions/SideEffects.js +8 -9
  39. package/src/sap/fe/core/controllerextensions/SideEffects.ts +19 -17
  40. package/src/sap/fe/core/controllerextensions/ViewState.js +54 -9
  41. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +40 -34
  42. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +35 -0
  43. package/src/sap/fe/core/controls/CommandExecution.js +1 -1
  44. package/src/sap/fe/core/controls/ConditionalWrapper.js +1 -1
  45. package/src/sap/fe/core/controls/CustomQuickViewPage.js +110 -109
  46. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +7 -4
  47. package/src/sap/fe/core/controls/FieldWrapper.js +10 -4
  48. package/src/sap/fe/core/controls/FilterBar.js +1 -1
  49. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -6
  50. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +45 -0
  51. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -1
  52. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +1 -1
  53. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +1 -1
  54. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +1 -1
  55. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
  56. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
  57. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +78 -0
  58. package/src/sap/fe/core/converters/ConverterContext.js +13 -1
  59. package/src/sap/fe/core/converters/ConverterContext.ts +10 -0
  60. package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
  61. package/src/sap/fe/core/converters/ManifestSettings.ts +7 -1
  62. package/src/sap/fe/core/converters/ManifestWrapper.js +18 -7
  63. package/src/sap/fe/core/converters/ManifestWrapper.ts +15 -6
  64. package/src/sap/fe/core/converters/MetaModelConverter.js +920 -882
  65. package/src/sap/fe/core/converters/MetaModelConverter.ts +829 -853
  66. package/src/sap/fe/core/converters/annotations/DataField.js +54 -4
  67. package/src/sap/fe/core/converters/annotations/DataField.ts +53 -3
  68. package/src/sap/fe/core/converters/common/AnnotationConverter.js +83 -48
  69. package/src/sap/fe/core/converters/controls/Common/Action.js +15 -3
  70. package/src/sap/fe/core/converters/controls/Common/Action.ts +12 -3
  71. package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -3
  72. package/src/sap/fe/core/converters/controls/Common/Chart.ts +0 -2
  73. package/src/sap/fe/core/converters/controls/Common/Form.js +68 -21
  74. package/src/sap/fe/core/converters/controls/Common/Form.ts +60 -16
  75. package/src/sap/fe/core/converters/controls/Common/KPI.js +331 -248
  76. package/src/sap/fe/core/converters/controls/Common/KPI.ts +355 -287
  77. package/src/sap/fe/core/converters/controls/Common/Table.js +426 -332
  78. package/src/sap/fe/core/converters/controls/Common/Table.ts +516 -383
  79. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +468 -0
  80. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +609 -0
  81. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +30 -13
  82. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +31 -12
  83. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
  84. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
  85. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +15 -7
  86. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +27 -6
  87. package/src/sap/fe/core/converters/helpers/Aggregation.js +8 -1
  88. package/src/sap/fe/core/converters/helpers/Aggregation.ts +9 -1
  89. package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
  90. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +2 -2
  91. package/src/sap/fe/core/converters/helpers/ID.js +9 -1
  92. package/src/sap/fe/core/converters/helpers/ID.ts +6 -2
  93. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -5
  94. package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -4
  95. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +2 -2
  96. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +1 -1
  97. package/src/sap/fe/core/converters/templates/ListReportConverter.js +34 -4
  98. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -7
  99. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +2 -5
  100. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +1 -2
  101. package/src/sap/fe/core/designtime/AppComponent.designtime.js +11 -2
  102. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  103. package/src/sap/fe/core/formatters/FPMFormatter.ts +8 -3
  104. package/src/sap/fe/core/formatters/TableFormatter.js +27 -4
  105. package/src/sap/fe/core/formatters/TableFormatter.ts +20 -3
  106. package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
  107. package/src/sap/fe/core/formatters/ValueFormatter.ts +25 -3
  108. package/src/sap/fe/core/fpm/Component.js +2 -2
  109. package/src/sap/fe/core/helpers/AppStartupHelper.js +359 -0
  110. package/src/sap/fe/core/helpers/AppStartupHelper.ts +388 -0
  111. package/src/sap/fe/core/helpers/BindingExpression.js +199 -111
  112. package/src/sap/fe/core/helpers/BindingExpression.ts +193 -102
  113. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
  114. package/src/sap/fe/core/helpers/EditState.js +1 -1
  115. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -3
  116. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  117. package/src/sap/fe/core/helpers/KeepAliveHelper.js +211 -0
  118. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +202 -0
  119. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +32 -0
  120. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.ts +36 -0
  121. package/src/sap/fe/core/helpers/MassEditHelper.js +678 -0
  122. package/src/sap/fe/core/helpers/ModelHelper.js +64 -1
  123. package/src/sap/fe/core/helpers/PasteHelper.js +7 -1
  124. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  125. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  126. package/src/sap/fe/core/helpers/StableIdHelper.js +2 -2
  127. package/src/sap/fe/core/helpers/StableIdHelper.ts +1 -1
  128. package/src/sap/fe/core/library.js +28 -2
  129. package/src/sap/fe/core/library.support.js +10 -4
  130. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +62 -0
  131. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +66 -0
  132. package/src/sap/fe/core/messagebundle.properties +67 -3
  133. package/src/sap/fe/core/messagebundle_ar.properties +40 -3
  134. package/src/sap/fe/core/messagebundle_bg.properties +40 -3
  135. package/src/sap/fe/core/messagebundle_ca.properties +41 -4
  136. package/src/sap/fe/core/messagebundle_cs.properties +41 -4
  137. package/src/sap/fe/core/messagebundle_cy.properties +40 -3
  138. package/src/sap/fe/core/messagebundle_da.properties +40 -3
  139. package/src/sap/fe/core/messagebundle_de.properties +40 -3
  140. package/src/sap/fe/core/messagebundle_el.properties +40 -3
  141. package/src/sap/fe/core/messagebundle_en.properties +37 -0
  142. package/src/sap/fe/core/messagebundle_en_GB.properties +37 -0
  143. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +37 -0
  144. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +46 -2
  145. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +44 -0
  146. package/src/sap/fe/core/messagebundle_es.properties +40 -3
  147. package/src/sap/fe/core/messagebundle_es_MX.properties +41 -4
  148. package/src/sap/fe/core/messagebundle_et.properties +40 -3
  149. package/src/sap/fe/core/messagebundle_fi.properties +40 -3
  150. package/src/sap/fe/core/messagebundle_fr.properties +41 -4
  151. package/src/sap/fe/core/messagebundle_fr_CA.properties +40 -3
  152. package/src/sap/fe/core/messagebundle_hi.properties +40 -3
  153. package/src/sap/fe/core/messagebundle_hr.properties +40 -3
  154. package/src/sap/fe/core/messagebundle_hu.properties +41 -4
  155. package/src/sap/fe/core/messagebundle_id.properties +42 -5
  156. package/src/sap/fe/core/messagebundle_it.properties +40 -3
  157. package/src/sap/fe/core/messagebundle_iw.properties +40 -3
  158. package/src/sap/fe/core/messagebundle_ja.properties +49 -12
  159. package/src/sap/fe/core/messagebundle_kk.properties +40 -3
  160. package/src/sap/fe/core/messagebundle_ko.properties +40 -3
  161. package/src/sap/fe/core/messagebundle_lt.properties +40 -3
  162. package/src/sap/fe/core/messagebundle_lv.properties +40 -3
  163. package/src/sap/fe/core/messagebundle_ms.properties +40 -3
  164. package/src/sap/fe/core/messagebundle_nl.properties +40 -3
  165. package/src/sap/fe/core/messagebundle_no.properties +40 -3
  166. package/src/sap/fe/core/messagebundle_pl.properties +40 -3
  167. package/src/sap/fe/core/messagebundle_pt.properties +42 -5
  168. package/src/sap/fe/core/messagebundle_pt_PT.properties +40 -3
  169. package/src/sap/fe/core/messagebundle_ro.properties +40 -3
  170. package/src/sap/fe/core/messagebundle_ru.properties +40 -3
  171. package/src/sap/fe/core/messagebundle_sh.properties +40 -3
  172. package/src/sap/fe/core/messagebundle_sk.properties +40 -3
  173. package/src/sap/fe/core/messagebundle_sl.properties +40 -3
  174. package/src/sap/fe/core/messagebundle_sv.properties +41 -4
  175. package/src/sap/fe/core/messagebundle_th.properties +40 -3
  176. package/src/sap/fe/core/messagebundle_tr.properties +40 -3
  177. package/src/sap/fe/core/messagebundle_uk.properties +40 -3
  178. package/src/sap/fe/core/messagebundle_vi.properties +40 -3
  179. package/src/sap/fe/core/messagebundle_zh_CN.properties +40 -3
  180. package/src/sap/fe/core/messagebundle_zh_TW.properties +40 -3
  181. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
  182. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +1 -1
  183. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +4 -3
  184. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -0
  185. package/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
  186. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
  187. package/src/sap/fe/core/services/RoutingServiceFactory.js +98 -328
  188. package/src/sap/fe/core/services/ShellServicesFactory.js +31 -2
  189. package/src/sap/fe/core/services/ShellServicesFactory.ts +30 -1
  190. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +8 -5
  191. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +11 -6
  192. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +14 -5
  193. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
  194. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
  195. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
  196. package/src/sap/fe/core/templating/DataModelPathHelper.js +8 -37
  197. package/src/sap/fe/core/templating/DataModelPathHelper.ts +13 -33
  198. package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
  199. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
  200. package/src/sap/fe/core/templating/EntitySetHelper.js +86 -3
  201. package/src/sap/fe/core/templating/EntitySetHelper.ts +44 -0
  202. package/src/sap/fe/core/templating/FilterHelper.js +10 -7
  203. package/src/sap/fe/core/templating/FilterHelper.ts +8 -6
  204. package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
  205. package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  206. package/src/sap/fe/core/templating/UIFormatters.js +47 -107
  207. package/src/sap/fe/core/templating/UIFormatters.ts +76 -72
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
3
+ * (c) Copyright 2009-2022 SAP SE. All rights reserved.
4
4
  */
5
5
  sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "sap/ui/model/json/JSONModel"], function(
6
6
  ControllerExtension,
@@ -13,8 +13,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
13
13
  *
14
14
  * @name sap.fe.core.controllerextensions.Paginator
15
15
  * @hideconstructor
16
- * @ui5-restricted
17
- * @experimental
16
+ * @public
18
17
  * @since 1.94.0
19
18
  */
20
19
  return ControllerExtension.extend("sap.fe.core.controllerextensions.Paginator", {
@@ -28,6 +27,11 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
28
27
  "final": true,
29
28
  "public": true
30
29
  },
30
+ onBeforeContextUpdate: {
31
+ "final": false,
32
+ "public": false,
33
+ overrideExecution: OverrideExecution.After
34
+ },
31
35
  onContextUpdate: {
32
36
  "final": false,
33
37
  "public": true,
@@ -41,7 +45,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
41
45
  * @param {string} oBinding ODataListBinding object
42
46
  * @param {object} oContext Current context where the navigation is initiated
43
47
  * @alias sap.fe.core.controllerextensions.Paginator#initialize
44
- * @ui5-restricted
48
+ * @public
45
49
  * @since 1.94.0
46
50
  **/
47
51
  initialize: function(oBinding, oContext) {
@@ -109,26 +113,48 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
109
113
  }
110
114
  },
111
115
 
112
- updateCurrentContext: function(index) {
116
+ updateCurrentContext: function(iDeltaIndex) {
113
117
  var that = this;
114
- if (!this._oListBinding) {
118
+
119
+ if (!that._oListBinding) {
115
120
  return;
116
121
  }
117
- var aCurrentContexts = this._oListBinding.getCurrentContexts();
118
- var iNewIndex = this._iCurrentIndex + index;
119
- if (aCurrentContexts[iNewIndex]) {
120
- this._iCurrentIndex = iNewIndex;
121
- that.onContextUpdate(aCurrentContexts[iNewIndex]);
122
+
123
+ var aCurrentContexts = that._oListBinding.getCurrentContexts();
124
+ var iNewIndex = that._iCurrentIndex + iDeltaIndex;
125
+ var oNewContext = aCurrentContexts[iNewIndex];
126
+
127
+ if (oNewContext) {
128
+ var bPreventIdxUpdate = that.onBeforeContextUpdate(this._oListBinding, this._iCurrentIndex, iDeltaIndex);
129
+ if (!bPreventIdxUpdate) {
130
+ that._iCurrentIndex = iNewIndex;
131
+ that._oCurrentContext = oNewContext;
132
+ }
133
+ that.onContextUpdate(oNewContext);
122
134
  }
123
135
  that._handleButtonEnablement();
124
136
  },
125
137
 
138
+ /**
139
+ * Called before context update.
140
+ * @function
141
+ * @param {object} oListBinding ODataListBinding object
142
+ * @param {object} iCurrentIndex Current index of context in listBinding from where the navigation is initiated
143
+ * @param {integer} iIndexUpdate The delta index for update
144
+ * @returns {boolean} `true` to prevent the update of current context.
145
+ * @alias sap.fe.core.controllerextensions.Paginator#onBeforeContextUpdate
146
+ * @private
147
+ **/
148
+ onBeforeContextUpdate: function(oListBinding, iCurrentIndex, iIndexUpdate) {
149
+ return false;
150
+ },
151
+
126
152
  /**
127
153
  * Returns the updated context after the paginator operation.
128
154
  * @function
129
155
  * @param {string} oContext Final context returned after the paginator action
130
156
  * @alias sap.fe.core.controllerextensions.Paginator#onContextUpdate
131
- * @ui5-restricted
157
+ * @public
132
158
  * @since 1.94.0
133
159
  **/
134
160
  onContextUpdate: function(oContext) {
@@ -1,16 +1,17 @@
1
1
  /*!
2
2
  * SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
3
+ * (c) Copyright 2009-2022 SAP SE. All rights reserved.
4
4
  */
5
5
 
6
6
  sap.ui.define(
7
7
  [
8
8
  "sap/ui/core/mvc/ControllerExtension",
9
9
  "sap/base/util/UriParameters",
10
+ "sap/base/util/ObjectPath",
10
11
  "sap/ui/core/Placeholder",
11
12
  "sap/fe/placeholder/library" // library dependency
12
13
  ],
13
- function(ControllerExtension, UriParameters, Placeholder) {
14
+ function(ControllerExtension, UriParameters, ObjectPath, Placeholder) {
14
15
  "use strict";
15
16
 
16
17
  /**
@@ -24,9 +25,12 @@ sap.ui.define(
24
25
  attachHideCallback: function() {
25
26
  if (this.isPlaceholderEnabled()) {
26
27
  var oView = this.base.getView();
27
- var oPage = oView.getParent().oContainer;
28
- var oNavContainer = oPage.getParent();
28
+ var oPage = oView.getParent() && oView.getParent().oContainer;
29
+ var oNavContainer = oPage && oPage.getParent();
29
30
 
31
+ if (!oNavContainer) {
32
+ return;
33
+ }
30
34
  var _fnContainerDelegate = {
31
35
  onAfterShow: function(oEvent) {
32
36
  if (oEvent.isBackToPage) {
@@ -132,22 +136,15 @@ sap.ui.define(
132
136
  },
133
137
 
134
138
  isPlaceholderEnabled: function() {
135
- var bPlaceholderEnabled = false;
136
- switch (UriParameters.fromQuery(window.location.search).get("sap-ui-xx-placeholder")) {
137
- case "true":
138
- bPlaceholderEnabled = true;
139
- break;
140
- case "false":
141
- bPlaceholderEnabled = false;
142
- break;
143
- default:
144
- bPlaceholderEnabled =
145
- window["sap-ushell-config"] &&
146
- window["sap-ushell-config"].apps &&
147
- window["sap-ushell-config"].apps.placeholder &&
148
- window["sap-ushell-config"].apps.placeholder.enabled;
139
+ var bPlaceholderEnabledInFLP = ObjectPath.get("sap-ushell-config.apps.placeholder.enabled");
140
+ if (bPlaceholderEnabledInFLP === false) {
141
+ return false;
149
142
  }
150
- return bPlaceholderEnabled;
143
+
144
+ return sap.ui
145
+ .getCore()
146
+ .getConfiguration()
147
+ .getPlaceholder();
151
148
  }
152
149
  });
153
150
  return Extension;
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
3
+ * (c) Copyright 2009-2022 SAP SE. All rights reserved.
4
4
  */
5
5
  sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution"], function(
6
6
  ControllerExtension,
@@ -22,7 +22,8 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
22
22
  "onBeforeNavigation": { "public": true, "final": false, overrideExecution: OverrideExecution.After },
23
23
  "navigate": { "public": true, "final": true },
24
24
  "onBeforeBinding": { "public": true, "final": false, overrideExecution: OverrideExecution.After },
25
- "onAfterBinding": { "public": true, "final": false, overrideExecution: OverrideExecution.After }
25
+ "onAfterBinding": { "public": true, "final": false, overrideExecution: OverrideExecution.After },
26
+ "navigateToRoute": { "public": true, "final": true }
26
27
  }
27
28
  },
28
29
 
@@ -103,6 +104,20 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
103
104
 
104
105
  onAfterBinding: function(oContext) {
105
106
  // to be overriden by the application
107
+ },
108
+
109
+ /**
110
+ * Navigate to another target.
111
+ *
112
+ * @alias sap.fe.core.controllerextensions.Routing#navigateToRoute
113
+ * @param {string} sTargetRouteName Name of the target route
114
+ * @param {object} [oParameters] Parameters to be used with route to create the target hash
115
+ * @returns {Promise} Promise that is resolved when the navigation is finalized
116
+ *
117
+ * @public
118
+ */
119
+ navigateToRoute: function(sTargetRouteName, oParameters) {
120
+ return this.base._routing.navigateToRoute(sTargetRouteName, oParameters);
106
121
  }
107
122
  });
108
123
  });
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
3
+ * (c) Copyright 2009-2022 SAP SE. All rights reserved.
4
4
  */
5
5
  sap.ui.define(["sap/fe/core/controllerextensions/InternalRouting"], function(InternalRouting) {
6
6
  "use strict";
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
3
+ * (c) Copyright 2009-2022 SAP SE. All rights reserved.
4
4
  */
5
5
 
6
6
  // ---------------------------------------------------------------------------------------
@@ -133,20 +133,26 @@ sap.ui.define(
133
133
  }
134
134
  };
135
135
  oLastFocusedControl = by;
136
+
137
+ var setShareEmailData = function(oShareActionSheet, oModelData) {
138
+ var oShareMailModel = oShareActionSheet.getModel("shareData");
139
+ var oNewMailData = extend(oShareMailModel.getData(), oModelData);
140
+ oShareMailModel.setData(oNewMailData);
141
+ };
136
142
  return Promise.resolve(that.adaptShareMetadata(oShareMetadata))
137
143
  .then(function(oModelData) {
138
144
  fragmentController = {
139
145
  shareEmailPressed: function() {
146
+ var oMailData = oShareActionSheet.getModel("shareData");
147
+ oMailData = oMailData.getData();
140
148
  var oResource = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
141
- var sEmailSubject = oModelData.email.title
142
- ? oModelData.email.title
143
- : oResource.getText("T_SHARE_UTIL_HELPER_SAPFE_EMAIL_SUBJECT", [oModelData.title]);
149
+ var sEmailSubject = oMailData.email.title
150
+ ? oMailData.email.title
151
+ : oResource.getText("T_SHARE_UTIL_HELPER_SAPFE_EMAIL_SUBJECT", [oMailData.title]);
144
152
  library.URLHelper.triggerEmail(
145
153
  null,
146
154
  sEmailSubject,
147
- window.location.origin +
148
- window.location.pathname +
149
- (oModelData.email.url ? oModelData.email.url : oModelData.url)
155
+ oMailData.email.url ? oMailData.email.url : oMailData.url
150
156
  );
151
157
  },
152
158
  onSaveTilePress: function() {
@@ -196,10 +202,12 @@ sap.ui.define(
196
202
  };
197
203
  if (by.shareSheet) {
198
204
  oShareActionSheet = by.shareSheet;
205
+
199
206
  var oShareModel = oShareActionSheet.getModel("share");
200
207
  that._setStaticShareData(oShareModel);
201
208
  var oNewData = extend(oShareModel.getData(), oTileData);
202
209
  oShareModel.setData(oNewData);
210
+ setShareEmailData(oShareActionSheet, oModelData);
203
211
  oShareActionSheet.openBy(by);
204
212
  } else {
205
213
  var sFragmentName = "sap.fe.macros.share.ShareSheet",
@@ -211,11 +219,16 @@ sap.ui.define(
211
219
  })
212
220
  .then(function(oActionSheet) {
213
221
  oShareActionSheet = oActionSheet;
222
+
214
223
  oShareActionSheet.setModel(new JSONModel(oTileData || {}), "share");
215
224
  var oShareModel = oShareActionSheet.getModel("share");
216
225
  that._setStaticShareData(oShareModel);
217
226
  var oNewData = extend(oShareModel.getData(), oTileData);
218
227
  oShareModel.setData(oNewData);
228
+
229
+ oShareActionSheet.setModel(new JSONModel(oModelData || {}), "shareData");
230
+ setShareEmailData(oShareActionSheet, oModelData);
231
+
219
232
  by.addDependent(oShareActionSheet);
220
233
  oShareActionSheet.openBy(by);
221
234
  fragmentController.setShareSheet(oShareActionSheet);
@@ -7,7 +7,6 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
7
7
 
8
8
  var _dec, _dec2, _class, _class2;
9
9
 
10
- var getFieldStateOnChange = FieldRuntime.getFieldStateOnChange;
11
10
  var Private = ClassSupport.Private;
12
11
  var Final = ClassSupport.Final;
13
12
  var Public = ClassSupport.Public;
@@ -26,7 +25,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
26
25
 
27
26
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
28
27
 
29
- function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
28
+ function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
30
29
 
31
30
  function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
32
31
 
@@ -476,7 +475,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
476
475
  var promise = oEvent.getParameter("promise") || Promise.resolve();
477
476
  return promise.then(function () {
478
477
  var oPromise = new Promise(function (resolve, reject) {
479
- if (!getFieldStateOnChange(oEvent).state.validity) {
478
+ if (!FieldRuntime.getFieldStateOnChange(oEvent).state.validity) {
480
479
  reject();
481
480
  } else {
482
481
  resolve(true);
@@ -692,15 +691,15 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
692
691
  }, {
693
692
  key: "_getBindingForField",
694
693
  value: function _getBindingForField(oField) {
695
- var oBinding;
694
+ var sBindingName = "value";
696
695
 
697
696
  if (oField.isA("sap.m.CheckBox")) {
698
- oBinding = oField.getBinding("selected");
699
- } else {
700
- oBinding = oField.getBinding("value");
697
+ sBindingName = "selected";
698
+ } else if (oField.isA("sap.ui.unified.FileUploader")) {
699
+ sBindingName = "uploadUrl";
701
700
  }
702
701
 
703
- return oBinding;
702
+ return oField.getBinding(sBindingName);
704
703
  }
705
704
  }]);
706
705
 
@@ -708,4 +707,4 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
708
707
  }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "clearPropertiesStatus", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "clearPropertiesStatus"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getRegisteredFailedRequests", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getRegisteredFailedRequests"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleFieldChange", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "handleFieldChange"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleFieldGroupChange", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "handleFieldGroupChange"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "addControlSideEffects", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "addControlSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "removeFailedSideEffects", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "removeFailedSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "requestSideEffects", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "requestSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "removeControlSideEffects", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "removeControlSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "_addFailedSideEffects", [Private, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "_addFailedSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "_getContextForSideEffects", [Private, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "_getContextForSideEffects"), _class2.prototype)), _class2)) || _class);
709
708
  return SideEffectsControllerExtension;
710
709
  }, false);
711
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzLnRzIl0sIm5hbWVzIjpbIlNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiIsIlVJNUNsYXNzIiwiQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhIiwiT3ZlcnJpZGUiLCJfb1ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9vQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJfb1NpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsIl9tRmllbGRHcm91cFF1ZXVlIiwiX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZSIsIlNldCIsIl9tRmFpbGVkU2lkZUVmZmVjdHMiLCJjbGVhciIsIm9FdmVudCIsIm9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlIiwibUV2ZW50RmllbGRQcm9wZXJ0aWVzIiwiX2dldEZpZWxkUHJvcGVydGllcyIsImFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXMiLCJfaW5pdGlhbGl6ZUZpZWxkU2lkZUVmZmVjdHMiLCJiSXNJbW1lZGlhdGVUcmlnZ2VyZWQiLCJfZ2VuZXJhdGVJbW1lZGlhdGVQcm9taXNlIiwidGhlbiIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJtU2lkZUVmZmVjdHNQcm9wZXJ0eSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsInNpZGVFZmZlY3RzIiwiY29udGV4dCIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZGVidWciLCJmaWx0ZXIiLCJtSW1tZWRpYXRlU2lkZUVmZmVjdHMiLCJwcmV2aW91c2x5RmFpbGVkIiwiZm9yRWFjaCIsIl9hZGRGYWlsZWRTaWRlRWZmZWN0cyIsInRoYXQiLCJhRGVmZXJyZWRTaWRlRWZmZWN0cyIsImFGaWVsZEdyb3VwSWRzIiwiZ2V0UGFyYW1ldGVyIiwiZ2V0RmllbGRHcm91cFJlcXVlc3RQcm9taXNlIiwib0RlZmVycmVkU2lkZUVmZmVjdCIsImJJc1JlcXVlc3RzVHJpZ2dlcmVkIiwib1NpZGVFZmZlY3RQcm9wZXJ0eSIsInNpZGVFZmZlY3RQcm9wZXJ0eSIsIm9Db250ZXh0Iiwic0NvbnRleHRQYXRoIiwiZ2V0UGF0aCIsInNFbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwibUVudGl0eVR5cGUiLCJfZ2V0RW50aXR5VHlwZUZyb21GUU4iLCJwcm9taXNlcyIsIlNvdXJjZVByb3BlcnRpZXMiLCJldmVyeSIsInNvdXJjZVByb3BlcnR5IiwidHlwZSIsInNJZCIsIl9nZW5lcmF0ZVN0YXR1c0luZGV4IiwidmFsdWUiLCJoYXMiLCJmaW5hbGx5IiwibmFtZSIsInNGaWVsZEdyb3VwSWQiLCJzU2lkZUVmZmVjdE5hbWUiLCJyZXBsYWNlIiwibUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzIiwiT2JqZWN0Iiwia2V5cyIsInByb2Nlc3NTdGFydGVkIiwicHVzaCIsIm9TaWRlRWZmZWN0cyIsImFkZENvbnRyb2xTaWRlRWZmZWN0cyIsImZSZXNvbHZlciIsImZSZWplY3RvciIsIm9Qcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImFUYXJnZXRzIiwiVGFyZ2V0RW50aXRpZXMiLCJjb25jYXQiLCJUYXJnZXRQcm9wZXJ0aWVzIiwic1RyaWdnZXJBY3Rpb24iLCJUcmlnZ2VyQWN0aW9uIiwiZXhlY3V0ZUFjdGlvbiIsIm9Db250cm9sIiwic0NvbnRyb2xJZCIsImlzQSIsImdldElkIiwicmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzIiwiYklzTm90QWxyZWFkeUxpc3RlZCIsIm1GYWlsZWRTaWRlRWZmZWN0cyIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsImJQcm9taXNlU3VjY2VzcyIsInByb21pc2UiLCJfc2F2ZUZpZWxkUHJvcGVydGllc1N0YXR1cyIsImZpZWxkIiwib0ZpZWxkIiwic0ZpZWxkSGVscGVySWQiLCJnZXRGaWVsZEhlbHAiLCJvRmlsdGVySGVscCIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImJ5SWQiLCJnZXRPdXRQYXJhbWV0ZXJzIiwib091dFBhcmFtZXRlciIsIm9CaW5kaW5nIiwiZ2V0QmluZGluZyIsInJlcXVlc3RWYWx1ZSIsInNQcm9wZXJ0eVBhdGgiLCJtUHJvcGVydHkiLCJyZXNvbHZlUGF0aCIsIl90eXBlIiwiam9pbiIsInVuZGVmaW5lZCIsIm9Tb3VyY2VGaWVsZCIsInNTaWRlRWZmZWN0RW50aXR5VHlwZSIsIm9CaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwib0NvbnRleHRGb3JTaWRlRWZmZWN0cyIsImdldENvbnRleHQiLCJzRnVsbHlRdWFsaWZpZWROYW1lIiwiZ2V0Q29udmVydGVkTWV0YU1vZGVsIiwiZW50aXR5VHlwZXMiLCJmaW5kIiwib0VudGl0eVR5cGUiLCJnZXRGaWVsZFN0YXRlT25DaGFuZ2UiLCJzdGF0ZSIsInZhbGlkaXR5IiwiZ2V0U291cmNlIiwiX2dldEZpZWxkUHJvbWlzZSIsInNpZGVFZmZlY3RzTWFwIiwiX2dldEZpZWxkU2lkZUVmZmVjdHNNYXAiLCJtU2lkZUVmZmVjdHNNYXAiLCJnZXRGaWVsZEdyb3VwSWRzIiwic1ZpZXdFbnRpdHlTZXRTZXROYW1lIiwiZ2V0Vmlld0RhdGEiLCJlbnRpdHlTZXQiLCJvVmlld0VudGl0eVNldCIsImVudGl0eVNldHMiLCJvRW50aXR5U2V0IiwiYklzSW1tZWRpYXRlIiwiaW5kZXhPZiIsInNOYW1lIiwiYVNpZGVFZmZlY3RQYXJ0cyIsInNwbGl0Iiwic1NpZGVFZmZlY3RQYXRoIiwibGVuZ3RoIiwib1NpZGVFZmZlY3QiLCJnZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzIiwiX2dldENvbnRleHRGb3JTaWRlRWZmZWN0cyIsImltbWVkaWF0ZSIsInNWaWV3RW50aXR5VHlwZSIsImVudGl0eVR5cGUiLCJtRmllbGRQYXRoIiwiZ2V0QWdncmVnYXRpb24iLCJvQ3VzdG9tRGF0YSIsImdldEtleSIsInNGaWVsZFBhdGgiLCJnZXRWYWx1ZSIsIm1Db250cm9sRW50aXR5VHlwZSIsImdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyIsInNDb250cm9sTmFtZSIsIm9Db250cm9sU2lkZUVmZmVjdHMiLCJpbmNsdWRlcyIsIm1GaWVsZFNpZGVFZmZlY3RzTWFwIiwib0ZpZWxkUHJvbWlzZUZvckZpZWxkR3JvdXAiLCJfZ2VuZXJhdGVGaWVsZEdyb3VwUHJvbWlzZSIsIm1GYWlsZWRTaWRlRWZmZWN0c05hbWUiLCJzU2lkZUVmZmVjdENvbnRleHRQYXRoIiwiYUZhaWxlZFNpZGVFZmZlY3RzIiwibVNpZGVFZmZlY3RDb250ZXh0UGF0aCIsImJTdWNjZXNzIiwib0ZpZWxkQmluZGluZyIsIl9nZXRCaW5kaW5nRm9yRmllbGQiLCJhRmllbGRQYXRocyIsImdldEJpbmRpbmdzIiwic1BhdGgiLCJDb250cm9sbGVyRXh0ZW5zaW9uIiwiUHVibGljIiwiRmluYWwiLCJQcml2YXRlIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQWtETUEsOEIsV0FETEMsUUFBUSxDQUFDLDhDQUFELEVBQWlEQywyQkFBakQsQyxVQVNQQyxRQUFRLEU7Ozs7Ozs7Ozs7Ozs7YUFBVCxrQkFDZ0I7QUFDZixhQUFLQyxNQUFMLEdBQWUsSUFBRCxDQUFjQyxJQUFkLENBQW1CQyxPQUFuQixFQUFkO0FBQ0EsYUFBS0MsY0FBTCxHQUFzQkMsV0FBVyxDQUFDQyxlQUFaLENBQTRCLEtBQUtMLE1BQWpDLENBQXRCO0FBQ0EsYUFBS00sb0JBQUwsR0FBNEIsS0FBS0gsY0FBTCxDQUFvQkkscUJBQXBCLEVBQTVCO0FBQ0EsYUFBS0MsaUJBQUwsR0FBeUIsRUFBekI7QUFDQSxhQUFLQyx5QkFBTCxHQUFpQyxJQUFJQyxHQUFKLEVBQWpDO0FBQ0EsYUFBS0MsbUJBQUwsR0FBMkIsRUFBM0I7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OzthQUNDLGlDQUVxQztBQUNwQyxhQUFLRix5QkFBTCxDQUErQkcsS0FBL0I7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O2FBQ0MsdUNBRWlFO0FBQ2hFLGVBQU8sS0FB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LEVBQ0FDLEssaUxBWUFELE0sRUFDQUMsSyw2S0FpQkFELE0sRUFDQUMsSyx3S0E2Q0FELE0sRUFDQUMsSyw0S0FrRkFELE0sRUFDQUMsSyw2S0FXQUQsTSxFQUNBQyxLLDBLQWNBRCxNLEVBQ0FDLEssMktBZ0NBRCxNLEVBQ0FDLEssOEtBa0JBQyxPLEVBQ0FELEssK0tBOEdBQyxPLEVBQ0FELEs7U0F3UWEzTCw4QiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udHJvbGxlckV4dGVuc2lvbiB9IGZyb20gXCJzYXAvdWkvY29yZS9tdmNcIjtcbmltcG9ydCB7IEJpbmRpbmcsIENvbnRleHQgfSBmcm9tIFwic2FwL3VpL21vZGVsXCI7XG5pbXBvcnQgeyBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnNcIjtcbmltcG9ydCB7IFVJNUNsYXNzLCBPdmVycmlkZSwgUHVibGljLCBGaW5hbCwgUHJpdmF0ZSB9IGZyb20gXCIuLi9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHsgQXBwQ29tcG9uZW50LCBDb21tb25VdGlscyB9IGZyb20gXCJzYXAvZmUvY29yZVwiO1xuaW1wb3J0IHsgQ29udHJvbCB9IGZyb20gXCJzYXAvdWkvY29yZVwiO1xuaW1wb3J0IHtcblx0U2lkZUVmZmVjdHNUeXBlLFxuXHRDb250cm9sU2lkZUVmZmVjdHNUeXBlLFxuXHRPRGF0YVNpZGVFZmZlY3RzVHlwZSxcblx0Q29udHJvbFNpZGVFZmZlY3RzRW50aXR5RGljdGlvbmFyeVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHsgZ2V0RmllbGRTdGF0ZU9uQ2hhbmdlIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvZmllbGQvRmllbGRSdW50aW1lXCI7XG5pbXBvcnQgeyBDb252ZXJ0ZXJPdXRwdXQsIFByb3BlcnR5UGF0aCwgRW50aXR5VHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHsgTG9nIH0gZnJvbSBcInNhcC9iYXNlXCI7XG5cbnR5cGUgRmllbGRDb250cm9sID0gQ29udHJvbCAmIHtcblx0Z2V0RmllbGRIZWxwKCk6IHN0cmluZztcblx0Z2V0RmllbGRHcm91cElkcygpOiBzdHJpbmdbXTtcbn07XG5cbnR5cGUgRmllbGRFdmVudFByb3BlcnR5VHlwZSA9IHtcblx0cHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuXHRmaWVsZDogRmllbGRDb250cm9sO1xuXHRzaWRlRWZmZWN0c01hcDogRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeTtcbn07XG5cbnR5cGUgRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlID0ge1xuXHRuYW1lOiBzdHJpbmc7XG5cdGltbWVkaWF0ZT86IGJvb2xlYW47XG5cdGNvbnRleHQ6IENvbnRleHQ7XG5cdHNpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGU7XG5cdHByZXZpb3VzbHlGYWlsZWQ/OiBib29sZWFuO1xufTtcblxudHlwZSBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlPjtcblxudHlwZSBGYWlsZWRTaWRlRWZmZWN0RGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RzVHlwZVtdPjtcblxudHlwZSBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGUgPSB7XG5cdHByb21pc2VzOiBQcm9taXNlPGFueT5bXTtcblx0c2lkZUVmZmVjdFByb3BlcnR5OiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGU7XG5cdHByb2Nlc3NTdGFydGVkPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgRmllbGRHcm91cFF1ZXVlTWFwVHlwZSA9IHtcblx0W3NpZGVFZmZlY3ROYW1lOiBzdHJpbmddOiB7XG5cdFx0W2NvbnRleHRQYXRoOiBzdHJpbmddOiBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGU7XG5cdH07XG59O1xuXG5AVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5TaWRlRWZmZWN0c1wiLCBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEpXG5jbGFzcyBTaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb24gZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJpdmF0ZSBfb1ZpZXc6IGFueTtcblx0cHJpdmF0ZSBfb0FwcENvbXBvbmVudCE6IEFwcENvbXBvbmVudDtcblx0cHJpdmF0ZSBfbUZpZWxkR3JvdXBRdWV1ZSE6IEZpZWxkR3JvdXBRdWV1ZU1hcFR5cGU7XG5cdHByaXZhdGUgX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZSE6IFNldDxzdHJpbmc+O1xuXHRwcml2YXRlIF9vU2lkZUVmZmVjdHNTZXJ2aWNlITogYW55O1xuXHRwcml2YXRlIF9tRmFpbGVkU2lkZUVmZmVjdHMhOiBGYWlsZWRTaWRlRWZmZWN0RGljdGlvbmFyeTtcblxuXHRAT3ZlcnJpZGUoKVxuXHRwdWJsaWMgb25Jbml0KCkge1xuXHRcdHRoaXMuX29WaWV3ID0gKHRoaXMgYXMgYW55KS5iYXNlLmdldFZpZXcoKTtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuX29WaWV3KTtcblx0XHR0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHR0aGlzLl9tRmllbGRHcm91cFF1ZXVlID0ge307XG5cdFx0dGhpcy5fYVNvdXJjZVByb3BlcnRpZXNGYWlsdXJlID0gbmV3IFNldCgpO1xuXHRcdHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0cyA9IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIENsZWFyIHJlY29yZGVkIHZhbGlkYXRpb24gc3RhdHVzIGZvciBhbGwgcHJvcGVydGllcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGNsZWFyUHJvcGVydGllc1N0YXR1c1xuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGNsZWFyUHJvcGVydGllc1N0YXR1cygpOiB2b2lkIHtcblx0XHR0aGlzLl9hU291cmNlUHJvcGVydGllc0ZhaWx1cmUuY2xlYXIoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIGZhaWxlZCBTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGdldFJlZ2lzdGVyZWRGYWlsZWRSZXF1ZXN0c1xuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBSZWdpc3RlcmVkIFNpZGVFZmZlY3RzIHJlcXVlc3RzIHRoYXQgaGF2ZSBmYWlsZWRcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyBnZXRSZWdpc3RlcmVkRmFpbGVkUmVxdWVzdHMoKTogRmFpbGVkU2lkZUVmZmVjdERpY3Rpb25hcnkge1xuXHRcdHJldHVybiB0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogTWFuYWdlcyB0aGUgd29ya2Zsb3cgZm9yIFNpZGVFZmZlY3RzIHdpdGggcmVsYXRlZCBjaGFuZ2VzIHRvIGEgZmllbGRcblx0ICogVGhlIGZvbGxvd2luZyBzY2VuYXJpb3MgYXJlIG1hbmFnZWQ6XG5cdCAqICAtIEV4ZWN1dGU6IHRyaWdnZXJzIGltbWVkaWF0ZSBTaWRlRWZmZWN0cyByZXF1ZXN0cyBpZiB0aGUgcHJvbWlzZSBmb3IgdGhlIGZpZWxkIGV2ZW50IGlzIGZ1bGZpbGxlZFxuXHQgKiAgLSBSZWdpc3RlcjogY2FjaGVzIGRlZmVycmVkIFNpZGVFZmZlY3RzIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBGaWVsZEdyb3VwIGlzIHVuZm9jdXNlZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGhhbmRsZUZpZWxkQ2hhbmdlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRXZlbnQgU0FQVUk1IGV2ZW50IHRoYXQgY29tZXMgZnJvbSBhIGZpZWxkIGNoYW5nZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWQgYmVmb3JlIGV4ZWN1dGluZyBkZWZlcnJlZCBTaWRlRWZmZWN0c1xuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSAgUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0KHMpXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgaGFuZGxlRmllbGRDaGFuZ2Uob0V2ZW50OiBVSTVFdmVudCwgb0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGU/OiBQcm9taXNlPGFueT4pOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IG1FdmVudEZpZWxkUHJvcGVydGllcyA9IHRoaXMuX2dldEZpZWxkUHJvcGVydGllcyhvRXZlbnQpLFxuXHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllczogRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlW10gPSB0aGlzLl9pbml0aWFsaXplRmllbGRTaWRlRWZmZWN0cyhcblx0XHRcdFx0bUV2ZW50RmllbGRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRvRmllbGRHcm91cFByZVJlcXVpc2l0ZVxuXHRcdFx0KTtcblxuXHRcdGxldCBiSXNJbW1lZGlhdGVUcmlnZ2VyZWQgPSBmYWxzZTtcblxuXHRcdHJldHVybiB0aGlzLl9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzKVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRiSXNJbW1lZGlhdGVUcmlnZ2VyZWQgPSB0cnVlO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllcy5tYXAobVNpZGVFZmZlY3RzUHJvcGVydHkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzKG1TaWRlRWZmZWN0c1Byb3BlcnR5LnNpZGVFZmZlY3RzLCBtU2lkZUVmZmVjdHNQcm9wZXJ0eS5jb250ZXh0KTtcblx0XHRcdFx0XHR9KSB8fCBbXVxuXHRcdFx0XHQpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChvRXJyb3IgPT4ge1xuXHRcdFx0XHRpZiAoYklzSW1tZWRpYXRlVHJpZ2dlcmVkKSB7XG5cdFx0XHRcdFx0TG9nLmRlYnVnKFwiRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBGaWVsZCBTaWRlRWZmZWN0c1wiLCBvRXJyb3IpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIFNpZGVFZmZlY3RzIGhhdmUgbm90IGJlZW4gdHJpZ2dlcmVkIHNpbmNlIHByZVJlcXVpc2l0ZSB2YWxpZGF0aW9uIGZhaWxzIHNvIHdlIG5lZWRcblx0XHRcdFx0XHQgKiB0byBrZWVwIHByZXZpb3VzbHkgZmFpbGVkIHJlcXVlc3QgYXMgRmFpbGVkIHJlcXVlc3QgKHRvIGJlIHJldHJpZ2dlciBvbiBuZXh0IGNoYW5nZSlcblx0XHRcdFx0XHQgKi9cblxuXHRcdFx0XHRcdGFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXNcblx0XHRcdFx0XHRcdC5maWx0ZXIobUltbWVkaWF0ZVNpZGVFZmZlY3RzID0+IG1JbW1lZGlhdGVTaWRlRWZmZWN0cy5wcmV2aW91c2x5RmFpbGVkID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0LmZvckVhY2gobUltbWVkaWF0ZVNpZGVFZmZlY3RzID0+XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2FkZEZhaWxlZFNpZGVFZmZlY3RzKG1JbW1lZGlhdGVTaWRlRWZmZWN0cy5zaWRlRWZmZWN0cywgbUltbWVkaWF0ZVNpZGVFZmZlY3RzLmNvbnRleHQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIFNpZGVFZmZlY3RzIHdpdGggYSByZWxhdGVkICdmb2N1cyBvdXQnIHRvIGEgZmllbGQgZ3JvdXAuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBoYW5kbGVGaWVsZEdyb3VwQ2hhbmdlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRXZlbnQgU0FQVUk1IEV2ZW50XG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFByb21pc2Ugb24gU2lkZUVmZmVjdHMgcmVxdWVzdChzKVxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGhhbmRsZUZpZWxkR3JvdXBDaGFuZ2Uob0V2ZW50OiBVSTVFdmVudCk6IFByb21pc2U8YW55PiB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXMsXG5cdFx0XHRhRGVmZXJyZWRTaWRlRWZmZWN0czogRmllbGRHcm91cFNpZGVFZmZlY3RUeXBlW10gPSBbXSxcblx0XHRcdGFGaWVsZEdyb3VwSWRzOiBzdHJpbmdbXSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJmaWVsZEdyb3VwSWRzXCIpO1xuXG5cdFx0Y29uc3QgZ2V0RmllbGRHcm91cFJlcXVlc3RQcm9taXNlID0gZnVuY3Rpb24ob0RlZmVycmVkU2lkZUVmZmVjdDogRmllbGRHcm91cFNpZGVFZmZlY3RUeXBlKSB7XG5cdFx0XHRsZXQgYklzUmVxdWVzdHNUcmlnZ2VyZWQgPSBmYWxzZTtcblx0XHRcdGNvbnN0IG9TaWRlRWZmZWN0UHJvcGVydHkgPSBvRGVmZXJyZWRTaWRlRWZmZWN0LnNpZGVFZmZlY3RQcm9wZXJ0eTtcblx0XHRcdGNvbnN0IG9Db250ZXh0ID0gb1NpZGVFZmZlY3RQcm9wZXJ0eS5jb250ZXh0O1xuXHRcdFx0Y29uc3Qgc0NvbnRleHRQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0Y29uc3Qgc0VudGl0eVR5cGUgPSB0aGF0Ll9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRjb25zdCBtRW50aXR5VHlwZSA9IHRoYXQuX2dldEVudGl0eVR5cGVGcm9tRlFOKHNFbnRpdHlUeXBlKTtcblxuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKG9EZWZlcnJlZFNpZGVFZmZlY3QucHJvbWlzZXMpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGJJc1JlcXVlc3RzVHJpZ2dlcmVkID0gdHJ1ZTtcblxuXHRcdFx0XHRcdC8vRGVmZXJyZWQgU2lkZUVmZmVjdHMgYXJlIGV4ZWN1dGVkIG9ubHkgaWYgYWxsIHNvdXJjZVByb3BlcnRpZXMgaGF2ZSBubyByZWdpc3RlcmVkIGZhaWx1cmUuXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0bUVudGl0eVR5cGUgJiZcblx0XHRcdFx0XHRcdChvU2lkZUVmZmVjdFByb3BlcnR5LnNpZGVFZmZlY3RzLlNvdXJjZVByb3BlcnRpZXMgYXMgUHJvcGVydHlQYXRoW10pLmV2ZXJ5KHNvdXJjZVByb3BlcnR5ID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKHNvdXJjZVByb3BlcnR5LnR5cGUgPT09IFwiUHJvcGVydHlQYXRoXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzSWQgPSB0aGF0Ll9nZW5lcmF0ZVN0YXR1c0luZGV4KG1FbnRpdHlUeXBlLCBzb3VyY2VQcm9wZXJ0eS52YWx1ZSwgb0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzSWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiAhdGhhdC5fYVNvdXJjZVByb3BlcnRpZXNGYWlsdXJlLmhhcyhzSWQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhhdC5yZXF1ZXN0U2lkZUVmZmVjdHMob1NpZGVFZmZlY3RQcm9wZXJ0eS5zaWRlRWZmZWN0cywgb1NpZGVFZmZlY3RQcm9wZXJ0eS5jb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChvRXJyb3IgPT4ge1xuXHRcdFx0XHRcdGlmIChiSXNSZXF1ZXN0c1RyaWdnZXJlZCkge1xuXHRcdFx0XHRcdFx0TG9nLmRlYnVnKFwiRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBGaWVsZEdyb3VwIFNpZGVFZmZlY3RzIG9uIGNvbnRleHQgXCIgKyBzQ29udGV4dFBhdGgsIG9FcnJvcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdFx0ZGVsZXRlIHRoYXQuX21GaWVsZEdyb3VwUXVldWVbb1NpZGVFZmZlY3RQcm9wZXJ0eS5uYW1lXVtzQ29udGV4dFBhdGhdO1xuXHRcdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0YUZpZWxkR3JvdXBJZHMuZm9yRWFjaChzRmllbGRHcm91cElkID0+IHtcblx0XHRcdC8qKlxuXHRcdFx0ICogc3RyaW5nIFwiJCRJbW1lZGlhdGVSZXF1ZXN0XCIgaXMgYWRkZWQgdG8gdGhlIFNpZGVFZmZlY3RzIG5hbWUgZHVyaW5nIHRlbXBsYXRpbmcgdG8ga25vd1xuXHRcdFx0ICogaWYgdGhpcyBTaWRlRWZmZWN0cyBtdXN0IGJlIGltbWVkaWF0ZWx5IGV4ZWN1dGVkIHJlcXVlc3RlZCAob24gZmllbGQgY2hhbmdlKSBvciBtdXN0XG5cdFx0XHQgKiBiZSBkZWZlcnJlZCAob24gZmllbGQgZ3JvdXAgZm9jdXMgb3V0KVxuXHRcdFx0ICpcblx0XHRcdCAqL1xuXHRcdFx0Y29uc3Qgc1NpZGVFZmZlY3ROYW1lOiBzdHJpbmcgPSBzRmllbGRHcm91cElkLnJlcGxhY2UoXCIkJEltbWVkaWF0ZVJlcXVlc3RcIiwgXCJcIik7XG5cdFx0XHRjb25zdCBtQ29udGV4dERlZmVycmVkU2lkZUVmZmVjdHMgPSB0aGF0Ll9tRmllbGRHcm91cFF1ZXVlPy5bc1NpZGVFZmZlY3ROYW1lXTtcblx0XHRcdGlmIChtQ29udGV4dERlZmVycmVkU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0T2JqZWN0LmtleXMobUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzKS5mb3JFYWNoKHNDb250ZXh0UGF0aCA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb0RlZmVycmVkU2lkZUVmZmVjdCA9IG1Db250ZXh0RGVmZXJyZWRTaWRlRWZmZWN0c1tzQ29udGV4dFBhdGhdO1xuXHRcdFx0XHRcdGlmICghb0RlZmVycmVkU2lkZUVmZmVjdC5wcm9jZXNzU3RhcnRlZCkge1xuXHRcdFx0XHRcdFx0b0RlZmVycmVkU2lkZUVmZmVjdC5wcm9jZXNzU3RhcnRlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRhRGVmZXJyZWRTaWRlRWZmZWN0cy5wdXNoKG9EZWZlcnJlZFNpZGVFZmZlY3QpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRhRGVmZXJyZWRTaWRlRWZmZWN0cy5tYXAob0RlZmVycmVkU2lkZUVmZmVjdCA9PiB7XG5cdFx0XHRcdHJldHVybiBnZXRGaWVsZEdyb3VwUmVxdWVzdFByb21pc2Uob0RlZmVycmVkU2lkZUVmZmVjdCk7XG5cdFx0XHR9KVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIFNpZGVFZmZlY3RzIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBhZGRDb250cm9sU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNFbnRpdHlUeXBlIE5hbWUgb2YgdGhlIGVudGl0eSB3aGVyZSB0aGUgU2lkZUVmZmVjdHMgY29udHJvbCB3aWxsIGJlIHJlZ2lzdGVyZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyB0byByZWdpc3Rlci4gRW5zdXJlIHRoZSBzb3VyY2VDb250cm9sSWQgbWF0Y2hlcyB0aGUgYXNzb2NpYXRlZCBTQVBVSTUgY29udHJvbCBJRC5cblx0ICpcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyBhZGRDb250cm9sU2lkZUVmZmVjdHMoc0VudGl0eVR5cGU6IHN0cmluZywgb1NpZGVFZmZlY3RzOiBPbWl0PENvbnRyb2xTaWRlRWZmZWN0c1R5cGUsIFwiZnVsbHlRdWFsaWZpZWROYW1lXCI+KTogdm9pZCB7XG5cdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5hZGRDb250cm9sU2lkZUVmZmVjdHMoc0VudGl0eVR5cGUsIG9TaWRlRWZmZWN0cyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgcXVldWUgY29udGFpbmluZyB0aGUgZmFpbGVkIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVtb3ZlRmFpbGVkU2lkZUVmZmVjdHNcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyByZW1vdmVGYWlsZWRTaWRlRWZmZWN0cygpOiB2b2lkIHtcblx0XHR0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHMgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0IFNpZGVFZmZlY3RzIG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHJlcXVlc3RTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgcmVxdWVzdCBvbiBTQVBVSTUgY29udGV4dFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIHJlcXVlc3RTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZSwgb0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPGFueT4ge1xuXHRcdGxldCBmUmVzb2x2ZXI6IGFueSwgZlJlamVjdG9yOiBhbnk7XG5cdFx0Y29uc3Qgb1Byb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdGZSZXNvbHZlciA9IHJlc29sdmU7XG5cdFx0XHRmUmVqZWN0b3IgPSByZWplY3Q7XG5cdFx0fSk7XG5cdFx0Y29uc3QgYVRhcmdldHM6IGFueVtdID0gKChvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMgYXMgYW55W10pIHx8IFtdKS5jb25jYXQoKG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzIGFzIGFueVtdKSB8fCBbXSksXG5cdFx0XHRzVHJpZ2dlckFjdGlvbjogU3RyaW5nIHwgdW5kZWZpbmVkID0gKG9TaWRlRWZmZWN0cyBhcyBPRGF0YVNpZGVFZmZlY3RzVHlwZSkuVHJpZ2dlckFjdGlvbjtcblxuXHRcdGlmIChzVHJpZ2dlckFjdGlvbikge1xuXHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5leGVjdXRlQWN0aW9uKHNUcmlnZ2VyQWN0aW9uLCBvQ29udGV4dCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZVxuXHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhhVGFyZ2V0cywgb0NvbnRleHQpXG5cdFx0XHQudGhlbigoKSA9PiBmUmVzb2x2ZXIoKSlcblx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0dGhpcy5fYWRkRmFpbGVkU2lkZUVmZmVjdHMob1NpZGVFZmZlY3RzLCBvQ29udGV4dCk7XG5cdFx0XHRcdGZSZWplY3RvcihvRXJyb3IpO1xuXHRcdFx0fSk7XG5cblx0XHRyZXR1cm4gb1Byb21pc2U7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBTaWRlRWZmZWN0cyBjcmVhdGVkIGJ5IGEgY29udHJvbC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRyb2wgU0FQVUk1IENvbnRyb2xcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyByZW1vdmVDb250cm9sU2lkZUVmZmVjdHMob0NvbnRyb2w6IENvbnRyb2wpOiB2b2lkIHtcblx0XHRjb25zdCBzQ29udHJvbElkID0gb0NvbnRyb2wgJiYgb0NvbnRyb2wuaXNBICYmIG9Db250cm9sLmlzQShcInNhcC51aS5iYXNlLk1hbmFnZWRPYmplY3RcIikgJiYgb0NvbnRyb2wuZ2V0SWQoKTtcblxuXHRcdGlmIChzQ29udHJvbElkKSB7XG5cdFx0XHR0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLnJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0cyhzQ29udHJvbElkKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBTaWRlRWZmZWN0cyB0byB0aGUgcXVldWUgb2YgdGhlIGZhaWxlZCBTaWRlRWZmZWN0c1xuXHQgKiBUaGUgU2lkZUVmZmVjdHMgd2lsbCBiZSByZXRyaWdnZXJlZCBvbiB0aGUgbmV4dCBjaGFuZ2Ugb24gdGhlIHNhbWUgY29udGV4dC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9hZGRGYWlsZWRTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIHRoYXQgbmVlZCB0byBiZSByZXRyaWdnZXJlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dCB3aGVyZSBTaWRlRWZmZWN0cyBoYXZlIGZhaWxlZFxuXHQgKi9cblx0QFByaXZhdGVcblx0QEZpbmFsXG5cdHByaXZhdGUgX2FkZEZhaWxlZFNpZGVFZmZlY3RzKG9TaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUeXBlLCBvQ29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aDogc3RyaW5nID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0c1tzQ29udGV4dFBhdGhdID0gdGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0gfHwgW107XG5cdFx0Y29uc3QgYklzTm90QWxyZWFkeUxpc3RlZCA9IHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0c1tzQ29udGV4dFBhdGhdLmV2ZXJ5KFxuXHRcdFx0bUZhaWxlZFNpZGVFZmZlY3RzID0+IG9TaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWUgIT09IG1GYWlsZWRTaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVcblx0XHQpO1xuXHRcdGlmIChiSXNOb3RBbHJlYWR5TGlzdGVkKSB7XG5cdFx0XHR0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHNbc0NvbnRleHRQYXRoXS5wdXNoKG9TaWRlRWZmZWN0cyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyB0aGUgcHJvbWlzZSBmb3IgdGhlIGZpZWxkIGdyb3VwIHRoYXQgaXMgcmVxdWlyZWQgYmVmb3JlIHJlcXVlc3RpbmcgU2lkZUVmZmVjdHMuXG5cdCAqIElmIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkIGFuZCBvbmx5IHRoZSBmaWVsZCByZXF1aXJlcyB0aGUgU2lkZUVmZmVjdHMgb24gdGhpcyBjb250ZXh0LCB0aGUgU2lkZUVmZmVjdHMgYXJlIHJlbW92ZWQgZnJvbSB0aGVcblx0ICogU2lkZUVmZmVjdHMgcXVldWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2VuZXJhdGVGaWVsZEdyb3VwUHJvbWlzZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUV2ZW50RmllbGRQcm9wZXJ0aWVzIEZpZWxkIHByb3BlcnRpZXNcblx0ICogQHJldHVybnMge29iamVjdH0gUHJvbWlzZSB0byBiZSB1c2VkIGZvciB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZmllbGRcblx0ICovXG5cdHByaXZhdGUgX2dlbmVyYXRlRmllbGRHcm91cFByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlKTogUHJvbWlzZTxhbnk+IHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblxuXHRcdGxldCBiUHJvbWlzZVN1Y2Nlc3MgPSB0cnVlO1xuXHRcdHJldHVybiBtRXZlbnRGaWVsZFByb3BlcnRpZXMucHJvbWlzZVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBiUHJvbWlzZVN1Y2Nlc3M7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRiUHJvbWlzZVN1Y2Nlc3MgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuIGJQcm9taXNlU3VjY2Vzcztcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBOZWVkIHRvIHN0b3JlIHRoZSBzdGF0dXMgb2YgcHJvcGVydGllcyByZWxhdGVkIHRvIHRoaXMgZmllbGQgZm9yIGRlZmVycmVkIFNpZGVFZmZlY3RzXG5cdFx0XHRcdCAqIHNpbmNlIGFsbCBTb3VyY2VQcm9wZXJ0aWVzIGZvciB0aGlzIGtpbmQgb2YgU2lkZUVmZmVjdHMgbXVzdCBiZSB2YWxpZFxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dGhhdC5fc2F2ZUZpZWxkUHJvcGVydGllc1N0YXR1cyhtRXZlbnRGaWVsZFByb3BlcnRpZXMuZmllbGQsIGJQcm9taXNlU3VjY2Vzcyk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIHByb21pc2UgZm9yIHRoZSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkIGJlZm9yZSByZXF1ZXN0aW5nIGltbWVkaWF0ZSBTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2Vcblx0ICogQHBhcmFtIHtvYmplY3R9IG1FdmVudEZpZWxkUHJvcGVydGllcyBGaWVsZCBwcm9wZXJ0aWVzXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFByb21pc2UgdG8gYmUgdXNlZCBmb3IgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkXG5cdCAqL1xuXHRwcml2YXRlIF9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlKTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBvUHJvbWlzZSA9IG1FdmVudEZpZWxkUHJvcGVydGllcy5wcm9taXNlO1xuXHRcdHJldHVybiBvUHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBJZiB0aGUgZmllbGQgZ2V0cyBhIEZpZWxkSGVscGVyLCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgYWxsIGZpZWxkcyBjaGFuZ2VkIGJ5IHRoaXMgRmllbGRIZWxwZXIgaGF2ZSBiZWVuIHNldC5cblx0XHRcdCAqIFRvIGFjaGlldmUgdGhpcywgd2UgZW5zdXJlIHRoYXQgYWxsIHJlbGF0ZWQgYmluZGluZ3MgaGF2ZSBiZWVuIHJlc29sdmVkLlxuXHRcdFx0ICpcblx0XHRcdCAqIFRoaXMgcmVzb2x1dGlvbiBwcm9jZXNzIGlzIG5vdCBtYW5hZ2VkIGJ5IHRoZSBGaWVsZCBFdmVudCBQcm9taXNlLCBzbyBmb3IgZmFzdCB1c2VyIGFjdGlvbnMgKGxpa2UgYXV0b21hdGlvbikgaXQgY2FuIGxvY2sgdGhlIG1vZGVsXG5cdFx0XHQgKiBhbmQgbm8gcmVxdWVzdCBjYW4gYmUgZXhlY3V0ZWQuXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IG9GaWVsZCA9IG1FdmVudEZpZWxkUHJvcGVydGllcy5maWVsZDtcblx0XHRcdGNvbnN0IHNGaWVsZEhlbHBlcklkID0gb0ZpZWxkLmdldEZpZWxkSGVscCAmJiBvRmllbGQuZ2V0RmllbGRIZWxwKCk7XG5cdFx0XHRpZiAoc0ZpZWxkSGVscGVySWQpIHtcblx0XHRcdFx0Y29uc3Qgb0ZpbHRlckhlbHA6IGFueSA9IHNhcC51aS5nZXRDb3JlKCkuYnlJZChzRmllbGRIZWxwZXJJZCk7XG5cdFx0XHRcdGlmIChvRmlsdGVySGVscCkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdChvRmlsdGVySGVscC5nZXRPdXRQYXJhbWV0ZXJzKCkgYXMgYW55W10pLm1hcChvT3V0UGFyYW1ldGVyID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSBvT3V0UGFyYW1ldGVyLmdldEJpbmRpbmcoXCJ2YWx1ZVwiKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9CaW5kaW5nID8gb0JpbmRpbmcucmVxdWVzdFZhbHVlKCkgOiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFtdKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgYSBzdGF0dXMgaW5kZXguXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2VuZXJhdGVTdGF0dXNJbmRleFxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUVudGl0eVR5cGUgVGhlIGVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUHJvcGVydHlQYXRoIFRoZSBwcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBTQVBVSTUgQ29udGV4dFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBJbmRleFxuXHQgKi9cblx0cHJpdmF0ZSBfZ2VuZXJhdGVTdGF0dXNJbmRleChtRW50aXR5VHlwZTogRW50aXR5VHlwZSwgc1Byb3BlcnR5UGF0aDogc3RyaW5nLCBvQ29udGV4dDogQ29udGV4dCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgc0NvbnRleHRQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IG1Qcm9wZXJ0eSA9IG1FbnRpdHlUeXBlLnJlc29sdmVQYXRoKHNQcm9wZXJ0eVBhdGgpO1xuXHRcdGlmIChtUHJvcGVydHkpIHtcblx0XHRcdGlmIChtUHJvcGVydHkgJiYgbVByb3BlcnR5Ll90eXBlID09PSBcIlByb3BlcnR5XCIpIHtcblx0XHRcdFx0cmV0dXJuIFttUHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lLCBzQ29udGV4dFBhdGhdLmpvaW4oXCJfX1wiKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBhcHByb3ByaWF0ZSBjb250ZXh0IG9uIHdoaWNoIFNpZGVFZmZlY3RzIGNhbiBiZSByZXF1ZXN0ZWQuXG5cdCAqIFRoZSBjb3JyZWN0IG9uZSBtdXN0IGhhdmUgdGhlIGJpbmRpbmcgcGFyYW1ldGVyICQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU291cmNlRmllbGQgRmllbGRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNTaWRlRWZmZWN0RW50aXR5VHlwZSBUYXJnZXQgZW50aXR5IHR5cGUgb2YgdGhlIFNpZGVFZmZlY3RzIGFubm90YXRpb25cblx0ICogQHJldHVybnMge29iamVjdH0gU0FQVUk1IENvbnRleHRcblx0ICovXG5cdEBQcml2YXRlXG5cdEBGaW5hbFxuXHRwcml2YXRlIF9nZXRDb250ZXh0Rm9yU2lkZUVmZmVjdHMob1NvdXJjZUZpZWxkOiBGaWVsZENvbnRyb2wsIHNTaWRlRWZmZWN0RW50aXR5VHlwZTogc3RyaW5nKTogQ29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb1NvdXJjZUZpZWxkLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0bGV0IG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMgPSBvQmluZGluZ0NvbnRleHQsXG5cdFx0XHRzRW50aXR5VHlwZSA9IHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9CaW5kaW5nQ29udGV4dCk7XG5cblx0XHRpZiAoc1NpZGVFZmZlY3RFbnRpdHlUeXBlICE9PSBzRW50aXR5VHlwZSkge1xuXHRcdFx0b0NvbnRleHRGb3JTaWRlRWZmZWN0cyA9IChvQmluZGluZ0NvbnRleHQgYXMgYW55KS5nZXRCaW5kaW5nKCkuZ2V0Q29udGV4dCgpO1xuXHRcdFx0aWYgKG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0c0VudGl0eVR5cGUgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dEZvclNpZGVFZmZlY3RzKTtcblx0XHRcdFx0aWYgKHNTaWRlRWZmZWN0RW50aXR5VHlwZSAhPT0gc0VudGl0eVR5cGUpIHtcblx0XHRcdFx0XHRvQ29udGV4dEZvclNpZGVFZmZlY3RzID0gKG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMgYXMgYW55KS5nZXRCaW5kaW5nKCkuZ2V0Q29udGV4dCgpO1xuXHRcdFx0XHRcdGlmIChvQ29udGV4dEZvclNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdFx0XHRzRW50aXR5VHlwZSA9IHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMpO1xuXHRcdFx0XHRcdFx0aWYgKHNTaWRlRWZmZWN0RW50aXR5VHlwZSAhPT0gc0VudGl0eVR5cGUpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb0NvbnRleHRGb3JTaWRlRWZmZWN0cyB8fCB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBFbnRpdHlUeXBlIGJhc2VkIG9uIGl0cyBmdWxseS1xdWFsaWZpZWQgbmFtZS5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNGdWxseVF1YWxpZmllZE5hbWUgVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSBlbnRpdHkgdHlwZVxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RW50aXR5VHlwZUZyb21GUU4oc0Z1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nKTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgbUVudGl0eVR5cGUgPSAodGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKSBhcyBDb252ZXJ0ZXJPdXRwdXQpLmVudGl0eVR5cGVzLmZpbmQob0VudGl0eVR5cGUgPT4ge1xuXHRcdFx0cmV0dXJuIG9FbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSA9PT0gc0Z1bGx5UXVhbGlmaWVkTmFtZTtcblx0XHR9KTtcblx0XHRyZXR1cm4gbUVudGl0eVR5cGU7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgcHJvbWlzZSBvZiB0aGUgZmllbGQgdmFsaWRhdGlvbiB0aGF0IGlzIHJlcXVpcmVkIGZvciB0aGUgU2lkZUVmZmVjdHMgcHJvY2Vzcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRGaWVsZFByb21pc2Vcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudCBGaWVsZCBjaGFuZ2UgZXZlbnRcblx0ICogQHJldHVybnMge29iamVjdH0gRmllbGQgcHJvbWlzZVxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RmllbGRQcm9taXNlKG9FdmVudDogVUk1RXZlbnQpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IHByb21pc2UgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicHJvbWlzZVwiKSB8fCBQcm9taXNlLnJlc29sdmUoKTtcblxuXHRcdHJldHVybiBwcm9taXNlLnRoZW4oKCkgPT4ge1xuXHRcdFx0Y29uc3Qgb1Byb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdFx0aWYgKCFnZXRGaWVsZFN0YXRlT25DaGFuZ2Uob0V2ZW50KS5zdGF0ZS52YWxpZGl0eSkge1xuXHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIG9Qcm9taXNlO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGZpZWxkIHRoYXQgYXJlIHJlcXVpcmVkIGZvciB0aGUgU2lkZUVmZmVjdHMgcHJvY2Vzcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRGaWVsZFByb3BlcnRpZXNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudCBGaWVsZCBjaGFuZ2UgZXZlbnRcblx0ICogQHJldHVybnMge29iamVjdH0gRmllbGQgcHJvcGVydGllcyAoZXZlbnQgY2hhbmdlIHByb21pc2UsIGZpZWxkLCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIHRoaXMgZmllbGQpXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRGaWVsZFByb3BlcnRpZXMob0V2ZW50OiBVSTVFdmVudCk6IEZpZWxkRXZlbnRQcm9wZXJ0eVR5cGUge1xuXHRcdGNvbnN0IG9GaWVsZDogRmllbGRDb250cm9sID0gb0V2ZW50LmdldFNvdXJjZSgpO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHByb21pc2U6IHRoaXMuX2dldEZpZWxkUHJvbWlzZShvRXZlbnQpLFxuXHRcdFx0ZmllbGQ6IG9GaWVsZCxcblx0XHRcdHNpZGVFZmZlY3RzTWFwOiB0aGlzLl9nZXRGaWVsZFNpZGVFZmZlY3RzTWFwKG9GaWVsZClcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIG1hcFxuXHQgKiBUaGVzZSBTaWRlRWZmZWN0cyBhcmVcblx0ICogLSBsaXN0ZWQgaW50byBGaWVsZEdyb3VwSWRzIChjb21pbmcgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlKVxuXHQgKiAtIGdlbmVyYXRlZCBieSBhIGNvbnRyb2wgb3IgY29udHJvbHMgYW5kIHRoYXQgY29uZmlndXJlIHRoaXMgZmllbGQgYXMgU291cmNlUHJvcGVydGllcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRGaWVsZFNpZGVFZmZlY3RzTWFwXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRmllbGQgRmllbGRcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgbWFwXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRGaWVsZFNpZGVFZmZlY3RzTWFwKG9GaWVsZDogRmllbGRDb250cm9sKTogRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeSB7XG5cdFx0Y29uc3QgbVNpZGVFZmZlY3RzTWFwOiBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5ID0ge30sXG5cdFx0XHRhRmllbGRHcm91cElkczogc3RyaW5nW10gPSBvRmllbGQuZ2V0RmllbGRHcm91cElkcygpLFxuXHRcdFx0c1ZpZXdFbnRpdHlTZXRTZXROYW1lID0gdGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKS5lbnRpdHlTZXQsXG5cdFx0XHRvVmlld0VudGl0eVNldCA9ICh0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldENvbnZlcnRlZE1ldGFNb2RlbCgpIGFzIENvbnZlcnRlck91dHB1dCkuZW50aXR5U2V0cy5maW5kKG9FbnRpdHlTZXQgPT4ge1xuXHRcdFx0XHRyZXR1cm4gb0VudGl0eVNldC5uYW1lID09PSBzVmlld0VudGl0eVNldFNldE5hbWU7XG5cdFx0XHR9KTtcblxuXHRcdC8vIFNpZGVFZmZlY3RzIGNvbWluZyBmcm9tIGFuIE9EYXRhIFNlcnZpY2Vcblx0XHRhRmllbGRHcm91cElkcy5mb3JFYWNoKHNGaWVsZEdyb3VwSWQgPT4ge1xuXHRcdFx0Y29uc3QgYklzSW1tZWRpYXRlOiBib29sZWFuID0gc0ZpZWxkR3JvdXBJZC5pbmRleE9mKFwiJCRJbW1lZGlhdGVSZXF1ZXN0XCIpICE9PSAtMSxcblx0XHRcdFx0c05hbWU6IHN0cmluZyA9IHNGaWVsZEdyb3VwSWQucmVwbGFjZShcIiQkSW1tZWRpYXRlUmVxdWVzdFwiLCBcIlwiKSxcblx0XHRcdFx0YVNpZGVFZmZlY3RQYXJ0czogc3RyaW5nW10gPSBzTmFtZS5zcGxpdChcIiNcIiksXG5cdFx0XHRcdHNTaWRlRWZmZWN0RW50aXR5VHlwZTogc3RyaW5nID0gYVNpZGVFZmZlY3RQYXJ0c1swXSxcblx0XHRcdFx0c1NpZGVFZmZlY3RQYXRoOiBzdHJpbmcgPVxuXHRcdFx0XHRcdHNTaWRlRWZmZWN0RW50aXR5VHlwZSArXG5cdFx0XHRcdFx0XCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNpZGVFZmZlY3RzXCIgK1xuXHRcdFx0XHRcdChhU2lkZUVmZmVjdFBhcnRzLmxlbmd0aCA9PT0gMiA/IFwiI1wiICsgYVNpZGVFZmZlY3RQYXJ0c1sxXSA6IFwiXCIpLFxuXHRcdFx0XHRvU2lkZUVmZmVjdDogU2lkZUVmZmVjdHNUeXBlIHwgdW5kZWZpbmVkID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzKHNTaWRlRWZmZWN0RW50aXR5VHlwZSk/Lltcblx0XHRcdFx0XHRzU2lkZUVmZmVjdFBhdGhcblx0XHRcdFx0XSxcblx0XHRcdFx0b0NvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQgPSB0aGlzLl9nZXRDb250ZXh0Rm9yU2lkZUVmZmVjdHMob0ZpZWxkLCBzU2lkZUVmZmVjdEVudGl0eVR5cGUpO1xuXHRcdFx0aWYgKG9TaWRlRWZmZWN0ICYmIG9Db250ZXh0KSB7XG5cdFx0XHRcdG1TaWRlRWZmZWN0c01hcFtzTmFtZV0gPSB7XG5cdFx0XHRcdFx0bmFtZTogc05hbWUsXG5cdFx0XHRcdFx0aW1tZWRpYXRlOiBiSXNJbW1lZGlhdGUsXG5cdFx0XHRcdFx0c2lkZUVmZmVjdHM6IG9TaWRlRWZmZWN0LFxuXHRcdFx0XHRcdGNvbnRleHQ6IG9Db250ZXh0XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvL1NpZGVFZmZlY3RzIGNvbWluZyBmcm9tIGNvbnRyb2wocylcblx0XHRpZiAoc1ZpZXdFbnRpdHlTZXRTZXROYW1lICYmIG9WaWV3RW50aXR5U2V0KSB7XG5cdFx0XHRjb25zdCBzVmlld0VudGl0eVR5cGUgPSBvVmlld0VudGl0eVNldC5lbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdFx0bUZpZWxkUGF0aDogYW55ID0gKG9GaWVsZC5nZXRBZ2dyZWdhdGlvbihcImN1c3RvbURhdGFcIikgYXMgYW55W10pLmZpbmQob0N1c3RvbURhdGEgPT4ge1xuXHRcdFx0XHRcdHJldHVybiBvQ3VzdG9tRGF0YS5nZXRLZXkoKSA9PT0gXCJzb3VyY2VQYXRoXCI7XG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRvQ29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZCA9IHRoaXMuX2dldENvbnRleHRGb3JTaWRlRWZmZWN0cyhvRmllbGQsIHNWaWV3RW50aXR5VHlwZSk7XG5cblx0XHRcdGlmIChtRmllbGRQYXRoICYmIG9Db250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IHNGaWVsZFBhdGggPSBtRmllbGRQYXRoLmdldFZhbHVlKCkucmVwbGFjZShcIi9cIiArIHNWaWV3RW50aXR5U2V0U2V0TmFtZSArIFwiL1wiLCBcIlwiKSxcblx0XHRcdFx0XHRtQ29udHJvbEVudGl0eVR5cGUgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyhcblx0XHRcdFx0XHRcdHNWaWV3RW50aXR5VHlwZVxuXHRcdFx0XHRcdCkgYXMgQ29udHJvbFNpZGVFZmZlY3RzRW50aXR5RGljdGlvbmFyeTtcblx0XHRcdFx0T2JqZWN0LmtleXMobUNvbnRyb2xFbnRpdHlUeXBlKS5mb3JFYWNoKHNDb250cm9sTmFtZSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb0NvbnRyb2xTaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUeXBlID0gbUNvbnRyb2xFbnRpdHlUeXBlW3NDb250cm9sTmFtZV07XG5cdFx0XHRcdFx0aWYgKChvQ29udHJvbFNpZGVFZmZlY3RzLlNvdXJjZVByb3BlcnRpZXMgYXMgc3RyaW5nW10pLmluY2x1ZGVzKHNGaWVsZFBhdGgpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzTmFtZSA9IHNDb250cm9sTmFtZSArIFwiOjpcIiArIHNWaWV3RW50aXR5VHlwZTtcblx0XHRcdFx0XHRcdG1TaWRlRWZmZWN0c01hcFtzTmFtZV0gPSB7XG5cdFx0XHRcdFx0XHRcdG5hbWU6IHNOYW1lLFxuXHRcdFx0XHRcdFx0XHRpbW1lZGlhdGU6IHRydWUsXG5cdFx0XHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBvQ29udHJvbFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0OiBvQ29udGV4dFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbVNpZGVFZmZlY3RzTWFwO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgdGhlIFNpZGVFZmZlY3RzIHdpdGggcmVsYXRlZCBjaGFuZ2VzIHRvIGEgZmllbGRcblx0ICogTGlzdDogZ2V0cyBpbW1lZGlhdGUgU2lkZUVmZmVjdHMgcmVxdWVzdHNcblx0ICogUmVnaXN0ZXI6IGNhY2hlcyBkZWZlcnJlZCBTaWRlRWZmZWN0cyB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgRmllbGRHcm91cCBpcyB1bmZvY3VzZWQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfaW5pdGlhbGl6ZUZpZWxkU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG1FdmVudEZpZWxkUHJvcGVydGllcyBGaWVsZCBldmVudCBwcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRmllbGRHcm91cFByZVJlcXVpc2l0ZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZCBiZWZvcmUgZXhlY3V0aW5nIGRlZmVycmVkIFNpZGVFZmZlY3RzXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gIEFycmF5IG9mIGltbWVkaWF0ZSBTaWRlRWZmZWN0c1xuXHQgKi9cblx0cHJpdmF0ZSBfaW5pdGlhbGl6ZUZpZWxkU2lkZUVmZmVjdHMoXG5cdFx0bUV2ZW50RmllbGRQcm9wZXJ0aWVzOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlLFxuXHRcdG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlPzogUHJvbWlzZTxhbnk+XG5cdCk6IEZpZWxkU2lkZUVmZmVjdFByb3BlcnR5VHlwZVtdIHtcblx0XHRjb25zdCBtRmllbGRTaWRlRWZmZWN0c01hcCA9IG1FdmVudEZpZWxkUHJvcGVydGllcy5zaWRlRWZmZWN0c01hcCxcblx0XHRcdG9GaWVsZFByb21pc2VGb3JGaWVsZEdyb3VwID0gdGhpcy5fZ2VuZXJhdGVGaWVsZEdyb3VwUHJvbWlzZShtRXZlbnRGaWVsZFByb3BlcnRpZXMpLCAvLyBQcm9taXNlIG1hbmFnaW5nIEZpZWxkR3JvdXAgcmVxdWVzdHMgaWYgRmllbGQgcHJvbWlzZSBmYWlsc1xuXHRcdFx0bUZhaWxlZFNpZGVFZmZlY3RzTmFtZTogYW55ID0ge30sXG5cdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzOiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGVbXSA9IFtdO1xuXG5cdFx0b0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgPSBvRmllbGRHcm91cFByZVJlcXVpc2l0ZSB8fCBQcm9taXNlLnJlc29sdmUoKTtcblxuXHRcdE9iamVjdC5rZXlzKG1GaWVsZFNpZGVFZmZlY3RzTWFwKS5mb3JFYWNoKHNTaWRlRWZmZWN0TmFtZSA9PiB7XG5cdFx0XHRjb25zdCBvU2lkZUVmZmVjdFByb3BlcnR5OiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGUgPSBtRmllbGRTaWRlRWZmZWN0c01hcFtzU2lkZUVmZmVjdE5hbWVdLFxuXHRcdFx0XHRzU2lkZUVmZmVjdENvbnRleHRQYXRoID0gb1NpZGVFZmZlY3RQcm9wZXJ0eS5jb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0YUZhaWxlZFNpZGVFZmZlY3RzID0gdGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdO1xuXG5cdFx0XHQvLyBDaGVjayBpZiB0aGVyZSBpcyBhbnkgcHJldmlvdXNseSBmYWlsZWQgcmVxdWVzdCBmb3IgdGhpcyBjb250ZXh0XG5cdFx0XHRpZiAoYUZhaWxlZFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHNbc1NpZGVFZmZlY3RDb250ZXh0UGF0aF07XG5cdFx0XHRcdG1GYWlsZWRTaWRlRWZmZWN0c05hbWVbc1NpZGVFZmZlY3RDb250ZXh0UGF0aF0gPSB7fTtcblx0XHRcdFx0YUZhaWxlZFNpZGVFZmZlY3RzLmZvckVhY2gobUZhaWxlZFNpZGVFZmZlY3RzID0+IHtcblx0XHRcdFx0XHRtRmFpbGVkU2lkZUVmZmVjdHNOYW1lW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdW21GYWlsZWRTaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVdID0gdHJ1ZTtcblx0XHRcdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzLnB1c2goe1xuXHRcdFx0XHRcdFx0bmFtZTogc1NpZGVFZmZlY3ROYW1lLFxuXHRcdFx0XHRcdFx0cHJldmlvdXNseUZhaWxlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBtRmFpbGVkU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRjb250ZXh0OiBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHRcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob1NpZGVFZmZlY3RQcm9wZXJ0eS5pbW1lZGlhdGUpIHtcblx0XHRcdFx0Ly8gU2lkZUVmZmVjdHMgd2lsbCBiZSBleGVjdXRlZCBpbW1lZGlhdGVseSBhZnRlciBldmVudCBwcm9taXNlIHZhbGlkYXRpb25cblx0XHRcdFx0aWYgKCFtRmFpbGVkU2lkZUVmZmVjdHNOYW1lW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdPy5bb1NpZGVFZmZlY3RQcm9wZXJ0eS5zaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVdKSB7XG5cdFx0XHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllcy5wdXNoKHtcblx0XHRcdFx0XHRcdG5hbWU6IHNTaWRlRWZmZWN0TmFtZSxcblx0XHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBvU2lkZUVmZmVjdFByb3BlcnR5LnNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0Y29udGV4dDogb1NpZGVFZmZlY3RQcm9wZXJ0eS5jb250ZXh0XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEFkZCBkZWZlcnJlZCBTaWRlRWZmZWN0cyB0byB0aGUgcmVsYXRlZCBkaWN0aW9uYXJ5XG5cdFx0XHRcdHRoaXMuX21GaWVsZEdyb3VwUXVldWVbc1NpZGVFZmZlY3ROYW1lXSA9IHRoaXMuX21GaWVsZEdyb3VwUXVldWVbc1NpZGVFZmZlY3ROYW1lXSB8fCB7fTtcblx0XHRcdFx0Y29uc3QgbVNpZGVFZmZlY3RDb250ZXh0UGF0aCA9IHRoaXMuX21GaWVsZEdyb3VwUXVldWVbc1NpZGVFZmZlY3ROYW1lXVtzU2lkZUVmZmVjdENvbnRleHRQYXRoXSB8fCB7XG5cdFx0XHRcdFx0cHJvbWlzZXM6IFtdLFxuXHRcdFx0XHRcdHNpZGVFZmZlY3RQcm9wZXJ0eTogb1NpZGVFZmZlY3RQcm9wZXJ0eSxcblx0XHRcdFx0XHRwcm9jZXNzU3RhcnRlZDogZmFsc2Vcblx0XHRcdFx0fTtcblx0XHRcdFx0bVNpZGVFZmZlY3RDb250ZXh0UGF0aC5wcm9taXNlcyA9IG1TaWRlRWZmZWN0Q29udGV4dFBhdGgucHJvbWlzZXMuY29uY2F0KFtcblx0XHRcdFx0XHRvRmllbGRQcm9taXNlRm9yRmllbGRHcm91cCxcblx0XHRcdFx0XHRvRmllbGRHcm91cFByZVJlcXVpc2l0ZSBhcyBQcm9taXNlPGFueT5cblx0XHRcdFx0XSk7XG5cdFx0XHRcdHRoaXMuX21GaWVsZEdyb3VwUXVldWVbc1NpZGVFZmZlY3ROYW1lXVtzU2lkZUVmZmVjdENvbnRleHRQYXRoXSA9IG1TaWRlRWZmZWN0Q29udGV4dFBhdGg7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXM7XG5cdH1cblxuXHQvKipcblx0ICogU2F2ZXMgdGhlIHZhbGlkYXRpb24gc3RhdHVzIG9mIHByb3BlcnRpZXMgcmVsYXRlZCB0byBhIGZpZWxkIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRmllbGQgRmllbGRcblx0ICogQHBhcmFtIHtib29sZWFufSBiU3VjY2VzcyBTdGF0dXMgb2YgdGhlIGZpZWxkIHZhbGlkYXRpb25cblx0ICovXG5cdHByaXZhdGUgX3NhdmVGaWVsZFByb3BlcnRpZXNTdGF0dXMob0ZpZWxkOiBGaWVsZENvbnRyb2wsIGJTdWNjZXNzOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb0ZpZWxkLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3Qgc0VudGl0eVR5cGUgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQmluZGluZ0NvbnRleHQpO1xuXHRcdGNvbnN0IG1FbnRpdHlUeXBlID0gdGhpcy5fZ2V0RW50aXR5VHlwZUZyb21GUU4oc0VudGl0eVR5cGUpO1xuXHRcdGlmIChtRW50aXR5VHlwZSkge1xuXHRcdFx0Ly8gUmV0cmlldmVzIGFsbCBwcm9wZXJ0aWVzIHVzZWQgYnkgdGhlIGZpZWxkXG5cdFx0XHRjb25zdCBvRmllbGRCaW5kaW5nID0gdGhpcy5fZ2V0QmluZGluZ0ZvckZpZWxkKG9GaWVsZCk7XG5cdFx0XHRjb25zdCBhRmllbGRQYXRocyA9IG9GaWVsZEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLkNvbXBvc2l0ZUJpbmRpbmdcIilcblx0XHRcdFx0PyAoKG9GaWVsZEJpbmRpbmcgYXMgYW55KS5nZXRCaW5kaW5ncygpIHx8IFtdKS5tYXAoKG9CaW5kaW5nOiBhbnkpID0+IG9CaW5kaW5nLnNQYXRoKVxuXHRcdFx0XHQ6IFtvRmllbGRCaW5kaW5nLmdldFBhdGgoKV07XG5cblx0XHRcdC8vIFN0b3JlcyBzdGF0dXMgZm9yIGFsbCBwcm9wZXJ0aWVzXG5cdFx0XHRhRmllbGRQYXRocy5mb3JFYWNoKChzRmllbGRQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0Y29uc3Qgc0lkID0gdGhpcy5fZ2VuZXJhdGVTdGF0dXNJbmRleChtRW50aXR5VHlwZSwgc0ZpZWxkUGF0aCwgb0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdFx0aWYgKHNJZCkge1xuXHRcdFx0XHRcdHRoaXMuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZVtiU3VjY2VzcyA/IFwiZGVsZXRlXCIgOiBcImFkZFwiXShzSWQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBwcm9wZXJ0eSBiaW5kaW5nIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRmllbGQgRmllbGRcblx0ICogQHJldHVybnMge0JpbmRpbmd9ICBCaW5kaW5nIHRvIHRoZSB2YWx1ZVxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0QmluZGluZ0ZvckZpZWxkKG9GaWVsZDogRmllbGRDb250cm9sKTogQmluZGluZyB7XG5cdFx0bGV0IG9CaW5kaW5nOiBCaW5kaW5nO1xuXHRcdGlmIChvRmllbGQuaXNBKFwic2FwLm0uQ2hlY2tCb3hcIikpIHtcblx0XHRcdG9CaW5kaW5nID0gb0ZpZWxkLmdldEJpbmRpbmcoXCJzZWxlY3RlZFwiKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0JpbmRpbmcgPSBvRmllbGQuZ2V0QmluZGluZyhcInZhbHVlXCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gb0JpbmRpbmc7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2lkZUVmZmVjdHNDb250cm9sbGVyRXh0ZW5zaW9uO1xuIl19
710
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzLnRzIl0sIm5hbWVzIjpbIlNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiIsIlVJNUNsYXNzIiwiQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhIiwiT3ZlcnJpZGUiLCJfb1ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9vQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJfb1NpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsIl9tRmllbGRHcm91cFF1ZXVlIiwiX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZSIsIlNldCIsIl9tRmFpbGVkU2lkZUVmZmVjdHMiLCJjbGVhciIsIm9FdmVudCIsIm9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlIiwibUV2ZW50RmllbGRQcm9wZXJ0aWVzIiwiX2dldEZpZWxkUHJvcGVydGllcyIsImFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXMiLCJfaW5pdGlhbGl6ZUZpZWxkU2lkZUVmZmVjdHMiLCJiSXNJbW1lZGlhdGVUcmlnZ2VyZWQiLCJfZ2VuZXJhdGVJbW1lZGlhdGVQcm9taXNlIiwidGhlbiIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJtU2lkZUVmZmVjdHNQcm9wZXJ0eSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsInNpZGVFZmZlY3RzIiwiY29udGV4dCIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZGVidWciLCJmaWx0ZXIiLCJtSW1tZWRpYXRlU2lkZUVmZmVjdHMiLCJwcmV2aW91c2x5RmFpbGVkIiwiZm9yRWFjaCIsIl9hZGRGYWlsZWRTaWRlRWZmZWN0cyIsInRoYXQiLCJhRGVmZXJyZWRTaWRlRWZmZWN0cyIsImFGaWVsZEdyb3VwSWRzIiwiZ2V0UGFyYW1ldGVyIiwiZ2V0RmllbGRHcm91cFJlcXVlc3RQcm9taXNlIiwib0RlZmVycmVkU2lkZUVmZmVjdCIsImJJc1JlcXVlc3RzVHJpZ2dlcmVkIiwib1NpZGVFZmZlY3RQcm9wZXJ0eSIsInNpZGVFZmZlY3RQcm9wZXJ0eSIsIm9Db250ZXh0Iiwic0NvbnRleHRQYXRoIiwiZ2V0UGF0aCIsInNFbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwibUVudGl0eVR5cGUiLCJfZ2V0RW50aXR5VHlwZUZyb21GUU4iLCJwcm9taXNlcyIsIlNvdXJjZVByb3BlcnRpZXMiLCJldmVyeSIsInNvdXJjZVByb3BlcnR5IiwidHlwZSIsInNJZCIsIl9nZW5lcmF0ZVN0YXR1c0luZGV4IiwidmFsdWUiLCJoYXMiLCJmaW5hbGx5IiwibmFtZSIsInNGaWVsZEdyb3VwSWQiLCJzU2lkZUVmZmVjdE5hbWUiLCJyZXBsYWNlIiwibUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzIiwiT2JqZWN0Iiwia2V5cyIsInByb2Nlc3NTdGFydGVkIiwicHVzaCIsIm9TaWRlRWZmZWN0cyIsImFkZENvbnRyb2xTaWRlRWZmZWN0cyIsImZSZXNvbHZlciIsImZSZWplY3RvciIsIm9Qcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImFUYXJnZXRzIiwiVGFyZ2V0RW50aXRpZXMiLCJjb25jYXQiLCJUYXJnZXRQcm9wZXJ0aWVzIiwic1RyaWdnZXJBY3Rpb24iLCJUcmlnZ2VyQWN0aW9uIiwiZXhlY3V0ZUFjdGlvbiIsIm9Db250cm9sIiwic0NvbnRyb2xJZCIsImlzQSIsImdldElkIiwicmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzIiwiYklzTm90QWxyZWFkeUxpc3RlZCIsIm1GYWlsZWRTaWRlRWZmZWN0cyIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsImJQcm9taXNlU3VjY2VzcyIsInByb21pc2UiLCJfc2F2ZUZpZWxkUHJvcGVydGllc1N0YXR1cyIsImZpZWxkIiwib0ZpZWxkIiwic0ZpZWxkSGVscGVySWQiLCJnZXRGaWVsZEhlbHAiLCJvRmlsdGVySGVscCIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImJ5SWQiLCJnZXRPdXRQYXJhbWV0ZXJzIiwib091dFBhcmFtZXRlciIsIm9CaW5kaW5nIiwiZ2V0QmluZGluZyIsInJlcXVlc3RWYWx1ZSIsInNQcm9wZXJ0eVBhdGgiLCJtUHJvcGVydHkiLCJyZXNvbHZlUGF0aCIsIl90eXBlIiwiam9pbiIsInVuZGVmaW5lZCIsIm9Tb3VyY2VGaWVsZCIsInNTaWRlRWZmZWN0RW50aXR5VHlwZSIsIm9CaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwib0NvbnRleHRGb3JTaWRlRWZmZWN0cyIsImdldENvbnRleHQiLCJzRnVsbHlRdWFsaWZpZWROYW1lIiwiZ2V0Q29udmVydGVkTWV0YU1vZGVsIiwiZW50aXR5VHlwZXMiLCJmaW5kIiwib0VudGl0eVR5cGUiLCJGaWVsZFJ1bnRpbWUiLCJnZXRGaWVsZFN0YXRlT25DaGFuZ2UiLCJzdGF0ZSIsInZhbGlkaXR5IiwiZ2V0U291cmNlIiwiX2dldEZpZWxkUHJvbWlzZSIsInNpZGVFZmZlY3RzTWFwIiwiX2dldEZpZWxkU2lkZUVmZmVjdHNNYXAiLCJtU2lkZUVmZmVjdHNNYXAiLCJnZXRGaWVsZEdyb3VwSWRzIiwic1ZpZXdFbnRpdHlTZXRTZXROYW1lIiwiZ2V0Vmlld0RhdGEiLCJlbnRpdHlTZXQiLCJvVmlld0VudGl0eVNldCIsImVudGl0eVNldHMiLCJvRW50aXR5U2V0IiwiYklzSW1tZWRpYXRlIiwiaW5kZXhPZiIsInNOYW1lIiwiYVNpZGVFZmZlY3RQYXJ0cyIsInNwbGl0Iiwic1NpZGVFZmZlY3RQYXRoIiwibGVuZ3RoIiwib1NpZGVFZmZlY3QiLCJnZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzIiwiX2dldENvbnRleHRGb3JTaWRlRWZmZWN0cyIsImltbWVkaWF0ZSIsInNWaWV3RW50aXR5VHlwZSIsImVudGl0eVR5cGUiLCJtRmllbGRQYXRoIiwiZ2V0QWdncmVnYXRpb24iLCJvQ3VzdG9tRGF0YSIsImdldEtleSIsInNGaWVsZFBhdGgiLCJnZXRWYWx1ZSIsIm1Db250cm9sRW50aXR5VHlwZSIsImdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyIsInNDb250cm9sTmFtZSIsIm9Db250cm9sU2lkZUVmZmVjdHMiLCJpbmNsdWRlcyIsIm1GaWVsZFNpZGVFZmZlY3RzTWFwIiwib0ZpZWxkUHJvbWlzZUZvckZpZWxkR3JvdXAiLCJfZ2VuZXJhdGVGaWVsZEdyb3VwUHJvbWlzZSIsIm1GYWlsZWRTaWRlRWZmZWN0c05hbWUiLCJzU2lkZUVmZmVjdENvbnRleHRQYXRoIiwiYUZhaWxlZFNpZGVFZmZlY3RzIiwibVNpZGVFZmZlY3RDb250ZXh0UGF0aCIsImJTdWNjZXNzIiwib0ZpZWxkQmluZGluZyIsIl9nZXRCaW5kaW5nRm9yRmllbGQiLCJhRmllbGRQYXRocyIsImdldEJpbmRpbmdzIiwic1BhdGgiLCJzQmluZGluZ05hbWUiLCJDb250cm9sbGVyRXh0ZW5zaW9uIiwiUHVibGljIiwiRmluYWwiLCJQcml2YXRlIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01Bb0RNQSw4QixXQURMQyxRQUFRLENBQUMsOENBQUQsRUFBaURDLDJCQUFqRCxDLFVBU1BDLFFBQVEsRTs7Ozs7Ozs7Ozs7OzthQUFULGtCQUNnQjtBQUNmLGFBQUtDLE1BQUwsR0FBZSxJQUFELENBQWNDLElBQWQsQ0FBbUJDLE9BQW5CLEVBQWQ7QUFDQSxhQUFLQyxjQUFMLEdBQXNCQyxXQUFXLENBQUNDLGVBQVosQ0FBNEIsS0FBS0wsTUFBakMsQ0FBdEI7QUFDQSxhQUFLTSxvQkFBTCxHQUE2QixLQUFLSCxjQUFOLENBQTZCSSxxQkFBN0IsRUFBNUI7QUFDQSxhQUFLQyxpQkFBTCxHQUF5QixFQUF6QjtBQUNBLGFBQUtDLHlCQUFMLEdBQWlDLElBQUlDLEdBQUosRUFBakM7QUFDQSxhQUFLQyxtQkFBTCxHQUEyQixFQUEzQjtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O2FBQ0MsaUNBRXFDO0FBQ3BDLGFBQUtGLHlCQUFMLENBQStCRyxLQUEvQjtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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LGVBQU9uRixNQUFNLENBQUNXLFVBQVAsQ0FBa0J3RSxZQUFsQixDQUFQO0FBQ0E7Ozs7SUE1bkIyQ0MsbUIsNk5Bd0IzQ0MsTSxFQUNBQyxLLGlMQVlBRCxNLEVBQ0FDLEssNktBaUJBRCxNLEVBQ0FDLEssd0tBNkNBRCxNLEVBQ0FDLEssNEtBa0ZBRCxNLEVBQ0FDLEssNktBV0FELE0sRUFDQUMsSywwS0FjQUQsTSxFQUNBQyxLLDJLQWdDQUQsTSxFQUNBQyxLLDhLQWtCQUMsTyxFQUNBRCxLLCtLQThHQUMsTyxFQUNBRCxLO1NBd1FhN0wsOEIiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnRyb2xsZXJFeHRlbnNpb24gfSBmcm9tIFwic2FwL3VpL2NvcmUvbXZjXCI7XG5pbXBvcnQgeyBCaW5kaW5nLCBDb250ZXh0IH0gZnJvbSBcInNhcC91aS9tb2RlbFwiO1xuaW1wb3J0IHsgQ2hlY2tCb3ggfSBmcm9tIFwic2FwL21cIjtcbmltcG9ydCB7IEZpbGVVcGxvYWRlciB9IGZyb20gXCJzYXAvdWkvdW5pZmllZFwiO1xuaW1wb3J0IHsgQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zXCI7XG5pbXBvcnQgeyBVSTVDbGFzcywgT3ZlcnJpZGUsIFB1YmxpYywgRmluYWwsIFByaXZhdGUgfSBmcm9tIFwiLi4vaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB7IEFwcENvbXBvbmVudCwgQ29tbW9uVXRpbHMgfSBmcm9tIFwic2FwL2ZlL2NvcmVcIjtcbmltcG9ydCB7IENvbnRyb2wgfSBmcm9tIFwic2FwL3VpL2NvcmVcIjtcbmltcG9ydCB7XG5cdFNpZGVFZmZlY3RzVHlwZSxcblx0Q29udHJvbFNpZGVFZmZlY3RzVHlwZSxcblx0T0RhdGFTaWRlRWZmZWN0c1R5cGUsXG5cdENvbnRyb2xTaWRlRWZmZWN0c0VudGl0eURpY3Rpb25hcnlcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB7IEZpZWxkUnVudGltZSB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpZWxkXCI7XG5pbXBvcnQgeyBDb252ZXJ0ZXJPdXRwdXQsIFByb3BlcnR5UGF0aCwgRW50aXR5VHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHsgTG9nIH0gZnJvbSBcInNhcC9iYXNlXCI7XG5cbnR5cGUgRmllbGRDb250cm9sID0gQ29udHJvbCAmIHtcblx0Z2V0RmllbGRIZWxwKCk6IHN0cmluZztcblx0Z2V0RmllbGRHcm91cElkcygpOiBzdHJpbmdbXTtcbn07XG5cbnR5cGUgRmllbGRFdmVudFByb3BlcnR5VHlwZSA9IHtcblx0cHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuXHRmaWVsZDogRmllbGRDb250cm9sO1xuXHRzaWRlRWZmZWN0c01hcDogRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeTtcbn07XG5cbnR5cGUgRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlID0ge1xuXHRuYW1lOiBzdHJpbmc7XG5cdGltbWVkaWF0ZT86IGJvb2xlYW47XG5cdGNvbnRleHQ6IENvbnRleHQ8YW55Pjtcblx0c2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZTtcblx0cHJldmlvdXNseUZhaWxlZD86IGJvb2xlYW47XG59O1xuXG50eXBlIEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGU+O1xuXG50eXBlIEZhaWxlZFNpZGVFZmZlY3REaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdHNUeXBlW10+O1xuXG50eXBlIEZpZWxkR3JvdXBTaWRlRWZmZWN0VHlwZSA9IHtcblx0cHJvbWlzZXM6IFByb21pc2U8YW55PltdO1xuXHRzaWRlRWZmZWN0UHJvcGVydHk6IEZpZWxkU2lkZUVmZmVjdFByb3BlcnR5VHlwZTtcblx0cHJvY2Vzc1N0YXJ0ZWQ/OiBib29sZWFuO1xufTtcblxudHlwZSBGaWVsZEdyb3VwUXVldWVNYXBUeXBlID0ge1xuXHRbc2lkZUVmZmVjdE5hbWU6IHN0cmluZ106IHtcblx0XHRbY29udGV4dFBhdGg6IHN0cmluZ106IEZpZWxkR3JvdXBTaWRlRWZmZWN0VHlwZTtcblx0fTtcbn07XG5cbkBVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlNpZGVFZmZlY3RzXCIsIENvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSlcbmNsYXNzIFNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIF9vVmlldzogYW55O1xuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXHRwcml2YXRlIF9tRmllbGRHcm91cFF1ZXVlITogRmllbGRHcm91cFF1ZXVlTWFwVHlwZTtcblx0cHJpdmF0ZSBfYVNvdXJjZVByb3BlcnRpZXNGYWlsdXJlITogU2V0PHN0cmluZz47XG5cdHByaXZhdGUgX29TaWRlRWZmZWN0c1NlcnZpY2UhOiBhbnk7XG5cdHByaXZhdGUgX21GYWlsZWRTaWRlRWZmZWN0cyE6IEZhaWxlZFNpZGVFZmZlY3REaWN0aW9uYXJ5O1xuXG5cdEBPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkluaXQoKSB7XG5cdFx0dGhpcy5fb1ZpZXcgPSAodGhpcyBhcyBhbnkpLmJhc2UuZ2V0VmlldygpO1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5fb1ZpZXcpO1xuXHRcdHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdHRoaXMuX21GaWVsZEdyb3VwUXVldWUgPSB7fTtcblx0XHR0aGlzLl9hU291cmNlUHJvcGVydGllc0ZhaWx1cmUgPSBuZXcgU2V0KCk7XG5cdFx0dGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzID0ge307XG5cdH1cblxuXHQvKipcblx0ICogQ2xlYXIgcmVjb3JkZWQgdmFsaWRhdGlvbiBzdGF0dXMgZm9yIGFsbCBwcm9wZXJ0aWVzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgY2xlYXJQcm9wZXJ0aWVzU3RhdHVzXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgY2xlYXJQcm9wZXJ0aWVzU3RhdHVzKCk6IHZvaWQge1xuXHRcdHRoaXMuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZS5jbGVhcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgZmFpbGVkIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgZ2V0UmVnaXN0ZXJlZEZhaWxlZFJlcXVlc3RzXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFJlZ2lzdGVyZWQgU2lkZUVmZmVjdHMgcmVxdWVzdHMgdGhhdCBoYXZlIGZhaWxlZFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGdldFJlZ2lzdGVyZWRGYWlsZWRSZXF1ZXN0cygpOiBGYWlsZWRTaWRlRWZmZWN0RGljdGlvbmFyeSB7XG5cdFx0cmV0dXJuIHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIHRoZSB3b3JrZmxvdyBmb3IgU2lkZUVmZmVjdHMgd2l0aCByZWxhdGVkIGNoYW5nZXMgdG8gYSBmaWVsZFxuXHQgKiBUaGUgZm9sbG93aW5nIHNjZW5hcmlvcyBhcmUgbWFuYWdlZDpcblx0ICogIC0gRXhlY3V0ZTogdHJpZ2dlcnMgaW1tZWRpYXRlIFNpZGVFZmZlY3RzIHJlcXVlc3RzIGlmIHRoZSBwcm9taXNlIGZvciB0aGUgZmllbGQgZXZlbnQgaXMgZnVsZmlsbGVkXG5cdCAqICAtIFJlZ2lzdGVyOiBjYWNoZXMgZGVmZXJyZWQgU2lkZUVmZmVjdHMgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIEZpZWxkR3JvdXAgaXMgdW5mb2N1c2VkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgaGFuZGxlRmllbGRDaGFuZ2Vcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudCBTQVBVSTUgZXZlbnQgdGhhdCBjb21lcyBmcm9tIGEgZmllbGQgY2hhbmdlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRmllbGRHcm91cFByZVJlcXVpc2l0ZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZCBiZWZvcmUgZXhlY3V0aW5nIGRlZmVycmVkIFNpZGVFZmZlY3RzXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9ICBQcm9taXNlIG9uIFNpZGVFZmZlY3RzIHJlcXVlc3Qocylcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyBoYW5kbGVGaWVsZENoYW5nZShvRXZlbnQ6IFVJNUV2ZW50LCBvRmllbGRHcm91cFByZVJlcXVpc2l0ZT86IFByb21pc2U8YW55Pik6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgbUV2ZW50RmllbGRQcm9wZXJ0aWVzID0gdGhpcy5fZ2V0RmllbGRQcm9wZXJ0aWVzKG9FdmVudCksXG5cdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzOiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGVbXSA9IHRoaXMuX2luaXRpYWxpemVGaWVsZFNpZGVFZmZlY3RzKFxuXHRcdFx0XHRtRXZlbnRGaWVsZFByb3BlcnRpZXMsXG5cdFx0XHRcdG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlXG5cdFx0XHQpO1xuXG5cdFx0bGV0IGJJc0ltbWVkaWF0ZVRyaWdnZXJlZCA9IGZhbHNlO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2dlbmVyYXRlSW1tZWRpYXRlUHJvbWlzZShtRXZlbnRGaWVsZFByb3BlcnRpZXMpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGJJc0ltbWVkaWF0ZVRyaWdnZXJlZCA9IHRydWU7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzLm1hcChtU2lkZUVmZmVjdHNQcm9wZXJ0eSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHMobVNpZGVFZmZlY3RzUHJvcGVydHkuc2lkZUVmZmVjdHMsIG1TaWRlRWZmZWN0c1Byb3BlcnR5LmNvbnRleHQpO1xuXHRcdFx0XHRcdH0pIHx8IFtdXG5cdFx0XHRcdCk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKG9FcnJvciA9PiB7XG5cdFx0XHRcdGlmIChiSXNJbW1lZGlhdGVUcmlnZ2VyZWQpIHtcblx0XHRcdFx0XHRMb2cuZGVidWcoXCJFcnJvciB3aGlsZSBwcm9jZXNzaW5nIEZpZWxkIFNpZGVFZmZlY3RzXCIsIG9FcnJvcik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogU2lkZUVmZmVjdHMgaGF2ZSBub3QgYmVlbiB0cmlnZ2VyZWQgc2luY2UgcHJlUmVxdWlzaXRlIHZhbGlkYXRpb24gZmFpbHMgc28gd2UgbmVlZFxuXHRcdFx0XHRcdCAqIHRvIGtlZXAgcHJldmlvdXNseSBmYWlsZWQgcmVxdWVzdCBhcyBGYWlsZWQgcmVxdWVzdCAodG8gYmUgcmV0cmlnZ2VyIG9uIG5leHQgY2hhbmdlKVxuXHRcdFx0XHRcdCAqL1xuXG5cdFx0XHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllc1xuXHRcdFx0XHRcdFx0LmZpbHRlcihtSW1tZWRpYXRlU2lkZUVmZmVjdHMgPT4gbUltbWVkaWF0ZVNpZGVFZmZlY3RzLnByZXZpb3VzbHlGYWlsZWQgPT09IHRydWUpXG5cdFx0XHRcdFx0XHQuZm9yRWFjaChtSW1tZWRpYXRlU2lkZUVmZmVjdHMgPT5cblx0XHRcdFx0XHRcdFx0dGhpcy5fYWRkRmFpbGVkU2lkZUVmZmVjdHMobUltbWVkaWF0ZVNpZGVFZmZlY3RzLnNpZGVFZmZlY3RzLCBtSW1tZWRpYXRlU2lkZUVmZmVjdHMuY29udGV4dClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgU2lkZUVmZmVjdHMgd2l0aCBhIHJlbGF0ZWQgJ2ZvY3VzIG91dCcgdG8gYSBmaWVsZCBncm91cC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGhhbmRsZUZpZWxkR3JvdXBDaGFuZ2Vcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudCBTQVBVSTUgRXZlbnRcblx0ICogQHJldHVybnMge29iamVjdH0gUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0KHMpXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgaGFuZGxlRmllbGRHcm91cENoYW5nZShvRXZlbnQ6IFVJNUV2ZW50KTogUHJvbWlzZTxhbnk+IHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcyxcblx0XHRcdGFEZWZlcnJlZFNpZGVFZmZlY3RzOiBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGVbXSA9IFtdLFxuXHRcdFx0YUZpZWxkR3JvdXBJZHM6IHN0cmluZ1tdID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImZpZWxkR3JvdXBJZHNcIik7XG5cblx0XHRjb25zdCBnZXRGaWVsZEdyb3VwUmVxdWVzdFByb21pc2UgPSBmdW5jdGlvbihvRGVmZXJyZWRTaWRlRWZmZWN0OiBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGUpIHtcblx0XHRcdGxldCBiSXNSZXF1ZXN0c1RyaWdnZXJlZCA9IGZhbHNlO1xuXHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RQcm9wZXJ0eSA9IG9EZWZlcnJlZFNpZGVFZmZlY3Quc2lkZUVmZmVjdFByb3BlcnR5O1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHQ7XG5cdFx0XHRjb25zdCBzQ29udGV4dFBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRjb25zdCBzRW50aXR5VHlwZSA9IHRoYXQuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IG1FbnRpdHlUeXBlID0gdGhhdC5fZ2V0RW50aXR5VHlwZUZyb21GUU4oc0VudGl0eVR5cGUpO1xuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwob0RlZmVycmVkU2lkZUVmZmVjdC5wcm9taXNlcylcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0YklzUmVxdWVzdHNUcmlnZ2VyZWQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0Ly9EZWZlcnJlZCBTaWRlRWZmZWN0cyBhcmUgZXhlY3V0ZWQgb25seSBpZiBhbGwgc291cmNlUHJvcGVydGllcyBoYXZlIG5vIHJlZ2lzdGVyZWQgZmFpbHVyZS5cblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRtRW50aXR5VHlwZSAmJlxuXHRcdFx0XHRcdFx0KG9TaWRlRWZmZWN0UHJvcGVydHkuc2lkZUVmZmVjdHMuU291cmNlUHJvcGVydGllcyBhcyBQcm9wZXJ0eVBhdGhbXSkuZXZlcnkoc291cmNlUHJvcGVydHkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoc291cmNlUHJvcGVydHkudHlwZSA9PT0gXCJQcm9wZXJ0eVBhdGhcIikge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNJZCA9IHRoYXQuX2dlbmVyYXRlU3RhdHVzSW5kZXgobUVudGl0eVR5cGUsIHNvdXJjZVByb3BlcnR5LnZhbHVlLCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNJZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuICF0aGF0Ll9hU291cmNlUHJvcGVydGllc0ZhaWx1cmUuaGFzKHNJZCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGF0LnJlcXVlc3RTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdFByb3BlcnR5LnNpZGVFZmZlY3RzLCBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKG9FcnJvciA9PiB7XG5cdFx0XHRcdFx0aWYgKGJJc1JlcXVlc3RzVHJpZ2dlcmVkKSB7XG5cdFx0XHRcdFx0XHRMb2cuZGVidWcoXCJFcnJvciB3aGlsZSBwcm9jZXNzaW5nIEZpZWxkR3JvdXAgU2lkZUVmZmVjdHMgb24gY29udGV4dCBcIiArIHNDb250ZXh0UGF0aCwgb0Vycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0XHRkZWxldGUgdGhhdC5fbUZpZWxkR3JvdXBRdWV1ZVtvU2lkZUVmZmVjdFByb3BlcnR5Lm5hbWVdW3NDb250ZXh0UGF0aF07XG5cdFx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHRhRmllbGRHcm91cElkcy5mb3JFYWNoKHNGaWVsZEdyb3VwSWQgPT4ge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBzdHJpbmcgXCIkJEltbWVkaWF0ZVJlcXVlc3RcIiBpcyBhZGRlZCB0byB0aGUgU2lkZUVmZmVjdHMgbmFtZSBkdXJpbmcgdGVtcGxhdGluZyB0byBrbm93XG5cdFx0XHQgKiBpZiB0aGlzIFNpZGVFZmZlY3RzIG11c3QgYmUgaW1tZWRpYXRlbHkgZXhlY3V0ZWQgcmVxdWVzdGVkIChvbiBmaWVsZCBjaGFuZ2UpIG9yIG11c3Rcblx0XHRcdCAqIGJlIGRlZmVycmVkIChvbiBmaWVsZCBncm91cCBmb2N1cyBvdXQpXG5cdFx0XHQgKlxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBzU2lkZUVmZmVjdE5hbWU6IHN0cmluZyA9IHNGaWVsZEdyb3VwSWQucmVwbGFjZShcIiQkSW1tZWRpYXRlUmVxdWVzdFwiLCBcIlwiKTtcblx0XHRcdGNvbnN0IG1Db250ZXh0RGVmZXJyZWRTaWRlRWZmZWN0cyA9IHRoYXQuX21GaWVsZEdyb3VwUXVldWU/LltzU2lkZUVmZmVjdE5hbWVdO1xuXHRcdFx0aWYgKG1Db250ZXh0RGVmZXJyZWRTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRPYmplY3Qua2V5cyhtQ29udGV4dERlZmVycmVkU2lkZUVmZmVjdHMpLmZvckVhY2goc0NvbnRleHRQYXRoID0+IHtcblx0XHRcdFx0XHRjb25zdCBvRGVmZXJyZWRTaWRlRWZmZWN0ID0gbUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF07XG5cdFx0XHRcdFx0aWYgKCFvRGVmZXJyZWRTaWRlRWZmZWN0LnByb2Nlc3NTdGFydGVkKSB7XG5cdFx0XHRcdFx0XHRvRGVmZXJyZWRTaWRlRWZmZWN0LnByb2Nlc3NTdGFydGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGFEZWZlcnJlZFNpZGVFZmZlY3RzLnB1c2gob0RlZmVycmVkU2lkZUVmZmVjdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdGFEZWZlcnJlZFNpZGVFZmZlY3RzLm1hcChvRGVmZXJyZWRTaWRlRWZmZWN0ID0+IHtcblx0XHRcdFx0cmV0dXJuIGdldEZpZWxkR3JvdXBSZXF1ZXN0UHJvbWlzZShvRGVmZXJyZWRTaWRlRWZmZWN0KTtcblx0XHRcdH0pXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgU2lkZUVmZmVjdHMgY29udHJvbC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGFkZENvbnRyb2xTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0VudGl0eVR5cGUgTmFtZSBvZiB0aGUgZW50aXR5IHdoZXJlIHRoZSBTaWRlRWZmZWN0cyBjb250cm9sIHdpbGwgYmUgcmVnaXN0ZXJlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIHRvIHJlZ2lzdGVyLiBFbnN1cmUgdGhlIHNvdXJjZUNvbnRyb2xJZCBtYXRjaGVzIHRoZSBhc3NvY2lhdGVkIFNBUFVJNSBjb250cm9sIElELlxuXHQgKlxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGFkZENvbnRyb2xTaWRlRWZmZWN0cyhzRW50aXR5VHlwZTogc3RyaW5nLCBvU2lkZUVmZmVjdHM6IE9taXQ8Q29udHJvbFNpZGVFZmZlY3RzVHlwZSwgXCJmdWxseVF1YWxpZmllZE5hbWVcIj4pOiB2b2lkIHtcblx0XHR0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmFkZENvbnRyb2xTaWRlRWZmZWN0cyhzRW50aXR5VHlwZSwgb1NpZGVFZmZlY3RzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSBxdWV1ZSBjb250YWluaW5nIHRoZSBmYWlsZWQgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSByZW1vdmVGYWlsZWRTaWRlRWZmZWN0c1xuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIHJlbW92ZUZhaWxlZFNpZGVFZmZlY3RzKCk6IHZvaWQge1xuXHRcdHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0cyA9IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgU2lkZUVmZmVjdHMgb24gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBleGVjdXRlZFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyByZXF1ZXN0IG9uIFNBUFVJNSBjb250ZXh0XG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgcmVxdWVzdFNpZGVFZmZlY3RzKG9TaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUeXBlLCBvQ29udGV4dDogQ29udGV4dDxhbnk+KTogUHJvbWlzZTxhbnk+IHtcblx0XHRsZXQgZlJlc29sdmVyOiBhbnksIGZSZWplY3RvcjogYW55O1xuXHRcdGNvbnN0IG9Qcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0XHRmUmVzb2x2ZXIgPSByZXNvbHZlO1xuXHRcdFx0ZlJlamVjdG9yID0gcmVqZWN0O1xuXHRcdH0pO1xuXHRcdGNvbnN0IGFUYXJnZXRzOiBhbnlbXSA9ICgob1NpZGVFZmZlY3RzLlRhcmdldEVudGl0aWVzIGFzIGFueVtdKSB8fCBbXSkuY29uY2F0KChvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcyBhcyBhbnlbXSkgfHwgW10pLFxuXHRcdFx0c1RyaWdnZXJBY3Rpb246IFN0cmluZyB8IHVuZGVmaW5lZCA9IChvU2lkZUVmZmVjdHMgYXMgT0RhdGFTaWRlRWZmZWN0c1R5cGUpLlRyaWdnZXJBY3Rpb247XG5cblx0XHRpZiAoc1RyaWdnZXJBY3Rpb24pIHtcblx0XHRcdHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZXhlY3V0ZUFjdGlvbihzVHJpZ2dlckFjdGlvbiwgb0NvbnRleHQpO1xuXHRcdH1cblxuXHRcdHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2Vcblx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHMoYVRhcmdldHMsIG9Db250ZXh0KVxuXHRcdFx0LnRoZW4oKCkgPT4gZlJlc29sdmVyKCkpXG5cdFx0XHQuY2F0Y2goKG9FcnJvcjogYW55KSA9PiB7XG5cdFx0XHRcdHRoaXMuX2FkZEZhaWxlZFNpZGVFZmZlY3RzKG9TaWRlRWZmZWN0cywgb0NvbnRleHQpO1xuXHRcdFx0XHRmUmVqZWN0b3Iob0Vycm9yKTtcblx0XHRcdH0pO1xuXG5cdFx0cmV0dXJuIG9Qcm9taXNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgU2lkZUVmZmVjdHMgY3JlYXRlZCBieSBhIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSByZW1vdmVDb250cm9sU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250cm9sIFNBUFVJNSBDb250cm9sXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgcmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzKG9Db250cm9sOiBDb250cm9sKTogdm9pZCB7XG5cdFx0Y29uc3Qgc0NvbnRyb2xJZCA9IG9Db250cm9sICYmIG9Db250cm9sLmlzQSAmJiBvQ29udHJvbC5pc0EoXCJzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0XCIpICYmIG9Db250cm9sLmdldElkKCk7XG5cblx0XHRpZiAoc0NvbnRyb2xJZCkge1xuXHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5yZW1vdmVDb250cm9sU2lkZUVmZmVjdHMoc0NvbnRyb2xJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgU2lkZUVmZmVjdHMgdG8gdGhlIHF1ZXVlIG9mIHRoZSBmYWlsZWQgU2lkZUVmZmVjdHNcblx0ICogVGhlIFNpZGVFZmZlY3RzIHdpbGwgYmUgcmV0cmlnZ2VyZWQgb24gdGhlIG5leHQgY2hhbmdlIG9uIHRoZSBzYW1lIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfYWRkRmFpbGVkU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyB0aGF0IG5lZWQgdG8gYmUgcmV0cmlnZ2VyZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgaGF2ZSBmYWlsZWRcblx0ICovXG5cdEBQcml2YXRlXG5cdEBGaW5hbFxuXHRwcml2YXRlIF9hZGRGYWlsZWRTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZSwgb0NvbnRleHQ6IENvbnRleHQ8YW55Pik6IHZvaWQge1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aDogc3RyaW5nID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0c1tzQ29udGV4dFBhdGhdID0gdGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0gfHwgW107XG5cdFx0Y29uc3QgYklzTm90QWxyZWFkeUxpc3RlZCA9IHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0c1tzQ29udGV4dFBhdGhdLmV2ZXJ5KFxuXHRcdFx0bUZhaWxlZFNpZGVFZmZlY3RzID0+IG9TaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWUgIT09IG1GYWlsZWRTaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVcblx0XHQpO1xuXHRcdGlmIChiSXNOb3RBbHJlYWR5TGlzdGVkKSB7XG5cdFx0XHR0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHNbc0NvbnRleHRQYXRoXS5wdXNoKG9TaWRlRWZmZWN0cyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyB0aGUgcHJvbWlzZSBmb3IgdGhlIGZpZWxkIGdyb3VwIHRoYXQgaXMgcmVxdWlyZWQgYmVmb3JlIHJlcXVlc3RpbmcgU2lkZUVmZmVjdHMuXG5cdCAqIElmIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkIGFuZCBvbmx5IHRoZSBmaWVsZCByZXF1aXJlcyB0aGUgU2lkZUVmZmVjdHMgb24gdGhpcyBjb250ZXh0LCB0aGUgU2lkZUVmZmVjdHMgYXJlIHJlbW92ZWQgZnJvbSB0aGVcblx0ICogU2lkZUVmZmVjdHMgcXVldWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2VuZXJhdGVGaWVsZEdyb3VwUHJvbWlzZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUV2ZW50RmllbGRQcm9wZXJ0aWVzIEZpZWxkIHByb3BlcnRpZXNcblx0ICogQHJldHVybnMge29iamVjdH0gUHJvbWlzZSB0byBiZSB1c2VkIGZvciB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZmllbGRcblx0ICovXG5cdHByaXZhdGUgX2dlbmVyYXRlRmllbGRHcm91cFByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlKTogUHJvbWlzZTxhbnk+IHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblxuXHRcdGxldCBiUHJvbWlzZVN1Y2Nlc3MgPSB0cnVlO1xuXHRcdHJldHVybiBtRXZlbnRGaWVsZFByb3BlcnRpZXMucHJvbWlzZVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBiUHJvbWlzZVN1Y2Nlc3M7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRiUHJvbWlzZVN1Y2Nlc3MgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuIGJQcm9taXNlU3VjY2Vzcztcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBOZWVkIHRvIHN0b3JlIHRoZSBzdGF0dXMgb2YgcHJvcGVydGllcyByZWxhdGVkIHRvIHRoaXMgZmllbGQgZm9yIGRlZmVycmVkIFNpZGVFZmZlY3RzXG5cdFx0XHRcdCAqIHNpbmNlIGFsbCBTb3VyY2VQcm9wZXJ0aWVzIGZvciB0aGlzIGtpbmQgb2YgU2lkZUVmZmVjdHMgbXVzdCBiZSB2YWxpZFxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dGhhdC5fc2F2ZUZpZWxkUHJvcGVydGllc1N0YXR1cyhtRXZlbnRGaWVsZFByb3BlcnRpZXMuZmllbGQsIGJQcm9taXNlU3VjY2Vzcyk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIHByb21pc2UgZm9yIHRoZSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkIGJlZm9yZSByZXF1ZXN0aW5nIGltbWVkaWF0ZSBTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2Vcblx0ICogQHBhcmFtIHtvYmplY3R9IG1FdmVudEZpZWxkUHJvcGVydGllcyBGaWVsZCBwcm9wZXJ0aWVzXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFByb21pc2UgdG8gYmUgdXNlZCBmb3IgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkXG5cdCAqL1xuXHRwcml2YXRlIF9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlKTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBvUHJvbWlzZSA9IG1FdmVudEZpZWxkUHJvcGVydGllcy5wcm9taXNlO1xuXHRcdHJldHVybiBvUHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBJZiB0aGUgZmllbGQgZ2V0cyBhIEZpZWxkSGVscGVyLCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgYWxsIGZpZWxkcyBjaGFuZ2VkIGJ5IHRoaXMgRmllbGRIZWxwZXIgaGF2ZSBiZWVuIHNldC5cblx0XHRcdCAqIFRvIGFjaGlldmUgdGhpcywgd2UgZW5zdXJlIHRoYXQgYWxsIHJlbGF0ZWQgYmluZGluZ3MgaGF2ZSBiZWVuIHJlc29sdmVkLlxuXHRcdFx0ICpcblx0XHRcdCAqIFRoaXMgcmVzb2x1dGlvbiBwcm9jZXNzIGlzIG5vdCBtYW5hZ2VkIGJ5IHRoZSBGaWVsZCBFdmVudCBQcm9taXNlLCBzbyBmb3IgZmFzdCB1c2VyIGFjdGlvbnMgKGxpa2UgYXV0b21hdGlvbikgaXQgY2FuIGxvY2sgdGhlIG1vZGVsXG5cdFx0XHQgKiBhbmQgbm8gcmVxdWVzdCBjYW4gYmUgZXhlY3V0ZWQuXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IG9GaWVsZCA9IG1FdmVudEZpZWxkUHJvcGVydGllcy5maWVsZDtcblx0XHRcdGNvbnN0IHNGaWVsZEhlbHBlcklkID0gb0ZpZWxkLmdldEZpZWxkSGVscCAmJiBvRmllbGQuZ2V0RmllbGRIZWxwKCk7XG5cdFx0XHRpZiAoc0ZpZWxkSGVscGVySWQpIHtcblx0XHRcdFx0Y29uc3Qgb0ZpbHRlckhlbHA6IGFueSA9IHNhcC51aS5nZXRDb3JlKCkuYnlJZChzRmllbGRIZWxwZXJJZCk7XG5cdFx0XHRcdGlmIChvRmlsdGVySGVscCkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdChvRmlsdGVySGVscC5nZXRPdXRQYXJhbWV0ZXJzKCkgYXMgYW55W10pLm1hcChvT3V0UGFyYW1ldGVyID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSBvT3V0UGFyYW1ldGVyLmdldEJpbmRpbmcoXCJ2YWx1ZVwiKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9CaW5kaW5nID8gb0JpbmRpbmcucmVxdWVzdFZhbHVlKCkgOiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFtdKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgYSBzdGF0dXMgaW5kZXguXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2VuZXJhdGVTdGF0dXNJbmRleFxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUVudGl0eVR5cGUgVGhlIGVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUHJvcGVydHlQYXRoIFRoZSBwcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBTQVBVSTUgQ29udGV4dFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBJbmRleFxuXHQgKi9cblx0cHJpdmF0ZSBfZ2VuZXJhdGVTdGF0dXNJbmRleChtRW50aXR5VHlwZTogRW50aXR5VHlwZSwgc1Byb3BlcnR5UGF0aDogc3RyaW5nLCBvQ29udGV4dDogQ29udGV4dDxhbnk+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBzQ29udGV4dFBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgbVByb3BlcnR5ID0gbUVudGl0eVR5cGUucmVzb2x2ZVBhdGgoc1Byb3BlcnR5UGF0aCk7XG5cdFx0aWYgKG1Qcm9wZXJ0eSkge1xuXHRcdFx0aWYgKG1Qcm9wZXJ0eSAmJiBtUHJvcGVydHkuX3R5cGUgPT09IFwiUHJvcGVydHlcIikge1xuXHRcdFx0XHRyZXR1cm4gW21Qcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUsIHNDb250ZXh0UGF0aF0uam9pbihcIl9fXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIGNvbnRleHQgb24gd2hpY2ggU2lkZUVmZmVjdHMgY2FuIGJlIHJlcXVlc3RlZC5cblx0ICogVGhlIGNvcnJlY3Qgb25lIG11c3QgaGF2ZSB0aGUgYmluZGluZyBwYXJhbWV0ZXIgJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRDb250ZXh0Rm9yU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Tb3VyY2VGaWVsZCBGaWVsZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1NpZGVFZmZlY3RFbnRpdHlUeXBlIFRhcmdldCBlbnRpdHkgdHlwZSBvZiB0aGUgU2lkZUVmZmVjdHMgYW5ub3RhdGlvblxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTQVBVSTUgQ29udGV4dFxuXHQgKi9cblx0QFByaXZhdGVcblx0QEZpbmFsXG5cdHByaXZhdGUgX2dldENvbnRleHRGb3JTaWRlRWZmZWN0cyhvU291cmNlRmllbGQ6IEZpZWxkQ29udHJvbCwgc1NpZGVFZmZlY3RFbnRpdHlUeXBlOiBzdHJpbmcpOiBDb250ZXh0PGFueT4gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9Tb3VyY2VGaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGxldCBvQ29udGV4dEZvclNpZGVFZmZlY3RzID0gb0JpbmRpbmdDb250ZXh0LFxuXHRcdFx0c0VudGl0eVR5cGUgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQmluZGluZ0NvbnRleHQpO1xuXG5cdFx0aWYgKHNTaWRlRWZmZWN0RW50aXR5VHlwZSAhPT0gc0VudGl0eVR5cGUpIHtcblx0XHRcdG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMgPSAob0JpbmRpbmdDb250ZXh0IGFzIGFueSkuZ2V0QmluZGluZygpLmdldENvbnRleHQoKTtcblx0XHRcdGlmIChvQ29udGV4dEZvclNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdHNFbnRpdHlUeXBlID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0NvbnRleHRGb3JTaWRlRWZmZWN0cyk7XG5cdFx0XHRcdGlmIChzU2lkZUVmZmVjdEVudGl0eVR5cGUgIT09IHNFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdFx0b0NvbnRleHRGb3JTaWRlRWZmZWN0cyA9IChvQ29udGV4dEZvclNpZGVFZmZlY3RzIGFzIGFueSkuZ2V0QmluZGluZygpLmdldENvbnRleHQoKTtcblx0XHRcdFx0XHRpZiAob0NvbnRleHRGb3JTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRcdFx0c0VudGl0eVR5cGUgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dEZvclNpZGVFZmZlY3RzKTtcblx0XHRcdFx0XHRcdGlmIChzU2lkZUVmZmVjdEVudGl0eVR5cGUgIT09IHNFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMgfHwgdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgRW50aXR5VHlwZSBiYXNlZCBvbiBpdHMgZnVsbHktcXVhbGlmaWVkIG5hbWUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzRnVsbHlRdWFsaWZpZWROYW1lIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgZW50aXR5IHR5cGVcblx0ICovXG5cdHByaXZhdGUgX2dldEVudGl0eVR5cGVGcm9tRlFOKHNGdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZyk6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG1FbnRpdHlUeXBlID0gKHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0Q29udmVydGVkTWV0YU1vZGVsKCkgYXMgQ29udmVydGVyT3V0cHV0KS5lbnRpdHlUeXBlcy5maW5kKG9FbnRpdHlUeXBlID0+IHtcblx0XHRcdHJldHVybiBvRW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUgPT09IHNGdWxseVF1YWxpZmllZE5hbWU7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIG1FbnRpdHlUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHByb21pc2Ugb2YgdGhlIGZpZWxkIHZhbGlkYXRpb24gdGhhdCBpcyByZXF1aXJlZCBmb3IgdGhlIFNpZGVFZmZlY3RzIHByb2Nlc3MuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0RmllbGRQcm9taXNlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRXZlbnQgRmllbGQgY2hhbmdlIGV2ZW50XG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IEZpZWxkIHByb21pc2Vcblx0ICovXG5cdHByaXZhdGUgX2dldEZpZWxkUHJvbWlzZShvRXZlbnQ6IFVJNUV2ZW50KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBwcm9taXNlID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInByb21pc2VcIikgfHwgUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0XHRyZXR1cm4gcHJvbWlzZS50aGVuKCgpID0+IHtcblx0XHRcdGNvbnN0IG9Qcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0XHRcdGlmICghRmllbGRSdW50aW1lLmdldEZpZWxkU3RhdGVPbkNoYW5nZShvRXZlbnQpLnN0YXRlLnZhbGlkaXR5KSB7XG5cdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gb1Byb21pc2U7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgZmllbGQgdGhhdCBhcmUgcmVxdWlyZWQgZm9yIHRoZSBTaWRlRWZmZWN0cyBwcm9jZXNzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dldEZpZWxkUHJvcGVydGllc1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0V2ZW50IEZpZWxkIGNoYW5nZSBldmVudFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBGaWVsZCBwcm9wZXJ0aWVzIChldmVudCBjaGFuZ2UgcHJvbWlzZSwgZmllbGQsIFNpZGVFZmZlY3RzIHJlbGF0ZWQgdG8gdGhpcyBmaWVsZClcblx0ICovXG5cdHByaXZhdGUgX2dldEZpZWxkUHJvcGVydGllcyhvRXZlbnQ6IFVJNUV2ZW50KTogRmllbGRFdmVudFByb3BlcnR5VHlwZSB7XG5cdFx0Y29uc3Qgb0ZpZWxkOiBGaWVsZENvbnRyb2wgPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0cHJvbWlzZTogdGhpcy5fZ2V0RmllbGRQcm9taXNlKG9FdmVudCksXG5cdFx0XHRmaWVsZDogb0ZpZWxkLFxuXHRcdFx0c2lkZUVmZmVjdHNNYXA6IHRoaXMuX2dldEZpZWxkU2lkZUVmZmVjdHNNYXAob0ZpZWxkKVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgbWFwXG5cdCAqIFRoZXNlIFNpZGVFZmZlY3RzIGFyZVxuXHQgKiAtIGxpc3RlZCBpbnRvIEZpZWxkR3JvdXBJZHMgKGNvbWluZyBmcm9tIGFuIE9EYXRhIFNlcnZpY2UpXG5cdCAqIC0gZ2VuZXJhdGVkIGJ5IGEgY29udHJvbCBvciBjb250cm9scyBhbmQgdGhhdCBjb25maWd1cmUgdGhpcyBmaWVsZCBhcyBTb3VyY2VQcm9wZXJ0aWVzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dldEZpZWxkU2lkZUVmZmVjdHNNYXBcblx0ICogQHBhcmFtIHtvYmplY3R9IG9GaWVsZCBGaWVsZFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBtYXBcblx0ICovXG5cdHByaXZhdGUgX2dldEZpZWxkU2lkZUVmZmVjdHNNYXAob0ZpZWxkOiBGaWVsZENvbnRyb2wpOiBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5IHtcblx0XHRjb25zdCBtU2lkZUVmZmVjdHNNYXA6IEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgPSB7fSxcblx0XHRcdGFGaWVsZEdyb3VwSWRzOiBzdHJpbmdbXSA9IG9GaWVsZC5nZXRGaWVsZEdyb3VwSWRzKCksXG5cdFx0XHRzVmlld0VudGl0eVNldFNldE5hbWUgPSB0aGlzLl9vVmlldy5nZXRWaWV3RGF0YSgpLmVudGl0eVNldCxcblx0XHRcdG9WaWV3RW50aXR5U2V0ID0gKHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0Q29udmVydGVkTWV0YU1vZGVsKCkgYXMgQ29udmVydGVyT3V0cHV0KS5lbnRpdHlTZXRzLmZpbmQob0VudGl0eVNldCA9PiB7XG5cdFx0XHRcdHJldHVybiBvRW50aXR5U2V0Lm5hbWUgPT09IHNWaWV3RW50aXR5U2V0U2V0TmFtZTtcblx0XHRcdH0pO1xuXG5cdFx0Ly8gU2lkZUVmZmVjdHMgY29taW5nIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHRcdGFGaWVsZEdyb3VwSWRzLmZvckVhY2goc0ZpZWxkR3JvdXBJZCA9PiB7XG5cdFx0XHRjb25zdCBiSXNJbW1lZGlhdGU6IGJvb2xlYW4gPSBzRmllbGRHcm91cElkLmluZGV4T2YoXCIkJEltbWVkaWF0ZVJlcXVlc3RcIikgIT09IC0xLFxuXHRcdFx0XHRzTmFtZTogc3RyaW5nID0gc0ZpZWxkR3JvdXBJZC5yZXBsYWNlKFwiJCRJbW1lZGlhdGVSZXF1ZXN0XCIsIFwiXCIpLFxuXHRcdFx0XHRhU2lkZUVmZmVjdFBhcnRzOiBzdHJpbmdbXSA9IHNOYW1lLnNwbGl0KFwiI1wiKSxcblx0XHRcdFx0c1NpZGVFZmZlY3RFbnRpdHlUeXBlOiBzdHJpbmcgPSBhU2lkZUVmZmVjdFBhcnRzWzBdLFxuXHRcdFx0XHRzU2lkZUVmZmVjdFBhdGg6IHN0cmluZyA9XG5cdFx0XHRcdFx0c1NpZGVFZmZlY3RFbnRpdHlUeXBlICtcblx0XHRcdFx0XHRcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2lkZUVmZmVjdHNcIiArXG5cdFx0XHRcdFx0KGFTaWRlRWZmZWN0UGFydHMubGVuZ3RoID09PSAyID8gXCIjXCIgKyBhU2lkZUVmZmVjdFBhcnRzWzFdIDogXCJcIiksXG5cdFx0XHRcdG9TaWRlRWZmZWN0OiBTaWRlRWZmZWN0c1R5cGUgfCB1bmRlZmluZWQgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMoc1NpZGVFZmZlY3RFbnRpdHlUeXBlKT8uW1xuXHRcdFx0XHRcdHNTaWRlRWZmZWN0UGF0aFxuXHRcdFx0XHRdLFxuXHRcdFx0XHRvQ29udGV4dDogQ29udGV4dDxhbnk+IHwgdW5kZWZpbmVkID0gdGhpcy5fZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzKG9GaWVsZCwgc1NpZGVFZmZlY3RFbnRpdHlUeXBlKTtcblx0XHRcdGlmIChvU2lkZUVmZmVjdCAmJiBvQ29udGV4dCkge1xuXHRcdFx0XHRtU2lkZUVmZmVjdHNNYXBbc05hbWVdID0ge1xuXHRcdFx0XHRcdG5hbWU6IHNOYW1lLFxuXHRcdFx0XHRcdGltbWVkaWF0ZTogYklzSW1tZWRpYXRlLFxuXHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBvU2lkZUVmZmVjdCxcblx0XHRcdFx0XHRjb250ZXh0OiBvQ29udGV4dFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly9TaWRlRWZmZWN0cyBjb21pbmcgZnJvbSBjb250cm9sKHMpXG5cdFx0aWYgKHNWaWV3RW50aXR5U2V0U2V0TmFtZSAmJiBvVmlld0VudGl0eVNldCkge1xuXHRcdFx0Y29uc3Qgc1ZpZXdFbnRpdHlUeXBlID0gb1ZpZXdFbnRpdHlTZXQuZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdG1GaWVsZFBhdGg6IGFueSA9IChvRmllbGQuZ2V0QWdncmVnYXRpb24oXCJjdXN0b21EYXRhXCIpIGFzIGFueVtdKS5maW5kKG9DdXN0b21EYXRhID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1c3RvbURhdGEuZ2V0S2V5KCkgPT09IFwic291cmNlUGF0aFwiO1xuXHRcdFx0XHR9KSxcblx0XHRcdFx0b0NvbnRleHQ6IENvbnRleHQ8YW55PiB8IHVuZGVmaW5lZCA9IHRoaXMuX2dldENvbnRleHRGb3JTaWRlRWZmZWN0cyhvRmllbGQsIHNWaWV3RW50aXR5VHlwZSk7XG5cblx0XHRcdGlmIChtRmllbGRQYXRoICYmIG9Db250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IHNGaWVsZFBhdGggPSBtRmllbGRQYXRoLmdldFZhbHVlKCkucmVwbGFjZShcIi9cIiArIHNWaWV3RW50aXR5U2V0U2V0TmFtZSArIFwiL1wiLCBcIlwiKSxcblx0XHRcdFx0XHRtQ29udHJvbEVudGl0eVR5cGUgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyhcblx0XHRcdFx0XHRcdHNWaWV3RW50aXR5VHlwZVxuXHRcdFx0XHRcdCkgYXMgQ29udHJvbFNpZGVFZmZlY3RzRW50aXR5RGljdGlvbmFyeTtcblx0XHRcdFx0T2JqZWN0LmtleXMobUNvbnRyb2xFbnRpdHlUeXBlKS5mb3JFYWNoKHNDb250cm9sTmFtZSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb0NvbnRyb2xTaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUeXBlID0gbUNvbnRyb2xFbnRpdHlUeXBlW3NDb250cm9sTmFtZV07XG5cdFx0XHRcdFx0aWYgKChvQ29udHJvbFNpZGVFZmZlY3RzLlNvdXJjZVByb3BlcnRpZXMgYXMgc3RyaW5nW10pLmluY2x1ZGVzKHNGaWVsZFBhdGgpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzTmFtZSA9IHNDb250cm9sTmFtZSArIFwiOjpcIiArIHNWaWV3RW50aXR5VHlwZTtcblx0XHRcdFx0XHRcdG1TaWRlRWZmZWN0c01hcFtzTmFtZV0gPSB7XG5cdFx0XHRcdFx0XHRcdG5hbWU6IHNOYW1lLFxuXHRcdFx0XHRcdFx0XHRpbW1lZGlhdGU6IHRydWUsXG5cdFx0XHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBvQ29udHJvbFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0OiBvQ29udGV4dFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbVNpZGVFZmZlY3RzTWFwO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgdGhlIFNpZGVFZmZlY3RzIHdpdGggcmVsYXRlZCBjaGFuZ2VzIHRvIGEgZmllbGRcblx0ICogTGlzdDogZ2V0cyBpbW1lZGlhdGUgU2lkZUVmZmVjdHMgcmVxdWVzdHNcblx0ICogUmVnaXN0ZXI6IGNhY2hlcyBkZWZlcnJlZCBTaWRlRWZmZWN0cyB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgRmllbGRHcm91cCBpcyB1bmZvY3VzZWQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfaW5pdGlhbGl6ZUZpZWxkU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG1FdmVudEZpZWxkUHJvcGVydGllcyBGaWVsZCBldmVudCBwcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRmllbGRHcm91cFByZVJlcXVpc2l0ZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZCBiZWZvcmUgZXhlY3V0aW5nIGRlZmVycmVkIFNpZGVFZmZlY3RzXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gIEFycmF5IG9mIGltbWVkaWF0ZSBTaWRlRWZmZWN0c1xuXHQgKi9cblx0cHJpdmF0ZSBfaW5pdGlhbGl6ZUZpZWxkU2lkZUVmZmVjdHMoXG5cdFx0bUV2ZW50RmllbGRQcm9wZXJ0aWVzOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlLFxuXHRcdG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlPzogUHJvbWlzZTxhbnk+XG5cdCk6IEZpZWxkU2lkZUVmZmVjdFByb3BlcnR5VHlwZVtdIHtcblx0XHRjb25zdCBtRmllbGRTaWRlRWZmZWN0c01hcCA9IG1FdmVudEZpZWxkUHJvcGVydGllcy5zaWRlRWZmZWN0c01hcCxcblx0XHRcdG9GaWVsZFByb21pc2VGb3JGaWVsZEdyb3VwID0gdGhpcy5fZ2VuZXJhdGVGaWVsZEdyb3VwUHJvbWlzZShtRXZlbnRGaWVsZFByb3BlcnRpZXMpLCAvLyBQcm9taXNlIG1hbmFnaW5nIEZpZWxkR3JvdXAgcmVxdWVzdHMgaWYgRmllbGQgcHJvbWlzZSBmYWlsc1xuXHRcdFx0bUZhaWxlZFNpZGVFZmZlY3RzTmFtZTogYW55ID0ge30sXG5cdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzOiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGVbXSA9IFtdO1xuXG5cdFx0b0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgPSBvRmllbGRHcm91cFByZVJlcXVpc2l0ZSB8fCBQcm9taXNlLnJlc29sdmUoKTtcblxuXHRcdE9iamVjdC5rZXlzKG1GaWVsZFNpZGVFZmZlY3RzTWFwKS5mb3JFYWNoKHNTaWRlRWZmZWN0TmFtZSA9PiB7XG5cdFx0XHRjb25zdCBvU2lkZUVmZmVjdFByb3BlcnR5OiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGUgPSBtRmllbGRTaWRlRWZmZWN0c01hcFtzU2lkZUVmZmVjdE5hbWVdLFxuXHRcdFx0XHRzU2lkZUVmZmVjdENvbnRleHRQYXRoID0gb1NpZGVFZmZlY3RQcm9wZXJ0eS5jb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0YUZhaWxlZFNpZGVFZmZlY3RzID0gdGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdO1xuXG5cdFx0XHQvLyBDaGVjayBpZiB0aGVyZSBpcyBhbnkgcHJldmlvdXNseSBmYWlsZWQgcmVxdWVzdCBmb3IgdGhpcyBjb250ZXh0XG5cdFx0XHRpZiAoYUZhaWxlZFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHNbc1NpZGVFZmZlY3RDb250ZXh0UGF0aF07XG5cdFx0XHRcdG1GYWlsZWRTaWRlRWZmZWN0c05hbWVbc1NpZGVFZmZlY3RDb250ZXh0UGF0aF0gPSB7fTtcblx0XHRcdFx0YUZhaWxlZFNpZGVFZmZlY3RzLmZvckVhY2gobUZhaWxlZFNpZGVFZmZlY3RzID0+IHtcblx0XHRcdFx0XHRtRmFpbGVkU2lkZUVmZmVjdHNOYW1lW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdW21GYWlsZWRTaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVdID0gdHJ1ZTtcblx0XHRcdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzLnB1c2goe1xuXHRcdFx0XHRcdFx0bmFtZTogc1NpZGVFZmZlY3ROYW1lLFxuXHRcdFx0XHRcdFx0cHJldmlvdXNseUZhaWxlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBtRmFpbGVkU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRjb250ZXh0OiBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHRcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob1NpZGVFZmZlY3RQcm9wZXJ0eS5pbW1lZGlhdGUpIHtcblx0XHRcdFx0Ly8gU2lkZUVmZmVjdHMgd2lsbCBiZSBleGVjdXRlZCBpbW1lZGlhdGVseSBhZnRlciBldmVudCBwcm9taXNlIHZhbGlkYXRpb25cblx0XHRcdFx0aWYgKCFtRmFpbGVkU2lkZUVmZmVjdHNOYW1lW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdPy5bb1NpZGVFZmZlY3RQcm9wZXJ0eS5zaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVdKSB7XG5cdFx0XHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllcy5wdXNoKHtcblx0XHRcdFx0XHRcdG5hbWU6IHNTaWRlRWZmZWN0TmFtZSxcblx0XHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBvU2lkZUVmZmVjdFByb3BlcnR5LnNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0Y29udGV4dDogb1NpZGVFZmZlY3RQcm9wZXJ0eS5jb250ZXh0XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEFkZCBkZWZlcnJlZCBTaWRlRWZmZWN0cyB0byB0aGUgcmVsYXRlZCBkaWN0aW9uYXJ5XG5cdFx0XHRcdHRoaXMuX21GaWVsZEdyb3VwUXVldWVbc1NpZGVFZmZlY3ROYW1lXSA9IHRoaXMuX21GaWVsZEdyb3VwUXVldWVbc1NpZGVFZmZlY3ROYW1lXSB8fCB7fTtcblx0XHRcdFx0Y29uc3QgbVNpZGVFZmZlY3RDb250ZXh0UGF0aCA9IHRoaXMuX21GaWVsZEdyb3VwUXVldWVbc1NpZGVFZmZlY3ROYW1lXVtzU2lkZUVmZmVjdENvbnRleHRQYXRoXSB8fCB7XG5cdFx0XHRcdFx0cHJvbWlzZXM6IFtdLFxuXHRcdFx0XHRcdHNpZGVFZmZlY3RQcm9wZXJ0eTogb1NpZGVFZmZlY3RQcm9wZXJ0eSxcblx0XHRcdFx0XHRwcm9jZXNzU3RhcnRlZDogZmFsc2Vcblx0XHRcdFx0fTtcblx0XHRcdFx0bVNpZGVFZmZlY3RDb250ZXh0UGF0aC5wcm9taXNlcyA9IG1TaWRlRWZmZWN0Q29udGV4dFBhdGgucHJvbWlzZXMuY29uY2F0KFtcblx0XHRcdFx0XHRvRmllbGRQcm9taXNlRm9yRmllbGRHcm91cCxcblx0XHRcdFx0XHRvRmllbGRHcm91cFByZVJlcXVpc2l0ZSBhcyBQcm9taXNlPGFueT5cblx0XHRcdFx0XSk7XG5cdFx0XHRcdHRoaXMuX21GaWVsZEdyb3VwUXVldWVbc1NpZGVFZmZlY3ROYW1lXVtzU2lkZUVmZmVjdENvbnRleHRQYXRoXSA9IG1TaWRlRWZmZWN0Q29udGV4dFBhdGg7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXM7XG5cdH1cblxuXHQvKipcblx0ICogU2F2ZXMgdGhlIHZhbGlkYXRpb24gc3RhdHVzIG9mIHByb3BlcnRpZXMgcmVsYXRlZCB0byBhIGZpZWxkIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRmllbGQgRmllbGRcblx0ICogQHBhcmFtIHtib29sZWFufSBiU3VjY2VzcyBTdGF0dXMgb2YgdGhlIGZpZWxkIHZhbGlkYXRpb25cblx0ICovXG5cdHByaXZhdGUgX3NhdmVGaWVsZFByb3BlcnRpZXNTdGF0dXMob0ZpZWxkOiBGaWVsZENvbnRyb2wsIGJTdWNjZXNzOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb0ZpZWxkLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3Qgc0VudGl0eVR5cGUgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQmluZGluZ0NvbnRleHQpO1xuXHRcdGNvbnN0IG1FbnRpdHlUeXBlID0gdGhpcy5fZ2V0RW50aXR5VHlwZUZyb21GUU4oc0VudGl0eVR5cGUpO1xuXHRcdGlmIChtRW50aXR5VHlwZSkge1xuXHRcdFx0Ly8gUmV0cmlldmVzIGFsbCBwcm9wZXJ0aWVzIHVzZWQgYnkgdGhlIGZpZWxkXG5cdFx0XHRjb25zdCBvRmllbGRCaW5kaW5nOiBhbnkgPSB0aGlzLl9nZXRCaW5kaW5nRm9yRmllbGQob0ZpZWxkKTtcblx0XHRcdGNvbnN0IGFGaWVsZFBhdGhzID0gb0ZpZWxkQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwuQ29tcG9zaXRlQmluZGluZ1wiKVxuXHRcdFx0XHQ/ICgob0ZpZWxkQmluZGluZyBhcyBhbnkpLmdldEJpbmRpbmdzKCkgfHwgW10pLm1hcCgob0JpbmRpbmc6IGFueSkgPT4gb0JpbmRpbmcuc1BhdGgpXG5cdFx0XHRcdDogW29GaWVsZEJpbmRpbmcuZ2V0UGF0aCgpXTtcblxuXHRcdFx0Ly8gU3RvcmVzIHN0YXR1cyBmb3IgYWxsIHByb3BlcnRpZXNcblx0XHRcdGFGaWVsZFBhdGhzLmZvckVhY2goKHNGaWVsZFBhdGg6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRjb25zdCBzSWQgPSB0aGlzLl9nZW5lcmF0ZVN0YXR1c0luZGV4KG1FbnRpdHlUeXBlLCBzRmllbGRQYXRoLCBvQmluZGluZ0NvbnRleHQpO1xuXHRcdFx0XHRpZiAoc0lkKSB7XG5cdFx0XHRcdFx0dGhpcy5fYVNvdXJjZVByb3BlcnRpZXNGYWlsdXJlW2JTdWNjZXNzID8gXCJkZWxldGVcIiA6IFwiYWRkXCJdKHNJZCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHByb3BlcnR5IGJpbmRpbmcgdG8gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cblx0ICpcblx0ICogQHBhcmFtIG9GaWVsZCBGaWVsZFxuXHQgKiBAcmV0dXJucyB7QmluZGluZ30gIEJpbmRpbmcgdG8gdGhlIHZhbHVlXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRCaW5kaW5nRm9yRmllbGQob0ZpZWxkOiBGaWVsZENvbnRyb2wpOiBCaW5kaW5nIHtcblx0XHRsZXQgc0JpbmRpbmdOYW1lID0gXCJ2YWx1ZVwiO1xuXHRcdGlmIChvRmllbGQuaXNBPENoZWNrQm94PihcInNhcC5tLkNoZWNrQm94XCIpKSB7XG5cdFx0XHRzQmluZGluZ05hbWUgPSBcInNlbGVjdGVkXCI7XG5cdFx0fSBlbHNlIGlmIChvRmllbGQuaXNBPEZpbGVVcGxvYWRlcj4oXCJzYXAudWkudW5pZmllZC5GaWxlVXBsb2FkZXJcIikpIHtcblx0XHRcdHNCaW5kaW5nTmFtZSA9IFwidXBsb2FkVXJsXCI7XG5cdFx0fVxuXHRcdHJldHVybiBvRmllbGQuZ2V0QmluZGluZyhzQmluZGluZ05hbWUpO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbjtcbiJdfQ==