@sapui5/sap.fe.core 1.97.0 → 1.99.1

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 (249) hide show
  1. package/package.json +5 -4
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +377 -405
  4. package/src/sap/fe/core/AnnotationHelper.ts +385 -0
  5. package/src/sap/fe/core/AppComponent.js +6 -3
  6. package/src/sap/fe/core/AppStateHandler.js +229 -181
  7. package/src/sap/fe/core/AppStateHandler.ts +171 -0
  8. package/src/sap/fe/core/BaseController.js +3 -2
  9. package/src/sap/fe/core/BusyLocker.js +105 -121
  10. package/src/sap/fe/core/BusyLocker.ts +98 -0
  11. package/src/sap/fe/core/CommonUtils.js +2073 -2379
  12. package/src/sap/fe/core/CommonUtils.ts +2078 -0
  13. package/src/sap/fe/core/ExtensionAPI.js +16 -7
  14. package/src/sap/fe/core/PageController.js +84 -119
  15. package/src/sap/fe/core/PageController.ts +101 -0
  16. package/src/sap/fe/core/RouterProxy.js +986 -807
  17. package/src/sap/fe/core/RouterProxy.ts +838 -0
  18. package/src/sap/fe/core/Synchronization.js +51 -35
  19. package/src/sap/fe/core/Synchronization.ts +29 -0
  20. package/src/sap/fe/core/TemplateComponent.js +173 -155
  21. package/src/sap/fe/core/TemplateComponent.ts +166 -0
  22. package/src/sap/fe/core/TemplateModel.js +97 -54
  23. package/src/sap/fe/core/TemplateModel.ts +64 -0
  24. package/src/sap/fe/core/TransactionHelper.js +1576 -1579
  25. package/src/sap/fe/core/TransactionHelper.ts +1706 -0
  26. package/src/sap/fe/core/actions/draft.js +560 -581
  27. package/src/sap/fe/core/actions/draft.ts +594 -0
  28. package/src/sap/fe/core/actions/messageHandling.js +545 -511
  29. package/src/sap/fe/core/actions/messageHandling.ts +532 -0
  30. package/src/sap/fe/core/actions/nonDraft.js +17 -19
  31. package/src/sap/fe/core/actions/nonDraft.ts +12 -0
  32. package/src/sap/fe/core/actions/operations.js +1074 -1211
  33. package/src/sap/fe/core/actions/operations.ts +1162 -0
  34. package/src/sap/fe/core/actions/sticky.js +102 -105
  35. package/src/sap/fe/core/actions/sticky.ts +102 -0
  36. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +3 -2
  37. package/src/sap/fe/core/controllerextensions/EditFlow.js +229 -260
  38. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +3 -2
  39. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +288 -13
  40. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +27 -23
  41. package/src/sap/fe/core/controllerextensions/InternalRouting.js +82 -46
  42. package/src/sap/fe/core/controllerextensions/KPIManagement.js +113 -25
  43. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +135 -44
  44. package/src/sap/fe/core/controllerextensions/MassEdit.js +172 -0
  45. package/src/sap/fe/core/controllerextensions/MessageHandler.js +22 -9
  46. package/src/sap/fe/core/controllerextensions/PageReady.js +3 -3
  47. package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -8
  48. package/src/sap/fe/core/controllerextensions/Paginator.js +37 -9
  49. package/src/sap/fe/core/controllerextensions/Placeholder.js +8 -4
  50. package/src/sap/fe/core/controllerextensions/Routing.js +25 -5
  51. package/src/sap/fe/core/controllerextensions/RoutingListener.js +3 -2
  52. package/src/sap/fe/core/controllerextensions/Share.js +22 -8
  53. package/src/sap/fe/core/controllerextensions/SideEffects.js +9 -9
  54. package/src/sap/fe/core/controllerextensions/SideEffects.ts +22 -21
  55. package/src/sap/fe/core/controllerextensions/ViewState.js +3 -2
  56. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -1
  57. package/src/sap/fe/core/controls/CommandExecution.js +3 -2
  58. package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -2
  59. package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -2
  60. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +9 -5
  61. package/src/sap/fe/core/controls/FieldWrapper.js +18 -23
  62. package/src/sap/fe/core/controls/FilterBar.js +3 -2
  63. package/src/sap/fe/core/controls/FormElementWrapper.js +3 -7
  64. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -2
  65. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +2 -1
  66. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +3 -2
  67. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +5 -4
  68. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -2
  69. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -2
  70. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
  71. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +79 -0
  72. package/src/sap/fe/core/converters/ConverterContext.js +14 -2
  73. package/src/sap/fe/core/converters/ConverterContext.ts +14 -3
  74. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  75. package/src/sap/fe/core/converters/ManifestSettings.ts +4 -0
  76. package/src/sap/fe/core/converters/ManifestWrapper.js +56 -32
  77. package/src/sap/fe/core/converters/ManifestWrapper.ts +24 -6
  78. package/src/sap/fe/core/converters/MetaModelConverter.js +67 -6
  79. package/src/sap/fe/core/converters/MetaModelConverter.ts +70 -14
  80. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  81. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -2
  82. package/src/sap/fe/core/converters/annotations/DataField.js +3 -3
  83. package/src/sap/fe/core/converters/annotations/DataField.ts +1 -1
  84. package/src/sap/fe/core/converters/common/AnnotationConverter.js +33 -21
  85. package/src/sap/fe/core/converters/controls/Common/Action.js +11 -2
  86. package/src/sap/fe/core/converters/controls/Common/Action.ts +8 -2
  87. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
  88. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
  89. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
  90. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  91. package/src/sap/fe/core/converters/controls/Common/Form.js +20 -10
  92. package/src/sap/fe/core/converters/controls/Common/Form.ts +24 -4
  93. package/src/sap/fe/core/converters/controls/Common/KPI.js +69 -4
  94. package/src/sap/fe/core/converters/controls/Common/KPI.ts +72 -0
  95. package/src/sap/fe/core/converters/controls/Common/Table.js +390 -398
  96. package/src/sap/fe/core/converters/controls/Common/Table.ts +497 -484
  97. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +527 -0
  98. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +655 -0
  99. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +489 -37
  100. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +506 -58
  101. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
  102. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
  103. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +17 -9
  104. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +24 -9
  105. package/src/sap/fe/core/converters/helpers/Aggregation.js +18 -3
  106. package/src/sap/fe/core/converters/helpers/Aggregation.ts +28 -5
  107. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -1
  108. package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -0
  109. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +4 -4
  110. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +3 -3
  111. package/src/sap/fe/core/converters/templates/ListReportConverter.js +13 -6
  112. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +26 -15
  113. package/src/sap/fe/core/designtime/AppComponent.designtime.js +11 -2
  114. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  115. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  116. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  117. package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  118. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  119. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
  120. package/src/sap/fe/core/formatters/TableFormatter.js +39 -28
  121. package/src/sap/fe/core/formatters/TableFormatter.ts +43 -28
  122. package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
  123. package/src/sap/fe/core/formatters/ValueFormatter.ts +30 -7
  124. package/src/sap/fe/core/fpm/Component.js +3 -2
  125. package/src/sap/fe/core/helpers/AppStartupHelper.js +359 -0
  126. package/src/sap/fe/core/helpers/AppStartupHelper.ts +391 -0
  127. package/src/sap/fe/core/helpers/BindingExpression.js +484 -437
  128. package/src/sap/fe/core/helpers/BindingExpression.ts +480 -463
  129. package/src/sap/fe/core/helpers/ClassSupport.js +27 -15
  130. package/src/sap/fe/core/helpers/ClassSupport.ts +31 -20
  131. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +63 -59
  132. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +56 -0
  133. package/src/sap/fe/core/helpers/EditState.js +81 -84
  134. package/src/sap/fe/core/helpers/EditState.ts +81 -0
  135. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
  136. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  137. package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
  138. package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  139. package/src/sap/fe/core/helpers/KeepAliveHelper.js +4 -5
  140. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +10 -10
  141. package/src/sap/fe/core/helpers/MassEditHelper.js +687 -0
  142. package/src/sap/fe/core/helpers/ModelHelper.js +229 -225
  143. package/src/sap/fe/core/helpers/ModelHelper.ts +227 -0
  144. package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
  145. package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
  146. package/src/sap/fe/core/helpers/SemanticDateOperators.js +332 -313
  147. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +330 -0
  148. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
  149. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  150. package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
  151. package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
  152. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  153. package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
  154. package/src/sap/fe/core/library.js +30 -3
  155. package/src/sap/fe/core/library.support.js +12 -5
  156. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +62 -0
  157. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +66 -0
  158. package/src/sap/fe/core/messagebundle.properties +61 -13
  159. package/src/sap/fe/core/messagebundle_ar.properties +33 -2
  160. package/src/sap/fe/core/messagebundle_bg.properties +33 -2
  161. package/src/sap/fe/core/messagebundle_ca.properties +33 -2
  162. package/src/sap/fe/core/messagebundle_cs.properties +34 -3
  163. package/src/sap/fe/core/messagebundle_cy.properties +33 -2
  164. package/src/sap/fe/core/messagebundle_da.properties +33 -2
  165. package/src/sap/fe/core/messagebundle_de.properties +33 -2
  166. package/src/sap/fe/core/messagebundle_el.properties +33 -2
  167. package/src/sap/fe/core/messagebundle_en.properties +32 -1
  168. package/src/sap/fe/core/messagebundle_en_GB.properties +32 -1
  169. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +36 -1
  170. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +33 -2
  171. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +33 -2
  172. package/src/sap/fe/core/messagebundle_es.properties +33 -2
  173. package/src/sap/fe/core/messagebundle_es_MX.properties +33 -2
  174. package/src/sap/fe/core/messagebundle_et.properties +33 -2
  175. package/src/sap/fe/core/messagebundle_fi.properties +34 -3
  176. package/src/sap/fe/core/messagebundle_fr.properties +38 -7
  177. package/src/sap/fe/core/messagebundle_fr_CA.properties +33 -2
  178. package/src/sap/fe/core/messagebundle_hi.properties +33 -2
  179. package/src/sap/fe/core/messagebundle_hr.properties +33 -2
  180. package/src/sap/fe/core/messagebundle_hu.properties +34 -3
  181. package/src/sap/fe/core/messagebundle_id.properties +36 -5
  182. package/src/sap/fe/core/messagebundle_it.properties +33 -2
  183. package/src/sap/fe/core/messagebundle_iw.properties +33 -2
  184. package/src/sap/fe/core/messagebundle_ja.properties +33 -2
  185. package/src/sap/fe/core/messagebundle_kk.properties +33 -2
  186. package/src/sap/fe/core/messagebundle_ko.properties +33 -2
  187. package/src/sap/fe/core/messagebundle_lt.properties +33 -2
  188. package/src/sap/fe/core/messagebundle_lv.properties +33 -2
  189. package/src/sap/fe/core/messagebundle_ms.properties +33 -2
  190. package/src/sap/fe/core/messagebundle_nl.properties +33 -2
  191. package/src/sap/fe/core/messagebundle_no.properties +33 -2
  192. package/src/sap/fe/core/messagebundle_pl.properties +33 -2
  193. package/src/sap/fe/core/messagebundle_pt.properties +34 -3
  194. package/src/sap/fe/core/messagebundle_pt_PT.properties +33 -2
  195. package/src/sap/fe/core/messagebundle_ro.properties +33 -2
  196. package/src/sap/fe/core/messagebundle_ru.properties +33 -2
  197. package/src/sap/fe/core/messagebundle_sh.properties +33 -2
  198. package/src/sap/fe/core/messagebundle_sk.properties +33 -2
  199. package/src/sap/fe/core/messagebundle_sl.properties +33 -2
  200. package/src/sap/fe/core/messagebundle_sv.properties +34 -3
  201. package/src/sap/fe/core/messagebundle_th.properties +33 -2
  202. package/src/sap/fe/core/messagebundle_tr.properties +33 -2
  203. package/src/sap/fe/core/messagebundle_uk.properties +33 -2
  204. package/src/sap/fe/core/messagebundle_vi.properties +33 -2
  205. package/src/sap/fe/core/messagebundle_zh_CN.properties +33 -2
  206. package/src/sap/fe/core/messagebundle_zh_TW.properties +33 -2
  207. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  208. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  209. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +269 -202
  210. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
  211. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +4 -3
  212. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +9 -5
  213. package/src/sap/fe/core/services/NavigationServiceFactory.js +406 -300
  214. package/src/sap/fe/core/services/NavigationServiceFactory.ts +316 -0
  215. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +149 -81
  216. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +80 -0
  217. package/src/sap/fe/core/services/RoutingServiceFactory.js +987 -1152
  218. package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
  219. package/src/sap/fe/core/services/ShellServicesFactory.js +31 -2
  220. package/src/sap/fe/core/services/ShellServicesFactory.ts +45 -11
  221. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +42 -85
  222. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +57 -100
  223. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +461 -478
  224. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +453 -0
  225. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
  226. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
  227. package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  228. package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  229. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  230. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  231. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
  232. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
  233. package/src/sap/fe/core/templating/DataModelPathHelper.js +10 -48
  234. package/src/sap/fe/core/templating/DataModelPathHelper.ts +14 -46
  235. package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
  236. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
  237. package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
  238. package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  239. package/src/sap/fe/core/templating/FilterHelper.js +139 -70
  240. package/src/sap/fe/core/templating/FilterHelper.ts +140 -70
  241. package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
  242. package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  243. package/src/sap/fe/core/templating/UIFormatters.js +45 -110
  244. package/src/sap/fe/core/templating/UIFormatters.ts +39 -75
  245. package/src/sap/fe/core/type/Email.js +1 -1
  246. package/src/sap/fe/core/type/Email.ts +4 -6
  247. package/ui5.yaml +0 -3
  248. package/src/sap/fe/core/controls/filterbar.d.js +0 -8
  249. package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
@@ -5,6 +5,7 @@
5
5
  sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Service", "sap/fe/core/converters/MetaModelConverter", "sap/base/Log"], function (ServiceFactory, Service, MetaModelConverter, Log) {
6
6
  "use strict";
7
7
 
8
+ var _exports = {};
8
9
  var convertTypes = MetaModelConverter.convertTypes;
9
10
 
10
11
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
@@ -25,7 +26,7 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
25
26
 
26
27
  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); }; }
27
28
 
28
- function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
29
+ 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); }
29
30
 
30
31
  function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
31
32
 
@@ -44,6 +45,8 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
44
45
  return _super.apply(this, arguments);
45
46
  }
46
47
 
