@sapui5/sap.fe.macros 1.142.0 → 1.143.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/macros/.library +1 -1
  3. package/src/sap/fe/macros/CollaborativeDraftHandler.js +1 -7
  4. package/src/sap/fe/macros/CollaborativeDraftHandler.tsx +0 -6
  5. package/src/sap/fe/macros/ConditionalSwitch.js +1 -2
  6. package/src/sap/fe/macros/ConditionalSwitch.tsx +0 -1
  7. package/src/sap/fe/macros/ConditionalSwitchProperty.js +1 -3
  8. package/src/sap/fe/macros/ConditionalSwitchProperty.tsx +0 -2
  9. package/src/sap/fe/macros/Field.js +5 -5
  10. package/src/sap/fe/macros/Field.ts +5 -3
  11. package/src/sap/fe/macros/FooterContent.js +3 -2
  12. package/src/sap/fe/macros/FooterContent.tsx +2 -10
  13. package/src/sap/fe/macros/KPITag.js +6 -6
  14. package/src/sap/fe/macros/KPITag.tsx +5 -5
  15. package/src/sap/fe/macros/MacroAPI.js +2 -2
  16. package/src/sap/fe/macros/MacroAPI.ts +1 -1
  17. package/src/sap/fe/macros/MessageButton.js +3 -3
  18. package/src/sap/fe/macros/MessageButton.tsx +3 -2
  19. package/src/sap/fe/macros/MicroChart.js +3 -2
  20. package/src/sap/fe/macros/MicroChart.tsx +1 -1
  21. package/src/sap/fe/macros/Share.js +7 -7
  22. package/src/sap/fe/macros/Share.tsx +9 -6
  23. package/src/sap/fe/macros/Status.js +6 -5
  24. package/src/sap/fe/macros/Status.tsx +3 -4
  25. package/src/sap/fe/macros/ai/EasyFillDialog.js +2 -1
  26. package/src/sap/fe/macros/ai/EasyFillDialog.tsx +1 -0
  27. package/src/sap/fe/macros/ai/SummarizationButton.js +6 -4
  28. package/src/sap/fe/macros/ai/SummarizationButton.tsx +5 -3
  29. package/src/sap/fe/macros/chart/ChartDelegate.js +22 -1
  30. package/src/sap/fe/macros/chart/ChartDelegate.ts +29 -2
  31. package/src/sap/fe/macros/chart/MdcChartTemplate.js +5 -2
  32. package/src/sap/fe/macros/chart/MdcChartTemplate.tsx +5 -2
  33. package/src/sap/fe/macros/controls/BuildingBlockObjectProperty.js +7 -7
  34. package/src/sap/fe/macros/controls/BuildingBlockObjectProperty.ts +3 -2
  35. package/src/sap/fe/macros/controls/FileWrapper.js +11 -5
  36. package/src/sap/fe/macros/controls/FileWrapper.ts +10 -4
  37. package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.js +3 -1
  38. package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.tsx +2 -0
  39. package/src/sap/fe/macros/coreUI/CreateDialog.js +2 -2
  40. package/src/sap/fe/macros/coreUI/CreateDialog.tsx +1 -1
  41. package/src/sap/fe/macros/coreUI/OperationParameterDialog.js +4 -4
  42. package/src/sap/fe/macros/coreUI/OperationParameterDialog.tsx +3 -3
  43. package/src/sap/fe/macros/field/FieldFormatOptions.js +2 -2
  44. package/src/sap/fe/macros/field/FieldFormatOptions.ts +1 -1
  45. package/src/sap/fe/macros/field/FieldRuntime.js +7 -2
  46. package/src/sap/fe/macros/field/FieldRuntime.ts +7 -1
  47. package/src/sap/fe/macros/filter/FilterUtils.js +31 -5
  48. package/src/sap/fe/macros/filter/FilterUtils.ts +40 -6
  49. package/src/sap/fe/macros/filterBar/FilterBarAPI.js +6 -3
  50. package/src/sap/fe/macros/filterBar/FilterBarAPI.ts +5 -1
  51. package/src/sap/fe/macros/filterBar/FilterBarDelegate.js +19 -9
  52. package/src/sap/fe/macros/filterBar/FilterBarDelegate.ts +76 -61
  53. package/src/sap/fe/macros/filterBar/UOMValidationDelegate.js +376 -0
  54. package/src/sap/fe/macros/filterBar/UOMValidationDelegate.ts +463 -0
  55. package/src/sap/fe/macros/form/FormContainer.block.js +22 -6
  56. package/src/sap/fe/macros/form/FormContainer.block.ts +24 -6
  57. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.js +2 -2
  58. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.ts +2 -1
  59. package/src/sap/fe/macros/library.js +5 -6
  60. package/src/sap/fe/macros/{library.ts → library.tsx} +1 -1
  61. package/src/sap/fe/macros/messagebundle.properties +6 -0
  62. package/src/sap/fe/macros/messagebundle_en_US_saprigi.properties +1 -1
  63. package/src/sap/fe/macros/messages/MessageButton.js +21 -12
  64. package/src/sap/fe/macros/messages/MessageButton.ts +21 -11
  65. package/src/sap/fe/macros/multivaluefield/MultiValueFieldDelegate.js +7 -3
  66. package/src/sap/fe/macros/multivaluefield/MultiValueFieldDelegate.ts +8 -2
  67. package/src/sap/fe/macros/quickView/QuickView.js +5 -4
  68. package/src/sap/fe/macros/quickView/QuickView.tsx +10 -3
  69. package/src/sap/fe/macros/table/Action.js +7 -4
  70. package/src/sap/fe/macros/table/Action.ts +3 -3
  71. package/src/sap/fe/macros/table/Column.js +3 -2
  72. package/src/sap/fe/macros/table/Column.ts +1 -1
  73. package/src/sap/fe/macros/table/MdcTableTemplate.js +6 -9
  74. package/src/sap/fe/macros/table/MdcTableTemplate.tsx +5 -7
  75. package/src/sap/fe/macros/table/Table.block.js +6 -3
  76. package/src/sap/fe/macros/table/Table.block.tsx +13 -3
  77. package/src/sap/fe/macros/table/TableAPI.js +13 -8
  78. package/src/sap/fe/macros/table/TableAPI.ts +10 -3
  79. package/src/sap/fe/macros/table/TableDefinition.js +2 -2
  80. package/src/sap/fe/macros/table/TableDefinition.ts +1 -1
  81. package/src/sap/fe/macros/table/TableEventHandlerProvider.js +3 -1
  82. package/src/sap/fe/macros/table/TableEventHandlerProvider.ts +4 -0
  83. package/src/sap/fe/macros/table/TableRuntime.js +24 -12
  84. package/src/sap/fe/macros/table/TableRuntime.ts +27 -11
  85. package/src/sap/fe/macros/table/Utils.js +9 -3
  86. package/src/sap/fe/macros/table/Utils.ts +14 -8
  87. package/src/sap/fe/macros/table/delegates/TableDelegate.js +6 -4
  88. package/src/sap/fe/macros/table/delegates/TableDelegate.ts +6 -5
  89. package/src/sap/fe/macros/table/massEdit/MassEditDialog.js +41 -15
  90. package/src/sap/fe/macros/table/massEdit/MassEditDialog.tsx +41 -22
  91. package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.js +14 -5
  92. package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.tsx +13 -4
  93. package/src/sap/fe/macros/table/mixin/ContextMenuHandler.js +2 -3
  94. package/src/sap/fe/macros/table/mixin/ContextMenuHandler.ts +3 -2
  95. package/src/sap/fe/macros/table/mixin/EmptyRowsHandler.js +37 -10
  96. package/src/sap/fe/macros/table/mixin/EmptyRowsHandler.ts +39 -15
  97. package/src/sap/fe/macros/table/mixin/TableHierarchy.js +3 -4
  98. package/src/sap/fe/macros/table/mixin/TableHierarchy.ts +2 -3
  99. package/src/sap/fe/macros/table/uploadTable/UploadTableRuntime.js +5 -4
  100. package/src/sap/fe/macros/table/uploadTable/UploadTableRuntime.ts +6 -3
  101. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.js +17 -10
  102. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.ts +24 -9
@@ -644,12 +644,21 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/base/BindingTo
644
644
  }
645
645
 
646
646
  /**
647
- * Checks if the the field is editable.
647
+ * Checks if the edit mode is editable.
648
+ * @param editMode
649
+ * @private
650
+ */;
651
+ _proto.isEditableEditMode = function isEditableEditMode(editMode) {
652
+ return [FieldEditMode.Editable].includes(editMode);
653
+ }
654
+
655
+ /**
656
+ * Checks if the field is editable.
648
657
  * @param expBinding The expression binding of the property.
649
658
  * @returns Returns true if the mass edit field is editable.
650
659
  */;
