@sapui5/sap.fe.templates 1.147.0 → 1.148.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 (38) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/templates/.library +1 -1
  3. package/src/sap/fe/templates/AnalyticalListPage/manifest.json +1 -1
  4. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +4 -14
  5. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +2 -12
  6. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.js +4 -1
  7. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.ts +3 -0
  8. package/src/sap/fe/templates/ListReport/manifest.json +1 -1
  9. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +134 -24
  10. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +132 -19
  11. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +169 -17
  12. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +195 -19
  13. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +13 -8
  14. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +17 -9
  15. package/src/sap/fe/templates/ObjectPage/components/CollaborationDiscardDialog.js +4 -1
  16. package/src/sap/fe/templates/ObjectPage/components/CollaborationDiscardDialog.tsx +1 -0
  17. package/src/sap/fe/templates/ObjectPage/components/CollaborationDraft.js +15 -4
  18. package/src/sap/fe/templates/ObjectPage/components/CollaborationDraft.tsx +11 -2
  19. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +28 -1
  20. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.ts +31 -0
  21. package/src/sap/fe/templates/ObjectPage/helpers/SectionNavigationHelper.js +72 -0
  22. package/src/sap/fe/templates/ObjectPage/helpers/SectionNavigationHelper.ts +75 -0
  23. package/src/sap/fe/templates/ObjectPage/manifest.json +1 -15
  24. package/src/sap/fe/templates/ObjectPage/overrides/CollaborationManager.js +29 -20
  25. package/src/sap/fe/templates/ObjectPage/overrides/CollaborationManager.ts +28 -21
  26. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +4 -3
  27. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +4 -4
  28. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +93 -17
  29. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.ts +108 -22
  30. package/src/sap/fe/templates/ObjectPage/view/fragments/EmphasizedFirstHeaderAction.fragment.xml +1 -0
  31. package/src/sap/fe/templates/ObjectPage/view/fragments/ExpandedHeading.fragment.xml +4 -4
  32. package/src/sap/fe/templates/ObjectPage/view/fragments/Heading.fragment.xml +4 -4
  33. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderAddress.fragment.xml +1 -1
  34. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderContact.fragment.xml +1 -1
  35. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderForm.fragment.xml +1 -0
  36. package/src/sap/fe/templates/library.js +1 -1
  37. package/src/sap/fe/templates/messagebundle_no.properties +1 -1
  38. package/src/sap/fe/templates/messagebundle_uk.properties +1 -1
@@ -97,17 +97,22 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
97
97
  * @returns A compiled expression that evaluates to the button type to use
98
98
  */
99
99
  _exports.isManifestAction = isManifestAction;