48
+ _exports.SideEffectsService = SideEffectsService;
49
+
47
50
  _createClass(SideEffectsService, [{
48
51
  key: "init",
49
52
  value: // !: means that we know it will be assigned before usage
@@ -265,13 +268,15 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
265
268
  var sBaseEntityType = this.getEntityTypeFromContext(oContext);
266
269
 
267
270
  if (sBaseEntityType) {
271
+ var sNavigationPath = sNavigationProperty + "/";
268
272
  var aSideEffects = this.getODataEntitySideEffects(sBaseEntityType);
269
273
  var aTargets = [];
270
274
  Object.keys(aSideEffects).filter( // Keep relevant SideEffects
271
275
  function (sAnnotationName) {
272
276
  var oSideEffects = aSideEffects[sAnnotationName];
273
277
  return (oSideEffects.SourceProperties || []).some(function (oPropertyPath) {
274
- return oPropertyPath.value.indexOf(sNavigationProperty) > -1;
278
+ var sPropertyPath = oPropertyPath.value;
279
+ return sPropertyPath.startsWith(sNavigationPath) && sPropertyPath.replace(sNavigationPath, "").indexOf("/") === -1;
275
280
  }) || (oSideEffects.SourceEntities || []).some(function (oNavigationPropertyPath) {
276
281
  return oNavigationPropertyPath.value === sNavigationProperty;
277
282
  });
@@ -314,7 +319,7 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
314
319
  }
315
320
  /**
316
321
  * Adds the text properties required for SideEffects
317
- * If a property has an associated text then this text needs to be added as targetProperties.
322
+ * If a property has an associated text then this text needs to be added as targetProperties or targetEntities.
318
323
  *
319
324
  * @private
320
325
  * @ui5-restricted
@@ -346,16 +351,14 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
346
351
 
347
352
  if (aTargetEntityProperties) {
348
353
  if (bIsStarProperty) {
349
- if (aTargetEntityProperties) {
350
- // Add all required properties behind the *
351
- aEntitiesRequested.push(sNavigationPropertyPath);
352
- aDerivedProperties = aDerivedProperties.concat(aTargetEntityProperties.map(function (mProperty) {
353
- return {
354
- navigationPath: sRelativePath,
355
- property: mProperty
356
- };
357
- }));
358
- }
354
+ // Add all required properties behind the *
355
+ aEntitiesRequested.push(sNavigationPropertyPath);
356
+ aDerivedProperties = aDerivedProperties.concat(aTargetEntityProperties.map(function (mProperty) {
357
+ return {
358
+ navigationPath: sRelativePath,
359
+ property: mProperty
360
+ };
361
+ }));
359
362
  } else {
360
363
  aDerivedProperties.push({
361
364
  property: aTargetEntityProperties.find(function (mProperty) {
@@ -376,7 +379,8 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
376
379
  var _mPropertyInfo$proper, _mPropertyInfo$proper2, _mPropertyInfo$proper3;
377
380
 
378
381
  var sTargetTextPath = (_mPropertyInfo$proper = mPropertyInfo.property.annotations) === null || _mPropertyInfo$proper === void 0 ? void 0 : (_mPropertyInfo$proper2 = _mPropertyInfo$proper.Common) === null || _mPropertyInfo$proper2 === void 0 ? void 0 : (_mPropertyInfo$proper3 = _mPropertyInfo$proper2.Text) === null || _mPropertyInfo$proper3 === void 0 ? void 0 : _mPropertyInfo$proper3.path,
379
- sTextPathFromInitialEntity = mPropertyInfo.navigationPath + sTargetTextPath;
382
+ sTextPathFromInitialEntity = mPropertyInfo.navigationPath + sTargetTextPath,
383
+ sTargetCollectionPath = sTextPathFromInitialEntity.substring(0, sTextPathFromInitialEntity.lastIndexOf("/"));
380
384
  /**
381
385
  * The property Text must be added only if the property is
382
386
  * - not part of a star property (.i.e '*' or 'navigation/*') or a targeted Entity
@@ -384,8 +388,19 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
384
388
  * Indeed in the two listed cases, the property containing text will be/is requested by initial SideEffects configuration.
385
389
  */
386
390
 
387
- if (sTargetTextPath && aEntitiesRequested.indexOf(sTextPathFromInitialEntity.substring(0, sTextPathFromInitialEntity.lastIndexOf("/"))) === -1 && aInitialProperties.indexOf(sTextPathFromInitialEntity) === -1) {
388
- oSideEffect.TargetProperties.push(sTextPathFromInitialEntity);
391
+ if (sTargetTextPath && aEntitiesRequested.indexOf(sTargetCollectionPath) === -1 && aInitialProperties.indexOf(sTextPathFromInitialEntity) === -1) {
392
+ var _mEntityType$resolveP;
393
+
394
+ // The Text association is added as TargetEntities if it's contained on a different entitySet and not a complexType
395
+ // Otherwise it's added as targetProperties
396
+ if (sTargetTextPath.lastIndexOf("/") > -1 && ((_mEntityType$resolveP = mEntityType.resolvePath(sTargetCollectionPath)) === null || _mEntityType$resolveP === void 0 ? void 0 : _mEntityType$resolveP._type) === "NavigationProperty") {
397
+ oSideEffect.TargetEntities.push({
398
+ $NavigationPropertyPath: sTargetCollectionPath
399
+ });
400
+ aEntitiesRequested.push(sTargetCollectionPath);
401
+ } else {
402
+ oSideEffect.TargetProperties.push(sTextPathFromInitialEntity);
403
+ }
389
404
  }
390
405
  }
391
406
  });
@@ -401,21 +416,17 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
401
416
  * @private
402
417
  * @ui5-restricted
403
418
  * @param {object} oSideEffects SideEffects definition
404
- * @param {string} sEntityType Name of the entity type
419
+ * @param {object} mEntityType Entity type
405
420
  * @param {string} sBindingParameter Name of the binding parameter
406
421
  * @returns {object} SideEffects definition
407
422
  */
408
423
 
409
424
  }, {
410
425
  key: "_convertSideEffects",
411
- value: function _convertSideEffects(oSideEffects, sEntityType, sBindingParameter) {
412
- var mEntityType = this.getConvertedMetaModel().entityTypes.find(function (oEntityType) {
413
- return oEntityType.fullyQualifiedName === sEntityType;
414
- });
415
-
426
+ value: function _convertSideEffects(oSideEffects, mEntityType, sBindingParameter) {
416
427
  var oTempSideEffects = this._removeBindingParameter(this._convertTargetsFormat(oSideEffects), sBindingParameter);
417
428
 
418
- return mEntityType ? this._replaceReferencedProperties(this._addRequiredTextProperties(oTempSideEffects, mEntityType), mEntityType) : oTempSideEffects;
429
+ return this._addRequiredTextProperties(oTempSideEffects, mEntityType);
419
430
  }
420
431
  /**
421
432
  * Converts SideEffects targets (TargetEntities and TargetProperties) to expected format
@@ -484,13 +495,13 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
484
495
 
485
496
  var mCommonAnnotation = ((_oSource$annotations = oSource.annotations) === null || _oSource$annotations === void 0 ? void 0 : _oSource$annotations.Common) || {};
486
497
  var mBindingParameter = (oSource.parameters || []).find(function (mParameter) {
487
- return mParameter.type === (mEntityType || oSource).fullyQualifiedName;
498
+ return mParameter.type === mEntityType.fullyQualifiedName;
488
499
  });
489
500
  var sBindingParameter = mBindingParameter ? mBindingParameter.fullyQualifiedName.split("/")[1] : "";
490
501
  Object.keys(mCommonAnnotation).filter(function (sAnnotationName) {
491
502
  return mCommonAnnotation[sAnnotationName].$Type === "com.sap.vocabularies.Common.v1.SideEffectsType";
492
503
  }).forEach(function (sAnnotationName) {
493
- aSideEffects.push(_this4._convertSideEffects(mCommonAnnotation[sAnnotationName], mEntityType.fullyQualifiedName, sBindingParameter));
504
+ aSideEffects.push(_this4._convertSideEffects(mCommonAnnotation[sAnnotationName], mEntityType, sBindingParameter));
494
505
  });
495
506
  }
496
507
  }
@@ -536,7 +547,7 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
536
547
  mTarget = mTarget.map(function (mProperty) {
537
548
  var bNavigationPropertyPath = mProperty.$NavigationPropertyPath !== undefined; // Need to test with undefined since mProperty.$NavigationPropertyPath could be "" (empty string)
538
549
 
539
- var sValue = (bNavigationPropertyPath ? mProperty.$NavigationPropertyPath : mProperty).replace(new RegExp("^" + sBindingParameterName + "?."), "");
550
+ var sValue = (bNavigationPropertyPath ? mProperty.$NavigationPropertyPath : mProperty).replace(new RegExp("^" + sBindingParameterName + "/?"), "");
540
551
  return bNavigationPropertyPath ? {
541
552
  $NavigationPropertyPath: sValue
542
553
  } : sValue;
@@ -563,68 +574,12 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
563
574
  value: function _removeDuplicateTargets(aTargets) {
564
575
  return aTargets.filter(function (mTarget, iIndex, aTargets) {
565
576
  return aTargets.findIndex(function (mSearchTarget) {
566
- return mSearchTarget === mTarget || mTarget.$NavigationPropertyPath && mSearchTarget.$NavigationPropertyPath === mTarget.$NavigationPropertyPath // NavigationPropertyPath
577
+ return mSearchTarget === mTarget || // PropertyPath
578
+ mTarget.$NavigationPropertyPath && mSearchTarget.$NavigationPropertyPath === mTarget.$NavigationPropertyPath // NavigationPropertyPath
567
579
  ;
568
580
  }) === iIndex;
569
581
  });
570
582
  }
571
- /**
572
- * Replaces TargetProperties having reference to Source Properties for a SideEffects
573
- * If a SideEffects Source Property is an navigation entity reference, the SideEffects Target Properties cannot be a property of this navigation entity.
574
- * Indeed this configuration leads to error into the OData V4 Model since response cannot be processed because this would mean that we merge properties of the new target into the old target of the navigation property.
575
- * In order to request new value of these target properties the SideEffects will request for the entire Entity instead of just a set of properties.
576
- * For the first version, we remove all navigation properties and replace them by targetEntities. This change could be improved in next version.
577
- *
578
- * @private
579
- * @ui5-restricted
580
- * @param {object} oSideEffect SideEffects definition
581
- * @param {object} mEntityType Entity type
582
- * @returns {object} SideEffects definition without referenced target properties
583
- */
584
-
585
- }, {
586
- key: "_replaceReferencedProperties",
587
- value: function _replaceReferencedProperties(oSideEffect, mEntityType) {
588
- var bSideEffectsChanged = false;
589
- var aEntities = (oSideEffect.TargetEntities || []).map(function (mNavigation) {
590
- return mNavigation.$NavigationPropertyPath;
591
- }) || [],
592
- aProperties = [];
593
- oSideEffect.TargetProperties.forEach(function (sPropertyPath) {
594
- var bTargetChanged = false;
595
- var iLastPathSeparatorIndex = sPropertyPath.lastIndexOf("/");
596
-
597
- if (iLastPathSeparatorIndex !== -1) {
598
- var sNavigationPath = sPropertyPath.substring(0, iLastPathSeparatorIndex);
599
- var oTarget = mEntityType.resolvePath(sNavigationPath);
600
-
601
- if (oTarget && oTarget._type === "NavigationProperty") {
602
- //Test if it's not a property bound on complexType (_ComplexType/MyProperty)
603
- bSideEffectsChanged = true;
604
- bTargetChanged = true;
605
-
606
- if (!aEntities.includes(sNavigationPath)) {
607
- aEntities.push(sNavigationPath);
608
- }
609
- }
610
- }
611
-
612
- if (!bTargetChanged) {
613
- aProperties.push(sPropertyPath);
614
- }
615
- });
616
-
617
- if (bSideEffectsChanged) {
618
- oSideEffect.TargetProperties = aProperties;
619
- oSideEffect.TargetEntities = aEntities.map(function (sNavigationPath) {
620
- return {
621
- $NavigationPropertyPath: sNavigationPath
622
- };
623
- });
624
- }
625
-
626
- return oSideEffect;
627
- }
628
583
  /**
629
584
  * Gets SideEffects action type that come from an OData Service
630
585
  * Internal routine to get, from converted oData metaModel, SideEffects on actions
@@ -704,6 +659,8 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
704
659
  return SideEffectsService;
705
660
  }(Service);
706
661
 
662
+ _exports.SideEffectsService = SideEffectsService;
663
+
707
664
  var SideEffectsServiceFactory = /*#__PURE__*/function (_ServiceFactory) {
708
665
  _inherits(SideEffectsServiceFactory, _ServiceFactory);
709
666
 
@@ -728,4 +685,4 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
728
685
 
729
686
  return SideEffectsServiceFactory;
730
687
  }, false);
731
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkudHMiXSwibmFtZXMiOlsiU2lkZUVmZmVjdHNTZXJ2aWNlIiwiX29TaWRlRWZmZWN0c1R5cGUiLCJvRGF0YSIsImVudGl0aWVzIiwiYWN0aW9ucyIsImNvbnRyb2wiLCJfYkluaXRpYWxpemVkIiwiaW5pdFByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNFbnRpdHlUeXBlIiwib1NpZGVFZmZlY3QiLCJzb3VyY2VDb250cm9sSWQiLCJvQ29udHJvbFNpZGVFZmZlY3QiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJtRW50aXR5Q29udHJvbFNpZGVFZmZlY3RzIiwic1RyaWdnZXJBY3Rpb24iLCJvQ29udGV4dCIsInNHcm91cElkIiwib1RyaWdnZXJBY3Rpb24iLCJnZXRNb2RlbCIsImJpbmRDb250ZXh0IiwiZXhlY3V0ZSIsImdldEJpbmRpbmciLCJnZXRVcGRhdGVHcm91cElkIiwiZ2V0Q29udGV4dCIsIm9Db21wb25lbnQiLCJzY29wZU9iamVjdCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJjb252ZXJ0VHlwZXMiLCJfb0NhcGFiaWxpdGllcyIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsImdldE9iamVjdCIsInNFbnRpdHlUeXBlTmFtZSIsInNBY3Rpb25OYW1lIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwidW5kZWZpbmVkIiwib0NhcGFiaWxpdGllcyIsIm9Db252ZXJ0ZWRNZXRhTW9kZWwiLCJnZXRDb252ZXJ0ZWRNZXRhTW9kZWwiLCJlbnRpdHlUeXBlcyIsImZvckVhY2giLCJlbnRpdHlUeXBlIiwiX3JldHJpZXZlT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsIl9yZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzIiwic0NvbnRyb2xJZCIsIk9iamVjdCIsImtleXMiLCJhUGF0aEV4cHJlc3Npb25zIiwiX2xvZ1JlcXVlc3QiLCJvUHJvbWlzZSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImUiLCJyZWplY3QiLCJzTmF2aWdhdGlvblByb3BlcnR5Iiwic0Jhc2VFbnRpdHlUeXBlIiwiYVNpZGVFZmZlY3RzIiwiZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsImFUYXJnZXRzIiwiZmlsdGVyIiwic0Fubm90YXRpb25OYW1lIiwib1NpZGVFZmZlY3RzIiwiU291cmNlUHJvcGVydGllcyIsInNvbWUiLCJvUHJvcGVydHlQYXRoIiwidmFsdWUiLCJpbmRleE9mIiwiU291cmNlRW50aXRpZXMiLCJvTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIlRyaWdnZXJBY3Rpb24iLCJleGVjdXRlQWN0aW9uIiwiVGFyZ2V0RW50aXRpZXMiLCJjb25jYXQiLCJUYXJnZXRQcm9wZXJ0aWVzIiwibVRhcmdldCIsInB1c2giLCJfcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyIsImxlbmd0aCIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJtRW50aXR5VHlwZSIsImFJbml0aWFsUHJvcGVydGllcyIsImFFbnRpdGllc1JlcXVlc3RlZCIsIm1hcCIsIm5hdmlnYXRpb24iLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImFEZXJpdmVkUHJvcGVydGllcyIsInNQcm9wZXJ0eVBhdGgiLCJiSXNTdGFyUHJvcGVydHkiLCJlbmRzV2l0aCIsInNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJzUmVsYXRpdmVQYXRoIiwicmVzb2x2ZVBhdGgiLCJhVGFyZ2V0RW50aXR5UHJvcGVydGllcyIsImVudGl0eVByb3BlcnRpZXMiLCJ0YXJnZXRUeXBlIiwicHJvcGVydGllcyIsIm1Qcm9wZXJ0eSIsIm5hdmlnYXRpb25QYXRoIiwicHJvcGVydHkiLCJmaW5kIiwibmFtZSIsInNwbGl0IiwicG9wIiwiaW5mbyIsIm1Qcm9wZXJ0eUluZm8iLCJzVGFyZ2V0VGV4dFBhdGgiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRleHQiLCJwYXRoIiwic1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkiLCJzQmluZGluZ1BhcmFtZXRlciIsIm9FbnRpdHlUeXBlIiwib1RlbXBTaWRlRWZmZWN0cyIsIl9yZW1vdmVCaW5kaW5nUGFyYW1ldGVyIiwiX2NvbnZlcnRUYXJnZXRzRm9ybWF0IiwiX3JlcGxhY2VSZWZlcmVuY2VkUHJvcGVydGllcyIsIl9hZGRSZXF1aXJlZFRleHRQcm9wZXJ0aWVzIiwicmVkdWNlIiwiYVRhcmdldFByb3BlcnRpZXMiLCJ2VGFyZ2V0Iiwic1RhcmdldCIsInR5cGUiLCJtVGFyZ2V0RW50aXR5Iiwib1NvdXJjZSIsImF1dGhvcml6ZWRUeXBlcyIsIl90eXBlIiwic291cmNlRW50aXR5VHlwZSIsIm1Db21tb25Bbm5vdGF0aW9uIiwibUJpbmRpbmdQYXJhbWV0ZXIiLCJwYXJhbWV0ZXJzIiwibVBhcmFtZXRlciIsIiRUeXBlIiwiX2NvbnZlcnRTaWRlRWZmZWN0cyIsInNUYXJnZXRQYXRocyIsInNQYXRocyIsImRlYnVnIiwic0JpbmRpbmdQYXJhbWV0ZXJOYW1lIiwiYk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJzVmFsdWUiLCJyZXBsYWNlIiwiUmVnRXhwIiwiaUluZGV4IiwiZmluZEluZGV4IiwibVNlYXJjaFRhcmdldCIsImJTaWRlRWZmZWN0c0NoYW5nZWQiLCJhRW50aXRpZXMiLCJtTmF2aWdhdGlvbiIsImFQcm9wZXJ0aWVzIiwiYlRhcmdldENoYW5nZWQiLCJpTGFzdFBhdGhTZXBhcmF0b3JJbmRleCIsInNOYXZpZ2F0aW9uUGF0aCIsIm9UYXJnZXQiLCJpbmNsdWRlcyIsImFBY3Rpb25zIiwib0FjdGlvbiIsInRyaWdnZXJBY3Rpb25zIiwicGF0aEV4cHJlc3Npb25zIiwiX2dldFNpZGVFZmZlY3RzRnJvbVNvdXJjZSIsIm9FbnRpdHlTaWRlRWZmZWN0cyIsIlNlcnZpY2UiLCJTaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5Iiwib1NlcnZpY2VDb250ZXh0IiwiU2lkZUVmZmVjdHNTZXJ2aWNlU2VydmljZSIsIlNlcnZpY2VGYWN0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QUdBLGVBQU91RyxrQkFBUDtBQUNBOzs7YUFFRCx3QkFBb0I7QUFDbkIsZUFBTyxJQUFQO0FBQ0E7Ozs7SUF6a0IrQkMsTzs7TUE0a0IzQkMseUI7Ozs7Ozs7Ozs7Ozs7YUFDTCx3QkFBZUMsZUFBZixFQUFxRTtBQUNwRSxZQUFNQyx5QkFBeUIsR0FBRyxJQUFJM0ssa0JBQUosQ0FBdUIwSyxlQUF2QixDQUFsQztBQUNBLGVBQU9DLHlCQUF5QixDQUFDcEssV0FBakM7QUFDQTs7OztJQUpzQ3FLLGM7O1NBT3pCSCx5QiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VydmljZUZhY3RvcnksIFNlcnZpY2UsIFNlcnZpY2VDb250ZXh0IH0gZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2VcIjtcbmltcG9ydCB7IENvbnZlcnRlck91dHB1dCwgRW50aXR5VHlwZSwgTmF2aWdhdGlvblByb3BlcnR5LCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQgeyBDb250ZXh0LCBPRGF0YU1ldGFNb2RlbCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjRcIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcywgRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IENvbW1vbkFubm90YXRpb25UeXBlcywgUXVhbGlmaWVkTmFtZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L2dlbmVyYXRlZC9Db21tb25cIjtcbmltcG9ydCB7IEFjdGlvbiwgTmF2aWdhdGlvblByb3BlcnR5UGF0aCwgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgeyBMb2cgfSBmcm9tIFwic2FwL2Jhc2VcIjtcblxudHlwZSBTaWRlRWZmZWN0c1NldHRpbmdzID0ge307XG5cbnR5cGUgU2lkZUVmZmVjdHNUYXJnZXRFbnRpdHlUeXBlID0ge1xuXHQkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogc3RyaW5nO1xufTtcbnR5cGUgU2lkZUVmZmVjdHNUYXJnZXQgPSBTaWRlRWZmZWN0c1RhcmdldEVudGl0eVR5cGUgfCBzdHJpbmc7XG5cbnR5cGUgU2lkZUVmZmVjdHNUYXJnZXRUeXBlID0ge1xuXHRUYXJnZXRQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0VGFyZ2V0RW50aXRpZXM6IFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZVtdO1xufTtcblxudHlwZSBCYXNlQW5ub3RhdGlvblNpZGVFZmZlY3RzVHlwZSA9IHtcblx0VGFyZ2V0UHJvcGVydGllczogc3RyaW5nW107XG5cdFRhcmdldEVudGl0aWVzOiBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoW107XG5cdGZ1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nO1xufTtcblxudHlwZSBCYXNlU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRmdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZztcbn0gJiBTaWRlRWZmZWN0c1RhcmdldFR5cGU7XG5cbnR5cGUgQWN0aW9uU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRwYXRoRXhwcmVzc2lvbnM6IFNpZGVFZmZlY3RzVGFyZ2V0W107XG5cdHRyaWdnZXJBY3Rpb25zPzogUXVhbGlmaWVkTmFtZVtdO1xufTtcblxuZXhwb3J0IHR5cGUgQ29udHJvbFNpZGVFZmZlY3RzVHlwZSA9IFBhcnRpYWw8QmFzZVNpZGVFZmZlY3RzVHlwZT4gJiB7XG5cdGZ1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nO1xuXHRTb3VyY2VQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0c291cmNlQ29udHJvbElkOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBPRGF0YVNpZGVFZmZlY3RzVHlwZSA9IEJhc2VTaWRlRWZmZWN0c1R5cGUgJiB7XG5cdFNvdXJjZVByb3BlcnRpZXM/OiBQcm9wZXJ0eVBhdGhbXTtcblx0U291cmNlRW50aXRpZXM/OiBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoW107XG5cdFRyaWdnZXJBY3Rpb24/OiBRdWFsaWZpZWROYW1lO1xufTtcblxuZXhwb3J0IHR5cGUgU2lkZUVmZmVjdHNUeXBlID0gQ29udHJvbFNpZGVFZmZlY3RzVHlwZSB8IE9EYXRhU2lkZUVmZmVjdHNUeXBlO1xuXG5leHBvcnQgdHlwZSBPRGF0YVNpZGVFZmZlY3RzRW50aXR5RGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPjtcbmV4cG9ydCB0eXBlIE9EYXRhU2lkZUVmZmVjdHNBY3Rpb25EaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPjtcbmV4cG9ydCB0eXBlIENvbnRyb2xTaWRlRWZmZWN0c0VudGl0eURpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBDb250cm9sU2lkZUVmZmVjdHNUeXBlPjtcblxudHlwZSBTaWRlRWZmZWN0c09yaWdpblJlZ2lzdHJ5ID0ge1xuXHRvRGF0YToge1xuXHRcdGVudGl0aWVzOiB7XG5cdFx0XHRbZW50aXR5OiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBPRGF0YVNpZGVFZmZlY3RzVHlwZT47XG5cdFx0fTtcblx0XHRhY3Rpb25zOiB7XG5cdFx0XHRbZW50aXR5OiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+O1xuXHRcdH07XG5cdH07XG5cdGNvbnRyb2w6IHtcblx0XHRbZW50aXR5OiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBDb250cm9sU2lkZUVmZmVjdHNUeXBlPjtcblx0fTtcbn07XG5cbnR5cGUgRXh0cmFjdG9yUHJvcGVydHlJbmZvID0ge1xuXHRwcm9wZXJ0eTogUHJvcGVydHk7XG5cdG5hdmlnYXRpb25QYXRoPzogc3RyaW5nO1xufTtcblxuY2xhc3MgU2lkZUVmZmVjdHNTZXJ2aWNlIGV4dGVuZHMgU2VydmljZTxTaWRlRWZmZWN0c1NldHRpbmdzPiB7XG5cdGluaXRQcm9taXNlITogUHJvbWlzZTxhbnk+O1xuXHRfb1NpZGVFZmZlY3RzVHlwZSE6IFNpZGVFZmZlY3RzT3JpZ2luUmVnaXN0cnk7XG5cdF9vQ2FwYWJpbGl0aWVzITogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMgfCB1bmRlZmluZWQ7XG5cdF9iSW5pdGlhbGl6ZWQhOiBCb29sZWFuO1xuXHQvLyAhOiBtZWFucyB0aGF0IHdlIGtub3cgaXQgd2lsbCBiZSBhc3NpZ25lZCBiZWZvcmUgdXNhZ2Vcblx0aW5pdCgpIHtcblx0XHR0aGlzLl9vU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRcdFx0b0RhdGE6IHtcblx0XHRcdFx0ZW50aXRpZXM6IHt9LFxuXHRcdFx0XHRhY3Rpb25zOiB7fVxuXHRcdFx0fSxcblx0XHRcdGNvbnRyb2w6IHt9XG5cdFx0fTtcblx0XHR0aGlzLl9iSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblx0XHR0aGlzLmluaXRQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBTaWRlRWZmZWN0cyBjb250cm9sXG5cdCAqIFNpZGVFZmZlY3RzIGRlZmluaXRpb24gaXMgYWRkZWQgYnkgYSBjb250cm9sIHRvIGtlZXAgZGF0YSB1cCB0byBkYXRlXG5cdCAqIFRoZXNlIFNpZGVFZmZlY3RzIGdldCBsaW1pdGVkIHNjb3BlIGNvbXBhcmVkIHdpdGggU2lkZUVmZmVjdHMgY29taW5nIGZyb20gYW4gT0RhdGEgc2VydmljZTpcblx0ICogLSBPbmx5IG9uZSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uIGNhbiBiZSBkZWZpbmVkIGZvciB0aGUgY29tYmluYXRpb24gZW50aXR5IHR5cGUgLSBjb250cm9sIElkXG5cdCAqIC0gT25seSBTaWRlRWZmZWN0cyBzb3VyY2UgcHJvcGVydGllcyBhcmUgcmVjb2duaXplZCBhbmQgdXNlZCB0byB0cmlnZ2VyIFNpZGVFZmZlY3RzXG5cdCAqXG5cdCAqIEVuc3VyZSB0aGUgc291cmNlQ29udHJvbElkIG1hdGNoZXMgdGhlIGFzc29jaWF0ZWQgU0FQVUk1IGNvbnRyb2wgSUQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0VudGl0eVR5cGUgTmFtZSBvZiB0aGUgZW50aXR5IHR5cGVcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TaWRlRWZmZWN0IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHB1YmxpYyBhZGRDb250cm9sU2lkZUVmZmVjdHMoc0VudGl0eVR5cGU6IHN0cmluZywgb1NpZGVFZmZlY3Q6IE9taXQ8Q29udHJvbFNpZGVFZmZlY3RzVHlwZSwgXCJmdWxseVF1YWxpZmllZE5hbWVcIj4pOiB2b2lkIHtcblx0XHRpZiAob1NpZGVFZmZlY3Quc291cmNlQ29udHJvbElkKSB7XG5cdFx0XHRjb25zdCBvQ29udHJvbFNpZGVFZmZlY3Q6IENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgPSB7XG5cdFx0XHRcdC4uLm9TaWRlRWZmZWN0LFxuXHRcdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IHNFbnRpdHlUeXBlICsgXCIvU2lkZUVmZmVjdHNGb3JDb250cm9sL1wiICsgb1NpZGVFZmZlY3Quc291cmNlQ29udHJvbElkXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgbUVudGl0eUNvbnRyb2xTaWRlRWZmZWN0cyA9IHRoaXMuX29TaWRlRWZmZWN0c1R5cGUuY29udHJvbFtzRW50aXR5VHlwZV0gfHwge307XG5cdFx0XHRtRW50aXR5Q29udHJvbFNpZGVFZmZlY3RzW29Db250cm9sU2lkZUVmZmVjdC5zb3VyY2VDb250cm9sSWRdID0gb0NvbnRyb2xTaWRlRWZmZWN0O1xuXHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sW3NFbnRpdHlUeXBlXSA9IG1FbnRpdHlDb250cm9sU2lkZUVmZmVjdHM7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIFNpZGVFZmZlY3RzIGFjdGlvbi5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzVHJpZ2dlckFjdGlvbiBOYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNHcm91cElkIFRoZSBncm91cCBJRCB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuXHQgKi9cblx0cHVibGljIGV4ZWN1dGVBY3Rpb24oc1RyaWdnZXJBY3Rpb246IFN0cmluZywgb0NvbnRleHQ6IENvbnRleHQsIHNHcm91cElkPzogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb1RyaWdnZXJBY3Rpb246IGFueSA9IG9Db250ZXh0LmdldE1vZGVsKCkuYmluZENvbnRleHQoc1RyaWdnZXJBY3Rpb24gKyBcIiguLi4pXCIsIG9Db250ZXh0KTtcblx0XHRvVHJpZ2dlckFjdGlvbi5leGVjdXRlKHNHcm91cElkIHx8IChvQ29udGV4dCBhcyBhbnkpLmdldEJpbmRpbmcoKS5nZXRVcGRhdGVHcm91cElkKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgY29udmVydGVkIE9EYXRhIG1ldGFNb2RlbC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IENvbnZlcnRlZCBPRGF0YSBtZXRhTW9kZWxcblx0ICovXG5cdHB1YmxpYyBnZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKTogQ29udmVydGVyT3V0cHV0IHtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXHRcdGNvbnN0IG9Db21wb25lbnQgPSBvQ29udGV4dC5zY29wZU9iamVjdCBhcyBhbnk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgPSBvQ29tcG9uZW50LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0cmV0dXJuIGNvbnZlcnRUeXBlcyhvTWV0YU1vZGVsLCB0aGlzLl9vQ2FwYWJpbGl0aWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBlbnRpdHkgdHlwZSBvZiBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBnZXRFbnRpdHlUeXBlRnJvbUNvbnRleHRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHRcblx0ICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZCB9IEVudGl0eSBUeXBlXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHNNZXRhUGF0aCA9IChvTWV0YU1vZGVsIGFzIGFueSkuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKSxcblx0XHRcdHNFbnRpdHlUeXBlID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoKVtcIiRUeXBlXCJdO1xuXHRcdHJldHVybiBzRW50aXR5VHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNFbnRpdHlUeXBlTmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwdWJsaWMgZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhzRW50aXR5VHlwZU5hbWU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMuX29TaWRlRWZmZWN0c1R5cGUub0RhdGEuZW50aXRpZXNbc0VudGl0eVR5cGVOYW1lXSB8fCB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25OYW1lIE5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhzQWN0aW9uTmFtZTogc3RyaW5nLCBvQ29udGV4dD86IENvbnRleHQpOiBBY3Rpb25TaWRlRWZmZWN0c1R5cGUgfCB1bmRlZmluZWQge1xuXHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0Y29uc3Qgc0VudGl0eVR5cGUgPSB0aGlzLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRpZiAoc0VudGl0eVR5cGUpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX29TaWRlRWZmZWN0c1R5cGUub0RhdGEuYWN0aW9uc1tzRW50aXR5VHlwZV0/LltzQWN0aW9uTmFtZV07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogR2VuZXJhdGVzIHRoZSBkaWN0aW9uYXJ5IGZvciB0aGUgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0gb0NhcGFiaWxpdGllcyBUaGUgY3VycmVudCBjYXBhYmlsaXRpZXNcblx0ICovXG5cdHB1YmxpYyBpbml0aWFsaXplU2lkZUVmZmVjdHMob0NhcGFiaWxpdGllcz86IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKTogdm9pZCB7XG5cdFx0dGhpcy5fb0NhcGFiaWxpdGllcyA9IG9DYXBhYmlsaXRpZXM7XG5cdFx0aWYgKCF0aGlzLl9iSW5pdGlhbGl6ZWQpIHtcblx0XHRcdGNvbnN0IG9Db252ZXJ0ZWRNZXRhTW9kZWwgPSB0aGlzLmdldENvbnZlcnRlZE1ldGFNb2RlbCgpO1xuXHRcdFx0b0NvbnZlcnRlZE1ldGFNb2RlbC5lbnRpdHlUeXBlcy5mb3JFYWNoKGVudGl0eVR5cGUgPT4ge1xuXHRcdFx0XHR0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLm9EYXRhLmVudGl0aWVzW2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRoaXMuX3JldHJpZXZlT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlKTtcblx0XHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5vRGF0YS5hY3Rpb25zW2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRoaXMuX3JldHJpZXZlT0RhdGFBY3Rpb25zU2lkZUVmZmVjdHMoZW50aXR5VHlwZSk7IC8vIG9ubHkgYm91bmQgYWN0aW9ucyBhcmUgYW5hbHl6ZWQgc2luY2UgdW5ib3VuZCBvbmVzIGRvbid0IGdldCBTaWRlRWZmZWN0c1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLl9iSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGEgY29udHJvbC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQ29udHJvbElkIENvbnRyb2wgSWRcblx0ICovXG5cdHB1YmxpYyByZW1vdmVDb250cm9sU2lkZUVmZmVjdHMoc0NvbnRyb2xJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0T2JqZWN0LmtleXModGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sKS5mb3JFYWNoKHNFbnRpdHlUeXBlID0+IHtcblx0XHRcdGlmICh0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVdW3NDb250cm9sSWRdKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVdW3NDb250cm9sSWRdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgU2lkZUVmZmVjdHMgb24gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFQYXRoRXhwcmVzc2lvbnMgVGFyZ2V0cyBvZiBTaWRlRWZmZWN0cyB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dCB3aGVyZSBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzR3JvdXBJZCBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3Rcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugb24gU2lkZUVmZmVjdHMgcmVxdWVzdFxuXHQgKi9cblx0cHVibGljIHJlcXVlc3RTaWRlRWZmZWN0cyhhUGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdLCBvQ29udGV4dDogQ29udGV4dCwgc0dyb3VwSWQ/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuXHRcdHRoaXMuX2xvZ1JlcXVlc3QoYVBhdGhFeHByZXNzaW9ucywgb0NvbnRleHQpO1xuXHRcdGxldCBvUHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuXHRcdC8qKlxuXHRcdCAqIENvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzIGVpdGhlciByZXR1cm5zIGEgcHJvbWlzZSBvciB0aHJvd3MgYSBuZXcgZXJyb3IuIFRoaXMgcmV0dXJuIGlzIGNhdWdodCBpZiBhbiBlcnJvciBpcyB0aHJvd25cblx0XHQgKiB0byBhdm9pZCBicmVha2luZyB0aGUgcHJvbWlzZSBjaGFpbi5cblx0XHQgKi9cblx0XHR0cnkge1xuXHRcdFx0b1Byb21pc2UgPSAob0NvbnRleHQgYXMgYW55KS5yZXF1ZXN0U2lkZUVmZmVjdHMoYVBhdGhFeHByZXNzaW9ucywgc0dyb3VwSWQpIGFzIFByb21pc2U8YW55Pjtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvUHJvbWlzZSA9IFByb21pc2UucmVqZWN0KGUpO1xuXHRcdH1cblx0XHRyZXR1cm4gb1Byb21pc2U7XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdCBTaWRlRWZmZWN0cyBmb3IgYSBuYXZpZ2F0aW9uIHByb3BlcnR5IG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc05hdmlnYXRpb25Qcm9wZXJ0eSBOYXZpZ2F0aW9uIHByb3BlcnR5XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgcmVxdWVzdCBvbiBTQVBVSTUgY29udGV4dFxuXHQgKi9cblx0cHVibGljIHJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShzTmF2aWdhdGlvblByb3BlcnR5OiBzdHJpbmcsIG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBzQmFzZUVudGl0eVR5cGUgPSB0aGlzLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0aWYgKHNCYXNlRW50aXR5VHlwZSkge1xuXHRcdFx0Y29uc3QgYVNpZGVFZmZlY3RzID0gdGhpcy5nZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzKHNCYXNlRW50aXR5VHlwZSk7XG5cdFx0XHRsZXQgYVRhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0W10gPSBbXTtcblx0XHRcdE9iamVjdC5rZXlzKGFTaWRlRWZmZWN0cylcblx0XHRcdFx0LmZpbHRlcihcblx0XHRcdFx0XHQvLyBLZWVwIHJlbGV2YW50IFNpZGVFZmZlY3RzXG5cdFx0XHRcdFx0c0Fubm90YXRpb25OYW1lID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IG9TaWRlRWZmZWN0czogT0RhdGFTaWRlRWZmZWN0c1R5cGUgPSBhU2lkZUVmZmVjdHNbc0Fubm90YXRpb25OYW1lXTtcblx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdChvU2lkZUVmZmVjdHMuU291cmNlUHJvcGVydGllcyB8fCBbXSkuc29tZShcblx0XHRcdFx0XHRcdFx0XHRvUHJvcGVydHlQYXRoID0+IG9Qcm9wZXJ0eVBhdGgudmFsdWUuaW5kZXhPZihzTmF2aWdhdGlvblByb3BlcnR5KSA+IC0xXG5cdFx0XHRcdFx0XHRcdCkgfHxcblx0XHRcdFx0XHRcdFx0KG9TaWRlRWZmZWN0cy5Tb3VyY2VFbnRpdGllcyB8fCBbXSkuc29tZShcblx0XHRcdFx0XHRcdFx0XHRvTmF2aWdhdGlvblByb3BlcnR5UGF0aCA9PiBvTmF2aWdhdGlvblByb3BlcnR5UGF0aC52YWx1ZSA9PT0gc05hdmlnYXRpb25Qcm9wZXJ0eVxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0KVxuXHRcdFx0XHQuZm9yRWFjaChzQW5ub3RhdGlvbk5hbWUgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG9TaWRlRWZmZWN0czogT0RhdGFTaWRlRWZmZWN0c1R5cGUgPSBhU2lkZUVmZmVjdHNbc0Fubm90YXRpb25OYW1lXTtcblx0XHRcdFx0XHRpZiAob1NpZGVFZmZlY3RzLlRyaWdnZXJBY3Rpb24pIHtcblx0XHRcdFx0XHRcdHRoaXMuZXhlY3V0ZUFjdGlvbihvU2lkZUVmZmVjdHMuVHJpZ2dlckFjdGlvbiwgb0NvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQoKG9TaWRlRWZmZWN0cy5UYXJnZXRFbnRpdGllcyBhcyBhbnlbXSkgfHwgW10pXG5cdFx0XHRcdFx0XHQuY29uY2F0KChvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcyBhcyBhbnlbXSkgfHwgW10pXG5cdFx0XHRcdFx0XHQuZm9yRWFjaChtVGFyZ2V0ID0+IGFUYXJnZXRzLnB1c2gobVRhcmdldCkpO1xuXHRcdFx0XHR9KTtcblx0XHRcdC8vIFJlbW92ZSBkdXBsaWNhdGUgcHJvcGVydGllc1xuXHRcdFx0YVRhcmdldHMgPSB0aGlzLl9yZW1vdmVEdXBsaWNhdGVUYXJnZXRzKGFUYXJnZXRzKTtcblx0XHRcdGlmIChhVGFyZ2V0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnJlcXVlc3RTaWRlRWZmZWN0cyhhVGFyZ2V0cywgb0NvbnRleHQpLmNhdGNoKG9FcnJvciA9PlxuXHRcdFx0XHRcdExvZy5lcnJvcihcIlNpZGVFZmZlY3RzIC0gRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBTaWRlRWZmZWN0cyBmb3IgTmF2aWdhdGlvbiBQcm9wZXJ0eSBcIiArIHNOYXZpZ2F0aW9uUHJvcGVydHksIG9FcnJvcilcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIHRoYXQgY29tZSBmcm9tIGNvbnRyb2xzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNFbnRpdHlUeXBlTmFtZSBFbnRpdHkgdHlwZSBOYW1lXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIGRpY3Rpb25hcnlcblx0ICovXG5cdHB1YmxpYyBnZXRDb250cm9sRW50aXR5U2lkZUVmZmVjdHMoc0VudGl0eVR5cGVOYW1lOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBDb250cm9sU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMuX29TaWRlRWZmZWN0c1R5cGUuY29udHJvbFtzRW50aXR5VHlwZU5hbWVdIHx8IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgdGhlIHRleHQgcHJvcGVydGllcyByZXF1aXJlZCBmb3IgU2lkZUVmZmVjdHNcblx0ICogSWYgYSBwcm9wZXJ0eSBoYXMgYW4gYXNzb2NpYXRlZCB0ZXh0IHRoZW4gdGhpcyB0ZXh0IG5lZWRzIHRvIGJlIGFkZGVkIGFzIHRhcmdldFByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3QgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUVudGl0eVR5cGUgRW50aXR5IHR5cGVcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgZGVmaW5pdGlvbiB3aXRoIGFkZGVkIHRleHQgcHJvcGVydGllc1xuXHQgKi9cblx0cHJpdmF0ZSBfYWRkUmVxdWlyZWRUZXh0UHJvcGVydGllcyhvU2lkZUVmZmVjdDogQmFzZVNpZGVFZmZlY3RzVHlwZSwgbUVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRjb25zdCBhSW5pdGlhbFByb3BlcnRpZXM6IHN0cmluZ1tdID0gKG9TaWRlRWZmZWN0LlRhcmdldFByb3BlcnRpZXMgfHwgW10pIGFzIHN0cmluZ1tdLFxuXHRcdFx0YUVudGl0aWVzUmVxdWVzdGVkOiBzdHJpbmdbXSA9IChvU2lkZUVmZmVjdC5UYXJnZXRFbnRpdGllcyB8fCBbXSkubWFwKG5hdmlnYXRpb24gPT4gbmF2aWdhdGlvbi4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdFx0bGV0IGFEZXJpdmVkUHJvcGVydGllczogRXh0cmFjdG9yUHJvcGVydHlJbmZvW10gPSBbXTtcblxuXHRcdGFJbml0aWFsUHJvcGVydGllcy5mb3JFYWNoKHNQcm9wZXJ0eVBhdGggPT4ge1xuXHRcdFx0Y29uc3QgYklzU3RhclByb3BlcnR5ID0gc1Byb3BlcnR5UGF0aC5lbmRzV2l0aChcIipcIiksIC8vIENhbiBiZSAnKicgb3IgJy4uLi9uYXZQcm9wLyonXG5cdFx0XHRcdHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmcgPSBzUHJvcGVydHlQYXRoLnN1YnN0cmluZygwLCBzUHJvcGVydHlQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSksXG5cdFx0XHRcdHNSZWxhdGl2ZVBhdGggPSBzTmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoICsgXCIvXCIgOiBcIlwiLFxuXHRcdFx0XHRtVGFyZ2V0OiBhbnkgPSBtRW50aXR5VHlwZS5yZXNvbHZlUGF0aChzTmF2aWdhdGlvblByb3BlcnR5UGF0aCkgfHwgbUVudGl0eVR5cGU7XG5cblx0XHRcdGlmIChtVGFyZ2V0KSB7XG5cdFx0XHRcdC8vIG1UYXJnZXQgY2FuIGJlIGFuIGVudGl0eSB0eXBlLCBuYXZpZ2F0aW9uUHJvcGVydHkgb3Igb3IgYSBjb21wbGV4VHlwZVxuXHRcdFx0XHRjb25zdCBhVGFyZ2V0RW50aXR5UHJvcGVydGllczogUHJvcGVydHlbXSA9XG5cdFx0XHRcdFx0KG1UYXJnZXQgYXMgRW50aXR5VHlwZSkuZW50aXR5UHJvcGVydGllcyB8fFxuXHRcdFx0XHRcdChtVGFyZ2V0IGFzIFByb3BlcnR5KS50YXJnZXRUeXBlPy5wcm9wZXJ0aWVzIHx8XG5cdFx0XHRcdFx0KG1UYXJnZXQgYXMgTmF2aWdhdGlvblByb3BlcnR5KS50YXJnZXRUeXBlLmVudGl0eVByb3BlcnRpZXM7XG5cdFx0XHRcdGlmIChhVGFyZ2V0RW50aXR5UHJvcGVydGllcykge1xuXHRcdFx0XHRcdGlmIChiSXNTdGFyUHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdGlmIChhVGFyZ2V0RW50aXR5UHJvcGVydGllcykge1xuXHRcdFx0XHRcdFx0XHQvLyBBZGQgYWxsIHJlcXVpcmVkIHByb3BlcnRpZXMgYmVoaW5kIHRoZSAqXG5cdFx0XHRcdFx0XHRcdGFFbnRpdGllc1JlcXVlc3RlZC5wdXNoKHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0XHRcdFx0XHRcdFx0YURlcml2ZWRQcm9wZXJ0aWVzID0gYURlcml2ZWRQcm9wZXJ0aWVzLmNvbmNhdChcblx0XHRcdFx0XHRcdFx0XHRhVGFyZ2V0RW50aXR5UHJvcGVydGllcy5tYXAobVByb3BlcnR5ID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5hdmlnYXRpb25QYXRoOiBzUmVsYXRpdmVQYXRoLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eTogbVByb3BlcnR5XG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGFEZXJpdmVkUHJvcGVydGllcy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0cHJvcGVydHk6IGFUYXJnZXRFbnRpdHlQcm9wZXJ0aWVzLmZpbmQoXG5cdFx0XHRcdFx0XHRcdFx0bVByb3BlcnR5ID0+IG1Qcm9wZXJ0eS5uYW1lID09PSBzUHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKS5wb3AoKVxuXHRcdFx0XHRcdFx0XHQpIGFzIFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRuYXZpZ2F0aW9uUGF0aDogc1JlbGF0aXZlUGF0aFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdExvZy5pbmZvKFwiU2lkZUVmZmVjdHMgLSBUaGUgZW50aXR5IHR5cGUgYXNzb2NpYXRlZCB0byBwcm9wZXJ0eSBwYXRoIFwiICsgc1Byb3BlcnR5UGF0aCArIFwiIGNhbm5vdCBiZSByZXNvbHZlZFwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0TG9nLmluZm8oXCJTaWRlRWZmZWN0cyAtIFRoZSBwcm9wZXJ0eSBwYXRoIFwiICsgc1Byb3BlcnR5UGF0aCArIFwiIGNhbm5vdCBiZSByZXNvbHZlZFwiKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGFEZXJpdmVkUHJvcGVydGllcy5mb3JFYWNoKG1Qcm9wZXJ0eUluZm8gPT4ge1xuXHRcdFx0aWYgKG1Qcm9wZXJ0eUluZm8ucHJvcGVydHkpIHtcblx0XHRcdFx0Y29uc3Qgc1RhcmdldFRleHRQYXRoID0gKG1Qcm9wZXJ0eUluZm8ucHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dCBhcyBhbnkpPy5wYXRoLFxuXHRcdFx0XHRcdHNUZXh0UGF0aEZyb21Jbml0aWFsRW50aXR5ID0gbVByb3BlcnR5SW5mby5uYXZpZ2F0aW9uUGF0aCArIHNUYXJnZXRUZXh0UGF0aDtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoZSBwcm9wZXJ0eSBUZXh0IG11c3QgYmUgYWRkZWQgb25seSBpZiB0aGUgcHJvcGVydHkgaXNcblx0XHRcdFx0ICogLSBub3QgcGFydCBvZiBhIHN0YXIgcHJvcGVydHkgKC5pLmUgJyonIG9yICduYXZpZ2F0aW9uLyonKSBvciBhIHRhcmdldGVkIEVudGl0eVxuXHRcdFx0XHQgKiAtIG5vdCBpbmNsdWRlIGludG8gdGhlIGluaXRpYWwgdGFyZ2V0ZWQgcHJvcGVydGllcyBvZiBTaWRlRWZmZWN0c1xuXHRcdFx0XHQgKiAgSW5kZWVkIGluIHRoZSB0d28gbGlzdGVkIGNhc2VzLCB0aGUgcHJvcGVydHkgY29udGFpbmluZyB0ZXh0IHdpbGwgYmUvaXMgcmVxdWVzdGVkIGJ5IGluaXRpYWwgU2lkZUVmZmVjdHMgY29uZmlndXJhdGlvbi5cblx0XHRcdFx0ICovXG5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHNUYXJnZXRUZXh0UGF0aCAmJlxuXHRcdFx0XHRcdGFFbnRpdGllc1JlcXVlc3RlZC5pbmRleE9mKHNUZXh0UGF0aEZyb21Jbml0aWFsRW50aXR5LnN1YnN0cmluZygwLCBzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eS5sYXN0SW5kZXhPZihcIi9cIikpKSA9PT1cblx0XHRcdFx0XHRcdC0xICYmXG5cdFx0XHRcdFx0YUluaXRpYWxQcm9wZXJ0aWVzLmluZGV4T2Yoc1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkpID09PSAtMVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRvU2lkZUVmZmVjdC5UYXJnZXRQcm9wZXJ0aWVzLnB1c2goc1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gb1NpZGVFZmZlY3Q7XG5cdH1cblx0LyoqXG5cdCAqIENvbnZlcnRzIFNpZGVFZmZlY3RzIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBDb252ZXJ0cyBTaWRlRWZmZWN0cyB0YXJnZXRzIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBSZW1vdmVzIGJpbmRpbmcgcGFyYW1ldGVyIGZyb20gU2lkZUVmZmVjdHMgdGFyZ2V0cyBwcm9wZXJ0aWVzXG5cdCAqICAtIEFkZHMgdGhlIHRleHQgcHJvcGVydGllc1xuXHQgKiAgLSBSZXBsYWNlcyBUYXJnZXRQcm9wZXJ0aWVzIGhhdmluZyByZWZlcmVuY2UgdG8gU291cmNlIFByb3BlcnRpZXMgZm9yIGEgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNFbnRpdHlUeXBlIE5hbWUgb2YgdGhlIGVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQmluZGluZ1BhcmFtZXRlciBOYW1lIG9mIHRoZSBiaW5kaW5nIHBhcmFtZXRlclxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwcml2YXRlIF9jb252ZXJ0U2lkZUVmZmVjdHMoXG5cdFx0b1NpZGVFZmZlY3RzOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHwgQmFzZUFubm90YXRpb25TaWRlRWZmZWN0c1R5cGUsXG5cdFx0c0VudGl0eVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0XHRzQmluZGluZ1BhcmFtZXRlcj86IHN0cmluZ1xuXHQpOiBPRGF0YVNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0Y29uc3QgbUVudGl0eVR5cGUgPSAodGhpcy5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKSBhcyBDb252ZXJ0ZXJPdXRwdXQpLmVudGl0eVR5cGVzLmZpbmQob0VudGl0eVR5cGUgPT4ge1xuXHRcdFx0cmV0dXJuIG9FbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSA9PT0gc0VudGl0eVR5cGU7XG5cdFx0fSk7XG5cdFx0Y29uc3Qgb1RlbXBTaWRlRWZmZWN0cyA9IHRoaXMuX3JlbW92ZUJpbmRpbmdQYXJhbWV0ZXIodGhpcy5fY29udmVydFRhcmdldHNGb3JtYXQob1NpZGVFZmZlY3RzKSwgc0JpbmRpbmdQYXJhbWV0ZXIpO1xuXHRcdHJldHVybiBtRW50aXR5VHlwZVxuXHRcdFx0PyB0aGlzLl9yZXBsYWNlUmVmZXJlbmNlZFByb3BlcnRpZXModGhpcy5fYWRkUmVxdWlyZWRUZXh0UHJvcGVydGllcyhvVGVtcFNpZGVFZmZlY3RzLCBtRW50aXR5VHlwZSksIG1FbnRpdHlUeXBlKVxuXHRcdFx0OiBvVGVtcFNpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIFNpZGVFZmZlY3RzIHRhcmdldHMgKFRhcmdldEVudGl0aWVzIGFuZCBUYXJnZXRQcm9wZXJ0aWVzKSB0byBleHBlY3RlZCBmb3JtYXRcblx0ICogIC0gVGFyZ2V0UHJvcGVydGllcyBhcyBhcnJheSBvZiBzdHJpbmdcblx0ICogIC0gVGFyZ2V0RW50aXRpZXMgYXMgYXJyYXkgb2Ygb2JqZWN0IHdpdGggcHJvcGVydHkgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGguXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHJldHVybnMge29iamVjdH0gQ29udmVydGVkIFNpZGVFZmZlY3RzXG5cdCAqL1xuXHRwcml2YXRlIF9jb252ZXJ0VGFyZ2V0c0Zvcm1hdChvU2lkZUVmZmVjdHM6IEJhc2VTaWRlRWZmZWN0c1R5cGUgfCBCYXNlQW5ub3RhdGlvblNpZGVFZmZlY3RzVHlwZSk6IEJhc2VTaWRlRWZmZWN0c1R5cGUge1xuXHRcdGNvbnN0IFRhcmdldFByb3BlcnRpZXM6IHN0cmluZ1tdID0gKChvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcyBhcyBhbnlbXSkgfHwgW10pLnJlZHVjZShmdW5jdGlvbihhVGFyZ2V0UHJvcGVydGllcywgdlRhcmdldCkge1xuXHRcdFx0XHRjb25zdCBzVGFyZ2V0ID0gKHR5cGVvZiB2VGFyZ2V0ID09PSBcInN0cmluZ1wiICYmIHZUYXJnZXQpIHx8ICh2VGFyZ2V0LnR5cGUgPT09IFwiUHJvcGVydHlQYXRoXCIgJiYgdlRhcmdldC52YWx1ZSk7XG5cdFx0XHRcdGlmIChzVGFyZ2V0KSB7XG5cdFx0XHRcdFx0YVRhcmdldFByb3BlcnRpZXMucHVzaChzVGFyZ2V0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJTaWRlRWZmZWN0cyAtIEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgVGFyZ2V0UHJvcGVydGllcyBmb3IgU2lkZUVmZmVjdHNcIiArIG9TaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBhVGFyZ2V0UHJvcGVydGllcztcblx0XHRcdH0sIFtdKSxcblx0XHRcdFRhcmdldEVudGl0aWVzOiBTaWRlRWZmZWN0c1RhcmdldEVudGl0eVR5cGVbXSA9ICgob1NpZGVFZmZlY3RzLlRhcmdldEVudGl0aWVzIGFzIGFueVtdKSB8fCBbXSkubWFwKG1UYXJnZXRFbnRpdHkgPT4ge1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogIFNpZGVFZmZlY3RzIHRoYXQgY29tZXMgZnJvbSBTQVAgRkUgZ2V0IFRhcmdldEVudGl0aWVzIHdpdGggJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggd2hlcmVhc1xuXHRcdFx0XHQgKiAgb25lcyBjb21pbmcgZnJvbSB0aGUgY29udmVydGVkIE9EYXRhIG1vZGVsIGdldHMgYSBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoIGZvcm1hdFxuXHRcdFx0XHQgKlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0cmV0dXJuIHsgXCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiOiBtVGFyZ2V0RW50aXR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIHx8IG1UYXJnZXRFbnRpdHkudmFsdWUgfHwgXCJcIiB9O1xuXHRcdFx0fSk7XG5cdFx0cmV0dXJuIHsgLi4ub1NpZGVFZmZlY3RzLCAuLi57IFRhcmdldFByb3BlcnRpZXMsIFRhcmdldEVudGl0aWVzIH0gfTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIFNpZGVFZmZlY3RzIHJlbGF0ZWQgdG8gYW4gZW50aXR5IHR5cGUgb3IgYWN0aW9uIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIFNlcnZpY2Vcblx0ICogSW50ZXJuYWwgcm91dGluZSB0byBnZXQsIGZyb20gY29udmVydGVkIG9EYXRhIG1ldGFNb2RlbCwgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byBhIHNwZWNpZmljIGVudGl0eSB0eXBlIG9yIGFjdGlvblxuXHQgKiBhbmQgdG8gY29udmVydCB0aGVzZSBTaWRlRWZmZWN0cyB3aXRoIGV4cGVjdGVkIGZvcm1hdC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU291cmNlIEVudGl0eSB0eXBlIG9yIGFjdGlvblxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBBcnJheSBvZiBTaWRlRWZmZWN0c1xuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0U2lkZUVmZmVjdHNGcm9tU291cmNlKG9Tb3VyY2U6IGFueSk6IE9EYXRhU2lkZUVmZmVjdHNUeXBlW10ge1xuXHRcdGNvbnN0IGFTaWRlRWZmZWN0czogT0RhdGFTaWRlRWZmZWN0c1R5cGVbXSA9IFtdO1xuXHRcdGNvbnN0IGF1dGhvcml6ZWRUeXBlcyA9IFtcIkVudGl0eVR5cGVcIiwgXCJBY3Rpb25cIl07XG5cdFx0aWYgKG9Tb3VyY2UuX3R5cGUgJiYgYXV0aG9yaXplZFR5cGVzLmluZGV4T2Yob1NvdXJjZS5fdHlwZSkgPiAtMSkge1xuXHRcdFx0Y29uc3QgbUVudGl0eVR5cGU6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQgPSBvU291cmNlLl90eXBlID09PSBcIkVudGl0eVR5cGVcIiA/IG9Tb3VyY2UgOiBvU291cmNlLnNvdXJjZUVudGl0eVR5cGU7XG5cdFx0XHRpZiAobUVudGl0eVR5cGUpIHtcblx0XHRcdFx0Y29uc3QgbUNvbW1vbkFubm90YXRpb246IGFueSA9IG9Tb3VyY2UuYW5ub3RhdGlvbnM/LkNvbW1vbiB8fCB7fTtcblx0XHRcdFx0Y29uc3QgbUJpbmRpbmdQYXJhbWV0ZXIgPSAoKG9Tb3VyY2UgYXMgQWN0aW9uKS5wYXJhbWV0ZXJzIHx8IFtdKS5maW5kKFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXIgPT4gbVBhcmFtZXRlci50eXBlID09PSAobUVudGl0eVR5cGUgfHwgb1NvdXJjZSkuZnVsbHlRdWFsaWZpZWROYW1lXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IHNCaW5kaW5nUGFyYW1ldGVyID0gbUJpbmRpbmdQYXJhbWV0ZXIgPyBtQmluZGluZ1BhcmFtZXRlci5mdWxseVF1YWxpZmllZE5hbWUuc3BsaXQoXCIvXCIpWzFdIDogXCJcIjtcblx0XHRcdFx0T2JqZWN0LmtleXMobUNvbW1vbkFubm90YXRpb24pXG5cdFx0XHRcdFx0LmZpbHRlcihzQW5ub3RhdGlvbk5hbWUgPT4gbUNvbW1vbkFubm90YXRpb25bc0Fubm90YXRpb25OYW1lXS4kVHlwZSA9PT0gQ29tbW9uQW5ub3RhdGlvblR5cGVzLlNpZGVFZmZlY3RzVHlwZSlcblx0XHRcdFx0XHQuZm9yRWFjaChzQW5ub3RhdGlvbk5hbWUgPT4ge1xuXHRcdFx0XHRcdFx0YVNpZGVFZmZlY3RzLnB1c2goXG5cdFx0XHRcdFx0XHRcdHRoaXMuX2NvbnZlcnRTaWRlRWZmZWN0cyhtQ29tbW9uQW5ub3RhdGlvbltzQW5ub3RhdGlvbk5hbWVdLCBtRW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsIHNCaW5kaW5nUGFyYW1ldGVyKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGFTaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2dzIFNpZGVFZmZlY3RzIHJlcXVlc3QuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhUGF0aEV4cHJlc3Npb25zIFNpZGVFZmZlY3RzIHRhcmdldHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHRcblx0ICovXG5cdHByaXZhdGUgX2xvZ1JlcXVlc3QoYVBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXSwgb0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRjb25zdCBzVGFyZ2V0UGF0aHMgPSBhUGF0aEV4cHJlc3Npb25zLnJlZHVjZShmdW5jdGlvbihzUGF0aHMsIG1UYXJnZXQpIHtcblx0XHRcdHJldHVybiBzUGF0aHMgKyBcIlxcblxcdFxcdFwiICsgKChtVGFyZ2V0IGFzIFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZSkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggfHwgbVRhcmdldCB8fCBcIlwiKTtcblx0XHR9LCBcIlwiKTtcblx0XHRMb2cuZGVidWcoXCJTaWRlRWZmZWN0cyAtIFJlcXVlc3Q6XFxuXFx0Q29udGV4dCBwYXRoIDogXCIgKyBvQ29udGV4dC5nZXRQYXRoKCkgKyBcIlxcblxcdFByb3BlcnR5IHBhdGhzIDpcIiArIHNUYXJnZXRQYXRocyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBuYW1lIG9mIGJpbmRpbmcgcGFyYW1ldGVyIG9uIFNpZGVFZmZlY3RzIHRhcmdldHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNCaW5kaW5nUGFyYW1ldGVyTmFtZSBOYW1lIG9mIGJpbmRpbmcgcGFyYW1ldGVyXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHByaXZhdGUgX3JlbW92ZUJpbmRpbmdQYXJhbWV0ZXIob1NpZGVFZmZlY3RzOiBCYXNlU2lkZUVmZmVjdHNUeXBlLCBzQmluZGluZ1BhcmFtZXRlck5hbWU/OiBzdHJpbmcpOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRpZiAoc0JpbmRpbmdQYXJhbWV0ZXJOYW1lKSB7XG5cdFx0XHRjb25zdCBhVGFyZ2V0cyA9IFtcIlRhcmdldFByb3BlcnRpZXNcIiwgXCJUYXJnZXRFbnRpdGllc1wiXTtcblx0XHRcdGFUYXJnZXRzLmZvckVhY2goc1RhcmdldCA9PiB7XG5cdFx0XHRcdGxldCBtVGFyZ2V0ID0gKG9TaWRlRWZmZWN0cyBhcyBhbnkpW3NUYXJnZXRdO1xuXHRcdFx0XHRpZiAobVRhcmdldCkge1xuXHRcdFx0XHRcdG1UYXJnZXQgPSBtVGFyZ2V0Lm1hcCgobVByb3BlcnR5OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGJOYXZpZ2F0aW9uUHJvcGVydHlQYXRoID0gbVByb3BlcnR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoICE9PSB1bmRlZmluZWQ7IC8vIE5lZWQgdG8gdGVzdCB3aXRoIHVuZGVmaW5lZCBzaW5jZSAgbVByb3BlcnR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIGNvdWxkIGJlIFwiXCIgKGVtcHR5IHN0cmluZylcblx0XHRcdFx0XHRcdGNvbnN0IHNWYWx1ZSA9IChiTmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IG1Qcm9wZXJ0eS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA6IG1Qcm9wZXJ0eSkucmVwbGFjZShcblx0XHRcdFx0XHRcdFx0bmV3IFJlZ0V4cChcIl5cIiArIHNCaW5kaW5nUGFyYW1ldGVyTmFtZSArIFwiPy5cIiksXG5cdFx0XHRcdFx0XHRcdFwiXCJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gYk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPyB7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzVmFsdWUgfSA6IHNWYWx1ZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQob1NpZGVFZmZlY3RzIGFzIGFueSlbc1RhcmdldF0gPSBtVGFyZ2V0O1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlIGR1cGxpY2F0ZXMgaW4gU2lkZUVmZmVjdHMgdGFyZ2V0cy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFUYXJnZXRzIFNpZGVFZmZlY3RzIHRhcmdldHNcblx0ICogQHJldHVybnMge0FycmF5fSBTaWRlRWZmZWN0cyB0YXJnZXRzIHdpdGhvdXQgZHVwbGljYXRlc1xuXHQgKi9cblx0cHJpdmF0ZSBfcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhhVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRbXSk6IFNpZGVFZmZlY3RzVGFyZ2V0W10ge1xuXHRcdHJldHVybiBhVGFyZ2V0cy5maWx0ZXIoXG5cdFx0XHQobVRhcmdldDogYW55LCBpSW5kZXgsIGFUYXJnZXRzKSA9PlxuXHRcdFx0XHRhVGFyZ2V0cy5maW5kSW5kZXgoKG1TZWFyY2hUYXJnZXQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRtU2VhcmNoVGFyZ2V0ID09PSBtVGFyZ2V0IHx8IC8vIFByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0KG1UYXJnZXQuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggJiYgbVNlYXJjaFRhcmdldC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA9PT0gbVRhcmdldC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCkgLy8gTmF2aWdhdGlvblByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pID09PSBpSW5kZXhcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcGxhY2VzIFRhcmdldFByb3BlcnRpZXMgaGF2aW5nIHJlZmVyZW5jZSB0byBTb3VyY2UgUHJvcGVydGllcyBmb3IgYSBTaWRlRWZmZWN0c1xuXHQgKiBJZiBhIFNpZGVFZmZlY3RzIFNvdXJjZSBQcm9wZXJ0eSBpcyBhbiBuYXZpZ2F0aW9uIGVudGl0eSByZWZlcmVuY2UsIHRoZSBTaWRlRWZmZWN0cyBUYXJnZXQgUHJvcGVydGllcyBjYW5ub3QgYmUgYSBwcm9wZXJ0eSBvZiB0aGlzIG5hdmlnYXRpb24gZW50aXR5LlxuXHQgKiBJbmRlZWQgdGhpcyBjb25maWd1cmF0aW9uIGxlYWRzIHRvIGVycm9yIGludG8gdGhlIE9EYXRhIFY0IE1vZGVsIHNpbmNlIHJlc3BvbnNlIGNhbm5vdCBiZSBwcm9jZXNzZWQgYmVjYXVzZSB0aGlzIHdvdWxkIG1lYW4gdGhhdCB3ZSBtZXJnZSBwcm9wZXJ0aWVzIG9mIHRoZSBuZXcgdGFyZ2V0IGludG8gdGhlIG9sZCB0YXJnZXQgb2YgdGhlIG5hdmlnYXRpb24gcHJvcGVydHkuXG5cdCAqIEluIG9yZGVyIHRvIHJlcXVlc3QgbmV3IHZhbHVlIG9mIHRoZXNlIHRhcmdldCBwcm9wZXJ0aWVzIHRoZSBTaWRlRWZmZWN0cyB3aWxsIHJlcXVlc3QgZm9yIHRoZSBlbnRpcmUgRW50aXR5IGluc3RlYWQgb2YganVzdCBhIHNldCBvZiBwcm9wZXJ0aWVzLlxuXHQgKiBGb3IgdGhlIGZpcnN0IHZlcnNpb24sIHdlIHJlbW92ZSBhbGwgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFuZCByZXBsYWNlIHRoZW0gYnkgdGFyZ2V0RW50aXRpZXMuIFRoaXMgY2hhbmdlIGNvdWxkIGJlIGltcHJvdmVkIGluIG5leHQgdmVyc2lvbi5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdCBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRW50aXR5VHlwZSAgRW50aXR5IHR5cGVcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgZGVmaW5pdGlvbiB3aXRob3V0IHJlZmVyZW5jZWQgdGFyZ2V0IHByb3BlcnRpZXNcblx0ICovXG5cdHByaXZhdGUgX3JlcGxhY2VSZWZlcmVuY2VkUHJvcGVydGllcyhvU2lkZUVmZmVjdDogQmFzZVNpZGVFZmZlY3RzVHlwZSwgbUVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRsZXQgYlNpZGVFZmZlY3RzQ2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlO1xuXHRcdGNvbnN0IGFFbnRpdGllczogc3RyaW5nW10gPVxuXHRcdFx0XHQob1NpZGVFZmZlY3QuVGFyZ2V0RW50aXRpZXMgfHwgW10pLm1hcChtTmF2aWdhdGlvbiA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIG1OYXZpZ2F0aW9uLiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoO1xuXHRcdFx0XHR9KSB8fCBbXSxcblx0XHRcdGFQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0b1NpZGVFZmZlY3QuVGFyZ2V0UHJvcGVydGllcy5mb3JFYWNoKHNQcm9wZXJ0eVBhdGggPT4ge1xuXHRcdFx0bGV0IGJUYXJnZXRDaGFuZ2VkID0gZmFsc2U7XG5cdFx0XHRjb25zdCBpTGFzdFBhdGhTZXBhcmF0b3JJbmRleCA9IHNQcm9wZXJ0eVBhdGgubGFzdEluZGV4T2YoXCIvXCIpO1xuXHRcdFx0aWYgKGlMYXN0UGF0aFNlcGFyYXRvckluZGV4ICE9PSAtMSkge1xuXHRcdFx0XHRjb25zdCBzTmF2aWdhdGlvblBhdGggPSBzUHJvcGVydHlQYXRoLnN1YnN0cmluZygwLCBpTGFzdFBhdGhTZXBhcmF0b3JJbmRleCk7XG5cdFx0XHRcdGNvbnN0IG9UYXJnZXQgPSBtRW50aXR5VHlwZS5yZXNvbHZlUGF0aChzTmF2aWdhdGlvblBhdGgpO1xuXHRcdFx0XHRpZiAob1RhcmdldCAmJiBvVGFyZ2V0Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiKSB7XG5cdFx0XHRcdFx0Ly9UZXN0IGlmIGl0J3Mgbm90IGEgcHJvcGVydHkgYm91bmQgb24gY29tcGxleFR5cGUgKF9Db21wbGV4VHlwZS9NeVByb3BlcnR5KVxuXHRcdFx0XHRcdGJTaWRlRWZmZWN0c0NoYW5nZWQgPSB0cnVlO1xuXHRcdFx0XHRcdGJUYXJnZXRDaGFuZ2VkID0gdHJ1ZTtcblx0XHRcdFx0XHRpZiAoIWFFbnRpdGllcy5pbmNsdWRlcyhzTmF2aWdhdGlvblBhdGgpKSB7XG5cdFx0XHRcdFx0XHRhRW50aXRpZXMucHVzaChzTmF2aWdhdGlvblBhdGgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFiVGFyZ2V0Q2hhbmdlZCkge1xuXHRcdFx0XHRhUHJvcGVydGllcy5wdXNoKHNQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aWYgKGJTaWRlRWZmZWN0c0NoYW5nZWQpIHtcblx0XHRcdG9TaWRlRWZmZWN0LlRhcmdldFByb3BlcnRpZXMgPSBhUHJvcGVydGllcztcblx0XHRcdG9TaWRlRWZmZWN0LlRhcmdldEVudGl0aWVzID0gYUVudGl0aWVzLm1hcChzTmF2aWdhdGlvblBhdGggPT4ge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzTmF2aWdhdGlvblBhdGhcblx0XHRcdFx0fTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBvU2lkZUVmZmVjdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIFNpZGVFZmZlY3RzIGFjdGlvbiB0eXBlIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIFNlcnZpY2Vcblx0ICogSW50ZXJuYWwgcm91dGluZSB0byBnZXQsIGZyb20gY29udmVydGVkIG9EYXRhIG1ldGFNb2RlbCwgU2lkZUVmZmVjdHMgb24gYWN0aW9uc1xuXHQgKiByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgYW5kIHRvIGNvbnZlcnQgdGhlc2UgU2lkZUVmZmVjdHMgd2l0aFxuXHQgKiBleHBlY3RlZCBmb3JtYXQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUVudGl0eVR5cGUgRW50aXR5IHR5cGVcblx0ICogQHJldHVybnMge29iamVjdH0gRW50aXR5IHR5cGUgU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHJpdmF0ZSBfcmV0cmlldmVPRGF0YUFjdGlvbnNTaWRlRWZmZWN0cyhtRW50aXR5VHlwZTogRW50aXR5VHlwZSk6IFJlY29yZDxzdHJpbmcsIEFjdGlvblNpZGVFZmZlY3RzVHlwZT4ge1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0czogUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPiA9IHt9O1xuXHRcdGNvbnN0IGFBY3Rpb25zID0gbUVudGl0eVR5cGUuYWN0aW9ucztcblx0XHRpZiAoYUFjdGlvbnMpIHtcblx0XHRcdE9iamVjdC5rZXlzKGFBY3Rpb25zKS5mb3JFYWNoKHNBY3Rpb25OYW1lID0+IHtcblx0XHRcdFx0Y29uc3Qgb0FjdGlvbiA9IG1FbnRpdHlUeXBlLmFjdGlvbnNbc0FjdGlvbk5hbWVdO1xuXHRcdFx0XHRjb25zdCB0cmlnZ2VyQWN0aW9uczogU3RyaW5nW10gPSBbXTtcblx0XHRcdFx0bGV0IHBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXSA9IFtdO1xuXHRcdFx0XHRsZXQgYVRhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0W10gPSBbXTtcblxuXHRcdFx0XHR0aGlzLl9nZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2Uob0FjdGlvbikuZm9yRWFjaChvU2lkZUVmZmVjdCA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgc1RyaWdnZXJBY3Rpb24gPSBvU2lkZUVmZmVjdC5UcmlnZ2VyQWN0aW9uO1xuXHRcdFx0XHRcdGFUYXJnZXRzID0gYVRhcmdldHMuY29uY2F0KG9TaWRlRWZmZWN0LlRhcmdldEVudGl0aWVzIHx8IFtdKS5jb25jYXQoKG9TaWRlRWZmZWN0LlRhcmdldFByb3BlcnRpZXMgYXMgYW55W10pIHx8IFtdKTtcblx0XHRcdFx0XHRpZiAoc1RyaWdnZXJBY3Rpb24gJiYgdHJpZ2dlckFjdGlvbnMuaW5kZXhPZihzVHJpZ2dlckFjdGlvbikgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHR0cmlnZ2VyQWN0aW9ucy5wdXNoKHNUcmlnZ2VyQWN0aW9uKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRwYXRoRXhwcmVzc2lvbnMgPSB0aGlzLl9yZW1vdmVEdXBsaWNhdGVUYXJnZXRzKGFUYXJnZXRzKTtcblx0XHRcdFx0b1NpZGVFZmZlY3RzW3NBY3Rpb25OYW1lXSA9IHsgcGF0aEV4cHJlc3Npb25zLCB0cmlnZ2VyQWN0aW9ucyB9O1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cyBlbnRpdHkgdHlwZSB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdCAqIEludGVybmFsIHJvdXRpbmUgdG8gZ2V0LCBmcm9tIGNvbnZlcnRlZCBvRGF0YSBtZXRhTW9kZWwsIFNpZGVFZmZlY3RzXG5cdCAqIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSBhbmQgdG8gY29udmVydCB0aGVzZSBTaWRlRWZmZWN0cyB3aXRoXG5cdCAqIGV4cGVjdGVkIGZvcm1hdC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRW50aXR5VHlwZSBFbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBFbnRpdHkgdHlwZSBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwcml2YXRlIF9yZXRyaWV2ZU9EYXRhRW50aXR5U2lkZUVmZmVjdHMobUVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBSZWNvcmQ8c3RyaW5nLCBPRGF0YVNpZGVFZmZlY3RzVHlwZT4ge1xuXHRcdGNvbnN0IG9FbnRpdHlTaWRlRWZmZWN0czogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+ID0ge307XG5cdFx0dGhpcy5fZ2V0U2lkZUVmZmVjdHNGcm9tU291cmNlKG1FbnRpdHlUeXBlKS5mb3JFYWNoKG9TaWRlRWZmZWN0cyA9PiB7XG5cdFx0XHRvRW50aXR5U2lkZUVmZmVjdHNbb1NpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBvU2lkZUVmZmVjdHM7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIG9FbnRpdHlTaWRlRWZmZWN0cztcblx0fVxuXG5cdGdldEludGVyZmFjZSgpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59XG5cbmNsYXNzIFNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkgZXh0ZW5kcyBTZXJ2aWNlRmFjdG9yeTxTaWRlRWZmZWN0c1NldHRpbmdzPiB7XG5cdGNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dDogU2VydmljZUNvbnRleHQ8U2lkZUVmZmVjdHNTZXR0aW5ncz4pIHtcblx0XHRjb25zdCBTaWRlRWZmZWN0c1NlcnZpY2VTZXJ2aWNlID0gbmV3IFNpZGVFZmZlY3RzU2VydmljZShvU2VydmljZUNvbnRleHQpO1xuXHRcdHJldHVybiBTaWRlRWZmZWN0c1NlcnZpY2VTZXJ2aWNlLmluaXRQcm9taXNlO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNpZGVFZmZlY3RzU2VydmljZUZhY3Rvcnk7XG4iXX0=
688
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkudHMiXSwibmFtZXMiOlsiU2lkZUVmZmVjdHNTZXJ2aWNlIiwiX29TaWRlRWZmZWN0c1R5cGUiLCJvRGF0YSIsImVudGl0aWVzIiwiYWN0aW9ucyIsImNvbnRyb2wiLCJfYkluaXRpYWxpemVkIiwiaW5pdFByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNFbnRpdHlUeXBlIiwib1NpZGVFZmZlY3QiLCJzb3VyY2VDb250cm9sSWQiLCJvQ29udHJvbFNpZGVFZmZlY3QiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJtRW50aXR5Q29udHJvbFNpZGVFZmZlY3RzIiwic1RyaWdnZXJBY3Rpb24iLCJvQ29udGV4dCIsInNHcm91cElkIiwib1RyaWdnZXJBY3Rpb24iLCJnZXRNb2RlbCIsImJpbmRDb250ZXh0IiwiZXhlY3V0ZSIsImdldEJpbmRpbmciLCJnZXRVcGRhdGVHcm91cElkIiwiZ2V0Q29udGV4dCIsIm9Db21wb25lbnQiLCJzY29wZU9iamVjdCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJjb252ZXJ0VHlwZXMiLCJfb0NhcGFiaWxpdGllcyIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsImdldE9iamVjdCIsInNFbnRpdHlUeXBlTmFtZSIsInNBY3Rpb25OYW1lIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwidW5kZWZpbmVkIiwib0NhcGFiaWxpdGllcyIsIm9Db252ZXJ0ZWRNZXRhTW9kZWwiLCJnZXRDb252ZXJ0ZWRNZXRhTW9kZWwiLCJlbnRpdHlUeXBlcyIsImZvckVhY2giLCJlbnRpdHlUeXBlIiwiX3JldHJpZXZlT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsIl9yZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzIiwic0NvbnRyb2xJZCIsIk9iamVjdCIsImtleXMiLCJhUGF0aEV4cHJlc3Npb25zIiwiX2xvZ1JlcXVlc3QiLCJvUHJvbWlzZSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImUiLCJyZWplY3QiLCJzTmF2aWdhdGlvblByb3BlcnR5Iiwic0Jhc2VFbnRpdHlUeXBlIiwic05hdmlnYXRpb25QYXRoIiwiYVNpZGVFZmZlY3RzIiwiZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsImFUYXJnZXRzIiwiZmlsdGVyIiwic0Fubm90YXRpb25OYW1lIiwib1NpZGVFZmZlY3RzIiwiU291cmNlUHJvcGVydGllcyIsInNvbWUiLCJvUHJvcGVydHlQYXRoIiwic1Byb3BlcnR5UGF0aCIsInZhbHVlIiwic3RhcnRzV2l0aCIsInJlcGxhY2UiLCJpbmRleE9mIiwiU291cmNlRW50aXRpZXMiLCJvTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIlRyaWdnZXJBY3Rpb24iLCJleGVjdXRlQWN0aW9uIiwiVGFyZ2V0RW50aXRpZXMiLCJjb25jYXQiLCJUYXJnZXRQcm9wZXJ0aWVzIiwibVRhcmdldCIsInB1c2giLCJfcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyIsImxlbmd0aCIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJtRW50aXR5VHlwZSIsImFJbml0aWFsUHJvcGVydGllcyIsImFFbnRpdGllc1JlcXVlc3RlZCIsIm1hcCIsIm5hdmlnYXRpb24iLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImFEZXJpdmVkUHJvcGVydGllcyIsImJJc1N0YXJQcm9wZXJ0eSIsImVuZHNXaXRoIiwic05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsInNSZWxhdGl2ZVBhdGgiLCJyZXNvbHZlUGF0aCIsImFUYXJnZXRFbnRpdHlQcm9wZXJ0aWVzIiwiZW50aXR5UHJvcGVydGllcyIsInRhcmdldFR5cGUiLCJwcm9wZXJ0aWVzIiwibVByb3BlcnR5IiwibmF2aWdhdGlvblBhdGgiLCJwcm9wZXJ0eSIsImZpbmQiLCJuYW1lIiwic3BsaXQiLCJwb3AiLCJpbmZvIiwibVByb3BlcnR5SW5mbyIsInNUYXJnZXRUZXh0UGF0aCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiVGV4dCIsInBhdGgiLCJzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eSIsInNUYXJnZXRDb2xsZWN0aW9uUGF0aCIsIl90eXBlIiwic0JpbmRpbmdQYXJhbWV0ZXIiLCJvVGVtcFNpZGVFZmZlY3RzIiwiX3JlbW92ZUJpbmRpbmdQYXJhbWV0ZXIiLCJfY29udmVydFRhcmdldHNGb3JtYXQiLCJfYWRkUmVxdWlyZWRUZXh0UHJvcGVydGllcyIsInJlZHVjZSIsImFUYXJnZXRQcm9wZXJ0aWVzIiwidlRhcmdldCIsInNUYXJnZXQiLCJ0eXBlIiwibVRhcmdldEVudGl0eSIsIm9Tb3VyY2UiLCJhdXRob3JpemVkVHlwZXMiLCJzb3VyY2VFbnRpdHlUeXBlIiwibUNvbW1vbkFubm90YXRpb24iLCJtQmluZGluZ1BhcmFtZXRlciIsInBhcmFtZXRlcnMiLCJtUGFyYW1ldGVyIiwiJFR5cGUiLCJfY29udmVydFNpZGVFZmZlY3RzIiwic1RhcmdldFBhdGhzIiwic1BhdGhzIiwiZGVidWciLCJzQmluZGluZ1BhcmFtZXRlck5hbWUiLCJiTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsInNWYWx1ZSIsIlJlZ0V4cCIsImlJbmRleCIsImZpbmRJbmRleCIsIm1TZWFyY2hUYXJnZXQiLCJhQWN0aW9ucyIsIm9BY3Rpb24iLCJ0cmlnZ2VyQWN0aW9ucyIsInBhdGhFeHByZXNzaW9ucyIsIl9nZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2UiLCJvRW50aXR5U2lkZUVmZmVjdHMiLCJTZXJ2aWNlIiwiU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeSIsIm9TZXJ2aWNlQ29udGV4dCIsIlNpZGVFZmZlY3RzU2VydmljZVNlcnZpY2UiLCJTZXJ2aWNlRmFjdG9yeSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BMEVhQSxrQjs7Ozs7Ozs7Ozs7Ozs7O2FBS1o7QUFDQSxzQkFBTztBQUNOLGFBQUtDLGlCQUFMLEdBQXlCO0FBQ3hC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QztBQUNBOzs7O0lBSnNDNkosYzs7U0FPekJILHlCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU2VydmljZUZhY3RvcnkgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBTZXJ2aWNlIGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VcIjtcbmltcG9ydCB7IFNlcnZpY2VDb250ZXh0IH0gZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2VcIjtcbmltcG9ydCB7IENvbXBsZXhUeXBlLCBDb252ZXJ0ZXJPdXRwdXQsIEVudGl0eVR5cGUsIE5hdmlnYXRpb25Qcm9wZXJ0eSwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlclwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBFbnZpcm9ubWVudENhcGFiaWxpdGllcyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgQ29tbW9uQW5ub3RhdGlvblR5cGVzLCBRdWFsaWZpZWROYW1lIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvZ2VuZXJhdGVkL0NvbW1vblwiO1xuaW1wb3J0IHsgQWN0aW9uLCBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoLCBQcm9wZXJ0eVBhdGggfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuXG50eXBlIFNpZGVFZmZlY3RzU2V0dGluZ3MgPSB7fTtcblxudHlwZSBTaWRlRWZmZWN0c1RhcmdldEVudGl0eVR5cGUgPSB7XG5cdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmc7XG5cdCRQcm9wZXJ0eVBhdGg/OiBzdHJpbmc7XG59O1xudHlwZSBTaWRlRWZmZWN0c1RhcmdldCA9IFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZSB8IHN0cmluZztcblxudHlwZSBTaWRlRWZmZWN0c1RhcmdldFR5cGUgPSB7XG5cdFRhcmdldFByb3BlcnRpZXM6IHN0cmluZ1tdO1xuXHRUYXJnZXRFbnRpdGllczogU2lkZUVmZmVjdHNUYXJnZXRFbnRpdHlUeXBlW107XG59O1xuXG50eXBlIEJhc2VBbm5vdGF0aW9uU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRUYXJnZXRQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0VGFyZ2V0RW50aXRpZXM6IE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhbXTtcblx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmc7XG59O1xuXG50eXBlIEJhc2VTaWRlRWZmZWN0c1R5cGUgPSB7XG5cdGZ1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nO1xufSAmIFNpZGVFZmZlY3RzVGFyZ2V0VHlwZTtcblxudHlwZSBBY3Rpb25TaWRlRWZmZWN0c1R5cGUgPSB7XG5cdHBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXTtcblx0dHJpZ2dlckFjdGlvbnM/OiBRdWFsaWZpZWROYW1lW107XG59O1xuXG5leHBvcnQgdHlwZSBDb250cm9sU2lkZUVmZmVjdHNUeXBlID0gUGFydGlhbDxCYXNlU2lkZUVmZmVjdHNUeXBlPiAmIHtcblx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmc7XG5cdFNvdXJjZVByb3BlcnRpZXM6IHN0cmluZ1tdO1xuXHRzb3VyY2VDb250cm9sSWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIE9EYXRhU2lkZUVmZmVjdHNUeXBlID0gQmFzZVNpZGVFZmZlY3RzVHlwZSAmIHtcblx0U291cmNlUHJvcGVydGllcz86IFByb3BlcnR5UGF0aFtdO1xuXHRTb3VyY2VFbnRpdGllcz86IE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhbXTtcblx0VHJpZ2dlckFjdGlvbj86IFF1YWxpZmllZE5hbWU7XG59O1xuXG5leHBvcnQgdHlwZSBTaWRlRWZmZWN0c1R5cGUgPSBDb250cm9sU2lkZUVmZmVjdHNUeXBlIHwgT0RhdGFTaWRlRWZmZWN0c1R5cGU7XG5cbmV4cG9ydCB0eXBlIE9EYXRhU2lkZUVmZmVjdHNFbnRpdHlEaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+O1xuZXhwb3J0IHR5cGUgT0RhdGFTaWRlRWZmZWN0c0FjdGlvbkRpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+O1xuZXhwb3J0IHR5cGUgQ29udHJvbFNpZGVFZmZlY3RzRW50aXR5RGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIENvbnRyb2xTaWRlRWZmZWN0c1R5cGU+O1xuXG50eXBlIFNpZGVFZmZlY3RzT3JpZ2luUmVnaXN0cnkgPSB7XG5cdG9EYXRhOiB7XG5cdFx0ZW50aXRpZXM6IHtcblx0XHRcdFtlbnRpdHk6IHN0cmluZ106IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPjtcblx0XHR9O1xuXHRcdGFjdGlvbnM6IHtcblx0XHRcdFtlbnRpdHk6IHN0cmluZ106IFJlY29yZDxzdHJpbmcsIEFjdGlvblNpZGVFZmZlY3RzVHlwZT47XG5cdFx0fTtcblx0fTtcblx0Y29udHJvbDoge1xuXHRcdFtlbnRpdHk6IHN0cmluZ106IFJlY29yZDxzdHJpbmcsIENvbnRyb2xTaWRlRWZmZWN0c1R5cGU+O1xuXHR9O1xufTtcblxudHlwZSBFeHRyYWN0b3JQcm9wZXJ0eUluZm8gPSB7XG5cdHByb3BlcnR5OiBQcm9wZXJ0eTtcblx0bmF2aWdhdGlvblBhdGg/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY2xhc3MgU2lkZUVmZmVjdHNTZXJ2aWNlIGV4dGVuZHMgU2VydmljZTxTaWRlRWZmZWN0c1NldHRpbmdzPiB7XG5cdGluaXRQcm9taXNlITogUHJvbWlzZTxhbnk+O1xuXHRfb1NpZGVFZmZlY3RzVHlwZSE6IFNpZGVFZmZlY3RzT3JpZ2luUmVnaXN0cnk7XG5cdF9vQ2FwYWJpbGl0aWVzITogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMgfCB1bmRlZmluZWQ7XG5cdF9iSW5pdGlhbGl6ZWQhOiBib29sZWFuO1xuXHQvLyAhOiBtZWFucyB0aGF0IHdlIGtub3cgaXQgd2lsbCBiZSBhc3NpZ25lZCBiZWZvcmUgdXNhZ2Vcblx0aW5pdCgpIHtcblx0XHR0aGlzLl9vU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRcdFx0b0RhdGE6IHtcblx0XHRcdFx0ZW50aXRpZXM6IHt9LFxuXHRcdFx0XHRhY3Rpb25zOiB7fVxuXHRcdFx0fSxcblx0XHRcdGNvbnRyb2w6IHt9XG5cdFx0fTtcblx0XHR0aGlzLl9iSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblx0XHR0aGlzLmluaXRQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBTaWRlRWZmZWN0cyBjb250cm9sXG5cdCAqIFNpZGVFZmZlY3RzIGRlZmluaXRpb24gaXMgYWRkZWQgYnkgYSBjb250cm9sIHRvIGtlZXAgZGF0YSB1cCB0byBkYXRlXG5cdCAqIFRoZXNlIFNpZGVFZmZlY3RzIGdldCBsaW1pdGVkIHNjb3BlIGNvbXBhcmVkIHdpdGggU2lkZUVmZmVjdHMgY29taW5nIGZyb20gYW4gT0RhdGEgc2VydmljZTpcblx0ICogLSBPbmx5IG9uZSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uIGNhbiBiZSBkZWZpbmVkIGZvciB0aGUgY29tYmluYXRpb24gZW50aXR5IHR5cGUgLSBjb250cm9sIElkXG5cdCAqIC0gT25seSBTaWRlRWZmZWN0cyBzb3VyY2UgcHJvcGVydGllcyBhcmUgcmVjb2duaXplZCBhbmQgdXNlZCB0byB0cmlnZ2VyIFNpZGVFZmZlY3RzXG5cdCAqXG5cdCAqIEVuc3VyZSB0aGUgc291cmNlQ29udHJvbElkIG1hdGNoZXMgdGhlIGFzc29jaWF0ZWQgU0FQVUk1IGNvbnRyb2wgSUQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0VudGl0eVR5cGUgTmFtZSBvZiB0aGUgZW50aXR5IHR5cGVcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TaWRlRWZmZWN0IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHB1YmxpYyBhZGRDb250cm9sU2lkZUVmZmVjdHMoc0VudGl0eVR5cGU6IHN0cmluZywgb1NpZGVFZmZlY3Q6IE9taXQ8Q29udHJvbFNpZGVFZmZlY3RzVHlwZSwgXCJmdWxseVF1YWxpZmllZE5hbWVcIj4pOiB2b2lkIHtcblx0XHRpZiAob1NpZGVFZmZlY3Quc291cmNlQ29udHJvbElkKSB7XG5cdFx0XHRjb25zdCBvQ29udHJvbFNpZGVFZmZlY3Q6IENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgPSB7XG5cdFx0XHRcdC4uLm9TaWRlRWZmZWN0LFxuXHRcdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IHNFbnRpdHlUeXBlICsgXCIvU2lkZUVmZmVjdHNGb3JDb250cm9sL1wiICsgb1NpZGVFZmZlY3Quc291cmNlQ29udHJvbElkXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgbUVudGl0eUNvbnRyb2xTaWRlRWZmZWN0cyA9IHRoaXMuX29TaWRlRWZmZWN0c1R5cGUuY29udHJvbFtzRW50aXR5VHlwZV0gfHwge307XG5cdFx0XHRtRW50aXR5Q29udHJvbFNpZGVFZmZlY3RzW29Db250cm9sU2lkZUVmZmVjdC5zb3VyY2VDb250cm9sSWRdID0gb0NvbnRyb2xTaWRlRWZmZWN0O1xuXHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sW3NFbnRpdHlUeXBlXSA9IG1FbnRpdHlDb250cm9sU2lkZUVmZmVjdHM7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIFNpZGVFZmZlY3RzIGFjdGlvbi5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzVHJpZ2dlckFjdGlvbiBOYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNHcm91cElkIFRoZSBncm91cCBJRCB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuXHQgKi9cblx0cHVibGljIGV4ZWN1dGVBY3Rpb24oc1RyaWdnZXJBY3Rpb246IHN0cmluZywgb0NvbnRleHQ6IENvbnRleHQsIHNHcm91cElkPzogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb1RyaWdnZXJBY3Rpb246IGFueSA9IG9Db250ZXh0LmdldE1vZGVsKCkuYmluZENvbnRleHQoc1RyaWdnZXJBY3Rpb24gKyBcIiguLi4pXCIsIG9Db250ZXh0KTtcblx0XHRvVHJpZ2dlckFjdGlvbi5leGVjdXRlKHNHcm91cElkIHx8IChvQ29udGV4dCBhcyBhbnkpLmdldEJpbmRpbmcoKS5nZXRVcGRhdGVHcm91cElkKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgY29udmVydGVkIE9EYXRhIG1ldGFNb2RlbC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IENvbnZlcnRlZCBPRGF0YSBtZXRhTW9kZWxcblx0ICovXG5cdHB1YmxpYyBnZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKTogQ29udmVydGVyT3V0cHV0IHtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXHRcdGNvbnN0IG9Db21wb25lbnQgPSBvQ29udGV4dC5zY29wZU9iamVjdCBhcyBhbnk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgPSBvQ29tcG9uZW50LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0cmV0dXJuIGNvbnZlcnRUeXBlcyhvTWV0YU1vZGVsLCB0aGlzLl9vQ2FwYWJpbGl0aWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBlbnRpdHkgdHlwZSBvZiBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBnZXRFbnRpdHlUeXBlRnJvbUNvbnRleHRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHRcblx0ICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZCB9IEVudGl0eSBUeXBlXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHNNZXRhUGF0aCA9IChvTWV0YU1vZGVsIGFzIGFueSkuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKSxcblx0XHRcdHNFbnRpdHlUeXBlID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoKVtcIiRUeXBlXCJdO1xuXHRcdHJldHVybiBzRW50aXR5VHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNFbnRpdHlUeXBlTmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwdWJsaWMgZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhzRW50aXR5VHlwZU5hbWU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMuX29TaWRlRWZmZWN0c1R5cGUub0RhdGEuZW50aXRpZXNbc0VudGl0eVR5cGVOYW1lXSB8fCB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25OYW1lIE5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhzQWN0aW9uTmFtZTogc3RyaW5nLCBvQ29udGV4dD86IENvbnRleHQpOiBBY3Rpb25TaWRlRWZmZWN0c1R5cGUgfCB1bmRlZmluZWQge1xuXHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0Y29uc3Qgc0VudGl0eVR5cGUgPSB0aGlzLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRpZiAoc0VudGl0eVR5cGUpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX29TaWRlRWZmZWN0c1R5cGUub0RhdGEuYWN0aW9uc1tzRW50aXR5VHlwZV0/LltzQWN0aW9uTmFtZV07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogR2VuZXJhdGVzIHRoZSBkaWN0aW9uYXJ5IGZvciB0aGUgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0gb0NhcGFiaWxpdGllcyBUaGUgY3VycmVudCBjYXBhYmlsaXRpZXNcblx0ICovXG5cdHB1YmxpYyBpbml0aWFsaXplU2lkZUVmZmVjdHMob0NhcGFiaWxpdGllcz86IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKTogdm9pZCB7XG5cdFx0dGhpcy5fb0NhcGFiaWxpdGllcyA9IG9DYXBhYmlsaXRpZXM7XG5cdFx0aWYgKCF0aGlzLl9iSW5pdGlhbGl6ZWQpIHtcblx0XHRcdGNvbnN0IG9Db252ZXJ0ZWRNZXRhTW9kZWwgPSB0aGlzLmdldENvbnZlcnRlZE1ldGFNb2RlbCgpO1xuXHRcdFx0b0NvbnZlcnRlZE1ldGFNb2RlbC5lbnRpdHlUeXBlcy5mb3JFYWNoKGVudGl0eVR5cGUgPT4ge1xuXHRcdFx0XHR0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLm9EYXRhLmVudGl0aWVzW2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRoaXMuX3JldHJpZXZlT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlKTtcblx0XHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5vRGF0YS5hY3Rpb25zW2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRoaXMuX3JldHJpZXZlT0RhdGFBY3Rpb25zU2lkZUVmZmVjdHMoZW50aXR5VHlwZSk7IC8vIG9ubHkgYm91bmQgYWN0aW9ucyBhcmUgYW5hbHl6ZWQgc2luY2UgdW5ib3VuZCBvbmVzIGRvbid0IGdldCBTaWRlRWZmZWN0c1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLl9iSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGEgY29udHJvbC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQ29udHJvbElkIENvbnRyb2wgSWRcblx0ICovXG5cdHB1YmxpYyByZW1vdmVDb250cm9sU2lkZUVmZmVjdHMoc0NvbnRyb2xJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0T2JqZWN0LmtleXModGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sKS5mb3JFYWNoKHNFbnRpdHlUeXBlID0+IHtcblx0XHRcdGlmICh0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVdW3NDb250cm9sSWRdKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVdW3NDb250cm9sSWRdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgU2lkZUVmZmVjdHMgb24gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFQYXRoRXhwcmVzc2lvbnMgVGFyZ2V0cyBvZiBTaWRlRWZmZWN0cyB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dCB3aGVyZSBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzR3JvdXBJZCBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3Rcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugb24gU2lkZUVmZmVjdHMgcmVxdWVzdFxuXHQgKi9cblx0cHVibGljIHJlcXVlc3RTaWRlRWZmZWN0cyhhUGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdLCBvQ29udGV4dDogQ29udGV4dCwgc0dyb3VwSWQ/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuXHRcdHRoaXMuX2xvZ1JlcXVlc3QoYVBhdGhFeHByZXNzaW9ucywgb0NvbnRleHQpO1xuXHRcdGxldCBvUHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuXHRcdC8qKlxuXHRcdCAqIENvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzIGVpdGhlciByZXR1cm5zIGEgcHJvbWlzZSBvciB0aHJvd3MgYSBuZXcgZXJyb3IuIFRoaXMgcmV0dXJuIGlzIGNhdWdodCBpZiBhbiBlcnJvciBpcyB0aHJvd25cblx0XHQgKiB0byBhdm9pZCBicmVha2luZyB0aGUgcHJvbWlzZSBjaGFpbi5cblx0XHQgKi9cblx0XHR0cnkge1xuXHRcdFx0b1Byb21pc2UgPSAob0NvbnRleHQgYXMgYW55KS5yZXF1ZXN0U2lkZUVmZmVjdHMoYVBhdGhFeHByZXNzaW9ucywgc0dyb3VwSWQpIGFzIFByb21pc2U8YW55Pjtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvUHJvbWlzZSA9IFByb21pc2UucmVqZWN0KGUpO1xuXHRcdH1cblx0XHRyZXR1cm4gb1Byb21pc2U7XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdCBTaWRlRWZmZWN0cyBmb3IgYSBuYXZpZ2F0aW9uIHByb3BlcnR5IG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc05hdmlnYXRpb25Qcm9wZXJ0eSBOYXZpZ2F0aW9uIHByb3BlcnR5XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgcmVxdWVzdCBvbiBTQVBVSTUgY29udGV4dFxuXHQgKi9cblx0cHVibGljIHJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShzTmF2aWdhdGlvblByb3BlcnR5OiBzdHJpbmcsIG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBzQmFzZUVudGl0eVR5cGUgPSB0aGlzLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0aWYgKHNCYXNlRW50aXR5VHlwZSkge1xuXHRcdFx0Y29uc3Qgc05hdmlnYXRpb25QYXRoID0gc05hdmlnYXRpb25Qcm9wZXJ0eSArIFwiL1wiO1xuXHRcdFx0Y29uc3QgYVNpZGVFZmZlY3RzID0gdGhpcy5nZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzKHNCYXNlRW50aXR5VHlwZSk7XG5cdFx0XHRsZXQgYVRhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0W10gPSBbXTtcblx0XHRcdE9iamVjdC5rZXlzKGFTaWRlRWZmZWN0cylcblx0XHRcdFx0LmZpbHRlcihcblx0XHRcdFx0XHQvLyBLZWVwIHJlbGV2YW50IFNpZGVFZmZlY3RzXG5cdFx0XHRcdFx0c0Fubm90YXRpb25OYW1lID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IG9TaWRlRWZmZWN0czogT0RhdGFTaWRlRWZmZWN0c1R5cGUgPSBhU2lkZUVmZmVjdHNbc0Fubm90YXRpb25OYW1lXTtcblx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdChvU2lkZUVmZmVjdHMuU291cmNlUHJvcGVydGllcyB8fCBbXSkuc29tZShvUHJvcGVydHlQYXRoID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzUHJvcGVydHlQYXRoID0gb1Byb3BlcnR5UGF0aC52YWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRcdFx0c1Byb3BlcnR5UGF0aC5zdGFydHNXaXRoKHNOYXZpZ2F0aW9uUGF0aCkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdHNQcm9wZXJ0eVBhdGgucmVwbGFjZShzTmF2aWdhdGlvblBhdGgsIFwiXCIpLmluZGV4T2YoXCIvXCIpID09PSAtMVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH0pIHx8XG5cdFx0XHRcdFx0XHRcdChvU2lkZUVmZmVjdHMuU291cmNlRW50aXRpZXMgfHwgW10pLnNvbWUoXG5cdFx0XHRcdFx0XHRcdFx0b05hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPT4gb05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgudmFsdWUgPT09IHNOYXZpZ2F0aW9uUHJvcGVydHlcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdClcblx0XHRcdFx0LmZvckVhY2goc0Fubm90YXRpb25OYW1lID0+IHtcblx0XHRcdFx0XHRjb25zdCBvU2lkZUVmZmVjdHM6IE9EYXRhU2lkZUVmZmVjdHNUeXBlID0gYVNpZGVFZmZlY3RzW3NBbm5vdGF0aW9uTmFtZV07XG5cdFx0XHRcdFx0aWYgKG9TaWRlRWZmZWN0cy5UcmlnZ2VyQWN0aW9uKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmV4ZWN1dGVBY3Rpb24ob1NpZGVFZmZlY3RzLlRyaWdnZXJBY3Rpb24gYXMgc3RyaW5nLCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdCgob1NpZGVFZmZlY3RzLlRhcmdldEVudGl0aWVzIGFzIGFueVtdKSB8fCBbXSlcblx0XHRcdFx0XHRcdC5jb25jYXQoKG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzIGFzIGFueVtdKSB8fCBbXSlcblx0XHRcdFx0XHRcdC5mb3JFYWNoKG1UYXJnZXQgPT4gYVRhcmdldHMucHVzaChtVGFyZ2V0KSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0Ly8gUmVtb3ZlIGR1cGxpY2F0ZSBwcm9wZXJ0aWVzXG5cdFx0XHRhVGFyZ2V0cyA9IHRoaXMuX3JlbW92ZUR1cGxpY2F0ZVRhcmdldHMoYVRhcmdldHMpO1xuXHRcdFx0aWYgKGFUYXJnZXRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzKGFUYXJnZXRzLCBvQ29udGV4dCkuY2F0Y2gob0Vycm9yID0+XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiU2lkZUVmZmVjdHMgLSBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIFNpZGVFZmZlY3RzIGZvciBOYXZpZ2F0aW9uIFByb3BlcnR5IFwiICsgc05hdmlnYXRpb25Qcm9wZXJ0eSwgb0Vycm9yKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgdGhhdCBjb21lIGZyb20gY29udHJvbHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0VudGl0eVR5cGVOYW1lIEVudGl0eSB0eXBlIE5hbWVcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHVibGljIGdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyhzRW50aXR5VHlwZU5hbWU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIENvbnRyb2xTaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRyZXR1cm4gdGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sW3NFbnRpdHlUeXBlTmFtZV0gfHwge307XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyB0aGUgdGV4dCBwcm9wZXJ0aWVzIHJlcXVpcmVkIGZvciBTaWRlRWZmZWN0c1xuXHQgKiBJZiBhIHByb3BlcnR5IGhhcyBhbiBhc3NvY2lhdGVkIHRleHQgdGhlbiB0aGlzIHRleHQgbmVlZHMgdG8gYmUgYWRkZWQgYXMgdGFyZ2V0UHJvcGVydGllcyBvciB0YXJnZXRFbnRpdGllcy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdCBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRW50aXR5VHlwZSBFbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uIHdpdGggYWRkZWQgdGV4dCBwcm9wZXJ0aWVzXG5cdCAqL1xuXHRwcml2YXRlIF9hZGRSZXF1aXJlZFRleHRQcm9wZXJ0aWVzKG9TaWRlRWZmZWN0OiBCYXNlU2lkZUVmZmVjdHNUeXBlLCBtRW50aXR5VHlwZTogRW50aXR5VHlwZSk6IEJhc2VTaWRlRWZmZWN0c1R5cGUge1xuXHRcdGNvbnN0IGFJbml0aWFsUHJvcGVydGllczogc3RyaW5nW10gPSBvU2lkZUVmZmVjdC5UYXJnZXRQcm9wZXJ0aWVzIHx8IFtdLFxuXHRcdFx0YUVudGl0aWVzUmVxdWVzdGVkOiBzdHJpbmdbXSA9IChvU2lkZUVmZmVjdC5UYXJnZXRFbnRpdGllcyB8fCBbXSkubWFwKG5hdmlnYXRpb24gPT4gbmF2aWdhdGlvbi4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdFx0bGV0IGFEZXJpdmVkUHJvcGVydGllczogRXh0cmFjdG9yUHJvcGVydHlJbmZvW10gPSBbXTtcblxuXHRcdGFJbml0aWFsUHJvcGVydGllcy5mb3JFYWNoKHNQcm9wZXJ0eVBhdGggPT4ge1xuXHRcdFx0Y29uc3QgYklzU3RhclByb3BlcnR5ID0gc1Byb3BlcnR5UGF0aC5lbmRzV2l0aChcIipcIiksIC8vIENhbiBiZSAnKicgb3IgJy4uLi9uYXZQcm9wLyonXG5cdFx0XHRcdHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmcgPSBzUHJvcGVydHlQYXRoLnN1YnN0cmluZygwLCBzUHJvcGVydHlQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSksXG5cdFx0XHRcdHNSZWxhdGl2ZVBhdGggPSBzTmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoICsgXCIvXCIgOiBcIlwiLFxuXHRcdFx0XHRtVGFyZ2V0OiBhbnkgPSBtRW50aXR5VHlwZS5yZXNvbHZlUGF0aChzTmF2aWdhdGlvblByb3BlcnR5UGF0aCkgfHwgbUVudGl0eVR5cGU7XG5cblx0XHRcdGlmIChtVGFyZ2V0KSB7XG5cdFx0XHRcdC8vIG1UYXJnZXQgY2FuIGJlIGFuIGVudGl0eSB0eXBlLCBuYXZpZ2F0aW9uUHJvcGVydHkgb3Igb3IgYSBjb21wbGV4VHlwZVxuXHRcdFx0XHRjb25zdCBhVGFyZ2V0RW50aXR5UHJvcGVydGllczogUHJvcGVydHlbXSA9XG5cdFx0XHRcdFx0KG1UYXJnZXQgYXMgRW50aXR5VHlwZSkuZW50aXR5UHJvcGVydGllcyB8fFxuXHRcdFx0XHRcdCgobVRhcmdldCBhcyBQcm9wZXJ0eSkudGFyZ2V0VHlwZSBhcyBDb21wbGV4VHlwZSk/LnByb3BlcnRpZXMgfHxcblx0XHRcdFx0XHQobVRhcmdldCBhcyBOYXZpZ2F0aW9uUHJvcGVydHkpLnRhcmdldFR5cGUuZW50aXR5UHJvcGVydGllcztcblx0XHRcdFx0aWYgKGFUYXJnZXRFbnRpdHlQcm9wZXJ0aWVzKSB7XG5cdFx0XHRcdFx0aWYgKGJJc1N0YXJQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0Ly8gQWRkIGFsbCByZXF1aXJlZCBwcm9wZXJ0aWVzIGJlaGluZCB0aGUgKlxuXHRcdFx0XHRcdFx0YUVudGl0aWVzUmVxdWVzdGVkLnB1c2goc05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRcdFx0XHRcdFx0YURlcml2ZWRQcm9wZXJ0aWVzID0gYURlcml2ZWRQcm9wZXJ0aWVzLmNvbmNhdChcblx0XHRcdFx0XHRcdFx0YVRhcmdldEVudGl0eVByb3BlcnRpZXMubWFwKG1Qcm9wZXJ0eSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5hdmlnYXRpb25QYXRoOiBzUmVsYXRpdmVQYXRoLFxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk6IG1Qcm9wZXJ0eVxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRhRGVyaXZlZFByb3BlcnRpZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5OiBhVGFyZ2V0RW50aXR5UHJvcGVydGllcy5maW5kKFxuXHRcdFx0XHRcdFx0XHRcdG1Qcm9wZXJ0eSA9PiBtUHJvcGVydHkubmFtZSA9PT0gc1Byb3BlcnR5UGF0aC5zcGxpdChcIi9cIikucG9wKClcblx0XHRcdFx0XHRcdFx0KSBhcyBQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0bmF2aWdhdGlvblBhdGg6IHNSZWxhdGl2ZVBhdGhcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRMb2cuaW5mbyhcIlNpZGVFZmZlY3RzIC0gVGhlIGVudGl0eSB0eXBlIGFzc29jaWF0ZWQgdG8gcHJvcGVydHkgcGF0aCBcIiArIHNQcm9wZXJ0eVBhdGggKyBcIiBjYW5ub3QgYmUgcmVzb2x2ZWRcIik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdExvZy5pbmZvKFwiU2lkZUVmZmVjdHMgLSBUaGUgcHJvcGVydHkgcGF0aCBcIiArIHNQcm9wZXJ0eVBhdGggKyBcIiBjYW5ub3QgYmUgcmVzb2x2ZWRcIik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRhRGVyaXZlZFByb3BlcnRpZXMuZm9yRWFjaChtUHJvcGVydHlJbmZvID0+IHtcblx0XHRcdGlmIChtUHJvcGVydHlJbmZvLnByb3BlcnR5KSB7XG5cdFx0XHRcdGNvbnN0IHNUYXJnZXRUZXh0UGF0aCA9IChtUHJvcGVydHlJbmZvLnByb3BlcnR5LmFubm90YXRpb25zPy5Db21tb24/LlRleHQgYXMgYW55KT8ucGF0aCxcblx0XHRcdFx0XHRzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eSA9IG1Qcm9wZXJ0eUluZm8ubmF2aWdhdGlvblBhdGggKyBzVGFyZ2V0VGV4dFBhdGgsXG5cdFx0XHRcdFx0c1RhcmdldENvbGxlY3Rpb25QYXRoID0gc1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkuc3Vic3RyaW5nKDAsIHNUZXh0UGF0aEZyb21Jbml0aWFsRW50aXR5Lmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgcHJvcGVydHkgVGV4dCBtdXN0IGJlIGFkZGVkIG9ubHkgaWYgdGhlIHByb3BlcnR5IGlzXG5cdFx0XHRcdCAqIC0gbm90IHBhcnQgb2YgYSBzdGFyIHByb3BlcnR5ICguaS5lICcqJyBvciAnbmF2aWdhdGlvbi8qJykgb3IgYSB0YXJnZXRlZCBFbnRpdHlcblx0XHRcdFx0ICogLSBub3QgaW5jbHVkZSBpbnRvIHRoZSBpbml0aWFsIHRhcmdldGVkIHByb3BlcnRpZXMgb2YgU2lkZUVmZmVjdHNcblx0XHRcdFx0ICogIEluZGVlZCBpbiB0aGUgdHdvIGxpc3RlZCBjYXNlcywgdGhlIHByb3BlcnR5IGNvbnRhaW5pbmcgdGV4dCB3aWxsIGJlL2lzIHJlcXVlc3RlZCBieSBpbml0aWFsIFNpZGVFZmZlY3RzIGNvbmZpZ3VyYXRpb24uXG5cdFx0XHRcdCAqL1xuXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRzVGFyZ2V0VGV4dFBhdGggJiZcblx0XHRcdFx0XHRhRW50aXRpZXNSZXF1ZXN0ZWQuaW5kZXhPZihzVGFyZ2V0Q29sbGVjdGlvblBhdGgpID09PSAtMSAmJlxuXHRcdFx0XHRcdGFJbml0aWFsUHJvcGVydGllcy5pbmRleE9mKHNUZXh0UGF0aEZyb21Jbml0aWFsRW50aXR5KSA9PT0gLTFcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Ly8gVGhlIFRleHQgYXNzb2NpYXRpb24gaXMgYWRkZWQgYXMgVGFyZ2V0RW50aXRpZXMgaWYgaXQncyBjb250YWluZWQgb24gYSBkaWZmZXJlbnQgZW50aXR5U2V0IGFuZCBub3QgYSBjb21wbGV4VHlwZVxuXHRcdFx0XHRcdC8vIE90aGVyd2lzZSBpdCdzIGFkZGVkIGFzIHRhcmdldFByb3BlcnRpZXNcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRzVGFyZ2V0VGV4dFBhdGgubGFzdEluZGV4T2YoXCIvXCIpID4gLTEgJiZcblx0XHRcdFx0XHRcdG1FbnRpdHlUeXBlLnJlc29sdmVQYXRoKHNUYXJnZXRDb2xsZWN0aW9uUGF0aCk/Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvU2lkZUVmZmVjdC5UYXJnZXRFbnRpdGllcy5wdXNoKHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHNUYXJnZXRDb2xsZWN0aW9uUGF0aCB9KTtcblx0XHRcdFx0XHRcdGFFbnRpdGllc1JlcXVlc3RlZC5wdXNoKHNUYXJnZXRDb2xsZWN0aW9uUGF0aCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0LlRhcmdldFByb3BlcnRpZXMucHVzaChzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gb1NpZGVFZmZlY3Q7XG5cdH1cblx0LyoqXG5cdCAqIENvbnZlcnRzIFNpZGVFZmZlY3RzIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBDb252ZXJ0cyBTaWRlRWZmZWN0cyB0YXJnZXRzIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBSZW1vdmVzIGJpbmRpbmcgcGFyYW1ldGVyIGZyb20gU2lkZUVmZmVjdHMgdGFyZ2V0cyBwcm9wZXJ0aWVzXG5cdCAqICAtIEFkZHMgdGhlIHRleHQgcHJvcGVydGllc1xuXHQgKiAgLSBSZXBsYWNlcyBUYXJnZXRQcm9wZXJ0aWVzIGhhdmluZyByZWZlcmVuY2UgdG8gU291cmNlIFByb3BlcnRpZXMgZm9yIGEgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IG1FbnRpdHlUeXBlIEVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQmluZGluZ1BhcmFtZXRlciBOYW1lIG9mIHRoZSBiaW5kaW5nIHBhcmFtZXRlclxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwcml2YXRlIF9jb252ZXJ0U2lkZUVmZmVjdHMoXG5cdFx0b1NpZGVFZmZlY3RzOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHwgQmFzZUFubm90YXRpb25TaWRlRWZmZWN0c1R5cGUsXG5cdFx0bUVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdFx0c0JpbmRpbmdQYXJhbWV0ZXI/OiBzdHJpbmdcblx0KTogT0RhdGFTaWRlRWZmZWN0c1R5cGUge1xuXHRcdGNvbnN0IG9UZW1wU2lkZUVmZmVjdHMgPSB0aGlzLl9yZW1vdmVCaW5kaW5nUGFyYW1ldGVyKHRoaXMuX2NvbnZlcnRUYXJnZXRzRm9ybWF0KG9TaWRlRWZmZWN0cyksIHNCaW5kaW5nUGFyYW1ldGVyKTtcblx0XHRyZXR1cm4gdGhpcy5fYWRkUmVxdWlyZWRUZXh0UHJvcGVydGllcyhvVGVtcFNpZGVFZmZlY3RzLCBtRW50aXR5VHlwZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgU2lkZUVmZmVjdHMgdGFyZ2V0cyAoVGFyZ2V0RW50aXRpZXMgYW5kIFRhcmdldFByb3BlcnRpZXMpIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBUYXJnZXRQcm9wZXJ0aWVzIGFzIGFycmF5IG9mIHN0cmluZ1xuXHQgKiAgLSBUYXJnZXRFbnRpdGllcyBhcyBhcnJheSBvZiBvYmplY3Qgd2l0aCBwcm9wZXJ0eSAkTmF2aWdhdGlvblByb3BlcnR5UGF0aC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBDb252ZXJ0ZWQgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgX2NvbnZlcnRUYXJnZXRzRm9ybWF0KG9TaWRlRWZmZWN0czogQmFzZVNpZGVFZmZlY3RzVHlwZSB8IEJhc2VBbm5vdGF0aW9uU2lkZUVmZmVjdHNUeXBlKTogQmFzZVNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0Y29uc3QgVGFyZ2V0UHJvcGVydGllczogc3RyaW5nW10gPSAoKG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzIGFzIGFueVtdKSB8fCBbXSkucmVkdWNlKGZ1bmN0aW9uKGFUYXJnZXRQcm9wZXJ0aWVzLCB2VGFyZ2V0KSB7XG5cdFx0XHRcdGNvbnN0IHNUYXJnZXQgPSAodHlwZW9mIHZUYXJnZXQgPT09IFwic3RyaW5nXCIgJiYgdlRhcmdldCkgfHwgKHZUYXJnZXQudHlwZSA9PT0gXCJQcm9wZXJ0eVBhdGhcIiAmJiB2VGFyZ2V0LnZhbHVlKTtcblx0XHRcdFx0aWYgKHNUYXJnZXQpIHtcblx0XHRcdFx0XHRhVGFyZ2V0UHJvcGVydGllcy5wdXNoKHNUYXJnZXQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIlNpZGVFZmZlY3RzIC0gRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBUYXJnZXRQcm9wZXJ0aWVzIGZvciBTaWRlRWZmZWN0c1wiICsgb1NpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGFUYXJnZXRQcm9wZXJ0aWVzO1xuXHRcdFx0fSwgW10pLFxuXHRcdFx0VGFyZ2V0RW50aXRpZXM6IFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZVtdID0gKChvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMgYXMgYW55W10pIHx8IFtdKS5tYXAobVRhcmdldEVudGl0eSA9PiB7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiAgU2lkZUVmZmVjdHMgdGhhdCBjb21lcyBmcm9tIFNBUCBGRSBnZXQgVGFyZ2V0RW50aXRpZXMgd2l0aCAkTmF2aWdhdGlvblByb3BlcnR5UGF0aCB3aGVyZWFzXG5cdFx0XHRcdCAqICBvbmVzIGNvbWluZyBmcm9tIHRoZSBjb252ZXJ0ZWQgT0RhdGEgbW9kZWwgZ2V0cyBhIE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggZm9ybWF0XG5cdFx0XHRcdCAqXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRyZXR1cm4geyBcIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoXCI6IG1UYXJnZXRFbnRpdHkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggfHwgbVRhcmdldEVudGl0eS52YWx1ZSB8fCBcIlwiIH07XG5cdFx0XHR9KTtcblx0XHRyZXR1cm4geyAuLi5vU2lkZUVmZmVjdHMsIC4uLnsgVGFyZ2V0UHJvcGVydGllcywgVGFyZ2V0RW50aXRpZXMgfSB9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byBhbiBlbnRpdHkgdHlwZSBvciBhY3Rpb24gdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgb3IgYWN0aW9uXG5cdCAqIGFuZCB0byBjb252ZXJ0IHRoZXNlIFNpZGVFZmZlY3RzIHdpdGggZXhwZWN0ZWQgZm9ybWF0LlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Tb3VyY2UgRW50aXR5IHR5cGUgb3IgYWN0aW9uXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IEFycmF5IG9mIFNpZGVFZmZlY3RzXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2Uob1NvdXJjZTogYW55KTogT0RhdGFTaWRlRWZmZWN0c1R5cGVbXSB7XG5cdFx0Y29uc3QgYVNpZGVFZmZlY3RzOiBPRGF0YVNpZGVFZmZlY3RzVHlwZVtdID0gW107XG5cdFx0Y29uc3QgYXV0aG9yaXplZFR5cGVzID0gW1wiRW50aXR5VHlwZVwiLCBcIkFjdGlvblwiXTtcblx0XHRpZiAob1NvdXJjZS5fdHlwZSAmJiBhdXRob3JpemVkVHlwZXMuaW5kZXhPZihvU291cmNlLl90eXBlKSA+IC0xKSB7XG5cdFx0XHRjb25zdCBtRW50aXR5VHlwZTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZCA9IG9Tb3VyY2UuX3R5cGUgPT09IFwiRW50aXR5VHlwZVwiID8gb1NvdXJjZSA6IG9Tb3VyY2Uuc291cmNlRW50aXR5VHlwZTtcblx0XHRcdGlmIChtRW50aXR5VHlwZSkge1xuXHRcdFx0XHRjb25zdCBtQ29tbW9uQW5ub3RhdGlvbjogYW55ID0gb1NvdXJjZS5hbm5vdGF0aW9ucz8uQ29tbW9uIHx8IHt9O1xuXHRcdFx0XHRjb25zdCBtQmluZGluZ1BhcmFtZXRlciA9ICgob1NvdXJjZSBhcyBBY3Rpb24pLnBhcmFtZXRlcnMgfHwgW10pLmZpbmQoXG5cdFx0XHRcdFx0bVBhcmFtZXRlciA9PiBtUGFyYW1ldGVyLnR5cGUgPT09IG1FbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBzQmluZGluZ1BhcmFtZXRlciA9IG1CaW5kaW5nUGFyYW1ldGVyID8gbUJpbmRpbmdQYXJhbWV0ZXIuZnVsbHlRdWFsaWZpZWROYW1lLnNwbGl0KFwiL1wiKVsxXSA6IFwiXCI7XG5cdFx0XHRcdE9iamVjdC5rZXlzKG1Db21tb25Bbm5vdGF0aW9uKVxuXHRcdFx0XHRcdC5maWx0ZXIoc0Fubm90YXRpb25OYW1lID0+IG1Db21tb25Bbm5vdGF0aW9uW3NBbm5vdGF0aW9uTmFtZV0uJFR5cGUgPT09IENvbW1vbkFubm90YXRpb25UeXBlcy5TaWRlRWZmZWN0c1R5cGUpXG5cdFx0XHRcdFx0LmZvckVhY2goc0Fubm90YXRpb25OYW1lID0+IHtcblx0XHRcdFx0XHRcdGFTaWRlRWZmZWN0cy5wdXNoKHRoaXMuX2NvbnZlcnRTaWRlRWZmZWN0cyhtQ29tbW9uQW5ub3RhdGlvbltzQW5ub3RhdGlvbk5hbWVdLCBtRW50aXR5VHlwZSwgc0JpbmRpbmdQYXJhbWV0ZXIpKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGFTaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2dzIFNpZGVFZmZlY3RzIHJlcXVlc3QuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhUGF0aEV4cHJlc3Npb25zIFNpZGVFZmZlY3RzIHRhcmdldHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHRcblx0ICovXG5cdHByaXZhdGUgX2xvZ1JlcXVlc3QoYVBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXSwgb0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRjb25zdCBzVGFyZ2V0UGF0aHMgPSBhUGF0aEV4cHJlc3Npb25zLnJlZHVjZShmdW5jdGlvbihzUGF0aHMsIG1UYXJnZXQpIHtcblx0XHRcdHJldHVybiBzUGF0aHMgKyBcIlxcblxcdFxcdFwiICsgKChtVGFyZ2V0IGFzIFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZSkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggfHwgbVRhcmdldCB8fCBcIlwiKTtcblx0XHR9LCBcIlwiKTtcblx0XHRMb2cuZGVidWcoXCJTaWRlRWZmZWN0cyAtIFJlcXVlc3Q6XFxuXFx0Q29udGV4dCBwYXRoIDogXCIgKyBvQ29udGV4dC5nZXRQYXRoKCkgKyBcIlxcblxcdFByb3BlcnR5IHBhdGhzIDpcIiArIHNUYXJnZXRQYXRocyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBuYW1lIG9mIGJpbmRpbmcgcGFyYW1ldGVyIG9uIFNpZGVFZmZlY3RzIHRhcmdldHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNCaW5kaW5nUGFyYW1ldGVyTmFtZSBOYW1lIG9mIGJpbmRpbmcgcGFyYW1ldGVyXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHByaXZhdGUgX3JlbW92ZUJpbmRpbmdQYXJhbWV0ZXIob1NpZGVFZmZlY3RzOiBCYXNlU2lkZUVmZmVjdHNUeXBlLCBzQmluZGluZ1BhcmFtZXRlck5hbWU/OiBzdHJpbmcpOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRpZiAoc0JpbmRpbmdQYXJhbWV0ZXJOYW1lKSB7XG5cdFx0XHRjb25zdCBhVGFyZ2V0cyA9IFtcIlRhcmdldFByb3BlcnRpZXNcIiwgXCJUYXJnZXRFbnRpdGllc1wiXTtcblx0XHRcdGFUYXJnZXRzLmZvckVhY2goc1RhcmdldCA9PiB7XG5cdFx0XHRcdGxldCBtVGFyZ2V0ID0gKG9TaWRlRWZmZWN0cyBhcyBhbnkpW3NUYXJnZXRdO1xuXHRcdFx0XHRpZiAobVRhcmdldCkge1xuXHRcdFx0XHRcdG1UYXJnZXQgPSBtVGFyZ2V0Lm1hcCgobVByb3BlcnR5OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGJOYXZpZ2F0aW9uUHJvcGVydHlQYXRoID0gbVByb3BlcnR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoICE9PSB1bmRlZmluZWQ7IC8vIE5lZWQgdG8gdGVzdCB3aXRoIHVuZGVmaW5lZCBzaW5jZSAgbVByb3BlcnR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIGNvdWxkIGJlIFwiXCIgKGVtcHR5IHN0cmluZylcblx0XHRcdFx0XHRcdGNvbnN0IHNWYWx1ZSA9IChiTmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IG1Qcm9wZXJ0eS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA6IG1Qcm9wZXJ0eSkucmVwbGFjZShcblx0XHRcdFx0XHRcdFx0bmV3IFJlZ0V4cChcIl5cIiArIHNCaW5kaW5nUGFyYW1ldGVyTmFtZSArIFwiLz9cIiksXG5cdFx0XHRcdFx0XHRcdFwiXCJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gYk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPyB7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzVmFsdWUgfSA6IHNWYWx1ZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQob1NpZGVFZmZlY3RzIGFzIGFueSlbc1RhcmdldF0gPSBtVGFyZ2V0O1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlIGR1cGxpY2F0ZXMgaW4gU2lkZUVmZmVjdHMgdGFyZ2V0cy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFUYXJnZXRzIFNpZGVFZmZlY3RzIHRhcmdldHNcblx0ICogQHJldHVybnMge0FycmF5fSBTaWRlRWZmZWN0cyB0YXJnZXRzIHdpdGhvdXQgZHVwbGljYXRlc1xuXHQgKi9cblx0cHJpdmF0ZSBfcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhhVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRbXSk6IFNpZGVFZmZlY3RzVGFyZ2V0W10ge1xuXHRcdHJldHVybiBhVGFyZ2V0cy5maWx0ZXIoXG5cdFx0XHQobVRhcmdldDogYW55LCBpSW5kZXgsIGFUYXJnZXRzKSA9PlxuXHRcdFx0XHRhVGFyZ2V0cy5maW5kSW5kZXgoKG1TZWFyY2hUYXJnZXQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRtU2VhcmNoVGFyZ2V0ID09PSBtVGFyZ2V0IHx8IC8vIFByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0KG1UYXJnZXQuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggJiYgbVNlYXJjaFRhcmdldC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA9PT0gbVRhcmdldC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCkgLy8gTmF2aWdhdGlvblByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pID09PSBpSW5kZXhcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgYWN0aW9uIHR5cGUgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0cyBvbiBhY3Rpb25zXG5cdCAqIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSBhbmQgdG8gY29udmVydCB0aGVzZSBTaWRlRWZmZWN0cyB3aXRoXG5cdCAqIGV4cGVjdGVkIGZvcm1hdC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRW50aXR5VHlwZSBFbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBFbnRpdHkgdHlwZSBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwcml2YXRlIF9yZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzKG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzOiBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+ID0ge307XG5cdFx0Y29uc3QgYUFjdGlvbnMgPSBtRW50aXR5VHlwZS5hY3Rpb25zO1xuXHRcdGlmIChhQWN0aW9ucykge1xuXHRcdFx0T2JqZWN0LmtleXMoYUFjdGlvbnMpLmZvckVhY2goc0FjdGlvbk5hbWUgPT4ge1xuXHRcdFx0XHRjb25zdCBvQWN0aW9uID0gbUVudGl0eVR5cGUuYWN0aW9uc1tzQWN0aW9uTmFtZV07XG5cdFx0XHRcdGNvbnN0IHRyaWdnZXJBY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0XHRsZXQgcGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdID0gW107XG5cdFx0XHRcdGxldCBhVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRbXSA9IFtdO1xuXG5cdFx0XHRcdHRoaXMuX2dldFNpZGVFZmZlY3RzRnJvbVNvdXJjZShvQWN0aW9uKS5mb3JFYWNoKG9TaWRlRWZmZWN0ID0+IHtcblx0XHRcdFx0XHRjb25zdCBzVHJpZ2dlckFjdGlvbiA9IG9TaWRlRWZmZWN0LlRyaWdnZXJBY3Rpb247XG5cdFx0XHRcdFx0YVRhcmdldHMgPSBhVGFyZ2V0cy5jb25jYXQob1NpZGVFZmZlY3QuVGFyZ2V0RW50aXRpZXMgfHwgW10pLmNvbmNhdCgob1NpZGVFZmZlY3QuVGFyZ2V0UHJvcGVydGllcyBhcyBhbnlbXSkgfHwgW10pO1xuXHRcdFx0XHRcdGlmIChzVHJpZ2dlckFjdGlvbiAmJiB0cmlnZ2VyQWN0aW9ucy5pbmRleE9mKHNUcmlnZ2VyQWN0aW9uIGFzIHN0cmluZykgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHR0cmlnZ2VyQWN0aW9ucy5wdXNoKHNUcmlnZ2VyQWN0aW9uIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cGF0aEV4cHJlc3Npb25zID0gdGhpcy5fcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhhVGFyZ2V0cyk7XG5cdFx0XHRcdG9TaWRlRWZmZWN0c1tzQWN0aW9uTmFtZV0gPSB7IHBhdGhFeHByZXNzaW9ucywgdHJpZ2dlckFjdGlvbnMgfTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gb1NpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgZW50aXR5IHR5cGUgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0c1xuXHQgKiByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgYW5kIHRvIGNvbnZlcnQgdGhlc2UgU2lkZUVmZmVjdHMgd2l0aFxuXHQgKiBleHBlY3RlZCBmb3JtYXQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUVudGl0eVR5cGUgRW50aXR5IHR5cGVcblx0ICogQHJldHVybnMge29iamVjdH0gRW50aXR5IHR5cGUgU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHJpdmF0ZSBfcmV0cmlldmVPRGF0YUVudGl0eVNpZGVFZmZlY3RzKG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRjb25zdCBvRW50aXR5U2lkZUVmZmVjdHM6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiA9IHt9O1xuXHRcdHRoaXMuX2dldFNpZGVFZmZlY3RzRnJvbVNvdXJjZShtRW50aXR5VHlwZSkuZm9yRWFjaChvU2lkZUVmZmVjdHMgPT4ge1xuXHRcdFx0b0VudGl0eVNpZGVFZmZlY3RzW29TaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVdID0gb1NpZGVFZmZlY3RzO1xuXHRcdH0pO1xuXHRcdHJldHVybiBvRW50aXR5U2lkZUVmZmVjdHM7XG5cdH1cblxuXHRnZXRJbnRlcmZhY2UoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG5jbGFzcyBTaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5IGV4dGVuZHMgU2VydmljZUZhY3Rvcnk8U2lkZUVmZmVjdHNTZXR0aW5ncz4ge1xuXHRjcmVhdGVJbnN0YW5jZShvU2VydmljZUNvbnRleHQ6IFNlcnZpY2VDb250ZXh0PFNpZGVFZmZlY3RzU2V0dGluZ3M+KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBTaWRlRWZmZWN0c1NlcnZpY2VTZXJ2aWNlID0gbmV3IFNpZGVFZmZlY3RzU2VydmljZShvU2VydmljZUNvbnRleHQpO1xuXHRcdHJldHVybiBTaWRlRWZmZWN0c1NlcnZpY2VTZXJ2aWNlLmluaXRQcm9taXNlO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNpZGVFZmZlY3RzU2VydmljZUZhY3Rvcnk7XG4iXX0=