651
660
  _proto.getFieldEditable = function getFieldEditable(expBinding) {
652
- if (expBinding === FieldEditMode.Editable) {
661
+ if (this.isEditableEditMode(expBinding)) {
653
662
  return true;
654
663
  } else if (Object.keys(FieldEditMode).includes(expBinding)) {
655
664
  return false;
@@ -661,7 +670,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/base/BindingTo
661
670
  anyControl.setModel(model);
662
671
  const visible = this.analyzedContexts.some(context => {
663
672
  anyControl.setBindingContext(context);
664
- return anyControl.getBinding("any").getExternalValue() === FieldEditMode.Editable;
673
+ return this.isEditableEditMode(anyControl.getBinding("any").getExternalValue());
665
674
  });
666
675
  anyControl.destroy();
667
676
  return visible;
@@ -693,7 +702,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/base/BindingTo
693
702
  _proto.isFieldVisible = function isFieldVisible(fieldProperties) {
694
703
  if (this.isAdaptation || this.manifestSettings.visibleFields.length && this.degradedMode) {
695
704
  const isStaticEditMode = Object.keys(FieldEditMode).includes(fieldProperties.visibilityBindings.editMode);
696
- const isEditable = !isStaticEditMode || isStaticEditMode && fieldProperties.visibilityBindings.editMode === FieldEditMode.Editable;
705
+ const isEditable = !isStaticEditMode || isStaticEditMode && this.isEditableEditMode(fieldProperties.visibilityBindings.editMode);
697
706
  return isEditable && fieldProperties.visibilityBindings.isVisible !== "false";
698
707
  }
699
708
  return this.getFieldEditable(fieldProperties.visibilityBindings.editMode) && !this.isHiddenForContexts(fieldProperties.visibilityBindings.isVisible);
@@ -703,4 +712,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/base/BindingTo
703
712
  _exports = MassEditDialogHelper;
704
713
  return _exports;
705
714
  }, false);
706
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNYXNzRWRpdERpYWxvZ0hlbHBlciIsInByb3BzIiwibWF4QW5hbHl6ZWRSb3dzIiwiYW5hbHl6ZWRDb250ZXh0cyIsImZpZWxkUHJvcGVydGllcyIsImVudGl0eVR5cGVQYXRoIiwidGFibGUiLCJnZXRQYXJlbnQiLCJnZXRUYWJsZURlZmluaXRpb24iLCJhbm5vdGF0aW9uIiwiY29sbGVjdGlvbiIsIm1ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwibWFuaWZlc3RTZXR0aW5ncyIsImNvbnRyb2wiLCJtYXNzRWRpdCIsIm9uQ29udGV4dE1lbnUiLCJvbkRpYWxvZ0Nsb3NlIiwib25DbG9zZSIsInZpZXciLCJDb21tb25VdGlscyIsImdldFRhcmdldFZpZXciLCJjb250ZXh0cyIsImZldGNoQ29udGV4dHNGb3JFZGl0IiwiZGVncmFkZWRNb2RlIiwibGVuZ3RoIiwic2xpY2UiLCJpc0FkYXB0YXRpb24iLCJnZXRBcHBDb21wb25lbnQiLCJpc0FkYXB0YXRpb25Nb2RlIiwiaGVhZGVySW5mbyIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImdldENvbnRleHQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiYW5ub3RhdGlvbnMiLCJVSSIsIkhlYWRlckluZm8iLCJfZXhwb3J0cyIsIl9wcm90byIsInByb3RvdHlwZSIsIm9wZW4iLCJ0ZW1wbGF0ZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImludGVybmFsTW9kZWxQcm9wZXJ0eSIsInNlbGVjdGVkQ29udGV4dHMiLCJnZXRQcm9wZXJ0eSIsImdldEZpZWxkc1Byb3BlcnRpZXNGcm9tSW5mbyIsImdldEZpZWxkc0luZm8iLCJzb21lIiwiZmllbGQiLCJ2aXNpYmxlIiwibm9GaWVsZEluZm9ybWF0aW9uIiwiY29uZmlybVNlbGVjdGlvbiIsInJ1bkFzT3duZXIiLCJtYXNzRWRpdERpYWxvZyIsIk1hc3NFZGl0RGlhbG9nIiwiZGlhbG9nIiwiY3JlYXRlIiwiYXR0YWNoQmVmb3JlQ2xvc2UiLCJyZXF1aXJlZERhdGFQcm9taXNlIiwiZ2V0UmVxdWlyZWREYXRhUHJvbWlzZSIsImdldERhdGFBZnRlck9wZW5pbmdEaWFsb2ciLCJyZXNvbHZlIiwiZXJyb3IiLCJMb2ciLCJyZWplY3QiLCJ2aXNpYmxlRmllbGRzRnJvbU1hbmlmZXN0IiwidmlzaWJsZUZpZWxkcyIsInJlc291cmNlQnVuZGxlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwibWVzc2FnZSIsIm1lc3NhZ2VEZXRhaWwiLCJnZXRUZXh0IiwiZ2V0UmVzb3VyY2VUZXh0IiwiVHlwZU5hbWUiLCJyZWR1Y2UiLCJmaWVsZHMiLCJmaWVsZFByb3BlcnR5IiwiaW5jbHVkZXMiLCJwcm9wZXJ0eUluZm8iLCJyZWxhdGl2ZVBhdGgiLCJwdXNoIiwibGFiZWwiLCJqb2luIiwiTWVzc2FnZUJveCIsImluZm9ybWF0aW9uIiwiZGV0YWlscyIsInJlc291cmNlTW9kZWwiLCJSZXNvdXJjZU1vZGVsSGVscGVyIiwiZ2V0UmVzb3VyY2VNb2RlbCIsImNvcmVSZXNvdXJjZUJ1bmRsZSIsInVwZGF0YWJsZUNvbnRleHRzIiwiUHJvbWlzZSIsInRhYmxlQVBJIiwiZWRpdEJ1dHRvbiIsImNhbmNlbEJ1dHRvbiIsInR5cGVOYW1lIiwidHlwZU5hbWVQbHVyYWwiLCJUeXBlTmFtZVBsdXJhbCIsIk1vZGVsSGVscGVyIiwiaXNEcmFmdFN1cHBvcnRlZCIsImRhdGEiLCJyZWFkT25seSIsImdldE1lc3NhZ2VEZXRhaWxGb3JOb25FZGl0YWJsZSIsIndhcm5pbmciLCJhY3Rpb25zIiwiZW1waGFzaXplZEFjdGlvbiIsInNlbGVjdGlvbiIsInVuZGVmaW5lZCIsImdldFRyYW5zbGF0ZWRUZXh0RnJvbUV4cEJpbmRpbmdTdHJpbmciLCJjb21waWxlRXhwcmVzc2lvbiIsImdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbiIsInRvTG9jYWxlTG93ZXJDYXNlIiwiZ2V0RW50aXR5RmllbGRzSW5mbyIsImNvbHVtbnNEYXRhIiwiY29sdW1ucyIsInByb3BlcnRpZXNLZXlzIiwiU2V0IiwiY29sdW1uIiwidHlwZSIsIm5hbWUiLCJ0cmFuc2Zvcm1QYXRoc1RvSW5mbyIsImdldENvbHVtbnMiLCJtYXAiLCJnZXRQcm9wZXJ0eUtleSIsImlnbm9yZWRGaWVsZHMiLCJpZ25vcmVkRmllbGQiLCJkZWxldGUiLCJwcm9wZXJ0aWVzUGF0aHMiLCJBcnJheSIsImZyb20iLCJjb2x1bW5JbmZvcyIsInByb3BlcnR5UGF0aCIsImNvbHVtbkluZm8iLCJnZXRGaWVsZEluZm8iLCJlbnRpdHlQYXRoIiwiZ2V0TWV0YVBhdGgiLCJlbnRpdHlTZXREYXRhTW9kZWwiLCJyZWxhdGVkQ29sdW1uSW5mbyIsImZpbmQiLCJmaWVsZEluZm8iLCJhbm5vdGF0aW9uUGF0aCIsInByb3BlcnR5RGF0YU1vZGVsIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJjb252ZXJ0ZWRBbm5vdGF0aW9uIiwiY29udmVydE1ldGFNb2RlbENvbnRleHQiLCJ0YXJnZXRQcm9wZXJ0eSIsImdldENvbXBsaWFudFByb3BlcnR5IiwiZW50aXR5UHJvcGVydGllcyIsImtleSIsInRhcmdldE9iamVjdCIsImlzUHJvcGVydHkiLCJJc0ltYWdlVVJMIiwiaXNEYXRhRmllbGRUeXBlcyIsImhhc093blByb3BlcnR5IiwiVmFsdWUiLCIkdGFyZ2V0IiwidW5pdFByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSIsImlzTXVsdGlWYWx1ZUZpZWxkIiwiaGFzVmFsdWVIZWxwIiwiQ29tbW9uIiwiVmFsdWVMaXN0UmVsZXZhbnRRdWFsaWZpZXJzIiwiaXNIaWRkZW5Gb3JDb250ZXh0cyIsImV4cEJpbmRpbmciLCJhbnlPYmplY3QiLCJfanN4IiwiQW55IiwiYW55Qm9vbGVhbiIsInNldE1vZGVsIiwiaXNIaWRkZW4iLCJjb250ZXh0Iiwic2V0QmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nIiwiZ2V0RXh0ZXJuYWxWYWx1ZSIsImRlc3Ryb3kiLCJ1cGRhdGFibGVDb250ZXh0UHJvcGVydHkiLCJnZXRGaWVsZFByb3BlcnRpZXMiLCJkZWVwQ2xvbmUiLCJmaWVsZHNJbmZvIiwiZGF0YVByb3BlcnR5UGF0aCIsImdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgiLCJ1bml0T3JDdXJyZW5jeVByb3BlcnR5UGF0aCIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoIiwiaW5wdXRUeXBlIiwiZ2V0SW5wdXRUeXBlIiwiZ2V0UmVsYXRpdmVQYXRocyIsImZpZWxkRGF0YSIsInZpc2liaWxpdHlCaW5kaW5ncyIsImlzVmlzaWJsZSIsImVkaXRNb2RlIiwiZ2V0RWRpdE1vZGUiLCJjb25zdGFudCIsIkxhYmVsIiwiaXNGaWVsZFJlcXVpcmVkIiwiZ2V0UmVxdWlyZWRFeHByZXNzaW9uIiwiZGVzY3JpcHRpb25QYXRoIiwiZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgiLCJ0ZXh0QmluZGluZyIsImV4cHJlc3Npb24iLCJnZXRUZXh0QmluZGluZyIsImRpc3BsYXlNb2RlIiwiZ2V0RGlzcGxheU1vZGUiLCJJc1RpbWV6b25lIiwicmVhZE9ubHlFeHByZXNzaW9uIiwiaXNSZWFkT25seUV4cHJlc3Npb24iLCJjbGVhcmFibGUiLCJpc1Byb3BlcnR5Q2xlYXJhYmxlIiwiZW1wdHlWYWx1ZSIsImdldEVtcHR5VmFsdWVGb3JQcm9wZXJ0eSIsInNlbGVjdEl0ZW1zIiwiZ2V0RGF0YUZvck9wZW5pbmdEaWFsb2ciLCJhbGwiLCJpc0ZpZWxkVmlzaWJsZSIsInJ1bnRpbWVTZWxlY3Rpb24iLCJnZXRSdW50aW1lU2VsZWN0aW9uIiwiZ2V0RGVmYXVsdFNlbGVjdE9wdGlvbnMiLCJnZW5lcmF0ZUZpZWxkc1Byb3BlcnRpZXMiLCJnZW5lcmF0ZUVudGl0eUZpZWxkc1Byb3BlcnRpZXMiLCJtaXNzaW5nQ29udGV4dHMiLCJiaW5kaW5nc1RvRmV0Y2giLCJjb25jYXQiLCJwYXRoSW5Nb2RlbCIsImdldE1pc3NpbmdEYXRhIiwiYmluZGluZ3NUb1Jlc29sdmUiLCJiaW5kaW5ncyIsImdldFZpZXdEYXRhIiwiY29udmVydGVyVHlwZSIsImRpc3BsYXllZFByb3BlcnRpZXMiLCJldmVyeSIsInByb21pc2VzIiwiY29udHJvbHMiLCJtb2RlbCIsImJpbmRpbmciLCJmaWx0ZXIiLCJzdGFydHNXaXRoIiwicGFyYW1ldGVycyIsImJpbmRpbmdUeXBlIiwiY29udHJvbEJpbmRpbmciLCJzZXRCaW5kaW5nTW9kZSIsIkJpbmRpbmdNb2RlIiwiT25lVGltZSIsImlzQSIsImdldEJpbmRpbmdzIiwibmVzdGVkQmluZGluZyIsInJlcXVlc3RWYWx1ZSIsInByb21pc2UiLCJwcm9wZXJ0eSIsIm51bGxhYmxlIiwiYW55IiwiZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbiIsInZhbHVlIiwiZ2V0QmluZGluZ0luZm8iLCJnZXRUeXBlIiwicGFyc2VWYWx1ZSIsImRpc3RpbmN0TWFwIiwic2VsZWN0T3B0aW9ucyIsImFueVRleHQiLCJzZWxlY3RlZENvbnRleHQiLCJwcm9wZXJ0eVRleHQiLCJoYXMiLCJhZGQiLCJ0ZXh0IiwidW5pdE9yQ3VycmVuY3lWYWx1ZSIsImdldE9iamVjdCIsInByb3BlcnR5VmFsdWUiLCJrZWVwRW50cnkiLCJTcGVjaWZpY1NlbGVjdEtleXMiLCJLZWVwS2V5IiwiZGVmYXVsdE9wdGlvbnMiLCJSZXBsYWNlS2V5IiwiQ2xlYXJGaWVsZFZhbHVlS2V5IiwiZ2V0RmllbGRFZGl0YWJsZSIsIkZpZWxkRWRpdE1vZGUiLCJFZGl0YWJsZSIsIk9iamVjdCIsImtleXMiLCJhbnlDb250cm9sIiwiZGF0YUZpZWxkQ29udmVydGVkIiwiZGF0YU1vZGVsUGF0aCIsImVkaXRTdHlsZVByb3BlcnRpZXMiLCJzZXRFZGl0U3R5bGVQcm9wZXJ0aWVzIiwiZWRpdFN0eWxlIiwiaXNTdGF0aWNFZGl0TW9kZSIsImlzRWRpdGFibGUiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIk1hc3NFZGl0RGlhbG9nSGVscGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFByaW1pdGl2ZVR5cGUsIFByb3BlcnR5LCBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBEYXRhRmllbGQsIERhdGFGaWVsZEZvckFjdGlvbiwgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiwgSGVhZGVySW5mbyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBkZWVwQ2xvbmUgZnJvbSBcInNhcC9iYXNlL3V0aWwvZGVlcENsb25lXCI7XG5pbXBvcnQgdHlwZSB7IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQge1xuXHRjb21waWxlRXhwcmVzc2lvbixcblx0Y29uc3RhbnQsXG5cdGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24sXG5cdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbixcblx0cGF0aEluTW9kZWxcbn0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgVGVtcGxhdGVDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL1RlbXBsYXRlQ29tcG9uZW50XCI7XG5pbXBvcnQgQW55IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9scy9BbnlcIjtcbmltcG9ydCB7IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0LCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGlzRGF0YUZpZWxkVHlwZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9hbm5vdGF0aW9ucy9EYXRhRmllbGRcIjtcbmltcG9ydCB0eXBlIHsgTWFzc0VkaXRUYWJsZUNvbmZpZ3VyYXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vVGFibGVcIjtcbmltcG9ydCB0eXBlIHsgQW5ub3RhdGlvblRhYmxlQ29sdW1uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL3RhYmxlL0NvbHVtbnNcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgUmVzb3VyY2VNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBpc1Byb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgZW5oYW5jZURhdGFNb2RlbFBhdGgsIGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgsIGdldFJlbGF0aXZlUGF0aHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBnZXREaXNwbGF5TW9kZSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0Rpc3BsYXlNb2RlRm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBpc1JlYWRPbmx5RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0ZpZWxkQ29udHJvbEhlbHBlclwiO1xuaW1wb3J0IHtcblx0Z2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoLFxuXHRnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aCxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgsXG5cdGhhc1ZhbHVlSGVscFxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0RWRpdE1vZGUsIGdldFJlcXVpcmVkRXhwcmVzc2lvbiwgaXNNdWx0aVZhbHVlRmllbGQsIGlzVmlzaWJsZSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IHsgZ2V0VGV4dEJpbmRpbmcsIHNldEVkaXRTdHlsZVByb3BlcnRpZXMgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWVsZC9GaWVsZFRlbXBsYXRpbmdcIjtcbmltcG9ydCB0eXBlIHsgRmllbGRCbG9ja1Byb3BlcnRpZXMgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC9maWVsZC9GaWVsZFN0cnVjdHVyZUhlbHBlclwiO1xuaW1wb3J0IHR5cGUgVGFibGVBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVBUElcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgRmllbGRFZGl0TW9kZSBmcm9tIFwic2FwL3VpL21kYy9lbnVtcy9GaWVsZEVkaXRNb2RlXCI7XG5pbXBvcnQgQmluZGluZ01vZGUgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nTW9kZVwiO1xuaW1wb3J0IHR5cGUgQ29tcG9zaXRlQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0NvbXBvc2l0ZUJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIFByb3BlcnR5QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL1Byb3BlcnR5QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFQcm9wZXJ0eUJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YVByb3BlcnR5QmluZGluZ1wiO1xuaW1wb3J0IE1hc3NFZGl0RGlhbG9nIGZyb20gXCIuL01hc3NFZGl0RGlhbG9nXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdJbmZvLCBNYXNzRmllbGRQcm9wZXJ0aWVzLCBTZWxlY3RJbmZvIH0gZnJvbSBcIi4vbGlicmFyeVwiO1xuaW1wb3J0IHsgU3BlY2lmaWNTZWxlY3RLZXlzIH0gZnJvbSBcIi4vbGlicmFyeVwiO1xuXG50eXBlIERhdGFGaWVsZFR5cGVzID0gRGF0YUZpZWxkIHwgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiB8IERhdGFGaWVsZEZvckFjdGlvbjtcbnR5cGUgRmllbGRJbmZvID0ge1xuXHRrZXk6IHN0cmluZztcblx0cHJvcGVydHlEYXRhTW9kZWw6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+O1xuXHR0YXJnZXRQcm9wZXJ0eTogUHJvcGVydHk7XG5cdGxhYmVsOiBzdHJpbmc7XG5cdGNvbnZlcnRlZEFubm90YXRpb246IERhdGFGaWVsZFR5cGVzO1xufTtcblxudHlwZSBCaW5kaW5nVG9GZXRjaCA9IEJpbmRpbmdJbmZvICYgeyBjb250ZXh0cz86IE9EYXRhVjRDb250ZXh0W10gfTtcblxuLyoqXG4gKiBEaXNwbGF5IHRoZSBtYXNzRWRpdCBkaWFsb2cuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hc3NFZGl0RGlhbG9nSGVscGVyIHtcblx0cHJpdmF0ZSByZWFkb25seSB0YWJsZTogVGFibGU7XG5cblx0cHJpdmF0ZSByZWFkb25seSBvbkNvbnRleHRNZW51OiBib29sZWFuO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgb25EaWFsb2dDbG9zZTogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgdmlldzogRkVWaWV3O1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgbWF4QW5hbHl6ZWRSb3dzID0gMzA7XG5cblx0cHJpdmF0ZSBjb250ZXh0czogT0RhdGFWNENvbnRleHRbXTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGFuYWx5emVkQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10gPSBbXTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGRlZ3JhZGVkTW9kZTogYm9vbGVhbjtcblxuXHRwcml2YXRlIHJlYWRvbmx5IG1hbmlmZXN0U2V0dGluZ3M6IE1hc3NFZGl0VGFibGVDb25maWd1cmF0aW9uO1xuXG5cdHByaXZhdGUgZmllbGRQcm9wZXJ0aWVzOiBNYXNzRmllbGRQcm9wZXJ0aWVzW10gPSBbXTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGlzQWRhcHRhdGlvbjogYm9vbGVhbjtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGhlYWRlckluZm86IEhlYWRlckluZm8gfCB1bmRlZmluZWQ7XG5cblx0bWFzc0VkaXREaWFsb2c6IE1hc3NFZGl0RGlhbG9nIHwgdW5kZWZpbmVkO1xuXG5cdGNvbnN0cnVjdG9yKHByb3BzOiB7IHRhYmxlOiBUYWJsZTsgb25Db250ZXh0TWVudTogYm9vbGVhbjsgb25DbG9zZT86ICgpID0+IHZvaWQgfSkge1xuXHRcdGNvbnN0IGVudGl0eVR5cGVQYXRoID0gKHByb3BzLnRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJKS5nZXRUYWJsZURlZmluaXRpb24oKS5hbm5vdGF0aW9uLmNvbGxlY3Rpb24sXG5cdFx0XHRtZXRhTW9kZWwgPSAocHJvcHMudGFibGUuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5nZXRNZXRhTW9kZWwoKTtcblxuXHRcdHRoaXMudGFibGUgPSBwcm9wcy50YWJsZTtcblx0XHR0aGlzLm1hbmlmZXN0U2V0dGluZ3MgPSAodGhpcy50YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuZ2V0VGFibGVEZWZpbml0aW9uKCkuY29udHJvbC5tYXNzRWRpdDtcblx0XHR0aGlzLm9uQ29udGV4dE1lbnUgPSBwcm9wcy5vbkNvbnRleHRNZW51O1xuXHRcdHRoaXMub25EaWFsb2dDbG9zZSA9IHByb3BzLm9uQ2xvc2U7XG5cdFx0dGhpcy52aWV3ID0gQ29tbW9uVXRpbHMuZ2V0VGFyZ2V0Vmlldyh0aGlzLnRhYmxlKTtcblx0XHR0aGlzLmNvbnRleHRzID0gdGhpcy5mZXRjaENvbnRleHRzRm9yRWRpdCgpO1xuXHRcdHRoaXMuZGVncmFkZWRNb2RlID0gdGhpcy5jb250ZXh0cy5sZW5ndGggPiB0aGlzLm1heEFuYWx5emVkUm93cztcblx0XHR0aGlzLmFuYWx5emVkQ29udGV4dHMgPSB0aGlzLmRlZ3JhZGVkTW9kZSA/IHRoaXMuY29udGV4dHMuc2xpY2UoMCwgdGhpcy5tYXhBbmFseXplZFJvd3MpIDogdGhpcy5jb250ZXh0cztcblx0XHR0aGlzLmlzQWRhcHRhdGlvbiA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLnRhYmxlKS5pc0FkYXB0YXRpb25Nb2RlKCk7XG5cdFx0dGhpcy5oZWFkZXJJbmZvID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRDb250ZXh0KGVudGl0eVR5cGVQYXRoKSkudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5VST8uSGVhZGVySW5mbztcblx0fVxuXG5cdC8qKlxuXHQgKiBPcGVucyB0aGUgbWFzcyBlZGl0IGRpYWxvZyBpZiBhbGwgc2VsZWN0ZWQgY29udGV4dHMgYXJlIGVkaXRhYmxlLFxuXHQgKiBvdGhlcndpc2UgYSBtZXNzYWdlIGJveCB0byBjb25maXJtIHRoZSBzZWxlY3Rpb24uXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uIG9wZW4gb2YgdGhlIG1hc3MgZWRpdCBkaWFsb2cuXG5cdCAqL1xuXHRhc3luYyBvcGVuKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB0ZW1wbGF0ZUNvbXBvbmVudCA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcih0aGlzLnZpZXcpIGFzIFRlbXBsYXRlQ29tcG9uZW50O1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLnRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdGludGVybmFsTW9kZWxQcm9wZXJ0eSA9ICF0aGlzLm9uQ29udGV4dE1lbnUgPyBcIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1wiIDogXCJjb250ZXh0bWVudS9udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcIixcblx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cyA9IGludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGludGVybmFsTW9kZWxQcm9wZXJ0eSkgfHwgMDtcblx0XHRcdHRoaXMuZmllbGRQcm9wZXJ0aWVzID0gYXdhaXQgdGhpcy5nZXRGaWVsZHNQcm9wZXJ0aWVzRnJvbUluZm8odGhpcy5nZXRGaWVsZHNJbmZvKCkpO1xuXHRcdFx0aWYgKCF0aGlzLmlzQWRhcHRhdGlvbikge1xuXHRcdFx0XHQvLyBubyBmaWVsZCB0byBlZGl0XG5cdFx0XHRcdGlmICghdGhpcy5maWVsZFByb3BlcnRpZXMuc29tZSgoZmllbGQpID0+IGZpZWxkLnZpc2libGUpKSB7XG5cdFx0XHRcdFx0dGhpcy5ub0ZpZWxkSW5mb3JtYXRpb24oKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly9Tb21lIHJvd3MgYXJlIG5vdCBlZGl0YWJsZSAtPiBkbyB3ZSB3YW50IHRvIGNvbnRpbnVlP1xuXHRcdFx0XHRpZiAodGhpcy5jb250ZXh0cy5sZW5ndGggIT09IHNlbGVjdGVkQ29udGV4dHMpIHtcblx0XHRcdFx0XHR0aGlzLmNvbnRleHRzID0gYXdhaXQgdGhpcy5jb25maXJtU2VsZWN0aW9uKHRoaXMuY29udGV4dHMsIHNlbGVjdGVkQ29udGV4dHMpO1xuXHRcdFx0XHRcdGlmICghdGhpcy5jb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdC8vIHRoZSB1c2VyIGRvZXNuJ3Qgd2FudCB0byBjb250aW51ZVxuXHRcdFx0XHRcdFx0dGhpcy5vbkRpYWxvZ0Nsb3NlPy4oKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGF3YWl0IHRlbXBsYXRlQ29tcG9uZW50LnJ1bkFzT3duZXIoYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHR0aGlzLm1hc3NFZGl0RGlhbG9nID0gbmV3IE1hc3NFZGl0RGlhbG9nKHtcblx0XHRcdFx0XHR0YWJsZTogdGhpcy50YWJsZSxcblx0XHRcdFx0XHRjb250ZXh0czogdGhpcy5jb250ZXh0cyxcblx0XHRcdFx0XHRmaWVsZFByb3BlcnRpZXM6IHRoaXMuZmllbGRQcm9wZXJ0aWVzXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRjb25zdCBkaWFsb2cgPSBhd2FpdCB0aGlzLm1hc3NFZGl0RGlhbG9nLmNyZWF0ZSgpO1xuXHRcdFx0XHRkaWFsb2cuYXR0YWNoQmVmb3JlQ2xvc2UoKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMub25EaWFsb2dDbG9zZT8uKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRkaWFsb2cub3BlbigpO1xuXHRcdFx0XHRjb25zdCByZXF1aXJlZERhdGFQcm9taXNlID0gdGhpcy5tYXNzRWRpdERpYWxvZy5nZXRSZXF1aXJlZERhdGFQcm9taXNlKCk7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5nZXREYXRhQWZ0ZXJPcGVuaW5nRGlhbG9nKHRoaXMuZmllbGRQcm9wZXJ0aWVzKTtcblx0XHRcdFx0XHRyZXF1aXJlZERhdGFQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJNYXNzIEVkaXQ6IFNvbWV0aGluZyB3ZW50IHdyb25nIGluIG1hc3MgZWRpdCBkaWFsb2cgdG8gZ2V0IHJlcXVpcmVkIGRhdGEuXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0cmVxdWlyZWREYXRhUHJvbWlzZS5yZWplY3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIk1hc3MgRWRpdDogU29tZXRoaW5nIHdlbnQgd3JvbmcgaW4gbWFzcyBlZGl0IGRpYWxvZyBjcmVhdGlvbi5cIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogT3BlbnMgdGhlIG1lc3NhZ2UgYm94IHRvIG5vdGlmeSBubyBmaWVsZHMgYXJlIGVkaXRhYmxlLlxuXHQgKi9cblx0cHJpdmF0ZSBub0ZpZWxkSW5mb3JtYXRpb24oKTogdm9pZCB7XG5cdFx0Y29uc3QgdmlzaWJsZUZpZWxkc0Zyb21NYW5pZmVzdCA9ICh0aGlzLnRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJKS5nZXRUYWJsZURlZmluaXRpb24oKS5jb250cm9sLm1hc3NFZGl0LnZpc2libGVGaWVsZHM7XG5cdFx0Y29uc3QgcmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLm1hY3Jvc1wiKSBhcyBSZXNvdXJjZUJ1bmRsZTtcblx0XHRsZXQgbWVzc2FnZSA9IFwiXCIsXG5cdFx0XHRtZXNzYWdlRGV0YWlsO1xuXHRcdGlmICh2aXNpYmxlRmllbGRzRnJvbU1hbmlmZXN0Lmxlbmd0aCA+IDApIHtcblx0XHRcdG1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfTk9fRURJVEFCTEVfRklFTERTX1dJVEhfTUFOSUZFU1RcIiwgW1xuXHRcdFx0XHR0aGlzLmdldFJlc291cmNlVGV4dCh0aGlzLmhlYWRlckluZm8/LlR5cGVOYW1lKSA/PyByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfRElBTE9HX0RFRkFVTFRfVFlQRU5BTUVcIilcblx0XHRcdF0pO1xuXHRcdFx0bWVzc2FnZURldGFpbCA9IGA8dWw+XG5cdFx0XHQke3RoaXMuZmllbGRQcm9wZXJ0aWVzXG5cdFx0XHRcdC5yZWR1Y2UoKGZpZWxkczogc3RyaW5nW10sIGZpZWxkUHJvcGVydHkpID0+IHtcblx0XHRcdFx0XHRpZiAodmlzaWJsZUZpZWxkc0Zyb21NYW5pZmVzdC5pbmNsdWRlcyhmaWVsZFByb3BlcnR5LnByb3BlcnR5SW5mby5yZWxhdGl2ZVBhdGgpKSB7XG5cdFx0XHRcdFx0XHRmaWVsZHMucHVzaChgPGxpPiR7ZmllbGRQcm9wZXJ0eS5sYWJlbH08L2xpPmApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gZmllbGRzO1xuXHRcdFx0XHR9LCBbXSlcblx0XHRcdFx0LmpvaW4oXCJcIil9IDwvdWw+YDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9OT19FRElUQUJMRV9GSUVMRFNfREVGQVVMVFwiKTtcblx0XHR9XG5cblx0XHRNZXNzYWdlQm94LmluZm9ybWF0aW9uKG1lc3NhZ2UsIHtcblx0XHRcdGRldGFpbHM6IG1lc3NhZ2VEZXRhaWwsXG5cdFx0XHRvbkNsb3NlOiAoKSA9PiB7XG5cdFx0XHRcdHRoaXMub25EaWFsb2dDbG9zZT8uKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogT3BlbnMgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2cgdG8gdmFsaWRhdGUgdGhlIHNlbGVjdGVkIGNvbnRleHRzLlxuXHQgKiBAcGFyYW0gY29udGV4dHMgVGhlIGNvbnRleHRzIHNldCBhcyB1cGRhdGFibGVcblx0ICogQHBhcmFtIHNlbGVjdGVkQ29udGV4dHMgIFRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgY29udGV4dHNcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdGhlIGNvbnRleHRzIHRvIGJlIGZpbmFsbHkgbWFuYWdlZC5cblx0ICovXG5cdHByaXZhdGUgYXN5bmMgY29uZmlybVNlbGVjdGlvbihjb250ZXh0czogT0RhdGFWNENvbnRleHRbXSwgc2VsZWN0ZWRDb250ZXh0czogbnVtYmVyKTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dFtdPiB7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IFJlc291cmNlTW9kZWxIZWxwZXIuZ2V0UmVzb3VyY2VNb2RlbCh0aGlzLnRhYmxlKTtcblx0XHRjb25zdCBjb3JlUmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikgYXMgUmVzb3VyY2VCdW5kbGU7XG5cblx0XHRjb25zdCB1cGRhdGFibGVDb250ZXh0cyA9IGNvbnRleHRzLmxlbmd0aDtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHRhYmxlQVBJID0gdGhpcy50YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSTtcblx0XHRcdFx0Y29uc3QgZWRpdEJ1dHRvbiA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfTUFTU19FRElUX0NPTkZJUk1fQlVUVE9OX1RFWFRcIiksXG5cdFx0XHRcdFx0Y2FuY2VsQnV0dG9uID0gY29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9DQU5DRUxcIiksXG5cdFx0XHRcdFx0bWV0YU1vZGVsID0gKHRoaXMudGFibGUuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHR0eXBlTmFtZSA9XG5cdFx0XHRcdFx0XHR0aGlzLmdldFJlc291cmNlVGV4dCh0aGlzLmhlYWRlckluZm8/LlR5cGVOYW1lKSA/PyByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX01BU1NfRURJVF9ESUFMT0dfREVGQVVMVF9UWVBFTkFNRVwiKSxcblx0XHRcdFx0XHR0eXBlTmFtZVBsdXJhbCA9XG5cdFx0XHRcdFx0XHR0aGlzLmdldFJlc291cmNlVGV4dCh0aGlzLmhlYWRlckluZm8/LlR5cGVOYW1lUGx1cmFsKSA/P1xuXHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19NQVNTX0VESVRfRElBTE9HX0RFRkFVTFRfVFlQRU5BTUVfUExVUkFMXCIpLFxuXHRcdFx0XHRcdG1lc3NhZ2VEZXRhaWwgPVxuXHRcdFx0XHRcdFx0TW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwsIHRoaXMudGFibGUuZGF0YShcInRhcmdldENvbGxlY3Rpb25QYXRoXCIpKSAmJiB0YWJsZUFQSS5yZWFkT25seVxuXHRcdFx0XHRcdFx0XHQ/IHRoaXMuZ2V0TWVzc2FnZURldGFpbEZvck5vbkVkaXRhYmxlKHR5cGVOYW1lLCB0eXBlTmFtZVBsdXJhbClcblx0XHRcdFx0XHRcdFx0OiBcIlwiO1xuXG5cdFx0XHRcdE1lc3NhZ2VCb3gud2FybmluZyhcblx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX01BU1NfRURJVF9DT05GSVJNX01FU1NBR0VcIiwgW1xuXHRcdFx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cyAtIHVwZGF0YWJsZUNvbnRleHRzLFxuXHRcdFx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cyxcblx0XHRcdFx0XHRcdHVwZGF0YWJsZUNvbnRleHRzLFxuXHRcdFx0XHRcdFx0dHlwZU5hbWVQbHVyYWxcblx0XHRcdFx0XHRdKSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRkZXRhaWxzOiBtZXNzYWdlRGV0YWlsLFxuXHRcdFx0XHRcdFx0YWN0aW9uczogW2VkaXRCdXR0b24sIGNhbmNlbEJ1dHRvbl0sXG5cdFx0XHRcdFx0XHRlbXBoYXNpemVkQWN0aW9uOiBlZGl0QnV0dG9uLFxuXHRcdFx0XHRcdFx0b25DbG9zZTogZnVuY3Rpb24gKHNlbGVjdGlvbjogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoc2VsZWN0aW9uID09PSBlZGl0QnV0dG9uID8gY29udGV4dHMgOiBbXSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0TG9nLmVycm9yKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgdGV4dCBhY2NvcmRpbmcgdG8gYW4gYW5ub3RhdGlvbi5cblx0ICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb25cblx0ICogQHJldHVybnMgVGhlIHRleHQuXG5cdCAqL1xuXHRwcml2YXRlIGdldFJlc291cmNlVGV4dChhbm5vdGF0aW9uOiBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZTxTdHJpbmc+IHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoIWFubm90YXRpb24pIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dEZyb21FeHBCaW5kaW5nU3RyaW5nKFxuXHRcdFx0Y29tcGlsZUV4cHJlc3Npb24oZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKGFubm90YXRpb24pKSBhcyBzdHJpbmcsXG5cdFx0XHR0aGlzLnZpZXdcblx0XHQpPy50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIG1lc3NhZ2UgZGV0YWlsIG9mIHRoZSBjb25maXJtYXRpb24gZGlhbG9nLlxuXHQgKiBAcGFyYW0gdHlwZU5hbWUgVGhlIHR5cGUgbmFtZSBvZiB0aGUgZW50aXR5IHNldFxuXHQgKiBAcGFyYW0gdHlwZU5hbWVQbHVyYWwgVGhlIHR5cGUgbmFtZSBwbHVyYWwgb2YgdGhlIGVudGl0eSBzZXRcblx0ICogQHJldHVybnMgVGhlIHRleHQuXG5cdCAqL1xuXHRwcml2YXRlIGdldE1lc3NhZ2VEZXRhaWxGb3JOb25FZGl0YWJsZSh0eXBlTmFtZTogc3RyaW5nLCB0eXBlTmFtZVBsdXJhbDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUubWFjcm9zXCIpIGFzIFJlc291cmNlQnVuZGxlO1xuXHRcdHJldHVybiBgPHA+PHN0cm9uZz4ke3Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9DT05GSVJNX01FU1NBR0VfREVUQUlMX0hFQURFUlwiKX08L3N0cm9uZz48L3A+XFxuXG5cdFx0XHQ8cD4ke3Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9DT05GSVJNX01FU1NBR0VfREVUQUlMX1JFQVNPTlwiLCBbdHlwZU5hbWVQbHVyYWxdKX08L3A+XFxuXG5cdFx0XHQ8dWw+XG5cdFx0XHRcdDxsaT4ke3Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9DT05GSVJNX01FU1NBR0VfREVUQUlMX1JFQVNPTl9EUkFGVFwiLCBbdHlwZU5hbWVdKX08L2xpPlxuXHRcdFx0XHQ8bGk+JHtyZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfQ09ORklSTV9NRVNTQUdFX0RFVEFJTF9SRUFTT05fTk9OX0VESVRBQkxFXCIsIFt0eXBlTmFtZV0pfTwvbGk+XG5cdFx0XHQ8L3VsPmA7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZW50aXR5IHdoaWNoIGlzIGNvbXBsaWFudCBmb3IgYSBNYXNzIEVkaXQuXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIHRoZSBmaWVsZCBpbmZvcm1hdGlvbi5cblx0ICovXG5cblx0cHJpdmF0ZSBnZXRFbnRpdHlGaWVsZHNJbmZvKCk6IEZpZWxkSW5mb1tdIHtcblx0XHRjb25zdCB0YWJsZUFQSSA9IHRoaXMudGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0Y29uc3QgY29sdW1uc0RhdGEgPSB0YWJsZUFQSS5nZXRUYWJsZURlZmluaXRpb24oKS5jb2x1bW5zO1xuXG5cdFx0Y29uc3QgcHJvcGVydGllc0tleXMgPSBuZXcgU2V0KFxuXHRcdFx0Y29sdW1uc0RhdGEucmVkdWNlKChmaWVsZHM6IHN0cmluZ1tdLCBjb2x1bW4pID0+IHtcblx0XHRcdFx0aWYgKGNvbHVtbi50eXBlID09PSBcIkFubm90YXRpb25cIikge1xuXHRcdFx0XHRcdGZpZWxkcy5wdXNoKGNvbHVtbi5uYW1lKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmllbGRzO1xuXHRcdFx0fSwgW10pXG5cdFx0KTtcblx0XHRyZXR1cm4gdGhpcy50cmFuc2Zvcm1QYXRoc1RvSW5mbyhwcm9wZXJ0aWVzS2V5cyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvcGVydGllcyBvZiB0aGUgdGFibGUgd2hpY2ggYXJlIGNvbXBsaWFudCBmb3IgYSBNYXNzIEVkaXQuXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIHRoZSBmaWVsZCBpbmZvcm1hdGlvbi5cblx0ICovXG5cdHByaXZhdGUgZ2V0RmllbGRzSW5mbygpOiBGaWVsZEluZm9bXSB7XG5cdFx0Y29uc3QgcHJvcGVydGllc0tleXMgPVxuXHRcdFx0dGhpcy5tYW5pZmVzdFNldHRpbmdzLnZpc2libGVGaWVsZHMubGVuZ3RoID4gMFxuXHRcdFx0XHQ/IG5ldyBTZXQodGhpcy5tYW5pZmVzdFNldHRpbmdzLnZpc2libGVGaWVsZHMpXG5cdFx0XHRcdDogbmV3IFNldCh0aGlzLnRhYmxlLmdldENvbHVtbnMoKS5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmdldFByb3BlcnR5S2V5KCkpKTtcblxuXHRcdGlmICh0aGlzLm1hbmlmZXN0U2V0dGluZ3MuaWdub3JlZEZpZWxkcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGlnbm9yZWRGaWVsZCBvZiB0aGlzLm1hbmlmZXN0U2V0dGluZ3MuaWdub3JlZEZpZWxkcykge1xuXHRcdFx0XHRwcm9wZXJ0aWVzS2V5cy5kZWxldGUoaWdub3JlZEZpZWxkKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNmb3JtUGF0aHNUb0luZm8ocHJvcGVydGllc0tleXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRyYW5zZm9ybXMgYSBzZXQgb2YgcHJvcGVydHkgcGF0aHMgdG8gYW4gYXJyYXkgb2YgZmllbGQgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwcm9wZXJ0aWVzUGF0aHMgVGhlIHNldCBvZiBwcm9wZXJ0eSBwYXRoc1xuXHQgKiBAcmV0dXJucyBBcnJheSBvZiB0aGUgZmllbGQgaW5mb3JtYXRpb24uXG5cdCAqL1xuXHRwcml2YXRlIHRyYW5zZm9ybVBhdGhzVG9JbmZvKHByb3BlcnRpZXNQYXRoczogU2V0PHN0cmluZz4pOiBGaWVsZEluZm9bXSB7XG5cdFx0cmV0dXJuIEFycmF5LmZyb20ocHJvcGVydGllc1BhdGhzKS5yZWR1Y2UoKGNvbHVtbkluZm9zOiBGaWVsZEluZm9bXSwgcHJvcGVydHlQYXRoKSA9PiB7XG5cdFx0XHRjb25zdCBjb2x1bW5JbmZvID0gdGhpcy5nZXRGaWVsZEluZm8ocHJvcGVydHlQYXRoKTtcblx0XHRcdGlmIChjb2x1bW5JbmZvKSB7XG5cdFx0XHRcdGNvbHVtbkluZm9zLnB1c2goY29sdW1uSW5mbyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY29sdW1uSW5mb3M7XG5cdFx0fSwgW10pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcm9wZXJ0eS5cblx0ICogQHBhcmFtIHByb3BlcnR5UGF0aFxuXHQgKiBAcmV0dXJucyBGaWVsZCBpbmZvcm1hdGlvbi5cblx0ICovXG5cdHByaXZhdGUgZ2V0RmllbGRJbmZvKHByb3BlcnR5UGF0aDogc3RyaW5nKTogRmllbGRJbmZvIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBjb2x1bW5zRGF0YSA9ICh0aGlzLnRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJKS5nZXRUYWJsZURlZmluaXRpb24oKS5jb2x1bW5zO1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9ICh0aGlzLnRhYmxlLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgZW50aXR5UGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aCh0aGlzLnRhYmxlLmRhdGEoXCJtZXRhUGF0aFwiKSk7XG5cdFx0Y29uc3QgZW50aXR5U2V0RGF0YU1vZGVsID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRDb250ZXh0KGVudGl0eVBhdGgpKTtcblx0XHRjb25zdCByZWxhdGVkQ29sdW1uSW5mbyA9IGNvbHVtbnNEYXRhLmZpbmQoKGZpZWxkSW5mbykgPT4gZmllbGRJbmZvLm5hbWUgPT09IHByb3BlcnR5UGF0aCAmJiBmaWVsZEluZm8udHlwZSA9PT0gXCJBbm5vdGF0aW9uXCIpO1xuXHRcdGlmIChyZWxhdGVkQ29sdW1uSW5mbykge1xuXHRcdFx0Y29uc3QgYW5ub3RhdGlvblBhdGggPSAocmVsYXRlZENvbHVtbkluZm8gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uKS5hbm5vdGF0aW9uUGF0aDtcblx0XHRcdGlmIChhbm5vdGF0aW9uUGF0aCAmJiBwcm9wZXJ0eVBhdGgpIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlEYXRhTW9kZWwgPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQcm9wZXJ0eT4oZW50aXR5U2V0RGF0YU1vZGVsLCBwcm9wZXJ0eVBhdGgpO1xuXHRcdFx0XHRjb25zdCBjb252ZXJ0ZWRBbm5vdGF0aW9uID0gY29udmVydE1ldGFNb2RlbENvbnRleHQobWV0YU1vZGVsLmdldENvbnRleHQoYW5ub3RhdGlvblBhdGgpKSBhc1xuXHRcdFx0XHRcdHwgRGF0YUZpZWxkXG5cdFx0XHRcdFx0fCBEYXRhRmllbGRGb3JBbm5vdGF0aW9uXG5cdFx0XHRcdFx0fCBEYXRhRmllbGRGb3JBY3Rpb247XG5cdFx0XHRcdGNvbnN0IHRhcmdldFByb3BlcnR5ID0gdGhpcy5nZXRDb21wbGlhbnRQcm9wZXJ0eShwcm9wZXJ0eURhdGFNb2RlbCwgY29udmVydGVkQW5ub3RhdGlvbik7XG5cdFx0XHRcdGlmICh0YXJnZXRQcm9wZXJ0eSAmJiBlbnRpdHlTZXREYXRhTW9kZWwudGFyZ2V0RW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmluY2x1ZGVzKHRhcmdldFByb3BlcnR5KSlcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0a2V5OiByZWxhdGVkQ29sdW1uSW5mby5rZXksXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eURhdGFNb2RlbCxcblx0XHRcdFx0XHRcdHRhcmdldFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0bGFiZWw6IHJlbGF0ZWRDb2x1bW5JbmZvLmxhYmVsID8/IHJlbGF0ZWRDb2x1bW5JbmZvLmtleSxcblx0XHRcdFx0XHRcdGNvbnZlcnRlZEFubm90YXRpb25cblx0XHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHByb3BlcnR5IHRvIGRpc3BsYXkgb24gdGhlIERpYWxvZy5cblx0ICogQHBhcmFtIHByb3BlcnR5RGF0YU1vZGVsIFRoZSBkYXRhTW9kZWxPYmplY3RQYXRoIG9mIHRoZSBjb2x1bW5cblx0ICogQHBhcmFtIGFubm90YXRpb24gIFRoZSBjb252ZXJ0ZWQgYW5ub3RhdGlvbiBvZiB0aGUgY29sdW1uXG5cdCAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0eSBpZiBpdCBpcyBjb21wbGlhbnQsIHVuZGVmaW5lZCBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgZ2V0Q29tcGxpYW50UHJvcGVydHkocHJvcGVydHlEYXRhTW9kZWw6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+LCBhbm5vdGF0aW9uOiBEYXRhRmllbGRUeXBlcyk6IFByb3BlcnR5IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCB0YXJnZXRPYmplY3QgPSBwcm9wZXJ0eURhdGFNb2RlbC50YXJnZXRPYmplY3Q7XG5cdFx0bGV0IHRhcmdldFByb3BlcnR5OiBQcm9wZXJ0eTtcblx0XHRpZiAoaXNQcm9wZXJ0eSh0YXJnZXRPYmplY3QpKSB7XG5cdFx0XHR0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldE9iamVjdDtcblx0XHRcdGlmICh0YXJnZXRPYmplY3QuYW5ub3RhdGlvbnMuVUk/LklzSW1hZ2VVUkwpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoaXNEYXRhRmllbGRUeXBlcyhhbm5vdGF0aW9uKSAmJiAhYW5ub3RhdGlvbi5oYXNPd25Qcm9wZXJ0eShcIkFjdGlvblwiKSkge1xuXHRcdFx0dGFyZ2V0UHJvcGVydHkgPSBhbm5vdGF0aW9uLlZhbHVlLiR0YXJnZXQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBDaGVjayBpZiB0aGUgZmllbGQgaXMgY29tcGxpYW50IGZvciB0aGUgTWFzc0VkaXRcblx0XHRjb25zdCB1bml0UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KHRhcmdldFByb3BlcnR5KTtcblx0XHRpZiAoXG5cdFx0XHRpc011bHRpVmFsdWVGaWVsZChwcm9wZXJ0eURhdGFNb2RlbCkgfHxcblx0XHRcdChoYXNWYWx1ZUhlbHAodGFyZ2V0UHJvcGVydHkpICYmIHRhcmdldFByb3BlcnR5LmFubm90YXRpb25zPy5Db21tb24/LlZhbHVlTGlzdFJlbGV2YW50UXVhbGlmaWVycykgfHwgLy8gY29udGV4dCBkZXBlbmRlbnQgVkggaXMgbm90IHN1cHBvcnRlZCBmb3IgTWFzcyBFZGl0LlxuXHRcdFx0KHVuaXRQcm9wZXJ0eSAmJiBoYXNWYWx1ZUhlbHAodW5pdFByb3BlcnR5KSAmJiB1bml0UHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uVmFsdWVMaXN0UmVsZXZhbnRRdWFsaWZpZXJzKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRyZXR1cm4gdGFyZ2V0UHJvcGVydHk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSBmaWVsZCBpcyBoaWRkZW4gZm9yIHRoZSBwcm92aWRlZCBjb250ZXh0cy5cblx0ICogQHBhcmFtIGV4cEJpbmRpbmcgVGhlIGV4cHJlc3Npb24gYmluZGluZyBvZiB0aGUgcHJvcGVydHkuXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGZpZWxkIGlzIGhpZGRlbiBmb3IgYWxsIGNvbnRleHRzLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgaXNIaWRkZW5Gb3JDb250ZXh0cyhleHBCaW5kaW5nOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbik6IGJvb2xlYW4ge1xuXHRcdGlmIChleHBCaW5kaW5nID09PSBcInRydWVcIikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gZWxzZSBpZiAoZXhwQmluZGluZyA9PT0gXCJmYWxzZVwiKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0Y29uc3QgYW55T2JqZWN0ID0gPEFueSBhbnlCb29sZWFuPXtleHBCaW5kaW5nfSAvPjtcblx0XHRhbnlPYmplY3Quc2V0TW9kZWwodGhpcy5hbmFseXplZENvbnRleHRzWzBdLmdldE1vZGVsKCkpO1xuXHRcdGNvbnN0IGlzSGlkZGVuID0gIXRoaXMuYW5hbHl6ZWRDb250ZXh0cy5maW5kKChjb250ZXh0KSA9PiB7XG5cdFx0XHRhbnlPYmplY3Quc2V0QmluZGluZ0NvbnRleHQoY29udGV4dCk7XG5cdFx0XHRyZXR1cm4gKGFueU9iamVjdC5nZXRCaW5kaW5nKFwiYW55Qm9vbGVhblwiKSBhcyBQcm9wZXJ0eUJpbmRpbmcpLmdldEV4dGVybmFsVmFsdWUoKTtcblx0XHR9KTtcblx0XHRhbnlPYmplY3QuZGVzdHJveSgpO1xuXHRcdHJldHVybiBpc0hpZGRlbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBzZWxlY3RlZCBjb250ZXh0IHNldCBhcyB1cGRhdGFibGUuXG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZXh0cy5cblx0ICovXG5cdHByaXZhdGUgZmV0Y2hDb250ZXh0c0ZvckVkaXQoKTogT0RhdGFWNENvbnRleHRbXSB7XG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLnRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIiksXG5cdFx0XHR1cGRhdGFibGVDb250ZXh0UHJvcGVydHkgPSAhdGhpcy5vbkNvbnRleHRNZW51ID8gXCJ1cGRhdGFibGVDb250ZXh0c1wiIDogXCJjb250ZXh0bWVudS91cGRhdGFibGVDb250ZXh0c1wiO1xuXHRcdHJldHVybiBpbnRlcm5hbE1vZGVsQ29udGV4dD8uZ2V0UHJvcGVydHkodXBkYXRhYmxlQ29udGV4dFByb3BlcnR5KSA/PyBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBtYXNzIGVkaXQgZmllbGRzLlxuXHQgKiBAcmV0dXJucyBUaGUgcHJvcGVydGllcyBvZiB0aGUgbWFzcyBlZGl0IGZpZWxkLlxuXHQgKi9cblx0Z2V0RmllbGRQcm9wZXJ0aWVzKCk6IE1hc3NGaWVsZFByb3BlcnRpZXNbXSB7XG5cdFx0cmV0dXJuIGRlZXBDbG9uZSh0aGlzLmZpZWxkUHJvcGVydGllcyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgbWFzcyBlZGl0IGZpZWxkcyBmcm9tIGFuIGFycmF5IG9mIGZpZWxkIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0gZmllbGRzSW5mbyBUaGUgZmllbGQgaW5mb3JtYXRpb24uXG5cdCAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBtYXNzIGVkaXQgZmllbGRzLlxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXRGaWVsZHNQcm9wZXJ0aWVzRnJvbUluZm8oZmllbGRzSW5mbzogRmllbGRJbmZvW10pOiBQcm9taXNlPE1hc3NGaWVsZFByb3BlcnRpZXNbXT4ge1xuXHRcdGNvbnN0IGZpZWxkUHJvcGVydGllczogTWFzc0ZpZWxkUHJvcGVydGllc1tdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGZpZWxkSW5mbyBvZiBmaWVsZHNJbmZvKSB7XG5cdFx0XHRjb25zdCB7IHRhcmdldFByb3BlcnR5LCBwcm9wZXJ0eURhdGFNb2RlbCwgY29udmVydGVkQW5ub3RhdGlvbiB9ID0gZmllbGRJbmZvO1xuXHRcdFx0Y29uc3QgZGF0YVByb3BlcnR5UGF0aCA9IGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgocHJvcGVydHlEYXRhTW9kZWwpO1xuXHRcdFx0aWYgKGRhdGFQcm9wZXJ0eVBhdGgpIHtcblx0XHRcdFx0Y29uc3QgdW5pdE9yQ3VycmVuY3lQcm9wZXJ0eVBhdGggPVxuXHRcdFx0XHRcdGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHlQYXRoKHRhcmdldFByb3BlcnR5KSB8fCBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eVBhdGgodGFyZ2V0UHJvcGVydHkpO1xuXHRcdFx0XHRjb25zdCBpbnB1dFR5cGUgPSB0aGlzLmdldElucHV0VHlwZShjb252ZXJ0ZWRBbm5vdGF0aW9uLCBwcm9wZXJ0eURhdGFNb2RlbCk7XG5cdFx0XHRcdGlmIChpbnB1dFR5cGUgJiYgcHJvcGVydHlEYXRhTW9kZWwudGFyZ2V0T2JqZWN0KSB7XG5cdFx0XHRcdFx0Y29uc3QgcmVsYXRpdmVQYXRoID0gZ2V0UmVsYXRpdmVQYXRocyhwcm9wZXJ0eURhdGFNb2RlbCk7XG5cdFx0XHRcdFx0Y29uc3QgZmllbGREYXRhID0ge1xuXHRcdFx0XHRcdFx0dmlzaWJpbGl0eUJpbmRpbmdzOiB7XG5cdFx0XHRcdFx0XHRcdGlzVmlzaWJsZTogY29tcGlsZUV4cHJlc3Npb24oaXNWaXNpYmxlKGNvbnZlcnRlZEFubm90YXRpb24pKSxcblx0XHRcdFx0XHRcdFx0ZWRpdE1vZGU6IGdldEVkaXRNb2RlKFxuXHRcdFx0XHRcdFx0XHRcdHRhcmdldFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5RGF0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdGNvbnZlcnRlZEFubm90YXRpb24sXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3RhbnQodHJ1ZSlcblx0XHRcdFx0XHRcdFx0KSBhcyBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvblxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHZpc2libGU6IHRydWUsIC8vYnkgZGVmYXVsdCB0aGUgZmllbGQgaXMgdmlzaWJsZVxuXHRcdFx0XHRcdFx0bGFiZWw6IGZpZWxkSW5mby5sYWJlbCB8fCAodGFyZ2V0UHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uPy5MYWJlbCBhcyBzdHJpbmcgfCB1bmRlZmluZWQpIHx8IGRhdGFQcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0XHRpc0ZpZWxkUmVxdWlyZWQ6IGdldFJlcXVpcmVkRXhwcmVzc2lvbihcblx0XHRcdFx0XHRcdFx0dGFyZ2V0UHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdGNvbnZlcnRlZEFubm90YXRpb24sXG5cdFx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0XHR7fSxcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlEYXRhTW9kZWxcblx0XHRcdFx0XHRcdCkgYXMgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvblBhdGg6IGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoKHByb3BlcnR5RGF0YU1vZGVsLnRhcmdldE9iamVjdCksXG5cdFx0XHRcdFx0XHR0ZXh0QmluZGluZzoge1xuXHRcdFx0XHRcdFx0XHRleHByZXNzaW9uOiBnZXRUZXh0QmluZGluZyhwcm9wZXJ0eURhdGFNb2RlbCwge1xuXHRcdFx0XHRcdFx0XHRcdGRpc3BsYXlNb2RlOiBnZXREaXNwbGF5TW9kZSh0YXJnZXRQcm9wZXJ0eSwgcHJvcGVydHlEYXRhTW9kZWwudGFyZ2V0RW50aXR5VHlwZSlcblx0XHRcdFx0XHRcdFx0fSkgYXMgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sXG5cdFx0XHRcdFx0XHRcdHR5cGU6XG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0UHJvcGVydHkudHlwZSA9PT0gXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIiB8fCB0YXJnZXRQcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uSXNUaW1lem9uZVxuXHRcdFx0XHRcdFx0XHRcdFx0PyBcImFueVRleHRcIlxuXHRcdFx0XHRcdFx0XHRcdFx0OiBcImFueVwiXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0cmVhZE9ubHlFeHByZXNzaW9uOiBpc1JlYWRPbmx5RXhwcmVzc2lvbih0YXJnZXRQcm9wZXJ0eSwgcmVsYXRpdmVQYXRoKSxcblx0XHRcdFx0XHRcdGlucHV0VHlwZSxcblx0XHRcdFx0XHRcdHByb3BlcnR5SW5mbzoge1xuXHRcdFx0XHRcdFx0XHRjbGVhcmFibGU6IHRoaXMuaXNQcm9wZXJ0eUNsZWFyYWJsZSh0YXJnZXRQcm9wZXJ0eSksXG5cdFx0XHRcdFx0XHRcdGVtcHR5VmFsdWU6IHRoaXMuZ2V0RW1wdHlWYWx1ZUZvclByb3BlcnR5KHRhcmdldFByb3BlcnR5LCBkYXRhUHJvcGVydHlQYXRoKSxcblx0XHRcdFx0XHRcdFx0a2V5OiBmaWVsZEluZm8ua2V5LFxuXHRcdFx0XHRcdFx0XHRyZWxhdGl2ZVBhdGg6IGRhdGFQcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0XHRcdHVuaXRPckN1cnJlbmN5UHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0c2VsZWN0SXRlbXM6IFtdIGFzIFNlbGVjdEluZm9bXVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0ZmllbGRQcm9wZXJ0aWVzLnB1c2goZmllbGREYXRhKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRhd2FpdCB0aGlzLmdldERhdGFGb3JPcGVuaW5nRGlhbG9nKGZpZWxkUHJvcGVydGllcyk7XG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRmaWVsZFByb3BlcnRpZXMubWFwKGFzeW5jIChmaWVsZERhdGEpID0+IHtcblx0XHRcdFx0ZmllbGREYXRhLnZpc2libGUgPSB0aGlzLm1hbmlmZXN0U2V0dGluZ3MudmlzaWJsZUZpZWxkcy5sZW5ndGggPT09IDAgPyB0aGlzLmlzRmllbGRWaXNpYmxlKGZpZWxkRGF0YSkgOiB0cnVlO1xuXHRcdFx0XHRjb25zdCBydW50aW1lU2VsZWN0aW9uID0gIXRoaXMuaXNBZGFwdGF0aW9uID8gYXdhaXQgdGhpcy5nZXRSdW50aW1lU2VsZWN0aW9uKGZpZWxkRGF0YSkgOiBbXTtcblx0XHRcdFx0ZmllbGREYXRhLnNlbGVjdEl0ZW1zID0gWy4uLnRoaXMuZ2V0RGVmYXVsdFNlbGVjdE9wdGlvbnMoZmllbGREYXRhKSwgLi4ucnVudGltZVNlbGVjdGlvbl07XG5cdFx0XHR9KVxuXHRcdCk7XG5cdFx0cmV0dXJuIGZpZWxkUHJvcGVydGllcztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9wZXJ0aWVzIG9mIGRpYWxvZyBmaWVsZHMuXG5cdCAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0aWVzLlxuXHQgKi9cblx0YXN5bmMgZ2VuZXJhdGVGaWVsZHNQcm9wZXJ0aWVzKCk6IFByb21pc2U8TWFzc0ZpZWxkUHJvcGVydGllc1tdPiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0RmllbGRzUHJvcGVydGllc0Zyb21JbmZvKHRoaXMuZ2V0RmllbGRzSW5mbygpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBlbnRpdHkuXG5cdCAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0aWVzLlxuXHQgKi9cblx0YXN5bmMgZ2VuZXJhdGVFbnRpdHlGaWVsZHNQcm9wZXJ0aWVzKCk6IFByb21pc2U8TWFzc0ZpZWxkUHJvcGVydGllc1tdPiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0RmllbGRzUHJvcGVydGllc0Zyb21JbmZvKHRoaXMuZ2V0RW50aXR5RmllbGRzSW5mbygpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSByZWxldmFudCBkYXRhIGZyb20gdGhlIG1vZGVsIG5lZWRlZCBhZnRlciB0aGUgb3BlbmluZyBvZiB0aGUgZGlhbG9nLlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25seSBpbiB0aGUgZGVncmFkZWQgbW9kZSBzaW5jZSB0aGUgZGF0YSBpcyBhbHJlYWR5IGZldGNoZWQgaW4gdGhlIG5vcm1hbCBtb2RlLlxuXHQgKiB0aGUgZGVncmFkZWQgbW9kZSBpcyBzZXQgd2hlbiB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGNvbnRleHRzIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4IGFuYWx5emVkIHJvd3MuXG5cdCAqIEBwYXJhbSBmaWVsZFByb3BlcnRpZXMgVGhlIGZpZWxkIHByb3BlcnRpZXNcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGF0YSBpcyBmZXRjaGVkLlxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXREYXRhQWZ0ZXJPcGVuaW5nRGlhbG9nKGZpZWxkUHJvcGVydGllczogTWFzc0ZpZWxkUHJvcGVydGllc1tdKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuZGVncmFkZWRNb2RlKSB7XG5cdFx0XHRjb25zdCBtaXNzaW5nQ29udGV4dHMgPSB0aGlzLmNvbnRleHRzLnNsaWNlKHRoaXMubWF4QW5hbHl6ZWRSb3dzLCB0aGlzLmNvbnRleHRzLmxlbmd0aCk7XG5cdFx0XHRjb25zdCBiaW5kaW5nc1RvRmV0Y2ggPSAoW10gYXMgQmluZGluZ1RvRmV0Y2hbXSkuY29uY2F0KFxuXHRcdFx0XHQuLi5maWVsZFByb3BlcnRpZXMubWFwKChmaWVsZERhdGEpID0+IFtcblx0XHRcdFx0XHR7IGV4cHJlc3Npb246IGNvbXBpbGVFeHByZXNzaW9uKGZpZWxkRGF0YS5yZWFkT25seUV4cHJlc3Npb24pLCBjb250ZXh0czogdGhpcy5jb250ZXh0cyB9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGV4cHJlc3Npb246IGNvbXBpbGVFeHByZXNzaW9uKHBhdGhJbk1vZGVsKGZpZWxkRGF0YS5wcm9wZXJ0eUluZm8ucmVsYXRpdmVQYXRoKSksXG5cdFx0XHRcdFx0XHRjb250ZXh0czogbWlzc2luZ0NvbnRleHRzLFxuXHRcdFx0XHRcdFx0dHlwZTogZmllbGREYXRhLnRleHRCaW5kaW5nLnR5cGVcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGV4cHJlc3Npb246IGNvbXBpbGVFeHByZXNzaW9uKHBhdGhJbk1vZGVsKGZpZWxkRGF0YS5wcm9wZXJ0eUluZm8udW5pdE9yQ3VycmVuY3lQcm9wZXJ0eVBhdGgpKSxcblx0XHRcdFx0XHRcdGNvbnRleHRzOiBtaXNzaW5nQ29udGV4dHNcblx0XHRcdFx0XHR9XG5cdFx0XHRcdF0pXG5cdFx0XHQpO1xuXHRcdFx0YXdhaXQgdGhpcy5nZXRNaXNzaW5nRGF0YShiaW5kaW5nc1RvRmV0Y2gpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSByZWxldmFudCBkYXRhIGZyb20gdGhlIG1vZGVsIG5lZWRlZCB0byBvcGVuIHRoZSBkaWFsb2cuXG5cdCAqIEBwYXJhbSBmaWVsZFByb3BlcnRpZXMgVGhlIGZpZWxkIHByb3BlcnRpZXNcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGF0YSBpcyBmZXRjaGVkLlxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXREYXRhRm9yT3BlbmluZ0RpYWxvZyhmaWVsZFByb3BlcnRpZXM6IE1hc3NGaWVsZFByb3BlcnRpZXNbXSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGJpbmRpbmdzVG9SZXNvbHZlID0gKFtdIGFzIEJpbmRpbmdUb0ZldGNoW10pLmNvbmNhdChcblx0XHRcdGZpZWxkUHJvcGVydGllcy5yZWR1Y2UoKGJpbmRpbmdzOiBCaW5kaW5nVG9GZXRjaFtdLCBmaWVsZERhdGEpID0+IHtcblx0XHRcdFx0YmluZGluZ3MgPSBiaW5kaW5ncy5jb25jYXQoW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGV4cHJlc3Npb246IGZpZWxkRGF0YS50ZXh0QmluZGluZy5leHByZXNzaW9uLFxuXHRcdFx0XHRcdFx0dHlwZTogZmllbGREYXRhLnRleHRCaW5kaW5nLnR5cGVcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGV4cHJlc3Npb246IGNvbXBpbGVFeHByZXNzaW9uKHBhdGhJbk1vZGVsKGZpZWxkRGF0YS5wcm9wZXJ0eUluZm8ucmVsYXRpdmVQYXRoKSksXG5cdFx0XHRcdFx0XHR0eXBlOiBmaWVsZERhdGEudGV4dEJpbmRpbmcudHlwZVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0eyBleHByZXNzaW9uOiBjb21waWxlRXhwcmVzc2lvbihwYXRoSW5Nb2RlbChmaWVsZERhdGEucHJvcGVydHlJbmZvLnVuaXRPckN1cnJlbmN5UHJvcGVydHlQYXRoKSkgfVxuXHRcdFx0XHRdKTtcblx0XHRcdFx0aWYgKCF0aGlzLm1hbmlmZXN0U2V0dGluZ3MudmlzaWJsZUZpZWxkcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRiaW5kaW5ncyA9IGJpbmRpbmdzLmNvbmNhdChbXG5cdFx0XHRcdFx0XHR7IGV4cHJlc3Npb246IGZpZWxkRGF0YS52aXNpYmlsaXR5QmluZGluZ3MuaXNWaXNpYmxlIH0sXG5cdFx0XHRcdFx0XHR7IGV4cHJlc3Npb246IGZpZWxkRGF0YS52aXNpYmlsaXR5QmluZGluZ3MuZWRpdE1vZGUgfVxuXHRcdFx0XHRcdF0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghdGhpcy5kZWdyYWRlZE1vZGUpIHtcblx0XHRcdFx0XHRiaW5kaW5ncy5wdXNoKHsgZXhwcmVzc2lvbjogY29tcGlsZUV4cHJlc3Npb24oZmllbGREYXRhLnJlYWRPbmx5RXhwcmVzc2lvbikgfSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGJpbmRpbmdzO1xuXHRcdFx0fSwgW10pXG5cdFx0KTtcblx0XHRhd2FpdCB0aGlzLmdldE1pc3NpbmdEYXRhKGJpbmRpbmdzVG9SZXNvbHZlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBtaXNzaW5nIGRhdGEgZm9yIHRoZSBmaWVsZHMuXG5cdCAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyBjb250cm9scyB3aXRoIHRoZSBwcm92aWRlZCBiaW5kaW5ncyB0byBmZXRjaCB0aGUgbWlzc2luZyBkYXRhLlxuXHQgKiBUaGUgbW9kZWwgcmVxdWVzdHMgdGhlIGRhdGEgdG8gdGhlIGJhY2tlbmQgd2hlbiB0aGUgY29udGV4dHMgZG9lc24ndCBjb250YWlucyB0aGUgcmVsYXRlZCBwcm9wZXJ0aWVzLlxuXHQgKiBAcGFyYW0gYmluZGluZ3NUb0ZldGNoIFRoZSBiaW5kaW5nIHRvIHJlc29sdmUgYW5kIGl0cyBwcm9wZXJ0eSBwYXRoIHJlZmVyZW5jZVxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkYXRhIGlzIGZldGNoZWQuXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGdldE1pc3NpbmdEYXRhKGJpbmRpbmdzVG9GZXRjaDogQmluZGluZ1RvRmV0Y2hbXSk6IFByb21pc2U8dW5kZWZpbmVkPiB7XG5cdFx0aWYgKHRoaXMuaXNBZGFwdGF0aW9uKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmICh0aGlzLnZpZXcuZ2V0Vmlld0RhdGEoKS5jb252ZXJ0ZXJUeXBlID09PSBcIk9iamVjdFBhZ2VcIikge1xuXHRcdFx0Y29uc3QgZGlzcGxheWVkUHJvcGVydGllcyA9IHRoaXMudGFibGUuZ2V0Q29sdW1ucygpLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uZ2V0UHJvcGVydHlLZXkoKSk7XG5cdFx0XHRpZiAodGhpcy5tYW5pZmVzdFNldHRpbmdzLnZpc2libGVGaWVsZHMuZXZlcnkoKGZpZWxkKSA9PiBkaXNwbGF5ZWRQcm9wZXJ0aWVzLmluY2x1ZGVzKGZpZWxkKSkpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCBwcm9taXNlcyA9IFtdO1xuXHRcdGNvbnN0IGNvbnRyb2xzID0gW107XG5cdFx0Y29uc3QgbW9kZWwgPSB0aGlzLmNvbnRleHRzWzBdLmdldE1vZGVsKCk7XG5cdFx0Zm9yIChjb25zdCBiaW5kaW5nIG9mIGJpbmRpbmdzVG9GZXRjaC5maWx0ZXIoKGJpbmRpbmcpID0+IGJpbmRpbmcuZXhwcmVzc2lvbj8uc3RhcnRzV2l0aChcIntcIikpKSB7XG5cdFx0XHQvLyBBdm9pZCB0byBmZXRjaCBjb25zdGFudCBiaW5kaW5nc1xuXHRcdFx0Y29uc3QgcGFyYW1ldGVycyA9IHt9IGFzIFJlY29yZDxzdHJpbmcsIENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPjtcblx0XHRcdGNvbnN0IGFuYWx5emVkQ29udGV4dHMgPSBiaW5kaW5nLmNvbnRleHRzID8/IHRoaXMuYW5hbHl6ZWRDb250ZXh0cztcblx0XHRcdGNvbnN0IGJpbmRpbmdUeXBlID0gYmluZGluZy50eXBlID8/IFwiYW55XCI7XG5cdFx0XHRwYXJhbWV0ZXJzW2JpbmRpbmdUeXBlXSA9IGJpbmRpbmcuZXhwcmVzc2lvbjtcblx0XHRcdGZvciAoY29uc3QgY29udGV4dCBvZiBhbmFseXplZENvbnRleHRzKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRyb2wgPSA8QW55IHsuLi5wYXJhbWV0ZXJzfSAvPjtcblx0XHRcdFx0Y29udHJvbC5zZXRNb2RlbChtb2RlbCk7XG5cdFx0XHRcdGNvbnRyb2wuc2V0QmluZGluZ0NvbnRleHQoY29udGV4dCk7XG5cdFx0XHRcdGNvbnRyb2xzLnB1c2goY29udHJvbCk7XG5cdFx0XHRcdHByb21pc2VzLnB1c2goYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRyb2xCaW5kaW5nID0gY29udHJvbC5nZXRCaW5kaW5nKGJpbmRpbmdUeXBlKSBhcyBPRGF0YVByb3BlcnR5QmluZGluZyB8IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRpZiAoY29udHJvbEJpbmRpbmcpIHtcblx0XHRcdFx0XHRcdGNvbnRyb2xCaW5kaW5nLnNldEJpbmRpbmdNb2RlKEJpbmRpbmdNb2RlLk9uZVRpbWUpO1xuXHRcdFx0XHRcdFx0aWYgKGNvbnRyb2xCaW5kaW5nLmlzQTxDb21wb3NpdGVCaW5kaW5nPihcInNhcC51aS5tb2RlbC5Db21wb3NpdGVCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IFByb21pc2UuYWxsKGNvbnRyb2xCaW5kaW5nLmdldEJpbmRpbmdzKCkubWFwKChuZXN0ZWRCaW5kaW5nKSA9PiBuZXN0ZWRCaW5kaW5nLnJlcXVlc3RWYWx1ZT8uKCkpKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IGNvbnRyb2xCaW5kaW5nLnJlcXVlc3RWYWx1ZT8uKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMubWFwKGFzeW5jIChwcm9taXNlKSA9PiBwcm9taXNlKCkpKTtcblx0XHRmb3IgKGNvbnN0IGNvbnRyb2wgb2YgY29udHJvbHMpIHtcblx0XHRcdGNvbnRyb2wuZGVzdHJveSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB3aGVuIHRoZSByZWxhdGVkIGZpZWxkIGlzIGVtcHR5LlxuXHQgKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5XG5cdCAqIEBwYXJhbSBwcm9wZXJ0eVBhdGggVGhlIHByb3BlcnR5IHBhdGhcblx0ICogQHJldHVybnMgVGhlIGRlZmF1bHQgdmFsdWUuXG5cdCAqL1xuXHRnZXRFbXB0eVZhbHVlRm9yUHJvcGVydHkocHJvcGVydHk6IFByb3BlcnR5LCBwcm9wZXJ0eVBhdGg6IHN0cmluZyk6IFByaW1pdGl2ZVR5cGUge1xuXHRcdGlmIChwcm9wZXJ0eS5udWxsYWJsZSAhPT0gZmFsc2UpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0c1swXTtcblx0XHRcdGNvbnN0IGFueU9iamVjdCA9IDxBbnkgYW55PXtjb21waWxlRXhwcmVzc2lvbihmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKHByb3BlcnR5LCBwYXRoSW5Nb2RlbChwcm9wZXJ0eVBhdGgpKSl9IC8+O1xuXHRcdFx0YW55T2JqZWN0LnNldE1vZGVsKGNvbnRleHQuZ2V0TW9kZWwoKSk7XG5cdFx0XHRhbnlPYmplY3Quc2V0QmluZGluZ0NvbnRleHQoY29udGV4dCk7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IGFueU9iamVjdC5nZXRCaW5kaW5nSW5mbyhcImFueVwiKS5iaW5kaW5nLmdldFR5cGUoKS5wYXJzZVZhbHVlKFwiXCIsIFwic3RyaW5nXCIpO1xuXHRcdFx0YW55T2JqZWN0LmRlc3Ryb3koKTtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSBwcm9wZXJ0eSBpcyBjbGVhcmFibGUuXG5cdCAqIFNvbWUgT0RhdGEgdHlwZXMgZG9uJ3QgYWNjZXNzIGVtcHR5IHN0cmluZyBvciAwIGFzIGEgdmFsaWQgdmFsdWUgd2hlbiBpdCdzIG5vdCBudWxsYWJsZS5cblx0ICogRm9yIGV4YW1wbGUsIEVkbS5EYXRlVGltZSBkb2Vzbid0IGFjY2VwdCBhbiBlbXB0eSBzdHJpbmcgYXMgYSB2YWxpZCB2YWx1ZS5cblx0ICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBjbGVhcmFibGUsIGZhbHNlIG90aGVyd2lzZS5cblx0ICovXG5cdGlzUHJvcGVydHlDbGVhcmFibGUocHJvcGVydHk6IFByb3BlcnR5KTogUHJpbWl0aXZlVHlwZSB7XG5cdFx0aWYgKHByb3BlcnR5Lm51bGxhYmxlICE9PSBmYWxzZSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiAhW1wiRWRtLkRhdGVUaW1lXCIsIFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCIsIFwiRWRtLlRpbWVPZkRheVwiLCBcIkVkbS5UaW1lXCIsIFwiRWRtLkRhdGVcIiwgXCJFZG0uRGF0ZVRpbWVXaXRoVGltZXpvbmVcIl0uaW5jbHVkZXMoXG5cdFx0XHRcdHByb3BlcnR5LnR5cGVcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHNlbGVjdGlvbiBvcHRpb25zIG9mIGEgZmllbGQgZ2VuZXJhdGVkIGJ5IHRoZSBzZWxlY3RlZCBjb250ZXh0cy5cblx0ICogQHBhcmFtIGZpZWxkRGF0YSBEYXRhIG9mIHRoZSBmaWVsZCB1c2VkIGJ5IGJvdGggdGhlIHN0YXRpYyBhbmQgdGhlIHJ1bnRpbWUgbW9kZWxcblx0ICogQHJldHVybnMgVGhlIHNlbGVjdCBvcHRpb25zIG9mIHRoZSBmaWVsZFxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXRSdW50aW1lU2VsZWN0aW9uKGZpZWxkRGF0YTogTWFzc0ZpZWxkUHJvcGVydGllcyk6IFByb21pc2U8U2VsZWN0SW5mb1tdPiB7XG5cdFx0Y29uc3QgZGlzdGluY3RNYXAgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRjb25zdCBzZWxlY3RPcHRpb25zOiBTZWxlY3RJbmZvW10gPSBbXTtcblx0XHRpZiAoZmllbGREYXRhLmlucHV0VHlwZSA9PT0gXCJDaGVja0JveFwiKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXHRcdGNvbnN0IGFueU9iamVjdCA9ICg8QW55IGFueVRleHQ9e2ZpZWxkRGF0YS50ZXh0QmluZGluZy5leHByZXNzaW9ufSAvPikgYXMgdHlwZW9mIEFueTtcblx0XHRhbnlPYmplY3Quc2V0TW9kZWwodGhpcy5jb250ZXh0c1swXS5nZXRNb2RlbCgpKTtcblx0XHRmb3IgKGNvbnN0IHNlbGVjdGVkQ29udGV4dCBvZiB0aGlzLmFuYWx5emVkQ29udGV4dHMpIHtcblx0XHRcdGFueU9iamVjdC5zZXRCaW5kaW5nQ29udGV4dChzZWxlY3RlZENvbnRleHQpO1xuXHRcdFx0Y29uc3QgdGV4dEJpbmRpbmcgPSBhbnlPYmplY3QuZ2V0QmluZGluZyhcImFueVRleHRcIik7XG5cdFx0XHRpZiAodGV4dEJpbmRpbmc/LmlzQTxDb21wb3NpdGVCaW5kaW5nPihcInNhcC51aS5tb2RlbC5Db21wb3NpdGVCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIElmIHRoZSB0ZXh0IGJpbmRpbmcgaXMgYSBjb21wb3NpdGUgYmluZGluZywgd2UgbmVlZCB0byByZXF1ZXN0IHRoZSB2YWx1ZSBvZiBlYWNoIGJpbmRpbmdcblx0XHRcdFx0Ly8gdG8gd2FpdCBmb3IgdGhlIHByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgZ2V0dGluZyB0aGUgdmFsdWUgb2YgcmVxdWVzdFVuaXRzT2ZNZWFzdXJlL3JlcXVlc3RDdXJyZW5jeUNvZGVzXG5cdFx0XHRcdC8vIGZvciB0aGUgY3VzdG9tIHVuaXRzIG9mIG1lYXN1cmUgYW5kIGN1cnJlbmN5IGNvZGVzLlxuXHRcdFx0XHQvLyBXZSBoYXZlIHRvIHNldCB0aGUgYmluZGluZyBtb2RlIHRvIE9uZVRpbWUgdG8gYXZvaWQgdGhlIGJpbmRpbmcgdG8gYmUgdXBkYXRlZCB3aGVuIHRoZSBjb250ZXh0IGNoYW5nZXMuXG5cdFx0XHRcdC8vIEluZGVlZCBldmVuIGlmIHRoZSByZXF1ZXN0VW5pdHNPZk1lYXN1cmUvcmVxdWVzdEN1cnJlbmN5Q29kZXMgZG9lc24ndCBjaGFuZ2UgaXQncyB0cmlnZ2VyIGEgUEFUQ0ggcmVxdWVzdFxuXHRcdFx0XHR0ZXh0QmluZGluZy5zZXRCaW5kaW5nTW9kZShCaW5kaW5nTW9kZS5PbmVUaW1lKTtcblx0XHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwodGV4dEJpbmRpbmcuZ2V0QmluZGluZ3MoKS5tYXAoKGJpbmRpbmcpID0+IGJpbmRpbmcucmVxdWVzdFZhbHVlPy4oKSkpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgcHJvcGVydHlUZXh0ID0gKGFueU9iamVjdC5nZXRCaW5kaW5nKFwiYW55VGV4dFwiKSBhcyBQcm9wZXJ0eUJpbmRpbmcgfCB1bmRlZmluZWQpPy5nZXRFeHRlcm5hbFZhbHVlKCk7XG5cdFx0XHRpZiAocHJvcGVydHlUZXh0ICYmICFkaXN0aW5jdE1hcC5oYXMocHJvcGVydHlUZXh0KSkge1xuXHRcdFx0XHRkaXN0aW5jdE1hcC5hZGQocHJvcGVydHlUZXh0KTtcblx0XHRcdFx0c2VsZWN0T3B0aW9ucy5wdXNoKHtcblx0XHRcdFx0XHR0ZXh0OiBwcm9wZXJ0eVRleHQsXG5cdFx0XHRcdFx0a2V5OiBwcm9wZXJ0eVRleHQsXG5cdFx0XHRcdFx0dW5pdE9yQ3VycmVuY3lWYWx1ZTogZmllbGREYXRhLnByb3BlcnR5SW5mby51bml0T3JDdXJyZW5jeVByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0PyBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGZpZWxkRGF0YS5wcm9wZXJ0eUluZm8udW5pdE9yQ3VycmVuY3lQcm9wZXJ0eVBhdGgpXG5cdFx0XHRcdFx0XHQ6IFwiXCIsXG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZTogc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChmaWVsZERhdGEucHJvcGVydHlJbmZvLnJlbGF0aXZlUGF0aClcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGFueU9iamVjdC5kZXN0cm95KCk7XG5cdFx0cmV0dXJuIHNlbGVjdE9wdGlvbnM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gb3B0aW9ucyBvZiBhIGZpZWxkLlxuXHQgKiBAcGFyYW0gZmllbGREYXRhIFRoZSBwcm9wZXJ0eSBpbmZvcm1hdGlvblxuXHQgKiBAcmV0dXJucyBUaGUgZGVmYXVsdCBzZWxlY3Qgb3B0aW9ucy5cblx0ICovXG5cdHByaXZhdGUgZ2V0RGVmYXVsdFNlbGVjdE9wdGlvbnMoZmllbGREYXRhOiBNYXNzRmllbGRQcm9wZXJ0aWVzKTogU2VsZWN0SW5mb1tdIHtcblx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUubWFjcm9zXCIpIGFzIFJlc291cmNlQnVuZGxlO1xuXHRcdGNvbnN0IGtlZXBFbnRyeSA9IHtcblx0XHRcdHRleHQ6IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9DT01CT0JPWF9LRUVQX1ZBTFVFU1wiKSxcblx0XHRcdGtleTogU3BlY2lmaWNTZWxlY3RLZXlzLktlZXBLZXlcblx0XHR9O1xuXHRcdGNvbnN0IGRlZmF1bHRPcHRpb25zOiBTZWxlY3RJbmZvW10gPSBbXTtcblx0XHRkZWZhdWx0T3B0aW9ucy5wdXNoKGtlZXBFbnRyeSk7XG5cdFx0aWYgKGZpZWxkRGF0YS5pbnB1dFR5cGUgPT09IFwiQ2hlY2tCb3hcIikge1xuXHRcdFx0ZGVmYXVsdE9wdGlvbnMucHVzaCh7IHRleHQ6IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJ5ZXNcIiksIGtleTogXCJ0cnVlXCIgfSwgeyB0ZXh0OiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwibm9cIiksIGtleTogXCJmYWxzZVwiIH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZWZhdWx0T3B0aW9ucy5wdXNoKHtcblx0XHRcdFx0dGV4dDogcmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX0NPTUJPQk9YX1JFUExBQ0VfVkFMVUVTXCIpLFxuXHRcdFx0XHRrZXk6IFNwZWNpZmljU2VsZWN0S2V5cy5SZXBsYWNlS2V5XG5cdFx0XHR9KTtcblx0XHRcdGlmIChmaWVsZERhdGEuaXNGaWVsZFJlcXVpcmVkICE9PSBcInRydWVcIiAmJiBmaWVsZERhdGEucHJvcGVydHlJbmZvLmNsZWFyYWJsZSkge1xuXHRcdFx0XHRkZWZhdWx0T3B0aW9ucy5wdXNoKHtcblx0XHRcdFx0XHR0ZXh0OiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfQ09NQk9CT1hfQ0xFQVJfVkFMVUVTXCIpLFxuXHRcdFx0XHRcdGtleTogU3BlY2lmaWNTZWxlY3RLZXlzLkNsZWFyRmllbGRWYWx1ZUtleVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGRlZmF1bHRPcHRpb25zO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgdGhlIGZpZWxkIGlzIGVkaXRhYmxlLlxuXHQgKiBAcGFyYW0gZXhwQmluZGluZyBUaGUgZXhwcmVzc2lvbiBiaW5kaW5nIG9mIHRoZSBwcm9wZXJ0eS5cblx0ICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSBtYXNzIGVkaXQgZmllbGQgaXMgZWRpdGFibGUuXG5cdCAqL1xuXHRwcml2YXRlIGdldEZpZWxkRWRpdGFibGUoZXhwQmluZGluZzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24pOiBib29sZWFuIHtcblx0XHRpZiAoZXhwQmluZGluZyA9PT0gRmllbGRFZGl0TW9kZS5FZGl0YWJsZSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIGlmIChPYmplY3Qua2V5cyhGaWVsZEVkaXRNb2RlKS5pbmNsdWRlcyhleHBCaW5kaW5nIGFzIEZpZWxkRWRpdE1vZGUpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBlbHNlIGlmIChleHBCaW5kaW5nKSB7XG5cdFx0XHRjb25zdCBhbnlDb250cm9sID0gPEFueSBhbnk9e2V4cEJpbmRpbmd9IC8+O1xuXHRcdFx0Y29uc3QgbW9kZWwgPSB0aGlzLmFuYWx5emVkQ29udGV4dHNbMF0uZ2V0TW9kZWwoKTtcblx0XHRcdGFueUNvbnRyb2wuc2V0TW9kZWwobW9kZWwpO1xuXHRcdFx0Y29uc3QgdmlzaWJsZSA9IHRoaXMuYW5hbHl6ZWRDb250ZXh0cy5zb21lKChjb250ZXh0KSA9PiB7XG5cdFx0XHRcdGFueUNvbnRyb2wuc2V0QmluZGluZ0NvbnRleHQoY29udGV4dCk7XG5cdFx0XHRcdHJldHVybiAoYW55Q29udHJvbC5nZXRCaW5kaW5nKFwiYW55XCIpIGFzIFByb3BlcnR5QmluZGluZykuZ2V0RXh0ZXJuYWxWYWx1ZSgpID09PSBGaWVsZEVkaXRNb2RlLkVkaXRhYmxlO1xuXHRcdFx0fSk7XG5cdFx0XHRhbnlDb250cm9sLmRlc3Ryb3koKTtcblx0XHRcdHJldHVybiB2aXNpYmxlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgaW5wdXQgdHlwZSBvZiB0aGUgZmllbGQuXG5cdCAqIEBwYXJhbSBkYXRhRmllbGRDb252ZXJ0ZWQgVGhlIGNvbnZlcnRlZCBhbm5vdGF0aW9uIGZvIHRoZSBmaWVsZFxuXHQgKiBAcGFyYW0gZGF0YU1vZGVsUGF0aCBUaGUgZGF0YU1vZGVsT2JqZWN0UGF0aCBvZiB0aGUgcHJvcGVydHlcblx0ICogQHJldHVybnMgVGhlIGlucHV0IHR5cGUuXG5cdCAqL1xuXHRwcml2YXRlIGdldElucHV0VHlwZShkYXRhRmllbGRDb252ZXJ0ZWQ6IERhdGFGaWVsZFR5cGVzLCBkYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pik6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwge1xuXHRcdGNvbnN0IGVkaXRTdHlsZVByb3BlcnRpZXMgPSB7fSBhcyBGaWVsZEJsb2NrUHJvcGVydGllcztcblx0XHRzZXRFZGl0U3R5bGVQcm9wZXJ0aWVzKGVkaXRTdHlsZVByb3BlcnRpZXMsIGRhdGFGaWVsZENvbnZlcnRlZCwgZGF0YU1vZGVsUGF0aCwgdHJ1ZSk7XG5cdFx0cmV0dXJuIGVkaXRTdHlsZVByb3BlcnRpZXM/LmVkaXRTdHlsZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmaWVsZFxuXHQgKiBUaGlzIHZpc2liaWxpdHkgaXMgbm90IGRlcGVuZGVudCBvbiB0aGUgY29udGV4dCB3aGVuXG5cdCAqICAtIGVpdGhlciB0aGUgYWRhcHRhdGlvbiBtb2RlIGlzIHNldC5cblx0ICogIC0gb3IgdGhlIGZpZWxkIGlzIHZpc2libGUgaW4gdGhlIG1hbmlmZXN0IGFuZCB0aGUgZGVncmFkZWQgbW9kZSBpcyBzZXQuXG5cdCAqIEBwYXJhbSBmaWVsZFByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgb2YgdGhlIG1hc3MgZWRpdCBmaWVsZFxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBmaWVsZCBpcyB2aXNpYmxlLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgaXNGaWVsZFZpc2libGUoZmllbGRQcm9wZXJ0aWVzOiBNYXNzRmllbGRQcm9wZXJ0aWVzKTogYm9vbGVhbiB7XG5cdFx0aWYgKHRoaXMuaXNBZGFwdGF0aW9uIHx8ICh0aGlzLm1hbmlmZXN0U2V0dGluZ3MudmlzaWJsZUZpZWxkcy5sZW5ndGggJiYgdGhpcy5kZWdyYWRlZE1vZGUpKSB7XG5cdFx0XHRjb25zdCBpc1N0YXRpY0VkaXRNb2RlID0gT2JqZWN0LmtleXMoRmllbGRFZGl0TW9kZSkuaW5jbHVkZXMoZmllbGRQcm9wZXJ0aWVzLnZpc2liaWxpdHlCaW5kaW5ncy5lZGl0TW9kZSBhcyBGaWVsZEVkaXRNb2RlKTtcblx0XHRcdGNvbnN0IGlzRWRpdGFibGUgPVxuXHRcdFx0XHQhaXNTdGF0aWNFZGl0TW9kZSB8fCAoaXNTdGF0aWNFZGl0TW9kZSAmJiBmaWVsZFByb3BlcnRpZXMudmlzaWJpbGl0eUJpbmRpbmdzLmVkaXRNb2RlID09PSBGaWVsZEVkaXRNb2RlLkVkaXRhYmxlKTtcblx0XHRcdHJldHVybiBpc0VkaXRhYmxlICYmIGZpZWxkUHJvcGVydGllcy52aXNpYmlsaXR5QmluZGluZ3MuaXNWaXNpYmxlICE9PSBcImZhbHNlXCI7XG5cdFx0fVxuXHRcdHJldHVybiAoXG5cdFx0XHR0aGlzLmdldEZpZWxkRWRpdGFibGUoZmllbGRQcm9wZXJ0aWVzLnZpc2liaWxpdHlCaW5kaW5ncy5lZGl0TW9kZSkgJiZcblx0XHRcdCF0aGlzLmlzSGlkZGVuRm9yQ29udGV4dHMoZmllbGRQcm9wZXJ0aWVzLnZpc2liaWxpdHlCaW5kaW5ncy5pc1Zpc2libGUpXG5cdFx0KTtcblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBa0VBO0FBQ0E7QUFDQTtFQUZBLElBR3FCQSxvQkFBb0I7SUEyQnhDLFNBQUFBLHFCQUFZQyxLQUFxRSxFQUFFO01BQUEsS0FsQmxFQyxlQUFlLEdBQUcsRUFBRTtNQUFBLEtBSXBCQyxnQkFBZ0IsR0FBcUIsRUFBRTtNQUFBLEtBTWhEQyxlQUFlLEdBQTBCLEVBQUU7TUFTbEQsTUFBTUMsY0FBYyxHQUFJSixLQUFLLENBQUNLLEtBQUssQ0FBQ0MsU0FBUyxDQUFDLENBQUMsQ0FBY0Msa0JBQWtCLENBQUMsQ0FBQyxDQUFDQyxVQUFVLENBQUNDLFVBQVU7UUFDdEdDLFNBQVMsR0FBSVYsS0FBSyxDQUFDSyxLQUFLLENBQUNNLFFBQVEsQ0FBQyxDQUFDLENBQWdCQyxZQUFZLENBQUMsQ0FBQztNQUVsRSxJQUFJLENBQUNQLEtB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
715
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNYXNzRWRpdERpYWxvZ0hlbHBlciIsInByb3BzIiwibWF4QW5hbHl6ZWRSb3dzIiwiYW5hbHl6ZWRDb250ZXh0cyIsImZpZWxkUHJvcGVydGllcyIsImVudGl0eVR5cGVQYXRoIiwidGFibGUiLCJnZXRQYXJlbnQiLCJnZXRUYWJsZURlZmluaXRpb24iLCJhbm5vdGF0aW9uIiwiY29sbGVjdGlvbiIsIm1ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwibWFuaWZlc3RTZXR0aW5ncyIsImNvbnRyb2wiLCJtYXNzRWRpdCIsIm9uQ29udGV4dE1lbnUiLCJvbkRpYWxvZ0Nsb3NlIiwib25DbG9zZSIsInZpZXciLCJDb21tb25VdGlscyIsImdldFRhcmdldFZpZXciLCJjb250ZXh0cyIsImZldGNoQ29udGV4dHNGb3JFZGl0IiwiZGVncmFkZWRNb2RlIiwibGVuZ3RoIiwic2xpY2UiLCJpc0FkYXB0YXRpb24iLCJnZXRBcHBDb21wb25lbnQiLCJpc0FkYXB0YXRpb25Nb2RlIiwiaGVhZGVySW5mbyIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImdldENvbnRleHQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiYW5ub3RhdGlvbnMiLCJVSSIsIkhlYWRlckluZm8iLCJfZXhwb3J0cyIsIl9wcm90byIsInByb3RvdHlwZSIsIm9wZW4iLCJ0ZW1wbGF0ZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImludGVybmFsTW9kZWxQcm9wZXJ0eSIsInNlbGVjdGVkQ29udGV4dHMiLCJnZXRQcm9wZXJ0eSIsImdldEZpZWxkc1Byb3BlcnRpZXNGcm9tSW5mbyIsImdldEZpZWxkc0luZm8iLCJzb21lIiwiZmllbGQiLCJ2aXNpYmxlIiwibm9GaWVsZEluZm9ybWF0aW9uIiwiY29uZmlybVNlbGVjdGlvbiIsInJ1bkFzT3duZXIiLCJtYXNzRWRpdERpYWxvZyIsIk1hc3NFZGl0RGlhbG9nIiwiZGlhbG9nIiwiY3JlYXRlIiwiYXR0YWNoQmVmb3JlQ2xvc2UiLCJyZXF1aXJlZERhdGFQcm9taXNlIiwiZ2V0UmVxdWlyZWREYXRhUHJvbWlzZSIsImdldERhdGFBZnRlck9wZW5pbmdEaWFsb2ciLCJyZXNvbHZlIiwiZXJyb3IiLCJMb2ciLCJyZWplY3QiLCJ2aXNpYmxlRmllbGRzRnJvbU1hbmlmZXN0IiwidmlzaWJsZUZpZWxkcyIsInJlc291cmNlQnVuZGxlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwibWVzc2FnZSIsIm1lc3NhZ2VEZXRhaWwiLCJnZXRUZXh0IiwiZ2V0UmVzb3VyY2VUZXh0IiwiVHlwZU5hbWUiLCJyZWR1Y2UiLCJmaWVsZHMiLCJmaWVsZFByb3BlcnR5IiwiaW5jbHVkZXMiLCJwcm9wZXJ0eUluZm8iLCJyZWxhdGl2ZVBhdGgiLCJwdXNoIiwibGFiZWwiLCJqb2luIiwiTWVzc2FnZUJveCIsImluZm9ybWF0aW9uIiwiZGV0YWlscyIsInJlc291cmNlTW9kZWwiLCJSZXNvdXJjZU1vZGVsSGVscGVyIiwiZ2V0UmVzb3VyY2VNb2RlbCIsImNvcmVSZXNvdXJjZUJ1bmRsZSIsInVwZGF0YWJsZUNvbnRleHRzIiwiUHJvbWlzZSIsInRhYmxlQVBJIiwiZWRpdEJ1dHRvbiIsImNhbmNlbEJ1dHRvbiIsInR5cGVOYW1lIiwidHlwZU5hbWVQbHVyYWwiLCJUeXBlTmFtZVBsdXJhbCIsIk1vZGVsSGVscGVyIiwiaXNEcmFmdFN1cHBvcnRlZCIsImRhdGEiLCJyZWFkT25seSIsImdldE1lc3NhZ2VEZXRhaWxGb3JOb25FZGl0YWJsZSIsIndhcm5pbmciLCJhY3Rpb25zIiwiZW1waGFzaXplZEFjdGlvbiIsInNlbGVjdGlvbiIsInVuZGVmaW5lZCIsImdldFRyYW5zbGF0ZWRUZXh0RnJvbUV4cEJpbmRpbmdTdHJpbmciLCJjb21waWxlRXhwcmVzc2lvbiIsImdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbiIsInRvTG9jYWxlTG93ZXJDYXNlIiwiZ2V0RW50aXR5RmllbGRzSW5mbyIsImNvbHVtbnNEYXRhIiwiY29sdW1ucyIsInByb3BlcnRpZXNLZXlzIiwiU2V0IiwiY29sdW1uIiwidHlwZSIsIm5hbWUiLCJ0cmFuc2Zvcm1QYXRoc1RvSW5mbyIsImdldENvbHVtbnMiLCJtYXAiLCJnZXRQcm9wZXJ0eUtleSIsImlnbm9yZWRGaWVsZHMiLCJpZ25vcmVkRmllbGQiLCJkZWxldGUiLCJwcm9wZXJ0aWVzUGF0aHMiLCJBcnJheSIsImZyb20iLCJjb2x1bW5JbmZvcyIsInByb3BlcnR5UGF0aCIsImNvbHVtbkluZm8iLCJnZXRGaWVsZEluZm8iLCJlbnRpdHlQYXRoIiwiZ2V0TWV0YVBhdGgiLCJlbnRpdHlTZXREYXRhTW9kZWwiLCJyZWxhdGVkQ29sdW1uSW5mbyIsImZpbmQiLCJmaWVsZEluZm8iLCJhbm5vdGF0aW9uUGF0aCIsInByb3BlcnR5RGF0YU1vZGVsIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJjb252ZXJ0ZWRBbm5vdGF0aW9uIiwiY29udmVydE1ldGFNb2RlbENvbnRleHQiLCJ0YXJnZXRQcm9wZXJ0eSIsImdldENvbXBsaWFudFByb3BlcnR5IiwiZW50aXR5UHJvcGVydGllcyIsImtleSIsInRhcmdldE9iamVjdCIsImlzUHJvcGVydHkiLCJJc0ltYWdlVVJMIiwiaXNEYXRhRmllbGRUeXBlcyIsImhhc093blByb3BlcnR5IiwiVmFsdWUiLCIkdGFyZ2V0IiwidW5pdFByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSIsImlzTXVsdGlWYWx1ZUZpZWxkIiwiaGFzVmFsdWVIZWxwIiwiQ29tbW9uIiwiVmFsdWVMaXN0UmVsZXZhbnRRdWFsaWZpZXJzIiwiaXNIaWRkZW5Gb3JDb250ZXh0cyIsImV4cEJpbmRpbmciLCJhbnlPYmplY3QiLCJfanN4IiwiQW55IiwiYW55Qm9vbGVhbiIsInNldE1vZGVsIiwiaXNIaWRkZW4iLCJjb250ZXh0Iiwic2V0QmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nIiwiZ2V0RXh0ZXJuYWxWYWx1ZSIsImRlc3Ryb3kiLCJ1cGRhdGFibGVDb250ZXh0UHJvcGVydHkiLCJnZXRGaWVsZFByb3BlcnRpZXMiLCJkZWVwQ2xvbmUiLCJmaWVsZHNJbmZvIiwiZGF0YVByb3BlcnR5UGF0aCIsImdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgiLCJ1bml0T3JDdXJyZW5jeVByb3BlcnR5UGF0aCIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoIiwiaW5wdXRUeXBlIiwiZ2V0SW5wdXRUeXBlIiwiZ2V0UmVsYXRpdmVQYXRocyIsImZpZWxkRGF0YSIsInZpc2liaWxpdHlCaW5kaW5ncyIsImlzVmlzaWJsZSIsImVkaXRNb2RlIiwiZ2V0RWRpdE1vZGUiLCJjb25zdGFudCIsIkxhYmVsIiwiaXNGaWVsZFJlcXVpcmVkIiwiZ2V0UmVxdWlyZWRFeHByZXNzaW9uIiwiZGVzY3JpcHRpb25QYXRoIiwiZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgiLCJ0ZXh0QmluZGluZyIsImV4cHJlc3Npb24iLCJnZXRUZXh0QmluZGluZyIsImRpc3BsYXlNb2RlIiwiZ2V0RGlzcGxheU1vZGUiLCJJc1RpbWV6b25lIiwicmVhZE9ubHlFeHByZXNzaW9uIiwiaXNSZWFkT25seUV4cHJlc3Npb24iLCJjbGVhcmFibGUiLCJpc1Byb3BlcnR5Q2xlYXJhYmxlIiwiZW1wdHlWYWx1ZSIsImdldEVtcHR5VmFsdWVGb3JQcm9wZXJ0eSIsInNlbGVjdEl0ZW1zIiwiZ2V0RGF0YUZvck9wZW5pbmdEaWFsb2ciLCJhbGwiLCJpc0ZpZWxkVmlzaWJsZSIsInJ1bnRpbWVTZWxlY3Rpb24iLCJnZXRSdW50aW1lU2VsZWN0aW9uIiwiZ2V0RGVmYXVsdFNlbGVjdE9wdGlvbnMiLCJnZW5lcmF0ZUZpZWxkc1Byb3BlcnRpZXMiLCJnZW5lcmF0ZUVudGl0eUZpZWxkc1Byb3BlcnRpZXMiLCJtaXNzaW5nQ29udGV4dHMiLCJiaW5kaW5nc1RvRmV0Y2giLCJjb25jYXQiLCJwYXRoSW5Nb2RlbCIsImdldE1pc3NpbmdEYXRhIiwiYmluZGluZ3NUb1Jlc29sdmUiLCJiaW5kaW5ncyIsImdldFZpZXdEYXRhIiwiY29udmVydGVyVHlwZSIsImRpc3BsYXllZFByb3BlcnRpZXMiLCJldmVyeSIsInByb21pc2VzIiwiY29udHJvbHMiLCJtb2RlbCIsImJpbmRpbmciLCJmaWx0ZXIiLCJzdGFydHNXaXRoIiwicGFyYW1ldGVycyIsImJpbmRpbmdUeXBlIiwiY29udHJvbEJpbmRpbmciLCJzZXRCaW5kaW5nTW9kZSIsIkJpbmRpbmdNb2RlIiwiT25lVGltZSIsImlzQSIsImdldEJpbmRpbmdzIiwibmVzdGVkQmluZGluZyIsInJlcXVlc3RWYWx1ZSIsInByb21pc2UiLCJwcm9wZXJ0eSIsIm51bGxhYmxlIiwiYW55IiwiZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbiIsInZhbHVlIiwiZ2V0QmluZGluZ0luZm8iLCJnZXRUeXBlIiwicGFyc2VWYWx1ZSIsImRpc3RpbmN0TWFwIiwic2VsZWN0T3B0aW9ucyIsImFueVRleHQiLCJzZWxlY3RlZENvbnRleHQiLCJwcm9wZXJ0eVRleHQiLCJoYXMiLCJhZGQiLCJ0ZXh0IiwidW5pdE9yQ3VycmVuY3lWYWx1ZSIsImdldE9iamVjdCIsInByb3BlcnR5VmFsdWUiLCJrZWVwRW50cnkiLCJTcGVjaWZpY1NlbGVjdEtleXMiLCJLZWVwS2V5IiwiZGVmYXVsdE9wdGlvbnMiLCJSZXBsYWNlS2V5IiwiQ2xlYXJGaWVsZFZhbHVlS2V5IiwiaXNFZGl0YWJsZUVkaXRNb2RlIiwiRmllbGRFZGl0TW9kZSIsIkVkaXRhYmxlIiwiZ2V0RmllbGRFZGl0YWJsZSIsIk9iamVjdCIsImtleXMiLCJhbnlDb250cm9sIiwiZGF0YUZpZWxkQ29udmVydGVkIiwiZGF0YU1vZGVsUGF0aCIsImVkaXRTdHlsZVByb3BlcnRpZXMiLCJzZXRFZGl0U3R5bGVQcm9wZXJ0aWVzIiwiZWRpdFN0eWxlIiwiaXNTdGF0aWNFZGl0TW9kZSIsImlzRWRpdGFibGUiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIk1hc3NFZGl0RGlhbG9nSGVscGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFByaW1pdGl2ZVR5cGUsIFByb3BlcnR5LCBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBEYXRhRmllbGQsIERhdGFGaWVsZEZvckFjdGlvbiwgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiwgSGVhZGVySW5mbyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBkZWVwQ2xvbmUgZnJvbSBcInNhcC9iYXNlL3V0aWwvZGVlcENsb25lXCI7XG5pbXBvcnQgdHlwZSB7IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQge1xuXHRjb21waWxlRXhwcmVzc2lvbixcblx0Y29uc3RhbnQsXG5cdGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24sXG5cdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbixcblx0cGF0aEluTW9kZWxcbn0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgVGVtcGxhdGVDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL1RlbXBsYXRlQ29tcG9uZW50XCI7XG5pbXBvcnQgQW55IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9scy9BbnlcIjtcbmltcG9ydCB7IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0LCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGlzRGF0YUZpZWxkVHlwZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9hbm5vdGF0aW9ucy9EYXRhRmllbGRcIjtcbmltcG9ydCB0eXBlIHsgTWFzc0VkaXRUYWJsZUNvbmZpZ3VyYXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vVGFibGVcIjtcbmltcG9ydCB0eXBlIHsgQW5ub3RhdGlvblRhYmxlQ29sdW1uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL3RhYmxlL0NvbHVtbnNcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgUmVzb3VyY2VNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBpc1Byb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgZW5oYW5jZURhdGFNb2RlbFBhdGgsIGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgsIGdldFJlbGF0aXZlUGF0aHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBnZXREaXNwbGF5TW9kZSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0Rpc3BsYXlNb2RlRm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBpc1JlYWRPbmx5RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0ZpZWxkQ29udHJvbEhlbHBlclwiO1xuaW1wb3J0IHtcblx0Z2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoLFxuXHRnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aCxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgsXG5cdGhhc1ZhbHVlSGVscFxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0RWRpdE1vZGUsIGdldFJlcXVpcmVkRXhwcmVzc2lvbiwgaXNNdWx0aVZhbHVlRmllbGQsIGlzVmlzaWJsZSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IHsgZ2V0VGV4dEJpbmRpbmcsIHNldEVkaXRTdHlsZVByb3BlcnRpZXMgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWVsZC9GaWVsZFRlbXBsYXRpbmdcIjtcbmltcG9ydCB0eXBlIHsgRmllbGRCbG9ja1Byb3BlcnRpZXMgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC9maWVsZC9GaWVsZFN0cnVjdHVyZUhlbHBlclwiO1xuaW1wb3J0IHR5cGUgVGFibGVBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVBUElcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgRmllbGRFZGl0TW9kZSBmcm9tIFwic2FwL3VpL21kYy9lbnVtcy9GaWVsZEVkaXRNb2RlXCI7XG5pbXBvcnQgQmluZGluZ01vZGUgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nTW9kZVwiO1xuaW1wb3J0IHR5cGUgQ29tcG9zaXRlQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0NvbXBvc2l0ZUJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIFByb3BlcnR5QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL1Byb3BlcnR5QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFQcm9wZXJ0eUJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YVByb3BlcnR5QmluZGluZ1wiO1xuaW1wb3J0IE1hc3NFZGl0RGlhbG9nIGZyb20gXCIuL01hc3NFZGl0RGlhbG9nXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdJbmZvLCBNYXNzRmllbGRQcm9wZXJ0aWVzLCBTZWxlY3RJbmZvIH0gZnJvbSBcIi4vbGlicmFyeVwiO1xuaW1wb3J0IHsgU3BlY2lmaWNTZWxlY3RLZXlzIH0gZnJvbSBcIi4vbGlicmFyeVwiO1xuXG50eXBlIERhdGFGaWVsZFR5cGVzID0gRGF0YUZpZWxkIHwgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiB8IERhdGFGaWVsZEZvckFjdGlvbjtcbnR5cGUgRmllbGRJbmZvID0ge1xuXHRrZXk6IHN0cmluZztcblx0cHJvcGVydHlEYXRhTW9kZWw6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+O1xuXHR0YXJnZXRQcm9wZXJ0eTogUHJvcGVydHk7XG5cdGxhYmVsOiBzdHJpbmc7XG5cdGNvbnZlcnRlZEFubm90YXRpb246IERhdGFGaWVsZFR5cGVzO1xufTtcblxudHlwZSBCaW5kaW5nVG9GZXRjaCA9IEJpbmRpbmdJbmZvICYgeyBjb250ZXh0cz86IE9EYXRhVjRDb250ZXh0W10gfTtcblxuLyoqXG4gKiBEaXNwbGF5IHRoZSBtYXNzRWRpdCBkaWFsb2cuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hc3NFZGl0RGlhbG9nSGVscGVyIHtcblx0cHJpdmF0ZSByZWFkb25seSB0YWJsZTogVGFibGU7XG5cblx0cHJpdmF0ZSByZWFkb25seSBvbkNvbnRleHRNZW51OiBib29sZWFuO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgb25EaWFsb2dDbG9zZTogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgdmlldzogRkVWaWV3O1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgbWF4QW5hbHl6ZWRSb3dzID0gMzA7XG5cblx0cHJpdmF0ZSBjb250ZXh0czogT0RhdGFWNENvbnRleHRbXTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGFuYWx5emVkQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10gPSBbXTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGRlZ3JhZGVkTW9kZTogYm9vbGVhbjtcblxuXHRwcml2YXRlIHJlYWRvbmx5IG1hbmlmZXN0U2V0dGluZ3M6IE1hc3NFZGl0VGFibGVDb25maWd1cmF0aW9uO1xuXG5cdHByaXZhdGUgZmllbGRQcm9wZXJ0aWVzOiBNYXNzRmllbGRQcm9wZXJ0aWVzW10gPSBbXTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGlzQWRhcHRhdGlvbjogYm9vbGVhbjtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGhlYWRlckluZm86IEhlYWRlckluZm8gfCB1bmRlZmluZWQ7XG5cblx0bWFzc0VkaXREaWFsb2c6IE1hc3NFZGl0RGlhbG9nIHwgdW5kZWZpbmVkO1xuXG5cdGNvbnN0cnVjdG9yKHByb3BzOiB7IHRhYmxlOiBUYWJsZTsgb25Db250ZXh0TWVudTogYm9vbGVhbjsgb25DbG9zZT86ICgpID0+IHZvaWQgfSkge1xuXHRcdGNvbnN0IGVudGl0eVR5cGVQYXRoID0gKHByb3BzLnRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJKS5nZXRUYWJsZURlZmluaXRpb24oKS5hbm5vdGF0aW9uLmNvbGxlY3Rpb24sXG5cdFx0XHRtZXRhTW9kZWwgPSAocHJvcHMudGFibGUuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5nZXRNZXRhTW9kZWwoKTtcblxuXHRcdHRoaXMudGFibGUgPSBwcm9wcy50YWJsZTtcblx0XHR0aGlzLm1hbmlmZXN0U2V0dGluZ3MgPSAodGhpcy50YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuZ2V0VGFibGVEZWZpbml0aW9uKCkuY29udHJvbC5tYXNzRWRpdDtcblx0XHR0aGlzLm9uQ29udGV4dE1lbnUgPSBwcm9wcy5vbkNvbnRleHRNZW51O1xuXHRcdHRoaXMub25EaWFsb2dDbG9zZSA9IHByb3BzLm9uQ2xvc2U7XG5cdFx0dGhpcy52aWV3ID0gQ29tbW9uVXRpbHMuZ2V0VGFyZ2V0Vmlldyh0aGlzLnRhYmxlKTtcblx0XHR0aGlzLmNvbnRleHRzID0gdGhpcy5mZXRjaENvbnRleHRzRm9yRWRpdCgpO1xuXHRcdHRoaXMuZGVncmFkZWRNb2RlID0gdGhpcy5jb250ZXh0cy5sZW5ndGggPiB0aGlzLm1heEFuYWx5emVkUm93cztcblx0XHR0aGlzLmFuYWx5emVkQ29udGV4dHMgPSB0aGlzLmRlZ3JhZGVkTW9kZSA/IHRoaXMuY29udGV4dHMuc2xpY2UoMCwgdGhpcy5tYXhBbmFseXplZFJvd3MpIDogdGhpcy5jb250ZXh0cztcblx0XHR0aGlzLmlzQWRhcHRhdGlvbiA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLnRhYmxlKS5pc0FkYXB0YXRpb25Nb2RlKCk7XG5cdFx0dGhpcy5oZWFkZXJJbmZvID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRDb250ZXh0KGVudGl0eVR5cGVQYXRoKSkudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5VST8uSGVhZGVySW5mbztcblx0fVxuXG5cdC8qKlxuXHQgKiBPcGVucyB0aGUgbWFzcyBlZGl0IGRpYWxvZyBpZiBhbGwgc2VsZWN0ZWQgY29udGV4dHMgYXJlIGVkaXRhYmxlLFxuXHQgKiBvdGhlcndpc2UgYSBtZXNzYWdlIGJveCB0byBjb25maXJtIHRoZSBzZWxlY3Rpb24uXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uIG9wZW4gb2YgdGhlIG1hc3MgZWRpdCBkaWFsb2cuXG5cdCAqL1xuXHRhc3luYyBvcGVuKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB0ZW1wbGF0ZUNvbXBvbmVudCA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcih0aGlzLnZpZXcpIGFzIFRlbXBsYXRlQ29tcG9uZW50O1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLnRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdGludGVybmFsTW9kZWxQcm9wZXJ0eSA9ICF0aGlzLm9uQ29udGV4dE1lbnUgPyBcIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1wiIDogXCJjb250ZXh0bWVudS9udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcIixcblx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cyA9IGludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGludGVybmFsTW9kZWxQcm9wZXJ0eSkgfHwgMDtcblx0XHRcdHRoaXMuZmllbGRQcm9wZXJ0aWVzID0gYXdhaXQgdGhpcy5nZXRGaWVsZHNQcm9wZXJ0aWVzRnJvbUluZm8odGhpcy5nZXRGaWVsZHNJbmZvKCkpO1xuXHRcdFx0aWYgKCF0aGlzLmlzQWRhcHRhdGlvbikge1xuXHRcdFx0XHQvLyBubyBmaWVsZCB0byBlZGl0XG5cdFx0XHRcdGlmICghdGhpcy5maWVsZFByb3BlcnRpZXMuc29tZSgoZmllbGQpID0+IGZpZWxkLnZpc2libGUpKSB7XG5cdFx0XHRcdFx0dGhpcy5ub0ZpZWxkSW5mb3JtYXRpb24oKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly9Tb21lIHJvd3MgYXJlIG5vdCBlZGl0YWJsZSAtPiBkbyB3ZSB3YW50IHRvIGNvbnRpbnVlP1xuXHRcdFx0XHRpZiAodGhpcy5jb250ZXh0cy5sZW5ndGggIT09IHNlbGVjdGVkQ29udGV4dHMpIHtcblx0XHRcdFx0XHR0aGlzLmNvbnRleHRzID0gYXdhaXQgdGhpcy5jb25maXJtU2VsZWN0aW9uKHRoaXMuY29udGV4dHMsIHNlbGVjdGVkQ29udGV4dHMpO1xuXHRcdFx0XHRcdGlmICghdGhpcy5jb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdC8vIHRoZSB1c2VyIGRvZXNuJ3Qgd2FudCB0byBjb250aW51ZVxuXHRcdFx0XHRcdFx0dGhpcy5vbkRpYWxvZ0Nsb3NlPy4oKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGF3YWl0IHRlbXBsYXRlQ29tcG9uZW50LnJ1bkFzT3duZXIoYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHR0aGlzLm1hc3NFZGl0RGlhbG9nID0gbmV3IE1hc3NFZGl0RGlhbG9nKHtcblx0XHRcdFx0XHR0YWJsZTogdGhpcy50YWJsZSxcblx0XHRcdFx0XHRjb250ZXh0czogdGhpcy5jb250ZXh0cyxcblx0XHRcdFx0XHRmaWVsZFByb3BlcnRpZXM6IHRoaXMuZmllbGRQcm9wZXJ0aWVzXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRjb25zdCBkaWFsb2cgPSBhd2FpdCB0aGlzLm1hc3NFZGl0RGlhbG9nLmNyZWF0ZSgpO1xuXHRcdFx0XHRkaWFsb2cuYXR0YWNoQmVmb3JlQ2xvc2UoKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMub25EaWFsb2dDbG9zZT8uKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRkaWFsb2cub3BlbigpO1xuXHRcdFx0XHRjb25zdCByZXF1aXJlZERhdGFQcm9taXNlID0gdGhpcy5tYXNzRWRpdERpYWxvZy5nZXRSZXF1aXJlZERhdGFQcm9taXNlKCk7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5nZXREYXRhQWZ0ZXJPcGVuaW5nRGlhbG9nKHRoaXMuZmllbGRQcm9wZXJ0aWVzKTtcblx0XHRcdFx0XHRyZXF1aXJlZERhdGFQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJNYXNzIEVkaXQ6IFNvbWV0aGluZyB3ZW50IHdyb25nIGluIG1hc3MgZWRpdCBkaWFsb2cgdG8gZ2V0IHJlcXVpcmVkIGRhdGEuXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0cmVxdWlyZWREYXRhUHJvbWlzZS5yZWplY3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIk1hc3MgRWRpdDogU29tZXRoaW5nIHdlbnQgd3JvbmcgaW4gbWFzcyBlZGl0IGRpYWxvZyBjcmVhdGlvbi5cIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogT3BlbnMgdGhlIG1lc3NhZ2UgYm94IHRvIG5vdGlmeSBubyBmaWVsZHMgYXJlIGVkaXRhYmxlLlxuXHQgKi9cblx0cHJpdmF0ZSBub0ZpZWxkSW5mb3JtYXRpb24oKTogdm9pZCB7XG5cdFx0Y29uc3QgdmlzaWJsZUZpZWxkc0Zyb21NYW5pZmVzdCA9ICh0aGlzLnRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJKS5nZXRUYWJsZURlZmluaXRpb24oKS5jb250cm9sLm1hc3NFZGl0LnZpc2libGVGaWVsZHM7XG5cdFx0Y29uc3QgcmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLm1hY3Jvc1wiKSBhcyBSZXNvdXJjZUJ1bmRsZTtcblx0XHRsZXQgbWVzc2FnZSA9IFwiXCIsXG5cdFx0XHRtZXNzYWdlRGV0YWlsO1xuXHRcdGlmICh2aXNpYmxlRmllbGRzRnJvbU1hbmlmZXN0Lmxlbmd0aCA+IDApIHtcblx0XHRcdG1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfTk9fRURJVEFCTEVfRklFTERTX1dJVEhfTUFOSUZFU1RcIiwgW1xuXHRcdFx0XHR0aGlzLmdldFJlc291cmNlVGV4dCh0aGlzLmhlYWRlckluZm8/LlR5cGVOYW1lKSA/PyByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfRElBTE9HX0RFRkFVTFRfVFlQRU5BTUVcIilcblx0XHRcdF0pO1xuXHRcdFx0bWVzc2FnZURldGFpbCA9IGA8dWw+XG5cdFx0XHQke3RoaXMuZmllbGRQcm9wZXJ0aWVzXG5cdFx0XHRcdC5yZWR1Y2UoKGZpZWxkczogc3RyaW5nW10sIGZpZWxkUHJvcGVydHkpID0+IHtcblx0XHRcdFx0XHRpZiAodmlzaWJsZUZpZWxkc0Zyb21NYW5pZmVzdC5pbmNsdWRlcyhmaWVsZFByb3BlcnR5LnByb3BlcnR5SW5mby5yZWxhdGl2ZVBhdGgpKSB7XG5cdFx0XHRcdFx0XHRmaWVsZHMucHVzaChgPGxpPiR7ZmllbGRQcm9wZXJ0eS5sYWJlbH08L2xpPmApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gZmllbGRzO1xuXHRcdFx0XHR9LCBbXSlcblx0XHRcdFx0LmpvaW4oXCJcIil9IDwvdWw+YDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9OT19FRElUQUJMRV9GSUVMRFNfREVGQVVMVFwiKTtcblx0XHR9XG5cblx0XHRNZXNzYWdlQm94LmluZm9ybWF0aW9uKG1lc3NhZ2UsIHtcblx0XHRcdGRldGFpbHM6IG1lc3NhZ2VEZXRhaWwsXG5cdFx0XHRvbkNsb3NlOiAoKSA9PiB7XG5cdFx0XHRcdHRoaXMub25EaWFsb2dDbG9zZT8uKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogT3BlbnMgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2cgdG8gdmFsaWRhdGUgdGhlIHNlbGVjdGVkIGNvbnRleHRzLlxuXHQgKiBAcGFyYW0gY29udGV4dHMgVGhlIGNvbnRleHRzIHNldCBhcyB1cGRhdGFibGVcblx0ICogQHBhcmFtIHNlbGVjdGVkQ29udGV4dHMgIFRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgY29udGV4dHNcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdGhlIGNvbnRleHRzIHRvIGJlIGZpbmFsbHkgbWFuYWdlZC5cblx0ICovXG5cdHByaXZhdGUgYXN5bmMgY29uZmlybVNlbGVjdGlvbihjb250ZXh0czogT0RhdGFWNENvbnRleHRbXSwgc2VsZWN0ZWRDb250ZXh0czogbnVtYmVyKTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dFtdPiB7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IFJlc291cmNlTW9kZWxIZWxwZXIuZ2V0UmVzb3VyY2VNb2RlbCh0aGlzLnRhYmxlKTtcblx0XHRjb25zdCBjb3JlUmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikgYXMgUmVzb3VyY2VCdW5kbGU7XG5cblx0XHRjb25zdCB1cGRhdGFibGVDb250ZXh0cyA9IGNvbnRleHRzLmxlbmd0aDtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHRhYmxlQVBJID0gdGhpcy50YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSTtcblx0XHRcdFx0Y29uc3QgZWRpdEJ1dHRvbiA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfTUFTU19FRElUX0NPTkZJUk1fQlVUVE9OX1RFWFRcIiksXG5cdFx0XHRcdFx0Y2FuY2VsQnV0dG9uID0gY29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9DQU5DRUxcIiksXG5cdFx0XHRcdFx0bWV0YU1vZGVsID0gKHRoaXMudGFibGUuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHR0eXBlTmFtZSA9XG5cdFx0XHRcdFx0XHR0aGlzLmdldFJlc291cmNlVGV4dCh0aGlzLmhlYWRlckluZm8/LlR5cGVOYW1lKSA/PyByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX01BU1NfRURJVF9ESUFMT0dfREVGQVVMVF9UWVBFTkFNRVwiKSxcblx0XHRcdFx0XHR0eXBlTmFtZVBsdXJhbCA9XG5cdFx0XHRcdFx0XHR0aGlzLmdldFJlc291cmNlVGV4dCh0aGlzLmhlYWRlckluZm8/LlR5cGVOYW1lUGx1cmFsKSA/P1xuXHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19NQVNTX0VESVRfRElBTE9HX0RFRkFVTFRfVFlQRU5BTUVfUExVUkFMXCIpLFxuXHRcdFx0XHRcdG1lc3NhZ2VEZXRhaWwgPVxuXHRcdFx0XHRcdFx0TW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwsIHRoaXMudGFibGUuZGF0YShcInRhcmdldENvbGxlY3Rpb25QYXRoXCIpKSAmJiB0YWJsZUFQSS5yZWFkT25seVxuXHRcdFx0XHRcdFx0XHQ/IHRoaXMuZ2V0TWVzc2FnZURldGFpbEZvck5vbkVkaXRhYmxlKHR5cGVOYW1lLCB0eXBlTmFtZVBsdXJhbClcblx0XHRcdFx0XHRcdFx0OiBcIlwiO1xuXG5cdFx0XHRcdE1lc3NhZ2VCb3gud2FybmluZyhcblx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX01BU1NfRURJVF9DT05GSVJNX01FU1NBR0VcIiwgW1xuXHRcdFx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cyAtIHVwZGF0YWJsZUNvbnRleHRzLFxuXHRcdFx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cyxcblx0XHRcdFx0XHRcdHVwZGF0YWJsZUNvbnRleHRzLFxuXHRcdFx0XHRcdFx0dHlwZU5hbWVQbHVyYWxcblx0XHRcdFx0XHRdKSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRkZXRhaWxzOiBtZXNzYWdlRGV0YWlsLFxuXHRcdFx0XHRcdFx0YWN0aW9uczogW2VkaXRCdXR0b24sIGNhbmNlbEJ1dHRvbl0sXG5cdFx0XHRcdFx0XHRlbXBoYXNpemVkQWN0aW9uOiBlZGl0QnV0dG9uLFxuXHRcdFx0XHRcdFx0b25DbG9zZTogZnVuY3Rpb24gKHNlbGVjdGlvbjogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoc2VsZWN0aW9uID09PSBlZGl0QnV0dG9uID8gY29udGV4dHMgOiBbXSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0TG9nLmVycm9yKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgdGV4dCBhY2NvcmRpbmcgdG8gYW4gYW5ub3RhdGlvbi5cblx0ICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb25cblx0ICogQHJldHVybnMgVGhlIHRleHQuXG5cdCAqL1xuXHRwcml2YXRlIGdldFJlc291cmNlVGV4dChhbm5vdGF0aW9uOiBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZTxTdHJpbmc+IHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoIWFubm90YXRpb24pIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dEZyb21FeHBCaW5kaW5nU3RyaW5nKFxuXHRcdFx0Y29tcGlsZUV4cHJlc3Npb24oZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKGFubm90YXRpb24pKSBhcyBzdHJpbmcsXG5cdFx0XHR0aGlzLnZpZXdcblx0XHQpPy50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIG1lc3NhZ2UgZGV0YWlsIG9mIHRoZSBjb25maXJtYXRpb24gZGlhbG9nLlxuXHQgKiBAcGFyYW0gdHlwZU5hbWUgVGhlIHR5cGUgbmFtZSBvZiB0aGUgZW50aXR5IHNldFxuXHQgKiBAcGFyYW0gdHlwZU5hbWVQbHVyYWwgVGhlIHR5cGUgbmFtZSBwbHVyYWwgb2YgdGhlIGVudGl0eSBzZXRcblx0ICogQHJldHVybnMgVGhlIHRleHQuXG5cdCAqL1xuXHRwcml2YXRlIGdldE1lc3NhZ2VEZXRhaWxGb3JOb25FZGl0YWJsZSh0eXBlTmFtZTogc3RyaW5nLCB0eXBlTmFtZVBsdXJhbDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUubWFjcm9zXCIpIGFzIFJlc291cmNlQnVuZGxlO1xuXHRcdHJldHVybiBgPHA+PHN0cm9uZz4ke3Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9DT05GSVJNX01FU1NBR0VfREVUQUlMX0hFQURFUlwiKX08L3N0cm9uZz48L3A+XFxuXG5cdFx0XHQ8cD4ke3Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9DT05GSVJNX01FU1NBR0VfREVUQUlMX1JFQVNPTlwiLCBbdHlwZU5hbWVQbHVyYWxdKX08L3A+XFxuXG5cdFx0XHQ8dWw+XG5cdFx0XHRcdDxsaT4ke3Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9DT05GSVJNX01FU1NBR0VfREVUQUlMX1JFQVNPTl9EUkFGVFwiLCBbdHlwZU5hbWVdKX08L2xpPlxuXHRcdFx0XHQ8bGk+JHtyZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfQ09ORklSTV9NRVNTQUdFX0RFVEFJTF9SRUFTT05fTk9OX0VESVRBQkxFXCIsIFt0eXBlTmFtZV0pfTwvbGk+XG5cdFx0XHQ8L3VsPmA7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZW50aXR5IHdoaWNoIGlzIGNvbXBsaWFudCBmb3IgYSBNYXNzIEVkaXQuXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIHRoZSBmaWVsZCBpbmZvcm1hdGlvbi5cblx0ICovXG5cblx0cHJpdmF0ZSBnZXRFbnRpdHlGaWVsZHNJbmZvKCk6IEZpZWxkSW5mb1tdIHtcblx0XHRjb25zdCB0YWJsZUFQSSA9IHRoaXMudGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0Y29uc3QgY29sdW1uc0RhdGEgPSB0YWJsZUFQSS5nZXRUYWJsZURlZmluaXRpb24oKS5jb2x1bW5zO1xuXG5cdFx0Y29uc3QgcHJvcGVydGllc0tleXMgPSBuZXcgU2V0KFxuXHRcdFx0Y29sdW1uc0RhdGEucmVkdWNlKChmaWVsZHM6IHN0cmluZ1tdLCBjb2x1bW4pID0+IHtcblx0XHRcdFx0aWYgKGNvbHVtbi50eXBlID09PSBcIkFubm90YXRpb25cIikge1xuXHRcdFx0XHRcdGZpZWxkcy5wdXNoKGNvbHVtbi5uYW1lKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmllbGRzO1xuXHRcdFx0fSwgW10pXG5cdFx0KTtcblx0XHRyZXR1cm4gdGhpcy50cmFuc2Zvcm1QYXRoc1RvSW5mbyhwcm9wZXJ0aWVzS2V5cyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvcGVydGllcyBvZiB0aGUgdGFibGUgd2hpY2ggYXJlIGNvbXBsaWFudCBmb3IgYSBNYXNzIEVkaXQuXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIHRoZSBmaWVsZCBpbmZvcm1hdGlvbi5cblx0ICovXG5cdHByaXZhdGUgZ2V0RmllbGRzSW5mbygpOiBGaWVsZEluZm9bXSB7XG5cdFx0Y29uc3QgcHJvcGVydGllc0tleXMgPVxuXHRcdFx0dGhpcy5tYW5pZmVzdFNldHRpbmdzLnZpc2libGVGaWVsZHMubGVuZ3RoID4gMFxuXHRcdFx0XHQ/IG5ldyBTZXQodGhpcy5tYW5pZmVzdFNldHRpbmdzLnZpc2libGVGaWVsZHMpXG5cdFx0XHRcdDogbmV3IFNldCh0aGlzLnRhYmxlLmdldENvbHVtbnMoKS5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmdldFByb3BlcnR5S2V5KCkpKTtcblxuXHRcdGlmICh0aGlzLm1hbmlmZXN0U2V0dGluZ3MuaWdub3JlZEZpZWxkcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGlnbm9yZWRGaWVsZCBvZiB0aGlzLm1hbmlmZXN0U2V0dGluZ3MuaWdub3JlZEZpZWxkcykge1xuXHRcdFx0XHRwcm9wZXJ0aWVzS2V5cy5kZWxldGUoaWdub3JlZEZpZWxkKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNmb3JtUGF0aHNUb0luZm8ocHJvcGVydGllc0tleXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRyYW5zZm9ybXMgYSBzZXQgb2YgcHJvcGVydHkgcGF0aHMgdG8gYW4gYXJyYXkgb2YgZmllbGQgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwcm9wZXJ0aWVzUGF0aHMgVGhlIHNldCBvZiBwcm9wZXJ0eSBwYXRoc1xuXHQgKiBAcmV0dXJucyBBcnJheSBvZiB0aGUgZmllbGQgaW5mb3JtYXRpb24uXG5cdCAqL1xuXHRwcml2YXRlIHRyYW5zZm9ybVBhdGhzVG9JbmZvKHByb3BlcnRpZXNQYXRoczogU2V0PHN0cmluZz4pOiBGaWVsZEluZm9bXSB7XG5cdFx0cmV0dXJuIEFycmF5LmZyb20ocHJvcGVydGllc1BhdGhzKS5yZWR1Y2UoKGNvbHVtbkluZm9zOiBGaWVsZEluZm9bXSwgcHJvcGVydHlQYXRoKSA9PiB7XG5cdFx0XHRjb25zdCBjb2x1bW5JbmZvID0gdGhpcy5nZXRGaWVsZEluZm8ocHJvcGVydHlQYXRoKTtcblx0XHRcdGlmIChjb2x1bW5JbmZvKSB7XG5cdFx0XHRcdGNvbHVtbkluZm9zLnB1c2goY29sdW1uSW5mbyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY29sdW1uSW5mb3M7XG5cdFx0fSwgW10pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcm9wZXJ0eS5cblx0ICogQHBhcmFtIHByb3BlcnR5UGF0aFxuXHQgKiBAcmV0dXJucyBGaWVsZCBpbmZvcm1hdGlvbi5cblx0ICovXG5cdHByaXZhdGUgZ2V0RmllbGRJbmZvKHByb3BlcnR5UGF0aDogc3RyaW5nKTogRmllbGRJbmZvIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBjb2x1bW5zRGF0YSA9ICh0aGlzLnRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJKS5nZXRUYWJsZURlZmluaXRpb24oKS5jb2x1bW5zO1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9ICh0aGlzLnRhYmxlLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgZW50aXR5UGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aCh0aGlzLnRhYmxlLmRhdGEoXCJtZXRhUGF0aFwiKSk7XG5cdFx0Y29uc3QgZW50aXR5U2V0RGF0YU1vZGVsID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRDb250ZXh0KGVudGl0eVBhdGgpKTtcblx0XHRjb25zdCByZWxhdGVkQ29sdW1uSW5mbyA9IGNvbHVtbnNEYXRhLmZpbmQoKGZpZWxkSW5mbykgPT4gZmllbGRJbmZvLm5hbWUgPT09IHByb3BlcnR5UGF0aCAmJiBmaWVsZEluZm8udHlwZSA9PT0gXCJBbm5vdGF0aW9uXCIpO1xuXHRcdGlmIChyZWxhdGVkQ29sdW1uSW5mbykge1xuXHRcdFx0Y29uc3QgYW5ub3RhdGlvblBhdGggPSAocmVsYXRlZENvbHVtbkluZm8gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uKS5hbm5vdGF0aW9uUGF0aDtcblx0XHRcdGlmIChhbm5vdGF0aW9uUGF0aCAmJiBwcm9wZXJ0eVBhdGgpIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlEYXRhTW9kZWwgPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQcm9wZXJ0eT4oZW50aXR5U2V0RGF0YU1vZGVsLCBwcm9wZXJ0eVBhdGgpO1xuXHRcdFx0XHRjb25zdCBjb252ZXJ0ZWRBbm5vdGF0aW9uID0gY29udmVydE1ldGFNb2RlbENvbnRleHQobWV0YU1vZGVsLmdldENvbnRleHQoYW5ub3RhdGlvblBhdGgpKSBhc1xuXHRcdFx0XHRcdHwgRGF0YUZpZWxkXG5cdFx0XHRcdFx0fCBEYXRhRmllbGRGb3JBbm5vdGF0aW9uXG5cdFx0XHRcdFx0fCBEYXRhRmllbGRGb3JBY3Rpb247XG5cdFx0XHRcdGNvbnN0IHRhcmdldFByb3BlcnR5ID0gdGhpcy5nZXRDb21wbGlhbnRQcm9wZXJ0eShwcm9wZXJ0eURhdGFNb2RlbCwgY29udmVydGVkQW5ub3RhdGlvbik7XG5cdFx0XHRcdGlmICh0YXJnZXRQcm9wZXJ0eSAmJiBlbnRpdHlTZXREYXRhTW9kZWwudGFyZ2V0RW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmluY2x1ZGVzKHRhcmdldFByb3BlcnR5KSlcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0a2V5OiByZWxhdGVkQ29sdW1uSW5mby5rZXksXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eURhdGFNb2RlbCxcblx0XHRcdFx0XHRcdHRhcmdldFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0bGFiZWw6IHJlbGF0ZWRDb2x1bW5JbmZvLmxhYmVsID8/IHJlbGF0ZWRDb2x1bW5JbmZvLmtleSxcblx0XHRcdFx0XHRcdGNvbnZlcnRlZEFubm90YXRpb25cblx0XHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHByb3BlcnR5IHRvIGRpc3BsYXkgb24gdGhlIERpYWxvZy5cblx0ICogQHBhcmFtIHByb3BlcnR5RGF0YU1vZGVsIFRoZSBkYXRhTW9kZWxPYmplY3RQYXRoIG9mIHRoZSBjb2x1bW5cblx0ICogQHBhcmFtIGFubm90YXRpb24gIFRoZSBjb252ZXJ0ZWQgYW5ub3RhdGlvbiBvZiB0aGUgY29sdW1uXG5cdCAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0eSBpZiBpdCBpcyBjb21wbGlhbnQsIHVuZGVmaW5lZCBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgZ2V0Q29tcGxpYW50UHJvcGVydHkocHJvcGVydHlEYXRhTW9kZWw6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+LCBhbm5vdGF0aW9uOiBEYXRhRmllbGRUeXBlcyk6IFByb3BlcnR5IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCB0YXJnZXRPYmplY3QgPSBwcm9wZXJ0eURhdGFNb2RlbC50YXJnZXRPYmplY3Q7XG5cdFx0bGV0IHRhcmdldFByb3BlcnR5OiBQcm9wZXJ0eTtcblx0XHRpZiAoaXNQcm9wZXJ0eSh0YXJnZXRPYmplY3QpKSB7XG5cdFx0XHR0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldE9iamVjdDtcblx0XHRcdGlmICh0YXJnZXRPYmplY3QuYW5ub3RhdGlvbnMuVUk/LklzSW1hZ2VVUkwpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoaXNEYXRhRmllbGRUeXBlcyhhbm5vdGF0aW9uKSAmJiAhYW5ub3RhdGlvbi5oYXNPd25Qcm9wZXJ0eShcIkFjdGlvblwiKSkge1xuXHRcdFx0dGFyZ2V0UHJvcGVydHkgPSBhbm5vdGF0aW9uLlZhbHVlLiR0YXJnZXQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBDaGVjayBpZiB0aGUgZmllbGQgaXMgY29tcGxpYW50IGZvciB0aGUgTWFzc0VkaXRcblx0XHRjb25zdCB1bml0UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KHRhcmdldFByb3BlcnR5KTtcblx0XHRpZiAoXG5cdFx0XHRpc011bHRpVmFsdWVGaWVsZChwcm9wZXJ0eURhdGFNb2RlbCkgfHxcblx0XHRcdChoYXNWYWx1ZUhlbHAodGFyZ2V0UHJvcGVydHkpICYmIHRhcmdldFByb3BlcnR5LmFubm90YXRpb25zPy5Db21tb24/LlZhbHVlTGlzdFJlbGV2YW50UXVhbGlmaWVycykgfHwgLy8gY29udGV4dCBkZXBlbmRlbnQgVkggaXMgbm90IHN1cHBvcnRlZCBmb3IgTWFzcyBFZGl0LlxuXHRcdFx0KHVuaXRQcm9wZXJ0eSAmJiBoYXNWYWx1ZUhlbHAodW5pdFByb3BlcnR5KSAmJiB1bml0UHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uVmFsdWVMaXN0UmVsZXZhbnRRdWFsaWZpZXJzKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRyZXR1cm4gdGFyZ2V0UHJvcGVydHk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSBmaWVsZCBpcyBoaWRkZW4gZm9yIHRoZSBwcm92aWRlZCBjb250ZXh0cy5cblx0ICogQHBhcmFtIGV4cEJpbmRpbmcgVGhlIGV4cHJlc3Npb24gYmluZGluZyBvZiB0aGUgcHJvcGVydHkuXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGZpZWxkIGlzIGhpZGRlbiBmb3IgYWxsIGNvbnRleHRzLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgaXNIaWRkZW5Gb3JDb250ZXh0cyhleHBCaW5kaW5nOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbik6IGJvb2xlYW4ge1xuXHRcdGlmIChleHBCaW5kaW5nID09PSBcInRydWVcIikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gZWxzZSBpZiAoZXhwQmluZGluZyA9PT0gXCJmYWxzZVwiKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0Y29uc3QgYW55T2JqZWN0ID0gPEFueSBhbnlCb29sZWFuPXtleHBCaW5kaW5nfSAvPjtcblx0XHRhbnlPYmplY3Quc2V0TW9kZWwodGhpcy5hbmFseXplZENvbnRleHRzWzBdLmdldE1vZGVsKCkpO1xuXHRcdGNvbnN0IGlzSGlkZGVuID0gIXRoaXMuYW5hbHl6ZWRDb250ZXh0cy5maW5kKChjb250ZXh0KSA9PiB7XG5cdFx0XHRhbnlPYmplY3Quc2V0QmluZGluZ0NvbnRleHQoY29udGV4dCk7XG5cdFx0XHRyZXR1cm4gKGFueU9iamVjdC5nZXRCaW5kaW5nKFwiYW55Qm9vbGVhblwiKSBhcyBQcm9wZXJ0eUJpbmRpbmcpLmdldEV4dGVybmFsVmFsdWUoKTtcblx0XHR9KTtcblx0XHRhbnlPYmplY3QuZGVzdHJveSgpO1xuXHRcdHJldHVybiBpc0hpZGRlbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBzZWxlY3RlZCBjb250ZXh0IHNldCBhcyB1cGRhdGFibGUuXG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZXh0cy5cblx0ICovXG5cdHByaXZhdGUgZmV0Y2hDb250ZXh0c0ZvckVkaXQoKTogT0RhdGFWNENvbnRleHRbXSB7XG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLnRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIiksXG5cdFx0XHR1cGRhdGFibGVDb250ZXh0UHJvcGVydHkgPSAhdGhpcy5vbkNvbnRleHRNZW51ID8gXCJ1cGRhdGFibGVDb250ZXh0c1wiIDogXCJjb250ZXh0bWVudS91cGRhdGFibGVDb250ZXh0c1wiO1xuXHRcdHJldHVybiBpbnRlcm5hbE1vZGVsQ29udGV4dD8uZ2V0UHJvcGVydHkodXBkYXRhYmxlQ29udGV4dFByb3BlcnR5KSA/PyBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBtYXNzIGVkaXQgZmllbGRzLlxuXHQgKiBAcmV0dXJucyBUaGUgcHJvcGVydGllcyBvZiB0aGUgbWFzcyBlZGl0IGZpZWxkLlxuXHQgKi9cblx0Z2V0RmllbGRQcm9wZXJ0aWVzKCk6IE1hc3NGaWVsZFByb3BlcnRpZXNbXSB7XG5cdFx0cmV0dXJuIGRlZXBDbG9uZSh0aGlzLmZpZWxkUHJvcGVydGllcyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgbWFzcyBlZGl0IGZpZWxkcyBmcm9tIGFuIGFycmF5IG9mIGZpZWxkIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0gZmllbGRzSW5mbyBUaGUgZmllbGQgaW5mb3JtYXRpb24uXG5cdCAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBtYXNzIGVkaXQgZmllbGRzLlxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXRGaWVsZHNQcm9wZXJ0aWVzRnJvbUluZm8oZmllbGRzSW5mbzogRmllbGRJbmZvW10pOiBQcm9taXNlPE1hc3NGaWVsZFByb3BlcnRpZXNbXT4ge1xuXHRcdGNvbnN0IGZpZWxkUHJvcGVydGllczogTWFzc0ZpZWxkUHJvcGVydGllc1tdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGZpZWxkSW5mbyBvZiBmaWVsZHNJbmZvKSB7XG5cdFx0XHRjb25zdCB7IHRhcmdldFByb3BlcnR5LCBwcm9wZXJ0eURhdGFNb2RlbCwgY29udmVydGVkQW5ub3RhdGlvbiB9ID0gZmllbGRJbmZvO1xuXHRcdFx0Y29uc3QgZGF0YVByb3BlcnR5UGF0aCA9IGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgocHJvcGVydHlEYXRhTW9kZWwpO1xuXHRcdFx0aWYgKGRhdGFQcm9wZXJ0eVBhdGgpIHtcblx0XHRcdFx0Y29uc3QgdW5pdE9yQ3VycmVuY3lQcm9wZXJ0eVBhdGggPVxuXHRcdFx0XHRcdGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHlQYXRoKHRhcmdldFByb3BlcnR5KSB8fCBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eVBhdGgodGFyZ2V0UHJvcGVydHkpO1xuXHRcdFx0XHRjb25zdCBpbnB1dFR5cGUgPSB0aGlzLmdldElucHV0VHlwZShjb252ZXJ0ZWRBbm5vdGF0aW9uLCBwcm9wZXJ0eURhdGFNb2RlbCk7XG5cdFx0XHRcdGlmIChpbnB1dFR5cGUgJiYgcHJvcGVydHlEYXRhTW9kZWwudGFyZ2V0T2JqZWN0KSB7XG5cdFx0XHRcdFx0Y29uc3QgcmVsYXRpdmVQYXRoID0gZ2V0UmVsYXRpdmVQYXRocyhwcm9wZXJ0eURhdGFNb2RlbCk7XG5cdFx0XHRcdFx0Y29uc3QgZmllbGREYXRhID0ge1xuXHRcdFx0XHRcdFx0dmlzaWJpbGl0eUJpbmRpbmdzOiB7XG5cdFx0XHRcdFx0XHRcdGlzVmlzaWJsZTogY29tcGlsZUV4cHJlc3Npb24oaXNWaXNpYmxlKGNvbnZlcnRlZEFubm90YXRpb24pKSxcblx0XHRcdFx0XHRcdFx0ZWRpdE1vZGU6IGdldEVkaXRNb2RlKFxuXHRcdFx0XHRcdFx0XHRcdHRhcmdldFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5RGF0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdGNvbnZlcnRlZEFubm90YXRpb24sXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3RhbnQodHJ1ZSlcblx0XHRcdFx0XHRcdFx0KSBhcyBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvblxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHZpc2libGU6IHRydWUsIC8vYnkgZGVmYXVsdCB0aGUgZmllbGQgaXMgdmlzaWJsZVxuXHRcdFx0XHRcdFx0bGFiZWw6IGZpZWxkSW5mby5sYWJlbCB8fCAodGFyZ2V0UHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uPy5MYWJlbCBhcyBzdHJpbmcgfCB1bmRlZmluZWQpIHx8IGRhdGFQcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0XHRpc0ZpZWxkUmVxdWlyZWQ6IGdldFJlcXVpcmVkRXhwcmVzc2lvbihcblx0XHRcdFx0XHRcdFx0dGFyZ2V0UHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdGNvbnZlcnRlZEFubm90YXRpb24sXG5cdFx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0XHR7fSxcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlEYXRhTW9kZWxcblx0XHRcdFx0XHRcdCkgYXMgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvblBhdGg6IGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoKHByb3BlcnR5RGF0YU1vZGVsLnRhcmdldE9iamVjdCksXG5cdFx0XHRcdFx0XHR0ZXh0QmluZGluZzoge1xuXHRcdFx0XHRcdFx0XHRleHByZXNzaW9uOiBnZXRUZXh0QmluZGluZyhwcm9wZXJ0eURhdGFNb2RlbCwge1xuXHRcdFx0XHRcdFx0XHRcdGRpc3BsYXlNb2RlOiBnZXREaXNwbGF5TW9kZSh0YXJnZXRQcm9wZXJ0eSwgcHJvcGVydHlEYXRhTW9kZWwudGFyZ2V0RW50aXR5VHlwZSlcblx0XHRcdFx0XHRcdFx0fSkgYXMgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sXG5cdFx0XHRcdFx0XHRcdHR5cGU6XG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0UHJvcGVydHkudHlwZSA9PT0gXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIiB8fCB0YXJnZXRQcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uSXNUaW1lem9uZVxuXHRcdFx0XHRcdFx0XHRcdFx0PyBcImFueVRleHRcIlxuXHRcdFx0XHRcdFx0XHRcdFx0OiBcImFueVwiXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0cmVhZE9ubHlFeHByZXNzaW9uOiBpc1JlYWRPbmx5RXhwcmVzc2lvbih0YXJnZXRQcm9wZXJ0eSwgcmVsYXRpdmVQYXRoKSxcblx0XHRcdFx0XHRcdGlucHV0VHlwZSxcblx0XHRcdFx0XHRcdHByb3BlcnR5SW5mbzoge1xuXHRcdFx0XHRcdFx0XHRjbGVhcmFibGU6IHRoaXMuaXNQcm9wZXJ0eUNsZWFyYWJsZSh0YXJnZXRQcm9wZXJ0eSksXG5cdFx0XHRcdFx0XHRcdGVtcHR5VmFsdWU6IHRoaXMuZ2V0RW1wdHlWYWx1ZUZvclByb3BlcnR5KHRhcmdldFByb3BlcnR5LCBkYXRhUHJvcGVydHlQYXRoKSxcblx0XHRcdFx0XHRcdFx0a2V5OiBmaWVsZEluZm8ua2V5LFxuXHRcdFx0XHRcdFx0XHRyZWxhdGl2ZVBhdGg6IGRhdGFQcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0XHRcdHVuaXRPckN1cnJlbmN5UHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0c2VsZWN0SXRlbXM6IFtdIGFzIFNlbGVjdEluZm9bXVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0ZmllbGRQcm9wZXJ0aWVzLnB1c2goZmllbGREYXRhKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRhd2FpdCB0aGlzLmdldERhdGFGb3JPcGVuaW5nRGlhbG9nKGZpZWxkUHJvcGVydGllcyk7XG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRmaWVsZFByb3BlcnRpZXMubWFwKGFzeW5jIChmaWVsZERhdGEpID0+IHtcblx0XHRcdFx0ZmllbGREYXRhLnZpc2libGUgPSB0aGlzLm1hbmlmZXN0U2V0dGluZ3MudmlzaWJsZUZpZWxkcy5sZW5ndGggPT09IDAgPyB0aGlzLmlzRmllbGRWaXNpYmxlKGZpZWxkRGF0YSkgOiB0cnVlO1xuXHRcdFx0XHRjb25zdCBydW50aW1lU2VsZWN0aW9uID0gIXRoaXMuaXNBZGFwdGF0aW9uID8gYXdhaXQgdGhpcy5nZXRSdW50aW1lU2VsZWN0aW9uKGZpZWxkRGF0YSkgOiBbXTtcblx0XHRcdFx0ZmllbGREYXRhLnNlbGVjdEl0ZW1zID0gWy4uLnRoaXMuZ2V0RGVmYXVsdFNlbGVjdE9wdGlvbnMoZmllbGREYXRhKSwgLi4ucnVudGltZVNlbGVjdGlvbl07XG5cdFx0XHR9KVxuXHRcdCk7XG5cdFx0cmV0dXJuIGZpZWxkUHJvcGVydGllcztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9wZXJ0aWVzIG9mIGRpYWxvZyBmaWVsZHMuXG5cdCAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0aWVzLlxuXHQgKi9cblx0YXN5bmMgZ2VuZXJhdGVGaWVsZHNQcm9wZXJ0aWVzKCk6IFByb21pc2U8TWFzc0ZpZWxkUHJvcGVydGllc1tdPiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0RmllbGRzUHJvcGVydGllc0Zyb21JbmZvKHRoaXMuZ2V0RmllbGRzSW5mbygpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBlbnRpdHkuXG5cdCAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0aWVzLlxuXHQgKi9cblx0YXN5bmMgZ2VuZXJhdGVFbnRpdHlGaWVsZHNQcm9wZXJ0aWVzKCk6IFByb21pc2U8TWFzc0ZpZWxkUHJvcGVydGllc1tdPiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0RmllbGRzUHJvcGVydGllc0Zyb21JbmZvKHRoaXMuZ2V0RW50aXR5RmllbGRzSW5mbygpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSByZWxldmFudCBkYXRhIGZyb20gdGhlIG1vZGVsIG5lZWRlZCBhZnRlciB0aGUgb3BlbmluZyBvZiB0aGUgZGlhbG9nLlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25seSBpbiB0aGUgZGVncmFkZWQgbW9kZSBzaW5jZSB0aGUgZGF0YSBpcyBhbHJlYWR5IGZldGNoZWQgaW4gdGhlIG5vcm1hbCBtb2RlLlxuXHQgKiB0aGUgZGVncmFkZWQgbW9kZSBpcyBzZXQgd2hlbiB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGNvbnRleHRzIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4IGFuYWx5emVkIHJvd3MuXG5cdCAqIEBwYXJhbSBmaWVsZFByb3BlcnRpZXMgVGhlIGZpZWxkIHByb3BlcnRpZXNcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGF0YSBpcyBmZXRjaGVkLlxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXREYXRhQWZ0ZXJPcGVuaW5nRGlhbG9nKGZpZWxkUHJvcGVydGllczogTWFzc0ZpZWxkUHJvcGVydGllc1tdKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuZGVncmFkZWRNb2RlKSB7XG5cdFx0XHRjb25zdCBtaXNzaW5nQ29udGV4dHMgPSB0aGlzLmNvbnRleHRzLnNsaWNlKHRoaXMubWF4QW5hbHl6ZWRSb3dzLCB0aGlzLmNvbnRleHRzLmxlbmd0aCk7XG5cdFx0XHRjb25zdCBiaW5kaW5nc1RvRmV0Y2ggPSAoW10gYXMgQmluZGluZ1RvRmV0Y2hbXSkuY29uY2F0KFxuXHRcdFx0XHQuLi5maWVsZFByb3BlcnRpZXMubWFwKChmaWVsZERhdGEpID0+IFtcblx0XHRcdFx0XHR7IGV4cHJlc3Npb246IGNvbXBpbGVFeHByZXNzaW9uKGZpZWxkRGF0YS5yZWFkT25seUV4cHJlc3Npb24pLCBjb250ZXh0czogdGhpcy5jb250ZXh0cyB9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGV4cHJlc3Npb246IGNvbXBpbGVFeHByZXNzaW9uKHBhdGhJbk1vZGVsKGZpZWxkRGF0YS5wcm9wZXJ0eUluZm8ucmVsYXRpdmVQYXRoKSksXG5cdFx0XHRcdFx0XHRjb250ZXh0czogbWlzc2luZ0NvbnRleHRzLFxuXHRcdFx0XHRcdFx0dHlwZTogZmllbGREYXRhLnRleHRCaW5kaW5nLnR5cGVcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGV4cHJlc3Npb246IGNvbXBpbGVFeHByZXNzaW9uKHBhdGhJbk1vZGVsKGZpZWxkRGF0YS5wcm9wZXJ0eUluZm8udW5pdE9yQ3VycmVuY3lQcm9wZXJ0eVBhdGgpKSxcblx0XHRcdFx0XHRcdGNvbnRleHRzOiBtaXNzaW5nQ29udGV4dHNcblx0XHRcdFx0XHR9XG5cdFx0XHRcdF0pXG5cdFx0XHQpO1xuXHRcdFx0YXdhaXQgdGhpcy5nZXRNaXNzaW5nRGF0YShiaW5kaW5nc1RvRmV0Y2gpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSByZWxldmFudCBkYXRhIGZyb20gdGhlIG1vZGVsIG5lZWRlZCB0byBvcGVuIHRoZSBkaWFsb2cuXG5cdCAqIEBwYXJhbSBmaWVsZFByb3BlcnRpZXMgVGhlIGZpZWxkIHByb3BlcnRpZXNcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGF0YSBpcyBmZXRjaGVkLlxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXREYXRhRm9yT3BlbmluZ0RpYWxvZyhmaWVsZFByb3BlcnRpZXM6IE1hc3NGaWVsZFByb3BlcnRpZXNbXSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGJpbmRpbmdzVG9SZXNvbHZlID0gKFtdIGFzIEJpbmRpbmdUb0ZldGNoW10pLmNvbmNhdChcblx0XHRcdGZpZWxkUHJvcGVydGllcy5yZWR1Y2UoKGJpbmRpbmdzOiBCaW5kaW5nVG9GZXRjaFtdLCBmaWVsZERhdGEpID0+IHtcblx0XHRcdFx0YmluZGluZ3MgPSBiaW5kaW5ncy5jb25jYXQoW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGV4cHJlc3Npb246IGZpZWxkRGF0YS50ZXh0QmluZGluZy5leHByZXNzaW9uLFxuXHRcdFx0XHRcdFx0dHlwZTogZmllbGREYXRhLnRleHRCaW5kaW5nLnR5cGVcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGV4cHJlc3Npb246IGNvbXBpbGVFeHByZXNzaW9uKHBhdGhJbk1vZGVsKGZpZWxkRGF0YS5wcm9wZXJ0eUluZm8ucmVsYXRpdmVQYXRoKSksXG5cdFx0XHRcdFx0XHR0eXBlOiBmaWVsZERhdGEudGV4dEJpbmRpbmcudHlwZVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0eyBleHByZXNzaW9uOiBjb21waWxlRXhwcmVzc2lvbihwYXRoSW5Nb2RlbChmaWVsZERhdGEucHJvcGVydHlJbmZvLnVuaXRPckN1cnJlbmN5UHJvcGVydHlQYXRoKSkgfVxuXHRcdFx0XHRdKTtcblx0XHRcdFx0aWYgKCF0aGlzLm1hbmlmZXN0U2V0dGluZ3MudmlzaWJsZUZpZWxkcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRiaW5kaW5ncyA9IGJpbmRpbmdzLmNvbmNhdChbXG5cdFx0XHRcdFx0XHR7IGV4cHJlc3Npb246IGZpZWxkRGF0YS52aXNpYmlsaXR5QmluZGluZ3MuaXNWaXNpYmxlIH0sXG5cdFx0XHRcdFx0XHR7IGV4cHJlc3Npb246IGZpZWxkRGF0YS52aXNpYmlsaXR5QmluZGluZ3MuZWRpdE1vZGUgfVxuXHRcdFx0XHRcdF0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghdGhpcy5kZWdyYWRlZE1vZGUpIHtcblx0XHRcdFx0XHRiaW5kaW5ncy5wdXNoKHsgZXhwcmVzc2lvbjogY29tcGlsZUV4cHJlc3Npb24oZmllbGREYXRhLnJlYWRPbmx5RXhwcmVzc2lvbikgfSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGJpbmRpbmdzO1xuXHRcdFx0fSwgW10pXG5cdFx0KTtcblx0XHRhd2FpdCB0aGlzLmdldE1pc3NpbmdEYXRhKGJpbmRpbmdzVG9SZXNvbHZlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBtaXNzaW5nIGRhdGEgZm9yIHRoZSBmaWVsZHMuXG5cdCAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyBjb250cm9scyB3aXRoIHRoZSBwcm92aWRlZCBiaW5kaW5ncyB0byBmZXRjaCB0aGUgbWlzc2luZyBkYXRhLlxuXHQgKiBUaGUgbW9kZWwgcmVxdWVzdHMgdGhlIGRhdGEgdG8gdGhlIGJhY2tlbmQgd2hlbiB0aGUgY29udGV4dHMgZG9lc24ndCBjb250YWlucyB0aGUgcmVsYXRlZCBwcm9wZXJ0aWVzLlxuXHQgKiBAcGFyYW0gYmluZGluZ3NUb0ZldGNoIFRoZSBiaW5kaW5nIHRvIHJlc29sdmUgYW5kIGl0cyBwcm9wZXJ0eSBwYXRoIHJlZmVyZW5jZVxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkYXRhIGlzIGZldGNoZWQuXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGdldE1pc3NpbmdEYXRhKGJpbmRpbmdzVG9GZXRjaDogQmluZGluZ1RvRmV0Y2hbXSk6IFByb21pc2U8dW5kZWZpbmVkPiB7XG5cdFx0aWYgKHRoaXMuaXNBZGFwdGF0aW9uKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmICh0aGlzLnZpZXcuZ2V0Vmlld0RhdGEoKS5jb252ZXJ0ZXJUeXBlID09PSBcIk9iamVjdFBhZ2VcIikge1xuXHRcdFx0Y29uc3QgZGlzcGxheWVkUHJvcGVydGllcyA9IHRoaXMudGFibGUuZ2V0Q29sdW1ucygpLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uZ2V0UHJvcGVydHlLZXkoKSk7XG5cdFx0XHRpZiAodGhpcy5tYW5pZmVzdFNldHRpbmdzLnZpc2libGVGaWVsZHMuZXZlcnkoKGZpZWxkKSA9PiBkaXNwbGF5ZWRQcm9wZXJ0aWVzLmluY2x1ZGVzKGZpZWxkKSkpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCBwcm9taXNlcyA9IFtdO1xuXHRcdGNvbnN0IGNvbnRyb2xzID0gW107XG5cdFx0Y29uc3QgbW9kZWwgPSB0aGlzLmNvbnRleHRzWzBdLmdldE1vZGVsKCk7XG5cdFx0Zm9yIChjb25zdCBiaW5kaW5nIG9mIGJpbmRpbmdzVG9GZXRjaC5maWx0ZXIoKGJpbmRpbmcpID0+IGJpbmRpbmcuZXhwcmVzc2lvbj8uc3RhcnRzV2l0aChcIntcIikpKSB7XG5cdFx0XHQvLyBBdm9pZCB0byBmZXRjaCBjb25zdGFudCBiaW5kaW5nc1xuXHRcdFx0Y29uc3QgcGFyYW1ldGVycyA9IHt9IGFzIFJlY29yZDxzdHJpbmcsIENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPjtcblx0XHRcdGNvbnN0IGFuYWx5emVkQ29udGV4dHMgPSBiaW5kaW5nLmNvbnRleHRzID8/IHRoaXMuYW5hbHl6ZWRDb250ZXh0cztcblx0XHRcdGNvbnN0IGJpbmRpbmdUeXBlID0gYmluZGluZy50eXBlID8/IFwiYW55XCI7XG5cdFx0XHRwYXJhbWV0ZXJzW2JpbmRpbmdUeXBlXSA9IGJpbmRpbmcuZXhwcmVzc2lvbjtcblx0XHRcdGZvciAoY29uc3QgY29udGV4dCBvZiBhbmFseXplZENvbnRleHRzKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRyb2wgPSA8QW55IHsuLi5wYXJhbWV0ZXJzfSAvPjtcblx0XHRcdFx0Y29udHJvbC5zZXRNb2RlbChtb2RlbCk7XG5cdFx0XHRcdGNvbnRyb2wuc2V0QmluZGluZ0NvbnRleHQoY29udGV4dCk7XG5cdFx0XHRcdGNvbnRyb2xzLnB1c2goY29udHJvbCk7XG5cdFx0XHRcdHByb21pc2VzLnB1c2goYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRyb2xCaW5kaW5nID0gY29udHJvbC5nZXRCaW5kaW5nKGJpbmRpbmdUeXBlKSBhcyBPRGF0YVByb3BlcnR5QmluZGluZyB8IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRpZiAoY29udHJvbEJpbmRpbmcpIHtcblx0XHRcdFx0XHRcdGNvbnRyb2xCaW5kaW5nLnNldEJpbmRpbmdNb2RlKEJpbmRpbmdNb2RlLk9uZVRpbWUpO1xuXHRcdFx0XHRcdFx0aWYgKGNvbnRyb2xCaW5kaW5nLmlzQTxDb21wb3NpdGVCaW5kaW5nPihcInNhcC51aS5tb2RlbC5Db21wb3NpdGVCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IFByb21pc2UuYWxsKGNvbnRyb2xCaW5kaW5nLmdldEJpbmRpbmdzKCkubWFwKChuZXN0ZWRCaW5kaW5nKSA9PiBuZXN0ZWRCaW5kaW5nLnJlcXVlc3RWYWx1ZT8uKCkpKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IGNvbnRyb2xCaW5kaW5nLnJlcXVlc3RWYWx1ZT8uKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMubWFwKGFzeW5jIChwcm9taXNlKSA9PiBwcm9taXNlKCkpKTtcblx0XHRmb3IgKGNvbnN0IGNvbnRyb2wgb2YgY29udHJvbHMpIHtcblx0XHRcdGNvbnRyb2wuZGVzdHJveSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB3aGVuIHRoZSByZWxhdGVkIGZpZWxkIGlzIGVtcHR5LlxuXHQgKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5XG5cdCAqIEBwYXJhbSBwcm9wZXJ0eVBhdGggVGhlIHByb3BlcnR5IHBhdGhcblx0ICogQHJldHVybnMgVGhlIGRlZmF1bHQgdmFsdWUuXG5cdCAqL1xuXHRnZXRFbXB0eVZhbHVlRm9yUHJvcGVydHkocHJvcGVydHk6IFByb3BlcnR5LCBwcm9wZXJ0eVBhdGg6IHN0cmluZyk6IFByaW1pdGl2ZVR5cGUge1xuXHRcdGlmIChwcm9wZXJ0eS5udWxsYWJsZSAhPT0gZmFsc2UpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0c1swXTtcblx0XHRcdGNvbnN0IGFueU9iamVjdCA9IDxBbnkgYW55PXtjb21waWxlRXhwcmVzc2lvbihmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKHByb3BlcnR5LCBwYXRoSW5Nb2RlbChwcm9wZXJ0eVBhdGgpKSl9IC8+O1xuXHRcdFx0YW55T2JqZWN0LnNldE1vZGVsKGNvbnRleHQuZ2V0TW9kZWwoKSk7XG5cdFx0XHRhbnlPYmplY3Quc2V0QmluZGluZ0NvbnRleHQoY29udGV4dCk7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IGFueU9iamVjdC5nZXRCaW5kaW5nSW5mbyhcImFueVwiKS5iaW5kaW5nLmdldFR5cGUoKS5wYXJzZVZhbHVlKFwiXCIsIFwic3RyaW5nXCIpO1xuXHRcdFx0YW55T2JqZWN0LmRlc3Ryb3koKTtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSBwcm9wZXJ0eSBpcyBjbGVhcmFibGUuXG5cdCAqIFNvbWUgT0RhdGEgdHlwZXMgZG9uJ3QgYWNjZXNzIGVtcHR5IHN0cmluZyBvciAwIGFzIGEgdmFsaWQgdmFsdWUgd2hlbiBpdCdzIG5vdCBudWxsYWJsZS5cblx0ICogRm9yIGV4YW1wbGUsIEVkbS5EYXRlVGltZSBkb2Vzbid0IGFjY2VwdCBhbiBlbXB0eSBzdHJpbmcgYXMgYSB2YWxpZCB2YWx1ZS5cblx0ICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBjbGVhcmFibGUsIGZhbHNlIG90aGVyd2lzZS5cblx0ICovXG5cdGlzUHJvcGVydHlDbGVhcmFibGUocHJvcGVydHk6IFByb3BlcnR5KTogUHJpbWl0aXZlVHlwZSB7XG5cdFx0aWYgKHByb3BlcnR5Lm51bGxhYmxlICE9PSBmYWxzZSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiAhW1wiRWRtLkRhdGVUaW1lXCIsIFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCIsIFwiRWRtLlRpbWVPZkRheVwiLCBcIkVkbS5UaW1lXCIsIFwiRWRtLkRhdGVcIiwgXCJFZG0uRGF0ZVRpbWVXaXRoVGltZXpvbmVcIl0uaW5jbHVkZXMoXG5cdFx0XHRcdHByb3BlcnR5LnR5cGVcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHNlbGVjdGlvbiBvcHRpb25zIG9mIGEgZmllbGQgZ2VuZXJhdGVkIGJ5IHRoZSBzZWxlY3RlZCBjb250ZXh0cy5cblx0ICogQHBhcmFtIGZpZWxkRGF0YSBEYXRhIG9mIHRoZSBmaWVsZCB1c2VkIGJ5IGJvdGggdGhlIHN0YXRpYyBhbmQgdGhlIHJ1bnRpbWUgbW9kZWxcblx0ICogQHJldHVybnMgVGhlIHNlbGVjdCBvcHRpb25zIG9mIHRoZSBmaWVsZFxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXRSdW50aW1lU2VsZWN0aW9uKGZpZWxkRGF0YTogTWFzc0ZpZWxkUHJvcGVydGllcyk6IFByb21pc2U8U2VsZWN0SW5mb1tdPiB7XG5cdFx0Y29uc3QgZGlzdGluY3RNYXAgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRjb25zdCBzZWxlY3RPcHRpb25zOiBTZWxlY3RJbmZvW10gPSBbXTtcblx0XHRpZiAoZmllbGREYXRhLmlucHV0VHlwZSA9PT0gXCJDaGVja0JveFwiKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXHRcdGNvbnN0IGFueU9iamVjdCA9ICg8QW55IGFueVRleHQ9e2ZpZWxkRGF0YS50ZXh0QmluZGluZy5leHByZXNzaW9ufSAvPikgYXMgdHlwZW9mIEFueTtcblx0XHRhbnlPYmplY3Quc2V0TW9kZWwodGhpcy5jb250ZXh0c1swXS5nZXRNb2RlbCgpKTtcblx0XHRmb3IgKGNvbnN0IHNlbGVjdGVkQ29udGV4dCBvZiB0aGlzLmFuYWx5emVkQ29udGV4dHMpIHtcblx0XHRcdGFueU9iamVjdC5zZXRCaW5kaW5nQ29udGV4dChzZWxlY3RlZENvbnRleHQpO1xuXHRcdFx0Y29uc3QgdGV4dEJpbmRpbmcgPSBhbnlPYmplY3QuZ2V0QmluZGluZyhcImFueVRleHRcIik7XG5cdFx0XHRpZiAodGV4dEJpbmRpbmc/LmlzQTxDb21wb3NpdGVCaW5kaW5nPihcInNhcC51aS5tb2RlbC5Db21wb3NpdGVCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIElmIHRoZSB0ZXh0IGJpbmRpbmcgaXMgYSBjb21wb3NpdGUgYmluZGluZywgd2UgbmVlZCB0byByZXF1ZXN0IHRoZSB2YWx1ZSBvZiBlYWNoIGJpbmRpbmdcblx0XHRcdFx0Ly8gdG8gd2FpdCBmb3IgdGhlIHByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgZ2V0dGluZyB0aGUgdmFsdWUgb2YgcmVxdWVzdFVuaXRzT2ZNZWFzdXJlL3JlcXVlc3RDdXJyZW5jeUNvZGVzXG5cdFx0XHRcdC8vIGZvciB0aGUgY3VzdG9tIHVuaXRzIG9mIG1lYXN1cmUgYW5kIGN1cnJlbmN5IGNvZGVzLlxuXHRcdFx0XHQvLyBXZSBoYXZlIHRvIHNldCB0aGUgYmluZGluZyBtb2RlIHRvIE9uZVRpbWUgdG8gYXZvaWQgdGhlIGJpbmRpbmcgdG8gYmUgdXBkYXRlZCB3aGVuIHRoZSBjb250ZXh0IGNoYW5nZXMuXG5cdFx0XHRcdC8vIEluZGVlZCBldmVuIGlmIHRoZSByZXF1ZXN0VW5pdHNPZk1lYXN1cmUvcmVxdWVzdEN1cnJlbmN5Q29kZXMgZG9lc24ndCBjaGFuZ2UgaXQncyB0cmlnZ2VyIGEgUEFUQ0ggcmVxdWVzdFxuXHRcdFx0XHR0ZXh0QmluZGluZy5zZXRCaW5kaW5nTW9kZShCaW5kaW5nTW9kZS5PbmVUaW1lKTtcblx0XHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwodGV4dEJpbmRpbmcuZ2V0QmluZGluZ3MoKS5tYXAoKGJpbmRpbmcpID0+IGJpbmRpbmcucmVxdWVzdFZhbHVlPy4oKSkpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgcHJvcGVydHlUZXh0ID0gKGFueU9iamVjdC5nZXRCaW5kaW5nKFwiYW55VGV4dFwiKSBhcyBQcm9wZXJ0eUJpbmRpbmcgfCB1bmRlZmluZWQpPy5nZXRFeHRlcm5hbFZhbHVlKCk7XG5cdFx0XHRpZiAocHJvcGVydHlUZXh0ICYmICFkaXN0aW5jdE1hcC5oYXMocHJvcGVydHlUZXh0KSkge1xuXHRcdFx0XHRkaXN0aW5jdE1hcC5hZGQocHJvcGVydHlUZXh0KTtcblx0XHRcdFx0c2VsZWN0T3B0aW9ucy5wdXNoKHtcblx0XHRcdFx0XHR0ZXh0OiBwcm9wZXJ0eVRleHQsXG5cdFx0XHRcdFx0a2V5OiBwcm9wZXJ0eVRleHQsXG5cdFx0XHRcdFx0dW5pdE9yQ3VycmVuY3lWYWx1ZTogZmllbGREYXRhLnByb3BlcnR5SW5mby51bml0T3JDdXJyZW5jeVByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0PyBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGZpZWxkRGF0YS5wcm9wZXJ0eUluZm8udW5pdE9yQ3VycmVuY3lQcm9wZXJ0eVBhdGgpXG5cdFx0XHRcdFx0XHQ6IFwiXCIsXG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZTogc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChmaWVsZERhdGEucHJvcGVydHlJbmZvLnJlbGF0aXZlUGF0aClcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGFueU9iamVjdC5kZXN0cm95KCk7XG5cdFx0cmV0dXJuIHNlbGVjdE9wdGlvbnM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gb3B0aW9ucyBvZiBhIGZpZWxkLlxuXHQgKiBAcGFyYW0gZmllbGREYXRhIFRoZSBwcm9wZXJ0eSBpbmZvcm1hdGlvblxuXHQgKiBAcmV0dXJucyBUaGUgZGVmYXVsdCBzZWxlY3Qgb3B0aW9ucy5cblx0ICovXG5cdHByaXZhdGUgZ2V0RGVmYXVsdFNlbGVjdE9wdGlvbnMoZmllbGREYXRhOiBNYXNzRmllbGRQcm9wZXJ0aWVzKTogU2VsZWN0SW5mb1tdIHtcblx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUubWFjcm9zXCIpIGFzIFJlc291cmNlQnVuZGxlO1xuXHRcdGNvbnN0IGtlZXBFbnRyeSA9IHtcblx0XHRcdHRleHQ6IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01BU1NfRURJVF9DT01CT0JPWF9LRUVQX1ZBTFVFU1wiKSxcblx0XHRcdGtleTogU3BlY2lmaWNTZWxlY3RLZXlzLktlZXBLZXlcblx0XHR9O1xuXHRcdGNvbnN0IGRlZmF1bHRPcHRpb25zOiBTZWxlY3RJbmZvW10gPSBbXTtcblx0XHRkZWZhdWx0T3B0aW9ucy5wdXNoKGtlZXBFbnRyeSk7XG5cdFx0aWYgKGZpZWxkRGF0YS5pbnB1dFR5cGUgPT09IFwiQ2hlY2tCb3hcIikge1xuXHRcdFx0ZGVmYXVsdE9wdGlvbnMucHVzaCh7IHRleHQ6IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJ5ZXNcIiksIGtleTogXCJ0cnVlXCIgfSwgeyB0ZXh0OiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwibm9cIiksIGtleTogXCJmYWxzZVwiIH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZWZhdWx0T3B0aW9ucy5wdXNoKHtcblx0XHRcdFx0dGV4dDogcmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX0NPTUJPQk9YX1JFUExBQ0VfVkFMVUVTXCIpLFxuXHRcdFx0XHRrZXk6IFNwZWNpZmljU2VsZWN0S2V5cy5SZXBsYWNlS2V5XG5cdFx0XHR9KTtcblx0XHRcdGlmIChmaWVsZERhdGEuaXNGaWVsZFJlcXVpcmVkICE9PSBcInRydWVcIiAmJiBmaWVsZERhdGEucHJvcGVydHlJbmZvLmNsZWFyYWJsZSkge1xuXHRcdFx0XHRkZWZhdWx0T3B0aW9ucy5wdXNoKHtcblx0XHRcdFx0XHR0ZXh0OiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfQ09NQk9CT1hfQ0xFQVJfVkFMVUVTXCIpLFxuXHRcdFx0XHRcdGtleTogU3BlY2lmaWNTZWxlY3RLZXlzLkNsZWFyRmllbGRWYWx1ZUtleVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGRlZmF1bHRPcHRpb25zO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgZWRpdCBtb2RlIGlzIGVkaXRhYmxlLlxuXHQgKiBAcGFyYW0gZWRpdE1vZGVcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHByaXZhdGUgaXNFZGl0YWJsZUVkaXRNb2RlKGVkaXRNb2RlOiBzdHJpbmcgfCBGaWVsZEVkaXRNb2RlKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIChbRmllbGRFZGl0TW9kZS5FZGl0YWJsZV0gYXMgc3RyaW5nW10pLmluY2x1ZGVzKGVkaXRNb2RlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIGZpZWxkIGlzIGVkaXRhYmxlLlxuXHQgKiBAcGFyYW0gZXhwQmluZGluZyBUaGUgZXhwcmVzc2lvbiBiaW5kaW5nIG9mIHRoZSBwcm9wZXJ0eS5cblx0ICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSBtYXNzIGVkaXQgZmllbGQgaXMgZWRpdGFibGUuXG5cdCAqL1xuXHRwcml2YXRlIGdldEZpZWxkRWRpdGFibGUoZXhwQmluZGluZzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24pOiBib29sZWFuIHtcblx0XHRpZiAodGhpcy5pc0VkaXRhYmxlRWRpdE1vZGUoZXhwQmluZGluZyBhcyBzdHJpbmcpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGVsc2UgaWYgKE9iamVjdC5rZXlzKEZpZWxkRWRpdE1vZGUpLmluY2x1ZGVzKGV4cEJpbmRpbmcgYXMgRmllbGRFZGl0TW9kZSkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IGVsc2UgaWYgKGV4cEJpbmRpbmcpIHtcblx0XHRcdGNvbnN0IGFueUNvbnRyb2wgPSA8QW55IGFueT17ZXhwQmluZGluZ30gLz47XG5cdFx0XHRjb25zdCBtb2RlbCA9IHRoaXMuYW5hbHl6ZWRDb250ZXh0c1swXS5nZXRNb2RlbCgpO1xuXHRcdFx0YW55Q29udHJvbC5zZXRNb2RlbChtb2RlbCk7XG5cdFx0XHRjb25zdCB2aXNpYmxlID0gdGhpcy5hbmFseXplZENvbnRleHRzLnNvbWUoKGNvbnRleHQpID0+IHtcblx0XHRcdFx0YW55Q29udHJvbC5zZXRCaW5kaW5nQ29udGV4dChjb250ZXh0KTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuaXNFZGl0YWJsZUVkaXRNb2RlKChhbnlDb250cm9sLmdldEJpbmRpbmcoXCJhbnlcIikgYXMgUHJvcGVydHlCaW5kaW5nKS5nZXRFeHRlcm5hbFZhbHVlKCkpO1xuXHRcdFx0fSk7XG5cdFx0XHRhbnlDb250cm9sLmRlc3Ryb3koKTtcblx0XHRcdHJldHVybiB2aXNpYmxlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgaW5wdXQgdHlwZSBvZiB0aGUgZmllbGQuXG5cdCAqIEBwYXJhbSBkYXRhRmllbGRDb252ZXJ0ZWQgVGhlIGNvbnZlcnRlZCBhbm5vdGF0aW9uIGZvIHRoZSBmaWVsZFxuXHQgKiBAcGFyYW0gZGF0YU1vZGVsUGF0aCBUaGUgZGF0YU1vZGVsT2JqZWN0UGF0aCBvZiB0aGUgcHJvcGVydHlcblx0ICogQHJldHVybnMgVGhlIGlucHV0IHR5cGUuXG5cdCAqL1xuXHRwcml2YXRlIGdldElucHV0VHlwZShkYXRhRmllbGRDb252ZXJ0ZWQ6IERhdGFGaWVsZFR5cGVzLCBkYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pik6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwge1xuXHRcdGNvbnN0IGVkaXRTdHlsZVByb3BlcnRpZXMgPSB7fSBhcyBGaWVsZEJsb2NrUHJvcGVydGllcztcblx0XHRzZXRFZGl0U3R5bGVQcm9wZXJ0aWVzKGVkaXRTdHlsZVByb3BlcnRpZXMsIGRhdGFGaWVsZENvbnZlcnRlZCwgZGF0YU1vZGVsUGF0aCwgdHJ1ZSk7XG5cdFx0cmV0dXJuIGVkaXRTdHlsZVByb3BlcnRpZXM/LmVkaXRTdHlsZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmaWVsZFxuXHQgKiBUaGlzIHZpc2liaWxpdHkgaXMgbm90IGRlcGVuZGVudCBvbiB0aGUgY29udGV4dCB3aGVuXG5cdCAqICAtIGVpdGhlciB0aGUgYWRhcHRhdGlvbiBtb2RlIGlzIHNldC5cblx0ICogIC0gb3IgdGhlIGZpZWxkIGlzIHZpc2libGUgaW4gdGhlIG1hbmlmZXN0IGFuZCB0aGUgZGVncmFkZWQgbW9kZSBpcyBzZXQuXG5cdCAqIEBwYXJhbSBmaWVsZFByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgb2YgdGhlIG1hc3MgZWRpdCBmaWVsZFxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBmaWVsZCBpcyB2aXNpYmxlLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgaXNGaWVsZFZpc2libGUoZmllbGRQcm9wZXJ0aWVzOiBNYXNzRmllbGRQcm9wZXJ0aWVzKTogYm9vbGVhbiB7XG5cdFx0aWYgKHRoaXMuaXNBZGFwdGF0aW9uIHx8ICh0aGlzLm1hbmlmZXN0U2V0dGluZ3MudmlzaWJsZUZpZWxkcy5sZW5ndGggJiYgdGhpcy5kZWdyYWRlZE1vZGUpKSB7XG5cdFx0XHRjb25zdCBpc1N0YXRpY0VkaXRNb2RlID0gT2JqZWN0LmtleXMoRmllbGRFZGl0TW9kZSkuaW5jbHVkZXMoZmllbGRQcm9wZXJ0aWVzLnZpc2liaWxpdHlCaW5kaW5ncy5lZGl0TW9kZSBhcyBGaWVsZEVkaXRNb2RlKTtcblx0XHRcdGNvbnN0IGlzRWRpdGFibGUgPVxuXHRcdFx0XHQhaXNTdGF0aWNFZGl0TW9kZSB8fCAoaXNTdGF0aWNFZGl0TW9kZSAmJiB0aGlzLmlzRWRpdGFibGVFZGl0TW9kZShmaWVsZFByb3BlcnRpZXMudmlzaWJpbGl0eUJpbmRpbmdzLmVkaXRNb2RlIGFzIHN0cmluZykpO1xuXHRcdFx0cmV0dXJuIGlzRWRpdGFibGUgJiYgZmllbGRQcm9wZXJ0aWVzLnZpc2liaWxpdHlCaW5kaW5ncy5pc1Zpc2libGUgIT09IFwiZmFsc2VcIjtcblx0XHR9XG5cdFx0cmV0dXJuIChcblx0XHRcdHRoaXMuZ2V0RmllbGRFZGl0YWJsZShmaWVsZFByb3BlcnRpZXMudmlzaWJpbGl0eUJpbmRpbmdzLmVkaXRNb2RlKSAmJlxuXHRcdFx0IXRoaXMuaXNIaWRkZW5Gb3JDb250ZXh0cyhmaWVsZFByb3BlcnRpZXMudmlzaWJpbGl0eUJpbmRpbmdzLmlzVmlzaWJsZSlcblx0XHQpO1xuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFrRUE7QUFDQTtBQUNBO0VBRkEsSUFHcUJBLG9CQUFvQjtJQTJCeEMsU0FBQUEscUJBQVlDLEtBQXFFLEVBQUU7TUFBQSxLQWxC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
@@ -746,12 +746,21 @@ export default class MassEditDialogHelper {
746
746
  }
747
747
 
748
748
  /**
749
- * Checks if the the field is editable.
749
+ * Checks if the edit mode is editable.
750
+ * @param editMode
751
+ * @private
752
+ */
753
+ private isEditableEditMode(editMode: string | FieldEditMode): boolean {
754
+ return ([FieldEditMode.Editable] as string[]).includes(editMode);
755
+ }
756
+
757
+ /**
758
+ * Checks if the field is editable.
750
759
  * @param expBinding The expression binding of the property.
751
760
  * @returns Returns true if the mass edit field is editable.
752
761
  */
753
762
  private getFieldEditable(expBinding: CompiledBindingToolkitExpression): boolean {
754
- if (expBinding === FieldEditMode.Editable) {
763
+ if (this.isEditableEditMode(expBinding as string)) {
755
764
  return true;
756
765
  } else if (Object.keys(FieldEditMode).includes(expBinding as FieldEditMode)) {
757
766
  return false;
@@ -761,7 +770,7 @@ export default class MassEditDialogHelper {
761
770
  anyControl.setModel(model);
762
771
  const visible = this.analyzedContexts.some((context) => {
763
772
  anyControl.setBindingContext(context);
764
- return (anyControl.getBinding("any") as PropertyBinding).getExternalValue() === FieldEditMode.Editable;
773
+ return this.isEditableEditMode((anyControl.getBinding("any") as PropertyBinding).getExternalValue());
765
774
  });
766
775
  anyControl.destroy();
767
776
  return visible;
@@ -794,7 +803,7 @@ export default class MassEditDialogHelper {
794
803
  if (this.isAdaptation || (this.manifestSettings.visibleFields.length && this.degradedMode)) {
795
804
  const isStaticEditMode = Object.keys(FieldEditMode).includes(fieldProperties.visibilityBindings.editMode as FieldEditMode);
796
805
  const isEditable =
797
- !isStaticEditMode || (isStaticEditMode && fieldProperties.visibilityBindings.editMode === FieldEditMode.Editable);
806
+ !isStaticEditMode || (isStaticEditMode && this.isEditableEditMode(fieldProperties.visibilityBindings.editMode as string));
798
807
  return isEditable && fieldProperties.visibilityBindings.isVisible !== "false";
799
808
  }
800
809
  return (