100
- const buildEmphasizedButtonExpression = function (dataContextPath) {
100
+ const buildCriticalityVisibleFromIdentificationExpression = function (dataContextPath) {
101
101
  const identification = dataContextPath.targetEntityType?.annotations?.UI?.Identification;
102
102
  const dataFieldsWithCriticality = identification?.filter(dataField => dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAction" && dataField.Criticality) || [];
103
- const criticalActionsVisibleExpressions = dataFieldsWithCriticality.length ? dataFieldsWithCriticality.map(dataField => {
104
- // Criticality suppresses emphasis if the action itself is visible (Hidden is false)
105
- return not(equal(getExpressionFromAnnotation(dataField.annotations?.UI?.Hidden), true));
106
- }) : [constant(false)];
107
-
103
+ if (!dataFieldsWithCriticality.length) {
104
+ return constant(false);
105
+ }
106
+ return or(...dataFieldsWithCriticality.map(dataField =>
107
+ // Criticality suppresses emphasis if the action itself is visible (Hidden is false)
108
+ not(equal(getExpressionFromAnnotation(dataField.annotations?.UI?.Hidden), true))));
109
+ };
110
+ _exports.buildCriticalityVisibleFromIdentificationExpression = buildCriticalityVisibleFromIdentificationExpression;
111
+ const buildEmphasizedButtonExpression = function (dataContextPath) {
112
+ const criticalityVisibleExpr = buildCriticalityVisibleFromIdentificationExpression(dataContextPath);
108
113
  // If there is at least one visible action with criticality, the template's default primary action is set back to Ghost
109
114
  // else it is emphasized
110
- return compileExpression(ifElse(or(...criticalActionsVisibleExpressions), ButtonType.Ghost, ButtonType.Emphasized));
115
+ return compileExpression(ifElse(criticalityVisibleExpr, ButtonType.Ghost, ButtonType.Emphasized));
111
116
  };
112
117
  _exports.buildEmphasizedButtonExpression = buildEmphasizedButtonExpression;
113
118
  const getElementBinding = function (sPath) {
@@ -750,4 +755,4 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
750
755
  _exports.getFormAriaText = getFormAriaText;
751
756
  return _exports;
752
757
  }, false);
753
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCdXR0b25UeXBlIiwibUxpYnJhcnkiLCJnZXRFeHByZXNzaW9uRm9yVGl0bGUiLCJmdWxsQ29udGV4dFBhdGgiLCJ2aWV3RGF0YSIsImhlYWRlckluZm8iLCJnZXRUaXRsZUJpbmRpbmdFeHByZXNzaW9uIiwiZ2V0VGV4dEJpbmRpbmdFeHByZXNzaW9uIiwidW5kZWZpbmVkIiwiX2V4cG9ydHMiLCJnZXRFeHByZXNzaW9uRm9yRGVzY3JpcHRpb24iLCJvSGVhZGVySW5mbyIsImRlc2NyaXB0aW9uQmluZGluZyIsImdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbiIsIkRlc2NyaXB0aW9uIiwiVmFsdWUiLCIkdGFyZ2V0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJUZXh0IiwiVUkiLCJUZXh0QXJyYW5nZW1lbnQiLCJhZGRUZXh0QXJyYW5nZW1lbnRUb0JpbmRpbmdFeHByZXNzaW9uIiwiZGVzY3JpcHRpb24iLCJjb21waWxlRXhwcmVzc2lvbiIsImZvcm1hdFZhbHVlUmVjdXJzaXZlbHkiLCJnZXRFeHByZXNzaW9uRm9yU2F2ZUJ1dHRvbiIsIm9WaWV3RGF0YSIsInNhdmVCdXR0b25UZXh0IiwicmVzb3VyY2VNb2RlbCIsImdldFRleHQiLCJjcmVhdGVCdXR0b25UZXh0Iiwic2F2ZUV4cHJlc3Npb24iLCJzdGFydGluZ0VudGl0eVNldCIsIlNlc3Npb24iLCJTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiaWZFbHNlIiwiSXNDcmVhdGVNb2RlIiwiRHJhZnQiLCJJc05ld09iamVjdCIsImdldEV4cHJlc3Npb25Gb3JMYWJlbE9uSGVhZGVyRm9ybSIsImxhYmVsIiwiaXNNYW5pZmVzdEFjdGlvbiIsImFjdGlvbiIsIm5vbk1hbmlmZXN0QWN0aW9ucyIsImluY2x1ZGVzIiwidHlwZSIsImJ1aWxkRW1waGFzaXplZEJ1dHRvbkV4cHJlc3Npb24iLCJkYXRhQ29udGV4dFBhdGgiLCJpZGVudGlmaWNhdGlvbiIsInRhcmdldEVudGl0eVR5cGUiLCJJZGVudGlmaWNhdGlvbiIsImRhdGFGaWVsZHNXaXRoQ3JpdGljYWxpdHkiLCJmaWx0ZXIiLCJkYXRhRmllbGQiLCIkVHlwZSIsIkNyaXRpY2FsaXR5IiwiY3JpdGljYWxBY3Rpb25zVmlzaWJsZUV4cHJlc3Npb25zIiwibGVuZ3RoIiwibWFwIiwibm90IiwiZXF1YWwiLCJIaWRkZW4iLCJjb25zdGFudCIsIm9yIiwiR2hvc3QiLCJFbXBoYXNpemVkIiwiZ2V0RWxlbWVudEJpbmRpbmciLCJzUGF0aCIsInNOYXZpZ2F0aW9uUGF0aCIsIk9EYXRhTW9kZWxBbm5vdGF0aW9uSGVscGVyIiwiZ2V0TmF2aWdhdGlvblBhdGgiLCJjaGVja0RyYWZ0U3RhdGUiLCJlbnRpdHlTZXQiLCJEcmFmdFJvb3QiLCJFZGl0QWN0aW9uIiwiX2ZpbmRBY3Rpb24iLCJhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMiLCJzQWN0aW9uVHlwZSIsIm9BY3Rpb24iLCJmaW5kIiwib0hlYWRlckFjdGlvbiIsImdldERlbGV0ZUNvbW1hbmRFeGVjdXRpb25FbmFibGVkIiwib0RlbGV0ZUFjdGlvbiIsImVuYWJsZWQiLCJnZXREZWxldGVDb21tYW5kRXhlY3V0aW9uVmlzaWJsZSIsInZpc2libGUiLCJnZXRFZGl0Q29tbWFuZEV4ZWN1dGlvblZpc2libGUiLCJvRWRpdEFjdGlvbiIsImdldEVkaXRDb21tYW5kRXhlY3V0aW9uRW5hYmxlZCIsImdldEVkaXRBY3Rpb24iLCJvRW50aXR5U2V0IiwiZ2V0UGF0aCIsImFQYXRocyIsInNwbGl0Iiwicm9vdEVudGl0eVNldFBhdGgiLCJyb290RW50aXR5U2V0QW5ubm90YXRpb25zIiwiZ2V0T2JqZWN0IiwiYkRyYWZ0Um9vdCIsImhhc093blByb3BlcnR5IiwiYkRyYWZ0Tm9kZSIsImJTdGlja3lTZXNzaW9uIiwic0FjdGlvbk5hbWUiLCJpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zIiwib0Fubm90YXRpb25zIiwib0ZpZWxkQ29udHJvbCIsImJDb21wdXRlZCIsImJJbW11dGFibGUiLCJiUmVhZE9ubHkiLCJCb29sIiwicmVhZE9ubHlFeHByZXNzaW9uRnJvbUR5bmFtaWNBbm5vdGF0aW9ucyIsInNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seSIsIkJpbmRpbmdJbmZvIiwicGFyc2UiLCJnZXRFeHByZXNzaW9uRm9yTWljcm9DaGFydFRpdGxlUHJlc3MiLCJvQ29uZmlndXJhdGlvbiIsInRhcmdldEFubm90YXRpb25QYXRoIiwidGFyZ2V0QW5ub3RhdGlvblBhdGhEYXRNb2RlbE9iamVjdCIsIm9NYW5pZmVzdE91dGJvdW5kIiwic0NvbGxlY3Rpb25OYW1lIiwiZ2V0TWljcm9DaGFydENvbnRyb2xDb25maWd1cmF0aW9uUGF0aCIsIm5hdmlnYXRpb25Db25maWd1cmF0aW9uIiwiSlNPTiIsInN0cmluZ2lmeSIsImdldE1pY3JvQ2hhcnRUaXRsZUFzTGluayIsIm9Db250cm9sQ29uZmlndXJhdGlvbiIsImNvbGxlY3Rpb25OYW1lIiwidGFyZ2V0Q29udHJvbENvbmZpZ3VyYXRpb24iLCJ0YXJnZXRPYmplY3QiLCJWaXN1YWxpemF0aW9ucyIsInZhbHVlIiwiZ2V0R3JvdXBJZEZyb21Db25maWciLCJvQ29uZmlndXJhdGlvbnMiLCJzQW5ub3RhdGlvblBhdGgiLCJzRGVmYXVsdEdyb3VwSWQiLCJhQXV0b1BhdHRlcm5zIiwic0dyb3VwSWQiLCJyZXF1ZXN0R3JvdXBJZCIsInNvbWUiLCJhdXRvUGF0dGVybiIsImdldEdyb3VwSWRGcm9tQ29uZmlnRm9yTWljcm9DaGFydCIsInRhcmdldEFubm90YXRpb25QYXRoRGF0YU1vZGVsT2JqZWN0IiwiZ2V0QmluZGluZ1dpdGhHcm91cElkRnJvbUNvbmZpZyIsInNLZXkiLCJzQmluZGluZyIsImNyZWF0ZUJpbmRpbmdGb3JBbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsImJpbmRpbmciLCJhbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzIiwiTW9kZWxIZWxwZXIiLCJnZXRBbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzIiwidGFyZ2V0RW50aXR5U2V0IiwicGF0aCIsInBhcmFtZXRlcnMiLCIkc2VsZWN0Iiwiam9pbiIsImRvZXNGaWVsZEdyb3VwQ29udGFpbk9ubHlPbmVNdWx0aUxpbmVEYXRhRmllbGQiLCJhRm9ybUVsZW1lbnRzIiwiaXNWYWx1ZU11bHRpbGluZVRleHQiLCJnZXRTaGFyZUJ1dHRvblZpc2liaWxpdHkiLCJpc1NoYXJlQnV0dG9uVmlzaWJsZUZvck15SW5ib3giLCJzaGFyZUJ1dHRvblZpc2liaWxpdHlFeHAiLCJmY2xFbmFibGVkIiwiYW5kIiwicGF0aEluTW9kZWwiLCJnZXRWaXNpYmxpdHlPZkhlYWRlckluZm8iLCJvVGl0bGVBbm5vdGF0aW9ucyIsIm9EZXNjcmlwdGlvbkFubm90YXRpb25zIiwib0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wiLCJvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbCIsImJJc1RpdGxlUmVhZE9ubHkiLCJ0aXRsZUV4cHJlc3Npb24iLCJiSXNEZXNjcmlwdGlvblJlYWRPbmx5IiwiZGVzY3JpcHRpb25FeHByZXNzaW9uIiwiY29tYmluZVRpdGxlQW5kRGVzY3JpcHRpb25FeHByZXNzaW9uIiwib1RpdGxlRmllbGRDb250cm9sIiwib0Rlc2NyaXB0aW9uRmllbGRDb250cm9sIiwiZ2V0UHJlc3NFeHByZXNzaW9uRm9yRGVsZXRlIiwiZGVsZXRhYmxlQ29udGV4dHMiLCJ0aXRsZSIsInBhcmFtcyIsIkNvbW1vbkhlbHBlciIsImdlbmVyYXRlRnVuY3Rpb24iLCJvYmplY3RUb1N0cmluZyIsImdldFByZXNzRXhwcmVzc2lvbkZvckVkaXQiLCJvRGF0YUZpZWxkIiwic0VudGl0eVNldE5hbWUiLCJzRWRpdGFibGVDb250ZXh0cyIsImFkZFNpbmdsZVF1b3RlcyIsIkFjdGlvbiIsInNEYXRhRmllbGRFbnVtTWVtYmVyIiwiSW52b2NhdGlvbkdyb3VwaW5nIiwic0ludm9jYXRpb25Hcm91cCIsIm9QYXJhbXMiLCJjb250ZXh0cyIsImVudGl0eVNldE5hbWUiLCJpbnZvY2F0aW9uR3JvdXBpbmciLCJtb2RlbCIsIkxhYmVsIiwiaXNOYXZpZ2FibGUiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJkaXNhYmxlU3RyaWN0SGFuZGxpbmciLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JGb290ZXJBbm5vdGF0aW9uQWN0aW9uIiwiZGF0YUZpZWxkTW9kZWxQYXRoIiwiaGVhZGVyQWN0aW9uIiwiYWN0aW9uQ29udGV4dHMiLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JQcmltYXJ5QWN0aW9uIiwicG9zaXRpdmVBY3Rpb25WaXNpYmxlIiwicG9zaXRpdmVBY3Rpb25FbmFibGVkIiwiZWRpdEFjdGlvblZpc2libGUiLCJlZGl0QWN0aW9uRW5hYmxlZCIsInNBY3Rpb25Db250ZXh0cyIsInRvU3RyaW5nIiwib0NvbmRpdGlvbnMiLCJnZXRTdGFzaGFibGVIQm94QmluZGluZyIsIm9IZWFkZXJGYWNldCIsIkZhY2V0IiwidGFyZ2V0QW5ub3RhdGlvblR5cGUiLCJ0YXJnZXRBbm5vdGF0aW9uVmFsdWUiLCJnZXRIZWFkZXJGb3JtSGJveFJlbmRlclR5cGUiLCJnZXREZWZhdWx0QWN0aW9uSGFuZGxlciIsIm9DdHgiLCJvRGF0YUZpZWxkRm9yRGVmYXVsdEFjdGlvbiIsImRlZmF1bHRBY3Rpb25Db250ZXh0T3JFbnRpdHlTZXQiLCJkZWZhdWx0QWN0aW9uIiwiY29tbWFuZCIsInByZXNzIiwibm9XcmFwIiwiYnVpbGRBY3Rpb25XcmFwcGVyIiwiaWQiLCJpb0V4IiwiaXNWaXN1YWxpemF0aW9uSXNQYXJ0T2ZQcmV2aWV3Iiwic3ViU2VjdGlvbiIsImlzUGFydE9mUHJldmlldyIsInByZXNlbnRhdGlvbiIsInZpc3VhbGl6YXRpb25zIiwiZ2V0Rm9vdGVyVmlzaWJpbGl0eUV4cHJlc3Npb25JbnRlcm5hbCIsImNvbnRleHQiLCJmb290ZXJBY3Rpb25zIiwibWV0YU1vZGVsIiwiZ2V0SW50ZXJmYWNlIiwiZ2V0TW9kZWwiLCJfZ2VuZXJhdGVCaW5kaW5nc0ZvckFjdGlvbnMiLCJhY3Rpb25zIiwidmlzaWJsZUV4cHJlc3Npb24iLCJyZXNvbHZlQmluZGluZ1N0cmluZyIsImdldEFjdGlvbk1vZGVsUGF0aCIsImFubm90YXRpb25QYXRoIiwiYWN0aW9uQ29udGV4dCIsImdldENvbnRleHQiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJkZXRlcm1pbmluZ0FjdGlvbnMiLCJBY3Rpb25UeXBlIiwiRGF0YUZpZWxkRm9yQWN0aW9uIiwibWFuaWZlc3RBY3Rpb25CaW5kaW5ncyIsImRldGVybWluaW5nQWN0aW9uQmluZGluZ3MiLCJpc05vdEhpZGRlbkRldGVybWluaW5nQWN0aW9uIiwiYWN0aW9uQ29udGV4dE1vZGVsUGF0aCIsIklzRWRpdGFibGUiLCJnZXRGb290ZXJWaXNpYmlsaXR5RXhwcmVzc2lvbiIsImdldEhlYWRlckxldmVsIiwiaXNNb3JlQ29udGVudCIsInNob3dTdWJTZWN0aW9uVGl0bGUiLCJsZXZlbCIsImRhdGFWaXN1YWxpemF0aW9uVGl0bGVWaXNpYmxlIiwiZ2V0SGVhZGVyRm9ybUFyaWFMYWJlbGxlZEJ5IiwiaGVhZGVyRm9ybURhdGEiLCJmb3JtRWxlbWVudElkUHJlZml4IiwidGl0bGVJZCIsIlN0YWJsZUlkSGVscGVyIiwiZ2VuZXJhdGUiLCJsYWJlbElkIiwiZ2V0Rm9ybUFyaWFUZXh0Iiwic3ViU2VjdGlvblRpdGxlIiwicmVzb3VyY2VCdW5kbGUiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJyZXF1aXJlc0lDb250ZXh0Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJPYmplY3RQYWdlVGVtcGxhdGluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGb3JtYXR0ZXJzIGZvciB0aGUgT2JqZWN0IFBhZ2VcbmltcG9ydCB0eXBlIHsgRW50aXR5U2V0LCBOYXZpZ2F0aW9uUHJvcGVydHksIFByb3BlcnR5LCBTaW5nbGV0b24gfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHtcblx0Q2hhcnQsXG5cdERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZERlZmF1bHQsXG5cdERhdGFGaWVsZEZvckFjdGlvbixcblx0RGF0YUZpZWxkVHlwZXMsXG5cdEZhY2V0LFxuXHRIZWFkZXJJbmZvVHlwZSxcblx0UHJlc2VudGF0aW9uVmFyaWFudFxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB0eXBlIHsgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLCBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiwgUGF0aEluTW9kZWxFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQge1xuXHRhbmQsXG5cdGNvbXBpbGVFeHByZXNzaW9uLFxuXHRjb25zdGFudCxcblx0ZXF1YWwsXG5cdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbixcblx0aWZFbHNlLFxuXHRub3QsXG5cdG9yLFxuXHRwYXRoSW5Nb2RlbCxcblx0cmVzb2x2ZUJpbmRpbmdTdHJpbmdcbn0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSB7IE1pY3JvQ2hhcnRNYW5pZmVzdENvbmZpZ3VyYXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBBY3Rpb25UeXBlLCB0eXBlIENvbnRyb2xDb25maWd1cmF0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHR5cGUgeyBNZXRhTW9kZWxQcm9wZXJ0eUFubm90YXRpb25zIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgUGFnZUNvbnRleHRQYXRoVGFyZ2V0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQmFzZUFjdGlvbiwgQ3VzdG9tQWN0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL0FjdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBBbm5vdGF0aW9uRm9ybUVsZW1lbnQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vRm9ybVwiO1xuaW1wb3J0IHR5cGUgeyBGaWVsZEdyb3VwRmFjZXQsIEhlYWRlckZvcm1EYXRhIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvT2JqZWN0UGFnZS9IZWFkZXJGYWNldFwiO1xuaW1wb3J0IHR5cGUgeyBEYXRhVmlzdWFsaXphdGlvblN1YlNlY3Rpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9PYmplY3RQYWdlL1N1YlNlY3Rpb25cIjtcbmltcG9ydCB7IERyYWZ0LCBVSSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0ICogYXMgU3RhYmxlSWRIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCB7IGdldFRpdGxlQmluZGluZ0V4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UaXRsZUhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBWaWV3RGF0YSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9UZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCBDb21tb25IZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvQ29tbW9uSGVscGVyXCI7XG5pbXBvcnQge1xuXHRhZGRUZXh0QXJyYW5nZW1lbnRUb0JpbmRpbmdFeHByZXNzaW9uLFxuXHRmb3JtYXRWYWx1ZVJlY3Vyc2l2ZWx5LFxuXHRnZXRUZXh0QmluZGluZ0V4cHJlc3Npb25cbn0gZnJvbSBcInNhcC9mZS9tYWNyb3MvZmllbGQvRmllbGRUZW1wbGF0aW5nXCI7XG5pbXBvcnQgbUxpYnJhcnkgZnJvbSBcInNhcC9tL2xpYnJhcnlcIjtcbmltcG9ydCBCaW5kaW5nSW5mbyBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ0luZm9cIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCB0eXBlIHsgTWFuaWZlc3RPdXRib3VuZEVudHJ5IH0gZnJvbSBcInNhcC91aS9jb3JlL01hbmlmZXN0XCI7XG5pbXBvcnQgdHlwZSB7IElDb250ZXh0IH0gZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Bbm5vdGF0aW9uSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBNZXRhTW9kZWxUeXBlIH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3R5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuXG5jb25zdCBCdXR0b25UeXBlID0gbUxpYnJhcnkuQnV0dG9uVHlwZTtcblxuZXhwb3J0IGNvbnN0IGdldEV4cHJlc3Npb25Gb3JUaXRsZSA9IGZ1bmN0aW9uIChcblx0ZnVsbENvbnRleHRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHZpZXdEYXRhOiBWaWV3RGF0YSxcblx0aGVhZGVySW5mbz86IEhlYWRlckluZm9UeXBlXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdHJldHVybiBnZXRUaXRsZUJpbmRpbmdFeHByZXNzaW9uKFxuXHRcdGZ1bGxDb250ZXh0UGF0aCBhcyBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pixcblx0XHRnZXRUZXh0QmluZGluZ0V4cHJlc3Npb24sXG5cdFx0dW5kZWZpbmVkLFxuXHRcdGhlYWRlckluZm8sXG5cdFx0dmlld0RhdGFcblx0KTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBleHByZXNzaW9uIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgYW4gb2JqZWN0IHBhZ2UuXG4gKiBAcGFyYW0gZnVsbENvbnRleHRQYXRoIFRoZSBmdWxsIGNvbnRleHQgcGF0aCB1c2VkIHRvIHJlYWNoIHRoYXQgb2JqZWN0IHBhZ2VcbiAqIEBwYXJhbSBvSGVhZGVySW5mbyBUaGUgQFVJLkhlYWRlckluZm8gYW5ub3RhdGlvbiBjb250ZW50XG4gKiBAcGFyYW0gb0hlYWRlckluZm8uRGVzY3JpcHRpb25cbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBvYmplY3QgcGFnZSBkZXNjcmlwdGlvblxuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzc2lvbkZvckRlc2NyaXB0aW9uID0gZnVuY3Rpb24gKFxuXHRmdWxsQ29udGV4dFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8RW50aXR5U2V0Pixcblx0b0hlYWRlckluZm8/OiBIZWFkZXJJbmZvVHlwZVxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRsZXQgZGVzY3JpcHRpb25CaW5kaW5nID0gZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKChvSGVhZGVySW5mbz8uRGVzY3JpcHRpb24gYXMgRGF0YUZpZWxkVHlwZXMpPy5WYWx1ZSk7XG5cdGlmICgob0hlYWRlckluZm8/LkRlc2NyaXB0aW9uIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LlRleHQ/LmFubm90YXRpb25zPy5VST8uVGV4dEFycmFuZ2VtZW50KSB7XG5cdFx0Ly8gSW4gY2FzZSBhbiBleHBsaWNpdCB0ZXh0IGFycmFuZ2VtZW50IHdhcyBzZXQgd2UgbWFrZSB1c2Ugb2YgaXQgaW4gdGhlIGRlc2NyaXB0aW9uIGFzIHdlbGxcblx0XHRkZXNjcmlwdGlvbkJpbmRpbmcgPSBhZGRUZXh0QXJyYW5nZW1lbnRUb0JpbmRpbmdFeHByZXNzaW9uKGRlc2NyaXB0aW9uQmluZGluZywgZnVsbENvbnRleHRQYXRoKTtcblx0fVxuXHRjb25zdCBkZXNjcmlwdGlvbiA9IGNvbXBpbGVFeHByZXNzaW9uKGZvcm1hdFZhbHVlUmVjdXJzaXZlbHkoZGVzY3JpcHRpb25CaW5kaW5nLCBmdWxsQ29udGV4dFBhdGgpKTtcblx0cmV0dXJuIGRlc2NyaXB0aW9uID09PSBcInVuZGVmaW5lZFwiID8gXCJcIiA6IGRlc2NyaXB0aW9uO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGV4cHJlc3Npb24gZm9yIHRoZSBzYXZlIGJ1dHRvbi5cbiAqIEBwYXJhbSBvVmlld0RhdGEgVGhlIGN1cnJlbnQgdmlldyBkYXRhXG4gKiBAcGFyYW0gZnVsbENvbnRleHRQYXRoIFRoZSBwYXRoIHVzZWQgdXAgdW50aWwgaGVyZVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiB0aGF0IHNob3dzIHRoZSByaWdodCBzYXZlIGJ1dHRvbiB0ZXh0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHByZXNzaW9uRm9yU2F2ZUJ1dHRvbiA9IGZ1bmN0aW9uIChcblx0b1ZpZXdEYXRhOiBWaWV3RGF0YSxcblx0ZnVsbENvbnRleHRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPEVudGl0eVNldD5cbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0Y29uc3Qgc2F2ZUJ1dHRvblRleHQgPSBvVmlld0RhdGEucmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiVF9PUF9PQkpFQ1RfUEFHRV9TQVZFXCIpO1xuXHRjb25zdCBjcmVhdGVCdXR0b25UZXh0ID0gb1ZpZXdEYXRhLnJlc291cmNlTW9kZWwuZ2V0VGV4dChcIlRfT1BfT0JKRUNUX1BBR0VfQ1JFQVRFXCIpO1xuXHRsZXQgc2F2ZUV4cHJlc3Npb247XG5cblx0aWYgKChmdWxsQ29udGV4dFBhdGguc3RhcnRpbmdFbnRpdHlTZXQgYXMgRW50aXR5U2V0KS5hbm5vdGF0aW9ucy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkKSB7XG5cdFx0Ly8gSWYgd2UncmUgaW4gc3RpY2t5IG1vZGUgQU5EIHRoZSB1aSBpcyBpbiBjcmVhdGUgbW9kZSwgc2hvdyBDcmVhdGUsIGVsc2Ugc2hvdyBTYXZlXG5cdFx0c2F2ZUV4cHJlc3Npb24gPSBpZkVsc2UoVUkuSXNDcmVhdGVNb2RlLCBjcmVhdGVCdXR0b25UZXh0LCBzYXZlQnV0dG9uVGV4dCk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gSWYgd2UncmUgaW4gZHJhZnQgQU5EIHRoZSBkcmFmdCBpcyBhIG5ldyBvYmplY3QgKCFJc0FjdGl2ZUVudGl0eSAmJiAhSGFzQWN0aXZlRW50aXR5KSwgc2hvdyBjcmVhdGUsIGVsc2Ugc2hvdyBzYXZlXG5cdFx0c2F2ZUV4cHJlc3Npb24gPSBpZkVsc2UoRHJhZnQuSXNOZXdPYmplY3QsIGNyZWF0ZUJ1dHRvblRleHQsIHNhdmVCdXR0b25UZXh0KTtcblx0fVxuXHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oc2F2ZUV4cHJlc3Npb24pO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGV4cHJlc3Npb24gb2YgdGhlIGxhYmVsIGZvciBhIGZpZWxkIGludG8gYSBoZWFkZXIgZm9ybS5cbiAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgb2YgdGhlIGhlYWRlciBmb3JtIGluIGFuIG9iamVjdCBwYWdlLlxuICogQHBhcmFtIHZpZXdEYXRhIFRoZSBjdXJyZW50IHZpZXcgZGF0YS5cbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSB0cmFuc2xhdGVkIGxhYmVsIG9mIHRoZSBvZiB0aGUgaGVhZGVyIGZvcm0gaW4gYW4gb2JqZWN0IHBhZ2UuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHByZXNzaW9uRm9yTGFiZWxPbkhlYWRlckZvcm0gPSBmdW5jdGlvbiAobGFiZWw6IFN0cmluZywgdmlld0RhdGE6IFZpZXdEYXRhKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRyZXR1cm4gdmlld0RhdGEucmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiSEVBREVSX0ZPUk1fTEFCRUxcIiwgW2xhYmVsXSk7XG59O1xuXG4vKipcbiAqIE1ldGhvZCByZXR1cm5zIFdoZXRoZXIgdGhlIGFjdGlvbiB0eXBlIGlzIG1hbmlmZXN0IG9yIG5vdC5cbiAqIEBwYXJhbSBhY3Rpb24gVGhlIGFjdGlvbiBvYmplY3RcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBhY3Rpb24gaXMgY29taW5nIGZyb20gbWFuaWZlc3QsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBjb25zdCBpc01hbmlmZXN0QWN0aW9uID0gZnVuY3Rpb24gKGFjdGlvbjogQmFzZUFjdGlvbiB8IEN1c3RvbUFjdGlvbik6IGFjdGlvbiBpcyBDdXN0b21BY3Rpb24ge1xuXHRjb25zdCBub25NYW5pZmVzdEFjdGlvbnMgPSBbXG5cdFx0XCJQcmltYXJ5XCIsXG5cdFx0XCJEZWZhdWx0QXBwbHlcIixcblx0XHRcIlNlY29uZGFyeVwiLFxuXHRcdFwiRm9yQWN0aW9uXCIsXG5cdFx0XCJGb3JOYXZpZ2F0aW9uXCIsXG5cdFx0XCJTd2l0Y2hUb0FjdGl2ZU9iamVjdFwiLFxuXHRcdFwiU3dpdGNoVG9EcmFmdE9iamVjdFwiLFxuXHRcdFwiRHJhZnRBY3Rpb25zXCIsXG5cdFx0XCJDb3B5XCIsXG5cdFx0XCJTdGFuZGFyZFwiXG5cdF07XG5cdHJldHVybiAhbm9uTWFuaWZlc3RBY3Rpb25zLmluY2x1ZGVzKGFjdGlvbi50eXBlID8/IFwiXCIpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgY29tcGlsZWQgZXhwcmVzc2lvbiB0aGF0IGRldGVybWluZXMgdGhlIGVtcGhhc2l6ZWQgYnV0dG9uIHR5cGUgYmFzZWQgb24gY3JpdGljYWxpdHkgYWNyb3NzIGFsbCBhY3Rpb25zLlxuICogSWYgYSBjcml0aWNhbCBhY3Rpb24gaXMgcmVuZGVyZWQsIGl0IGlzIHRyZWF0ZWQgYXMgdGhlIHByaW1hcnkgYWN0aW9uLCBhbmQgdGhlIHRlbXBsYXRlJ3MgZGVmYXVsdCBwcmltYXJ5IGFjdGlvbiBpcyBzdXBwcmVzc2VkLlxuICogQHBhcmFtIGRhdGFDb250ZXh0UGF0aCBUaGUgRGF0YU1vZGVsT2JqZWN0UGF0aCByZWxhdGVkIHRvIHRoZSBjb250ZXh0XG4gKiBAcmV0dXJucyBBIGNvbXBpbGVkIGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgdG8gdGhlIGJ1dHRvbiB0eXBlIHRvIHVzZVxuICovXG5leHBvcnQgY29uc3QgYnVpbGRFbXBoYXNpemVkQnV0dG9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChcblx0ZGF0YUNvbnRleHRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPEVudGl0eVNldCB8IE5hdmlnYXRpb25Qcm9wZXJ0eSB8IFNpbmdsZXRvbj5cbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0Y29uc3QgaWRlbnRpZmljYXRpb24gPSBkYXRhQ29udGV4dFBhdGgudGFyZ2V0RW50aXR5VHlwZT8uYW5ub3RhdGlvbnM/LlVJPy5JZGVudGlmaWNhdGlvbjtcblx0Y29uc3QgZGF0YUZpZWxkc1dpdGhDcml0aWNhbGl0eSA9XG5cdFx0aWRlbnRpZmljYXRpb24/LmZpbHRlcigoZGF0YUZpZWxkKSA9PiBkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbiAmJiBkYXRhRmllbGQuQ3JpdGljYWxpdHkpIHx8IFtdO1xuXG5cdGNvbnN0IGNyaXRpY2FsQWN0aW9uc1Zpc2libGVFeHByZXNzaW9ucyA9IGRhdGFGaWVsZHNXaXRoQ3JpdGljYWxpdHkubGVuZ3RoXG5cdFx0PyBkYXRhRmllbGRzV2l0aENyaXRpY2FsaXR5Lm1hcCgoZGF0YUZpZWxkKSA9PiB7XG5cdFx0XHRcdC8vIENyaXRpY2FsaXR5IHN1cHByZXNzZXMgZW1waGFzaXMgaWYgdGhlIGFjdGlvbiBpdHNlbGYgaXMgdmlzaWJsZSAoSGlkZGVuIGlzIGZhbHNlKVxuXHRcdFx0XHRyZXR1cm4gbm90KGVxdWFsKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4pLCB0cnVlKSk7XG5cdFx0ICB9KVxuXHRcdDogKFtjb25zdGFudChmYWxzZSldIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPltdKTtcblxuXHQvLyBJZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgdmlzaWJsZSBhY3Rpb24gd2l0aCBjcml0aWNhbGl0eSwgdGhlIHRlbXBsYXRlJ3MgZGVmYXVsdCBwcmltYXJ5IGFjdGlvbiBpcyBzZXQgYmFjayB0byBHaG9zdFxuXHQvLyBlbHNlIGl0IGlzIGVtcGhhc2l6ZWRcblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGlmRWxzZShvciguLi5jcml0aWNhbEFjdGlvbnNWaXNpYmxlRXhwcmVzc2lvbnMpLCBCdXR0b25UeXBlLkdob3N0LCBCdXR0b25UeXBlLkVtcGhhc2l6ZWQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50QmluZGluZyA9IGZ1bmN0aW9uIChzUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3Qgc05hdmlnYXRpb25QYXRoID0gT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIuZ2V0TmF2aWdhdGlvblBhdGgoc1BhdGgpO1xuXHRpZiAoc05hdmlnYXRpb25QYXRoKSB7XG5cdFx0cmV0dXJuIFwie3BhdGg6J1wiICsgc05hdmlnYXRpb25QYXRoICsgXCInfVwiO1xuXHR9IGVsc2Uge1xuXHRcdC8vbm8gbmF2aWdhdGlvbiBwcm9wZXJ0eSBuZWVkcyBlbXB0eSBvYmplY3Rcblx0XHRyZXR1cm4gXCJ7cGF0aDogJyd9XCI7XG5cdH1cbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gY2hlY2sgaWYgZHJhZnQgcGF0dGVybiBpcyBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0gZW50aXR5U2V0IFRoZSBjdXJyZW50IGVudGl0eSBzZXQuXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBCb29sZWFuIHZhbHVlIGJhc2VkIG9uIGRyYWZ0IHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBjaGVja0RyYWZ0U3RhdGUgPSBmdW5jdGlvbiAoZW50aXR5U2V0OiBFbnRpdHlTZXQpOiBib29sZWFuIHtcblx0aWYgKGVudGl0eVNldC5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3Q/LkVkaXRBY3Rpb24pIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZmluZCBhbiBhY3Rpb24gZnJvbSB0aGUgYXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgaW4gdGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiAnaGVhZGVyJyBhY3Rpb25zIG9uIHRoZSBvYmplY3QgcGFnZS5cbiAqIEBwYXJhbSBzQWN0aW9uVHlwZSBUaGUgYWN0aW9uIHR5cGVcbiAqIEByZXR1cm5zIFRoZSBhY3Rpb24gd2l0aCB0aGUgbWF0Y2hpbmcgYWN0aW9uIHR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IF9maW5kQWN0aW9uID0gZnVuY3Rpb24gKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9uczogQmFzZUFjdGlvbltdLCBzQWN0aW9uVHlwZTogc3RyaW5nKTogQmFzZUFjdGlvbiB8IHVuZGVmaW5lZCB7XG5cdGxldCBvQWN0aW9uOiBCYXNlQWN0aW9uIHwgdW5kZWZpbmVkO1xuXHRpZiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zICYmIGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucy5sZW5ndGgpIHtcblx0XHRvQWN0aW9uID0gYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLmZpbmQoZnVuY3Rpb24gKG9IZWFkZXJBY3Rpb246IEJhc2VBY3Rpb24pIHtcblx0XHRcdHJldHVybiBvSGVhZGVyQWN0aW9uLnR5cGUgPT09IHNBY3Rpb25UeXBlO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBvQWN0aW9uO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBmb3IgdGhlIERlbGV0ZSBidXR0b24gb24gdGhlIG9iamVjdCBwYWdlIG9yIHN1Ym9iamVjdCBwYWdlIGluIGNhc2Ugb2YgYSBDb21tYW5kIEV4ZWN1dGlvbi5cbiAqIEBwYXJhbSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlXG4gKiBAcmV0dXJucyBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGZyb20gdGhlIGNvbnZlcnRlciBvdXRwdXRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldERlbGV0ZUNvbW1hbmRFeGVjdXRpb25FbmFibGVkID0gZnVuY3Rpb24gKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9uczogQmFzZUFjdGlvbltdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Y29uc3Qgb0RlbGV0ZUFjdGlvbiA9IF9maW5kQWN0aW9uKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucywgXCJTZWNvbmRhcnlcIik7XG5cdHJldHVybiBvRGVsZXRlQWN0aW9uID8gb0RlbGV0ZUFjdGlvbi5lbmFibGVkIDogXCJmYWxzZVwiO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICd2aXNpYmxlJyBwcm9wZXJ0eSBmb3IgdGhlIERlbGV0ZSBidXR0b24gb24gdGhlIG9iamVjdCBwYWdlIG9yIHN1Ym9iamVjdCBwYWdlIGluIGNhc2Ugb2YgYSBDb21tYW5kIEV4ZWN1dGlvbi5cbiAqIEBwYXJhbSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlXG4gKiBAcmV0dXJucyBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGZyb20gdGhlIGNvbnZlcnRlciBvdXRwdXRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldERlbGV0ZUNvbW1hbmRFeGVjdXRpb25WaXNpYmxlID0gZnVuY3Rpb24gKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9uczogQmFzZUFjdGlvbltdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Y29uc3Qgb0RlbGV0ZUFjdGlvbiA9IF9maW5kQWN0aW9uKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucywgXCJTZWNvbmRhcnlcIik7XG5cdHJldHVybiBvRGVsZXRlQWN0aW9uID8gb0RlbGV0ZUFjdGlvbi52aXNpYmxlIDogXCJmYWxzZVwiO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICd2aXNpYmxlJyBwcm9wZXJ0eSBmb3IgdGhlIEVkaXQgYnV0dG9uIG9uIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGEgQ29tbWFuZCBFeGVjdXRpb24uXG4gKiBAcGFyYW0gYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zIEFycmF5IG9mIGhlYWRlciBhY3Rpb25zIG9uIHRoZSBvYmplY3QgcGFnZVxuICogQHJldHVybnMgUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBmcm9tIHRoZSBjb252ZXJ0ZXIgb3V0cHV0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFZGl0Q29tbWFuZEV4ZWN1dGlvblZpc2libGUgPSBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBCYXNlQWN0aW9uW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRjb25zdCBvRWRpdEFjdGlvbiA9IF9maW5kQWN0aW9uKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucywgXCJQcmltYXJ5XCIpO1xuXHRyZXR1cm4gb0VkaXRBY3Rpb24gPyBvRWRpdEFjdGlvbi52aXNpYmxlIDogXCJmYWxzZVwiO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBmb3IgdGhlIEVkaXQgYnV0dG9uIG9uIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGEgQ29tbWFuZCBFeGVjdXRpb24uXG4gKiBAcGFyYW0gYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zIEFycmF5IG9mIGhlYWRlciBhY3Rpb25zIG9uIHRoZSBvYmplY3QgcGFnZVxuICogQHJldHVybnMgUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBmcm9tIHRoZSBjb252ZXJ0ZXIgb3V0cHV0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFZGl0Q29tbWFuZEV4ZWN1dGlvbkVuYWJsZWQgPSBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBCYXNlQWN0aW9uW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRjb25zdCBvRWRpdEFjdGlvbiA9IF9maW5kQWN0aW9uKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucywgXCJQcmltYXJ5XCIpO1xuXHRyZXR1cm4gb0VkaXRBY3Rpb24gPyBvRWRpdEFjdGlvbi5lbmFibGVkIDogXCJmYWxzZVwiO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIEVkaXRBY3Rpb24gZnJvbSB0aGUgYmFzZWQgb24gYSBkcmFmdC1lbmFibGVkIGFwcGxpY2F0aW9uIG9yIGEgc3RpY2t5IGFwcGxpY2F0aW9uLlxuICogQHBhcmFtIFtvRW50aXR5U2V0XSBUaGUgdmFsdWUgZnJvbSB0aGUgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgYmFzZWQgb24gdlJhd1ZhbHVlICYgb0RyYWZ0Tm9kZVxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdEFjdGlvbiA9IGZ1bmN0aW9uIChvRW50aXR5U2V0OiBDb250ZXh0KTogc3RyaW5nIHtcblx0Y29uc3Qgc1BhdGggPSBvRW50aXR5U2V0LmdldFBhdGgoKTtcblx0Y29uc3QgYVBhdGhzID0gc1BhdGguc3BsaXQoXCIvXCIpO1xuXHRjb25zdCByb290RW50aXR5U2V0UGF0aCA9IFwiL1wiICsgYVBhdGhzWzFdO1xuXHQvLyBnZXQgdGhlIGVkaXQgYWN0aW9uIGZyb20gcm9vdCBlbnRpdHkgc2V0c1xuXHRjb25zdCByb290RW50aXR5U2V0QW5ubm90YXRpb25zID0gb0VudGl0eVNldC5nZXRPYmplY3Qocm9vdEVudGl0eVNldFBhdGggKyBcIkBcIik7XG5cdGNvbnN0IGJEcmFmdFJvb3QgPSByb290RW50aXR5U2V0QW5ubm90YXRpb25zLmhhc093blByb3BlcnR5KFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIik7XG5cdGNvbnN0IGJEcmFmdE5vZGUgPSByb290RW50aXR5U2V0QW5ubm90YXRpb25zLmhhc093blByb3BlcnR5KFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGVcIik7XG5cdGNvbnN0IGJTdGlja3lTZXNzaW9uID0gcm9vdEVudGl0eVNldEFubm5vdGF0aW9ucy5oYXNPd25Qcm9wZXJ0eShcIkBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWRcIik7XG5cdGxldCBzQWN0aW9uTmFtZTtcblx0aWYgKGJEcmFmdFJvb3QpIHtcblx0XHRzQWN0aW9uTmFtZSA9IG9FbnRpdHlTZXQuZ2V0T2JqZWN0KGAke3Jvb3RFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L0VkaXRBY3Rpb25gKTtcblx0fSBlbHNlIGlmIChiRHJhZnROb2RlKSB7XG5cdFx0c0FjdGlvbk5hbWUgPSBvRW50aXR5U2V0LmdldE9iamVjdChgJHtyb290RW50aXR5U2V0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZS9FZGl0QWN0aW9uYCk7XG5cdH0gZWxzZSBpZiAoYlN0aWNreVNlc3Npb24pIHtcblx0XHRzQWN0aW9uTmFtZSA9IG9FbnRpdHlTZXQuZ2V0T2JqZWN0KGAke3Jvb3RFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWQvRWRpdEFjdGlvbmApO1xuXHR9XG5cdHJldHVybiAhc0FjdGlvbk5hbWUgPyBzQWN0aW9uTmFtZSA6IGAke3Jvb3RFbnRpdHlTZXRQYXRofS8ke3NBY3Rpb25OYW1lfWA7XG59O1xuXG5leHBvcnQgY29uc3QgaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyA9IGZ1bmN0aW9uIChvQW5ub3RhdGlvbnM/OiBNZXRhTW9kZWxQcm9wZXJ0eUFubm90YXRpb25zLCBvRmllbGRDb250cm9sPzogc3RyaW5nKTogYm9vbGVhbiB7XG5cdGxldCBiQ29tcHV0ZWQsIGJJbW11dGFibGUsIGJSZWFkT25seTtcblxuXHRpZiAob0Fubm90YXRpb25zICYmIG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5Db21wdXRlZFwiXSkge1xuXHRcdGJDb21wdXRlZCA9IChvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIl0gYXMgeyBCb29sPzogc3RyaW5nIH0pLkJvb2xcblx0XHRcdD8gKG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5Db21wdXRlZFwiXSBhcyB7IEJvb2w/OiBzdHJpbmcgfSkuQm9vbCA9PSBcInRydWVcIlxuXHRcdFx0OiB0cnVlO1xuXHR9XG5cdGlmIChvQW5ub3RhdGlvbnMgJiYgb0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkltbXV0YWJsZVwiXSkge1xuXHRcdGJJbW11dGFibGUgPSAob0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkltbXV0YWJsZVwiXSBhcyB7IEJvb2w/OiBzdHJpbmcgfSkuQm9vbFxuXHRcdFx0PyAob0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkltbXV0YWJsZVwiXSBhcyB7IEJvb2w/OiBzdHJpbmcgfSkuQm9vbCA9PSBcInRydWVcIlxuXHRcdFx0OiB0cnVlO1xuXHR9XG5cdGJSZWFkT25seSA9IGJDb21wdXRlZCB8fCBiSW1tdXRhYmxlO1xuXG5cdGlmIChvRmllbGRDb250cm9sKSB7XG5cdFx0YlJlYWRPbmx5ID0gYlJlYWRPbmx5IHx8IG9GaWVsZENvbnRyb2wgPT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sVHlwZS9SZWFkT25seVwiO1xuXHR9XG5cdGlmIChiUmVhZE9ubHkpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbmV4cG9ydCBjb25zdCByZWFkT25seUV4cHJlc3Npb25Gcm9tRHluYW1pY0Fubm90YXRpb25zID0gZnVuY3Rpb24gKG9GaWVsZENvbnRyb2w/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRsZXQgc0lzRmllbGRDb250cm9sUGF0aFJlYWRPbmx5O1xuXHRpZiAob0ZpZWxkQ29udHJvbCkge1xuXHRcdGlmIChCaW5kaW5nSW5mby5wYXJzZShvRmllbGRDb250cm9sKSkge1xuXHRcdFx0c0lzRmllbGRDb250cm9sUGF0aFJlYWRPbmx5ID0gXCIlXCIgKyBvRmllbGRDb250cm9sICsgXCIgPT09IDEgXCI7XG5cdFx0fVxuXHR9XG5cdGlmIChzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkpIHtcblx0XHRyZXR1cm4gXCJ7PSBcIiArIHNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seSArIFwiPyBmYWxzZSA6IHRydWUgfVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn07XG5cbi8qXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIGV4cHJlc3Npb24gZm9yIGNoYXJ0IFRpdGxlIFByZXNzXG4gKlxuICogQGZ1bmN0aW9ud1xuICogQHBhcmFtIHtvQ29uZmlndXJhdGlvbn0gW29Db25maWd1cmF0aW9uc10gY29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3RcbiAqICBAcGFyYW0ge29NYW5pZmVzdH0gW29NYW5pZmVzdF0gT3V0Ym91bmRzIGZyb20gbWFuaWZlc3RcbiAqIHJldHVybnMge1N0cmluZ30gW3NDb2xsZWN0aW9uTmFtZV0gQ29sbGVjdGlvbiBOYW1lIG9mIHRoZSBNaWNybyBDaGFydFxuICpcbiAqIHJldHVybnMge1N0cmluZ30gW0V4cHJlc3Npb25dIEhhbmRsZXIgRXhwcmVzc2lvbiBmb3IgdGhlIHRpdGxlIHByZXNzXG4gKlxuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzc2lvbkZvck1pY3JvQ2hhcnRUaXRsZVByZXNzID0gZnVuY3Rpb24gKFxuXHRvQ29uZmlndXJhdGlvbjogQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdHRhcmdldEFubm90YXRpb25QYXRoOiBzdHJpbmcsXG5cdHRhcmdldEFubm90YXRpb25QYXRoRGF0TW9kZWxPYmplY3Q6IERhdGFNb2RlbE9iamVjdFBhdGg8Q2hhcnQgfCBQcmVzZW50YXRpb25WYXJpYW50Pixcblx0b01hbmlmZXN0T3V0Ym91bmQ6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0T3V0Ym91bmRFbnRyeT4sXG5cdHNDb2xsZWN0aW9uTmFtZTogc3RyaW5nXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHR0YXJnZXRBbm5vdGF0aW9uUGF0aCA9IGdldE1pY3JvQ2hhcnRDb250cm9sQ29uZmlndXJhdGlvblBhdGgodGFyZ2V0QW5ub3RhdGlvblBhdGgsIHRhcmdldEFubm90YXRpb25QYXRoRGF0TW9kZWxPYmplY3QsIHNDb2xsZWN0aW9uTmFtZSk7XG5cdGNvbnN0IG5hdmlnYXRpb25Db25maWd1cmF0aW9uID0gKG9Db25maWd1cmF0aW9uPy5bdGFyZ2V0QW5ub3RhdGlvblBhdGhdIGFzIE1pY3JvQ2hhcnRNYW5pZmVzdENvbmZpZ3VyYXRpb24pPy5bXCJuYXZpZ2F0aW9uXCJdO1xuXHRpZiAobmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24pIHtcblx0XHRpZiAoXG5cdFx0XHQobmF2aWdhdGlvbkNvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSAmJiBuYXZpZ2F0aW9uQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0pIHx8XG5cdFx0XHQobmF2aWdhdGlvbkNvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSAmJlxuXHRcdFx0XHRuYXZpZ2F0aW9uQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0gJiZcblx0XHRcdFx0bmF2aWdhdGlvbkNvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSlcblx0XHQpIHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFwiLmhhbmRsZXJzLm9uRGF0YVBvaW50VGl0bGVQcmVzc2VkKCRjb250cm9sbGVyLCAkeyRzb3VyY2U+L30sJ1wiICtcblx0XHRcdFx0SlNPTi5zdHJpbmdpZnkob01hbmlmZXN0T3V0Ym91bmQpICtcblx0XHRcdFx0XCInLCdcIiArXG5cdFx0XHRcdG5hdmlnYXRpb25Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl1bXCJvdXRib3VuZFwiXSArXG5cdFx0XHRcdFwiJywnXCIgK1xuXHRcdFx0XHRzQ29sbGVjdGlvbk5hbWUgK1xuXHRcdFx0XHRcIicgKVwiXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSBpZiAobmF2aWdhdGlvbkNvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkge1xuXHRcdFx0cmV0dXJuIFwiLmhhbmRsZXJzLm5hdmlnYXRlVG9TdWJTZWN0aW9uKCRjb250cm9sbGVyLCAnXCIgKyBKU09OLnN0cmluZ2lmeShuYXZpZ2F0aW9uQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSArIFwiJylcIjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cbn07XG5cbi8qXG4gKiBGdW5jdGlvbiB0byByZW5kZXIgQ2hhcnQgVGl0bGUgYXMgTGlua1xuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtvQ29udHJvbENvbmZpZ3VyYXRpb259IFtvQ29uZmlndXJhdGlvbnNdIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmcm9tIG1hbmlmZXN0XG4gKiByZXR1cm5zIHtTdHJpbmd9IFtzS2V5XSBGb3IgdGhlIFRhcmdldE91dGJvdW5kIGFuZCBUYXJnZXRTZWN0aW9uXG4gKlxuICovXG5leHBvcnQgY29uc3QgZ2V0TWljcm9DaGFydFRpdGxlQXNMaW5rID0gZnVuY3Rpb24gKFxuXHRvQ29udHJvbENvbmZpZ3VyYXRpb246IENvbnRyb2xDb25maWd1cmF0aW9uLFxuXHR0YXJnZXRBbm5vdGF0aW9uUGF0aDogc3RyaW5nLFxuXHR0YXJnZXRBbm5vdGF0aW9uUGF0aERhdE1vZGVsT2JqZWN0OiBEYXRhTW9kZWxPYmplY3RQYXRoPENoYXJ0IHwgUHJlc2VudGF0aW9uVmFyaWFudD4sXG5cdGNvbGxlY3Rpb25OYW1lOiBzdHJpbmdcbik6IHN0cmluZyB7XG5cdHRhcmdldEFubm90YXRpb25QYXRoID0gZ2V0TWljcm9DaGFydENvbnRyb2xDb25maWd1cmF0aW9uUGF0aCh0YXJnZXRBbm5vdGF0aW9uUGF0aCwgdGFyZ2V0QW5ub3RhdGlvblBhdGhEYXRNb2RlbE9iamVjdCwgY29sbGVjdGlvbk5hbWUpO1xuXHRjb25zdCB0YXJnZXRDb250cm9sQ29uZmlndXJhdGlvbiA9IChvQ29udHJvbENvbmZpZ3VyYXRpb24/Llt0YXJnZXRBbm5vdGF0aW9uUGF0aF0gYXMgTWljcm9DaGFydE1hbmlmZXN0Q29uZmlndXJhdGlvbik/LltcIm5hdmlnYXRpb25cIl07XG5cdGlmIChcblx0XHR0YXJnZXRDb250cm9sQ29uZmlndXJhdGlvbiAmJlxuXHRcdCh0YXJnZXRDb250cm9sQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdIHx8XG5cdFx0XHQodGFyZ2V0Q29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSAmJiB0YXJnZXRDb250cm9sQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSlcblx0KSB7XG5cdFx0cmV0dXJuIFwiRXh0ZXJuYWxcIjtcblx0fSBlbHNlIGlmICh0YXJnZXRDb250cm9sQ29uZmlndXJhdGlvbiAmJiB0YXJnZXRDb250cm9sQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0cmV0dXJuIFwiSW5QYWdlXCI7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIFwiTm9uZVwiO1xuXHR9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWljcm9DaGFydENvbnRyb2xDb25maWd1cmF0aW9uUGF0aCA9IGZ1bmN0aW9uIChcblx0dGFyZ2V0QW5ub3RhdGlvblBhdGg6IHN0cmluZyxcblx0dGFyZ2V0QW5ub3RhdGlvblBhdGhEYXRNb2RlbE9iamVjdDogRGF0YU1vZGVsT2JqZWN0UGF0aDxDaGFydCB8IFByZXNlbnRhdGlvblZhcmlhbnQ+LFxuXHRjb2xsZWN0aW9uTmFtZTogc3RyaW5nXG4pOiBzdHJpbmcge1xuXHRpZiAodGFyZ2V0QW5ub3RhdGlvblBhdGhEYXRNb2RlbE9iamVjdD8udGFyZ2V0T2JqZWN0Py4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5QcmVzZW50YXRpb25WYXJpYW50VHlwZVwiKSB7XG5cdFx0dGFyZ2V0QW5ub3RhdGlvblBhdGggPSB0YXJnZXRBbm5vdGF0aW9uUGF0aERhdE1vZGVsT2JqZWN0LnRhcmdldE9iamVjdD8uVmlzdWFsaXphdGlvbnNbMF0/LnZhbHVlO1xuXHRcdHRhcmdldEFubm90YXRpb25QYXRoID0gY29sbGVjdGlvbk5hbWUgPyBgJHtjb2xsZWN0aW9uTmFtZX0vJHt0YXJnZXRBbm5vdGF0aW9uUGF0aH1gIDogdGFyZ2V0QW5ub3RhdGlvblBhdGg7XG5cdH1cblx0cmV0dXJuIHRhcmdldEFubm90YXRpb25QYXRoO1xufTtcblxuLyogR2V0IGdyb3VwSWQgZnJvbSBjb250cm9sIGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb0NvbmZpZ3VyYXRpb25zXSBjb250cm9sIGNvbmZpZ3VyYXRpb24gZnJvbSBtYW5pZmVzdFxuICogQHBhcmFtIHtTdHJpbmd9IFtzQW5ub3RhdGlvblBhdGhdIEFubm90YXRpb24gUGF0aCBmb3IgdGhlIGNvbmZpZ3VyYXRpb25cbiAqIEBkZXNjcmlwdGlvbiBVc2VkIHRvIGdldCB0aGUgZ3JvdXBJZCBmb3IgRGF0YVBvaW50cyBhbmQgTWljcm9DaGFydHMgaW4gdGhlIEhlYWRlci5cbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRHcm91cElkRnJvbUNvbmZpZyA9IGZ1bmN0aW9uIChcblx0b0NvbmZpZ3VyYXRpb25zOiBDb250cm9sQ29uZmlndXJhdGlvbixcblx0c0Fubm90YXRpb25QYXRoOiBzdHJpbmcsXG5cdHNEZWZhdWx0R3JvdXBJZD86IHN0cmluZ1xuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Y29uc3Qgb0NvbmZpZ3VyYXRpb24gPSBvQ29uZmlndXJhdGlvbnNbc0Fubm90YXRpb25QYXRoXSBhcyBNaWNyb0NoYXJ0TWFuaWZlc3RDb25maWd1cmF0aW9uLFxuXHRcdGFBdXRvUGF0dGVybnMgPSBbXCJIZXJvZXNcIiwgXCJEZWNvcmF0aW9uXCIsIFwiV29ya2Vyc1wiLCBcIkxvbmdSdW5uZXJzXCJdO1xuXHRsZXQgc0dyb3VwSWQgPSBzRGVmYXVsdEdyb3VwSWQ7XG5cdGlmIChcblx0XHRvQ29uZmlndXJhdGlvbiAmJlxuXHRcdG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkICYmXG5cdFx0YUF1dG9QYXR0ZXJucy5zb21lKGZ1bmN0aW9uIChhdXRvUGF0dGVybjogc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gYXV0b1BhdHRlcm4gPT09IG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkO1xuXHRcdH0pXG5cdCkge1xuXHRcdHNHcm91cElkID0gXCIkYXV0by5cIiArIG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkO1xuXHR9XG5cdHJldHVybiBzR3JvdXBJZDtcbn07XG5cbi8qKlxuICogR2V0cyBncm91cElkIGZyb20gY29udHJvbCBjb25maWd1cmF0aW9uIGZvciBtaWNybyBjaGFydC5cbiAqIEBwYXJhbSBvQ29udHJvbENvbmZpZ3VyYXRpb24gQ29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3RcbiAqIEBwYXJhbSB0YXJnZXRBbm5vdGF0aW9uUGF0aCBBbm5vdGF0aW9uIHBhdGggZm9yIHRoZSBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0gdGFyZ2V0QW5ub3RhdGlvblBhdGhEYXRhTW9kZWxPYmplY3QgRGF0YU1vZGVsT2JqZWN0IG9mIENoYXJ0IG9yIFByZXNlbnRhdGlvblZhcmlhbnRcbiAqIEBwYXJhbSBjb2xsZWN0aW9uTmFtZSBDb2xsZWN0aW9uIE5hbWVcbiAqIEBwYXJhbSBzRGVmYXVsdEdyb3VwSWQgRGVmYXVsdCBHcm91cElkXG4gKiBAcmV0dXJucyBHcm91cElkIGZvciBtaWNybyBjaGFydFxuICovXG5leHBvcnQgY29uc3QgZ2V0R3JvdXBJZEZyb21Db25maWdGb3JNaWNyb0NoYXJ0ID0gZnVuY3Rpb24gKFxuXHRvQ29udHJvbENvbmZpZ3VyYXRpb246IENvbnRyb2xDb25maWd1cmF0aW9uLFxuXHR0YXJnZXRBbm5vdGF0aW9uUGF0aDogc3RyaW5nLFxuXHR0YXJnZXRBbm5vdGF0aW9uUGF0aERhdGFNb2RlbE9iamVjdDogRGF0YU1vZGVsT2JqZWN0UGF0aDxDaGFydCB8IFByZXNlbnRhdGlvblZhcmlhbnQ+LFxuXHRjb2xsZWN0aW9uTmFtZTogc3RyaW5nLFxuXHRzRGVmYXVsdEdyb3VwSWQ/OiBzdHJpbmdcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdHRhcmdldEFubm90YXRpb25QYXRoID0gZ2V0TWljcm9DaGFydENvbnRyb2xDb25maWd1cmF0aW9uUGF0aCh0YXJnZXRBbm5vdGF0aW9uUGF0aCwgdGFyZ2V0QW5ub3RhdGlvblBhdGhEYXRhTW9kZWxPYmplY3QsIGNvbGxlY3Rpb25OYW1lKTtcblx0cmV0dXJuIGdldEdyb3VwSWRGcm9tQ29uZmlnKG9Db250cm9sQ29uZmlndXJhdGlvbiwgdGFyZ2V0QW5ub3RhdGlvblBhdGgsIHNEZWZhdWx0R3JvdXBJZCk7XG59O1xuXG4vKlxuICogR2V0IENvbnRleHQgQmluZGluZyB3aXRoIGdyb3VwSWQgZnJvbSBjb250cm9sIGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb0NvbmZpZ3VyYXRpb25zXSBjb250cm9sIGNvbmZpZ3VyYXRpb24gZnJvbSBtYW5pZmVzdFxuICogQHBhcmFtIHtTdHJpbmd9IFtzS2V5XSBBbm5vdGF0aW9uIFBhdGggZm9yIG9mIHRoZSBjb25maWd1cmF0aW9uXG4gKiBAZGVzY3JpcHRpb24gVXNlZCB0byBnZXQgdGhlIGJpbmRpbmcgZm9yIERhdGFQb2ludHMgaW4gdGhlIEhlYWRlci5cbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRCaW5kaW5nV2l0aEdyb3VwSWRGcm9tQ29uZmlnID0gZnVuY3Rpb24gKG9Db25maWd1cmF0aW9uczogQ29udHJvbENvbmZpZ3VyYXRpb24sIHNLZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IHNHcm91cElkID0gZ2V0R3JvdXBJZEZyb21Db25maWcob0NvbmZpZ3VyYXRpb25zLCBzS2V5KTtcblx0bGV0IHNCaW5kaW5nO1xuXHRpZiAoc0dyb3VwSWQpIHtcblx0XHRzQmluZGluZyA9IFwieyBwYXRoIDogJycsIHBhcmFtZXRlcnMgOiB7ICQkZ3JvdXBJZCA6ICdcIiArIHNHcm91cElkICsgXCInIH0gfVwiO1xuXHR9XG5cdHJldHVybiBzQmluZGluZztcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0gZGF0YU1vZGVsT2JqZWN0UGF0aCBEYXRhTW9kZWxPYmplY3RQYXRoIG9mIHRoZSBuYXZpZ2F0aW9uUGF0aFxuICogQHJldHVybnMgVGhlIEJpbmRpbmcgZXhwcmVzc2lvbiBpbmNsdWRpbmcgcGF0aCBhbmQgJHNlbGVjdCBxdWVyeSBhcyBwYXJhbWV0ZXIgZGVwZW5kaW5nIG9uIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVCaW5kaW5nRm9yQWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyA9IGZ1bmN0aW9uIChkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPEZhY2V0Pik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGxldCBiaW5kaW5nOiBQYXJ0aWFsPFBhdGhJbk1vZGVsRXhwcmVzc2lvbjx1bmRlZmluZWQ+PiB8IHVuZGVmaW5lZDtcblx0Y29uc3QgYWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyA9IE1vZGVsSGVscGVyLmdldEFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXMoXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aD8udGFyZ2V0RW50aXR5VHlwZSxcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoPy50YXJnZXRFbnRpdHlTZXQgYXMgRW50aXR5U2V0XG5cdCk7XG5cblx0aWYgKGFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXM/Lmxlbmd0aCkge1xuXHRcdGJpbmRpbmcgPSB7XG5cdFx0XHRwYXRoOiBcIlwiXG5cdFx0fTtcblx0XHRiaW5kaW5nLnBhcmFtZXRlcnMgPSB7ICRzZWxlY3Q6IGFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXMuam9pbihcIixcIikgfHwgXCJcIiB9O1xuXHR9XG5cdHJldHVybiBKU09OLnN0cmluZ2lmeShiaW5kaW5nKTtcbn07XG5cbi8qKlxuICogTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgYSBGaWVsZEdyb3VwIGNvbnNpc3RzIG9mIG9ubHkgMSBEYXRhRmllbGQgd2l0aCBNdWx0aUxpbmUgdGV4dCBhbm5vdGF0aW9uLlxuICogQHBhcmFtIGFGb3JtRWxlbWVudHMgQSBjb2xsZWN0aW9uIG9mIGZvcm0gZWxlbWVudHMgdXNlZCBpbiB0aGUgY3VycmVudCBmaWVsZCBncm91cFxuICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIG9ubHkgMSBkYXRhIGZpZWxkIHdpdGggTXVsdGlsaW5lIHRleHQgYW5ub3RhdGlvbiBleGlzdHMuXG4gKi9cbmV4cG9ydCBjb25zdCBkb2VzRmllbGRHcm91cENvbnRhaW5Pbmx5T25lTXVsdGlMaW5lRGF0YUZpZWxkID0gZnVuY3Rpb24gKGFGb3JtRWxlbWVudHM6IEFubm90YXRpb25Gb3JtRWxlbWVudFtdKTogYm9vbGVhbiB7XG5cdHJldHVybiBhRm9ybUVsZW1lbnRzICYmIGFGb3JtRWxlbWVudHMubGVuZ3RoID09PSAxICYmICEhYUZvcm1FbGVtZW50c1swXS5pc1ZhbHVlTXVsdGlsaW5lVGV4dDtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB2aWV3RGF0YSBTcGVjaWZpZXMgdGhlIFZpZXdEYXRhIG1vZGVsXG4gKiBAcmV0dXJucyBFeHByZXNzaW9uIG9yIEJvb2xlYW4gdmFsdWVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFNoYXJlQnV0dG9uVmlzaWJpbGl0eSA9IGZ1bmN0aW9uICh2aWV3RGF0YTogVmlld0RhdGEpOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGlmICh2aWV3RGF0YS5pc1NoYXJlQnV0dG9uVmlzaWJsZUZvck15SW5ib3ggPT09IGZhbHNlKSB7XG5cdFx0cmV0dXJuIFwiZmFsc2VcIjtcblx0fVxuXHRjb25zdCBzaGFyZUJ1dHRvblZpc2liaWxpdHlFeHAgPSB2aWV3RGF0YS5mY2xFbmFibGVkXG5cdFx0PyBhbmQocGF0aEluTW9kZWwoXCIvc2hvd1NoYXJlSWNvblwiLCBcImZjbGhlbHBlclwiKSwgbm90KFVJLklzQ3JlYXRlTW9kZSkpXG5cdFx0OiBub3QoVUkuSXNDcmVhdGVNb2RlKTtcblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKHNoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCk7XG59O1xuXG4vKlxuICogR2V0cyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgaGVhZGVyIGluZm8gaW4gZWRpdCBtb2RlXG4gKlxuICogSWYgZWl0aGVyIHRoZSB0aXRsZSBvciBkZXNjcmlwdGlvbiBmaWVsZCBmcm9tIHRoZSBoZWFkZXIgYW5ub3RhdGlvbnMgYXJlIGVkaXRhYmxlLCB0aGVuIHRoZVxuICogZWRpdGFibGUgaGVhZGVyIGluZm8gaXMgdmlzaWJsZS5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0Fubm90YXRpb25zXSBBbm5vdGF0aW9ucyBvYmplY3QgZm9yIGdpdmVuIGVudGl0eSBzZXRcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0ZpZWxkQ29udHJvbF0gZmllbGQgY29udHJvbFxuICogcmV0dXJucyB7Kn0gIGJpbmRpbmcgZXhwcmVzc2lvbiBvciBib29sZWFuIHZhbHVlIHJlc29sdmVkIGZvcm0gZnVuY2l0b25zIGlzUmVhZE9ubHlGcm9tU3RhdGljQW5ub3RhdGlvbnMgYW5kIGlzUmVhZE9ubHlGcm9tRHluYW1pY0Fubm90YXRpb25zXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRWaXNpYmxpdHlPZkhlYWRlckluZm8gPSBmdW5jdGlvbiAoXG5cdG9UaXRsZUFubm90YXRpb25zOiBNZXRhTW9kZWxQcm9wZXJ0eUFubm90YXRpb25zLFxuXHRvRGVzY3JpcHRpb25Bbm5vdGF0aW9uczogTWV0YU1vZGVsUHJvcGVydHlBbm5vdGF0aW9ucyxcblx0b0ZpZWxkVGl0bGVGaWVsZENvbnRyb2w/OiBzdHJpbmcsXG5cdG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sPzogc3RyaW5nXG4pOiBib29sZWFuIHwgc3RyaW5nIHtcblx0Ly8gQ2hlY2sgQW5ub3RhdGlvbnMgZm9yIFRpdGxlIEZpZWxkXG5cdC8vIFNldCB0byB0cnVlIGFuZCBkb24ndCB0YWtlIGludG8gYWNjb3VudCwgaWYgdGhlcmUgYXJlIG5vIGFubm90YXRpb25zLCBpLmUuIG5vIHRpdGxlIGV4aXN0c1xuXHRjb25zdCBiSXNUaXRsZVJlYWRPbmx5ID0gb1RpdGxlQW5ub3RhdGlvbnMgPyBpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zKG9UaXRsZUFubm90YXRpb25zLCBvRmllbGRUaXRsZUZpZWxkQ29udHJvbCkgOiB0cnVlO1xuXHRjb25zdCB0aXRsZUV4cHJlc3Npb24gPSByZWFkT25seUV4cHJlc3Npb25Gcm9tRHluYW1pY0Fubm90YXRpb25zKG9GaWVsZFRpdGxlRmllbGRDb250cm9sKTtcblx0Ly8gVGhlcmUgaXMgbm8gZXhwcmVzc2lvbiBhbmQgdGhlIHRpdGxlIGlzIG5vdCByZWFkeSBvbmx5LCB0aGlzIGlzIHN1ZmZpY2llbnQgZm9yIGFuIGVkaXRhYmxlIGhlYWRlclxuXHRpZiAoIWJJc1RpdGxlUmVhZE9ubHkgJiYgIXRpdGxlRXhwcmVzc2lvbikge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gQ2hlY2sgQW5ub3RhdGlvbnMgZm9yIERlc2NyaXB0aW9uIEZpZWxkXG5cdC8vIFNldCB0byB0cnVlIGFuZCBkb24ndCB0YWtlIGludG8gYWNjb3VudCwgaWYgdGhlcmUgYXJlIG5vIGFubm90YXRpb25zLCBpLmUuIG5vIGRlc2NyaXB0aW9uIGV4aXN0c1xuXHRjb25zdCBiSXNEZXNjcmlwdGlvblJlYWRPbmx5ID0gb0Rlc2NyaXB0aW9uQW5ub3RhdGlvbnNcblx0XHQ/IGlzUmVhZE9ubHlGcm9tU3RhdGljQW5ub3RhdGlvbnMob0Rlc2NyaXB0aW9uQW5ub3RhdGlvbnMsIG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sKVxuXHRcdDogdHJ1ZTtcblx0Y29uc3QgZGVzY3JpcHRpb25FeHByZXNzaW9uID0gcmVhZE9ubHlFeHByZXNzaW9uRnJvbUR5bmFtaWNBbm5vdGF0aW9ucyhvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbCk7XG5cdC8vIFRoZXJlIGlzIG5vIGV4cHJlc3Npb24gYW5kIHRoZSBkZXNjcmlwdGlvbiBpcyBub3QgcmVhZHkgb25seSwgdGhpcyBpcyBzdWZmaWNpZW50IGZvciBhbiBlZGl0YWJsZSBoZWFkZXJcblx0aWYgKCFiSXNEZXNjcmlwdGlvblJlYWRPbmx5ICYmICFkZXNjcmlwdGlvbkV4cHJlc3Npb24pIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIEJvdGggdGl0bGUgYW5kIGRlc2NyaXB0aW9uIGFyZSBub3QgZWRpdGFibGUgYW5kIHRoZXJlIGFyZSBubyBkeW5hbWljIGFubm90YXRpb25zXG5cdGlmIChiSXNUaXRsZVJlYWRPbmx5ICYmIGJJc0Rlc2NyaXB0aW9uUmVhZE9ubHkgJiYgIXRpdGxlRXhwcmVzc2lvbiAmJiAhZGVzY3JpcHRpb25FeHByZXNzaW9uKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gTm93IGNvbWJpbmUgZXhwcmVzc2lvbnNcblx0aWYgKHRpdGxlRXhwcmVzc2lvbiAmJiAhZGVzY3JpcHRpb25FeHByZXNzaW9uKSB7XG5cdFx0cmV0dXJuIHRpdGxlRXhwcmVzc2lvbjtcblx0fSBlbHNlIGlmICghdGl0bGVFeHByZXNzaW9uICYmIGRlc2NyaXB0aW9uRXhwcmVzc2lvbikge1xuXHRcdHJldHVybiBkZXNjcmlwdGlvbkV4cHJlc3Npb247XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGNvbWJpbmVUaXRsZUFuZERlc2NyaXB0aW9uRXhwcmVzc2lvbihvRmllbGRUaXRsZUZpZWxkQ29udHJvbCwgb0ZpZWxkRGVzY3JpcHRpb25GaWVsZENvbnRyb2wpO1xuXHR9XG59O1xuXG5leHBvcnQgY29uc3QgY29tYmluZVRpdGxlQW5kRGVzY3JpcHRpb25FeHByZXNzaW9uID0gZnVuY3Rpb24gKG9UaXRsZUZpZWxkQ29udHJvbD86IHN0cmluZywgb0Rlc2NyaXB0aW9uRmllbGRDb250cm9sPzogc3RyaW5nKTogc3RyaW5nIHtcblx0Ly8gSWYgYm90aCBoZWFkZXIgYW5kIHRpdGxlIGZpZWxkIGFyZSBiYXNlZCBvbiBkeW5tYWljIGZpZWxkIGNvbnRyb2wsIHRoZSBlZGl0YWJsZSBoZWFkZXJcblx0Ly8gaXMgdmlzaWJsZSBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgaXMgbm90IHJlYWR5IG9ubHlcblx0cmV0dXJuIFwiez0gJVwiICsgb1RpdGxlRmllbGRDb250cm9sICsgXCIgPT09IDEgPyAoICVcIiArIG9EZXNjcmlwdGlvbkZpZWxkQ29udHJvbCArIFwiID09PSAxID8gZmFsc2UgOiB0cnVlICkgOiB0cnVlIH1cIjtcbn07XG5cbi8qXG4gKiBHZXQgRXhwcmVzc2lvbiBvZiBwcmVzcyBldmVudCBmb3IgdGhlIGRlbGV0ZSBidXR0b24uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gZW50aXR5U2V0IFRoZSBjdXJyZW50IGVudGl0eSBzZXRcbiAqIEBwYXJhbSBjb21wdXRlZEFubm90YXRpb25JbnRlcmZhY2UgVGhlIGN1cnJlbnQgdGVtcGxhdGluZyBjb250ZXh0XG4gKiByZXR1cm5zIFRoZSBmdW5jdGlvbiBzdHJpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIENvbW1vbkhlbHBlcidzIG1ldGhvZCBnZW5lcmF0ZUZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRQcmVzc0V4cHJlc3Npb25Gb3JEZWxldGUgPSBmdW5jdGlvbiAoKTogc3RyaW5nIHtcblx0Y29uc3QgZGVsZXRhYmxlQ29udGV4dHMgPSBcIiR7JHZpZXc+L30uZ2V0QmluZGluZ0NvbnRleHQoKVwiLFxuXHRcdHRpdGxlID0gXCIkeyR2aWV3Pi99LmJ5SWQoJ2ZlOjpPYmplY3RQYWdlJykuZGF0YSgnT2JqZWN0UGFnZVN1YnRpdGxlJylcIixcblx0XHRkZXNjcmlwdGlvbiA9IFwiJHskdmlldz4vfS5ieUlkKCdmZTo6T2JqZWN0UGFnZScpLmRhdGEoJ09iamVjdFBhZ2VEZXNjcmlwdGlvbicpXCI7XG5cblx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdHRpdGxlOiB0aXRsZSxcblx0XHRkZXNjcmlwdGlvbjogZGVzY3JpcHRpb25cblx0fTtcblx0cmV0dXJuIENvbW1vbkhlbHBlci5nZW5lcmF0ZUZ1bmN0aW9uKFwiLmVkaXRGbG93LmRlbGV0ZURvY3VtZW50XCIsIGRlbGV0YWJsZUNvbnRleHRzLCBDb21tb25IZWxwZXIub2JqZWN0VG9TdHJpbmcocGFyYW1zKSk7XG59O1xuXG4vKlxuICogR2V0IEV4cHJlc3Npb24gb2YgcHJlc3MgZXZlbnQgb2YgRWRpdCBidXR0b24uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gW29EYXRhRmllbGRdIERhdGEgZmllbGQgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gW3NFbnRpdHlTZXROYW1lXSBFbnRpdHkgc2V0IG5hbWVcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0hlYWRlckFjdGlvbl0gSGVhZGVyIGFjdGlvbiBvYmplY3RcbiAqIHJldHVybnMge3N0cmluZ30gIGJpbmRpbmcgZXhwcmVzc2lvbiAvIGZ1bmN0aW9uIHN0cmluZyBnZW5lcmF0ZWQgZnJvbSBjb21tYW5oZWxwZXIncyBmdW5jdGlvbiBnZW5lcmF0ZUZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRQcmVzc0V4cHJlc3Npb25Gb3JFZGl0ID0gZnVuY3Rpb24gKFxuXHRvRGF0YUZpZWxkOiBNZXRhTW9kZWxUeXBlPERhdGFGaWVsZEZvckFjdGlvbj4sXG5cdHNFbnRpdHlTZXROYW1lOiBzdHJpbmcsXG5cdG9IZWFkZXJBY3Rpb24/OiBCYXNlQWN0aW9uXG4pOiBzdHJpbmcge1xuXHRjb25zdCBzRWRpdGFibGVDb250ZXh0cyA9IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMob0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkFjdGlvbiEpLFxuXHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID1cblx0XHRcdG9EYXRhRmllbGQgJiZcblx0XHRcdG9EYXRhRmllbGQuSW52b2NhdGlvbkdyb3VwaW5nICYmXG5cdFx0XHQob0RhdGFGaWVsZC5JbnZvY2F0aW9uR3JvdXBpbmcgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KVtcIiRFbnVtTWVtYmVyXCJdLFxuXHRcdHNJbnZvY2F0aW9uR3JvdXAgPSBzRGF0YUZpZWxkRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5PcGVyYXRpb25Hcm91cGluZ1R5cGUvQ2hhbmdlU2V0XCIgPyBcIkNoYW5nZVNldFwiIDogXCJJc29sYXRlZFwiO1xuXHRjb25zdCBvUGFyYW1zID0ge1xuXHRcdGNvbnRleHRzOiBcIiR7JHZpZXc+L30uZ2V0QmluZGluZ0NvbnRleHQoKVwiLFxuXHRcdGVudGl0eVNldE5hbWU6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0VudGl0eVNldE5hbWUpLFxuXHRcdGludm9jYXRpb25Hcm91cGluZzogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzSW52b2NhdGlvbkdyb3VwKSxcblx0XHRtb2RlbDogXCIkeyRzb3VyY2U+L30uZ2V0TW9kZWwoKVwiLFxuXHRcdGxhYmVsOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5MYWJlbCEsIHRydWUpLFxuXHRcdGlzTmF2aWdhYmxlOiBvSGVhZGVyQWN0aW9uICYmIG9IZWFkZXJBY3Rpb24uaXNOYXZpZ2FibGUsXG5cdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOlxuXHRcdFx0b0hlYWRlckFjdGlvbiAmJiBvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiA/IGAnJHtvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbn0nYCA6IHVuZGVmaW5lZCxcblx0XHRkaXNhYmxlU3RyaWN0SGFuZGxpbmc6IG9IZWFkZXJBY3Rpb24/LmRpc2FibGVTdHJpY3RIYW5kbGluZ1xuXHR9O1xuXHRyZXR1cm4gQ29tbW9uSGVscGVyLmdlbmVyYXRlRnVuY3Rpb24oXCIuaGFuZGxlcnMub25DYWxsQWN0aW9uXCIsIFwiJHskdmlldz4vfVwiLCBzRWRpdGFibGVDb250ZXh0cywgQ29tbW9uSGVscGVyLm9iamVjdFRvU3RyaW5nKG9QYXJhbXMpKTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgZXhwcmVzc2lvbiBmb3IgdGhlICdwcmVzcycgZXZlbnQgaW4gdGhlIGZvb3RlciBhbm5vdGF0aW9uIGFjdGlvbnMuXG4gKiBAcGFyYW0gZGF0YUZpZWxkTW9kZWxQYXRoIFRoZSBkYXRhIG1vZGVsIHBhdGggb2YgdGhlIGRhdGEgZmllbGRcbiAqIEBwYXJhbSBlbnRpdHlTZXROYW1lIFRoZSBlbnRpdHkgc2V0IG5hbWVcbiAqIEBwYXJhbSBoZWFkZXJBY3Rpb24gVGhlIGhlYWRlciBhY3Rpb24gb2JqZWN0XG4gKiBAcmV0dXJucyAgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBvciBmdW5jdGlvbiBzdHJpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFByZXNzRXhwcmVzc2lvbkZvckZvb3RlckFubm90YXRpb25BY3Rpb24gPSBmdW5jdGlvbiAoXG5cdGRhdGFGaWVsZE1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxEYXRhRmllbGRGb3JBY3Rpb24+LFxuXHRlbnRpdHlTZXROYW1lOiBzdHJpbmcsXG5cdGhlYWRlckFjdGlvbjogQ3VzdG9tQWN0aW9uXG4pOiBzdHJpbmcge1xuXHRjb25zdCBkYXRhRmllbGQgPSBkYXRhRmllbGRNb2RlbFBhdGgudGFyZ2V0T2JqZWN0IGFzIERhdGFGaWVsZEZvckFjdGlvbjtcblx0Y29uc3QgYWN0aW9uQ29udGV4dHMgPSBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKGRhdGFGaWVsZC5BY3Rpb24gYXMgc3RyaW5nKTtcblx0Y29uc3Qgb1BhcmFtcyA9IHtcblx0XHRjb250ZXh0czogXCIkeyR2aWV3Pi99LmdldEJpbmRpbmdDb250ZXh0KClcIixcblx0XHRlbnRpdHlTZXROYW1lOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKGVudGl0eVNldE5hbWUpLFxuXHRcdGludm9jYXRpb25Hcm91cGluZzogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3Rlcyhcblx0XHRcdGRhdGFGaWVsZC5JbnZvY2F0aW9uR3JvdXBpbmcgPT09IFwiVUkuT3BlcmF0aW9uR3JvdXBpbmdUeXBlL0NoYW5nZVNldFwiID8gXCJDaGFuZ2VTZXRcIiA6IFwiSXNvbGF0ZWRcIlxuXHRcdCksXG5cdFx0bW9kZWw6IFwiJHskc291cmNlPi99LmdldE1vZGVsKClcIixcblx0XHRsYWJlbDogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhkYXRhRmllbGQuTGFiZWwgYXMgc3RyaW5nLCB0cnVlKSxcblx0XHRpc05hdmlnYWJsZTogaGVhZGVyQWN0aW9uLmlzTmF2aWdhYmxlLFxuXHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbjogaGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvblxuXHRcdFx0PyBgJyR7aGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbn0nYFxuXHRcdFx0OiB1bmRlZmluZWRcblx0fTtcblx0cmV0dXJuIENvbW1vbkhlbHBlci5nZW5lcmF0ZUZ1bmN0aW9uKFwiLmhhbmRsZXJzLm9uQ2FsbEFjdGlvblwiLCBcIiR7JHZpZXc+L31cIiwgYWN0aW9uQ29udGV4dHMsIENvbW1vbkhlbHBlci5vYmplY3RUb1N0cmluZyhvUGFyYW1zKSk7XG59O1xuXG4vKlxuICogR2V0IEV4cHJlc3Npb24gZm9yIGV4ZWN1dGluZyB0aGUgZXZlbnQgZXhwcmVzc2lvbiBvZiB0aGUgcHJpbWFyeSBhY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gW29EYXRhRmllbGRdIERhdGEgZmllbGQgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gW3NFbnRpdHlTZXROYW1lXSBFbnRpdHkgc2V0IG5hbWVcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0hlYWRlckFjdGlvbl0gSGVhZGVyIGFjdGlvbiBvYmplY3RcbiAqIEBwYXJhbSB7Q29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBzdHJpbmd9IFRoZSB2aXNpYmlsaXR5IG9mIHNlbWF0aWMgcG9zaXRpdmUgYWN0aW9uXG4gKiBAcGFyYW0ge0NvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nfSBUaGUgZW5hYmxlbWVudCBvZiBzZW1hbnRpYyBwb3NpdGl2ZSBhY3Rpb25cbiAqIEBwYXJhbSB7Q29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBzdHJpbmd9IFRoZSBFZGl0IGJ1dHRvbiB2aXNpYmlsaXR5XG4gKiBAcGFyYW0ge0NvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nfSBUaGUgZW5hYmxlbWVudCBvZiBFZGl0IGJ1dHRvblxuICogcmV0dXJucyB7c3RyaW5nfSAgYmluZGluZyBleHByZXNzaW9uIC8gZnVuY3Rpb24gc3RyaW5nIGdlbmVyYXRlZCBmcm9tIGNvbW1hbmhlbHBlcidzIGZ1bmN0aW9uIGdlbmVyYXRlRnVuY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFByZXNzRXhwcmVzc2lvbkZvclByaW1hcnlBY3Rpb24gPSBmdW5jdGlvbiAoXG5cdG9EYXRhRmllbGQ6IERhdGFGaWVsZEZvckFjdGlvbiB8IHVuZGVmaW5lZCxcblx0c0VudGl0eVNldE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0b0hlYWRlckFjdGlvbjogQmFzZUFjdGlvbiB8IG51bGwsXG5cdHBvc2l0aXZlQWN0aW9uVmlzaWJsZTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBzdHJpbmcsXG5cdHBvc2l0aXZlQWN0aW9uRW5hYmxlZDogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBzdHJpbmcsXG5cdGVkaXRBY3Rpb25WaXNpYmxlOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHN0cmluZyxcblx0ZWRpdEFjdGlvbkVuYWJsZWQ6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nXG4pOiBzdHJpbmcge1xuXHRjb25zdCBzQWN0aW9uQ29udGV4dHMgPSBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQ/LkFjdGlvbi50b1N0cmluZygpID8/IFwiXCIpLFxuXHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID1cblx0XHRcdG9EYXRhRmllbGQgJiZcblx0XHRcdG9EYXRhRmllbGQuSW52b2NhdGlvbkdyb3VwaW5nICYmXG5cdFx0XHQob0RhdGFGaWVsZC5JbnZvY2F0aW9uR3JvdXBpbmcgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KVtcIiRFbnVtTWVtYmVyXCJdLFxuXHRcdHNJbnZvY2F0aW9uR3JvdXAgPSBzRGF0YUZpZWxkRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5PcGVyYXRpb25Hcm91cGluZ1R5cGUvQ2hhbmdlU2V0XCIgPyBcIkNoYW5nZVNldFwiIDogXCJJc29sYXRlZFwiO1xuXHRjb25zdCBvUGFyYW1zID0ge1xuXHRcdGNvbnRleHRzOiBcIiR7JHZpZXc+L30uZ2V0QmluZGluZ0NvbnRleHQoKVwiLFxuXHRcdGVudGl0eVNldE5hbWU6IHNFbnRpdHlTZXROYW1lID8gQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzRW50aXR5U2V0TmFtZSkgOiBcIlwiLFxuXHRcdGludm9jYXRpb25Hcm91cGluZzogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzSW52b2NhdGlvbkdyb3VwKSxcblx0XHRtb2RlbDogXCIkeyRzb3VyY2U+L30uZ2V0TW9kZWwoKVwiLFxuXHRcdGxhYmVsOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQ/LkxhYmVsPy50b1N0cmluZygpID8/IFwiXCIsIHRydWUpLFxuXHRcdGlzTmF2aWdhYmxlOiBvSGVhZGVyQWN0aW9uPy5pc05hdmlnYWJsZSxcblx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246IG9IZWFkZXJBY3Rpb24/LmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvblxuXHRcdFx0PyBgJyR7b0hlYWRlckFjdGlvbi5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb259J2Bcblx0XHRcdDogdW5kZWZpbmVkXG5cdH07XG5cdGNvbnN0IG9Db25kaXRpb25zID0ge1xuXHRcdHBvc2l0aXZlQWN0aW9uVmlzaWJsZSxcblx0XHRwb3NpdGl2ZUFjdGlvbkVuYWJsZWQsXG5cdFx0ZWRpdEFjdGlvblZpc2libGUsXG5cdFx0ZWRpdEFjdGlvbkVuYWJsZWRcblx0fTtcblx0cmV0dXJuIENvbW1vbkhlbHBlci5nZW5lcmF0ZUZ1bmN0aW9uKFxuXHRcdFwiLmhhbmRsZXJzLm9uUHJpbWFyeUFjdGlvblwiLFxuXHRcdFwiJGNvbnRyb2xsZXJcIixcblx0XHRcIiR7JHZpZXc+L31cIixcblx0XHRcIiR7JHZpZXc+L30uZ2V0QmluZGluZ0NvbnRleHQoKVwiLFxuXHRcdHNBY3Rpb25Db250ZXh0cyxcblx0XHRDb21tb25IZWxwZXIub2JqZWN0VG9TdHJpbmcob1BhcmFtcyksXG5cdFx0Q29tbW9uSGVscGVyLm9iamVjdFRvU3RyaW5nKG9Db25kaXRpb25zKVxuXHQpO1xufTtcblxuLypcbiAqIEdldHMgdGhlIGJpbmRpbmcgb2YgdGhlIGNvbnRhaW5lciBIQm94IGZvciB0aGUgaGVhZGVyIGZhY2V0LlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtvYmplY3R9IFtvQ29udHJvbENvbmZpZ3VyYXRpb25dIFRoZSBjb250cm9sIGNvbmZpZ3VyYXRpb24gZm9ybSBvZiB0aGUgdmlld0RhdGEgbW9kZWxcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0hlYWRlckZhY2V0XSBUaGUgb2JqZWN0IG9mIHRoZSBoZWFkZXIgZmFjZXRcbiAqIHJldHVybnMgeyp9ICBUaGUgYmluZGluZyBleHByZXNzaW9uIGZyb20gZnVuY3Rpb24gZ2V0QmluZGluZ1dpdGhHcm91cElkRnJvbUNvbmZpZyBvciB1bmRlZmluZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTdGFzaGFibGVIQm94QmluZGluZyA9IGZ1bmN0aW9uIChcblx0b0NvbnRyb2xDb25maWd1cmF0aW9uOiBDb250cm9sQ29uZmlndXJhdGlvbixcblx0b0hlYWRlckZhY2V0OiB7IEZhY2V0OiBGaWVsZEdyb3VwRmFjZXQgfVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKG9IZWFkZXJGYWNldCAmJiBvSGVhZGVyRmFjZXQuRmFjZXQgJiYgb0hlYWRlckZhY2V0LkZhY2V0LnRhcmdldEFubm90YXRpb25UeXBlID09PSBcIkRhdGFQb2ludFwiKSB7XG5cdFx0cmV0dXJuIGdldEJpbmRpbmdXaXRoR3JvdXBJZEZyb21Db25maWcob0NvbnRyb2xDb25maWd1cmF0aW9uLCBvSGVhZGVyRmFjZXQuRmFjZXQudGFyZ2V0QW5ub3RhdGlvblZhbHVlISk7XG5cdH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRIZWFkZXJGb3JtSGJveFJlbmRlclR5cGUgPSBmdW5jdGlvbiAoZGF0YUZpZWxkOiBEYXRhTW9kZWxPYmplY3RQYXRoPERhdGFGaWVsZEFic3RyYWN0VHlwZXM+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKGRhdGFGaWVsZD8udGFyZ2V0T2JqZWN0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0cmV0dXJuIFwiQmFyZVwiO1xufTtcblxuLyoqXG4gKiBUaGUgZGVmYXVsdCBhY3Rpb24gZ3JvdXAgaGFuZGxlciB0aGF0IGlzIGludm9rZWQgd2hlbiBhZGRpbmcgdGhlIG1lbnUgYnV0dG9uIGhhbmRsaW5nIGFwcHJvcHJpYXRlbHkuXG4gKiBAcGFyYW0gb0N0eCBUaGUgY3VycmVudCBjb250ZXh0IGluIHdoaWNoIHRoZSBoYW5kbGVyIGlzIGNhbGxlZFxuICogQHBhcmFtIG9BY3Rpb24gVGhlIGN1cnJlbnQgYWN0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBvRGF0YUZpZWxkRm9yRGVmYXVsdEFjdGlvbiBUaGUgY3VycmVudCBkYXRhRmllbGQgZm9yIHRoZSBkZWZhdWx0IGFjdGlvblxuICogQHBhcmFtIGRlZmF1bHRBY3Rpb25Db250ZXh0T3JFbnRpdHlTZXQgVGhlIGN1cnJlbnQgY29udGV4dCBmb3IgdGhlIGRlZmF1bHQgYWN0aW9uXG4gKiBAcmV0dXJucyBUaGUgYXBwcm9wcmlhdGUgZXhwcmVzc2lvbiBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRBY3Rpb25IYW5kbGVyKFxuXHRvQ3R4OiBDb250ZXh0LFxuXHRvQWN0aW9uOiBDdXN0b21BY3Rpb24sXG5cdG9EYXRhRmllbGRGb3JEZWZhdWx0QWN0aW9uOiBNZXRhTW9kZWxUeXBlPERhdGFGaWVsZERlZmF1bHQ+LFxuXHRkZWZhdWx0QWN0aW9uQ29udGV4dE9yRW50aXR5U2V0OiBzdHJpbmdcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0aWYgKG9BY3Rpb24uZGVmYXVsdEFjdGlvbikge1xuXHRcdGNvbnN0IGRlZmF1bHRBY3Rpb24gPSBvQWN0aW9uLmRlZmF1bHRBY3Rpb24gYXMgQ3VzdG9tQWN0aW9uO1xuXHRcdHRyeSB7XG5cdFx0XHRzd2l0Y2ggKGRlZmF1bHRBY3Rpb24udHlwZSkge1xuXHRcdFx0XHRjYXNlIFwiRm9yQWN0aW9uXCI6IHtcblx0XHRcdFx0XHRyZXR1cm4gZ2V0UHJlc3NFeHByZXNzaW9uRm9yRWRpdChcblx0XHRcdFx0XHRcdG9EYXRhRmllbGRGb3JEZWZhdWx0QWN0aW9uIGFzIE1ldGFNb2RlbFR5cGU8RGF0YUZpZWxkRm9yQWN0aW9uPixcblx0XHRcdFx0XHRcdGRlZmF1bHRBY3Rpb25Db250ZXh0T3JFbnRpdHlTZXQsXG5cdFx0XHRcdFx0XHRvQWN0aW9uLmRlZmF1bHRBY3Rpb24gYXMgQmFzZUFjdGlvblxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2FzZSBcIkZvck5hdmlnYXRpb25cIjoge1xuXHRcdFx0XHRcdGlmIChkZWZhdWx0QWN0aW9uLmNvbW1hbmQpIHtcblx0XHRcdFx0XHRcdHJldHVybiBcImNtZDpcIiArIGRlZmF1bHRBY3Rpb24uY29tbWFuZDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGRlZmF1bHRBY3Rpb24ucHJlc3M7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGRlZmF1bHQ6IHtcblx0XHRcdFx0XHRpZiAoZGVmYXVsdEFjdGlvbi5jb21tYW5kKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJjbWQ6XCIgKyBkZWZhdWx0QWN0aW9uLmNvbW1hbmQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChkZWZhdWx0QWN0aW9uLm5vV3JhcCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGRlZmF1bHRBY3Rpb24ucHJlc3M7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBDb21tb25IZWxwZXIuYnVpbGRBY3Rpb25XcmFwcGVyKGRlZmF1bHRBY3Rpb24sIHsgaWQ6IFwiZm9yVGhlT2JqZWN0UGFnZVwiIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGlvRXgpIHtcblx0XHRcdHJldHVybiBcImJpbmRpbmcgZm9yIHRoZSBkZWZhdWx0IGFjdGlvbiBpcyBub3Qgd29ya2luZyBhcyBleHBlY3RlZFwiO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBzdWIgc2VjdGlvbiB2aXN1YWxpemF0aW9uIGlzIHBhcnQgb2YgcHJldmlldy5cbiAqIEBwYXJhbSBzdWJTZWN0aW9uIFRoZSBzdWIgc2VjdGlvbiB2aXN1YWxpemF0aW9uXG4gKiBAcmV0dXJucyBBIEJvb2xlYW4gdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmlzdWFsaXphdGlvbklzUGFydE9mUHJldmlldyhzdWJTZWN0aW9uOiBEYXRhVmlzdWFsaXphdGlvblN1YlNlY3Rpb24pOiBib29sZWFuIHtcblx0cmV0dXJuIHN1YlNlY3Rpb24uaXNQYXJ0T2ZQcmV2aWV3ID09PSB0cnVlIHx8IHN1YlNlY3Rpb24ucHJlc2VudGF0aW9uLnZpc3VhbGl6YXRpb25zWzBdLnR5cGUgIT09IFwiVGFibGVcIjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBleHByZXNzaW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBmb290ZXIgb2YgdGhlIG9iamVjdCBwYWdlIGlzIHRvIGJlIHZpc2libGUgb3Igbm90LlxuICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoZSBmb3JtYXR0ZXIuXG4gKiBAcGFyYW0gZm9vdGVyQWN0aW9ucyBUaGUgbGlzdCBvZiBmb290ZXIgYWN0aW9ucy5cbiAqIEByZXR1cm5zIEEgYmluZGluZyBleHByZXNzaW9uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRGb290ZXJWaXNpYmlsaXR5RXhwcmVzc2lvbkludGVybmFsID0gZnVuY3Rpb24gKFxuXHRjb250ZXh0OiBJQ29udGV4dCxcblx0Zm9vdGVyQWN0aW9uczogQmFzZUFjdGlvbltdXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldEludGVyZmFjZSgxKS5nZXRNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXG5cdGNvbnN0IF9nZW5lcmF0ZUJpbmRpbmdzRm9yQWN0aW9ucyA9IChhY3Rpb25zOiBCYXNlQWN0aW9uW10pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9PiB7XG5cdFx0aWYgKGFjdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gYWN0aW9ucy5tYXAoXG5cdFx0XHRcdChhY3Rpb24pID0+XG5cdFx0XHRcdFx0YWN0aW9uLnZpc2libGVFeHByZXNzaW9uID8/XG5cdFx0XHRcdFx0KHJlc29sdmVCaW5kaW5nU3RyaW5nKGFjdGlvbi52aXNpYmxlID8/IHRydWUsIFwiYm9vbGVhblwiKSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4pXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gW2NvbnN0YW50KGZhbHNlKV07XG5cdH07XG5cblx0Y29uc3QgZ2V0QWN0aW9uTW9kZWxQYXRoID0gKGFjdGlvbjogQmFzZUFjdGlvbik6IERhdGFNb2RlbE9iamVjdFBhdGg8RGF0YUZpZWxkRm9yQWN0aW9uPiB8IHVuZGVmaW5lZCA9PiB7XG5cdFx0Y29uc3QgYW5ub3RhdGlvblBhdGggPSBhY3Rpb24uYW5ub3RhdGlvblBhdGg7XG5cdFx0aWYgKGFubm90YXRpb25QYXRoKSB7XG5cdFx0XHRjb25zdCBhY3Rpb25Db250ZXh0ID0gbWV0YU1vZGVsLmdldENvbnRleHQoYW5ub3RhdGlvblBhdGgpO1xuXHRcdFx0cmV0dXJuIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0czxEYXRhRmllbGRGb3JBY3Rpb24+KGFjdGlvbkNvbnRleHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9O1xuXG5cdC8vIEFjdGlvbnMgYXJlIGNvbWluZyBmcm9tIHRoZSBjb252ZXJ0ZXIgc28gb25seSBkZXRlcm1pbmluZyBhY3Rpb25zIGFuZCBub3Qgc3RhdGljYWxseSBoaWRkZW4gYXJlIGxpc3RlZFxuXHRjb25zdCBkZXRlcm1pbmluZ0FjdGlvbnMgPSBmb290ZXJBY3Rpb25zLmZpbHRlcigoYWN0aW9uKSA9PiBhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZS5EYXRhRmllbGRGb3JBY3Rpb24pO1xuXHRjb25zdCBtYW5pZmVzdEFjdGlvbkJpbmRpbmdzID0gX2dlbmVyYXRlQmluZGluZ3NGb3JBY3Rpb25zKGZvb3RlckFjdGlvbnMuZmlsdGVyKChhY3Rpb24pID0+IGlzTWFuaWZlc3RBY3Rpb24oYWN0aW9uKSkpO1xuXHRjb25zdCBkZXRlcm1pbmluZ0FjdGlvbkJpbmRpbmdzID0gX2dlbmVyYXRlQmluZGluZ3NGb3JBY3Rpb25zKGRldGVybWluaW5nQWN0aW9ucyk7XG5cblx0Y29uc3QgaXNOb3RIaWRkZW5EZXRlcm1pbmluZ0FjdGlvbiA9ICEhZGV0ZXJtaW5pbmdBY3Rpb25zLmZpbmQoKGFjdGlvbikgPT4ge1xuXHRcdGNvbnN0IGFjdGlvbkNvbnRleHRNb2RlbFBhdGggPSBnZXRBY3Rpb25Nb2RlbFBhdGgoYWN0aW9uKTtcblx0XHRyZXR1cm4gIWFjdGlvbkNvbnRleHRNb2RlbFBhdGg/LnRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW47XG5cdH0pO1xuXG5cdHJldHVybiBvcihcblx0XHRpc05vdEhpZGRlbkRldGVybWluaW5nQWN0aW9uLFxuXHRcdG9yKC4uLm1hbmlmZXN0QWN0aW9uQmluZGluZ3MpLFxuXHRcdGFuZChvcihVSS5Jc0VkaXRhYmxlLCBvciguLi5kZXRlcm1pbmluZ0FjdGlvbkJpbmRpbmdzKSksIG5vdChwYXRoSW5Nb2RlbChcImlzQ3JlYXRlRGlhbG9nT3BlblwiLCBcImludGVybmFsXCIpKSlcblx0KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgZm9vdGVyIG9mIHRoZSBvYmplY3QgcGFnZSBpcyB0byBiZSB2aXNpYmxlIG9yIG5vdC5cbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgZm9ybWF0dGVyLlxuICogQHBhcmFtIGZvb3RlckFjdGlvbnMgVGhlIGxpc3Qgb2YgZm9vdGVyIGFjdGlvbnMuXG4gKiBAcmV0dXJucyBBIGNvbXBpbGVkIGJpbmRpbmcgZXhwcmVzc2lvblxuICovXG5leHBvcnQgY29uc3QgZ2V0Rm9vdGVyVmlzaWJpbGl0eUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoY29udGV4dDogSUNvbnRleHQsIGZvb3RlckFjdGlvbnM6IEJhc2VBY3Rpb25bXSk6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGdldEZvb3RlclZpc2liaWxpdHlFeHByZXNzaW9uSW50ZXJuYWwoY29udGV4dCwgZm9vdGVyQWN0aW9ucykpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIHN1YnNlY3Rpb24gaGVhZGVyIGxldmVsLlxuICogQHBhcmFtIHN1YlNlY3Rpb24gVGhlIHN1YnNlY3Rpb24gdmlzdWFsaXphdGlvblxuICogQHBhcmFtIGlzTW9yZUNvbnRlbnRcbiAqIEByZXR1cm5zIEEgU3RyaW5nIHZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRIZWFkZXJMZXZlbChzdWJTZWN0aW9uOiBEYXRhVmlzdWFsaXphdGlvblN1YlNlY3Rpb24sIGlzTW9yZUNvbnRlbnQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuXHRpZiAoaXNNb3JlQ29udGVudCkge1xuXHRcdGlmICghc3ViU2VjdGlvbi5zaG93U3ViU2VjdGlvblRpdGxlKSB7XG5cdFx0XHQvLyB3aGVuZXZlciB0aXRsZSBpcyBtZXJnZWQgZm9yIHN1Yi1zZWN0aW9uLCBsZXZlbCBzaG91bGQgYmUgSDRcblx0XHRcdHJldHVybiBcIkg0XCI7XG5cdFx0fSBlbHNlIGlmIChzdWJTZWN0aW9uLmxldmVsID09PSAyICYmIHN1YlNlY3Rpb24uZGF0YVZpc3VhbGl6YXRpb25UaXRsZVZpc2libGUgPT09IFwidHJ1ZVwiKSB7XG5cdFx0XHQvLyByZXRhaW4gb2xkIGxvZ2ljXG5cdFx0XHRyZXR1cm4gXCJINlwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gXCJINVwiOyAvLyByZXRhaW4gb2xkIGxvZ2ljXG5cdFx0fVxuXHR9IGVsc2UgaWYgKCFzdWJTZWN0aW9uLnNob3dTdWJTZWN0aW9uVGl0bGUpIHtcblx0XHQvLyB3aGVuZXZlciB0aXRsZSBpcyBtZXJnZWQgZm9yIHNlY3Rpb24sIGxldmVsIHNob3VsZCBiZSBIM1xuXHRcdHJldHVybiBcIkgzXCI7XG5cdH0gZWxzZSBpZiAoc3ViU2VjdGlvbi5sZXZlbCA9PT0gMiAmJiBzdWJTZWN0aW9uLmRhdGFWaXN1YWxpemF0aW9uVGl0bGVWaXNpYmxlID09PSBcInRydWVcIikge1xuXHRcdC8vIHJldGFpbiBvbGQgbG9naWNcblx0XHRyZXR1cm4gXCJINVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBcIkg0XCI7IC8vIHJldGFpbiBvbGQgbG9naWNcblx0fVxufVxuXG4vKipcbiAqIEdldHMgdGhlIGFyaWEtbGFiZWxsZWRieSBhdHRyaWJ1dGUgZm9yIHRoZSBoZWFkZXIgZm9ybWVsZW1lbnQuXG4gKiBAcGFyYW0gaGVhZGVyRm9ybURhdGFcbiAqIEBwYXJhbSBmb3JtRWxlbWVudElkUHJlZml4XG4gKiBAcmV0dXJucyBUaGUgc3RyaW5nIGZvciB0aGUgYXJpYS1sYWJlbGxlZGJ5IGF0dHJpYnV0ZVxuICovXG5leHBvcnQgY29uc3QgZ2V0SGVhZGVyRm9ybUFyaWFMYWJlbGxlZEJ5ID0gZnVuY3Rpb24gKGhlYWRlckZvcm1EYXRhOiBIZWFkZXJGb3JtRGF0YSwgZm9ybUVsZW1lbnRJZFByZWZpeDogc3RyaW5nKTogc3RyaW5nIHtcblx0bGV0IHRpdGxlSWQgPSBcIlwiO1xuXHRpZiAoaGVhZGVyRm9ybURhdGEubGFiZWwpIHtcblx0XHR0aXRsZUlkID0gU3RhYmxlSWRIZWxwZXIuZ2VuZXJhdGUoW2hlYWRlckZvcm1EYXRhLmlkLCBcIlRpdGxlXCJdKTtcblx0fVxuXHRjb25zdCBsYWJlbElkID0gU3RhYmxlSWRIZWxwZXIuZ2VuZXJhdGUoW2Zvcm1FbGVtZW50SWRQcmVmaXgsIFwiTGFiZWxcIl0pO1xuXHRyZXR1cm4gdGl0bGVJZCA/IGAke3RpdGxlSWR9LCR7bGFiZWxJZH1gIDogbGFiZWxJZDtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgYXJpYSB0ZXh0IGZvciBmb3JtIHJlZ2lvbnMgb24gT2JqZWN0IFBhZ2UuXG4gKiBAcGFyYW0gc3ViU2VjdGlvblRpdGxlIFRoZSB0aXRsZSBvZiB0aGUgc3Vic2VjdGlvblxuICogQHJldHVybnMgVGhlIGFyaWEgdGV4dCBmb3IgdGhlIGZvcm0gcmVnaW9uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRGb3JtQXJpYVRleHQgPSBmdW5jdGlvbiAoc3ViU2VjdGlvblRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cdHJldHVybiBzdWJTZWN0aW9uVGl0bGUgIT09IHVuZGVmaW5lZCA/IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0ZPUk1fQVJJQV9URVhUXCIsIFtzdWJTZWN0aW9uVGl0bGVdKSA6IHVuZGVmaW5lZDtcbn07XG5cbmdldEZvb3RlclZpc2liaWxpdHlFeHByZXNzaW9uLnJlcXVpcmVzSUNvbnRleHQgPSB0cnVlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXlEQSxNQUFNQSxVQUFVLEdBQUdDLFFBQVEsQ0FBQ0QsVUFBVTtF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
758
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCdXR0b25UeXBlIiwibUxpYnJhcnkiLCJnZXRFeHByZXNzaW9uRm9yVGl0bGUiLCJmdWxsQ29udGV4dFBhdGgiLCJ2aWV3RGF0YSIsImhlYWRlckluZm8iLCJnZXRUaXRsZUJpbmRpbmdFeHByZXNzaW9uIiwiZ2V0VGV4dEJpbmRpbmdFeHByZXNzaW9uIiwidW5kZWZpbmVkIiwiX2V4cG9ydHMiLCJnZXRFeHByZXNzaW9uRm9yRGVzY3JpcHRpb24iLCJvSGVhZGVySW5mbyIsImRlc2NyaXB0aW9uQmluZGluZyIsImdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbiIsIkRlc2NyaXB0aW9uIiwiVmFsdWUiLCIkdGFyZ2V0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJUZXh0IiwiVUkiLCJUZXh0QXJyYW5nZW1lbnQiLCJhZGRUZXh0QXJyYW5nZW1lbnRUb0JpbmRpbmdFeHByZXNzaW9uIiwiZGVzY3JpcHRpb24iLCJjb21waWxlRXhwcmVzc2lvbiIsImZvcm1hdFZhbHVlUmVjdXJzaXZlbHkiLCJnZXRFeHByZXNzaW9uRm9yU2F2ZUJ1dHRvbiIsIm9WaWV3RGF0YSIsInNhdmVCdXR0b25UZXh0IiwicmVzb3VyY2VNb2RlbCIsImdldFRleHQiLCJjcmVhdGVCdXR0b25UZXh0Iiwic2F2ZUV4cHJlc3Npb24iLCJzdGFydGluZ0VudGl0eVNldCIsIlNlc3Npb24iLCJTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiaWZFbHNlIiwiSXNDcmVhdGVNb2RlIiwiRHJhZnQiLCJJc05ld09iamVjdCIsImdldEV4cHJlc3Npb25Gb3JMYWJlbE9uSGVhZGVyRm9ybSIsImxhYmVsIiwiaXNNYW5pZmVzdEFjdGlvbiIsImFjdGlvbiIsIm5vbk1hbmlmZXN0QWN0aW9ucyIsImluY2x1ZGVzIiwidHlwZSIsImJ1aWxkQ3JpdGljYWxpdHlWaXNpYmxlRnJvbUlkZW50aWZpY2F0aW9uRXhwcmVzc2lvbiIsImRhdGFDb250ZXh0UGF0aCIsImlkZW50aWZpY2F0aW9uIiwidGFyZ2V0RW50aXR5VHlwZSIsIklkZW50aWZpY2F0aW9uIiwiZGF0YUZpZWxkc1dpdGhDcml0aWNhbGl0eSIsImZpbHRlciIsImRhdGFGaWVsZCIsIiRUeXBlIiwiQ3JpdGljYWxpdHkiLCJsZW5ndGgiLCJjb25zdGFudCIsIm9yIiwibWFwIiwibm90IiwiZXF1YWwiLCJIaWRkZW4iLCJidWlsZEVtcGhhc2l6ZWRCdXR0b25FeHByZXNzaW9uIiwiY3JpdGljYWxpdHlWaXNpYmxlRXhwciIsIkdob3N0IiwiRW1waGFzaXplZCIsImdldEVsZW1lbnRCaW5kaW5nIiwic1BhdGgiLCJzTmF2aWdhdGlvblBhdGgiLCJPRGF0YU1vZGVsQW5ub3RhdGlvbkhlbHBlciIsImdldE5hdmlnYXRpb25QYXRoIiwiY2hlY2tEcmFmdFN0YXRlIiwiZW50aXR5U2V0IiwiRHJhZnRSb290IiwiRWRpdEFjdGlvbiIsIl9maW5kQWN0aW9uIiwiYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zIiwic0FjdGlvblR5cGUiLCJvQWN0aW9uIiwiZmluZCIsIm9IZWFkZXJBY3Rpb24iLCJnZXREZWxldGVDb21tYW5kRXhlY3V0aW9uRW5hYmxlZCIsIm9EZWxldGVBY3Rpb24iLCJlbmFibGVkIiwiZ2V0RGVsZXRlQ29tbWFuZEV4ZWN1dGlvblZpc2libGUiLCJ2aXNpYmxlIiwiZ2V0RWRpdENvbW1hbmRFeGVjdXRpb25WaXNpYmxlIiwib0VkaXRBY3Rpb24iLCJnZXRFZGl0Q29tbWFuZEV4ZWN1dGlvbkVuYWJsZWQiLCJnZXRFZGl0QWN0aW9uIiwib0VudGl0eVNldCIsImdldFBhdGgiLCJhUGF0aHMiLCJzcGxpdCIsInJvb3RFbnRpdHlTZXRQYXRoIiwicm9vdEVudGl0eVNldEFubm5vdGF0aW9ucyIsImdldE9iamVjdCIsImJEcmFmdFJvb3QiLCJoYXNPd25Qcm9wZXJ0eSIsImJEcmFmdE5vZGUiLCJiU3RpY2t5U2Vzc2lvbiIsInNBY3Rpb25OYW1lIiwiaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyIsIm9Bbm5vdGF0aW9ucyIsIm9GaWVsZENvbnRyb2wiLCJiQ29tcHV0ZWQiLCJiSW1tdXRhYmxlIiwiYlJlYWRPbmx5IiwiQm9vbCIsInJlYWRPbmx5RXhwcmVzc2lvbkZyb21EeW5hbWljQW5ub3RhdGlvbnMiLCJzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkiLCJCaW5kaW5nSW5mbyIsInBhcnNlIiwiZ2V0RXhwcmVzc2lvbkZvck1pY3JvQ2hhcnRUaXRsZVByZXNzIiwib0NvbmZpZ3VyYXRpb24iLCJ0YXJnZXRBbm5vdGF0aW9uUGF0aCIsInRhcmdldEFubm90YXRpb25QYXRoRGF0TW9kZWxPYmplY3QiLCJvTWFuaWZlc3RPdXRib3VuZCIsInNDb2xsZWN0aW9uTmFtZSIsImdldE1pY3JvQ2hhcnRDb250cm9sQ29uZmlndXJhdGlvblBhdGgiLCJuYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJnZXRNaWNyb0NoYXJ0VGl0bGVBc0xpbmsiLCJvQ29udHJvbENvbmZpZ3VyYXRpb24iLCJjb2xsZWN0aW9uTmFtZSIsInRhcmdldENvbnRyb2xDb25maWd1cmF0aW9uIiwidGFyZ2V0T2JqZWN0IiwiVmlzdWFsaXphdGlvbnMiLCJ2YWx1ZSIsImdldEdyb3VwSWRGcm9tQ29uZmlnIiwib0NvbmZpZ3VyYXRpb25zIiwic0Fubm90YXRpb25QYXRoIiwic0RlZmF1bHRHcm91cElkIiwiYUF1dG9QYXR0ZXJucyIsInNHcm91cElkIiwicmVxdWVzdEdyb3VwSWQiLCJzb21lIiwiYXV0b1BhdHRlcm4iLCJnZXRHcm91cElkRnJvbUNvbmZpZ0Zvck1pY3JvQ2hhcnQiLCJ0YXJnZXRBbm5vdGF0aW9uUGF0aERhdGFNb2RlbE9iamVjdCIsImdldEJpbmRpbmdXaXRoR3JvdXBJZEZyb21Db25maWciLCJzS2V5Iiwic0JpbmRpbmciLCJjcmVhdGVCaW5kaW5nRm9yQWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJiaW5kaW5nIiwiYWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyIsIk1vZGVsSGVscGVyIiwiZ2V0QWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyIsInRhcmdldEVudGl0eVNldCIsInBhdGgiLCJwYXJhbWV0ZXJzIiwiJHNlbGVjdCIsImpvaW4iLCJkb2VzRmllbGRHcm91cENvbnRhaW5Pbmx5T25lTXVsdGlMaW5lRGF0YUZpZWxkIiwiYUZvcm1FbGVtZW50cyIsImlzVmFsdWVNdWx0aWxpbmVUZXh0IiwiZ2V0U2hhcmVCdXR0b25WaXNpYmlsaXR5IiwiaXNTaGFyZUJ1dHRvblZpc2libGVGb3JNeUluYm94Iiwic2hhcmVCdXR0b25WaXNpYmlsaXR5RXhwIiwiZmNsRW5hYmxlZCIsImFuZCIsInBhdGhJbk1vZGVsIiwiZ2V0VmlzaWJsaXR5T2ZIZWFkZXJJbmZvIiwib1RpdGxlQW5ub3RhdGlvbnMiLCJvRGVzY3JpcHRpb25Bbm5vdGF0aW9ucyIsIm9GaWVsZFRpdGxlRmllbGRDb250cm9sIiwib0ZpZWxkRGVzY3JpcHRpb25GaWVsZENvbnRyb2wiLCJiSXNUaXRsZVJlYWRPbmx5IiwidGl0bGVFeHByZXNzaW9uIiwiYklzRGVzY3JpcHRpb25SZWFkT25seSIsImRlc2NyaXB0aW9uRXhwcmVzc2lvbiIsImNvbWJpbmVUaXRsZUFuZERlc2NyaXB0aW9uRXhwcmVzc2lvbiIsIm9UaXRsZUZpZWxkQ29udHJvbCIsIm9EZXNjcmlwdGlvbkZpZWxkQ29udHJvbCIsImdldFByZXNzRXhwcmVzc2lvbkZvckRlbGV0ZSIsImRlbGV0YWJsZUNvbnRleHRzIiwidGl0bGUiLCJwYXJhbXMiLCJDb21tb25IZWxwZXIiLCJnZW5lcmF0ZUZ1bmN0aW9uIiwib2JqZWN0VG9TdHJpbmciLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JFZGl0Iiwib0RhdGFGaWVsZCIsInNFbnRpdHlTZXROYW1lIiwic0VkaXRhYmxlQ29udGV4dHMiLCJhZGRTaW5nbGVRdW90ZXMiLCJBY3Rpb24iLCJzRGF0YUZpZWxkRW51bU1lbWJlciIsIkludm9jYXRpb25Hcm91cGluZyIsInNJbnZvY2F0aW9uR3JvdXAiLCJvUGFyYW1zIiwiY29udGV4dHMiLCJlbnRpdHlTZXROYW1lIiwiaW52b2NhdGlvbkdyb3VwaW5nIiwibW9kZWwiLCJMYWJlbCIsImlzTmF2aWdhYmxlIiwiZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIiwiZGlzYWJsZVN0cmljdEhhbmRsaW5nIiwiZ2V0UHJlc3NFeHByZXNzaW9uRm9yRm9vdGVyQW5ub3RhdGlvbkFjdGlvbiIsImRhdGFGaWVsZE1vZGVsUGF0aCIsImhlYWRlckFjdGlvbiIsImFjdGlvbkNvbnRleHRzIiwiZ2V0UHJlc3NFeHByZXNzaW9uRm9yUHJpbWFyeUFjdGlvbiIsInBvc2l0aXZlQWN0aW9uVmlzaWJsZSIsInBvc2l0aXZlQWN0aW9uRW5hYmxlZCIsImVkaXRBY3Rpb25WaXNpYmxlIiwiZWRpdEFjdGlvbkVuYWJsZWQiLCJzQWN0aW9uQ29udGV4dHMiLCJ0b1N0cmluZyIsIm9Db25kaXRpb25zIiwiZ2V0U3Rhc2hhYmxlSEJveEJpbmRpbmciLCJvSGVhZGVyRmFjZXQiLCJGYWNldCIsInRhcmdldEFubm90YXRpb25UeXBlIiwidGFyZ2V0QW5ub3RhdGlvblZhbHVlIiwiZ2V0SGVhZGVyRm9ybUhib3hSZW5kZXJUeXBlIiwiZ2V0RGVmYXVsdEFjdGlvbkhhbmRsZXIiLCJvQ3R4Iiwib0RhdGFGaWVsZEZvckRlZmF1bHRBY3Rpb24iLCJkZWZhdWx0QWN0aW9uQ29udGV4dE9yRW50aXR5U2V0IiwiZGVmYXVsdEFjdGlvbiIsImNvbW1hbmQiLCJwcmVzcyIsIm5vV3JhcCIsImJ1aWxkQWN0aW9uV3JhcHBlciIsImlkIiwiaW9FeCIsImlzVmlzdWFsaXphdGlvbklzUGFydE9mUHJldmlldyIsInN1YlNlY3Rpb24iLCJpc1BhcnRPZlByZXZpZXciLCJwcmVzZW50YXRpb24iLCJ2aXN1YWxpemF0aW9ucyIsImdldEZvb3RlclZpc2liaWxpdHlFeHByZXNzaW9uSW50ZXJuYWwiLCJjb250ZXh0IiwiZm9vdGVyQWN0aW9ucyIsIm1ldGFNb2RlbCIsImdldEludGVyZmFjZSIsImdldE1vZGVsIiwiX2dlbmVyYXRlQmluZGluZ3NGb3JBY3Rpb25zIiwiYWN0aW9ucyIsInZpc2libGVFeHByZXNzaW9uIiwicmVzb2x2ZUJpbmRpbmdTdHJpbmciLCJnZXRBY3Rpb25Nb2RlbFBhdGgiLCJhbm5vdGF0aW9uUGF0aCIsImFjdGlvbkNvbnRleHQiLCJnZXRDb250ZXh0IiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiZGV0ZXJtaW5pbmdBY3Rpb25zIiwiQWN0aW9uVHlwZSIsIkRhdGFGaWVsZEZvckFjdGlvbiIsIm1hbmlmZXN0QWN0aW9uQmluZGluZ3MiLCJkZXRlcm1pbmluZ0FjdGlvbkJpbmRpbmdzIiwiaXNOb3RIaWRkZW5EZXRlcm1pbmluZ0FjdGlvbiIsImFjdGlvbkNvbnRleHRNb2RlbFBhdGgiLCJJc0VkaXRhYmxlIiwiZ2V0Rm9vdGVyVmlzaWJpbGl0eUV4cHJlc3Npb24iLCJnZXRIZWFkZXJMZXZlbCIsImlzTW9yZUNvbnRlbnQiLCJzaG93U3ViU2VjdGlvblRpdGxlIiwibGV2ZWwiLCJkYXRhVmlzdWFsaXphdGlvblRpdGxlVmlzaWJsZSIsImdldEhlYWRlckZvcm1BcmlhTGFiZWxsZWRCeSIsImhlYWRlckZvcm1EYXRhIiwiZm9ybUVsZW1lbnRJZFByZWZpeCIsInRpdGxlSWQiLCJTdGFibGVJZEhlbHBlciIsImdlbmVyYXRlIiwibGFiZWxJZCIsImdldEZvcm1BcmlhVGV4dCIsInN1YlNlY3Rpb25UaXRsZSIsInJlc291cmNlQnVuZGxlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwicmVxdWlyZXNJQ29udGV4dCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiT2JqZWN0UGFnZVRlbXBsYXRpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRm9ybWF0dGVycyBmb3IgdGhlIE9iamVjdCBQYWdlXG5pbXBvcnQgdHlwZSB7IEVudGl0eVNldCwgTmF2aWdhdGlvblByb3BlcnR5LCBQcm9wZXJ0eSwgU2luZ2xldG9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7XG5cdENoYXJ0LFxuXHREYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGREZWZhdWx0LFxuXHREYXRhRmllbGRGb3JBY3Rpb24sXG5cdERhdGFGaWVsZFR5cGVzLFxuXHRGYWNldCxcblx0SGVhZGVySW5mb1R5cGUsXG5cdFByZXNlbnRhdGlvblZhcmlhbnRcbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IHsgVUlBbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiwgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sIFBhdGhJbk1vZGVsRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHtcblx0YW5kLFxuXHRjb21waWxlRXhwcmVzc2lvbixcblx0Y29uc3RhbnQsXG5cdGVxdWFsLFxuXHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24sXG5cdGlmRWxzZSxcblx0bm90LFxuXHRvcixcblx0cGF0aEluTW9kZWwsXG5cdHJlc29sdmVCaW5kaW5nU3RyaW5nXG59IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBNaWNyb0NoYXJ0TWFuaWZlc3RDb25maWd1cmF0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgQWN0aW9uVHlwZSwgdHlwZSBDb250cm9sQ29uZmlndXJhdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgTWV0YU1vZGVsUHJvcGVydHlBbm5vdGF0aW9ucyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSB7IFBhZ2VDb250ZXh0UGF0aFRhcmdldCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL1RlbXBsYXRlQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VBY3Rpb24sIEN1c3RvbUFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9BY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgQW5ub3RhdGlvbkZvcm1FbGVtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL0Zvcm1cIjtcbmltcG9ydCB0eXBlIHsgRmllbGRHcm91cEZhY2V0LCBIZWFkZXJGb3JtRGF0YSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL09iamVjdFBhZ2UvSGVhZGVyRmFjZXRcIjtcbmltcG9ydCB0eXBlIHsgRGF0YVZpc3VhbGl6YXRpb25TdWJTZWN0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvT2JqZWN0UGFnZS9TdWJTZWN0aW9uXCI7XG5pbXBvcnQgeyBEcmFmdCwgVUkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCAqIGFzIFN0YWJsZUlkSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N0YWJsZUlkSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRUaXRsZUJpbmRpbmdFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVGl0bGVIZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgVmlld0RhdGEgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvVGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSB7IERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgQ29tbW9uSGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL0NvbW1vbkhlbHBlclwiO1xuaW1wb3J0IHtcblx0YWRkVGV4dEFycmFuZ2VtZW50VG9CaW5kaW5nRXhwcmVzc2lvbixcblx0Zm9ybWF0VmFsdWVSZWN1cnNpdmVseSxcblx0Z2V0VGV4dEJpbmRpbmdFeHByZXNzaW9uXG59IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpZWxkL0ZpZWxkVGVtcGxhdGluZ1wiO1xuaW1wb3J0IG1MaWJyYXJ5IGZyb20gXCJzYXAvbS9saWJyYXJ5XCI7XG5pbXBvcnQgQmluZGluZ0luZm8gZnJvbSBcInNhcC91aS9iYXNlL0JpbmRpbmdJbmZvXCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgdHlwZSB7IE1hbmlmZXN0T3V0Ym91bmRFbnRyeSB9IGZyb20gXCJzYXAvdWkvY29yZS9NYW5pZmVzdFwiO1xuaW1wb3J0IHR5cGUgeyBJQ29udGV4dCB9IGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IE9EYXRhTW9kZWxBbm5vdGF0aW9uSGVscGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQW5ub3RhdGlvbkhlbHBlclwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgTWV0YU1vZGVsVHlwZSB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi8uLi8uLi90eXBlcy9tZXRhbW9kZWxfdHlwZXNcIjtcblxuY29uc3QgQnV0dG9uVHlwZSA9IG1MaWJyYXJ5LkJ1dHRvblR5cGU7XG5cbmV4cG9ydCBjb25zdCBnZXRFeHByZXNzaW9uRm9yVGl0bGUgPSBmdW5jdGlvbiAoXG5cdGZ1bGxDb250ZXh0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHR2aWV3RGF0YTogVmlld0RhdGEsXG5cdGhlYWRlckluZm8/OiBIZWFkZXJJbmZvVHlwZVxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRyZXR1cm4gZ2V0VGl0bGVCaW5kaW5nRXhwcmVzc2lvbihcblx0XHRmdWxsQ29udGV4dFBhdGggYXMgRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT4sXG5cdFx0Z2V0VGV4dEJpbmRpbmdFeHByZXNzaW9uLFxuXHRcdHVuZGVmaW5lZCxcblx0XHRoZWFkZXJJbmZvLFxuXHRcdHZpZXdEYXRhXG5cdCk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgZXhwcmVzc2lvbiBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIGFuIG9iamVjdCBwYWdlLlxuICogQHBhcmFtIGZ1bGxDb250ZXh0UGF0aCBUaGUgZnVsbCBjb250ZXh0IHBhdGggdXNlZCB0byByZWFjaCB0aGF0IG9iamVjdCBwYWdlXG4gKiBAcGFyYW0gb0hlYWRlckluZm8gVGhlIEBVSS5IZWFkZXJJbmZvIGFubm90YXRpb24gY29udGVudFxuICogQHBhcmFtIG9IZWFkZXJJbmZvLkRlc2NyaXB0aW9uXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgb2JqZWN0IHBhZ2UgZGVzY3JpcHRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEV4cHJlc3Npb25Gb3JEZXNjcmlwdGlvbiA9IGZ1bmN0aW9uIChcblx0ZnVsbENvbnRleHRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPEVudGl0eVNldD4sXG5cdG9IZWFkZXJJbmZvPzogSGVhZGVySW5mb1R5cGVcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0bGV0IGRlc2NyaXB0aW9uQmluZGluZyA9IGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbigob0hlYWRlckluZm8/LkRlc2NyaXB0aW9uIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWUpO1xuXHRpZiAoKG9IZWFkZXJJbmZvPy5EZXNjcmlwdGlvbiBhcyBEYXRhRmllbGRUeXBlcyk/LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0Py5hbm5vdGF0aW9ucz8uVUk/LlRleHRBcnJhbmdlbWVudCkge1xuXHRcdC8vIEluIGNhc2UgYW4gZXhwbGljaXQgdGV4dCBhcnJhbmdlbWVudCB3YXMgc2V0IHdlIG1ha2UgdXNlIG9mIGl0IGluIHRoZSBkZXNjcmlwdGlvbiBhcyB3ZWxsXG5cdFx0ZGVzY3JpcHRpb25CaW5kaW5nID0gYWRkVGV4dEFycmFuZ2VtZW50VG9CaW5kaW5nRXhwcmVzc2lvbihkZXNjcmlwdGlvbkJpbmRpbmcsIGZ1bGxDb250ZXh0UGF0aCk7XG5cdH1cblx0Y29uc3QgZGVzY3JpcHRpb24gPSBjb21waWxlRXhwcmVzc2lvbihmb3JtYXRWYWx1ZVJlY3Vyc2l2ZWx5KGRlc2NyaXB0aW9uQmluZGluZywgZnVsbENvbnRleHRQYXRoKSk7XG5cdHJldHVybiBkZXNjcmlwdGlvbiA9PT0gXCJ1bmRlZmluZWRcIiA/IFwiXCIgOiBkZXNjcmlwdGlvbjtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBleHByZXNzaW9uIGZvciB0aGUgc2F2ZSBidXR0b24uXG4gKiBAcGFyYW0gb1ZpZXdEYXRhIFRoZSBjdXJyZW50IHZpZXcgZGF0YVxuICogQHBhcmFtIGZ1bGxDb250ZXh0UGF0aCBUaGUgcGF0aCB1c2VkIHVwIHVudGlsIGhlcmVcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gdGhhdCBzaG93cyB0aGUgcmlnaHQgc2F2ZSBidXR0b24gdGV4dFxuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzc2lvbkZvclNhdmVCdXR0b24gPSBmdW5jdGlvbiAoXG5cdG9WaWV3RGF0YTogVmlld0RhdGEsXG5cdGZ1bGxDb250ZXh0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxFbnRpdHlTZXQ+XG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IHNhdmVCdXR0b25UZXh0ID0gb1ZpZXdEYXRhLnJlc291cmNlTW9kZWwuZ2V0VGV4dChcIlRfT1BfT0JKRUNUX1BBR0VfU0FWRVwiKTtcblx0Y29uc3QgY3JlYXRlQnV0dG9uVGV4dCA9IG9WaWV3RGF0YS5yZXNvdXJjZU1vZGVsLmdldFRleHQoXCJUX09QX09CSkVDVF9QQUdFX0NSRUFURVwiKTtcblx0bGV0IHNhdmVFeHByZXNzaW9uO1xuXG5cdGlmICgoZnVsbENvbnRleHRQYXRoLnN0YXJ0aW5nRW50aXR5U2V0IGFzIEVudGl0eVNldCkuYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCkge1xuXHRcdC8vIElmIHdlJ3JlIGluIHN0aWNreSBtb2RlIEFORCB0aGUgdWkgaXMgaW4gY3JlYXRlIG1vZGUsIHNob3cgQ3JlYXRlLCBlbHNlIHNob3cgU2F2ZVxuXHRcdHNhdmVFeHByZXNzaW9uID0gaWZFbHNlKFVJLklzQ3JlYXRlTW9kZSwgY3JlYXRlQnV0dG9uVGV4dCwgc2F2ZUJ1dHRvblRleHQpO1xuXHR9IGVsc2Uge1xuXHRcdC8vIElmIHdlJ3JlIGluIGRyYWZ0IEFORCB0aGUgZHJhZnQgaXMgYSBuZXcgb2JqZWN0ICghSXNBY3RpdmVFbnRpdHkgJiYgIUhhc0FjdGl2ZUVudGl0eSksIHNob3cgY3JlYXRlLCBlbHNlIHNob3cgc2F2ZVxuXHRcdHNhdmVFeHByZXNzaW9uID0gaWZFbHNlKERyYWZ0LklzTmV3T2JqZWN0LCBjcmVhdGVCdXR0b25UZXh0LCBzYXZlQnV0dG9uVGV4dCk7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKHNhdmVFeHByZXNzaW9uKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBleHByZXNzaW9uIG9mIHRoZSBsYWJlbCBmb3IgYSBmaWVsZCBpbnRvIGEgaGVhZGVyIGZvcm0uXG4gKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIG9mIHRoZSBoZWFkZXIgZm9ybSBpbiBhbiBvYmplY3QgcGFnZS5cbiAqIEBwYXJhbSB2aWV3RGF0YSBUaGUgY3VycmVudCB2aWV3IGRhdGEuXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgdHJhbnNsYXRlZCBsYWJlbCBvZiB0aGUgb2YgdGhlIGhlYWRlciBmb3JtIGluIGFuIG9iamVjdCBwYWdlLlxuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzc2lvbkZvckxhYmVsT25IZWFkZXJGb3JtID0gZnVuY3Rpb24gKGxhYmVsOiBTdHJpbmcsIHZpZXdEYXRhOiBWaWV3RGF0YSk6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0cmV0dXJuIHZpZXdEYXRhLnJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkhFQURFUl9GT1JNX0xBQkVMXCIsIFtsYWJlbF0pO1xufTtcblxuLyoqXG4gKiBNZXRob2QgcmV0dXJucyBXaGV0aGVyIHRoZSBhY3Rpb24gdHlwZSBpcyBtYW5pZmVzdCBvciBub3QuXG4gKiBAcGFyYW0gYWN0aW9uIFRoZSBhY3Rpb24gb2JqZWN0XG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYWN0aW9uIGlzIGNvbWluZyBmcm9tIG1hbmlmZXN0LCBgZmFsc2VgIG90aGVyd2lzZVxuICovXG5leHBvcnQgY29uc3QgaXNNYW5pZmVzdEFjdGlvbiA9IGZ1bmN0aW9uIChhY3Rpb246IEJhc2VBY3Rpb24gfCBDdXN0b21BY3Rpb24pOiBhY3Rpb24gaXMgQ3VzdG9tQWN0aW9uIHtcblx0Y29uc3Qgbm9uTWFuaWZlc3RBY3Rpb25zID0gW1xuXHRcdFwiUHJpbWFyeVwiLFxuXHRcdFwiRGVmYXVsdEFwcGx5XCIsXG5cdFx0XCJTZWNvbmRhcnlcIixcblx0XHRcIkZvckFjdGlvblwiLFxuXHRcdFwiRm9yTmF2aWdhdGlvblwiLFxuXHRcdFwiU3dpdGNoVG9BY3RpdmVPYmplY3RcIixcblx0XHRcIlN3aXRjaFRvRHJhZnRPYmplY3RcIixcblx0XHRcIkRyYWZ0QWN0aW9uc1wiLFxuXHRcdFwiQ29weVwiLFxuXHRcdFwiU3RhbmRhcmRcIlxuXHRdO1xuXHRyZXR1cm4gIW5vbk1hbmlmZXN0QWN0aW9ucy5pbmNsdWRlcyhhY3Rpb24udHlwZSA/PyBcIlwiKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIGNvbXBpbGVkIGV4cHJlc3Npb24gdGhhdCBkZXRlcm1pbmVzIHRoZSBlbXBoYXNpemVkIGJ1dHRvbiB0eXBlIGJhc2VkIG9uIGNyaXRpY2FsaXR5IGFjcm9zcyBhbGwgYWN0aW9ucy5cbiAqIElmIGEgY3JpdGljYWwgYWN0aW9uIGlzIHJlbmRlcmVkLCBpdCBpcyB0cmVhdGVkIGFzIHRoZSBwcmltYXJ5IGFjdGlvbiwgYW5kIHRoZSB0ZW1wbGF0ZSdzIGRlZmF1bHQgcHJpbWFyeSBhY3Rpb24gaXMgc3VwcHJlc3NlZC5cbiAqIEBwYXJhbSBkYXRhQ29udGV4dFBhdGggVGhlIERhdGFNb2RlbE9iamVjdFBhdGggcmVsYXRlZCB0byB0aGUgY29udGV4dFxuICogQHJldHVybnMgQSBjb21waWxlZCBleHByZXNzaW9uIHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBidXR0b24gdHlwZSB0byB1c2VcbiAqL1xuZXhwb3J0IGNvbnN0IGJ1aWxkQ3JpdGljYWxpdHlWaXNpYmxlRnJvbUlkZW50aWZpY2F0aW9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChcblx0ZGF0YUNvbnRleHRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPEVudGl0eVNldCB8IE5hdmlnYXRpb25Qcm9wZXJ0eSB8IFNpbmdsZXRvbj5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGlkZW50aWZpY2F0aW9uID0gZGF0YUNvbnRleHRQYXRoLnRhcmdldEVudGl0eVR5cGU/LmFubm90YXRpb25zPy5VST8uSWRlbnRpZmljYXRpb247XG5cdGNvbnN0IGRhdGFGaWVsZHNXaXRoQ3JpdGljYWxpdHkgPVxuXHRcdGlkZW50aWZpY2F0aW9uPy5maWx0ZXIoKGRhdGFGaWVsZCkgPT4gZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24gJiYgZGF0YUZpZWxkLkNyaXRpY2FsaXR5KSB8fCBbXTtcblxuXHRpZiAoIWRhdGFGaWVsZHNXaXRoQ3JpdGljYWxpdHkubGVuZ3RoKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KGZhbHNlKTtcblx0fVxuXHRyZXR1cm4gb3IoXG5cdFx0Li4uZGF0YUZpZWxkc1dpdGhDcml0aWNhbGl0eS5tYXAoKGRhdGFGaWVsZCkgPT5cblx0XHRcdC8vIENyaXRpY2FsaXR5IHN1cHByZXNzZXMgZW1waGFzaXMgaWYgdGhlIGFjdGlvbiBpdHNlbGYgaXMgdmlzaWJsZSAoSGlkZGVuIGlzIGZhbHNlKVxuXHRcdFx0bm90KGVxdWFsKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4pLCB0cnVlKSlcblx0XHQpXG5cdCk7XG59O1xuXG5leHBvcnQgY29uc3QgYnVpbGRFbXBoYXNpemVkQnV0dG9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChcblx0ZGF0YUNvbnRleHRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPEVudGl0eVNldCB8IE5hdmlnYXRpb25Qcm9wZXJ0eSB8IFNpbmdsZXRvbj5cbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0Y29uc3QgY3JpdGljYWxpdHlWaXNpYmxlRXhwciA9IGJ1aWxkQ3JpdGljYWxpdHlWaXNpYmxlRnJvbUlkZW50aWZpY2F0aW9uRXhwcmVzc2lvbihkYXRhQ29udGV4dFBhdGgpO1xuXHQvLyBJZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgdmlzaWJsZSBhY3Rpb24gd2l0aCBjcml0aWNhbGl0eSwgdGhlIHRlbXBsYXRlJ3MgZGVmYXVsdCBwcmltYXJ5IGFjdGlvbiBpcyBzZXQgYmFjayB0byBHaG9zdFxuXHQvLyBlbHNlIGl0IGlzIGVtcGhhc2l6ZWRcblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGlmRWxzZShjcml0aWNhbGl0eVZpc2libGVFeHByLCBCdXR0b25UeXBlLkdob3N0LCBCdXR0b25UeXBlLkVtcGhhc2l6ZWQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50QmluZGluZyA9IGZ1bmN0aW9uIChzUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3Qgc05hdmlnYXRpb25QYXRoID0gT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIuZ2V0TmF2aWdhdGlvblBhdGgoc1BhdGgpO1xuXHRpZiAoc05hdmlnYXRpb25QYXRoKSB7XG5cdFx0cmV0dXJuIFwie3BhdGg6J1wiICsgc05hdmlnYXRpb25QYXRoICsgXCInfVwiO1xuXHR9IGVsc2Uge1xuXHRcdC8vbm8gbmF2aWdhdGlvbiBwcm9wZXJ0eSBuZWVkcyBlbXB0eSBvYmplY3Rcblx0XHRyZXR1cm4gXCJ7cGF0aDogJyd9XCI7XG5cdH1cbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gY2hlY2sgaWYgZHJhZnQgcGF0dGVybiBpcyBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0gZW50aXR5U2V0IFRoZSBjdXJyZW50IGVudGl0eSBzZXQuXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBCb29sZWFuIHZhbHVlIGJhc2VkIG9uIGRyYWZ0IHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBjaGVja0RyYWZ0U3RhdGUgPSBmdW5jdGlvbiAoZW50aXR5U2V0OiBFbnRpdHlTZXQpOiBib29sZWFuIHtcblx0aWYgKGVudGl0eVNldC5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3Q/LkVkaXRBY3Rpb24pIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZmluZCBhbiBhY3Rpb24gZnJvbSB0aGUgYXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgaW4gdGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiAnaGVhZGVyJyBhY3Rpb25zIG9uIHRoZSBvYmplY3QgcGFnZS5cbiAqIEBwYXJhbSBzQWN0aW9uVHlwZSBUaGUgYWN0aW9uIHR5cGVcbiAqIEByZXR1cm5zIFRoZSBhY3Rpb24gd2l0aCB0aGUgbWF0Y2hpbmcgYWN0aW9uIHR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IF9maW5kQWN0aW9uID0gZnVuY3Rpb24gKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9uczogQmFzZUFjdGlvbltdLCBzQWN0aW9uVHlwZTogc3RyaW5nKTogQmFzZUFjdGlvbiB8IHVuZGVmaW5lZCB7XG5cdGxldCBvQWN0aW9uOiBCYXNlQWN0aW9uIHwgdW5kZWZpbmVkO1xuXHRpZiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zICYmIGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucy5sZW5ndGgpIHtcblx0XHRvQWN0aW9uID0gYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLmZpbmQoZnVuY3Rpb24gKG9IZWFkZXJBY3Rpb246IEJhc2VBY3Rpb24pIHtcblx0XHRcdHJldHVybiBvSGVhZGVyQWN0aW9uLnR5cGUgPT09IHNBY3Rpb25UeXBlO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBvQWN0aW9uO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBmb3IgdGhlIERlbGV0ZSBidXR0b24gb24gdGhlIG9iamVjdCBwYWdlIG9yIHN1Ym9iamVjdCBwYWdlIGluIGNhc2Ugb2YgYSBDb21tYW5kIEV4ZWN1dGlvbi5cbiAqIEBwYXJhbSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlXG4gKiBAcmV0dXJucyBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGZyb20gdGhlIGNvbnZlcnRlciBvdXRwdXRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldERlbGV0ZUNvbW1hbmRFeGVjdXRpb25FbmFibGVkID0gZnVuY3Rpb24gKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9uczogQmFzZUFjdGlvbltdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Y29uc3Qgb0RlbGV0ZUFjdGlvbiA9IF9maW5kQWN0aW9uKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucywgXCJTZWNvbmRhcnlcIik7XG5cdHJldHVybiBvRGVsZXRlQWN0aW9uID8gb0RlbGV0ZUFjdGlvbi5lbmFibGVkIDogXCJmYWxzZVwiO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICd2aXNpYmxlJyBwcm9wZXJ0eSBmb3IgdGhlIERlbGV0ZSBidXR0b24gb24gdGhlIG9iamVjdCBwYWdlIG9yIHN1Ym9iamVjdCBwYWdlIGluIGNhc2Ugb2YgYSBDb21tYW5kIEV4ZWN1dGlvbi5cbiAqIEBwYXJhbSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlXG4gKiBAcmV0dXJucyBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGZyb20gdGhlIGNvbnZlcnRlciBvdXRwdXRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldERlbGV0ZUNvbW1hbmRFeGVjdXRpb25WaXNpYmxlID0gZnVuY3Rpb24gKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9uczogQmFzZUFjdGlvbltdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Y29uc3Qgb0RlbGV0ZUFjdGlvbiA9IF9maW5kQWN0aW9uKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucywgXCJTZWNvbmRhcnlcIik7XG5cdHJldHVybiBvRGVsZXRlQWN0aW9uID8gb0RlbGV0ZUFjdGlvbi52aXNpYmxlIDogXCJmYWxzZVwiO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICd2aXNpYmxlJyBwcm9wZXJ0eSBmb3IgdGhlIEVkaXQgYnV0dG9uIG9uIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGEgQ29tbWFuZCBFeGVjdXRpb24uXG4gKiBAcGFyYW0gYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zIEFycmF5IG9mIGhlYWRlciBhY3Rpb25zIG9uIHRoZSBvYmplY3QgcGFnZVxuICogQHJldHVybnMgUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBmcm9tIHRoZSBjb252ZXJ0ZXIgb3V0cHV0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFZGl0Q29tbWFuZEV4ZWN1dGlvblZpc2libGUgPSBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBCYXNlQWN0aW9uW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRjb25zdCBvRWRpdEFjdGlvbiA9IF9maW5kQWN0aW9uKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucywgXCJQcmltYXJ5XCIpO1xuXHRyZXR1cm4gb0VkaXRBY3Rpb24gPyBvRWRpdEFjdGlvbi52aXNpYmxlIDogXCJmYWxzZVwiO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBmb3IgdGhlIEVkaXQgYnV0dG9uIG9uIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGEgQ29tbWFuZCBFeGVjdXRpb24uXG4gKiBAcGFyYW0gYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zIEFycmF5IG9mIGhlYWRlciBhY3Rpb25zIG9uIHRoZSBvYmplY3QgcGFnZVxuICogQHJldHVybnMgUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBmcm9tIHRoZSBjb252ZXJ0ZXIgb3V0cHV0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFZGl0Q29tbWFuZEV4ZWN1dGlvbkVuYWJsZWQgPSBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBCYXNlQWN0aW9uW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRjb25zdCBvRWRpdEFjdGlvbiA9IF9maW5kQWN0aW9uKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucywgXCJQcmltYXJ5XCIpO1xuXHRyZXR1cm4gb0VkaXRBY3Rpb24gPyBvRWRpdEFjdGlvbi5lbmFibGVkIDogXCJmYWxzZVwiO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIEVkaXRBY3Rpb24gZnJvbSB0aGUgYmFzZWQgb24gYSBkcmFmdC1lbmFibGVkIGFwcGxpY2F0aW9uIG9yIGEgc3RpY2t5IGFwcGxpY2F0aW9uLlxuICogQHBhcmFtIFtvRW50aXR5U2V0XSBUaGUgdmFsdWUgZnJvbSB0aGUgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgYmFzZWQgb24gdlJhd1ZhbHVlICYgb0RyYWZ0Tm9kZVxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdEFjdGlvbiA9IGZ1bmN0aW9uIChvRW50aXR5U2V0OiBDb250ZXh0KTogc3RyaW5nIHtcblx0Y29uc3Qgc1BhdGggPSBvRW50aXR5U2V0LmdldFBhdGgoKTtcblx0Y29uc3QgYVBhdGhzID0gc1BhdGguc3BsaXQoXCIvXCIpO1xuXHRjb25zdCByb290RW50aXR5U2V0UGF0aCA9IFwiL1wiICsgYVBhdGhzWzFdO1xuXHQvLyBnZXQgdGhlIGVkaXQgYWN0aW9uIGZyb20gcm9vdCBlbnRpdHkgc2V0c1xuXHRjb25zdCByb290RW50aXR5U2V0QW5ubm90YXRpb25zID0gb0VudGl0eVNldC5nZXRPYmplY3Qocm9vdEVudGl0eVNldFBhdGggKyBcIkBcIik7XG5cdGNvbnN0IGJEcmFmdFJvb3QgPSByb290RW50aXR5U2V0QW5ubm90YXRpb25zLmhhc093blByb3BlcnR5KFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIik7XG5cdGNvbnN0IGJEcmFmdE5vZGUgPSByb290RW50aXR5U2V0QW5ubm90YXRpb25zLmhhc093blByb3BlcnR5KFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGVcIik7XG5cdGNvbnN0IGJTdGlja3lTZXNzaW9uID0gcm9vdEVudGl0eVNldEFubm5vdGF0aW9ucy5oYXNPd25Qcm9wZXJ0eShcIkBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWRcIik7XG5cdGxldCBzQWN0aW9uTmFtZTtcblx0aWYgKGJEcmFmdFJvb3QpIHtcblx0XHRzQWN0aW9uTmFtZSA9IG9FbnRpdHlTZXQuZ2V0T2JqZWN0KGAke3Jvb3RFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L0VkaXRBY3Rpb25gKTtcblx0fSBlbHNlIGlmIChiRHJhZnROb2RlKSB7XG5cdFx0c0FjdGlvbk5hbWUgPSBvRW50aXR5U2V0LmdldE9iamVjdChgJHtyb290RW50aXR5U2V0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZS9FZGl0QWN0aW9uYCk7XG5cdH0gZWxzZSBpZiAoYlN0aWNreVNlc3Npb24pIHtcblx0XHRzQWN0aW9uTmFtZSA9IG9FbnRpdHlTZXQuZ2V0T2JqZWN0KGAke3Jvb3RFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWQvRWRpdEFjdGlvbmApO1xuXHR9XG5cdHJldHVybiAhc0FjdGlvbk5hbWUgPyBzQWN0aW9uTmFtZSA6IGAke3Jvb3RFbnRpdHlTZXRQYXRofS8ke3NBY3Rpb25OYW1lfWA7XG59O1xuXG5leHBvcnQgY29uc3QgaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyA9IGZ1bmN0aW9uIChvQW5ub3RhdGlvbnM/OiBNZXRhTW9kZWxQcm9wZXJ0eUFubm90YXRpb25zLCBvRmllbGRDb250cm9sPzogc3RyaW5nKTogYm9vbGVhbiB7XG5cdGxldCBiQ29tcHV0ZWQsIGJJbW11dGFibGUsIGJSZWFkT25seTtcblxuXHRpZiAob0Fubm90YXRpb25zICYmIG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5Db21wdXRlZFwiXSkge1xuXHRcdGJDb21wdXRlZCA9IChvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIl0gYXMgeyBCb29sPzogc3RyaW5nIH0pLkJvb2xcblx0XHRcdD8gKG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5Db21wdXRlZFwiXSBhcyB7IEJvb2w/OiBzdHJpbmcgfSkuQm9vbCA9PSBcInRydWVcIlxuXHRcdFx0OiB0cnVlO1xuXHR9XG5cdGlmIChvQW5ub3RhdGlvbnMgJiYgb0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkltbXV0YWJsZVwiXSkge1xuXHRcdGJJbW11dGFibGUgPSAob0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkltbXV0YWJsZVwiXSBhcyB7IEJvb2w/OiBzdHJpbmcgfSkuQm9vbFxuXHRcdFx0PyAob0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkltbXV0YWJsZVwiXSBhcyB7IEJvb2w/OiBzdHJpbmcgfSkuQm9vbCA9PSBcInRydWVcIlxuXHRcdFx0OiB0cnVlO1xuXHR9XG5cdGJSZWFkT25seSA9IGJDb21wdXRlZCB8fCBiSW1tdXRhYmxlO1xuXG5cdGlmIChvRmllbGRDb250cm9sKSB7XG5cdFx0YlJlYWRPbmx5ID0gYlJlYWRPbmx5IHx8IG9GaWVsZENvbnRyb2wgPT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sVHlwZS9SZWFkT25seVwiO1xuXHR9XG5cdGlmIChiUmVhZE9ubHkpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbmV4cG9ydCBjb25zdCByZWFkT25seUV4cHJlc3Npb25Gcm9tRHluYW1pY0Fubm90YXRpb25zID0gZnVuY3Rpb24gKG9GaWVsZENvbnRyb2w/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRsZXQgc0lzRmllbGRDb250cm9sUGF0aFJlYWRPbmx5O1xuXHRpZiAob0ZpZWxkQ29udHJvbCkge1xuXHRcdGlmIChCaW5kaW5nSW5mby5wYXJzZShvRmllbGRDb250cm9sKSkge1xuXHRcdFx0c0lzRmllbGRDb250cm9sUGF0aFJlYWRPbmx5ID0gXCIlXCIgKyBvRmllbGRDb250cm9sICsgXCIgPT09IDEgXCI7XG5cdFx0fVxuXHR9XG5cdGlmIChzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkpIHtcblx0XHRyZXR1cm4gXCJ7PSBcIiArIHNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seSArIFwiPyBmYWxzZSA6IHRydWUgfVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn07XG5cbi8qXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIGV4cHJlc3Npb24gZm9yIGNoYXJ0IFRpdGxlIFByZXNzXG4gKlxuICogQGZ1bmN0aW9ud1xuICogQHBhcmFtIHtvQ29uZmlndXJhdGlvbn0gW29Db25maWd1cmF0aW9uc10gY29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3RcbiAqICBAcGFyYW0ge29NYW5pZmVzdH0gW29NYW5pZmVzdF0gT3V0Ym91bmRzIGZyb20gbWFuaWZlc3RcbiAqIHJldHVybnMge1N0cmluZ30gW3NDb2xsZWN0aW9uTmFtZV0gQ29sbGVjdGlvbiBOYW1lIG9mIHRoZSBNaWNybyBDaGFydFxuICpcbiAqIHJldHVybnMge1N0cmluZ30gW0V4cHJlc3Npb25dIEhhbmRsZXIgRXhwcmVzc2lvbiBmb3IgdGhlIHRpdGxlIHByZXNzXG4gKlxuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzc2lvbkZvck1pY3JvQ2hhcnRUaXRsZVByZXNzID0gZnVuY3Rpb24gKFxuXHRvQ29uZmlndXJhdGlvbjogQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdHRhcmdldEFubm90YXRpb25QYXRoOiBzdHJpbmcsXG5cdHRhcmdldEFubm90YXRpb25QYXRoRGF0TW9kZWxPYmplY3Q6IERhdGFNb2RlbE9iamVjdFBhdGg8Q2hhcnQgfCBQcmVzZW50YXRpb25WYXJpYW50Pixcblx0b01hbmlmZXN0T3V0Ym91bmQ6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0T3V0Ym91bmRFbnRyeT4sXG5cdHNDb2xsZWN0aW9uTmFtZTogc3RyaW5nXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHR0YXJnZXRBbm5vdGF0aW9uUGF0aCA9IGdldE1pY3JvQ2hhcnRDb250cm9sQ29uZmlndXJhdGlvblBhdGgodGFyZ2V0QW5ub3RhdGlvblBhdGgsIHRhcmdldEFubm90YXRpb25QYXRoRGF0TW9kZWxPYmplY3QsIHNDb2xsZWN0aW9uTmFtZSk7XG5cdGNvbnN0IG5hdmlnYXRpb25Db25maWd1cmF0aW9uID0gKG9Db25maWd1cmF0aW9uPy5bdGFyZ2V0QW5ub3RhdGlvblBhdGhdIGFzIE1pY3JvQ2hhcnRNYW5pZmVzdENvbmZpZ3VyYXRpb24pPy5bXCJuYXZpZ2F0aW9uXCJdO1xuXHRpZiAobmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24pIHtcblx0XHRpZiAoXG5cdFx0XHQobmF2aWdhdGlvbkNvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSAmJiBuYXZpZ2F0aW9uQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0pIHx8XG5cdFx0XHQobmF2aWdhdGlvbkNvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSAmJlxuXHRcdFx0XHRuYXZpZ2F0aW9uQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0gJiZcblx0XHRcdFx0bmF2aWdhdGlvbkNvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSlcblx0XHQpIHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFwiLmhhbmRsZXJzLm9uRGF0YVBvaW50VGl0bGVQcmVzc2VkKCRjb250cm9sbGVyLCAkeyRzb3VyY2U+L30sJ1wiICtcblx0XHRcdFx0SlNPTi5zdHJpbmdpZnkob01hbmlmZXN0T3V0Ym91bmQpICtcblx0XHRcdFx0XCInLCdcIiArXG5cdFx0XHRcdG5hdmlnYXRpb25Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl1bXCJvdXRib3VuZFwiXSArXG5cdFx0XHRcdFwiJywnXCIgK1xuXHRcdFx0XHRzQ29sbGVjdGlvbk5hbWUgK1xuXHRcdFx0XHRcIicgKVwiXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSBpZiAobmF2aWdhdGlvbkNvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkge1xuXHRcdFx0cmV0dXJuIFwiLmhhbmRsZXJzLm5hdmlnYXRlVG9TdWJTZWN0aW9uKCRjb250cm9sbGVyLCAnXCIgKyBKU09OLnN0cmluZ2lmeShuYXZpZ2F0aW9uQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSArIFwiJylcIjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cbn07XG5cbi8qXG4gKiBGdW5jdGlvbiB0byByZW5kZXIgQ2hhcnQgVGl0bGUgYXMgTGlua1xuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtvQ29udHJvbENvbmZpZ3VyYXRpb259IFtvQ29uZmlndXJhdGlvbnNdIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmcm9tIG1hbmlmZXN0XG4gKiByZXR1cm5zIHtTdHJpbmd9IFtzS2V5XSBGb3IgdGhlIFRhcmdldE91dGJvdW5kIGFuZCBUYXJnZXRTZWN0aW9uXG4gKlxuICovXG5leHBvcnQgY29uc3QgZ2V0TWljcm9DaGFydFRpdGxlQXNMaW5rID0gZnVuY3Rpb24gKFxuXHRvQ29udHJvbENvbmZpZ3VyYXRpb246IENvbnRyb2xDb25maWd1cmF0aW9uLFxuXHR0YXJnZXRBbm5vdGF0aW9uUGF0aDogc3RyaW5nLFxuXHR0YXJnZXRBbm5vdGF0aW9uUGF0aERhdE1vZGVsT2JqZWN0OiBEYXRhTW9kZWxPYmplY3RQYXRoPENoYXJ0IHwgUHJlc2VudGF0aW9uVmFyaWFudD4sXG5cdGNvbGxlY3Rpb25OYW1lOiBzdHJpbmdcbik6IHN0cmluZyB7XG5cdHRhcmdldEFubm90YXRpb25QYXRoID0gZ2V0TWljcm9DaGFydENvbnRyb2xDb25maWd1cmF0aW9uUGF0aCh0YXJnZXRBbm5vdGF0aW9uUGF0aCwgdGFyZ2V0QW5ub3RhdGlvblBhdGhEYXRNb2RlbE9iamVjdCwgY29sbGVjdGlvbk5hbWUpO1xuXHRjb25zdCB0YXJnZXRDb250cm9sQ29uZmlndXJhdGlvbiA9IChvQ29udHJvbENvbmZpZ3VyYXRpb24/Llt0YXJnZXRBbm5vdGF0aW9uUGF0aF0gYXMgTWljcm9DaGFydE1hbmlmZXN0Q29uZmlndXJhdGlvbik/LltcIm5hdmlnYXRpb25cIl07XG5cdGlmIChcblx0XHR0YXJnZXRDb250cm9sQ29uZmlndXJhdGlvbiAmJlxuXHRcdCh0YXJnZXRDb250cm9sQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdIHx8XG5cdFx0XHQodGFyZ2V0Q29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSAmJiB0YXJnZXRDb250cm9sQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSlcblx0KSB7XG5cdFx0cmV0dXJuIFwiRXh0ZXJuYWxcIjtcblx0fSBlbHNlIGlmICh0YXJnZXRDb250cm9sQ29uZmlndXJhdGlvbiAmJiB0YXJnZXRDb250cm9sQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0cmV0dXJuIFwiSW5QYWdlXCI7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIFwiTm9uZVwiO1xuXHR9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWljcm9DaGFydENvbnRyb2xDb25maWd1cmF0aW9uUGF0aCA9IGZ1bmN0aW9uIChcblx0dGFyZ2V0QW5ub3RhdGlvblBhdGg6IHN0cmluZyxcblx0dGFyZ2V0QW5ub3RhdGlvblBhdGhEYXRNb2RlbE9iamVjdDogRGF0YU1vZGVsT2JqZWN0UGF0aDxDaGFydCB8IFByZXNlbnRhdGlvblZhcmlhbnQ+LFxuXHRjb2xsZWN0aW9uTmFtZTogc3RyaW5nXG4pOiBzdHJpbmcge1xuXHRpZiAodGFyZ2V0QW5ub3RhdGlvblBhdGhEYXRNb2RlbE9iamVjdD8udGFyZ2V0T2JqZWN0Py4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5QcmVzZW50YXRpb25WYXJpYW50VHlwZVwiKSB7XG5cdFx0dGFyZ2V0QW5ub3RhdGlvblBhdGggPSB0YXJnZXRBbm5vdGF0aW9uUGF0aERhdE1vZGVsT2JqZWN0LnRhcmdldE9iamVjdD8uVmlzdWFsaXphdGlvbnNbMF0/LnZhbHVlO1xuXHRcdHRhcmdldEFubm90YXRpb25QYXRoID0gY29sbGVjdGlvbk5hbWUgPyBgJHtjb2xsZWN0aW9uTmFtZX0vJHt0YXJnZXRBbm5vdGF0aW9uUGF0aH1gIDogdGFyZ2V0QW5ub3RhdGlvblBhdGg7XG5cdH1cblx0cmV0dXJuIHRhcmdldEFubm90YXRpb25QYXRoO1xufTtcblxuLyogR2V0IGdyb3VwSWQgZnJvbSBjb250cm9sIGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb0NvbmZpZ3VyYXRpb25zXSBjb250cm9sIGNvbmZpZ3VyYXRpb24gZnJvbSBtYW5pZmVzdFxuICogQHBhcmFtIHtTdHJpbmd9IFtzQW5ub3RhdGlvblBhdGhdIEFubm90YXRpb24gUGF0aCBmb3IgdGhlIGNvbmZpZ3VyYXRpb25cbiAqIEBkZXNjcmlwdGlvbiBVc2VkIHRvIGdldCB0aGUgZ3JvdXBJZCBmb3IgRGF0YVBvaW50cyBhbmQgTWljcm9DaGFydHMgaW4gdGhlIEhlYWRlci5cbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRHcm91cElkRnJvbUNvbmZpZyA9IGZ1bmN0aW9uIChcblx0b0NvbmZpZ3VyYXRpb25zOiBDb250cm9sQ29uZmlndXJhdGlvbixcblx0c0Fubm90YXRpb25QYXRoOiBzdHJpbmcsXG5cdHNEZWZhdWx0R3JvdXBJZD86IHN0cmluZ1xuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Y29uc3Qgb0NvbmZpZ3VyYXRpb24gPSBvQ29uZmlndXJhdGlvbnNbc0Fubm90YXRpb25QYXRoXSBhcyBNaWNyb0NoYXJ0TWFuaWZlc3RDb25maWd1cmF0aW9uLFxuXHRcdGFBdXRvUGF0dGVybnMgPSBbXCJIZXJvZXNcIiwgXCJEZWNvcmF0aW9uXCIsIFwiV29ya2Vyc1wiLCBcIkxvbmdSdW5uZXJzXCJdO1xuXHRsZXQgc0dyb3VwSWQgPSBzRGVmYXVsdEdyb3VwSWQ7XG5cdGlmIChcblx0XHRvQ29uZmlndXJhdGlvbiAmJlxuXHRcdG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkICYmXG5cdFx0YUF1dG9QYXR0ZXJucy5zb21lKGZ1bmN0aW9uIChhdXRvUGF0dGVybjogc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gYXV0b1BhdHRlcm4gPT09IG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkO1xuXHRcdH0pXG5cdCkge1xuXHRcdHNHcm91cElkID0gXCIkYXV0by5cIiArIG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkO1xuXHR9XG5cdHJldHVybiBzR3JvdXBJZDtcbn07XG5cbi8qKlxuICogR2V0cyBncm91cElkIGZyb20gY29udHJvbCBjb25maWd1cmF0aW9uIGZvciBtaWNybyBjaGFydC5cbiAqIEBwYXJhbSBvQ29udHJvbENvbmZpZ3VyYXRpb24gQ29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3RcbiAqIEBwYXJhbSB0YXJnZXRBbm5vdGF0aW9uUGF0aCBBbm5vdGF0aW9uIHBhdGggZm9yIHRoZSBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0gdGFyZ2V0QW5ub3RhdGlvblBhdGhEYXRhTW9kZWxPYmplY3QgRGF0YU1vZGVsT2JqZWN0IG9mIENoYXJ0IG9yIFByZXNlbnRhdGlvblZhcmlhbnRcbiAqIEBwYXJhbSBjb2xsZWN0aW9uTmFtZSBDb2xsZWN0aW9uIE5hbWVcbiAqIEBwYXJhbSBzRGVmYXVsdEdyb3VwSWQgRGVmYXVsdCBHcm91cElkXG4gKiBAcmV0dXJucyBHcm91cElkIGZvciBtaWNybyBjaGFydFxuICovXG5leHBvcnQgY29uc3QgZ2V0R3JvdXBJZEZyb21Db25maWdGb3JNaWNyb0NoYXJ0ID0gZnVuY3Rpb24gKFxuXHRvQ29udHJvbENvbmZpZ3VyYXRpb246IENvbnRyb2xDb25maWd1cmF0aW9uLFxuXHR0YXJnZXRBbm5vdGF0aW9uUGF0aDogc3RyaW5nLFxuXHR0YXJnZXRBbm5vdGF0aW9uUGF0aERhdGFNb2RlbE9iamVjdDogRGF0YU1vZGVsT2JqZWN0UGF0aDxDaGFydCB8IFByZXNlbnRhdGlvblZhcmlhbnQ+LFxuXHRjb2xsZWN0aW9uTmFtZTogc3RyaW5nLFxuXHRzRGVmYXVsdEdyb3VwSWQ/OiBzdHJpbmdcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdHRhcmdldEFubm90YXRpb25QYXRoID0gZ2V0TWljcm9DaGFydENvbnRyb2xDb25maWd1cmF0aW9uUGF0aCh0YXJnZXRBbm5vdGF0aW9uUGF0aCwgdGFyZ2V0QW5ub3RhdGlvblBhdGhEYXRhTW9kZWxPYmplY3QsIGNvbGxlY3Rpb25OYW1lKTtcblx0cmV0dXJuIGdldEdyb3VwSWRGcm9tQ29uZmlnKG9Db250cm9sQ29uZmlndXJhdGlvbiwgdGFyZ2V0QW5ub3RhdGlvblBhdGgsIHNEZWZhdWx0R3JvdXBJZCk7XG59O1xuXG4vKlxuICogR2V0IENvbnRleHQgQmluZGluZyB3aXRoIGdyb3VwSWQgZnJvbSBjb250cm9sIGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb0NvbmZpZ3VyYXRpb25zXSBjb250cm9sIGNvbmZpZ3VyYXRpb24gZnJvbSBtYW5pZmVzdFxuICogQHBhcmFtIHtTdHJpbmd9IFtzS2V5XSBBbm5vdGF0aW9uIFBhdGggZm9yIG9mIHRoZSBjb25maWd1cmF0aW9uXG4gKiBAZGVzY3JpcHRpb24gVXNlZCB0byBnZXQgdGhlIGJpbmRpbmcgZm9yIERhdGFQb2ludHMgaW4gdGhlIEhlYWRlci5cbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRCaW5kaW5nV2l0aEdyb3VwSWRGcm9tQ29uZmlnID0gZnVuY3Rpb24gKG9Db25maWd1cmF0aW9uczogQ29udHJvbENvbmZpZ3VyYXRpb24sIHNLZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IHNHcm91cElkID0gZ2V0R3JvdXBJZEZyb21Db25maWcob0NvbmZpZ3VyYXRpb25zLCBzS2V5KTtcblx0bGV0IHNCaW5kaW5nO1xuXHRpZiAoc0dyb3VwSWQpIHtcblx0XHRzQmluZGluZyA9IFwieyBwYXRoIDogJycsIHBhcmFtZXRlcnMgOiB7ICQkZ3JvdXBJZCA6ICdcIiArIHNHcm91cElkICsgXCInIH0gfVwiO1xuXHR9XG5cdHJldHVybiBzQmluZGluZztcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0gZGF0YU1vZGVsT2JqZWN0UGF0aCBEYXRhTW9kZWxPYmplY3RQYXRoIG9mIHRoZSBuYXZpZ2F0aW9uUGF0aFxuICogQHJldHVybnMgVGhlIEJpbmRpbmcgZXhwcmVzc2lvbiBpbmNsdWRpbmcgcGF0aCBhbmQgJHNlbGVjdCBxdWVyeSBhcyBwYXJhbWV0ZXIgZGVwZW5kaW5nIG9uIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVCaW5kaW5nRm9yQWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyA9IGZ1bmN0aW9uIChkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPEZhY2V0Pik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGxldCBiaW5kaW5nOiBQYXJ0aWFsPFBhdGhJbk1vZGVsRXhwcmVzc2lvbjx1bmRlZmluZWQ+PiB8IHVuZGVmaW5lZDtcblx0Y29uc3QgYWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyA9IE1vZGVsSGVscGVyLmdldEFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXMoXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aD8udGFyZ2V0RW50aXR5VHlwZSxcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoPy50YXJnZXRFbnRpdHlTZXQgYXMgRW50aXR5U2V0XG5cdCk7XG5cblx0aWYgKGFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXM/Lmxlbmd0aCkge1xuXHRcdGJpbmRpbmcgPSB7XG5cdFx0XHRwYXRoOiBcIlwiXG5cdFx0fTtcblx0XHRiaW5kaW5nLnBhcmFtZXRlcnMgPSB7ICRzZWxlY3Q6IGFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXMuam9pbihcIixcIikgfHwgXCJcIiB9O1xuXHR9XG5cdHJldHVybiBKU09OLnN0cmluZ2lmeShiaW5kaW5nKTtcbn07XG5cbi8qKlxuICogTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgYSBGaWVsZEdyb3VwIGNvbnNpc3RzIG9mIG9ubHkgMSBEYXRhRmllbGQgd2l0aCBNdWx0aUxpbmUgdGV4dCBhbm5vdGF0aW9uLlxuICogQHBhcmFtIGFGb3JtRWxlbWVudHMgQSBjb2xsZWN0aW9uIG9mIGZvcm0gZWxlbWVudHMgdXNlZCBpbiB0aGUgY3VycmVudCBmaWVsZCBncm91cFxuICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIG9ubHkgMSBkYXRhIGZpZWxkIHdpdGggTXVsdGlsaW5lIHRleHQgYW5ub3RhdGlvbiBleGlzdHMuXG4gKi9cbmV4cG9ydCBjb25zdCBkb2VzRmllbGRHcm91cENvbnRhaW5Pbmx5T25lTXVsdGlMaW5lRGF0YUZpZWxkID0gZnVuY3Rpb24gKGFGb3JtRWxlbWVudHM6IEFubm90YXRpb25Gb3JtRWxlbWVudFtdKTogYm9vbGVhbiB7XG5cdHJldHVybiBhRm9ybUVsZW1lbnRzICYmIGFGb3JtRWxlbWVudHMubGVuZ3RoID09PSAxICYmICEhYUZvcm1FbGVtZW50c1swXS5pc1ZhbHVlTXVsdGlsaW5lVGV4dDtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB2aWV3RGF0YSBTcGVjaWZpZXMgdGhlIFZpZXdEYXRhIG1vZGVsXG4gKiBAcmV0dXJucyBFeHByZXNzaW9uIG9yIEJvb2xlYW4gdmFsdWVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFNoYXJlQnV0dG9uVmlzaWJpbGl0eSA9IGZ1bmN0aW9uICh2aWV3RGF0YTogVmlld0RhdGEpOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGlmICh2aWV3RGF0YS5pc1NoYXJlQnV0dG9uVmlzaWJsZUZvck15SW5ib3ggPT09IGZhbHNlKSB7XG5cdFx0cmV0dXJuIFwiZmFsc2VcIjtcblx0fVxuXHRjb25zdCBzaGFyZUJ1dHRvblZpc2liaWxpdHlFeHAgPSB2aWV3RGF0YS5mY2xFbmFibGVkXG5cdFx0PyBhbmQocGF0aEluTW9kZWwoXCIvc2hvd1NoYXJlSWNvblwiLCBcImZjbGhlbHBlclwiKSwgbm90KFVJLklzQ3JlYXRlTW9kZSkpXG5cdFx0OiBub3QoVUkuSXNDcmVhdGVNb2RlKTtcblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKHNoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCk7XG59O1xuXG4vKlxuICogR2V0cyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgaGVhZGVyIGluZm8gaW4gZWRpdCBtb2RlXG4gKlxuICogSWYgZWl0aGVyIHRoZSB0aXRsZSBvciBkZXNjcmlwdGlvbiBmaWVsZCBmcm9tIHRoZSBoZWFkZXIgYW5ub3RhdGlvbnMgYXJlIGVkaXRhYmxlLCB0aGVuIHRoZVxuICogZWRpdGFibGUgaGVhZGVyIGluZm8gaXMgdmlzaWJsZS5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0Fubm90YXRpb25zXSBBbm5vdGF0aW9ucyBvYmplY3QgZm9yIGdpdmVuIGVudGl0eSBzZXRcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0ZpZWxkQ29udHJvbF0gZmllbGQgY29udHJvbFxuICogcmV0dXJucyB7Kn0gIGJpbmRpbmcgZXhwcmVzc2lvbiBvciBib29sZWFuIHZhbHVlIHJlc29sdmVkIGZvcm0gZnVuY2l0b25zIGlzUmVhZE9ubHlGcm9tU3RhdGljQW5ub3RhdGlvbnMgYW5kIGlzUmVhZE9ubHlGcm9tRHluYW1pY0Fubm90YXRpb25zXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRWaXNpYmxpdHlPZkhlYWRlckluZm8gPSBmdW5jdGlvbiAoXG5cdG9UaXRsZUFubm90YXRpb25zOiBNZXRhTW9kZWxQcm9wZXJ0eUFubm90YXRpb25zLFxuXHRvRGVzY3JpcHRpb25Bbm5vdGF0aW9uczogTWV0YU1vZGVsUHJvcGVydHlBbm5vdGF0aW9ucyxcblx0b0ZpZWxkVGl0bGVGaWVsZENvbnRyb2w/OiBzdHJpbmcsXG5cdG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sPzogc3RyaW5nXG4pOiBib29sZWFuIHwgc3RyaW5nIHtcblx0Ly8gQ2hlY2sgQW5ub3RhdGlvbnMgZm9yIFRpdGxlIEZpZWxkXG5cdC8vIFNldCB0byB0cnVlIGFuZCBkb24ndCB0YWtlIGludG8gYWNjb3VudCwgaWYgdGhlcmUgYXJlIG5vIGFubm90YXRpb25zLCBpLmUuIG5vIHRpdGxlIGV4aXN0c1xuXHRjb25zdCBiSXNUaXRsZVJlYWRPbmx5ID0gb1RpdGxlQW5ub3RhdGlvbnMgPyBpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zKG9UaXRsZUFubm90YXRpb25zLCBvRmllbGRUaXRsZUZpZWxkQ29udHJvbCkgOiB0cnVlO1xuXHRjb25zdCB0aXRsZUV4cHJlc3Npb24gPSByZWFkT25seUV4cHJlc3Npb25Gcm9tRHluYW1pY0Fubm90YXRpb25zKG9GaWVsZFRpdGxlRmllbGRDb250cm9sKTtcblx0Ly8gVGhlcmUgaXMgbm8gZXhwcmVzc2lvbiBhbmQgdGhlIHRpdGxlIGlzIG5vdCByZWFkeSBvbmx5LCB0aGlzIGlzIHN1ZmZpY2llbnQgZm9yIGFuIGVkaXRhYmxlIGhlYWRlclxuXHRpZiAoIWJJc1RpdGxlUmVhZE9ubHkgJiYgIXRpdGxlRXhwcmVzc2lvbikge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gQ2hlY2sgQW5ub3RhdGlvbnMgZm9yIERlc2NyaXB0aW9uIEZpZWxkXG5cdC8vIFNldCB0byB0cnVlIGFuZCBkb24ndCB0YWtlIGludG8gYWNjb3VudCwgaWYgdGhlcmUgYXJlIG5vIGFubm90YXRpb25zLCBpLmUuIG5vIGRlc2NyaXB0aW9uIGV4aXN0c1xuXHRjb25zdCBiSXNEZXNjcmlwdGlvblJlYWRPbmx5ID0gb0Rlc2NyaXB0aW9uQW5ub3RhdGlvbnNcblx0XHQ/IGlzUmVhZE9ubHlGcm9tU3RhdGljQW5ub3RhdGlvbnMob0Rlc2NyaXB0aW9uQW5ub3RhdGlvbnMsIG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sKVxuXHRcdDogdHJ1ZTtcblx0Y29uc3QgZGVzY3JpcHRpb25FeHByZXNzaW9uID0gcmVhZE9ubHlFeHByZXNzaW9uRnJvbUR5bmFtaWNBbm5vdGF0aW9ucyhvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbCk7XG5cdC8vIFRoZXJlIGlzIG5vIGV4cHJlc3Npb24gYW5kIHRoZSBkZXNjcmlwdGlvbiBpcyBub3QgcmVhZHkgb25seSwgdGhpcyBpcyBzdWZmaWNpZW50IGZvciBhbiBlZGl0YWJsZSBoZWFkZXJcblx0aWYgKCFiSXNEZXNjcmlwdGlvblJlYWRPbmx5ICYmICFkZXNjcmlwdGlvbkV4cHJlc3Npb24pIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIEJvdGggdGl0bGUgYW5kIGRlc2NyaXB0aW9uIGFyZSBub3QgZWRpdGFibGUgYW5kIHRoZXJlIGFyZSBubyBkeW5hbWljIGFubm90YXRpb25zXG5cdGlmIChiSXNUaXRsZVJlYWRPbmx5ICYmIGJJc0Rlc2NyaXB0aW9uUmVhZE9ubHkgJiYgIXRpdGxlRXhwcmVzc2lvbiAmJiAhZGVzY3JpcHRpb25FeHByZXNzaW9uKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gTm93IGNvbWJpbmUgZXhwcmVzc2lvbnNcblx0aWYgKHRpdGxlRXhwcmVzc2lvbiAmJiAhZGVzY3JpcHRpb25FeHByZXNzaW9uKSB7XG5cdFx0cmV0dXJuIHRpdGxlRXhwcmVzc2lvbjtcblx0fSBlbHNlIGlmICghdGl0bGVFeHByZXNzaW9uICYmIGRlc2NyaXB0aW9uRXhwcmVzc2lvbikge1xuXHRcdHJldHVybiBkZXNjcmlwdGlvbkV4cHJlc3Npb247XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGNvbWJpbmVUaXRsZUFuZERlc2NyaXB0aW9uRXhwcmVzc2lvbihvRmllbGRUaXRsZUZpZWxkQ29udHJvbCwgb0ZpZWxkRGVzY3JpcHRpb25GaWVsZENvbnRyb2wpO1xuXHR9XG59O1xuXG5leHBvcnQgY29uc3QgY29tYmluZVRpdGxlQW5kRGVzY3JpcHRpb25FeHByZXNzaW9uID0gZnVuY3Rpb24gKG9UaXRsZUZpZWxkQ29udHJvbD86IHN0cmluZywgb0Rlc2NyaXB0aW9uRmllbGRDb250cm9sPzogc3RyaW5nKTogc3RyaW5nIHtcblx0Ly8gSWYgYm90aCBoZWFkZXIgYW5kIHRpdGxlIGZpZWxkIGFyZSBiYXNlZCBvbiBkeW5tYWljIGZpZWxkIGNvbnRyb2wsIHRoZSBlZGl0YWJsZSBoZWFkZXJcblx0Ly8gaXMgdmlzaWJsZSBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgaXMgbm90IHJlYWR5IG9ubHlcblx0cmV0dXJuIFwiez0gJVwiICsgb1RpdGxlRmllbGRDb250cm9sICsgXCIgPT09IDEgPyAoICVcIiArIG9EZXNjcmlwdGlvbkZpZWxkQ29udHJvbCArIFwiID09PSAxID8gZmFsc2UgOiB0cnVlICkgOiB0cnVlIH1cIjtcbn07XG5cbi8qXG4gKiBHZXQgRXhwcmVzc2lvbiBvZiBwcmVzcyBldmVudCBmb3IgdGhlIGRlbGV0ZSBidXR0b24uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gZW50aXR5U2V0IFRoZSBjdXJyZW50IGVudGl0eSBzZXRcbiAqIEBwYXJhbSBjb21wdXRlZEFubm90YXRpb25JbnRlcmZhY2UgVGhlIGN1cnJlbnQgdGVtcGxhdGluZyBjb250ZXh0XG4gKiByZXR1cm5zIFRoZSBmdW5jdGlvbiBzdHJpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIENvbW1vbkhlbHBlcidzIG1ldGhvZCBnZW5lcmF0ZUZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRQcmVzc0V4cHJlc3Npb25Gb3JEZWxldGUgPSBmdW5jdGlvbiAoKTogc3RyaW5nIHtcblx0Y29uc3QgZGVsZXRhYmxlQ29udGV4dHMgPSBcIiR7JHZpZXc+L30uZ2V0QmluZGluZ0NvbnRleHQoKVwiLFxuXHRcdHRpdGxlID0gXCIkeyR2aWV3Pi99LmJ5SWQoJ2ZlOjpPYmplY3RQYWdlJykuZGF0YSgnT2JqZWN0UGFnZVN1YnRpdGxlJylcIixcblx0XHRkZXNjcmlwdGlvbiA9IFwiJHskdmlldz4vfS5ieUlkKCdmZTo6T2JqZWN0UGFnZScpLmRhdGEoJ09iamVjdFBhZ2VEZXNjcmlwdGlvbicpXCI7XG5cblx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdHRpdGxlOiB0aXRsZSxcblx0XHRkZXNjcmlwdGlvbjogZGVzY3JpcHRpb25cblx0fTtcblx0cmV0dXJuIENvbW1vbkhlbHBlci5nZW5lcmF0ZUZ1bmN0aW9uKFwiLmVkaXRGbG93LmRlbGV0ZURvY3VtZW50XCIsIGRlbGV0YWJsZUNvbnRleHRzLCBDb21tb25IZWxwZXIub2JqZWN0VG9TdHJpbmcocGFyYW1zKSk7XG59O1xuXG4vKlxuICogR2V0IEV4cHJlc3Npb24gb2YgcHJlc3MgZXZlbnQgb2YgRWRpdCBidXR0b24uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gW29EYXRhRmllbGRdIERhdGEgZmllbGQgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gW3NFbnRpdHlTZXROYW1lXSBFbnRpdHkgc2V0IG5hbWVcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0hlYWRlckFjdGlvbl0gSGVhZGVyIGFjdGlvbiBvYmplY3RcbiAqIHJldHVybnMge3N0cmluZ30gIGJpbmRpbmcgZXhwcmVzc2lvbiAvIGZ1bmN0aW9uIHN0cmluZyBnZW5lcmF0ZWQgZnJvbSBjb21tYW5oZWxwZXIncyBmdW5jdGlvbiBnZW5lcmF0ZUZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRQcmVzc0V4cHJlc3Npb25Gb3JFZGl0ID0gZnVuY3Rpb24gKFxuXHRvRGF0YUZpZWxkOiBNZXRhTW9kZWxUeXBlPERhdGFGaWVsZEZvckFjdGlvbj4sXG5cdHNFbnRpdHlTZXROYW1lOiBzdHJpbmcsXG5cdG9IZWFkZXJBY3Rpb24/OiBCYXNlQWN0aW9uXG4pOiBzdHJpbmcge1xuXHRjb25zdCBzRWRpdGFibGVDb250ZXh0cyA9IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMob0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkFjdGlvbiEpLFxuXHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID1cblx0XHRcdG9EYXRhRmllbGQgJiZcblx0XHRcdG9EYXRhRmllbGQuSW52b2NhdGlvbkdyb3VwaW5nICYmXG5cdFx0XHQob0RhdGFGaWVsZC5JbnZvY2F0aW9uR3JvdXBpbmcgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KVtcIiRFbnVtTWVtYmVyXCJdLFxuXHRcdHNJbnZvY2F0aW9uR3JvdXAgPSBzRGF0YUZpZWxkRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5PcGVyYXRpb25Hcm91cGluZ1R5cGUvQ2hhbmdlU2V0XCIgPyBcIkNoYW5nZVNldFwiIDogXCJJc29sYXRlZFwiO1xuXHRjb25zdCBvUGFyYW1zID0ge1xuXHRcdGNvbnRleHRzOiBcIiR7JHZpZXc+L30uZ2V0QmluZGluZ0NvbnRleHQoKVwiLFxuXHRcdGVudGl0eVNldE5hbWU6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0VudGl0eVNldE5hbWUpLFxuXHRcdGludm9jYXRpb25Hcm91cGluZzogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzSW52b2NhdGlvbkdyb3VwKSxcblx0XHRtb2RlbDogXCIkeyRzb3VyY2U+L30uZ2V0TW9kZWwoKVwiLFxuXHRcdGxhYmVsOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5MYWJlbCEsIHRydWUpLFxuXHRcdGlzTmF2aWdhYmxlOiBvSGVhZGVyQWN0aW9uICYmIG9IZWFkZXJBY3Rpb24uaXNOYXZpZ2FibGUsXG5cdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOlxuXHRcdFx0b0hlYWRlckFjdGlvbiAmJiBvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiA/IGAnJHtvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbn0nYCA6IHVuZGVmaW5lZCxcblx0XHRkaXNhYmxlU3RyaWN0SGFuZGxpbmc6IG9IZWFkZXJBY3Rpb24/LmRpc2FibGVTdHJpY3RIYW5kbGluZ1xuXHR9O1xuXHRyZXR1cm4gQ29tbW9uSGVscGVyLmdlbmVyYXRlRnVuY3Rpb24oXCIuaGFuZGxlcnMub25DYWxsQWN0aW9uXCIsIFwiJHskdmlldz4vfVwiLCBzRWRpdGFibGVDb250ZXh0cywgQ29tbW9uSGVscGVyLm9iamVjdFRvU3RyaW5nKG9QYXJhbXMpKTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgZXhwcmVzc2lvbiBmb3IgdGhlICdwcmVzcycgZXZlbnQgaW4gdGhlIGZvb3RlciBhbm5vdGF0aW9uIGFjdGlvbnMuXG4gKiBAcGFyYW0gZGF0YUZpZWxkTW9kZWxQYXRoIFRoZSBkYXRhIG1vZGVsIHBhdGggb2YgdGhlIGRhdGEgZmllbGRcbiAqIEBwYXJhbSBlbnRpdHlTZXROYW1lIFRoZSBlbnRpdHkgc2V0IG5hbWVcbiAqIEBwYXJhbSBoZWFkZXJBY3Rpb24gVGhlIGhlYWRlciBhY3Rpb24gb2JqZWN0XG4gKiBAcmV0dXJucyAgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBvciBmdW5jdGlvbiBzdHJpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFByZXNzRXhwcmVzc2lvbkZvckZvb3RlckFubm90YXRpb25BY3Rpb24gPSBmdW5jdGlvbiAoXG5cdGRhdGFGaWVsZE1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxEYXRhRmllbGRGb3JBY3Rpb24+LFxuXHRlbnRpdHlTZXROYW1lOiBzdHJpbmcsXG5cdGhlYWRlckFjdGlvbjogQ3VzdG9tQWN0aW9uXG4pOiBzdHJpbmcge1xuXHRjb25zdCBkYXRhRmllbGQgPSBkYXRhRmllbGRNb2RlbFBhdGgudGFyZ2V0T2JqZWN0IGFzIERhdGFGaWVsZEZvckFjdGlvbjtcblx0Y29uc3QgYWN0aW9uQ29udGV4dHMgPSBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKGRhdGFGaWVsZC5BY3Rpb24gYXMgc3RyaW5nKTtcblx0Y29uc3Qgb1BhcmFtcyA9IHtcblx0XHRjb250ZXh0czogXCIkeyR2aWV3Pi99LmdldEJpbmRpbmdDb250ZXh0KClcIixcblx0XHRlbnRpdHlTZXROYW1lOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKGVudGl0eVNldE5hbWUpLFxuXHRcdGludm9jYXRpb25Hcm91cGluZzogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3Rlcyhcblx0XHRcdGRhdGFGaWVsZC5JbnZvY2F0aW9uR3JvdXBpbmcgPT09IFwiVUkuT3BlcmF0aW9uR3JvdXBpbmdUeXBlL0NoYW5nZVNldFwiID8gXCJDaGFuZ2VTZXRcIiA6IFwiSXNvbGF0ZWRcIlxuXHRcdCksXG5cdFx0bW9kZWw6IFwiJHskc291cmNlPi99LmdldE1vZGVsKClcIixcblx0XHRsYWJlbDogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhkYXRhRmllbGQuTGFiZWwgYXMgc3RyaW5nLCB0cnVlKSxcblx0XHRpc05hdmlnYWJsZTogaGVhZGVyQWN0aW9uLmlzTmF2aWdhYmxlLFxuXHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbjogaGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvblxuXHRcdFx0PyBgJyR7aGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbn0nYFxuXHRcdFx0OiB1bmRlZmluZWRcblx0fTtcblx0cmV0dXJuIENvbW1vbkhlbHBlci5nZW5lcmF0ZUZ1bmN0aW9uKFwiLmhhbmRsZXJzLm9uQ2FsbEFjdGlvblwiLCBcIiR7JHZpZXc+L31cIiwgYWN0aW9uQ29udGV4dHMsIENvbW1vbkhlbHBlci5vYmplY3RUb1N0cmluZyhvUGFyYW1zKSk7XG59O1xuXG4vKlxuICogR2V0IEV4cHJlc3Npb24gZm9yIGV4ZWN1dGluZyB0aGUgZXZlbnQgZXhwcmVzc2lvbiBvZiB0aGUgcHJpbWFyeSBhY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gW29EYXRhRmllbGRdIERhdGEgZmllbGQgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gW3NFbnRpdHlTZXROYW1lXSBFbnRpdHkgc2V0IG5hbWVcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0hlYWRlckFjdGlvbl0gSGVhZGVyIGFjdGlvbiBvYmplY3RcbiAqIEBwYXJhbSB7Q29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBzdHJpbmd9IFRoZSB2aXNpYmlsaXR5IG9mIHNlbWF0aWMgcG9zaXRpdmUgYWN0aW9uXG4gKiBAcGFyYW0ge0NvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nfSBUaGUgZW5hYmxlbWVudCBvZiBzZW1hbnRpYyBwb3NpdGl2ZSBhY3Rpb25cbiAqIEBwYXJhbSB7Q29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBzdHJpbmd9IFRoZSBFZGl0IGJ1dHRvbiB2aXNpYmlsaXR5XG4gKiBAcGFyYW0ge0NvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nfSBUaGUgZW5hYmxlbWVudCBvZiBFZGl0IGJ1dHRvblxuICogcmV0dXJucyB7c3RyaW5nfSAgYmluZGluZyBleHByZXNzaW9uIC8gZnVuY3Rpb24gc3RyaW5nIGdlbmVyYXRlZCBmcm9tIGNvbW1hbmhlbHBlcidzIGZ1bmN0aW9uIGdlbmVyYXRlRnVuY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFByZXNzRXhwcmVzc2lvbkZvclByaW1hcnlBY3Rpb24gPSBmdW5jdGlvbiAoXG5cdG9EYXRhRmllbGQ6IERhdGFGaWVsZEZvckFjdGlvbiB8IHVuZGVmaW5lZCxcblx0c0VudGl0eVNldE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0b0hlYWRlckFjdGlvbjogQmFzZUFjdGlvbiB8IG51bGwsXG5cdHBvc2l0aXZlQWN0aW9uVmlzaWJsZTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBzdHJpbmcsXG5cdHBvc2l0aXZlQWN0aW9uRW5hYmxlZDogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBzdHJpbmcsXG5cdGVkaXRBY3Rpb25WaXNpYmxlOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHN0cmluZyxcblx0ZWRpdEFjdGlvbkVuYWJsZWQ6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgc3RyaW5nXG4pOiBzdHJpbmcge1xuXHRjb25zdCBzQWN0aW9uQ29udGV4dHMgPSBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQ/LkFjdGlvbi50b1N0cmluZygpID8/IFwiXCIpLFxuXHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID1cblx0XHRcdG9EYXRhRmllbGQgJiZcblx0XHRcdG9EYXRhRmllbGQuSW52b2NhdGlvbkdyb3VwaW5nICYmXG5cdFx0XHQob0RhdGFGaWVsZC5JbnZvY2F0aW9uR3JvdXBpbmcgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KVtcIiRFbnVtTWVtYmVyXCJdLFxuXHRcdHNJbnZvY2F0aW9uR3JvdXAgPSBzRGF0YUZpZWxkRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5PcGVyYXRpb25Hcm91cGluZ1R5cGUvQ2hhbmdlU2V0XCIgPyBcIkNoYW5nZVNldFwiIDogXCJJc29sYXRlZFwiO1xuXHRjb25zdCBvUGFyYW1zID0ge1xuXHRcdGNvbnRleHRzOiBcIiR7JHZpZXc+L30uZ2V0QmluZGluZ0NvbnRleHQoKVwiLFxuXHRcdGVudGl0eVNldE5hbWU6IHNFbnRpdHlTZXROYW1lID8gQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzRW50aXR5U2V0TmFtZSkgOiBcIlwiLFxuXHRcdGludm9jYXRpb25Hcm91cGluZzogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzSW52b2NhdGlvbkdyb3VwKSxcblx0XHRtb2RlbDogXCIkeyRzb3VyY2U+L30uZ2V0TW9kZWwoKVwiLFxuXHRcdGxhYmVsOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQ/LkxhYmVsPy50b1N0cmluZygpID8/IFwiXCIsIHRydWUpLFxuXHRcdGlzTmF2aWdhYmxlOiBvSGVhZGVyQWN0aW9uPy5pc05hdmlnYWJsZSxcblx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246IG9IZWFkZXJBY3Rpb24/LmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvblxuXHRcdFx0PyBgJyR7b0hlYWRlckFjdGlvbi5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb259J2Bcblx0XHRcdDogdW5kZWZpbmVkXG5cdH07XG5cdGNvbnN0IG9Db25kaXRpb25zID0ge1xuXHRcdHBvc2l0aXZlQWN0aW9uVmlzaWJsZSxcblx0XHRwb3NpdGl2ZUFjdGlvbkVuYWJsZWQsXG5cdFx0ZWRpdEFjdGlvblZpc2libGUsXG5cdFx0ZWRpdEFjdGlvbkVuYWJsZWRcblx0fTtcblx0cmV0dXJuIENvbW1vbkhlbHBlci5nZW5lcmF0ZUZ1bmN0aW9uKFxuXHRcdFwiLmhhbmRsZXJzLm9uUHJpbWFyeUFjdGlvblwiLFxuXHRcdFwiJGNvbnRyb2xsZXJcIixcblx0XHRcIiR7JHZpZXc+L31cIixcblx0XHRcIiR7JHZpZXc+L30uZ2V0QmluZGluZ0NvbnRleHQoKVwiLFxuXHRcdHNBY3Rpb25Db250ZXh0cyxcblx0XHRDb21tb25IZWxwZXIub2JqZWN0VG9TdHJpbmcob1BhcmFtcyksXG5cdFx0Q29tbW9uSGVscGVyLm9iamVjdFRvU3RyaW5nKG9Db25kaXRpb25zKVxuXHQpO1xufTtcblxuLypcbiAqIEdldHMgdGhlIGJpbmRpbmcgb2YgdGhlIGNvbnRhaW5lciBIQm94IGZvciB0aGUgaGVhZGVyIGZhY2V0LlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtvYmplY3R9IFtvQ29udHJvbENvbmZpZ3VyYXRpb25dIFRoZSBjb250cm9sIGNvbmZpZ3VyYXRpb24gZm9ybSBvZiB0aGUgdmlld0RhdGEgbW9kZWxcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0hlYWRlckZhY2V0XSBUaGUgb2JqZWN0IG9mIHRoZSBoZWFkZXIgZmFjZXRcbiAqIHJldHVybnMgeyp9ICBUaGUgYmluZGluZyBleHByZXNzaW9uIGZyb20gZnVuY3Rpb24gZ2V0QmluZGluZ1dpdGhHcm91cElkRnJvbUNvbmZpZyBvciB1bmRlZmluZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTdGFzaGFibGVIQm94QmluZGluZyA9IGZ1bmN0aW9uIChcblx0b0NvbnRyb2xDb25maWd1cmF0aW9uOiBDb250cm9sQ29uZmlndXJhdGlvbixcblx0b0hlYWRlckZhY2V0OiB7IEZhY2V0OiBGaWVsZEdyb3VwRmFjZXQgfVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKG9IZWFkZXJGYWNldCAmJiBvSGVhZGVyRmFjZXQuRmFjZXQgJiYgb0hlYWRlckZhY2V0LkZhY2V0LnRhcmdldEFubm90YXRpb25UeXBlID09PSBcIkRhdGFQb2ludFwiKSB7XG5cdFx0cmV0dXJuIGdldEJpbmRpbmdXaXRoR3JvdXBJZEZyb21Db25maWcob0NvbnRyb2xDb25maWd1cmF0aW9uLCBvSGVhZGVyRmFjZXQuRmFjZXQudGFyZ2V0QW5ub3RhdGlvblZhbHVlISk7XG5cdH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRIZWFkZXJGb3JtSGJveFJlbmRlclR5cGUgPSBmdW5jdGlvbiAoZGF0YUZpZWxkOiBEYXRhTW9kZWxPYmplY3RQYXRoPERhdGFGaWVsZEFic3RyYWN0VHlwZXM+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKGRhdGFGaWVsZD8udGFyZ2V0T2JqZWN0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0cmV0dXJuIFwiQmFyZVwiO1xufTtcblxuLyoqXG4gKiBUaGUgZGVmYXVsdCBhY3Rpb24gZ3JvdXAgaGFuZGxlciB0aGF0IGlzIGludm9rZWQgd2hlbiBhZGRpbmcgdGhlIG1lbnUgYnV0dG9uIGhhbmRsaW5nIGFwcHJvcHJpYXRlbHkuXG4gKiBAcGFyYW0gb0N0eCBUaGUgY3VycmVudCBjb250ZXh0IGluIHdoaWNoIHRoZSBoYW5kbGVyIGlzIGNhbGxlZFxuICogQHBhcmFtIG9BY3Rpb24gVGhlIGN1cnJlbnQgYWN0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBvRGF0YUZpZWxkRm9yRGVmYXVsdEFjdGlvbiBUaGUgY3VycmVudCBkYXRhRmllbGQgZm9yIHRoZSBkZWZhdWx0IGFjdGlvblxuICogQHBhcmFtIGRlZmF1bHRBY3Rpb25Db250ZXh0T3JFbnRpdHlTZXQgVGhlIGN1cnJlbnQgY29udGV4dCBmb3IgdGhlIGRlZmF1bHQgYWN0aW9uXG4gKiBAcmV0dXJucyBUaGUgYXBwcm9wcmlhdGUgZXhwcmVzc2lvbiBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRBY3Rpb25IYW5kbGVyKFxuXHRvQ3R4OiBDb250ZXh0LFxuXHRvQWN0aW9uOiBDdXN0b21BY3Rpb24sXG5cdG9EYXRhRmllbGRGb3JEZWZhdWx0QWN0aW9uOiBNZXRhTW9kZWxUeXBlPERhdGFGaWVsZERlZmF1bHQ+LFxuXHRkZWZhdWx0QWN0aW9uQ29udGV4dE9yRW50aXR5U2V0OiBzdHJpbmdcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0aWYgKG9BY3Rpb24uZGVmYXVsdEFjdGlvbikge1xuXHRcdGNvbnN0IGRlZmF1bHRBY3Rpb24gPSBvQWN0aW9uLmRlZmF1bHRBY3Rpb24gYXMgQ3VzdG9tQWN0aW9uO1xuXHRcdHRyeSB7XG5cdFx0XHRzd2l0Y2ggKGRlZmF1bHRBY3Rpb24udHlwZSkge1xuXHRcdFx0XHRjYXNlIFwiRm9yQWN0aW9uXCI6IHtcblx0XHRcdFx0XHRyZXR1cm4gZ2V0UHJlc3NFeHByZXNzaW9uRm9yRWRpdChcblx0XHRcdFx0XHRcdG9EYXRhRmllbGRGb3JEZWZhdWx0QWN0aW9uIGFzIE1ldGFNb2RlbFR5cGU8RGF0YUZpZWxkRm9yQWN0aW9uPixcblx0XHRcdFx0XHRcdGRlZmF1bHRBY3Rpb25Db250ZXh0T3JFbnRpdHlTZXQsXG5cdFx0XHRcdFx0XHRvQWN0aW9uLmRlZmF1bHRBY3Rpb24gYXMgQmFzZUFjdGlvblxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2FzZSBcIkZvck5hdmlnYXRpb25cIjoge1xuXHRcdFx0XHRcdGlmIChkZWZhdWx0QWN0aW9uLmNvbW1hbmQpIHtcblx0XHRcdFx0XHRcdHJldHVybiBcImNtZDpcIiArIGRlZmF1bHRBY3Rpb24uY29tbWFuZDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGRlZmF1bHRBY3Rpb24ucHJlc3M7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGRlZmF1bHQ6IHtcblx0XHRcdFx0XHRpZiAoZGVmYXVsdEFjdGlvbi5jb21tYW5kKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJjbWQ6XCIgKyBkZWZhdWx0QWN0aW9uLmNvbW1hbmQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChkZWZhdWx0QWN0aW9uLm5vV3JhcCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGRlZmF1bHRBY3Rpb24ucHJlc3M7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBDb21tb25IZWxwZXIuYnVpbGRBY3Rpb25XcmFwcGVyKGRlZmF1bHRBY3Rpb24sIHsgaWQ6IFwiZm9yVGhlT2JqZWN0UGFnZVwiIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGlvRXgpIHtcblx0XHRcdHJldHVybiBcImJpbmRpbmcgZm9yIHRoZSBkZWZhdWx0IGFjdGlvbiBpcyBub3Qgd29ya2luZyBhcyBleHBlY3RlZFwiO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBzdWIgc2VjdGlvbiB2aXN1YWxpemF0aW9uIGlzIHBhcnQgb2YgcHJldmlldy5cbiAqIEBwYXJhbSBzdWJTZWN0aW9uIFRoZSBzdWIgc2VjdGlvbiB2aXN1YWxpemF0aW9uXG4gKiBAcmV0dXJucyBBIEJvb2xlYW4gdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmlzdWFsaXphdGlvbklzUGFydE9mUHJldmlldyhzdWJTZWN0aW9uOiBEYXRhVmlzdWFsaXphdGlvblN1YlNlY3Rpb24pOiBib29sZWFuIHtcblx0cmV0dXJuIHN1YlNlY3Rpb24uaXNQYXJ0T2ZQcmV2aWV3ID09PSB0cnVlIHx8IHN1YlNlY3Rpb24ucHJlc2VudGF0aW9uLnZpc3VhbGl6YXRpb25zWzBdLnR5cGUgIT09IFwiVGFibGVcIjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBleHByZXNzaW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBmb290ZXIgb2YgdGhlIG9iamVjdCBwYWdlIGlzIHRvIGJlIHZpc2libGUgb3Igbm90LlxuICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoZSBmb3JtYXR0ZXIuXG4gKiBAcGFyYW0gZm9vdGVyQWN0aW9ucyBUaGUgbGlzdCBvZiBmb290ZXIgYWN0aW9ucy5cbiAqIEByZXR1cm5zIEEgYmluZGluZyBleHByZXNzaW9uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRGb290ZXJWaXNpYmlsaXR5RXhwcmVzc2lvbkludGVybmFsID0gZnVuY3Rpb24gKFxuXHRjb250ZXh0OiBJQ29udGV4dCxcblx0Zm9vdGVyQWN0aW9uczogQmFzZUFjdGlvbltdXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldEludGVyZmFjZSgxKS5nZXRNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXG5cdGNvbnN0IF9nZW5lcmF0ZUJpbmRpbmdzRm9yQWN0aW9ucyA9IChhY3Rpb25zOiBCYXNlQWN0aW9uW10pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9PiB7XG5cdFx0aWYgKGFjdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gYWN0aW9ucy5tYXAoXG5cdFx0XHRcdChhY3Rpb24pID0+XG5cdFx0XHRcdFx0YWN0aW9uLnZpc2libGVFeHByZXNzaW9uID8/XG5cdFx0XHRcdFx0KHJlc29sdmVCaW5kaW5nU3RyaW5nKGFjdGlvbi52aXNpYmxlID8/IHRydWUsIFwiYm9vbGVhblwiKSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4pXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gW2NvbnN0YW50KGZhbHNlKV07XG5cdH07XG5cblx0Y29uc3QgZ2V0QWN0aW9uTW9kZWxQYXRoID0gKGFjdGlvbjogQmFzZUFjdGlvbik6IERhdGFNb2RlbE9iamVjdFBhdGg8RGF0YUZpZWxkRm9yQWN0aW9uPiB8IHVuZGVmaW5lZCA9PiB7XG5cdFx0Y29uc3QgYW5ub3RhdGlvblBhdGggPSBhY3Rpb24uYW5ub3RhdGlvblBhdGg7XG5cdFx0aWYgKGFubm90YXRpb25QYXRoKSB7XG5cdFx0XHRjb25zdCBhY3Rpb25Db250ZXh0ID0gbWV0YU1vZGVsLmdldENvbnRleHQoYW5ub3RhdGlvblBhdGgpO1xuXHRcdFx0cmV0dXJuIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0czxEYXRhRmllbGRGb3JBY3Rpb24+KGFjdGlvbkNvbnRleHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9O1xuXG5cdC8vIEFjdGlvbnMgYXJlIGNvbWluZyBmcm9tIHRoZSBjb252ZXJ0ZXIgc28gb25seSBkZXRlcm1pbmluZyBhY3Rpb25zIGFuZCBub3Qgc3RhdGljYWxseSBoaWRkZW4gYXJlIGxpc3RlZFxuXHRjb25zdCBkZXRlcm1pbmluZ0FjdGlvbnMgPSBmb290ZXJBY3Rpb25zLmZpbHRlcigoYWN0aW9uKSA9PiBhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZS5EYXRhRmllbGRGb3JBY3Rpb24pO1xuXHRjb25zdCBtYW5pZmVzdEFjdGlvbkJpbmRpbmdzID0gX2dlbmVyYXRlQmluZGluZ3NGb3JBY3Rpb25zKGZvb3RlckFjdGlvbnMuZmlsdGVyKChhY3Rpb24pID0+IGlzTWFuaWZlc3RBY3Rpb24oYWN0aW9uKSkpO1xuXHRjb25zdCBkZXRlcm1pbmluZ0FjdGlvbkJpbmRpbmdzID0gX2dlbmVyYXRlQmluZGluZ3NGb3JBY3Rpb25zKGRldGVybWluaW5nQWN0aW9ucyk7XG5cblx0Y29uc3QgaXNOb3RIaWRkZW5EZXRlcm1pbmluZ0FjdGlvbiA9ICEhZGV0ZXJtaW5pbmdBY3Rpb25zLmZpbmQoKGFjdGlvbikgPT4ge1xuXHRcdGNvbnN0IGFjdGlvbkNvbnRleHRNb2RlbFBhdGggPSBnZXRBY3Rpb25Nb2RlbFBhdGgoYWN0aW9uKTtcblx0XHRyZXR1cm4gIWFjdGlvbkNvbnRleHRNb2RlbFBhdGg/LnRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW47XG5cdH0pO1xuXG5cdHJldHVybiBvcihcblx0XHRpc05vdEhpZGRlbkRldGVybWluaW5nQWN0aW9uLFxuXHRcdG9yKC4uLm1hbmlmZXN0QWN0aW9uQmluZGluZ3MpLFxuXHRcdGFuZChvcihVSS5Jc0VkaXRhYmxlLCBvciguLi5kZXRlcm1pbmluZ0FjdGlvbkJpbmRpbmdzKSksIG5vdChwYXRoSW5Nb2RlbChcImlzQ3JlYXRlRGlhbG9nT3BlblwiLCBcImludGVybmFsXCIpKSlcblx0KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgZm9vdGVyIG9mIHRoZSBvYmplY3QgcGFnZSBpcyB0byBiZSB2aXNpYmxlIG9yIG5vdC5cbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgZm9ybWF0dGVyLlxuICogQHBhcmFtIGZvb3RlckFjdGlvbnMgVGhlIGxpc3Qgb2YgZm9vdGVyIGFjdGlvbnMuXG4gKiBAcmV0dXJucyBBIGNvbXBpbGVkIGJpbmRpbmcgZXhwcmVzc2lvblxuICovXG5leHBvcnQgY29uc3QgZ2V0Rm9vdGVyVmlzaWJpbGl0eUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoY29udGV4dDogSUNvbnRleHQsIGZvb3RlckFjdGlvbnM6IEJhc2VBY3Rpb25bXSk6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGdldEZvb3RlclZpc2liaWxpdHlFeHByZXNzaW9uSW50ZXJuYWwoY29udGV4dCwgZm9vdGVyQWN0aW9ucykpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIHN1YnNlY3Rpb24gaGVhZGVyIGxldmVsLlxuICogQHBhcmFtIHN1YlNlY3Rpb24gVGhlIHN1YnNlY3Rpb24gdmlzdWFsaXphdGlvblxuICogQHBhcmFtIGlzTW9yZUNvbnRlbnRcbiAqIEByZXR1cm5zIEEgU3RyaW5nIHZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRIZWFkZXJMZXZlbChzdWJTZWN0aW9uOiBEYXRhVmlzdWFsaXphdGlvblN1YlNlY3Rpb24sIGlzTW9yZUNvbnRlbnQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuXHRpZiAoaXNNb3JlQ29udGVudCkge1xuXHRcdGlmICghc3ViU2VjdGlvbi5zaG93U3ViU2VjdGlvblRpdGxlKSB7XG5cdFx0XHQvLyB3aGVuZXZlciB0aXRsZSBpcyBtZXJnZWQgZm9yIHN1Yi1zZWN0aW9uLCBsZXZlbCBzaG91bGQgYmUgSDRcblx0XHRcdHJldHVybiBcIkg0XCI7XG5cdFx0fSBlbHNlIGlmIChzdWJTZWN0aW9uLmxldmVsID09PSAyICYmIHN1YlNlY3Rpb24uZGF0YVZpc3VhbGl6YXRpb25UaXRsZVZpc2libGUgPT09IFwidHJ1ZVwiKSB7XG5cdFx0XHQvLyByZXRhaW4gb2xkIGxvZ2ljXG5cdFx0XHRyZXR1cm4gXCJINlwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gXCJINVwiOyAvLyByZXRhaW4gb2xkIGxvZ2ljXG5cdFx0fVxuXHR9IGVsc2UgaWYgKCFzdWJTZWN0aW9uLnNob3dTdWJTZWN0aW9uVGl0bGUpIHtcblx0XHQvLyB3aGVuZXZlciB0aXRsZSBpcyBtZXJnZWQgZm9yIHNlY3Rpb24sIGxldmVsIHNob3VsZCBiZSBIM1xuXHRcdHJldHVybiBcIkgzXCI7XG5cdH0gZWxzZSBpZiAoc3ViU2VjdGlvbi5sZXZlbCA9PT0gMiAmJiBzdWJTZWN0aW9uLmRhdGFWaXN1YWxpemF0aW9uVGl0bGVWaXNpYmxlID09PSBcInRydWVcIikge1xuXHRcdC8vIHJldGFpbiBvbGQgbG9naWNcblx0XHRyZXR1cm4gXCJINVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBcIkg0XCI7IC8vIHJldGFpbiBvbGQgbG9naWNcblx0fVxufVxuXG4vKipcbiAqIEdldHMgdGhlIGFyaWEtbGFiZWxsZWRieSBhdHRyaWJ1dGUgZm9yIHRoZSBoZWFkZXIgZm9ybWVsZW1lbnQuXG4gKiBAcGFyYW0gaGVhZGVyRm9ybURhdGFcbiAqIEBwYXJhbSBmb3JtRWxlbWVudElkUHJlZml4XG4gKiBAcmV0dXJucyBUaGUgc3RyaW5nIGZvciB0aGUgYXJpYS1sYWJlbGxlZGJ5IGF0dHJpYnV0ZVxuICovXG5leHBvcnQgY29uc3QgZ2V0SGVhZGVyRm9ybUFyaWFMYWJlbGxlZEJ5ID0gZnVuY3Rpb24gKGhlYWRlckZvcm1EYXRhOiBIZWFkZXJGb3JtRGF0YSwgZm9ybUVsZW1lbnRJZFByZWZpeDogc3RyaW5nKTogc3RyaW5nIHtcblx0bGV0IHRpdGxlSWQgPSBcIlwiO1xuXHRpZiAoaGVhZGVyRm9ybURhdGEubGFiZWwpIHtcblx0XHR0aXRsZUlkID0gU3RhYmxlSWRIZWxwZXIuZ2VuZXJhdGUoW2hlYWRlckZvcm1EYXRhLmlkLCBcIlRpdGxlXCJdKTtcblx0fVxuXHRjb25zdCBsYWJlbElkID0gU3RhYmxlSWRIZWxwZXIuZ2VuZXJhdGUoW2Zvcm1FbGVtZW50SWRQcmVmaXgsIFwiTGFiZWxcIl0pO1xuXHRyZXR1cm4gdGl0bGVJZCA/IGAke3RpdGxlSWR9LCR7bGFiZWxJZH1gIDogbGFiZWxJZDtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgYXJpYSB0ZXh0IGZvciBmb3JtIHJlZ2lvbnMgb24gT2JqZWN0IFBhZ2UuXG4gKiBAcGFyYW0gc3ViU2VjdGlvblRpdGxlIFRoZSB0aXRsZSBvZiB0aGUgc3Vic2VjdGlvblxuICogQHJldHVybnMgVGhlIGFyaWEgdGV4dCBmb3IgdGhlIGZvcm0gcmVnaW9uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRGb3JtQXJpYVRleHQgPSBmdW5jdGlvbiAoc3ViU2VjdGlvblRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cdHJldHVybiBzdWJTZWN0aW9uVGl0bGUgIT09IHVuZGVmaW5lZCA/IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0ZPUk1fQVJJQV9URVhUXCIsIFtzdWJTZWN0aW9uVGl0bGVdKSA6IHVuZGVmaW5lZDtcbn07XG5cbmdldEZvb3RlclZpc2liaWxpdHlFeHByZXNzaW9uLnJlcXVpcmVzSUNvbnRleHQgPSB0cnVlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXlEQSxNQUFNQSxVQUFVLEdBQUdDLFFBQVEsQ0FBQ0QsVUFBVTtFQUUvQixNQUFNRSxxQkFBcUIsR0FBRyxTQUFBQSxDQUNwQ0MsZUFBMkQsRUFDM0RDLFFBQWtCLEVBQ2xCQyxVQUEyQixFQUNRO0lBQ25DLE9BQU9DLHlCQUF5QixDQUMvQkgsZUFBZSxFQUNmSSx3QkFBd0IsRUFDeEJDLFNBQVMsRUFDVEgsVUFBVSxFQUNWRCxRQUNELENBQUM7RUFDRixDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTkFLLFFBQUEsQ0FBQVAscUJBQUEsR0FBQUEscUJBQUE7RUFPTyxNQUFNUSwyQkFBMkIsR0FBRyxTQUFBQSxDQUMxQ1AsZUFBK0MsRUFDL0NRLFdBQTRCLEVBQ087SUFDbkMsSUFBSUMsa0JBQWtCLEdBQUdDLDJCQUEyQixDQUFFRixXQUFXLEVBQUVHLFdBQVcsRUFBcUJDLEtBQUssQ0FBQztJQUN6RyxJQUFLSixXQUFXLEVBQUVHLFdBQVcsRUFBcUJDLEtBQUssRUFBRUMsT0FBTyxFQUFFQyxXQUFXLEVBQUVDLE1BQU0sRUFBRUMsSUFBSSxFQUFFRixXQUFXLEVBQUVHLEVBQUUsRUFBRUMsZUFBZSxFQUFFO01BQzlIO01BQ0FULGtCQUFrQixHQUFHVSxxQ0FBcUMsQ0FBQ1Ysa0JBQWtCLEVBQUVULGVBQWUsQ0FBQztJQUNoRztJQUNBLE1BQU1vQixXQUFXLEdBQUdDLGlCQUFpQixDQUFDQyxzQkFBc0IsQ0FBQ2Isa0JBQWtCLEVBQUVULGVBQWUsQ0FB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
@@ -152,23 +152,31 @@ export const isManifestAction = function (action: BaseAction | CustomAction): ac
152
152
  * @param dataContextPath The DataModelObjectPath related to the context
153
153
  * @returns A compiled expression that evaluates to the button type to use
154
154
  */
155
- export const buildEmphasizedButtonExpression = function (
155
+ export const buildCriticalityVisibleFromIdentificationExpression = function (
156
156
  dataContextPath: DataModelObjectPath<EntitySet | NavigationProperty | Singleton>
157
- ): CompiledBindingToolkitExpression {
157
+ ): BindingToolkitExpression<boolean> {
158
158
  const identification = dataContextPath.targetEntityType?.annotations?.UI?.Identification;
159
159
  const dataFieldsWithCriticality =
160
160
  identification?.filter((dataField) => dataField.$Type === UIAnnotationTypes.DataFieldForAction && dataField.Criticality) || [];
161
161
 
162
- const criticalActionsVisibleExpressions = dataFieldsWithCriticality.length
163
- ? dataFieldsWithCriticality.map((dataField) => {
164
- // Criticality suppresses emphasis if the action itself is visible (Hidden is false)
165
- return not(equal(getExpressionFromAnnotation(dataField.annotations?.UI?.Hidden), true));
166
- })
167
- : ([constant(false)] as BindingToolkitExpression<boolean>[]);
162
+ if (!dataFieldsWithCriticality.length) {
163
+ return constant(false);
164
+ }
165
+ return or(
166
+ ...dataFieldsWithCriticality.map((dataField) =>
167
+ // Criticality suppresses emphasis if the action itself is visible (Hidden is false)
168
+ not(equal(getExpressionFromAnnotation(dataField.annotations?.UI?.Hidden), true))
169
+ )
170
+ );
171
+ };
168
172
 
173
+ export const buildEmphasizedButtonExpression = function (
174
+ dataContextPath: DataModelObjectPath<EntitySet | NavigationProperty | Singleton>
175
+ ): CompiledBindingToolkitExpression {
176
+ const criticalityVisibleExpr = buildCriticalityVisibleFromIdentificationExpression(dataContextPath);
169
177
  // If there is at least one visible action with criticality, the template's default primary action is set back to Ghost
170
178
  // else it is emphasized
171
- return compileExpression(ifElse(or(...criticalActionsVisibleExpressions), ButtonType.Ghost, ButtonType.Emphasized));
179
+ return compileExpression(ifElse(criticalityVisibleExpr, ButtonType.Ghost, ButtonType.Emphasized));
172
180
  };
173
181
 
174
182
  export const getElementBinding = function (sPath: string): string {