@sapui5/sap.fe.core 1.136.2 → 1.136.5

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 (86) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +7 -1
  4. package/src/sap/fe/core/AppComponent.ts +10 -0
  5. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +2 -1
  6. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +1 -0
  7. package/src/sap/fe/core/controllerextensions/EditFlow.js +41 -20
  8. package/src/sap/fe/core/controllerextensions/EditFlow.ts +60 -25
  9. package/src/sap/fe/core/controllerextensions/MessageHandler.js +21 -5
  10. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +19 -1
  11. package/src/sap/fe/core/controllerextensions/SideEffects.js +5 -4
  12. package/src/sap/fe/core/controllerextensions/SideEffects.ts +8 -5
  13. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +4 -3
  14. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +10 -3
  15. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +9 -8
  16. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +11 -6
  17. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +9 -25
  18. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +20 -43
  19. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +2 -2
  20. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +1 -1
  21. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +7 -6
  22. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +9 -4
  23. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +4 -17
  24. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +6 -19
  25. package/src/sap/fe/core/converters/controls/Common/Table.js +12 -2
  26. package/src/sap/fe/core/converters/controls/Common/Table.ts +18 -1
  27. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +3 -2
  28. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +2 -1
  29. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +19 -5
  30. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +28 -5
  31. package/src/sap/fe/core/fpm/manifest.json +1 -1
  32. package/src/sap/fe/core/helpers/DeleteHelper.js +4 -2
  33. package/src/sap/fe/core/helpers/DeleteHelper.ts +1 -1
  34. package/src/sap/fe/core/helpers/ModelHelper.js +9 -18
  35. package/src/sap/fe/core/helpers/ModelHelper.ts +12 -17
  36. package/src/sap/fe/core/library.js +1 -1
  37. package/src/sap/fe/core/messagebundle.properties +4 -0
  38. package/src/sap/fe/core/messagebundle_ar.properties +5 -3
  39. package/src/sap/fe/core/messagebundle_bg.properties +2 -0
  40. package/src/sap/fe/core/messagebundle_ca.properties +2 -0
  41. package/src/sap/fe/core/messagebundle_cnr.properties +2 -0
  42. package/src/sap/fe/core/messagebundle_cs.properties +2 -0
  43. package/src/sap/fe/core/messagebundle_cy.properties +2 -0
  44. package/src/sap/fe/core/messagebundle_da.properties +2 -0
  45. package/src/sap/fe/core/messagebundle_de.properties +2 -0
  46. package/src/sap/fe/core/messagebundle_el.properties +2 -0
  47. package/src/sap/fe/core/messagebundle_en.properties +2 -0
  48. package/src/sap/fe/core/messagebundle_en_GB.properties +2 -0
  49. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +2 -0
  50. package/src/sap/fe/core/messagebundle_es.properties +3 -1
  51. package/src/sap/fe/core/messagebundle_es_MX.properties +2 -0
  52. package/src/sap/fe/core/messagebundle_et.properties +2 -0
  53. package/src/sap/fe/core/messagebundle_fi.properties +2 -0
  54. package/src/sap/fe/core/messagebundle_fr.properties +4 -2
  55. package/src/sap/fe/core/messagebundle_fr_CA.properties +2 -0
  56. package/src/sap/fe/core/messagebundle_hi.properties +2 -0
  57. package/src/sap/fe/core/messagebundle_hr.properties +2 -0
  58. package/src/sap/fe/core/messagebundle_hu.properties +2 -0
  59. package/src/sap/fe/core/messagebundle_id.properties +4 -2
  60. package/src/sap/fe/core/messagebundle_it.properties +2 -0
  61. package/src/sap/fe/core/messagebundle_iw.properties +2 -0
  62. package/src/sap/fe/core/messagebundle_ja.properties +2 -0
  63. package/src/sap/fe/core/messagebundle_kk.properties +2 -0
  64. package/src/sap/fe/core/messagebundle_ko.properties +6 -4
  65. package/src/sap/fe/core/messagebundle_lt.properties +2 -0
  66. package/src/sap/fe/core/messagebundle_lv.properties +2 -0
  67. package/src/sap/fe/core/messagebundle_mk.properties +2 -0
  68. package/src/sap/fe/core/messagebundle_ms.properties +2 -0
  69. package/src/sap/fe/core/messagebundle_nl.properties +2 -0
  70. package/src/sap/fe/core/messagebundle_no.properties +2 -0
  71. package/src/sap/fe/core/messagebundle_pl.properties +2 -0
  72. package/src/sap/fe/core/messagebundle_pt.properties +2 -0
  73. package/src/sap/fe/core/messagebundle_pt_PT.properties +2 -0
  74. package/src/sap/fe/core/messagebundle_ro.properties +2 -0
  75. package/src/sap/fe/core/messagebundle_ru.properties +2 -0
  76. package/src/sap/fe/core/messagebundle_sh.properties +2 -0
  77. package/src/sap/fe/core/messagebundle_sk.properties +2 -0
  78. package/src/sap/fe/core/messagebundle_sl.properties +2 -0
  79. package/src/sap/fe/core/messagebundle_sr.properties +2 -0
  80. package/src/sap/fe/core/messagebundle_sv.properties +2 -0
  81. package/src/sap/fe/core/messagebundle_th.properties +2 -0
  82. package/src/sap/fe/core/messagebundle_tr.properties +2 -0
  83. package/src/sap/fe/core/messagebundle_uk.properties +2 -0
  84. package/src/sap/fe/core/messagebundle_vi.properties +9 -7
  85. package/src/sap/fe/core/messagebundle_zh_CN.properties +2 -0
  86. package/src/sap/fe/core/messagebundle_zh_TW.properties +2 -0
@@ -2,12 +2,11 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/library", "sap/m/InstanceManager", "sap/ui/model/odata/v4/SubmitMode", "../../../helpers/ModelHelper", "../../../helpers/TypeGuards", "./ODataStrictHandling", "./actionHelper"], function (Log, deepClone, MetaModelConverter, FELibrary, InstanceManager, SubmitMode, ModelHelper, TypeGuards, ODataStrictHandling, actionHelper) {
5
+ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/library", "sap/m/InstanceManager", "sap/ui/model/odata/v4/SubmitMode", "../../../helpers/ModelHelper", "../../../helpers/TypeGuards", "./ODataStrictHandling", "./actionHelper"], function (Log, deepClone, FELibrary, InstanceManager, SubmitMode, ModelHelper, TypeGuards, ODataStrictHandling, actionHelper) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
9
9
  var isAction = TypeGuards.isAction;
10
- var convertTypes = MetaModelConverter.convertTypes;
11
10
  const InvocationGrouping = FELibrary.InvocationGrouping;
12
11
  let ODataOperation = /*#__PURE__*/function () {
13
12
  function ODataOperation(operation, parameters) {
@@ -20,7 +19,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/converter
20
19
  this.neverSubmitted = true;
21
20
  this.failedContexts = [];
22
21
  this.operationPromises = [];
23
- this.additionalSelectProperties = [];
24
22
  this.operation = operation;
25
23
  this.parameters = parameters;
26
24
  this.operationProperties = operationProperties;
@@ -50,17 +48,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/converter
50
48
  var _proto = ODataOperation.prototype;
51
49
  _proto.setBindingParameters = function setBindingParameters() {
52
50
  this.bindingParameters = deepClone(this.operationProperties.bindingParameters ?? {});
53
- if (isAction(this.operation) && this.parameters.contexts.length && this.operationProperties.enhance$select === true) {
51
+ if (isAction(this.operation) && !this.operation.isFunction && this.parameters.contexts.length && this.operationProperties.enhance$select === true) {
54
52
  const existingSelect = this.bindingParameters.$select?.split(",") ?? [];
55
53
  const returnEntityType = this.operation.returnEntityType;
56
54
  const metaModel = this.parameters.model.getMetaModel();
57
55
  const messagesPath = ModelHelper.getMessagesPath(metaModel, this.parameters.contexts[0].getPath());
58
- const entitySet = convertTypes(metaModel).entitySets.filter(entity => entity.entityType === returnEntityType)?.[0];
59
56
  const isSameEntity = !this.operation.returnCollection && !!returnEntityType && this.operation.sourceEntityType === returnEntityType;
60
57
  if (isSameEntity) {
61
- if (ModelHelper.isDraftRoot(entitySet) && !existingSelect.includes("HasActiveEntity")) {
62
- this.additionalSelectProperties.push("HasActiveEntity");
63
- }
64
58
  if (
65
59
  /* The former logic checked if the messagesPath is contained into the SideEffects
66
60
  but the check was invalid (always true)
@@ -70,13 +64,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/converter
70
64
  messagesPath &&
71
65
  (this.sideEffects.pathExpressions ?? []).some((exp) => typeof exp === "string" && [messagesPath, "*"].includes(exp))*/
72
66
  messagesPath && !!returnEntityType?.entityProperties.find(property => property.name === messagesPath) && !existingSelect.includes(messagesPath)) {
73
- this.additionalSelectProperties.push(messagesPath);
67
+ this.bindingParameters.$select = this.bindingParameters.$select ? `${this.bindingParameters.$select},${messagesPath}` : messagesPath;
68
+ this.bindingParameters.$$inheritExpandSelect = true;
74
69
  }
75
70
  }
76
- if (this.additionalSelectProperties.length) {
77
- const selectProperties = this.additionalSelectProperties.join(",");
78
- this.bindingParameters.$select = this.bindingParameters.$select ? `${this.bindingParameters.$select},${selectProperties}` : selectProperties;
79
- }
80
71
  }
81
72
  }
82
73
 
@@ -403,20 +394,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/converter
403
394
  */;
404
395
  _proto.requestSideEffects = async function requestSideEffects(context, groupId, localPromise) {
405
396
  const sideEffectsService = this.parameters.appComponent.getSideEffectsService();
406
- const metaModel = this.parameters.model.getMetaModel();
407
- const messagesPath = this.parameters.contexts.length ? ModelHelper.getMessagesPath(metaModel, this.parameters.contexts[0].getPath()) : undefined;
408
397
  let promises = localPromise ?? [];
409
- if (this.parameters.disableSideEffects !== true) {
410
- const pathExpressions = [...(this.sideEffects?.pathExpressions ?? []), ...(this.sideEffects?.pathExpressions && messagesPath && this.additionalSelectProperties.includes(messagesPath) && this.sideEffects.pathExpressions.some(exp => typeof exp === "string" && (exp === messagesPath || exp === "*")) ? ["*"] : [])
411
- // Former workflow -> we add "*" to the SideEffects to get all properties only if the messagesPath is in the initial SideEffects
412
- // and messagesPath is added in the $select of the operation
413
- ];
414
- if (this.sideEffects || pathExpressions.length) {
415
- promises = promises.concat((this.sideEffects?.triggerActions ?? []).map(async action => sideEffectsService.executeAction(action, context, groupId)), pathExpressions.length ? sideEffectsService.requestSideEffects(pathExpressions, context, groupId) : []);
416
- }
398
+ // trigger actions from side effects
399
+ if (this.sideEffects && !this.parameters.disableSideEffects === true) {
400
+ promises = promises.concat((this.sideEffects.triggerActions ?? []).map(async action => sideEffectsService.executeAction(action, context, groupId)), this.sideEffects.pathExpressions ? sideEffectsService.requestSideEffects(this.sideEffects.pathExpressions, context, groupId) : []);
417
401
  try {
418
402
  await Promise.all(promises);
419
- if (this.sideEffects?.pathExpressions) {
403
+ if (this.sideEffects.pathExpressions) {
420
404
  this.parameters.events?.onRequestSideEffects?.(this.sideEffects, this.operation, promises);
421
405
  }
422
406
  } catch (error) {
@@ -429,4 +413,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/converter
429
413
  _exports = ODataOperation;
430
414
  return _exports;
431
415
  }, false);
432
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnZvY2F0aW9uR3JvdXBpbmciLCJGRUxpYnJhcnkiLCJPRGF0YU9wZXJhdGlvbiIsIm9wZXJhdGlvbiIsInBhcmFtZXRlcnMiLCJvcGVyYXRpb25Qcm9wZXJ0aWVzIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwib3BlcmF0aW9uQ29udGV4dEJpbmRpbmdzIiwiZmlyc3RJdGVyYXRpb25PcGVyYXRpb25zIiwiYXBpR3JvdXBJZHNUb1N1Ym1pdCIsIlNldCIsImJpbmRpbmdQYXJhbWV0ZXJzIiwib3BlcmF0aW9uUGFyYW1ldGVycyIsIm5ldmVyU3VibWl0dGVkIiwiZmFpbGVkQ29udGV4dHMiLCJvcGVyYXRpb25Qcm9taXNlcyIsImFkZGl0aW9uYWxTZWxlY3RQcm9wZXJ0aWVzIiwiYWN0aW9uTmFtZSIsImFjdGlvbkhlbHBlciIsImdldEFjdGlvbk5hbWUiLCJpc0FjdGlvbiIsImFjdGlvbiIsInNpZGVFZmZlY3RzIiwiYXBwQ29tcG9uZW50IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyIsImNvbnRleHRzIiwiaXNGdW5jdGlvbiIsImRpc2FibGVTdHJpY3RIYW5kbGluZyIsIm9EYXRhU3RyaWN0SGFuZGxpbmciLCJPRGF0YVN0cmljdEhhbmRsaW5nIiwibGFiZWwiLCJpbnZvY2F0aW9uR3JvdXBpbmciLCJldmVudHMiLCJvblJlc3BvbnNlIiwib25TdHJpY3RSZXNwb25zZSIsIm9uVmFsaWRhdGlvbiIsIm9uU3RyaWN0VmFsaWRhdGlvbiIsImJpbmQiLCJvbkNhbmNlbCIsIm9uU3RyaWN0Q2FuY2VsIiwiZGVmaW5lT3BlcmF0aW9uUGFyYW1ldGVycyIsInNldEJpbmRpbmdQYXJhbWV0ZXJzIiwiX2V4cG9ydHMiLCJfcHJvdG8iLCJwcm90b3R5cGUiLCJkZWVwQ2xvbmUiLCJlbmhhbmNlJHNlbGVjdCIsImV4aXN0aW5nU2VsZWN0IiwiJHNlbGVjdCIsInNwbGl0IiwicmV0dXJuRW50aXR5VHlwZSIsIm1ldGFNb2RlbCIsIm1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwibWVzc2FnZXNQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRNZXNzYWdlc1BhdGgiLCJnZXRQYXRoIiwiZW50aXR5U2V0IiwiY29udmVydFR5cGVzIiwiZW50aXR5U2V0cyIsImZpbHRlciIsImVudGl0eSIsImVudGl0eVR5cGUiLCJpc1NhbWVFbnRpdHkiLCJyZXR1cm5Db2xsZWN0aW9uIiwic291cmNlRW50aXR5VHlwZSIsImlzRHJhZnRSb290IiwiaW5jbHVkZXMiLCJwdXNoIiwiZW50aXR5UHJvcGVydGllcyIsImZpbmQiLCJwcm9wZXJ0eSIsIm5hbWUiLCJzZWxlY3RQcm9wZXJ0aWVzIiwiam9pbiIsImdldEFjdGlvblBhcmFtZXRlcnMiLCJjbGVhciIsIm9wZXJhdGlvbkNvbnRleHRCaW5kaW5nIiwiZGVzdHJveSIsImV4ZWN1dGUiLCJyZXN1bHQiLCJDaGFuZ2VTZXQiLCJleGVjdXRlQ2hhbmdlc2V0IiwiZXhlY3V0ZVNlcXVlbnRpYWxseSIsIlByb21pc2UiLCJhbGxTZXR0bGVkIiwiZXhlY3V0ZUltcG9ydCIsImVycm9yIiwiTG9nIiwib25PRGF0YVJlc3BvbnNlIiwib3BlcmF0aW9uQ29udGV4dCIsImJpbmRDb250ZXh0Iiwic2V0UGFyYW1ldGVyc1ZhbHVlIiwiZ3JvdXBJZCIsInByb21pc2VzIiwiaW52b2tlIiwiZGVmYXVsdFN1Ym1pdCIsImFmdGVyT0RhdGFPcGVyYXRpb25FeGVjdXRpb24iLCJjdXJyZW50UHJvbWlzZVZhbHVlcyIsImFsbCIsIm1hcCIsImNvbnRleHQiLCJleGVjdXRlQm91bmRPcGVyYXRpb24iLCJtYW5hZ2VTdHJpY3RIYW5kbGluZ0ZhaWxzIiwib25BZnRlck9EYXRhT3BlcmF0aW9uRXhlY3V0aW9uIiwicmVkdWNlIiwicHJvbWlzZSIsImlkIiwicmVzb2x2ZSIsImZpbmFsR3JvdXBJZCIsImdldFVwZGF0ZUdyb3VwSWQiLCJvcGVyYXRpb25Qcm9taXNlIiwiZW5oYW5jZVNpZGVFZmZlY3RzIiwicmV0dXJuZWRDb250ZXh0IiwiZ2hvc3RDb250ZXh0QmluZGluZ1Byb3RlY3Rpb24iLCJvcmlnaW4iLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJnZXRJbnN0YW5jZWRWaWV3cyIsInNvbWUiLCJwYWdlVmlldyIsImdldEJpbmRpbmdDb250ZXh0IiwiSW5zdGFuY2VNYW5hZ2VyIiwiZ2V0T3BlbkRpYWxvZ3MiLCJkaWFsb2ciLCJmaXJzdEl0ZXJhdGlvblJlc29sdmUiLCJmaXJzdEl0ZXJhdGlvblJlamVjdCIsInN0cmljdEhhbmRsaW5nUHJvbWlzZSIsInJlamVjdCIsImlzQVBJTW9kZSIsImFkZCIsInNpZGVFZmZlY3RzQ29udGV4dCIsImdldENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJvcGVyYXRpb25JbnZva2UiLCJpZ25vcmVFVGFnIiwiaGFuZGxlT2RhdGFTdHJpY3RIYW5kbGluZyIsInN1Ym1pdEJhdGNoIiwicmVwbGFjZVdpdGhSVkMiLCJyYWNlIiwib25BZnRlck9EYXRhSW52b2tlIiwiYm91bmRDb250ZXh0IiwicmV0cmlnZ2VyRmFpbGVkQ29udGV4dHMiLCJpbmRleCIsImZhaWxlZENvbnRleHQiLCJzdWJtaXQiLCJzaXplIiwiQXJyYXkiLCJmcm9tIiwidmFsdWVzIiwic3VibWl0T25Nb2RlbCIsIm9uT0RhdGFTdWJtaXQiLCJpc1N0cmljdENhbmNlbGVkIiwiaXNDYW5jZWxlZCIsImRlbGV0ZSIsInN0YXJ0c1dpdGgiLCJzdWJtaXRNb2RlIiwiZ2V0TWFuaWZlc3RFbnRyeSIsIm1vZGVscyIsInNldHRpbmdzIiwiZ3JvdXBQcm9wZXJ0aWVzIiwiU3VibWl0TW9kZSIsIkF1dG8iLCJEaXJlY3QiLCJmaXJzdFN1Ym1pdCIsImRlZmVycmVkU3VibWl0IiwiZGVmYXVsdFZhbHVlcyIsInBhcmFtZXRlcnNWYWx1ZXMiLCJwYXJhbWV0ZXIiLCJ0eXBlIiwic2V0UGFyYW1ldGVyIiwibG9jYWxQcm9taXNlIiwic2lkZUVmZmVjdHNTZXJ2aWNlIiwiZGlzYWJsZVNpZGVFZmZlY3RzIiwicGF0aEV4cHJlc3Npb25zIiwiZXhwIiwiY29uY2F0IiwidHJpZ2dlckFjdGlvbnMiLCJleGVjdXRlQWN0aW9uIiwib25SZXF1ZXN0U2lkZUVmZmVjdHMiLCJpbmZvIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJPRGF0YU9wZXJhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFjdGlvbkltcG9ydCwgQWN0aW9uUGFyYW1ldGVyLCBBY3Rpb24gYXMgRWRtQWN0aW9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBkZWVwQ2xvbmUgZnJvbSBcInNhcC9iYXNlL3V0aWwvZGVlcENsb25lXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgSW5zdGFuY2VNYW5hZ2VyIGZyb20gXCJzYXAvbS9JbnN0YW5jZU1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBPRGF0YVY0Q29udGV4dCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgU3VibWl0TW9kZSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L1N1Ym1pdE1vZGVcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwiLi4vLi4vLi4vaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgaXNBY3Rpb24gfSBmcm9tIFwiLi4vLi4vLi4vaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgdHlwZSB7IEFjdGlvblNpZGVFZmZlY3RzVHlwZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRDb250ZXh0UGFyYW1ldGVycyB9IGZyb20gXCIuLi9kcmFmdFwiO1xuaW1wb3J0IE9EYXRhU3RyaWN0SGFuZGxpbmcgZnJvbSBcIi4vT0RhdGFTdHJpY3RIYW5kbGluZ1wiO1xuaW1wb3J0IGFjdGlvbkhlbHBlciBmcm9tIFwiLi9hY3Rpb25IZWxwZXJcIjtcblxuY29uc3QgSW52b2NhdGlvbkdyb3VwaW5nID0gRkVMaWJyYXJ5Lkludm9jYXRpb25Hcm91cGluZztcblxuZXhwb3J0IHR5cGUgT3BlcmF0aW9uUmVzdWx0ID0ge1xuXHRyZXR1cm5lZENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0Ym91bmRDb250ZXh0OiBPRGF0YVY0Q29udGV4dDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE9EYXRhT3BlcmF0aW9uIHtcblx0cHJpdmF0ZSBvcGVyYXRpb25Db250ZXh0QmluZGluZ3M6IE9EYXRhQ29udGV4dEJpbmRpbmdbXSA9IFtdO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgZmlyc3RJdGVyYXRpb25PcGVyYXRpb25zOiBQcm9taXNlPHVua25vd24+W10gPSBbXTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGFwaUdyb3VwSWRzVG9TdWJtaXQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgc2lkZUVmZmVjdHM6IEFjdGlvblNpZGVFZmZlY3RzVHlwZSB8IHVuZGVmaW5lZDtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGFjdGlvbk5hbWU6IHN0cmluZztcblxuXHRwcml2YXRlIGJpbmRpbmdQYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG5cdHByaXZhdGUgb3BlcmF0aW9uUGFyYW1ldGVyczogQWN0aW9uUGFyYW1ldGVyW10gPSBbXTtcblxuXHRwcml2YXRlIG5ldmVyU3VibWl0dGVkID0gdHJ1ZTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IG9EYXRhU3RyaWN0SGFuZGxpbmc6IE9EYXRhU3RyaWN0SGFuZGxpbmcgfCB1bmRlZmluZWQ7XG5cblx0cHJpdmF0ZSBmYWlsZWRDb250ZXh0czogT0RhdGFWNENvbnRleHRbXSA9IFtdO1xuXG5cdHByaXZhdGUgb3BlcmF0aW9uUHJvbWlzZXM6IFByb21pc2U8T3BlcmF0aW9uUmVzdWx0PltdID0gW107XG5cblx0cHJpdmF0ZSByZWFkb25seSBhZGRpdGlvbmFsU2VsZWN0UHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblxuXHRjb25zdHJ1Y3Rvcihcblx0XHRwcml2YXRlIHJlYWRvbmx5IG9wZXJhdGlvbjogRWRtQWN0aW9uIHwgQWN0aW9uSW1wb3J0LFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgcGFyYW1ldGVyczoge1xuXHRcdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQ7XG5cdFx0XHRjb250ZXh0czogT0RhdGFWNENvbnRleHRbXTtcblx0XHRcdG1vZGVsOiBPRGF0YU1vZGVsO1xuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdFx0ZGlzYWJsZVN0cmljdEhhbmRsaW5nPzogYm9vbGVhbjtcblx0XHRcdGRpc2FibGVTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRnaG9zdENvbnRleHRCaW5kaW5nUHJvdGVjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGV2ZW50cz86IHtcblx0XHRcdFx0b25TdHJpY3RWYWxpZGF0aW9uPzogRnVuY3Rpb247IC8vZXZlbnRzIHRyaWdnZXJlZCB3aGVuIHRoZSBzdHJpY3QgaGFuZGxpbmcgaXMgdmFsaWRhdGVkIGJ5IHRoZSBlbmQgdXNlclxuXHRcdFx0XHRvblN0cmljdENhbmNlbD86IEZ1bmN0aW9uOyAvL2V2ZW50cyB0cmlnZ2VyZWQgd2hlbiB0aGUgc3RyaWN0IGhhbmRsaW5nIGlzIGNhbmNlbGVkIGJ5IHRoZSBlbmQgdXNlclxuXHRcdFx0XHRvblN0cmljdFJlc3BvbnNlPzogKG1lc3NhZ2VzNDEyOiBNZXNzYWdlW10pID0+IHZvaWQ7IC8vZXZlbnRzIHRyaWdnZXJlZCB3aGVuIGJhY2tlbmQgcmV0dXJucyAgNDEyIG1lc3NhZ2VzIChzdHJpY3QgaGFuZGxpbmcpXG5cdFx0XHRcdG9uT0RhdGFSZXNwb25zZT86IEZ1bmN0aW9uOyAvL2V2ZW50cyB0cmlnZ2VyZWQgd2hlbiBhbGwgcmVzcG9uc2VzIHJlbGF0ZWQgdG8gdGhlIEZpb3JpIGVsZW1lbnQgb3BlcmF0aW9ucyBhcmUgcmVjZWl2ZWRcblx0XHRcdFx0b25PRGF0YVN1Ym1pdD86IEZ1bmN0aW9uOyAvL2V2ZW50cyB0cmlnZ2VyZWQgd2hlbiB0aGUgYmF0Y2ggaXMgc3VibWl0dGVkIChyZXF1ZXN0IHNlbnQgdG8gdGhlIGJhY2sgZW5kKVxuXHRcdFx0XHRvbkFmdGVyT0RhdGFJbnZva2U/OiBGdW5jdGlvbjsgLy9ldmVudHMgdHJpZ2dlcmVkIHdoZW4gdGhlIHByb21pc2Ugb2YgaW52b2tlIG1ldGhvZCBvZiB0aGUgb0RhdGFDb250ZXh0QmluZGluZyBpcyByZXNvbHZlZFxuXHRcdFx0XHRvbkFmdGVyT0RhdGFPcGVyYXRpb25FeGVjdXRpb24/OiBGdW5jdGlvbjsgLy9ldmVudHMgdHJpZ2dlcmVkIHdoZW4gZmlyc3QgcmVzcG9uc2VzIHJlbGF0ZWQgdG8gdGhlIEZpb3JpIGVsZW1lbnQgb3BlcmF0aW9ucyBhcmUgcmVjZWl2ZWQgKGJlZm9yZSBzdHJpY3QgaGFuZGxpbmcgb3IgZmluYWwgcmVzcG9uc2UgaWYgbm8gNDEyIGFyZSByZWNlaXZlZClcblx0XHRcdFx0b25SZXF1ZXN0U2lkZUVmZmVjdHM/OiBGdW5jdGlvbjsgLy9ldmVudHMgdHJpZ2dlcmVkIHdoZW4gc2lkZUVmZmVjdHMgYXJlIHRyaWdnZXJlZFxuXHRcdFx0fTtcblx0XHRcdHBhcmFtZXRlcnNWYWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHR9LFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgb3BlcmF0aW9uUHJvcGVydGllczoge1xuXHRcdFx0ZW5oYW5jZSRzZWxlY3Q/OiBib29sZWFuO1xuXHRcdFx0Z3JvdXBJZD86IHN0cmluZztcblx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzO1xuXHRcdFx0ZGVmZXJyZWRTdWJtaXQ/OiBib29sZWFuO1xuXHRcdFx0aWdub3JlRVRhZz86IGJvb2xlYW47XG5cdFx0XHRyZXBsYWNlV2l0aFJWQz86IGJvb2xlYW47XG5cdFx0fSA9IHt9XG5cdCkge1xuXHRcdHRoaXMuYWN0aW9uTmFtZSA9IGFjdGlvbkhlbHBlci5nZXRBY3Rpb25OYW1lKGlzQWN0aW9uKHRoaXMub3BlcmF0aW9uKSA/IHRoaXMub3BlcmF0aW9uIDogdGhpcy5vcGVyYXRpb24uYWN0aW9uKTtcblxuXHRcdHRoaXMuc2lkZUVmZmVjdHMgPSB0aGlzLnBhcmFtZXRlcnMuYXBwQ29tcG9uZW50XG5cdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdC5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHRoaXMuYWN0aW9uTmFtZSwgdGhpcy5wYXJhbWV0ZXJzLmNvbnRleHRzLmxlbmd0aCA/IHRoaXMucGFyYW1ldGVycy5jb250ZXh0c1swXSA6IHVuZGVmaW5lZCk7XG5cblx0XHRpZiAoISh0aGlzLm9wZXJhdGlvbiBhcyBFZG1BY3Rpb24pLmlzRnVuY3Rpb24gJiYgdGhpcy5wYXJhbWV0ZXJzLmRpc2FibGVTdHJpY3RIYW5kbGluZyAhPT0gdHJ1ZSkge1xuXHRcdFx0dGhpcy5vRGF0YVN0cmljdEhhbmRsaW5nID0gbmV3IE9EYXRhU3RyaWN0SGFuZGxpbmcoe1xuXHRcdFx0XHRhcHBDb21wb25lbnQ6IHRoaXMucGFyYW1ldGVycy5hcHBDb21wb25lbnQsXG5cdFx0XHRcdGNvbnRleHRzOiB0aGlzLnBhcmFtZXRlcnMuY29udGV4dHMsXG5cdFx0XHRcdGxhYmVsOiB0aGlzLnBhcmFtZXRlcnMubGFiZWwgPz8gdGhpcy5hY3Rpb25OYW1lLFxuXHRcdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc6IHRoaXMucGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcsXG5cdFx0XHRcdGV2ZW50czoge1xuXHRcdFx0XHRcdG9uUmVzcG9uc2U6IHRoaXMucGFyYW1ldGVycy5ldmVudHM/Lm9uU3RyaWN0UmVzcG9uc2UsXG5cdFx0XHRcdFx0b25WYWxpZGF0aW9uOiB0aGlzLm9uU3RyaWN0VmFsaWRhdGlvbi5iaW5kKHRoaXMpLFxuXHRcdFx0XHRcdG9uQ2FuY2VsOiB0aGlzLnBhcmFtZXRlcnMuZXZlbnRzPy5vblN0cmljdENhbmNlbFxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0dGhpcy5kZWZpbmVPcGVyYXRpb25QYXJhbWV0ZXJzKCk7XG5cdFx0dGhpcy5zZXRCaW5kaW5nUGFyYW1ldGVycygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgcGFyYW1ldGVycyBmb3IgdGhlIG9wZXJhdGlvbnMuXG5cdCAqL1xuXHRwcml2YXRlIHNldEJpbmRpbmdQYXJhbWV0ZXJzKCk6IHZvaWQge1xuXHRcdHRoaXMuYmluZGluZ1BhcmFtZXRlcnMgPSBkZWVwQ2xvbmUodGhpcy5vcGVyYXRpb25Qcm9wZXJ0aWVzLmJpbmRpbmdQYXJhbWV0ZXJzID8/IHt9KTtcblxuXHRcdGlmIChpc0FjdGlvbih0aGlzLm9wZXJhdGlvbikgJiYgdGhpcy5wYXJhbWV0ZXJzLmNvbnRleHRzLmxlbmd0aCAmJiB0aGlzLm9wZXJhdGlvblByb3BlcnRpZXMuZW5oYW5jZSRzZWxlY3QgPT09IHRydWUpIHtcblx0XHRcdGNvbnN0IGV4aXN0aW5nU2VsZWN0ID0gKHRoaXMuYmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdCBhcyBzdHJpbmcgfCB1bmRlZmluZWQpPy5zcGxpdChcIixcIikgPz8gW107XG5cdFx0XHRjb25zdCByZXR1cm5FbnRpdHlUeXBlID0gdGhpcy5vcGVyYXRpb24ucmV0dXJuRW50aXR5VHlwZTtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IHRoaXMucGFyYW1ldGVycy5tb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IG1lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChtZXRhTW9kZWwsIHRoaXMucGFyYW1ldGVycy5jb250ZXh0c1swXS5nZXRQYXRoKCkpITtcblx0XHRcdGNvbnN0IGVudGl0eVNldCA9IGNvbnZlcnRUeXBlcyhtZXRhTW9kZWwpLmVudGl0eVNldHMuZmlsdGVyKChlbnRpdHkpID0+IGVudGl0eS5lbnRpdHlUeXBlID09PSByZXR1cm5FbnRpdHlUeXBlKT8uWzBdO1xuXHRcdFx0Y29uc3QgaXNTYW1lRW50aXR5ID1cblx0XHRcdFx0IXRoaXMub3BlcmF0aW9uLnJldHVybkNvbGxlY3Rpb24gJiYgISFyZXR1cm5FbnRpdHlUeXBlICYmIHRoaXMub3BlcmF0aW9uLnNvdXJjZUVudGl0eVR5cGUgPT09IHJldHVybkVudGl0eVR5cGU7XG5cdFx0XHRpZiAoaXNTYW1lRW50aXR5KSB7XG5cdFx0XHRcdGlmIChNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChlbnRpdHlTZXQpICYmICFleGlzdGluZ1NlbGVjdC5pbmNsdWRlcyhcIkhhc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdFx0XHRcdHRoaXMuYWRkaXRpb25hbFNlbGVjdFByb3BlcnRpZXMucHVzaChcIkhhc0FjdGl2ZUVudGl0eVwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0LyogVGhlIGZvcm1lciBsb2dpYyBjaGVja2VkIGlmIHRoZSBtZXNzYWdlc1BhdGggaXMgY29udGFpbmVkIGludG8gdGhlIFNpZGVFZmZlY3RzXG4gICAgICAgICAgICAgICAgICAgICAgIGJ1dCB0aGUgY2hlY2sgd2FzIGludmFsaWQgKGFsd2F5cyB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICBUbyBiZSBjb21wbGlhbnQgd2l0aCBmb3JtZXIgdmVyc2lvbiB3ZSBkb24ndCBjaGVjayB0aGUgU2lkZUVmZmVjdHMuLlxuXHRcdFx0XHRcdCAgIFxuXHRcdFx0XHRcdCAgIHRoaXMuc2lkZUVmZmVjdHMgJiZcblx0XHRcdFx0XHQgICBtZXNzYWdlc1BhdGggJiZcblx0XHRcdFx0XHQgICAodGhpcy5zaWRlRWZmZWN0cy5wYXRoRXhwcmVzc2lvbnMgPz8gW10pLnNvbWUoKGV4cCkgPT4gdHlwZW9mIGV4cCA9PT0gXCJzdHJpbmdcIiAmJiBbbWVzc2FnZXNQYXRoLCBcIipcIl0uaW5jbHVkZXMoZXhwKSkqL1xuXHRcdFx0XHRcdG1lc3NhZ2VzUGF0aCAmJlxuXHRcdFx0XHRcdCEhcmV0dXJuRW50aXR5VHlwZT8uZW50aXR5UHJvcGVydGllcy5maW5kKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSA9PT0gbWVzc2FnZXNQYXRoKSAmJlxuXHRcdFx0XHRcdCFleGlzdGluZ1NlbGVjdC5pbmNsdWRlcyhtZXNzYWdlc1BhdGgpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHRoaXMuYWRkaXRpb25hbFNlbGVjdFByb3BlcnRpZXMucHVzaChtZXNzYWdlc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmFkZGl0aW9uYWxTZWxlY3RQcm9wZXJ0aWVzLmxlbmd0aCkge1xuXHRcdFx0XHRjb25zdCBzZWxlY3RQcm9wZXJ0aWVzID0gdGhpcy5hZGRpdGlvbmFsU2VsZWN0UHJvcGVydGllcy5qb2luKFwiLFwiKTtcblx0XHRcdFx0dGhpcy5iaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0ID0gdGhpcy5iaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0XG5cdFx0XHRcdFx0PyBgJHt0aGlzLmJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3R9LCR7c2VsZWN0UHJvcGVydGllc31gXG5cdFx0XHRcdFx0OiBzZWxlY3RQcm9wZXJ0aWVzO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZpbmVzIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBvcGVyYXRpb24uXG5cdCAqL1xuXHRwcml2YXRlIGRlZmluZU9wZXJhdGlvblBhcmFtZXRlcnMoKTogdm9pZCB7XG5cdFx0aWYgKCFpc0FjdGlvbih0aGlzLm9wZXJhdGlvbikpIHtcblx0XHRcdHRoaXMub3BlcmF0aW9uUGFyYW1ldGVycyA9IHRoaXMub3BlcmF0aW9uLmFjdGlvbi5wYXJhbWV0ZXJzO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvL1JlbW92ZSB0aGUgYmluZGluZyBwYXJhbWV0ZXJzIGZyb20gdGhlIHBhcmFtZXRlcnMgbGlzdFxuXHRcdFx0dGhpcy5vcGVyYXRpb25QYXJhbWV0ZXJzID0gYWN0aW9uSGVscGVyLmdldEFjdGlvblBhcmFtZXRlcnModGhpcy5vcGVyYXRpb24pO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IG9wZXJhdGlvbkNvbnRleHRCaW5kaW5nIG9mIHRoaXMub3BlcmF0aW9uQ29udGV4dEJpbmRpbmdzKSB7XG5cdFx0XHRvcGVyYXRpb25Db250ZXh0QmluZGluZy5kZXN0cm95KCk7XG5cdFx0fVxuXHRcdHRoaXMuYXBpR3JvdXBJZHNUb1N1Ym1pdC5jbGVhcigpO1xuXHRcdHRoaXMub3BlcmF0aW9uQ29udGV4dEJpbmRpbmdzID0gW107XG5cdFx0dGhpcy5mYWlsZWRDb250ZXh0cyA9IFtdO1xuXHRcdHRoaXMub3BlcmF0aW9uUHJvbWlzZXMgPSBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB0aGUgb3BlcmF0aW9uLlxuXHQgKiBAcmV0dXJucyBUaGUgcHJvbWlzZSBvZiB0aGUgb3BlcmF0aW9uXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlKCk6IFByb21pc2U8UHJvbWlzZVNldHRsZWRSZXN1bHQ8T3BlcmF0aW9uUmVzdWx0PltdPiB7XG5cdFx0bGV0IHJlc3VsdDogUHJvbWlzZVNldHRsZWRSZXN1bHQ8T3BlcmF0aW9uUmVzdWx0PltdO1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAodGhpcy5wYXJhbWV0ZXJzLmNvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXN1bHQgPSBhd2FpdCAodGhpcy5wYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyA9PT0gSW52b2NhdGlvbkdyb3VwaW5nLkNoYW5nZVNldFxuXHRcdFx0XHRcdD8gdGhpcy5leGVjdXRlQ2hhbmdlc2V0KClcblx0XHRcdFx0XHQ6IHRoaXMuZXhlY3V0ZVNlcXVlbnRpYWxseSgpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbdGhpcy5leGVjdXRlSW1wb3J0KCldKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZXhlY3V0aW5nIG9wZXJhdGlvbiBcIiArIHRoaXMuYWN0aW9uTmFtZSwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0aGlzLnBhcmFtZXRlcnMuZXZlbnRzPy5vbk9EYXRhUmVzcG9uc2U/LigpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHRoZSBpbXBvcnQgb3BlcmF0aW9uLlxuXHQgKiBAcmV0dXJucyBUaGUgcHJvbWlzZSBvZiB0aGUgb3BlcmF0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGV4ZWN1dGVJbXBvcnQoKTogUHJvbWlzZTxPcGVyYXRpb25SZXN1bHQ+IHtcblx0XHRjb25zdCBvcGVyYXRpb25Db250ZXh0ID0gdGhpcy5wYXJhbWV0ZXJzLm1vZGVsLmJpbmRDb250ZXh0KGAvJHt0aGlzLmFjdGlvbk5hbWV9KC4uLilgKTtcblx0XHR0aGlzLm9wZXJhdGlvbkNvbnRleHRCaW5kaW5ncy5wdXNoKG9wZXJhdGlvbkNvbnRleHQpO1xuXHRcdHRoaXMuc2V0UGFyYW1ldGVyc1ZhbHVlKG9wZXJhdGlvbkNvbnRleHQpO1xuXHRcdGNvbnN0IGdyb3VwSWQgPSB0aGlzLm9wZXJhdGlvblByb3BlcnRpZXMuZ3JvdXBJZCA/PyBcImFjdGlvbkltcG9ydFwiO1xuXHRcdGNvbnN0IHByb21pc2VzID0gW3RoaXMuaW52b2tlKG9wZXJhdGlvbkNvbnRleHQsIGdyb3VwSWQpXTtcblxuXHRcdHRoaXMuZGVmYXVsdFN1Ym1pdChncm91cElkKTtcblx0XHRhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQodGhpcy5maXJzdEl0ZXJhdGlvbk9wZXJhdGlvbnMpO1xuXHRcdGF3YWl0IHRoaXMuYWZ0ZXJPRGF0YU9wZXJhdGlvbkV4ZWN1dGlvbigpO1xuXHRcdGNvbnN0IGN1cnJlbnRQcm9taXNlVmFsdWVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuXHRcdHJldHVybiBjdXJyZW50UHJvbWlzZVZhbHVlc1swXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB0aGUgb3BlcmF0aW9ucyBvbiBvbmUgY2hhbmdlc2V0LlxuXHQgKiBAcmV0dXJucyBUaGUgcHJvbWlzZSBvZiB0aGUgb3BlcmF0aW9uc1xuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBleGVjdXRlQ2hhbmdlc2V0KCk6IFByb21pc2U8UHJvbWlzZVNldHRsZWRSZXN1bHQ8T3BlcmF0aW9uUmVzdWx0PltdPiB7XG5cdFx0dGhpcy5vcGVyYXRpb25Qcm9taXNlcyA9IHRoaXMucGFyYW1ldGVycy5jb250ZXh0cy5tYXAoYXN5bmMgKGNvbnRleHQpID0+XG5cdFx0XHR0aGlzLmV4ZWN1dGVCb3VuZE9wZXJhdGlvbihjb250ZXh0LCB0aGlzLm9wZXJhdGlvblByb3BlcnRpZXMuZ3JvdXBJZClcblx0XHQpO1xuXHRcdGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZCh0aGlzLmZpcnN0SXRlcmF0aW9uT3BlcmF0aW9ucyk7XG5cdFx0YXdhaXQgdGhpcy5hZnRlck9EYXRhT3BlcmF0aW9uRXhlY3V0aW9uKCk7XG5cdFx0cmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZCh0aGlzLm9wZXJhdGlvblByb21pc2VzKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgYWZ0ZXJPRGF0YU9wZXJhdGlvbkV4ZWN1dGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRhd2FpdCB0aGlzLm9EYXRhU3RyaWN0SGFuZGxpbmc/Lm1hbmFnZVN0cmljdEhhbmRsaW5nRmFpbHMoKTtcblx0XHRhd2FpdCB0aGlzLnBhcmFtZXRlcnMuZXZlbnRzPy5vbkFmdGVyT0RhdGFPcGVyYXRpb25FeGVjdXRpb24/LigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHRoZSBvcGVyYXRpb25zIHNlcXVlbnRpYWxseS5cblx0ICogQHJldHVybnMgVGhlIHByb21pc2Ugb2YgdGhlIG9wZXJhdGlvbnNcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgZXhlY3V0ZVNlcXVlbnRpYWxseSgpOiBQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXT4ge1xuXHRcdC8vIHNlcmlhbGl6YXRpb246IGV4ZWN1dGVCb3VuZE9wZXJhdGlvbiB0byBiZSBjYWxsZWQgZm9yIGVhY2ggZW50cnkgb25seSBhZnRlciB0aGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHRoZSBvbmUgYmVmb3JlIGhhcyBiZWVuIHJlc29sdmVkXG5cdFx0YXdhaXQgdGhpcy5wYXJhbWV0ZXJzLmNvbnRleHRzLnJlZHVjZShhc3luYyAocHJvbWlzZTogUHJvbWlzZTx2b2lkPiwgY29udGV4dDogT0RhdGFWNENvbnRleHQsIGlkOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRcdGF3YWl0IHByb21pc2U7XG5cdFx0XHR0aGlzLm9wZXJhdGlvblByb21pc2VzLnB1c2godGhpcy5leGVjdXRlQm91bmRPcGVyYXRpb24oY29udGV4dCwgdGhpcy5vcGVyYXRpb25Qcm9wZXJ0aWVzLmdyb3VwSWQgPz8gYGFwaU1vZGUke2lkICsgMX1gKSk7XG5cdFx0XHRhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQodGhpcy5maXJzdEl0ZXJhdGlvbk9wZXJhdGlvbnMpO1xuXHRcdH0sIFByb21pc2UucmVzb2x2ZSgpKTtcblx0XHRhd2FpdCB0aGlzLmFmdGVyT0RhdGFPcGVyYXRpb25FeGVjdXRpb24oKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKHRoaXMub3BlcmF0aW9uUHJvbWlzZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHRoZSBib3VuZCBvcGVyYXRpb24uXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBib3VuZCBjb250ZXh0XG5cdCAqIEBwYXJhbSBncm91cElkIFRoZSBncm91cElkIG9mIHRoZSBiYXRjaFxuXHQgKiBAcmV0dXJucyBUaGUgcHJvbWlzZSBvZiB0aGUgb3BlcmF0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGV4ZWN1dGVCb3VuZE9wZXJhdGlvbihjb250ZXh0OiBPRGF0YVY0Q29udGV4dCwgZ3JvdXBJZD86IHN0cmluZyk6IFByb21pc2U8T3BlcmF0aW9uUmVzdWx0PiB7XG5cdFx0Y29uc3Qgb3BlcmF0aW9uQ29udGV4dCA9IHRoaXMucGFyYW1ldGVycy5tb2RlbC5iaW5kQ29udGV4dChgJHt0aGlzLmFjdGlvbk5hbWV9KC4uLilgLCBjb250ZXh0LCB0aGlzLmJpbmRpbmdQYXJhbWV0ZXJzKTtcblx0XHR0aGlzLm9wZXJhdGlvbkNvbnRleHRCaW5kaW5ncy5wdXNoKG9wZXJhdGlvbkNvbnRleHQpO1xuXHRcdGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHVua25vd24+W10gPSBbXTtcblx0XHR0aGlzLnNldFBhcmFtZXRlcnNWYWx1ZShvcGVyYXRpb25Db250ZXh0KTtcblx0XHRjb25zdCBmaW5hbEdyb3VwSWQgPSBncm91cElkID8/IG9wZXJhdGlvbkNvbnRleHQuZ2V0VXBkYXRlR3JvdXBJZCgpO1xuXHRcdGNvbnN0IG9wZXJhdGlvblByb21pc2UgPSB0aGlzLmludm9rZShvcGVyYXRpb25Db250ZXh0LCBmaW5hbEdyb3VwSWQpO1xuXHRcdHByb21pc2VzLnB1c2gob3BlcmF0aW9uUHJvbWlzZSk7XG5cdFx0dGhpcy5kZWZhdWx0U3VibWl0KGZpbmFsR3JvdXBJZCk7XG5cdFx0UHJvbWlzZS5hbGxTZXR0bGVkKHByb21pc2VzKTtcblx0XHRyZXR1cm4gb3BlcmF0aW9uUHJvbWlzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFbmhhbmNlcyB0aGUgc2lkZSBlZmZlY3RzIG9mIHRoZSBvcGVyYXRpb25cblx0ICpcblx0ICogV2hlbiBhIG5ldyBlbnRpdHkgaXMgY3JlYXRlZCB1c2luZyBhIERhdGFGaWVsZEZvckFjdGlvbiwgYSBuZXdcblx0ICogb0RhdGFDb250ZXh0QmluZGluZyBpcyBjcmVhdGVkIHRvIGV4ZWN1dGUgdGhlIGFjdGlvbi4gQnkgZGVmYXVsdCwgdGhpc1xuXHQgKiBvRGF0YUNvbnRleHRCaW5kaW5nIGlzIHJlbGF0aXZlIHRvIHRoZSBPZGF0YUxpc3RCaW5kaW5nIG9mIHRoZSB0YWJsZS5cblx0ICpcblx0ICogQmVjYXVzZSBvZiB0aGlzIGRlcGVuZGVuY3ksIHdoZW4gYSBTaWRlRWZmZWN0cyBpcyBleGVjdXRlZCBvbiB0aGVcblx0ICogY29udGV4dCBpbnRvIHRoZSBPZGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBvRGF0YUNvbnRleHRCaW5kaW5nIHdhcyBib3VuZCwgdGhpcyBTaWRlRWZmZWN0cyBpcyBhbHNvIHRyaWdnZXJlZCBvbiB0aGlzXG5cdCAqIG9EYXRhQ29udGV4dEJpbmRpbmcuIFdlIGRvbid0IG1hbmFnZSB0aGUgbGlmZWN5Y2xlIG9mIHRoZVxuXHQgKiBvRGF0YUNvbnRleHRCaW5kaW5nLiBJdCBtZWFucyBldmVuIGlmIHRoZSBkcmFmdCByZWxhdGVkIHRvIHRoZSBhY3Rpb25cblx0ICogaXMgcmVtb3ZlZCwgdGhlIG9kYXRhQ29udGV4dEJpbmRpbmcgaXMgc3RpbGwgdGhlcmUsIHNvIGlmIGEgU2lkZUVmZmVjdHNcblx0ICogaXMgZXhlY3V0ZWQgb24gdGhlIHNvdXJjZSB0YXJnZXQgaW50byBvRGF0YUNvbnRleHRCaW5kaW5nLCBhbiBlcnJvciBmcm9tIHRoZSBiYWNrIGVuZCB3aWxsIGJlXG5cdCAqIHJlY2VpdmVkIGJlY2F1c2Ugd2UgYXNrIHRvIHJlZnJlc2ggYSBwcm9wZXJ0eSBvbiBhbiB1bmtub3duIGVudGl0eS5cblx0ICpcblx0ICogVGhlIFNpZGVFZmZlY3RzIGFyZSByZXF1ZXN0ZWQgb25seSBpZiB0aGUgcGFnZSBpcyBzdGlsbCBvcGVuLlxuXHQgKiBUaGlzIGF2b2lkcyBnZW5lcmF0aW5nIGlzc3VlcyB3aXRoIGdob3N0IG9EYXRhQ29udGV4dEJpbmRpbmcgbGlua2VkIHRvIGRlc3Ryb3llZCBjb250ZXh0LlxuXHQgKiBAcGFyYW0gb3BlcmF0aW9uQ29udGV4dEJpbmRpbmcgVGhlIG9wZXJhdGlvblxuXHQgKiBAcGFyYW0gcmV0dXJuZWRDb250ZXh0IFRoZSByZXR1cm5lZCBjb250ZXh0IG9mIHRoaXMgb3BlcmF0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGVuaGFuY2VTaWRlRWZmZWN0cyhvcGVyYXRpb25Db250ZXh0QmluZGluZzogT0RhdGFDb250ZXh0QmluZGluZywgcmV0dXJuZWRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuXHRcdGlmIChyZXR1cm5lZENvbnRleHQgJiYgdGhpcy5wYXJhbWV0ZXJzLmdob3N0Q29udGV4dEJpbmRpbmdQcm90ZWN0aW9uID09PSB0cnVlKSB7XG5cdFx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLnBhcmFtZXRlcnMuYXBwQ29tcG9uZW50O1xuXHRcdFx0Y29uc3Qgb3JpZ2luID0gb3BlcmF0aW9uQ29udGV4dEJpbmRpbmcucmVxdWVzdFNpZGVFZmZlY3RzLmJpbmQob3BlcmF0aW9uQ29udGV4dEJpbmRpbmcpO1xuXHRcdFx0b3BlcmF0aW9uQ29udGV4dEJpbmRpbmcucmVxdWVzdFNpZGVFZmZlY3RzID0gYXN5bmMgKC4uLmFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0XHQvLyBXZSBjaGVjayBpZiBvbmUgb2YgdGhlIHBhZ2VzIG9yIGFuIG9wZW4gZGlhbG9nIHVzZXMgdGhlIHJldHVybmVkIGNvbnRleHQuXG5cdFx0XHRcdC8vIElmIG5vdCwgc2lkZSBlZmZlY3RzIGFyZSBub3QgcmVxdWVzdGVkLlxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0YXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKClcblx0XHRcdFx0XHRcdC5nZXRJbnN0YW5jZWRWaWV3cygpXG5cdFx0XHRcdFx0XHQuc29tZSgocGFnZVZpZXc6IFZpZXcpID0+IHBhZ2VWaWV3LmdldEJpbmRpbmdDb250ZXh0KCkgPT09IHJldHVybmVkQ29udGV4dCkgfHxcblx0XHRcdFx0XHRJbnN0YW5jZU1hbmFnZXIuZ2V0T3BlbkRpYWxvZ3MoKS5zb21lKChkaWFsb2cpID0+IGRpYWxvZy5nZXRCaW5kaW5nQ29udGV4dCgpID09PSByZXR1cm5lZENvbnRleHQpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybiBvcmlnaW4oLi4uYXJncyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0fTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSW52b2tlcyB0aGUgb3BlcmF0aW9uIG9uIHRoZSBjb250ZXh0LlxuXHQgKiBAcGFyYW0gb3BlcmF0aW9uQ29udGV4dEJpbmRpbmcgVGhlIG9wZXJhdGlvbiBjb250ZXh0IGJpbmRpbmdcblx0ICogQHBhcmFtIGdyb3VwSWQgVGhlIGdyb3VwSWQgb2YgdGhlIGJhdGNoXG5cdCAqIEByZXR1cm5zIFRoZSBwcm9taXNlIG9mIHRoZSBvcGVyYXRpb25cblx0ICovXG5cdHByaXZhdGUgYXN5bmMgaW52b2tlKG9wZXJhdGlvbkNvbnRleHRCaW5kaW5nOiBPRGF0YUNvbnRleHRCaW5kaW5nLCBncm91cElkOiBzdHJpbmcpOiBQcm9taXNlPE9wZXJhdGlvblJlc3VsdD4ge1xuXHRcdGxldCByZXR1cm5lZENvbnRleHQ7XG5cdFx0bGV0IGZpcnN0SXRlcmF0aW9uUmVzb2x2ZSE6IEZ1bmN0aW9uO1xuXHRcdGxldCBmaXJzdEl0ZXJhdGlvblJlamVjdCE6IEZ1bmN0aW9uO1xuXHRcdGNvbnN0IHN0cmljdEhhbmRsaW5nUHJvbWlzZSA9IG5ldyBQcm9taXNlPHVua25vd24+KGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdGZpcnN0SXRlcmF0aW9uUmVzb2x2ZSA9IHJlc29sdmU7XG5cdFx0XHRmaXJzdEl0ZXJhdGlvblJlamVjdCA9IHJlamVjdDtcblx0XHR9KTtcblx0XHR0aGlzLmZpcnN0SXRlcmF0aW9uT3BlcmF0aW9ucy5wdXNoKHN0cmljdEhhbmRsaW5nUHJvbWlzZSk7XG5cdFx0aWYgKGdyb3VwSWQgJiYgdGhpcy5pc0FQSU1vZGUoZ3JvdXBJZCkpIHtcblx0XHRcdHRoaXMuYXBpR3JvdXBJZHNUb1N1Ym1pdC5hZGQoZ3JvdXBJZCk7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBzaWRlRWZmZWN0c0NvbnRleHQgPVxuXHRcdFx0XHQob3BlcmF0aW9uQ29udGV4dEJpbmRpbmcuZ2V0Q29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkKSA/PyBvcGVyYXRpb25Db250ZXh0QmluZGluZy5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdGNvbnN0IG9wZXJhdGlvbkludm9rZSA9IG9wZXJhdGlvbkNvbnRleHRCaW5kaW5nLmludm9rZShcblx0XHRcdFx0Z3JvdXBJZCxcblx0XHRcdFx0dGhpcy5vcGVyYXRpb25Qcm9wZXJ0aWVzLmlnbm9yZUVUYWcsXG5cdFx0XHRcdHRoaXMub0RhdGFTdHJpY3RIYW5kbGluZz8uaGFuZGxlT2RhdGFTdHJpY3RIYW5kbGluZy5iaW5kKFxuXHRcdFx0XHRcdHRoaXMub0RhdGFTdHJpY3RIYW5kbGluZyxcblx0XHRcdFx0XHRvcGVyYXRpb25Db250ZXh0QmluZGluZyxcblx0XHRcdFx0XHRmaXJzdEl0ZXJhdGlvblJlc29sdmUsXG5cdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHMoc2lkZUVmZmVjdHNDb250ZXh0LCBncm91cElkLCBbXSk7XG5cdFx0XHRcdFx0XHR0aGlzLnBhcmFtZXRlcnMubW9kZWwuc3VibWl0QmF0Y2goZ3JvdXBJZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpLFxuXHRcdFx0XHR0aGlzLm9wZXJhdGlvblByb3BlcnRpZXMucmVwbGFjZVdpdGhSVkNcblx0XHRcdCk7XG5cdFx0XHR0aGlzLnJlcXVlc3RTaWRlRWZmZWN0cyhzaWRlRWZmZWN0c0NvbnRleHQsIGdyb3VwSWQsIFtvcGVyYXRpb25JbnZva2VdKTtcblx0XHRcdGF3YWl0IFByb21pc2UucmFjZShbb3BlcmF0aW9uSW52b2tlLCBzdHJpY3RIYW5kbGluZ1Byb21pc2VdKTtcblxuXHRcdFx0cmV0dXJuZWRDb250ZXh0ID0gYXdhaXQgb3BlcmF0aW9uSW52b2tlO1xuXHRcdFx0dGhpcy5lbmhhbmNlU2lkZUVmZmVjdHMob3BlcmF0aW9uQ29udGV4dEJpbmRpbmcsIHJldHVybmVkQ29udGV4dCk7XG5cdFx0XHRmaXJzdEl0ZXJhdGlvblJlc29sdmUoKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Zmlyc3RJdGVyYXRpb25SZWplY3QoZXJyb3IpO1xuXHRcdFx0Y29uc3QgY29udGV4dCA9IG9wZXJhdGlvbkNvbnRleHRCaW5kaW5nLmdldENvbnRleHQoKTtcblx0XHRcdGlmIChjb250ZXh0KSB7XG5cdFx0XHRcdHRoaXMuZmFpbGVkQ29udGV4dHMucHVzaChjb250ZXh0IGFzIE9EYXRhVjRDb250ZXh0KTtcblx0XHRcdH1cblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRhd2FpdCB0aGlzLnBhcmFtZXRlcnMuZXZlbnRzPy5vbkFmdGVyT0RhdGFJbnZva2U/LihvcGVyYXRpb25Db250ZXh0QmluZGluZywgZ3JvdXBJZCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHJldHVybmVkQ29udGV4dCxcblx0XHRcdGJvdW5kQ29udGV4dDogb3BlcmF0aW9uQ29udGV4dEJpbmRpbmcuZ2V0Qm91bmRDb250ZXh0KClcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqICBNYW5hZ2VzIHRoZSBzdHJpY3QgaGFuZGxpbmcgdmFsaWRhdGlvbi5cblx0ICovXG5cdHByaXZhdGUgb25TdHJpY3RWYWxpZGF0aW9uKCk6IHZvaWQge1xuXHRcdHRoaXMucGFyYW1ldGVycy5ldmVudHM/Lm9uU3RyaWN0VmFsaWRhdGlvbj8uKCk7XG5cdFx0dGhpcy5yZXRyaWdnZXJGYWlsZWRDb250ZXh0cygpO1xuXHR9XG5cblx0LyoqXG5cdCAqICBUcmlnZ2VycyB0aGUgZmFpbGVkIG9wZXJhdGlvbnMgaW4gY2FzZSBvZiBzdHJpY3QgaGFuZGxpbmcuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHRoZSBuZXcgb3BlcmF0aW9ucyBhcmUgcmVzb2x2ZWRcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgcmV0cmlnZ2VyRmFpbGVkQ29udGV4dHMoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly9SZXRyeSB0aGUgYWN0aW9uIGV4ZWN1dGlvbiBpbiBjYXNlIG9mIHN0cmljdCBoYW5kbGluZyBhbmQgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGZhaWxlZCBjb250ZXh0IChnaXZlIGl0IGFub3RoZXIgdHJ5IHRvIHN1Y2NlZWQpXG5cdFx0aWYgKHRoaXMucGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcgIT09IEludm9jYXRpb25Hcm91cGluZy5DaGFuZ2VTZXQpIHtcblx0XHRcdGxldCBpbmRleCA9IDA7XG5cdFx0XHRmb3IgKGNvbnN0IGZhaWxlZENvbnRleHQgb2YgdGhpcy5mYWlsZWRDb250ZXh0cykge1xuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0XHR0aGlzLm9wZXJhdGlvblByb21pc2VzLnB1c2godGhpcy5leGVjdXRlQm91bmRPcGVyYXRpb24oZmFpbGVkQ29udGV4dCwgYGFwaVJldHJpZ2dlciR7aW5kZXggKyAxfWApKTtcblx0XHRcdH1cblx0XHRcdGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZCh0aGlzLm9wZXJhdGlvblByb21pc2VzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3VibWl0cyB0aGUgYmF0Y2ggcmVsYXRlZCB0byB0aGUgZ3JvdXBJZCBvZiB0aGUgb3BlcmF0aW9uLlxuXHQgKi9cblx0cHVibGljIHN1Ym1pdCgpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMubmV2ZXJTdWJtaXR0ZWQgfHwgdGhpcy5hcGlHcm91cElkc1RvU3VibWl0LnNpemUgPT09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Zm9yIChjb25zdCBncm91cElkIG9mIEFycmF5LmZyb20odGhpcy5hcGlHcm91cElkc1RvU3VibWl0LnZhbHVlcygpKSkge1xuXHRcdFx0dGhpcy5zdWJtaXRPbk1vZGVsKGdyb3VwSWQpO1xuXHRcdH1cblx0XHR0aGlzLnBhcmFtZXRlcnMuZXZlbnRzPy5vbk9EYXRhU3VibWl0Py4oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiAgSXMgc3RyaWN0IGhhbmRsaW5nIGNhbmNlbGVkLlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGl0IGlzIGNhbmNlbGVkLCBvdGhlcndpc2UgZmFsc2Vcblx0ICovXG5cdHB1YmxpYyBpc1N0cmljdENhbmNlbGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm9EYXRhU3RyaWN0SGFuZGxpbmc/LmlzQ2FuY2VsZWQoKSA/PyBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdWJtaXRzIHRoZSBiYXRjaCBhdCB0aGUgbW9kZWwgbGV2ZWwgcmVsYXRlZCB0byB0aGUgZ3JvdXBJZCBvZiB0aGUgb3BlcmF0aW9uLlxuXHQgKiBAcGFyYW0gZ3JvdXBJZCBUaGUgZ3JvdXBJZCBvZiB0aGUgYmF0Y2hcblx0ICovXG5cdHByaXZhdGUgc3VibWl0T25Nb2RlbChncm91cElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnBhcmFtZXRlcnMubW9kZWwuc3VibWl0QmF0Y2goZ3JvdXBJZCk7XG5cdFx0dGhpcy5hcGlHcm91cElkc1RvU3VibWl0LmRlbGV0ZShncm91cElkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJcyB0aGUgU3VibWl0TW9kZSBvZiB0aGUgZ3JvdXBJZCBzZXQgdG8gQVBJLlxuXHQgKiBAcGFyYW0gZ3JvdXBJZCBUaGUgZ3JvdXBJZCBvZiB0aGUgYmF0Y2hcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgU3VibWl0TW9kZSBpcyBzZXQgdG8gQVBJLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgaXNBUElNb2RlKGdyb3VwSWQ/OiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRpZiAoIWdyb3VwSWQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKGdyb3VwSWQuc3RhcnRzV2l0aChcIiRhdXRvXCIpIHx8IGdyb3VwSWQuc3RhcnRzV2l0aChcIiRkaXJlY3RcIikgfHwgZ3JvdXBJZC5zdGFydHNXaXRoKFwiJHNpbmdsZVwiKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRjb25zdCBzdWJtaXRNb2RlID0gKFxuXHRcdFx0dGhpcy5wYXJhbWV0ZXJzLmFwcENvbXBvbmVudC5nZXRNYW5pZmVzdEVudHJ5KFwic2FwLnVpNVwiKT8ubW9kZWxzW1wiXCJdPy5zZXR0aW5ncyBhc1xuXHRcdFx0XHR8IHsgZ3JvdXBQcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgeyBzdWJtaXQ6IFN1Ym1pdE1vZGUgfT4gfVxuXHRcdFx0XHR8IHVuZGVmaW5lZFxuXHRcdCk/Lmdyb3VwUHJvcGVydGllcz8uW2dyb3VwSWRdPy5zdWJtaXQ7XG5cblx0XHRpZiAoc3VibWl0TW9kZSA9PT0gdW5kZWZpbmVkIHx8IFtTdWJtaXRNb2RlLkF1dG8sIFN1Ym1pdE1vZGUuRGlyZWN0XS5pbmNsdWRlcyhzdWJtaXRNb2RlKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHRoZSBzdWJtaXQgb2YgdGhlIG9wZXJhdGlvbiBpZiB0aGUgc3VibWl0TW9kZSBpcyBvbiBBUEkgYW5kIGRlZmVycmVkU3VibWl0IGlzIG5vdCBzZXQgdG8gdHJ1ZVxuXHQgKiBUaGUgc3VibWl0QmF0Y2ggaXMgc2tpcHBlZCBpZiB0aGUgZ3JvdXBJZCBpcyAkYXV0byBvciAkZGlyZWN0IHNpbmNlIGRvbmUgYnkgdGhlIG1vZGVsLlxuXHQgKiBAcGFyYW0gZ3JvdXBJZCBUaGUgZ3JvdXBJZCBvZiB0aGUgYmF0Y2hcblx0ICovXG5cdHByaXZhdGUgZGVmYXVsdFN1Ym1pdChncm91cElkPzogc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc3QgZmlyc3RTdWJtaXQgPSB0aGlzLm5ldmVyU3VibWl0dGVkO1xuXHRcdGNvbnN0IGlzQVBJTW9kZSA9IHRoaXMuaXNBUElNb2RlKGdyb3VwSWQpO1xuXHRcdGlmICghaXNBUElNb2RlKSB7XG5cdFx0XHQvLyBUaGUgc3VibWl0QmF0Y2ggaXMgc2tpcHBlZCBpZiB0aGUgZ3JvdXBJZCBpcyAkYXV0byBvciAkZGlyZWN0IHNpbmNlIGRvbmUgYnkgdGhlIG1vZGVsXG5cdFx0XHR0aGlzLm5ldmVyU3VibWl0dGVkID0gZmFsc2U7XG5cdFx0fSBlbHNlIGlmICh0aGlzLm9wZXJhdGlvblByb3BlcnRpZXMuZGVmZXJyZWRTdWJtaXQgIT09IHRydWUgJiYgZ3JvdXBJZCkge1xuXHRcdFx0dGhpcy5uZXZlclN1Ym1pdHRlZCA9IGZhbHNlO1xuXHRcdFx0dGhpcy5zdWJtaXRPbk1vZGVsKGdyb3VwSWQpO1xuXHRcdH1cblx0XHRpZiAoZmlyc3RTdWJtaXQgJiYgIXRoaXMubmV2ZXJTdWJtaXR0ZWQpIHtcblx0XHRcdC8vVHJpZ2dlciB0aGUgY2FsbGJhY2sgb25seSBvbmNlXG5cdFx0XHR0aGlzLnBhcmFtZXRlcnMuZXZlbnRzPy5vbk9EYXRhU3VibWl0Py4oKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogIFNldHMgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgcGFyYW1ldGVycyBvZiB0aGUgb3BlcmF0aW9uLlxuXHQgKiBAcGFyYW0gb3BlcmF0aW9uQ29udGV4dEJpbmRpbmcgVGhlIG9wZXJhdGlvbiBjb250ZXh0IGJpbmRpbmdcblx0ICovXG5cdHByaXZhdGUgc2V0UGFyYW1ldGVyc1ZhbHVlKG9wZXJhdGlvbkNvbnRleHRCaW5kaW5nOiBPRGF0YUNvbnRleHRCaW5kaW5nKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMub3BlcmF0aW9uUGFyYW1ldGVycy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGRlZmF1bHRWYWx1ZXMgPSB0aGlzLnBhcmFtZXRlcnMucGFyYW1ldGVyc1ZhbHVlcyA/PyB7fTtcblx0XHRcdGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIHRoaXMub3BlcmF0aW9uUGFyYW1ldGVycykge1xuXHRcdFx0XHRjb25zdCBuYW1lID0gcGFyYW1ldGVyLm5hbWU7XG5cdFx0XHRcdGlmICghZGVmYXVsdFZhbHVlc1tuYW1lXSkge1xuXHRcdFx0XHRcdHN3aXRjaCAocGFyYW1ldGVyLnR5cGUpIHtcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uU3RyaW5nXCI6XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZXNbbmFtZV0gPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uQm9vbGVhblwiOlxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWVzW25hbWVdID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5CeXRlXCI6XG5cdFx0XHRcdFx0XHRjYXNlIFwiRWRtLkludDE2XCI6XG5cdFx0XHRcdFx0XHRjYXNlIFwiRWRtLkludDMyXCI6XG5cdFx0XHRcdFx0XHRjYXNlIFwiRWRtLkludDY0XCI6XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZXNbbmFtZV0gPSAwO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRvcGVyYXRpb25Db250ZXh0QmluZGluZy5zZXRQYXJhbWV0ZXIobmFtZSwgZGVmYXVsdFZhbHVlc1tuYW1lXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHRoZSBzaWRlIGVmZmVjdHMgZm9yIHRoZSBhY3Rpb24uXG5cdCAqIEBwYXJhbSBjb250ZXh0ICBUaGUgY29udGV4dCBvZiB0aGUgU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIGdyb3VwSWQgIFRoZSBncm91cElkIG9mIHRoZSBiYXRjaFxuXHQgKiBAcGFyYW0gbG9jYWxQcm9taXNlIFRoZSBwcm9taXNlIG9mIHRoZSBpbnZva2VkIGFjdGlvblxuXHQgKiBAcmV0dXJucyBUaGUgcHJvbWlzZSBvZiB0aGUgc2lkZSBlZmZlY3Rcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgcmVxdWVzdFNpZGVFZmZlY3RzKGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBncm91cElkOiBzdHJpbmcsIGxvY2FsUHJvbWlzZT86IFByb21pc2U8dW5rbm93bj5bXSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RzU2VydmljZSA9IHRoaXMucGFyYW1ldGVycy5hcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gdGhpcy5wYXJhbWV0ZXJzLm1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG1lc3NhZ2VzUGF0aCA9IHRoaXMucGFyYW1ldGVycy5jb250ZXh0cy5sZW5ndGhcblx0XHRcdD8gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKG1ldGFNb2RlbCwgdGhpcy5wYXJhbWV0ZXJzLmNvbnRleHRzWzBdLmdldFBhdGgoKSlcblx0XHRcdDogdW5kZWZpbmVkO1xuXG5cdFx0bGV0IHByb21pc2VzOiBQcm9taXNlPHVua25vd24+W10gPSBsb2NhbFByb21pc2UgPz8gW107XG5cdFx0aWYgKHRoaXMucGFyYW1ldGVycy5kaXNhYmxlU2lkZUVmZmVjdHMgIT09IHRydWUpIHtcblx0XHRcdGNvbnN0IHBhdGhFeHByZXNzaW9ucyA9IFtcblx0XHRcdFx0Li4uKHRoaXMuc2lkZUVmZmVjdHM/LnBhdGhFeHByZXNzaW9ucyA/PyBbXSksXG5cdFx0XHRcdC4uLih0aGlzLnNpZGVFZmZlY3RzPy5wYXRoRXhwcmVzc2lvbnMgJiZcblx0XHRcdFx0bWVzc2FnZXNQYXRoICYmXG5cdFx0XHRcdHRoaXMuYWRkaXRpb25hbFNlbGVjdFByb3BlcnRpZXMuaW5jbHVkZXMobWVzc2FnZXNQYXRoKSAmJlxuXHRcdFx0XHR0aGlzLnNpZGVFZmZlY3RzLnBhdGhFeHByZXNzaW9ucy5zb21lKChleHApID0+IHR5cGVvZiBleHAgPT09IFwic3RyaW5nXCIgJiYgKGV4cCA9PT0gbWVzc2FnZXNQYXRoIHx8IGV4cCA9PT0gXCIqXCIpKVxuXHRcdFx0XHRcdD8gW1wiKlwiXVxuXHRcdFx0XHRcdDogW10pXG5cdFx0XHRcdC8vIEZvcm1lciB3b3JrZmxvdyAtPiB3ZSBhZGQgXCIqXCIgdG8gdGhlIFNpZGVFZmZlY3RzIHRvIGdldCBhbGwgcHJvcGVydGllcyBvbmx5IGlmIHRoZSBtZXNzYWdlc1BhdGggaXMgaW4gdGhlIGluaXRpYWwgU2lkZUVmZmVjdHNcblx0XHRcdFx0Ly8gYW5kIG1lc3NhZ2VzUGF0aCBpcyBhZGRlZCBpbiB0aGUgJHNlbGVjdCBvZiB0aGUgb3BlcmF0aW9uXG5cdFx0XHRdO1xuXG5cdFx0XHRpZiAodGhpcy5zaWRlRWZmZWN0cyB8fCBwYXRoRXhwcmVzc2lvbnMubGVuZ3RoKSB7XG5cdFx0XHRcdHByb21pc2VzID0gcHJvbWlzZXMuY29uY2F0KFxuXHRcdFx0XHRcdCh0aGlzLnNpZGVFZmZlY3RzPy50cmlnZ2VyQWN0aW9ucyA/PyBbXSkubWFwKGFzeW5jIChhY3Rpb24pID0+XG5cdFx0XHRcdFx0XHRzaWRlRWZmZWN0c1NlcnZpY2UuZXhlY3V0ZUFjdGlvbihhY3Rpb24sIGNvbnRleHQsIGdyb3VwSWQpXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRwYXRoRXhwcmVzc2lvbnMubGVuZ3RoID8gc2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhwYXRoRXhwcmVzc2lvbnMsIGNvbnRleHQsIGdyb3VwSWQpIDogW11cblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcblx0XHRcdFx0aWYgKHRoaXMuc2lkZUVmZmVjdHM/LnBhdGhFeHByZXNzaW9ucykge1xuXHRcdFx0XHRcdHRoaXMucGFyYW1ldGVycy5ldmVudHM/Lm9uUmVxdWVzdFNpZGVFZmZlY3RzPy4odGhpcy5zaWRlRWZmZWN0cywgdGhpcy5vcGVyYXRpb24sIHByb21pc2VzKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0TG9nLmluZm8oXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0cyBmb3IgdGhlIG9wZXJhdGlvbiBcIiArIHRoaXMuYWN0aW9uTmFtZSwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztFQW9CQSxNQUFNQSxrQkFBa0IsR0FBR0MsU0FBUyxDQUFDRCxrQkFBa0I7RUFBQyxJQU9uQ0UsY0FBYztJQXlCbEMsU0FBQUEsZUFDa0JDLFNBQW1DLEVBQ25DQyxVQW9CaEIs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
416
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnZvY2F0aW9uR3JvdXBpbmciLCJGRUxpYnJhcnkiLCJPRGF0YU9wZXJhdGlvbiIsIm9wZXJhdGlvbiIsInBhcmFtZXRlcnMiLCJvcGVyYXRpb25Qcm9wZXJ0aWVzIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwib3BlcmF0aW9uQ29udGV4dEJpbmRpbmdzIiwiZmlyc3RJdGVyYXRpb25PcGVyYXRpb25zIiwiYXBpR3JvdXBJZHNUb1N1Ym1pdCIsIlNldCIsImJpbmRpbmdQYXJhbWV0ZXJzIiwib3BlcmF0aW9uUGFyYW1ldGVycyIsIm5ldmVyU3VibWl0dGVkIiwiZmFpbGVkQ29udGV4dHMiLCJvcGVyYXRpb25Qcm9taXNlcyIsImFjdGlvbk5hbWUiLCJhY3Rpb25IZWxwZXIiLCJnZXRBY3Rpb25OYW1lIiwiaXNBY3Rpb24iLCJhY3Rpb24iLCJzaWRlRWZmZWN0cyIsImFwcENvbXBvbmVudCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsImdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMiLCJjb250ZXh0cyIsImlzRnVuY3Rpb24iLCJkaXNhYmxlU3RyaWN0SGFuZGxpbmciLCJvRGF0YVN0cmljdEhhbmRsaW5nIiwiT0RhdGFTdHJpY3RIYW5kbGluZyIsImxhYmVsIiwiaW52b2NhdGlvbkdyb3VwaW5nIiwiZXZlbnRzIiwib25SZXNwb25zZSIsIm9uU3RyaWN0UmVzcG9uc2UiLCJvblZhbGlkYXRpb24iLCJvblN0cmljdFZhbGlkYXRpb24iLCJiaW5kIiwib25DYW5jZWwiLCJvblN0cmljdENhbmNlbCIsImRlZmluZU9wZXJhdGlvblBhcmFtZXRlcnMiLCJzZXRCaW5kaW5nUGFyYW1ldGVycyIsIl9leHBvcnRzIiwiX3Byb3RvIiwicHJvdG90eXBlIiwiZGVlcENsb25lIiwiZW5oYW5jZSRzZWxlY3QiLCJleGlzdGluZ1NlbGVjdCIsIiRzZWxlY3QiLCJzcGxpdCIsInJldHVybkVudGl0eVR5cGUiLCJtZXRhTW9kZWwiLCJtb2RlbCIsImdldE1ldGFNb2RlbCIsIm1lc3NhZ2VzUGF0aCIsIk1vZGVsSGVscGVyIiwiZ2V0TWVzc2FnZXNQYXRoIiwiZ2V0UGF0aCIsImlzU2FtZUVudGl0eSIsInJldHVybkNvbGxlY3Rpb24iLCJzb3VyY2VFbnRpdHlUeXBlIiwiZW50aXR5UHJvcGVydGllcyIsImZpbmQiLCJwcm9wZXJ0eSIsIm5hbWUiLCJpbmNsdWRlcyIsIiQkaW5oZXJpdEV4cGFuZFNlbGVjdCIsImdldEFjdGlvblBhcmFtZXRlcnMiLCJjbGVhciIsIm9wZXJhdGlvbkNvbnRleHRCaW5kaW5nIiwiZGVzdHJveSIsImV4ZWN1dGUiLCJyZXN1bHQiLCJDaGFuZ2VTZXQiLCJleGVjdXRlQ2hhbmdlc2V0IiwiZXhlY3V0ZVNlcXVlbnRpYWxseSIsIlByb21pc2UiLCJhbGxTZXR0bGVkIiwiZXhlY3V0ZUltcG9ydCIsImVycm9yIiwiTG9nIiwib25PRGF0YVJlc3BvbnNlIiwib3BlcmF0aW9uQ29udGV4dCIsImJpbmRDb250ZXh0IiwicHVzaCIsInNldFBhcmFtZXRlcnNWYWx1ZSIsImdyb3VwSWQiLCJwcm9taXNlcyIsImludm9rZSIsImRlZmF1bHRTdWJtaXQiLCJhZnRlck9EYXRhT3BlcmF0aW9uRXhlY3V0aW9uIiwiY3VycmVudFByb21pc2VWYWx1ZXMiLCJhbGwiLCJtYXAiLCJjb250ZXh0IiwiZXhlY3V0ZUJvdW5kT3BlcmF0aW9uIiwibWFuYWdlU3RyaWN0SGFuZGxpbmdGYWlscyIsIm9uQWZ0ZXJPRGF0YU9wZXJhdGlvbkV4ZWN1dGlvbiIsInJlZHVjZSIsInByb21pc2UiLCJpZCIsInJlc29sdmUiLCJmaW5hbEdyb3VwSWQiLCJnZXRVcGRhdGVHcm91cElkIiwib3BlcmF0aW9uUHJvbWlzZSIsImVuaGFuY2VTaWRlRWZmZWN0cyIsInJldHVybmVkQ29udGV4dCIsImdob3N0Q29udGV4dEJpbmRpbmdQcm90ZWN0aW9uIiwib3JpZ2luIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiZ2V0SW5zdGFuY2VkVmlld3MiLCJzb21lIiwicGFnZVZpZXciLCJnZXRCaW5kaW5nQ29udGV4dCIsIkluc3RhbmNlTWFuYWdlciIsImdldE9wZW5EaWFsb2dzIiwiZGlhbG9nIiwiZmlyc3RJdGVyYXRpb25SZXNvbHZlIiwiZmlyc3RJdGVyYXRpb25SZWplY3QiLCJzdHJpY3RIYW5kbGluZ1Byb21pc2UiLCJyZWplY3QiLCJpc0FQSU1vZGUiLCJhZGQiLCJzaWRlRWZmZWN0c0NvbnRleHQiLCJnZXRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0Iiwib3BlcmF0aW9uSW52b2tlIiwiaWdub3JlRVRhZyIsImhhbmRsZU9kYXRhU3RyaWN0SGFuZGxpbmciLCJzdWJtaXRCYXRjaCIsInJlcGxhY2VXaXRoUlZDIiwicmFjZSIsIm9uQWZ0ZXJPRGF0YUludm9rZSIsImJvdW5kQ29udGV4dCIsInJldHJpZ2dlckZhaWxlZENvbnRleHRzIiwiaW5kZXgiLCJmYWlsZWRDb250ZXh0Iiwic3VibWl0Iiwic2l6ZSIsIkFycmF5IiwiZnJvbSIsInZhbHVlcyIsInN1Ym1pdE9uTW9kZWwiLCJvbk9EYXRhU3VibWl0IiwiaXNTdHJpY3RDYW5jZWxlZCIsImlzQ2FuY2VsZWQiLCJkZWxldGUiLCJzdGFydHNXaXRoIiwic3VibWl0TW9kZSIsImdldE1hbmlmZXN0RW50cnkiLCJtb2RlbHMiLCJzZXR0aW5ncyIsImdyb3VwUHJvcGVydGllcyIsIlN1Ym1pdE1vZGUiLCJBdXRvIiwiRGlyZWN0IiwiZmlyc3RTdWJtaXQiLCJkZWZlcnJlZFN1Ym1pdCIsImRlZmF1bHRWYWx1ZXMiLCJwYXJhbWV0ZXJzVmFsdWVzIiwicGFyYW1ldGVyIiwidHlwZSIsInNldFBhcmFtZXRlciIsImxvY2FsUHJvbWlzZSIsInNpZGVFZmZlY3RzU2VydmljZSIsImRpc2FibGVTaWRlRWZmZWN0cyIsImNvbmNhdCIsInRyaWdnZXJBY3Rpb25zIiwiZXhlY3V0ZUFjdGlvbiIsInBhdGhFeHByZXNzaW9ucyIsIm9uUmVxdWVzdFNpZGVFZmZlY3RzIiwiaW5mbyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiT0RhdGFPcGVyYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBY3Rpb25JbXBvcnQsIEFjdGlvblBhcmFtZXRlciwgQWN0aW9uIGFzIEVkbUFjdGlvbiB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgZGVlcENsb25lIGZyb20gXCJzYXAvYmFzZS91dGlsL2RlZXBDbG9uZVwiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBJbnN0YW5jZU1hbmFnZXIgZnJvbSBcInNhcC9tL0luc3RhbmNlTWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE9EYXRhVjRDb250ZXh0IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUNvbnRleHRCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCBTdWJtaXRNb2RlIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvU3VibWl0TW9kZVwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCIuLi8uLi8uLi9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBpc0FjdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB0eXBlIHsgQWN0aW9uU2lkZUVmZmVjdHNUeXBlIH0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIHsgQmluZENvbnRleHRQYXJhbWV0ZXJzIH0gZnJvbSBcIi4uL2RyYWZ0XCI7XG5pbXBvcnQgT0RhdGFTdHJpY3RIYW5kbGluZyBmcm9tIFwiLi9PRGF0YVN0cmljdEhhbmRsaW5nXCI7XG5pbXBvcnQgYWN0aW9uSGVscGVyIGZyb20gXCIuL2FjdGlvbkhlbHBlclwiO1xuXG5jb25zdCBJbnZvY2F0aW9uR3JvdXBpbmcgPSBGRUxpYnJhcnkuSW52b2NhdGlvbkdyb3VwaW5nO1xuXG5leHBvcnQgdHlwZSBPcGVyYXRpb25SZXN1bHQgPSB7XG5cdHJldHVybmVkQ29udGV4dD86IE9EYXRhVjRDb250ZXh0O1xuXHRib3VuZENvbnRleHQ6IE9EYXRhVjRDb250ZXh0O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT0RhdGFPcGVyYXRpb24ge1xuXHRwcml2YXRlIG9wZXJhdGlvbkNvbnRleHRCaW5kaW5nczogT0RhdGFDb250ZXh0QmluZGluZ1tdID0gW107XG5cblx0cHJpdmF0ZSByZWFkb25seSBmaXJzdEl0ZXJhdGlvbk9wZXJhdGlvbnM6IFByb21pc2U8dW5rbm93bj5bXSA9IFtdO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgYXBpR3JvdXBJZHNUb1N1Ym1pdDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cblx0cHJpdmF0ZSByZWFkb25seSBzaWRlRWZmZWN0czogQWN0aW9uU2lkZUVmZmVjdHNUeXBlIHwgdW5kZWZpbmVkO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgYWN0aW9uTmFtZTogc3RyaW5nO1xuXG5cdHByaXZhdGUgYmluZGluZ1BhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cblx0cHJpdmF0ZSBvcGVyYXRpb25QYXJhbWV0ZXJzOiBBY3Rpb25QYXJhbWV0ZXJbXSA9IFtdO1xuXG5cdHByaXZhdGUgbmV2ZXJTdWJtaXR0ZWQgPSB0cnVlO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgb0RhdGFTdHJpY3RIYW5kbGluZzogT0RhdGFTdHJpY3RIYW5kbGluZyB8IHVuZGVmaW5lZDtcblxuXHRwcml2YXRlIGZhaWxlZENvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdID0gW107XG5cblx0cHJpdmF0ZSBvcGVyYXRpb25Qcm9taXNlczogUHJvbWlzZTxPcGVyYXRpb25SZXN1bHQ+W10gPSBbXTtcblxuXHRjb25zdHJ1Y3Rvcihcblx0XHRwcml2YXRlIHJlYWRvbmx5IG9wZXJhdGlvbjogRWRtQWN0aW9uIHwgQWN0aW9uSW1wb3J0LFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgcGFyYW1ldGVyczoge1xuXHRcdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQ7XG5cdFx0XHRjb250ZXh0czogT0RhdGFWNENvbnRleHRbXTtcblx0XHRcdG1vZGVsOiBPRGF0YU1vZGVsO1xuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdFx0ZGlzYWJsZVN0cmljdEhhbmRsaW5nPzogYm9vbGVhbjtcblx0XHRcdGRpc2FibGVTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRnaG9zdENvbnRleHRCaW5kaW5nUHJvdGVjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGV2ZW50cz86IHtcblx0XHRcdFx0b25TdHJpY3RWYWxpZGF0aW9uPzogRnVuY3Rpb247IC8vZXZlbnRzIHRyaWdnZXJlZCB3aGVuIHRoZSBzdHJpY3QgaGFuZGxpbmcgaXMgdmFsaWRhdGVkIGJ5IHRoZSBlbmQgdXNlclxuXHRcdFx0XHRvblN0cmljdENhbmNlbD86IEZ1bmN0aW9uOyAvL2V2ZW50cyB0cmlnZ2VyZWQgd2hlbiB0aGUgc3RyaWN0IGhhbmRsaW5nIGlzIGNhbmNlbGVkIGJ5IHRoZSBlbmQgdXNlclxuXHRcdFx0XHRvblN0cmljdFJlc3BvbnNlPzogKG1lc3NhZ2VzNDEyOiBNZXNzYWdlW10pID0+IHZvaWQ7IC8vZXZlbnRzIHRyaWdnZXJlZCB3aGVuIGJhY2tlbmQgcmV0dXJucyAgNDEyIG1lc3NhZ2VzIChzdHJpY3QgaGFuZGxpbmcpXG5cdFx0XHRcdG9uT0RhdGFSZXNwb25zZT86IEZ1bmN0aW9uOyAvL2V2ZW50cyB0cmlnZ2VyZWQgd2hlbiBhbGwgcmVzcG9uc2VzIHJlbGF0ZWQgdG8gdGhlIEZpb3JpIGVsZW1lbnQgb3BlcmF0aW9ucyBhcmUgcmVjZWl2ZWRcblx0XHRcdFx0b25PRGF0YVN1Ym1pdD86IEZ1bmN0aW9uOyAvL2V2ZW50cyB0cmlnZ2VyZWQgd2hlbiB0aGUgYmF0Y2ggaXMgc3VibWl0dGVkIChyZXF1ZXN0IHNlbnQgdG8gdGhlIGJhY2sgZW5kKVxuXHRcdFx0XHRvbkFmdGVyT0RhdGFJbnZva2U/OiBGdW5jdGlvbjsgLy9ldmVudHMgdHJpZ2dlcmVkIHdoZW4gdGhlIHByb21pc2Ugb2YgaW52b2tlIG1ldGhvZCBvZiB0aGUgb0RhdGFDb250ZXh0QmluZGluZyBpcyByZXNvbHZlZFxuXHRcdFx0XHRvbkFmdGVyT0RhdGFPcGVyYXRpb25FeGVjdXRpb24/OiBGdW5jdGlvbjsgLy9ldmVudHMgdHJpZ2dlcmVkIHdoZW4gZmlyc3QgcmVzcG9uc2VzIHJlbGF0ZWQgdG8gdGhlIEZpb3JpIGVsZW1lbnQgb3BlcmF0aW9ucyBhcmUgcmVjZWl2ZWQgKGJlZm9yZSBzdHJpY3QgaGFuZGxpbmcgb3IgZmluYWwgcmVzcG9uc2UgaWYgbm8gNDEyIGFyZSByZWNlaXZlZClcblx0XHRcdFx0b25SZXF1ZXN0U2lkZUVmZmVjdHM/OiBGdW5jdGlvbjsgLy9ldmVudHMgdHJpZ2dlcmVkIHdoZW4gc2lkZUVmZmVjdHMgYXJlIHRyaWdnZXJlZFxuXHRcdFx0fTtcblx0XHRcdHBhcmFtZXRlcnNWYWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHR9LFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgb3BlcmF0aW9uUHJvcGVydGllczoge1xuXHRcdFx0ZW5oYW5jZSRzZWxlY3Q/OiBib29sZWFuO1xuXHRcdFx0Z3JvdXBJZD86IHN0cmluZztcblx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzO1xuXHRcdFx0ZGVmZXJyZWRTdWJtaXQ/OiBib29sZWFuO1xuXHRcdFx0aWdub3JlRVRhZz86IGJvb2xlYW47XG5cdFx0XHRyZXBsYWNlV2l0aFJWQz86IGJvb2xlYW47XG5cdFx0fSA9IHt9XG5cdCkge1xuXHRcdHRoaXMuYWN0aW9uTmFtZSA9IGFjdGlvbkhlbHBlci5nZXRBY3Rpb25OYW1lKGlzQWN0aW9uKHRoaXMub3BlcmF0aW9uKSA/IHRoaXMub3BlcmF0aW9uIDogdGhpcy5vcGVyYXRpb24uYWN0aW9uKTtcblxuXHRcdHRoaXMuc2lkZUVmZmVjdHMgPSB0aGlzLnBhcmFtZXRlcnMuYXBwQ29tcG9uZW50XG5cdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdC5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHRoaXMuYWN0aW9uTmFtZSwgdGhpcy5wYXJhbWV0ZXJzLmNvbnRleHRzLmxlbmd0aCA/IHRoaXMucGFyYW1ldGVycy5jb250ZXh0c1swXSA6IHVuZGVmaW5lZCk7XG5cblx0XHRpZiAoISh0aGlzLm9wZXJhdGlvbiBhcyBFZG1BY3Rpb24pLmlzRnVuY3Rpb24gJiYgdGhpcy5wYXJhbWV0ZXJzLmRpc2FibGVTdHJpY3RIYW5kbGluZyAhPT0gdHJ1ZSkge1xuXHRcdFx0dGhpcy5vRGF0YVN0cmljdEhhbmRsaW5nID0gbmV3IE9EYXRhU3RyaWN0SGFuZGxpbmcoe1xuXHRcdFx0XHRhcHBDb21wb25lbnQ6IHRoaXMucGFyYW1ldGVycy5hcHBDb21wb25lbnQsXG5cdFx0XHRcdGNvbnRleHRzOiB0aGlzLnBhcmFtZXRlcnMuY29udGV4dHMsXG5cdFx0XHRcdGxhYmVsOiB0aGlzLnBhcmFtZXRlcnMubGFiZWwgPz8gdGhpcy5hY3Rpb25OYW1lLFxuXHRcdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc6IHRoaXMucGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcsXG5cdFx0XHRcdGV2ZW50czoge1xuXHRcdFx0XHRcdG9uUmVzcG9uc2U6IHRoaXMucGFyYW1ldGVycy5ldmVudHM/Lm9uU3RyaWN0UmVzcG9uc2UsXG5cdFx0XHRcdFx0b25WYWxpZGF0aW9uOiB0aGlzLm9uU3RyaWN0VmFsaWRhdGlvbi5iaW5kKHRoaXMpLFxuXHRcdFx0XHRcdG9uQ2FuY2VsOiB0aGlzLnBhcmFtZXRlcnMuZXZlbnRzPy5vblN0cmljdENhbmNlbFxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0dGhpcy5kZWZpbmVPcGVyYXRpb25QYXJhbWV0ZXJzKCk7XG5cdFx0dGhpcy5zZXRCaW5kaW5nUGFyYW1ldGVycygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgcGFyYW1ldGVycyBmb3IgdGhlIG9wZXJhdGlvbnMuXG5cdCAqL1xuXHRwcml2YXRlIHNldEJpbmRpbmdQYXJhbWV0ZXJzKCk6IHZvaWQge1xuXHRcdHRoaXMuYmluZGluZ1BhcmFtZXRlcnMgPSBkZWVwQ2xvbmUodGhpcy5vcGVyYXRpb25Qcm9wZXJ0aWVzLmJpbmRpbmdQYXJhbWV0ZXJzID8/IHt9KTtcblxuXHRcdGlmIChcblx0XHRcdGlzQWN0aW9uKHRoaXMub3BlcmF0aW9uKSAmJlxuXHRcdFx0IXRoaXMub3BlcmF0aW9uLmlzRnVuY3Rpb24gJiZcblx0XHRcdHRoaXMucGFyYW1ldGVycy5jb250ZXh0cy5sZW5ndGggJiZcblx0XHRcdHRoaXMub3BlcmF0aW9uUHJvcGVydGllcy5lbmhhbmNlJHNlbGVjdCA9PT0gdHJ1ZVxuXHRcdCkge1xuXHRcdFx0Y29uc3QgZXhpc3RpbmdTZWxlY3QgPSAodGhpcy5iaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0IGFzIHN0cmluZyB8IHVuZGVmaW5lZCk/LnNwbGl0KFwiLFwiKSA/PyBbXTtcblx0XHRcdGNvbnN0IHJldHVybkVudGl0eVR5cGUgPSB0aGlzLm9wZXJhdGlvbi5yZXR1cm5FbnRpdHlUeXBlO1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gdGhpcy5wYXJhbWV0ZXJzLm1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3QgbWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKG1ldGFNb2RlbCwgdGhpcy5wYXJhbWV0ZXJzLmNvbnRleHRzWzBdLmdldFBhdGgoKSkhO1xuXHRcdFx0Y29uc3QgaXNTYW1lRW50aXR5ID1cblx0XHRcdFx0IXRoaXMub3BlcmF0aW9uLnJldHVybkNvbGxlY3Rpb24gJiYgISFyZXR1cm5FbnRpdHlUeXBlICYmIHRoaXMub3BlcmF0aW9uLnNvdXJjZUVudGl0eVR5cGUgPT09IHJldHVybkVudGl0eVR5cGU7XG5cdFx0XHRpZiAoaXNTYW1lRW50aXR5KSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHQvKiBUaGUgZm9ybWVyIGxvZ2ljIGNoZWNrZWQgaWYgdGhlIG1lc3NhZ2VzUGF0aCBpcyBjb250YWluZWQgaW50byB0aGUgU2lkZUVmZmVjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgYnV0IHRoZSBjaGVjayB3YXMgaW52YWxpZCAoYWx3YXlzIHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgIFRvIGJlIGNvbXBsaWFudCB3aXRoIGZvcm1lciB2ZXJzaW9uIHdlIGRvbid0IGNoZWNrIHRoZSBTaWRlRWZmZWN0cy4uXG5cdFx0XHRcdFx0ICAgXG5cdFx0XHRcdFx0ICAgdGhpcy5zaWRlRWZmZWN0cyAmJlxuXHRcdFx0XHRcdCAgIG1lc3NhZ2VzUGF0aCAmJlxuXHRcdFx0XHRcdCAgICh0aGlzLnNpZGVFZmZlY3RzLnBhdGhFeHByZXNzaW9ucyA/PyBbXSkuc29tZSgoZXhwKSA9PiB0eXBlb2YgZXhwID09PSBcInN0cmluZ1wiICYmIFttZXNzYWdlc1BhdGgsIFwiKlwiXS5pbmNsdWRlcyhleHApKSovXG5cdFx0XHRcdFx0bWVzc2FnZXNQYXRoICYmXG5cdFx0XHRcdFx0ISFyZXR1cm5FbnRpdHlUeXBlPy5lbnRpdHlQcm9wZXJ0aWVzLmZpbmQoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lID09PSBtZXNzYWdlc1BhdGgpICYmXG5cdFx0XHRcdFx0IWV4aXN0aW5nU2VsZWN0LmluY2x1ZGVzKG1lc3NhZ2VzUGF0aClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0dGhpcy5iaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0ID0gdGhpcy5iaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0XG5cdFx0XHRcdFx0XHQ/IGAke3RoaXMuYmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdH0sJHttZXNzYWdlc1BhdGh9YFxuXHRcdFx0XHRcdFx0OiBtZXNzYWdlc1BhdGg7XG5cblx0XHRcdFx0XHR0aGlzLmJpbmRpbmdQYXJhbWV0ZXJzLiQkaW5oZXJpdEV4cGFuZFNlbGVjdCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGVmaW5lcyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgb3BlcmF0aW9uLlxuXHQgKi9cblx0cHJpdmF0ZSBkZWZpbmVPcGVyYXRpb25QYXJhbWV0ZXJzKCk6IHZvaWQge1xuXHRcdGlmICghaXNBY3Rpb24odGhpcy5vcGVyYXRpb24pKSB7XG5cdFx0XHR0aGlzLm9wZXJhdGlvblBhcmFtZXRlcnMgPSB0aGlzLm9wZXJhdGlvbi5hY3Rpb24ucGFyYW1ldGVycztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly9SZW1vdmUgdGhlIGJpbmRpbmcgcGFyYW1ldGVycyBmcm9tIHRoZSBwYXJhbWV0ZXJzIGxpc3Rcblx0XHRcdHRoaXMub3BlcmF0aW9uUGFyYW1ldGVycyA9IGFjdGlvbkhlbHBlci5nZXRBY3Rpb25QYXJhbWV0ZXJzKHRoaXMub3BlcmF0aW9uKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBvcGVyYXRpb25Db250ZXh0QmluZGluZyBvZiB0aGlzLm9wZXJhdGlvbkNvbnRleHRCaW5kaW5ncykge1xuXHRcdFx0b3BlcmF0aW9uQ29udGV4dEJpbmRpbmcuZGVzdHJveSgpO1xuXHRcdH1cblx0XHR0aGlzLmFwaUdyb3VwSWRzVG9TdWJtaXQuY2xlYXIoKTtcblx0XHR0aGlzLm9wZXJhdGlvbkNvbnRleHRCaW5kaW5ncyA9IFtdO1xuXHRcdHRoaXMuZmFpbGVkQ29udGV4dHMgPSBbXTtcblx0XHR0aGlzLm9wZXJhdGlvblByb21pc2VzID0gW107XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZXMgdGhlIG9wZXJhdGlvbi5cblx0ICogQHJldHVybnMgVGhlIHByb21pc2Ugb2YgdGhlIG9wZXJhdGlvblxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZSgpOiBQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXT4ge1xuXHRcdGxldCByZXN1bHQ6IFByb21pc2VTZXR0bGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKHRoaXMucGFyYW1ldGVycy5jb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0cmVzdWx0ID0gYXdhaXQgKHRoaXMucGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcgPT09IEludm9jYXRpb25Hcm91cGluZy5DaGFuZ2VTZXRcblx0XHRcdFx0XHQ/IHRoaXMuZXhlY3V0ZUNoYW5nZXNldCgpXG5cdFx0XHRcdFx0OiB0aGlzLmV4ZWN1dGVTZXF1ZW50aWFsbHkoKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW3RoaXMuZXhlY3V0ZUltcG9ydCgpXSk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGV4ZWN1dGluZyBvcGVyYXRpb24gXCIgKyB0aGlzLmFjdGlvbk5hbWUsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0dGhpcy5wYXJhbWV0ZXJzLmV2ZW50cz8ub25PRGF0YVJlc3BvbnNlPy4oKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB0aGUgaW1wb3J0IG9wZXJhdGlvbi5cblx0ICogQHJldHVybnMgVGhlIHByb21pc2Ugb2YgdGhlIG9wZXJhdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBleGVjdXRlSW1wb3J0KCk6IFByb21pc2U8T3BlcmF0aW9uUmVzdWx0PiB7XG5cdFx0Y29uc3Qgb3BlcmF0aW9uQ29udGV4dCA9IHRoaXMucGFyYW1ldGVycy5tb2RlbC5iaW5kQ29udGV4dChgLyR7dGhpcy5hY3Rpb25OYW1lfSguLi4pYCk7XG5cdFx0dGhpcy5vcGVyYXRpb25Db250ZXh0QmluZGluZ3MucHVzaChvcGVyYXRpb25Db250ZXh0KTtcblx0XHR0aGlzLnNldFBhcmFtZXRlcnNWYWx1ZShvcGVyYXRpb25Db250ZXh0KTtcblx0XHRjb25zdCBncm91cElkID0gdGhpcy5vcGVyYXRpb25Qcm9wZXJ0aWVzLmdyb3VwSWQgPz8gXCJhY3Rpb25JbXBvcnRcIjtcblx0XHRjb25zdCBwcm9taXNlcyA9IFt0aGlzLmludm9rZShvcGVyYXRpb25Db250ZXh0LCBncm91cElkKV07XG5cblx0XHR0aGlzLmRlZmF1bHRTdWJtaXQoZ3JvdXBJZCk7XG5cdFx0YXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHRoaXMuZmlyc3RJdGVyYXRpb25PcGVyYXRpb25zKTtcblx0XHRhd2FpdCB0aGlzLmFmdGVyT0RhdGFPcGVyYXRpb25FeGVjdXRpb24oKTtcblx0XHRjb25zdCBjdXJyZW50UHJvbWlzZVZhbHVlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcblx0XHRyZXR1cm4gY3VycmVudFByb21pc2VWYWx1ZXNbMF07XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZXMgdGhlIG9wZXJhdGlvbnMgb24gb25lIGNoYW5nZXNldC5cblx0ICogQHJldHVybnMgVGhlIHByb21pc2Ugb2YgdGhlIG9wZXJhdGlvbnNcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgZXhlY3V0ZUNoYW5nZXNldCgpOiBQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXT4ge1xuXHRcdHRoaXMub3BlcmF0aW9uUHJvbWlzZXMgPSB0aGlzLnBhcmFtZXRlcnMuY29udGV4dHMubWFwKGFzeW5jIChjb250ZXh0KSA9PlxuXHRcdFx0dGhpcy5leGVjdXRlQm91bmRPcGVyYXRpb24oY29udGV4dCwgdGhpcy5vcGVyYXRpb25Qcm9wZXJ0aWVzLmdyb3VwSWQpXG5cdFx0KTtcblx0XHRhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQodGhpcy5maXJzdEl0ZXJhdGlvbk9wZXJhdGlvbnMpO1xuXHRcdGF3YWl0IHRoaXMuYWZ0ZXJPRGF0YU9wZXJhdGlvbkV4ZWN1dGlvbigpO1xuXHRcdHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQodGhpcy5vcGVyYXRpb25Qcm9taXNlcyk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGFmdGVyT0RhdGFPcGVyYXRpb25FeGVjdXRpb24oKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0YXdhaXQgdGhpcy5vRGF0YVN0cmljdEhhbmRsaW5nPy5tYW5hZ2VTdHJpY3RIYW5kbGluZ0ZhaWxzKCk7XG5cdFx0YXdhaXQgdGhpcy5wYXJhbWV0ZXJzLmV2ZW50cz8ub25BZnRlck9EYXRhT3BlcmF0aW9uRXhlY3V0aW9uPy4oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB0aGUgb3BlcmF0aW9ucyBzZXF1ZW50aWFsbHkuXG5cdCAqIEByZXR1cm5zIFRoZSBwcm9taXNlIG9mIHRoZSBvcGVyYXRpb25zXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGV4ZWN1dGVTZXF1ZW50aWFsbHkoKTogUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDxPcGVyYXRpb25SZXN1bHQ+W10+IHtcblx0XHQvLyBzZXJpYWxpemF0aW9uOiBleGVjdXRlQm91bmRPcGVyYXRpb24gdG8gYmUgY2FsbGVkIGZvciBlYWNoIGVudHJ5IG9ubHkgYWZ0ZXIgdGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB0aGUgb25lIGJlZm9yZSBoYXMgYmVlbiByZXNvbHZlZFxuXHRcdGF3YWl0IHRoaXMucGFyYW1ldGVycy5jb250ZXh0cy5yZWR1Y2UoYXN5bmMgKHByb21pc2U6IFByb21pc2U8dm9pZD4sIGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBpZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0XHRhd2FpdCBwcm9taXNlO1xuXHRcdFx0dGhpcy5vcGVyYXRpb25Qcm9taXNlcy5wdXNoKHRoaXMuZXhlY3V0ZUJvdW5kT3BlcmF0aW9uKGNvbnRleHQsIHRoaXMub3BlcmF0aW9uUHJvcGVydGllcy5ncm91cElkID8/IGBhcGlNb2RlJHtpZCArIDF9YCkpO1xuXHRcdFx0YXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHRoaXMuZmlyc3RJdGVyYXRpb25PcGVyYXRpb25zKTtcblx0XHR9LCBQcm9taXNlLnJlc29sdmUoKSk7XG5cdFx0YXdhaXQgdGhpcy5hZnRlck9EYXRhT3BlcmF0aW9uRXhlY3V0aW9uKCk7XG5cdFx0cmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZCh0aGlzLm9wZXJhdGlvblByb21pc2VzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB0aGUgYm91bmQgb3BlcmF0aW9uLlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgYm91bmQgY29udGV4dFxuXHQgKiBAcGFyYW0gZ3JvdXBJZCBUaGUgZ3JvdXBJZCBvZiB0aGUgYmF0Y2hcblx0ICogQHJldHVybnMgVGhlIHByb21pc2Ugb2YgdGhlIG9wZXJhdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBleGVjdXRlQm91bmRPcGVyYXRpb24oY29udGV4dDogT0RhdGFWNENvbnRleHQsIGdyb3VwSWQ/OiBzdHJpbmcpOiBQcm9taXNlPE9wZXJhdGlvblJlc3VsdD4ge1xuXHRcdGNvbnN0IG9wZXJhdGlvbkNvbnRleHQgPSB0aGlzLnBhcmFtZXRlcnMubW9kZWwuYmluZENvbnRleHQoYCR7dGhpcy5hY3Rpb25OYW1lfSguLi4pYCwgY29udGV4dCwgdGhpcy5iaW5kaW5nUGFyYW1ldGVycyk7XG5cdFx0dGhpcy5vcGVyYXRpb25Db250ZXh0QmluZGluZ3MucHVzaChvcGVyYXRpb25Db250ZXh0KTtcblx0XHRjb25zdCBwcm9taXNlczogUHJvbWlzZTx1bmtub3duPltdID0gW107XG5cdFx0dGhpcy5zZXRQYXJhbWV0ZXJzVmFsdWUob3BlcmF0aW9uQ29udGV4dCk7XG5cdFx0Y29uc3QgZmluYWxHcm91cElkID0gZ3JvdXBJZCA/PyBvcGVyYXRpb25Db250ZXh0LmdldFVwZGF0ZUdyb3VwSWQoKTtcblx0XHRjb25zdCBvcGVyYXRpb25Qcm9taXNlID0gdGhpcy5pbnZva2Uob3BlcmF0aW9uQ29udGV4dCwgZmluYWxHcm91cElkKTtcblx0XHRwcm9taXNlcy5wdXNoKG9wZXJhdGlvblByb21pc2UpO1xuXHRcdHRoaXMuZGVmYXVsdFN1Ym1pdChmaW5hbEdyb3VwSWQpO1xuXHRcdFByb21pc2UuYWxsU2V0dGxlZChwcm9taXNlcyk7XG5cdFx0cmV0dXJuIG9wZXJhdGlvblByb21pc2U7XG5cdH1cblxuXHQvKipcblx0ICogRW5oYW5jZXMgdGhlIHNpZGUgZWZmZWN0cyBvZiB0aGUgb3BlcmF0aW9uXG5cdCAqXG5cdCAqIFdoZW4gYSBuZXcgZW50aXR5IGlzIGNyZWF0ZWQgdXNpbmcgYSBEYXRhRmllbGRGb3JBY3Rpb24sIGEgbmV3XG5cdCAqIG9EYXRhQ29udGV4dEJpbmRpbmcgaXMgY3JlYXRlZCB0byBleGVjdXRlIHRoZSBhY3Rpb24uIEJ5IGRlZmF1bHQsIHRoaXNcblx0ICogb0RhdGFDb250ZXh0QmluZGluZyBpcyByZWxhdGl2ZSB0byB0aGUgT2RhdGFMaXN0QmluZGluZyBvZiB0aGUgdGFibGUuXG5cdCAqXG5cdCAqIEJlY2F1c2Ugb2YgdGhpcyBkZXBlbmRlbmN5LCB3aGVuIGEgU2lkZUVmZmVjdHMgaXMgZXhlY3V0ZWQgb24gdGhlXG5cdCAqIGNvbnRleHQgaW50byB0aGUgT2RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgb0RhdGFDb250ZXh0QmluZGluZyB3YXMgYm91bmQsIHRoaXMgU2lkZUVmZmVjdHMgaXMgYWxzbyB0cmlnZ2VyZWQgb24gdGhpc1xuXHQgKiBvRGF0YUNvbnRleHRCaW5kaW5nLiBXZSBkb24ndCBtYW5hZ2UgdGhlIGxpZmVjeWNsZSBvZiB0aGVcblx0ICogb0RhdGFDb250ZXh0QmluZGluZy4gSXQgbWVhbnMgZXZlbiBpZiB0aGUgZHJhZnQgcmVsYXRlZCB0byB0aGUgYWN0aW9uXG5cdCAqIGlzIHJlbW92ZWQsIHRoZSBvZGF0YUNvbnRleHRCaW5kaW5nIGlzIHN0aWxsIHRoZXJlLCBzbyBpZiBhIFNpZGVFZmZlY3RzXG5cdCAqIGlzIGV4ZWN1dGVkIG9uIHRoZSBzb3VyY2UgdGFyZ2V0IGludG8gb0RhdGFDb250ZXh0QmluZGluZywgYW4gZXJyb3IgZnJvbSB0aGUgYmFjayBlbmQgd2lsbCBiZVxuXHQgKiByZWNlaXZlZCBiZWNhdXNlIHdlIGFzayB0byByZWZyZXNoIGEgcHJvcGVydHkgb24gYW4gdW5rbm93biBlbnRpdHkuXG5cdCAqXG5cdCAqIFRoZSBTaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkIG9ubHkgaWYgdGhlIHBhZ2UgaXMgc3RpbGwgb3Blbi5cblx0ICogVGhpcyBhdm9pZHMgZ2VuZXJhdGluZyBpc3N1ZXMgd2l0aCBnaG9zdCBvRGF0YUNvbnRleHRCaW5kaW5nIGxpbmtlZCB0byBkZXN0cm95ZWQgY29udGV4dC5cblx0ICogQHBhcmFtIG9wZXJhdGlvbkNvbnRleHRCaW5kaW5nIFRoZSBvcGVyYXRpb25cblx0ICogQHBhcmFtIHJldHVybmVkQ29udGV4dCBUaGUgcmV0dXJuZWQgY29udGV4dCBvZiB0aGlzIG9wZXJhdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBlbmhhbmNlU2lkZUVmZmVjdHMob3BlcmF0aW9uQ29udGV4dEJpbmRpbmc6IE9EYXRhQ29udGV4dEJpbmRpbmcsIHJldHVybmVkQ29udGV4dDogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0XHRpZiAocmV0dXJuZWRDb250ZXh0ICYmIHRoaXMucGFyYW1ldGVycy5naG9zdENvbnRleHRCaW5kaW5nUHJvdGVjdGlvbiA9PT0gdHJ1ZSkge1xuXHRcdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5wYXJhbWV0ZXJzLmFwcENvbXBvbmVudDtcblx0XHRcdGNvbnN0IG9yaWdpbiA9IG9wZXJhdGlvbkNvbnRleHRCaW5kaW5nLnJlcXVlc3RTaWRlRWZmZWN0cy5iaW5kKG9wZXJhdGlvbkNvbnRleHRCaW5kaW5nKTtcblx0XHRcdG9wZXJhdGlvbkNvbnRleHRCaW5kaW5nLnJlcXVlc3RTaWRlRWZmZWN0cyA9IGFzeW5jICguLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRcdFx0Ly8gV2UgY2hlY2sgaWYgb25lIG9mIHRoZSBwYWdlcyBvciBhbiBvcGVuIGRpYWxvZyB1c2VzIHRoZSByZXR1cm5lZCBjb250ZXh0LlxuXHRcdFx0XHQvLyBJZiBub3QsIHNpZGUgZWZmZWN0cyBhcmUgbm90IHJlcXVlc3RlZC5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdGFwcENvbXBvbmVudFxuXHRcdFx0XHRcdFx0LmdldFJvb3RWaWV3Q29udHJvbGxlcigpXG5cdFx0XHRcdFx0XHQuZ2V0SW5zdGFuY2VkVmlld3MoKVxuXHRcdFx0XHRcdFx0LnNvbWUoKHBhZ2VWaWV3OiBWaWV3KSA9PiBwYWdlVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpID09PSByZXR1cm5lZENvbnRleHQpIHx8XG5cdFx0XHRcdFx0SW5zdGFuY2VNYW5hZ2VyLmdldE9wZW5EaWFsb2dzKCkuc29tZSgoZGlhbG9nKSA9PiBkaWFsb2cuZ2V0QmluZGluZ0NvbnRleHQoKSA9PT0gcmV0dXJuZWRDb250ZXh0KVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gb3JpZ2luKC4uLmFyZ3MpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEludm9rZXMgdGhlIG9wZXJhdGlvbiBvbiB0aGUgY29udGV4dC5cblx0ICogQHBhcmFtIG9wZXJhdGlvbkNvbnRleHRCaW5kaW5nIFRoZSBvcGVyYXRpb24gY29udGV4dCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBncm91cElkIFRoZSBncm91cElkIG9mIHRoZSBiYXRjaFxuXHQgKiBAcmV0dXJucyBUaGUgcHJvbWlzZSBvZiB0aGUgb3BlcmF0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGludm9rZShvcGVyYXRpb25Db250ZXh0QmluZGluZzogT0RhdGFDb250ZXh0QmluZGluZywgZ3JvdXBJZDogc3RyaW5nKTogUHJvbWlzZTxPcGVyYXRpb25SZXN1bHQ+IHtcblx0XHRsZXQgcmV0dXJuZWRDb250ZXh0O1xuXHRcdGxldCBmaXJzdEl0ZXJhdGlvblJlc29sdmUhOiBGdW5jdGlvbjtcblx0XHRsZXQgZmlyc3RJdGVyYXRpb25SZWplY3QhOiBGdW5jdGlvbjtcblx0XHRjb25zdCBzdHJpY3RIYW5kbGluZ1Byb21pc2UgPSBuZXcgUHJvbWlzZTx1bmtub3duPihmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0XHRmaXJzdEl0ZXJhdGlvblJlc29sdmUgPSByZXNvbHZlO1xuXHRcdFx0Zmlyc3RJdGVyYXRpb25SZWplY3QgPSByZWplY3Q7XG5cdFx0fSk7XG5cdFx0dGhpcy5maXJzdEl0ZXJhdGlvbk9wZXJhdGlvbnMucHVzaChzdHJpY3RIYW5kbGluZ1Byb21pc2UpO1xuXHRcdGlmIChncm91cElkICYmIHRoaXMuaXNBUElNb2RlKGdyb3VwSWQpKSB7XG5cdFx0XHR0aGlzLmFwaUdyb3VwSWRzVG9TdWJtaXQuYWRkKGdyb3VwSWQpO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgc2lkZUVmZmVjdHNDb250ZXh0ID1cblx0XHRcdFx0KG9wZXJhdGlvbkNvbnRleHRCaW5kaW5nLmdldENvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZCkgPz8gb3BlcmF0aW9uQ29udGV4dEJpbmRpbmcuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRjb25zdCBvcGVyYXRpb25JbnZva2UgPSBvcGVyYXRpb25Db250ZXh0QmluZGluZy5pbnZva2UoXG5cdFx0XHRcdGdyb3VwSWQsXG5cdFx0XHRcdHRoaXMub3BlcmF0aW9uUHJvcGVydGllcy5pZ25vcmVFVGFnLFxuXHRcdFx0XHR0aGlzLm9EYXRhU3RyaWN0SGFuZGxpbmc/LmhhbmRsZU9kYXRhU3RyaWN0SGFuZGxpbmcuYmluZChcblx0XHRcdFx0XHR0aGlzLm9EYXRhU3RyaWN0SGFuZGxpbmcsXG5cdFx0XHRcdFx0b3BlcmF0aW9uQ29udGV4dEJpbmRpbmcsXG5cdFx0XHRcdFx0Zmlyc3RJdGVyYXRpb25SZXNvbHZlLFxuXHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzQ29udGV4dCwgZ3JvdXBJZCwgW10pO1xuXHRcdFx0XHRcdFx0dGhpcy5wYXJhbWV0ZXJzLm1vZGVsLnN1Ym1pdEJhdGNoKGdyb3VwSWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0KSxcblx0XHRcdFx0dGhpcy5vcGVyYXRpb25Qcm9wZXJ0aWVzLnJlcGxhY2VXaXRoUlZDXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHMoc2lkZUVmZmVjdHNDb250ZXh0LCBncm91cElkLCBbb3BlcmF0aW9uSW52b2tlXSk7XG5cdFx0XHRhd2FpdCBQcm9taXNlLnJhY2UoW29wZXJhdGlvbkludm9rZSwgc3RyaWN0SGFuZGxpbmdQcm9taXNlXSk7XG5cblx0XHRcdHJldHVybmVkQ29udGV4dCA9IGF3YWl0IG9wZXJhdGlvbkludm9rZTtcblx0XHRcdHRoaXMuZW5oYW5jZVNpZGVFZmZlY3RzKG9wZXJhdGlvbkNvbnRleHRCaW5kaW5nLCByZXR1cm5lZENvbnRleHQpO1xuXHRcdFx0Zmlyc3RJdGVyYXRpb25SZXNvbHZlKCk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGZpcnN0SXRlcmF0aW9uUmVqZWN0KGVycm9yKTtcblx0XHRcdGNvbnN0IGNvbnRleHQgPSBvcGVyYXRpb25Db250ZXh0QmluZGluZy5nZXRDb250ZXh0KCk7XG5cdFx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0XHR0aGlzLmZhaWxlZENvbnRleHRzLnB1c2goY29udGV4dCBhcyBPRGF0YVY0Q29udGV4dCk7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0YXdhaXQgdGhpcy5wYXJhbWV0ZXJzLmV2ZW50cz8ub25BZnRlck9EYXRhSW52b2tlPy4ob3BlcmF0aW9uQ29udGV4dEJpbmRpbmcsIGdyb3VwSWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRyZXR1cm5lZENvbnRleHQsXG5cdFx0XHRib3VuZENvbnRleHQ6IG9wZXJhdGlvbkNvbnRleHRCaW5kaW5nLmdldEJvdW5kQ29udGV4dCgpXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiAgTWFuYWdlcyB0aGUgc3RyaWN0IGhhbmRsaW5nIHZhbGlkYXRpb24uXG5cdCAqL1xuXHRwcml2YXRlIG9uU3RyaWN0VmFsaWRhdGlvbigpOiB2b2lkIHtcblx0XHR0aGlzLnBhcmFtZXRlcnMuZXZlbnRzPy5vblN0cmljdFZhbGlkYXRpb24/LigpO1xuXHRcdHRoaXMucmV0cmlnZ2VyRmFpbGVkQ29udGV4dHMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiAgVHJpZ2dlcnMgdGhlIGZhaWxlZCBvcGVyYXRpb25zIGluIGNhc2Ugb2Ygc3RyaWN0IGhhbmRsaW5nLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmV3IG9wZXJhdGlvbnMgYXJlIHJlc29sdmVkXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIHJldHJpZ2dlckZhaWxlZENvbnRleHRzKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vUmV0cnkgdGhlIGFjdGlvbiBleGVjdXRpb24gaW4gY2FzZSBvZiBzdHJpY3QgaGFuZGxpbmcgYW5kIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBmYWlsZWQgY29udGV4dCAoZ2l2ZSBpdCBhbm90aGVyIHRyeSB0byBzdWNjZWVkKVxuXHRcdGlmICh0aGlzLnBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nICE9PSBJbnZvY2F0aW9uR3JvdXBpbmcuQ2hhbmdlU2V0KSB7XG5cdFx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdFx0Zm9yIChjb25zdCBmYWlsZWRDb250ZXh0IG9mIHRoaXMuZmFpbGVkQ29udGV4dHMpIHtcblx0XHRcdFx0aW5kZXgrKztcblx0XHRcdFx0dGhpcy5vcGVyYXRpb25Qcm9taXNlcy5wdXNoKHRoaXMuZXhlY3V0ZUJvdW5kT3BlcmF0aW9uKGZhaWxlZENvbnRleHQsIGBhcGlSZXRyaWdnZXIke2luZGV4ICsgMX1gKSk7XG5cdFx0XHR9XG5cdFx0XHRhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQodGhpcy5vcGVyYXRpb25Qcm9taXNlcyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN1Ym1pdHMgdGhlIGJhdGNoIHJlbGF0ZWQgdG8gdGhlIGdyb3VwSWQgb2YgdGhlIG9wZXJhdGlvbi5cblx0ICovXG5cdHB1YmxpYyBzdWJtaXQoKTogdm9pZCB7XG5cdFx0aWYgKCF0aGlzLm5ldmVyU3VibWl0dGVkIHx8IHRoaXMuYXBpR3JvdXBJZHNUb1N1Ym1pdC5zaXplID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgZ3JvdXBJZCBvZiBBcnJheS5mcm9tKHRoaXMuYXBpR3JvdXBJZHNUb1N1Ym1pdC52YWx1ZXMoKSkpIHtcblx0XHRcdHRoaXMuc3VibWl0T25Nb2RlbChncm91cElkKTtcblx0XHR9XG5cdFx0dGhpcy5wYXJhbWV0ZXJzLmV2ZW50cz8ub25PRGF0YVN1Ym1pdD8uKCk7XG5cdH1cblxuXHQvKipcblx0ICogIElzIHN0cmljdCBoYW5kbGluZyBjYW5jZWxlZC5cblx0ICogQHJldHVybnMgVHJ1ZSBpZiBpdCBpcyBjYW5jZWxlZCwgb3RoZXJ3aXNlIGZhbHNlXG5cdCAqL1xuXHRwdWJsaWMgaXNTdHJpY3RDYW5jZWxlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5vRGF0YVN0cmljdEhhbmRsaW5nPy5pc0NhbmNlbGVkKCkgPz8gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogU3VibWl0cyB0aGUgYmF0Y2ggYXQgdGhlIG1vZGVsIGxldmVsIHJlbGF0ZWQgdG8gdGhlIGdyb3VwSWQgb2YgdGhlIG9wZXJhdGlvbi5cblx0ICogQHBhcmFtIGdyb3VwSWQgVGhlIGdyb3VwSWQgb2YgdGhlIGJhdGNoXG5cdCAqL1xuXHRwcml2YXRlIHN1Ym1pdE9uTW9kZWwoZ3JvdXBJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5wYXJhbWV0ZXJzLm1vZGVsLnN1Ym1pdEJhdGNoKGdyb3VwSWQpO1xuXHRcdHRoaXMuYXBpR3JvdXBJZHNUb1N1Ym1pdC5kZWxldGUoZ3JvdXBJZCk7XG5cdH1cblxuXHQvKipcblx0ICogSXMgdGhlIFN1Ym1pdE1vZGUgb2YgdGhlIGdyb3VwSWQgc2V0IHRvIEFQSS5cblx0ICogQHBhcmFtIGdyb3VwSWQgVGhlIGdyb3VwSWQgb2YgdGhlIGJhdGNoXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIFN1Ym1pdE1vZGUgaXMgc2V0IHRvIEFQSSwgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRwcml2YXRlIGlzQVBJTW9kZShncm91cElkPzogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0aWYgKCFncm91cElkKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGlmIChncm91cElkLnN0YXJ0c1dpdGgoXCIkYXV0b1wiKSB8fCBncm91cElkLnN0YXJ0c1dpdGgoXCIkZGlyZWN0XCIpIHx8IGdyb3VwSWQuc3RhcnRzV2l0aChcIiRzaW5nbGVcIikpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3Qgc3VibWl0TW9kZSA9IChcblx0XHRcdHRoaXMucGFyYW1ldGVycy5hcHBDb21wb25lbnQuZ2V0TWFuaWZlc3RFbnRyeShcInNhcC51aTVcIik/Lm1vZGVsc1tcIlwiXT8uc2V0dGluZ3MgYXNcblx0XHRcdFx0fCB7IGdyb3VwUHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHsgc3VibWl0OiBTdWJtaXRNb2RlIH0+IH1cblx0XHRcdFx0fCB1bmRlZmluZWRcblx0XHQpPy5ncm91cFByb3BlcnRpZXM/Lltncm91cElkXT8uc3VibWl0O1xuXG5cdFx0aWYgKHN1Ym1pdE1vZGUgPT09IHVuZGVmaW5lZCB8fCBbU3VibWl0TW9kZS5BdXRvLCBTdWJtaXRNb2RlLkRpcmVjdF0uaW5jbHVkZXMoc3VibWl0TW9kZSkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB0aGUgc3VibWl0IG9mIHRoZSBvcGVyYXRpb24gaWYgdGhlIHN1Ym1pdE1vZGUgaXMgb24gQVBJIGFuZCBkZWZlcnJlZFN1Ym1pdCBpcyBub3Qgc2V0IHRvIHRydWVcblx0ICogVGhlIHN1Ym1pdEJhdGNoIGlzIHNraXBwZWQgaWYgdGhlIGdyb3VwSWQgaXMgJGF1dG8gb3IgJGRpcmVjdCBzaW5jZSBkb25lIGJ5IHRoZSBtb2RlbC5cblx0ICogQHBhcmFtIGdyb3VwSWQgVGhlIGdyb3VwSWQgb2YgdGhlIGJhdGNoXG5cdCAqL1xuXHRwcml2YXRlIGRlZmF1bHRTdWJtaXQoZ3JvdXBJZD86IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IGZpcnN0U3VibWl0ID0gdGhpcy5uZXZlclN1Ym1pdHRlZDtcblx0XHRjb25zdCBpc0FQSU1vZGUgPSB0aGlzLmlzQVBJTW9kZShncm91cElkKTtcblx0XHRpZiAoIWlzQVBJTW9kZSkge1xuXHRcdFx0Ly8gVGhlIHN1Ym1pdEJhdGNoIGlzIHNraXBwZWQgaWYgdGhlIGdyb3VwSWQgaXMgJGF1dG8gb3IgJGRpcmVjdCBzaW5jZSBkb25lIGJ5IHRoZSBtb2RlbFxuXHRcdFx0dGhpcy5uZXZlclN1Ym1pdHRlZCA9IGZhbHNlO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5vcGVyYXRpb25Qcm9wZXJ0aWVzLmRlZmVycmVkU3VibWl0ICE9PSB0cnVlICYmIGdyb3VwSWQpIHtcblx0XHRcdHRoaXMubmV2ZXJTdWJtaXR0ZWQgPSBmYWxzZTtcblx0XHRcdHRoaXMuc3VibWl0T25Nb2RlbChncm91cElkKTtcblx0XHR9XG5cdFx0aWYgKGZpcnN0U3VibWl0ICYmICF0aGlzLm5ldmVyU3VibWl0dGVkKSB7XG5cdFx0XHQvL1RyaWdnZXIgdGhlIGNhbGxiYWNrIG9ubHkgb25jZVxuXHRcdFx0dGhpcy5wYXJhbWV0ZXJzLmV2ZW50cz8ub25PRGF0YVN1Ym1pdD8uKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqICBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIG9wZXJhdGlvbi5cblx0ICogQHBhcmFtIG9wZXJhdGlvbkNvbnRleHRCaW5kaW5nIFRoZSBvcGVyYXRpb24gY29udGV4dCBiaW5kaW5nXG5cdCAqL1xuXHRwcml2YXRlIHNldFBhcmFtZXRlcnNWYWx1ZShvcGVyYXRpb25Db250ZXh0QmluZGluZzogT0RhdGFDb250ZXh0QmluZGluZyk6IHZvaWQge1xuXHRcdGlmICh0aGlzLm9wZXJhdGlvblBhcmFtZXRlcnMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBkZWZhdWx0VmFsdWVzID0gdGhpcy5wYXJhbWV0ZXJzLnBhcmFtZXRlcnNWYWx1ZXMgPz8ge307XG5cdFx0XHRmb3IgKGNvbnN0IHBhcmFtZXRlciBvZiB0aGlzLm9wZXJhdGlvblBhcmFtZXRlcnMpIHtcblx0XHRcdFx0Y29uc3QgbmFtZSA9IHBhcmFtZXRlci5uYW1lO1xuXHRcdFx0XHRpZiAoIWRlZmF1bHRWYWx1ZXNbbmFtZV0pIHtcblx0XHRcdFx0XHRzd2l0Y2ggKHBhcmFtZXRlci50eXBlKSB7XG5cdFx0XHRcdFx0XHRjYXNlIFwiRWRtLlN0cmluZ1wiOlxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWVzW25hbWVdID0gXCJcIjtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwiRWRtLkJvb2xlYW5cIjpcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdFZhbHVlc1tuYW1lXSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uQnl0ZVwiOlxuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5JbnQxNlwiOlxuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5JbnQzMlwiOlxuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5JbnQ2NFwiOlxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWVzW25hbWVdID0gMDtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0b3BlcmF0aW9uQ29udGV4dEJpbmRpbmcuc2V0UGFyYW1ldGVyKG5hbWUsIGRlZmF1bHRWYWx1ZXNbbmFtZV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyB0aGUgc2lkZSBlZmZlY3RzIGZvciB0aGUgYWN0aW9uLlxuXHQgKiBAcGFyYW0gY29udGV4dCAgVGhlIGNvbnRleHQgb2YgdGhlIFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSBncm91cElkICBUaGUgZ3JvdXBJZCBvZiB0aGUgYmF0Y2hcblx0ICogQHBhcmFtIGxvY2FsUHJvbWlzZSBUaGUgcHJvbWlzZSBvZiB0aGUgaW52b2tlZCBhY3Rpb25cblx0ICogQHJldHVybnMgVGhlIHByb21pc2Ugb2YgdGhlIHNpZGUgZWZmZWN0XG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIHJlcXVlc3RTaWRlRWZmZWN0cyhjb250ZXh0OiBPRGF0YVY0Q29udGV4dCwgZ3JvdXBJZDogc3RyaW5nLCBsb2NhbFByb21pc2U/OiBQcm9taXNlPHVua25vd24+W10pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBzaWRlRWZmZWN0c1NlcnZpY2UgPSB0aGlzLnBhcmFtZXRlcnMuYXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdGxldCBwcm9taXNlczogUHJvbWlzZTx1bmtub3duPltdID0gbG9jYWxQcm9taXNlID8/IFtdO1xuXHRcdC8vIHRyaWdnZXIgYWN0aW9ucyBmcm9tIHNpZGUgZWZmZWN0c1xuXHRcdGlmICh0aGlzLnNpZGVFZmZlY3RzICYmICF0aGlzLnBhcmFtZXRlcnMuZGlzYWJsZVNpZGVFZmZlY3RzID09PSB0cnVlKSB7XG5cdFx0XHRwcm9taXNlcyA9IHByb21pc2VzLmNvbmNhdChcblx0XHRcdFx0KHRoaXMuc2lkZUVmZmVjdHMudHJpZ2dlckFjdGlvbnMgPz8gW10pLm1hcChhc3luYyAoYWN0aW9uKSA9PiBzaWRlRWZmZWN0c1NlcnZpY2UuZXhlY3V0ZUFjdGlvbihhY3Rpb24sIGNvbnRleHQsIGdyb3VwSWQpKSxcblx0XHRcdFx0dGhpcy5zaWRlRWZmZWN0cy5wYXRoRXhwcmVzc2lvbnNcblx0XHRcdFx0XHQ/IHNpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHModGhpcy5zaWRlRWZmZWN0cy5wYXRoRXhwcmVzc2lvbnMsIGNvbnRleHQsIGdyb3VwSWQpXG5cdFx0XHRcdFx0OiBbXVxuXHRcdFx0KTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcblx0XHRcdFx0aWYgKHRoaXMuc2lkZUVmZmVjdHMucGF0aEV4cHJlc3Npb25zKSB7XG5cdFx0XHRcdFx0dGhpcy5wYXJhbWV0ZXJzLmV2ZW50cz8ub25SZXF1ZXN0U2lkZUVmZmVjdHM/Lih0aGlzLnNpZGVFZmZlY3RzLCB0aGlzLm9wZXJhdGlvbiwgcHJvbWlzZXMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRMb2cuaW5mbyhcIkVycm9yIHdoaWxlIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzIGZvciB0aGUgb3BlcmF0aW9uIFwiICsgdGhpcy5hY3Rpb25OYW1lLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7RUFtQkEsTUFBTUEsa0JBQWtCLEdBQUdDLFNBQVMsQ0FBQ0Qsa0JBQWtCO0VBQUMsSUFPbkNFLGNBQWM7SUF1QmxDLFNBQUFBLGVBQ2tCQyxTQUFtQyxFQUNuQ0MsVUFvQmhCLEVBU0E7TUFBQSxJQVJnQkMsbUJBT2hCLEdBQUFDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLENBQUMsQ0FBQztNQUFBLEtBcERDRyx3QkFBd0IsR0FBMEIsRUFBRTtNQUFBLEtBRTNDQyx3QkFBd0IsR0FBdUIsRUFBRTtNQUFBLEtBRWpEQyxtQkFBbUIsR0FBZ0IsSUFBSUMsR0FBRyxDQUFDLENBQUM7TUFBQSxLQU1yREMsaUJBQWlCLEdBQTRCLENBQUMsQ0FBQztNQUFBLEtBRS9DQyxtQkFBbUIsR0FBc0IsRUFBRTtNQUFBLEtBRTNDQyxjQUFjLEdBQUcsSUFBSTtNQUFBLEtBSXJCQyxjQUFjLEdBQXFCLEVBQUU7TUFBQSxLQUVyQ0MsaUJBQWlCLEdBQStCLEVBQUU7TUFBQSxLQUd4Q2QsU0FBbUMsR0FBbkNBLFNBQW1DO01BQUEsS0FDbkNDLFVBb0JoQixHQXBCZ0JBLFVBb0JoQjtNQUFBLEtBQ2dCQyxtQkFPaEIsR0FQZ0JBLG1CQU9oQjtNQUVELElBQUksQ0FBQ2EsVUFBVSxHQUFHQyxZQUFZLENBQUNDLGFBQWEsQ0FBQ0MsUUFBUSxDQUFDLElBQUksQ0FBQ2xCLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQ0EsU0FBUyxHQUFHLElBQUksQ0FBQ0EsU0FBUyxDQUFDbUIsTUFB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
@@ -2,7 +2,6 @@ import type { ActionImport, ActionParameter, Action as EdmAction } from "@sap-ux
2
2
  import Log from "sap/base/Log";
3
3
  import deepClone from "sap/base/util/deepClone";
4
4
  import type AppComponent from "sap/fe/core/AppComponent";
5
- import { convertTypes } from "sap/fe/core/converters/MetaModelConverter";
6
5
  import FELibrary from "sap/fe/core/library";
7
6
  import InstanceManager from "sap/m/InstanceManager";
8
7
  import type Message from "sap/ui/core/message/Message";
@@ -48,8 +47,6 @@ export default class ODataOperation {
48
47
 
49
48
  private operationPromises: Promise<OperationResult>[] = [];
50
49
 
51
- private readonly additionalSelectProperties: string[] = [];
52
-
53
50
  constructor(
54
51
  private readonly operation: EdmAction | ActionImport,
55
52
  private readonly parameters: {
@@ -111,18 +108,19 @@ export default class ODataOperation {
111
108
  private setBindingParameters(): void {
112
109
  this.bindingParameters = deepClone(this.operationProperties.bindingParameters ?? {});
113
110
 
114
- if (isAction(this.operation) && this.parameters.contexts.length && this.operationProperties.enhance$select === true) {
111
+ if (
112
+ isAction(this.operation) &&
113
+ !this.operation.isFunction &&
114
+ this.parameters.contexts.length &&
115
+ this.operationProperties.enhance$select === true
116
+ ) {
115
117
  const existingSelect = (this.bindingParameters.$select as string | undefined)?.split(",") ?? [];
116
118
  const returnEntityType = this.operation.returnEntityType;
117
119
  const metaModel = this.parameters.model.getMetaModel();
118
120
  const messagesPath = ModelHelper.getMessagesPath(metaModel, this.parameters.contexts[0].getPath())!;
119
- const entitySet = convertTypes(metaModel).entitySets.filter((entity) => entity.entityType === returnEntityType)?.[0];
120
121
  const isSameEntity =
121
122
  !this.operation.returnCollection && !!returnEntityType && this.operation.sourceEntityType === returnEntityType;
122
123
  if (isSameEntity) {
123
- if (ModelHelper.isDraftRoot(entitySet) && !existingSelect.includes("HasActiveEntity")) {
124
- this.additionalSelectProperties.push("HasActiveEntity");
125
- }
126
124
  if (
127
125
  /* The former logic checked if the messagesPath is contained into the SideEffects
128
126
  but the check was invalid (always true)
@@ -135,15 +133,12 @@ export default class ODataOperation {
135
133
  !!returnEntityType?.entityProperties.find((property) => property.name === messagesPath) &&
136
134
  !existingSelect.includes(messagesPath)
137
135
  ) {
138
- this.additionalSelectProperties.push(messagesPath);
139
- }
140
- }
136
+ this.bindingParameters.$select = this.bindingParameters.$select
137
+ ? `${this.bindingParameters.$select},${messagesPath}`
138
+ : messagesPath;
141
139
 
142
- if (this.additionalSelectProperties.length) {
143
- const selectProperties = this.additionalSelectProperties.join(",");
144
- this.bindingParameters.$select = this.bindingParameters.$select
145
- ? `${this.bindingParameters.$select},${selectProperties}`
146
- : selectProperties;
140
+ this.bindingParameters.$$inheritExpandSelect = true;
141
+ }
147
142
  }
148
143
  }
149
144
  }
@@ -502,36 +497,18 @@ export default class ODataOperation {
502
497
  */
503
498
  private async requestSideEffects(context: ODataV4Context, groupId: string, localPromise?: Promise<unknown>[]): Promise<void> {
504
499
  const sideEffectsService = this.parameters.appComponent.getSideEffectsService();
505
- const metaModel = this.parameters.model.getMetaModel();
506
- const messagesPath = this.parameters.contexts.length
507
- ? ModelHelper.getMessagesPath(metaModel, this.parameters.contexts[0].getPath())
508
- : undefined;
509
-
510
500
  let promises: Promise<unknown>[] = localPromise ?? [];
511
- if (this.parameters.disableSideEffects !== true) {
512
- const pathExpressions = [
513
- ...(this.sideEffects?.pathExpressions ?? []),
514
- ...(this.sideEffects?.pathExpressions &&
515
- messagesPath &&
516
- this.additionalSelectProperties.includes(messagesPath) &&
517
- this.sideEffects.pathExpressions.some((exp) => typeof exp === "string" && (exp === messagesPath || exp === "*"))
518
- ? ["*"]
519
- : [])
520
- // Former workflow -> we add "*" to the SideEffects to get all properties only if the messagesPath is in the initial SideEffects
521
- // and messagesPath is added in the $select of the operation
522
- ];
523
-
524
- if (this.sideEffects || pathExpressions.length) {
525
- promises = promises.concat(
526
- (this.sideEffects?.triggerActions ?? []).map(async (action) =>
527
- sideEffectsService.executeAction(action, context, groupId)
528
- ),
529
- pathExpressions.length ? sideEffectsService.requestSideEffects(pathExpressions, context, groupId) : []
530
- );
531
- }
501
+ // trigger actions from side effects
502
+ if (this.sideEffects && !this.parameters.disableSideEffects === true) {
503
+ promises = promises.concat(
504
+ (this.sideEffects.triggerActions ?? []).map(async (action) => sideEffectsService.executeAction(action, context, groupId)),
505
+ this.sideEffects.pathExpressions
506
+ ? sideEffectsService.requestSideEffects(this.sideEffects.pathExpressions, context, groupId)
507
+ : []
508
+ );
532
509
  try {
533
510
  await Promise.all(promises);
534
- if (this.sideEffects?.pathExpressions) {
511
+ if (this.sideEffects.pathExpressions) {
535
512
  this.parameters.events?.onRequestSideEffects?.(this.sideEffects, this.operation, promises);
536
513
  }
537
514
  } catch (error) {