UNPKG

awscdk-resources-mongodbatlas

Version:

MongoDB Atlas CDK Construct Library for AWS CloudFormation Resources

351 lines 58.3 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.CfnAlertConfiguration = exports.IntegerThresholdViewOperator = exports.NotificationViewTypeName = exports.NotificationViewSeverity = exports.NotificationViewRoles = exports.NotificationViewOpsGenieRegion = exports.NotificationViewDatadogRegion = exports.MetricThresholdViewOperator = exports.MetricThresholdViewMode = exports.MatcherOperator = exports.MatcherFieldName = void 0; exports.toJson_CfnAlertConfigurationProps = toJson_CfnAlertConfigurationProps; exports.toJson_Matcher = toJson_Matcher; exports.toJson_MetricThresholdView = toJson_MetricThresholdView; exports.toJson_NotificationView = toJson_NotificationView; exports.toJson_IntegerThresholdView = toJson_IntegerThresholdView; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); // Generated by cdk-import const cdk = require("aws-cdk-lib"); /** * Converts an object of type 'CfnAlertConfigurationProps' to JSON representation. */ /* eslint-disable max-len, quote-props */ function toJson_CfnAlertConfigurationProps(obj) { if (obj === undefined) { return undefined; } const result = { Profile: obj.profile, EventTypeName: obj.eventTypeName, ProjectId: obj.projectId, Matchers: obj.matchers?.map((y) => toJson_Matcher(y)), MetricThreshold: toJson_MetricThresholdView(obj.metricThreshold), Notifications: obj.notifications?.map((y) => toJson_NotificationView(y)), Threshold: toJson_IntegerThresholdView(obj.threshold), TypeName: obj.typeName, SeverityOverride: obj.severityOverride, }; // filter undefined values return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {}); } /** * Converts an object of type 'Matcher' to JSON representation. */ /* eslint-disable max-len, quote-props */ function toJson_Matcher(obj) { if (obj === undefined) { return undefined; } const result = { FieldName: obj.fieldName, Operator: obj.operator, Value: obj.value, }; // filter undefined values return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {}); } /** * Converts an object of type 'MetricThresholdView' to JSON representation. */ /* eslint-disable max-len, quote-props */ function toJson_MetricThresholdView(obj) { if (obj === undefined) { return undefined; } const result = { MetricName: obj.metricName, Mode: obj.mode, Operator: obj.operator, Threshold: obj.threshold, Units: obj.units, }; // filter undefined values return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {}); } /** * Converts an object of type 'NotificationView' to JSON representation. */ /* eslint-disable max-len, quote-props */ function toJson_NotificationView(obj) { if (obj === undefined) { return undefined; } const result = { ApiToken: obj.apiToken, ChannelName: obj.channelName, DatadogApiKey: obj.datadogApiKey, DatadogRegion: obj.datadogRegion, DelayMin: obj.delayMin, EmailAddress: obj.emailAddress, EmailEnabled: obj.emailEnabled, IntervalMin: obj.intervalMin, MicrosoftTeamsWebhookUrl: obj.microsoftTeamsWebhookUrl, MobileNumber: obj.mobileNumber, NotificationToken: obj.notificationToken, OpsGenieApiKey: obj.opsGenieApiKey, OpsGenieRegion: obj.opsGenieRegion, OrgName: obj.orgName, Roles: obj.roles?.map((y) => y), RoomName: obj.roomName, ServiceKey: obj.serviceKey, Severity: obj.severity, SmsEnabled: obj.smsEnabled, TeamId: obj.teamId, TeamName: obj.teamName, TypeName: obj.typeName, Username: obj.username, VictorOpsApiKey: obj.victorOpsApiKey, VictorOpsRoutingKey: obj.victorOpsRoutingKey, WebhookSecret: obj.webhookSecret, WebhookUrl: obj.webhookUrl, NotifierId: obj.notifierId, IntegrationId: obj.integrationId, }; // filter undefined values return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {}); } /** * Converts an object of type 'IntegerThresholdView' to JSON representation. */ /* eslint-disable max-len, quote-props */ function toJson_IntegerThresholdView(obj) { if (obj === undefined) { return undefined; } const result = { MetricName: obj.metricName, Mode: obj.mode, Operator: obj.operator, Threshold: obj.threshold, Units: obj.units, }; // filter undefined values return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {}); } /* eslint-enable max-len, quote-props */ /** * Name of the parameter in the target object that MongoDB Cloud checks. The parameter must match all rules for MongoDB Cloud to check for alert configurations. * * @schema MatcherFieldName */ var MatcherFieldName; (function (MatcherFieldName) { /** CLUSTER_NAME */ MatcherFieldName["CLUSTER_NAME"] = "CLUSTER_NAME"; /** HOSTNAME */ MatcherFieldName["HOSTNAME"] = "HOSTNAME"; /** HOSTNAME_AND_PORT */ MatcherFieldName["HOSTNAME_AND_PORT"] = "HOSTNAME_AND_PORT"; /** PORT */ MatcherFieldName["PORT"] = "PORT"; /** REPLICA_SET_NAME */ MatcherFieldName["REPLICA_SET_NAME"] = "REPLICA_SET_NAME"; /** SHARD_NAME */ MatcherFieldName["SHARD_NAME"] = "SHARD_NAME"; /** TYPE_NAME */ MatcherFieldName["TYPE_NAME"] = "TYPE_NAME"; /** APPLICATION_ID */ MatcherFieldName["APPLICATION_ID"] = "APPLICATION_ID"; /** INSTANCE_NAME */ MatcherFieldName["INSTANCE_NAME"] = "INSTANCE_NAME"; /** PROCESSOR_NAME */ MatcherFieldName["PROCESSOR_NAME"] = "PROCESSOR_NAME"; })(MatcherFieldName || (exports.MatcherFieldName = MatcherFieldName = {})); /** * Comparison operator to apply when checking the current metric value against **matcher[n].value**. * * @schema MatcherOperator */ var MatcherOperator; (function (MatcherOperator) { /** EQUALS */ MatcherOperator["EQUALS"] = "EQUALS"; /** CONTAINS */ MatcherOperator["CONTAINS"] = "CONTAINS"; /** STARTS_WITH */ MatcherOperator["STARTS_WITH"] = "STARTS_WITH"; /** ENDS_WITH */ MatcherOperator["ENDS_WITH"] = "ENDS_WITH"; /** NOT_EQUALS */ MatcherOperator["NOT_EQUALS"] = "NOT_EQUALS"; /** NOT_CONTAINS */ MatcherOperator["NOT_CONTAINS"] = "NOT_CONTAINS"; /** REGEX */ MatcherOperator["REGEX"] = "REGEX"; })(MatcherOperator || (exports.MatcherOperator = MatcherOperator = {})); /** * MongoDB Cloud computes the current metric value as an average. * * @schema MetricThresholdViewMode */ var MetricThresholdViewMode; (function (MetricThresholdViewMode) { /** AVERAGE */ MetricThresholdViewMode["AVERAGE"] = "AVERAGE"; })(MetricThresholdViewMode || (exports.MetricThresholdViewMode = MetricThresholdViewMode = {})); /** * Comparison operator to apply when checking the current metric value. * * @schema MetricThresholdViewOperator */ var MetricThresholdViewOperator; (function (MetricThresholdViewOperator) { /** GREATER_THAN */ MetricThresholdViewOperator["GREATER_THAN"] = "GREATER_THAN"; /** LESS_THAN */ MetricThresholdViewOperator["LESS_THAN"] = "LESS_THAN"; })(MetricThresholdViewOperator || (exports.MetricThresholdViewOperator = MetricThresholdViewOperator = {})); /** * Datadog region that indicates which API Uniform Resource Locator (URL) to use. The resource requires this parameter when '"notifications.typeName" : "DATADOG"'. * * @schema NotificationViewDatadogRegion */ var NotificationViewDatadogRegion; (function (NotificationViewDatadogRegion) { /** EU */ NotificationViewDatadogRegion["EU"] = "EU"; /** US */ NotificationViewDatadogRegion["US"] = "US"; })(NotificationViewDatadogRegion || (exports.NotificationViewDatadogRegion = NotificationViewDatadogRegion = {})); /** * Opsgenie region that indicates which API Uniform Resource Locator (URL) to use. * * @schema NotificationViewOpsGenieRegion */ var NotificationViewOpsGenieRegion; (function (NotificationViewOpsGenieRegion) { /** EU */ NotificationViewOpsGenieRegion["EU"] = "EU"; /** US */ NotificationViewOpsGenieRegion["US"] = "US"; })(NotificationViewOpsGenieRegion || (exports.NotificationViewOpsGenieRegion = NotificationViewOpsGenieRegion = {})); /** * @schema NotificationViewRoles */ var NotificationViewRoles; (function (NotificationViewRoles) { /** GROUP_CLUSTER_MANAGER */ NotificationViewRoles["GROUP_CLUSTER_MANAGER"] = "GROUP_CLUSTER_MANAGER"; /** GROUP_DATA_ACCESS_ADMIN */ NotificationViewRoles["GROUP_DATA_ACCESS_ADMIN"] = "GROUP_DATA_ACCESS_ADMIN"; /** GROUP_DATA_ACCESS_READ_ONLY */ NotificationViewRoles["GROUP_DATA_ACCESS_READ_ONLY"] = "GROUP_DATA_ACCESS_READ_ONLY"; /** GROUP_DATA_ACCESS_READ_WRITE */ NotificationViewRoles["GROUP_DATA_ACCESS_READ_WRITE"] = "GROUP_DATA_ACCESS_READ_WRITE"; /** GROUP_OWNER */ NotificationViewRoles["GROUP_OWNER"] = "GROUP_OWNER"; /** GROUP_READ_WRITE */ NotificationViewRoles["GROUP_READ_WRITE"] = "GROUP_READ_WRITE"; /** ORG_OWNER */ NotificationViewRoles["ORG_OWNER"] = "ORG_OWNER"; /** ORG_MEMBER */ NotificationViewRoles["ORG_MEMBER"] = "ORG_MEMBER"; /** ORG_GROUP_CREATOR */ NotificationViewRoles["ORG_GROUP_CREATOR"] = "ORG_GROUP_CREATOR"; /** ORG_BILLING_ADMIN */ NotificationViewRoles["ORG_BILLING_ADMIN"] = "ORG_BILLING_ADMIN"; /** ORG_READ_ONLY */ NotificationViewRoles["ORG_READ_ONLY"] = "ORG_READ_ONLY"; })(NotificationViewRoles || (exports.NotificationViewRoles = NotificationViewRoles = {})); /** * Degree of seriousness given to this notification. * * @schema NotificationViewSeverity */ var NotificationViewSeverity; (function (NotificationViewSeverity) { /** CRITICAL */ NotificationViewSeverity["CRITICAL"] = "CRITICAL"; /** ERROR */ NotificationViewSeverity["ERROR"] = "ERROR"; /** WARNING */ NotificationViewSeverity["WARNING"] = "WARNING"; })(NotificationViewSeverity || (exports.NotificationViewSeverity = NotificationViewSeverity = {})); /** * Human-readable label that displays the alert notification type. * * @schema NotificationViewTypeName */ var NotificationViewTypeName; (function (NotificationViewTypeName) { /** DATADOG */ NotificationViewTypeName["DATADOG"] = "DATADOG"; /** EMAIL */ NotificationViewTypeName["EMAIL"] = "EMAIL"; /** FLOWDOCK */ NotificationViewTypeName["FLOWDOCK"] = "FLOWDOCK"; /** GROUP */ NotificationViewTypeName["GROUP"] = "GROUP"; /** MICROSOFT_TEAMS */ NotificationViewTypeName["MICROSOFT_TEAMS"] = "MICROSOFT_TEAMS"; /** OPS_GENIE */ NotificationViewTypeName["OPS_GENIE"] = "OPS_GENIE"; /** ORG */ NotificationViewTypeName["ORG"] = "ORG"; /** PAGER_DUTY */ NotificationViewTypeName["PAGER_DUTY"] = "PAGER_DUTY"; /** PROMETHEUS */ NotificationViewTypeName["PROMETHEUS"] = "PROMETHEUS"; /** SLACK */ NotificationViewTypeName["SLACK"] = "SLACK"; /** SMS */ NotificationViewTypeName["SMS"] = "SMS"; /** TEAM */ NotificationViewTypeName["TEAM"] = "TEAM"; /** USER */ NotificationViewTypeName["USER"] = "USER"; /** VICTOR_OPS */ NotificationViewTypeName["VICTOR_OPS"] = "VICTOR_OPS"; /** WEBHOOK */ NotificationViewTypeName["WEBHOOK"] = "WEBHOOK"; })(NotificationViewTypeName || (exports.NotificationViewTypeName = NotificationViewTypeName = {})); /** * Comparison operator to apply when checking the current metric value. * * @schema IntegerThresholdViewOperator */ var IntegerThresholdViewOperator; (function (IntegerThresholdViewOperator) { /** GREATER_THAN */ IntegerThresholdViewOperator["GREATER_THAN"] = "GREATER_THAN"; /** LESS_THAN */ IntegerThresholdViewOperator["LESS_THAN"] = "LESS_THAN"; })(IntegerThresholdViewOperator || (exports.IntegerThresholdViewOperator = IntegerThresholdViewOperator = {})); /** * A CloudFormation `MongoDB::Atlas::AlertConfiguration` * * @cloudformationResource MongoDB::Atlas::AlertConfiguration * @stability external */ class CfnAlertConfiguration extends cdk.CfnResource { /** * Create a new `MongoDB::Atlas::AlertConfiguration`. * * @param scope - scope in which this resource is defined * @param id - scoped id of the resource * @param props - resource properties */ constructor(scope, id, props) { super(scope, id, { type: CfnAlertConfiguration.CFN_RESOURCE_TYPE_NAME, properties: toJson_CfnAlertConfigurationProps(props), }); this.props = props; this.attrId = cdk.Token.asString(this.getAtt("Id")); this.attrEnabled = this.getAtt("Enabled"); this.attrUpdated = cdk.Token.asString(this.getAtt("Updated")); this.attrCreated = cdk.Token.asString(this.getAtt("Created")); } } exports.CfnAlertConfiguration = CfnAlertConfiguration; _a = JSII_RTTI_SYMBOL_1; CfnAlertConfiguration[_a] = { fqn: "awscdk-resources-mongodbatlas.CfnAlertConfiguration", version: "4.0.0" }; /** * The CloudFormation resource type name for this resource class. */ CfnAlertConfiguration.CFN_RESOURCE_TYPE_NAME = "MongoDB::Atlas::AlertConfiguration"; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbDEtcmVzb3VyY2VzL2FsZXJ0LWNvbmZpZ3VyYXRpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQThFQSw4RUFzQkM7QUFpQ0Qsd0NBZ0JDO0FBK0NELGdFQWtCQztBQXdPRCwwREEwQ0M7QUErQ0Qsa0VBa0JDOztBQXppQkQsMEJBQTBCO0FBQzFCLG1DQUFtQztBQXlFbkM7O0dBRUc7QUFDSCx5Q0FBeUM7QUFDekMsU0FBZ0IsaUNBQWlDLENBQy9DLEdBQTJDO0lBRTNDLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRztRQUNiLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTztRQUNwQixhQUFhLEVBQUUsR0FBRyxDQUFDLGFBQWE7UUFDaEMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTO1FBQ3hCLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JELGVBQWUsRUFBRSwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDO1FBQ2hFLGFBQWEsRUFBRSxHQUFHLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEUsU0FBUyxFQUFFLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7UUFDckQsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1FBQ3RCLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxnQkFBZ0I7S0FDdkMsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFB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MUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQzs7QUFwREgsc0RBcURDOzs7QUFwREM7O0dBRUc7QUFDb0IsNENBQXNCLEdBQzNDLG9DQUFvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR2VuZXJhdGVkIGJ5IGNkay1pbXBvcnRcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGFuZCBlZGl0cyB0aGUgY29uZGl0aW9ucyB0aGF0IHRyaWdnZXIgYWxlcnRzIGFuZCBob3cgTW9uZ29EQiBDbG91ZCBub3RpZmllcyB1c2Vycy4gVGhpcyBjb2xsZWN0aW9uIHJlbWFpbnMgdW5kZXIgcmV2aXNpb24gYW5kIG1heSBjaGFuZ2UuIFJlZmVyIHRvIHRoZSBsZWdhY3kgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjb2xsZWN0aW9uIGluIHRoZSBmb2xsb3dpbmcgbGluay5cbiAqXG4gKiBAc2NoZW1hIENmbkFsZXJ0Q29uZmlndXJhdGlvblByb3BzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2ZuQWxlcnRDb25maWd1cmF0aW9uUHJvcHMge1xuICAvKipcbiAgICogUHJvZmlsZSB1c2VkIHRvIHByb3ZpZGUgY3JlZGVudGlhbHMgaW5mb3JtYXRpb24sIChhIHNlY3JldCB3aXRoIHRoZSBjZm4vYXRsYXMvcHJvZmlsZS97UHJvZmlsZX0sIGlzIHJlcXVpcmVkKSwgaWYgbm90IHByb3ZpZGVkIGRlZmF1bHQgaXMgdXNlZFxuICAgKlxuICAgKiBAc2NoZW1hIENmbkFsZXJ0Q29uZmlndXJhdGlvblByb3BzI1Byb2ZpbGVcbiAgICovXG4gIHJlYWRvbmx5IHByb2ZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEV2ZW50IHR5cGUgdGhhdCB0cmlnZ2VycyBhbiBhbGVydC5cbiAgICpcbiAgICogQHNjaGVtYSBDZm5BbGVydENvbmZpZ3VyYXRpb25Qcm9wcyNFdmVudFR5cGVOYW1lXG4gICAqL1xuICByZWFkb25seSBldmVudFR5cGVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVbmlxdWUgMjQtaGV4YWRlY2ltYWwgZGlnaXQgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB5b3VyIHByb2plY3QuXG4gICAqXG4gICAqIEBzY2hlbWEgQ2ZuQWxlcnRDb25maWd1cmF0aW9uUHJvcHMjUHJvamVjdElkXG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0SWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgcnVsZXMgdGhhdCBkZXRlcm1pbmUgd2hldGhlciBNb25nb0RCIENsb3VkIGNoZWNrcyBhbiBvYmplY3QgZm9yIHRoZSBhbGVydCBjb25maWd1cmF0aW9uLiBZb3UgY2FuIGZpbHRlciB1c2luZyB0aGUgbWF0Y2hlcnMgYXJyYXkgaWYgdGhlICoqZXZlbnRUeXBlTmFtZSoqIHNwZWNpZmllcyBhbiBldmVudCBmb3IgYSBob3N0LCByZXBsaWNhIHNldCwgb3Igc2hhcmRlZCBjbHVzdGVyLlxuICAgKlxuICAgKiBAc2NoZW1hIENmbkFsZXJ0Q29uZmlndXJhdGlvblByb3BzI01hdGNoZXJzXG4gICAqL1xuICByZWFkb25seSBtYXRjaGVycz86IE1hdGNoZXJbXTtcblxuICAvKipcbiAgICogVGhyZXNob2xkIGZvciB0aGUgbWV0cmljIHRoYXQsIHdoZW4gZXhjZWVkZWQsIHRyaWdnZXJzIGFuIGFsZXJ0LiBUaGUgcmVzb3VyY2UgcmV0dXJucyB0aGlzIHBhcmFtZXRlciB3aGVuICdcImV2ZW50VHlwZU5hbWVcIiA6IFwiT1VUU0lERV9NRVRSSUNfVEhSRVNIT0xEXCInLlxuICAgKlxuICAgKiBAc2NoZW1hIENmbkFsZXJ0Q29uZmlndXJhdGlvblByb3BzI01ldHJpY1RocmVzaG9sZFxuICAgKi9cbiAgcmVhZG9ubHkgbWV0cmljVGhyZXNob2xkPzogTWV0cmljVGhyZXNob2xkVmlldztcblxuICAvKipcbiAgICogTGlzdCB0aGF0IGNvbnRhaW5zIHRoZSB0YXJnZXRzIHRoYXQgTW9uZ29EQiBDbG91ZCBzZW5kcyBub3RpZmljYXRpb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIENmbkFsZXJ0Q29uZmlndXJhdGlvblByb3BzI05vdGlmaWNhdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IG5vdGlmaWNhdGlvbnM/OiBOb3RpZmljYXRpb25WaWV3W107XG5cbiAgLyoqXG4gICAqIExpbWl0IHRoYXQgdHJpZ2dlcnMgYW4gYWxlcnQgd2hlbiBleGNlZWRlZC4gVGhlIHJlc291cmNlIHJldHVybnMgdGhpcyBwYXJhbWV0ZXIgd2hlbiAqKmV2ZW50VHlwZU5hbWUqKiBoYXMgbm90IGJlZW4gc2V0IHRvICdPVVRTSURFX01FVFJJQ19USFJFU0hPTEQnLlxuICAgKlxuICAgKiBAc2NoZW1hIENmbkFsZXJ0Q29uZmlndXJhdGlvblByb3BzI1RocmVzaG9sZFxuICAgKi9cbiAgcmVhZG9ubHkgdGhyZXNob2xkPzogSW50ZWdlclRocmVzaG9sZFZpZXc7XG5cbiAgLyoqXG4gICAqIEh1bWFuLXJlYWRhYmxlIGxhYmVsIHRoYXQgZGlzcGxheXMgdGhlIGFsZXJ0IHR5cGUuXG4gICAqXG4gICAqIEBzY2hlbWEgQ2ZuQWxlcnRDb25maWd1cmF0aW9uUHJvcHMjVHlwZU5hbWVcbiAgICovXG4gIHJlYWRvbmx5IHR5cGVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZWdyZWUgb2Ygc2VyaW91c25lc3MgZ2l2ZW4gdG8gdGhpcyBhbGVydC4gVGhpcyB2YWx1ZSBvdmVycmlkZXMgdGhlIGRlZmF1bHQgc2V2ZXJpdHkgbGV2ZWwgZm9yIHRoZSBhbGVydC5cbiAgICpcbiAgICogQHNjaGVtYSBDZm5BbGVydENvbmZpZ3VyYXRpb25Qcm9wcyNTZXZlcml0eU92ZXJyaWRlXG4gICAqL1xuICByZWFkb25seSBzZXZlcml0eU92ZXJyaWRlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdDZm5BbGVydENvbmZpZ3VyYXRpb25Qcm9wcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQ2ZuQWxlcnRDb25maWd1cmF0aW9uUHJvcHMoXG4gIG9iajogQ2ZuQWxlcnRDb25maWd1cmF0aW9uUHJvcHMgfCB1bmRlZmluZWRcbik6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBQcm9maWxlOiBvYmoucHJvZmlsZSxcbiAgICBFdmVudFR5cGVOYW1lOiBvYmouZXZlbnRUeXBlTmFtZSxcbiAgICBQcm9qZWN0SWQ6IG9iai5wcm9qZWN0SWQsXG4gICAgTWF0Y2hlcnM6IG9iai5tYXRjaGVycz8ubWFwKCh5KSA9PiB0b0pzb25fTWF0Y2hlcih5KSksXG4gICAgTWV0cmljVGhyZXNob2xkOiB0b0pzb25fTWV0cmljVGhyZXNob2xkVmlldyhvYmoubWV0cmljVGhyZXNob2xkKSxcbiAgICBOb3RpZmljYXRpb25zOiBvYmoubm90aWZpY2F0aW9ucz8ubWFwKCh5KSA9PiB0b0pzb25fTm90aWZpY2F0aW9uVmlldyh5KSksXG4gICAgVGhyZXNob2xkOiB0b0pzb25fSW50ZWdlclRocmVzaG9sZFZpZXcob2JqLnRocmVzaG9sZCksXG4gICAgVHlwZU5hbWU6IG9iai50eXBlTmFtZSxcbiAgICBTZXZlcml0eU92ZXJyaWRlOiBvYmouc2V2ZXJpdHlPdmVycmlkZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKFxuICAgIChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkID8gciA6IHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLFxuICAgIHt9XG4gICk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBNYXRjaGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWF0Y2hlciB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBwYXJhbWV0ZXIgaW4gdGhlIHRhcmdldCBvYmplY3QgdGhhdCBNb25nb0RCIENsb3VkIGNoZWNrcy4gVGhlIHBhcmFtZXRlciBtdXN0IG1hdGNoIGFsbCBydWxlcyBmb3IgTW9uZ29EQiBDbG91ZCB0byBjaGVjayBmb3IgYWxlcnQgY29uZmlndXJhdGlvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgTWF0Y2hlciNGaWVsZE5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGZpZWxkTmFtZT86IE1hdGNoZXJGaWVsZE5hbWU7XG5cbiAgLyoqXG4gICAqIENvbXBhcmlzb24gb3BlcmF0b3IgdG8gYXBwbHkgd2hlbiBjaGVja2luZyB0aGUgY3VycmVudCBtZXRyaWMgdmFsdWUgYWdhaW5zdCAqKm1hdGNoZXJbbl0udmFsdWUqKi5cbiAgICpcbiAgICogQHNjaGVtYSBNYXRjaGVyI09wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcj86IE1hdGNoZXJPcGVyYXRvcjtcblxuICAvKipcbiAgICogVmFsdWUgdG8gbWF0Y2ggb3IgZXhjZWVkIHVzaW5nIHRoZSBzcGVjaWZpZWQgKiptYXRjaGVycy5vcGVyYXRvcioqLlxuICAgKlxuICAgKiBAc2NoZW1hIE1hdGNoZXIjVmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdNYXRjaGVyJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9NYXRjaGVyKFxuICBvYmo6IE1hdGNoZXIgfCB1bmRlZmluZWRcbik6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBGaWVsZE5hbWU6IG9iai5maWVsZE5hbWUsXG4gICAgT3BlcmF0b3I6IG9iai5vcGVyYXRvcixcbiAgICBWYWx1ZTogb2JqLnZhbHVlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoXG4gICAgKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQgPyByIDogeyAuLi5yLCBbaVswXV06IGlbMV0gfSksXG4gICAge31cbiAgKTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIE1ldHJpY1RocmVzaG9sZFZpZXdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRyaWNUaHJlc2hvbGRWaWV3IHtcbiAgLyoqXG4gICAqIEh1bWFuLXJlYWRhYmxlIGxhYmVsIHRoYXQgaWRlbnRpZmllcyB0aGUgbWV0cmljIGFnYWluc3Qgd2hpY2ggTW9uZ29EQiBDbG91ZCBjaGVja3MgdGhlIGNvbmZpZ3VyZWQgKiptZXRyaWNUaHJlc2hvbGQudGhyZXNob2xkKiouXG4gICAqXG4gICAqIEBzY2hlbWEgTWV0cmljVGhyZXNob2xkVmlldyNNZXRyaWNOYW1lXG4gICAqL1xuICByZWFkb25seSBtZXRyaWNOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNb25nb0RCIENsb3VkIGNvbXB1dGVzIHRoZSBjdXJyZW50IG1ldHJpYyB2YWx1ZSBhcyBhbiBhdmVyYWdlLlxuICAgKlxuICAgKiBAc2NoZW1hIE1ldHJpY1RocmVzaG9sZFZpZXcjTW9kZVxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZT86IE1ldHJpY1RocmVzaG9sZFZpZXdNb2RlO1xuXG4gIC8qKlxuICAgKiBDb21wYXJpc29uIG9wZXJhdG9yIHRvIGFwcGx5IHdoZW4gY2hlY2tpbmcgdGhlIGN1cnJlbnQgbWV0cmljIHZhbHVlLlxuICAgKlxuICAgKiBAc2NoZW1hIE1ldHJpY1RocmVzaG9sZFZpZXcjT3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yPzogTWV0cmljVGhyZXNob2xkVmlld09wZXJhdG9yO1xuXG4gIC8qKlxuICAgKiBWYWx1ZSBvZiBtZXRyaWMgdGhhdCwgd2hlbiBleGNlZWRlZCwgdHJpZ2dlcnMgYW4gYWxlcnQuXG4gICAqXG4gICAqIEBzY2hlbWEgTWV0cmljVGhyZXNob2xkVmlldyNUaHJlc2hvbGRcbiAgICovXG4gIHJlYWRvbmx5IHRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICogRWxlbWVudCB1c2VkIHRvIGV4cHJlc3MgdGhlIHF1YW50aXR5LiBUaGlzIGNhbiBiZSBhbiBlbGVtZW50IG9mIHRpbWUsIHN0b3JhZ2UgY2FwYWNpdHksIGFuZCB0aGUgbGlrZS5cbiAgICpcbiAgICogQHNjaGVtYSBNZXRyaWNUaHJlc2hvbGRWaWV3I1VuaXRzXG4gICAqL1xuICByZWFkb25seSB1bml0cz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnTWV0cmljVGhyZXNob2xkVmlldycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fTWV0cmljVGhyZXNob2xkVmlldyhcbiAgb2JqOiBNZXRyaWNUaHJlc2hvbGRWaWV3IHwgdW5kZWZpbmVkXG4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgTWV0cmljTmFtZTogb2JqLm1ldHJpY05hbWUsXG4gICAgTW9kZTogb2JqLm1vZGUsXG4gICAgT3BlcmF0b3I6IG9iai5vcGVyYXRvcixcbiAgICBUaHJlc2hvbGQ6IG9iai50aHJlc2hvbGQsXG4gICAgVW5pdHM6IG9iai51bml0cyxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKFxuICAgIChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkID8gciA6IHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLFxuICAgIHt9XG4gICk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIHF1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBOb3RpZmljYXRpb25WaWV3XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uVmlldyB7XG4gIC8qKlxuICAgKiBTbGFjayBBUEkgdG9rZW4gb3IgQm90IHRva2VuIHRoYXQgTW9uZ29EQiBDbG91ZCBuZWVkcyB0byBzZW5kIGFsZXJ0IG5vdGlmaWNhdGlvbnMgdmlhIFNsYWNrLiBUaGUgcmVzb3VyY2UgcmVxdWlyZXMgdGhpcyBwYXJhbWV0ZXIgd2hlbiAnXCJub3RpZmljYXRpb25zLnR5cGVOYW1lXCIgOiBcIlNMQUNLXCInLiBJZiB0aGUgdG9rZW4gbGF0ZXIgYmVjb21lcyBpbnZhbGlkLCBNb25nb0RCIENsb3VkIHNlbmRzIGFuIGVtYWlsIHRvIHRoZSBwcm9qZWN0IG93bmVycy4gSWYgdGhlIHRva2VuIHJlbWFpbnMgaW52YWxpZCwgTW9uZ29EQiBDbG91ZCByZW1vdmVzIHRoZSB0b2tlbi5cbiAgICpcbiAgICogQHNjaGVtYSBOb3RpZmljYXRpb25WaWV3I0FwaVRva2VuXG4gICAqL1xuICByZWFkb25seSBhcGlUb2tlbj86IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgU2xhY2sgY2hhbm5lbCB0byB3aGljaCBNb25nb0RCIENsb3VkIHNlbmRzIGFsZXJ0IG5vdGlmaWNhdGlvbnMuIFRoZSByZXNvdXJjZSByZXF1aXJlcyB0aGlzIHBhcmFtZXRlciB3aGVuICdcIm5vdGlmaWNhdGlvbnMudHlwZU5hbWVcIiA6IFwiU0xBQ0tcIicuXG4gICAqXG4gICAqIEBzY2hlbWEgTm90aWZpY2F0aW9uVmlldyNDaGFubmVsTmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERhdGFkb2cgQVBJIEtleSB0aGF0IE1vbmdvREIgQ2xvdWQgbmVlZHMgdG8gc2VuZCBhbGVydCBub3RpZmljYXRpb25zIHRvIERhdGFkb2cuIFlvdSBjYW4gZmluZCB0aGlzIEFQSSBrZXkgaW4gdGhlIERhdGFkb2cgZGFzaGJvYXJkLiBUaGUgcmVzb3VyY2UgcmVxdWlyZXMgdGhpcyBwYXJhbWV0ZXIgd2hlbiAnXCJub3RpZmljYXRpb25zLnR5cGVOYW1lXCIgOiBcIkRBVEFET0dcIicuXG4gICAqXG4gICAqIEBzY2hlbWEgTm90aWZpY2F0aW9uVmlldyNEYXRhZG9nQXBpS2V5XG4gICAqL1xuICByZWFkb25seSBkYXRhZG9nQXBpS2V5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEYXRhZG9nIHJlZ2lvbiB0aGF0IGluZGljYXRlcyB3aGljaCBBUEkgVW5pZm9ybSBSZXNvdXJjZSBMb2NhdG9yIChVUkwpIHRvIHVzZS4gVGhlIHJlc291cmNlIHJlcXVpcmVzIHRoaXMgcGFyYW1ldGVyIHdoZW4gJ1wibm90aWZpY2F0aW9ucy50eXBlTmFtZVwiIDogXCJEQVRBRE9HXCInLlxuICAgKlxuICAgKiBAc2NoZW1hIE5vdGlmaWNhdGlvblZpZXcjRGF0YWRvZ1JlZ2lvblxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YWRvZ1JlZ2lvbj86IE5vdGlmaWNhdGlvblZpZXdEYXRhZG9nUmVnaW9uO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgbWludXRlcyB0aGF0IE1vbmdvREIgQ2xvdWQgd2FpdHMgYWZ0ZXIgZGV0ZWN0aW5nIGFuIGFsZXJ0IGNvbmRpdGlvbiBiZWZvcmUgaXQgc2VuZHMgb3V0IHRoZSBmaXJzdCBub3RpZmljYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgTm90aWZpY2F0aW9uVmlldyNEZWxheU1pblxuICAgKi9cbiAgcmVhZG9ubHkgZGVsYXlNaW4/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEVtYWlsIGFkZHJlc3MgdG8gd2hpY2ggTW9uZ29EQiBDbG91ZCBzZW5kcyBhbGVydCBub3RpZmljYXRpb25zLiBUaGUgcmVzb3VyY2UgcmVxdWlyZXMgdGhpcyBwYXJhbWV0ZXIgd2hlbiAnXCJub3RpZmljYXRpb25zLnR5cGVOYW1lXCIgOiBcIkVNQUlMXCInLiBZb3UgZG9uJ3QgbmVlZCB0byBzZXQgdGhpcyB2YWx1ZSB0byBzZW5kIGVtYWlscyB0byBpbmRpdmlkdWFsIG9yIGdyb3VwcyBvZiBNb25nb0RCIENsb3VkIHVzZXJzIGluY2x1ZGluZzpcbiAgICpcbiAgICogLSBzcGVjaWZpYyBNb25nb0RCIENsb3VkIHVzZXJzICgnXCJub3RpZmljYXRpb25zLnR5cGVOYW1lXCIgOiBcIlVTRVJcIicpXG4gICAqIC0gTW9uZ29EQiBDbG91ZCB1c2VycyB3aXRoIHNwZWNpZmljIHByb2plY3Qgcm9sZXMgKCdcIm5vdGlmaWNhdGlvbnMudHlwZU5hbWVcIiA6IFwiR1JPVVBcIicpXG4gICAqIC0gTW9uZ29EQiBDbG91ZCB1c2VycyB3aXRoIHNwZWNpZmljIG9yZ2FuaXphdGlvbiByb2xlcyAoJ1wibm90aWZpY2F0aW9ucy50eXBlTmFtZVwiIDogXCJPUkdcIicpXG4gICAqIC0gTW9uZ29EQiBDbG91ZCB0ZWFtcyAoJ1wibm90aWZpY2F0aW9ucy50eXBlTmFtZVwiIDogXCJURUFNXCInKVxuICAgKlxuICAgKiBUbyBzZW5kIGVtYWlscyB0byBvbmUgTW9uZ29EQiBDbG91ZCB1c2VyIG9yIGdyb3VwaW5nIG9mIHVzZXJzLCBzZXQgdGhlICoqbm90aWZpY2F0aW9ucy5lbWFpbEVuYWJsZWQqKiBwYXJhbWV0ZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgTm90aWZpY2F0aW9uVmlldyNFbWFpbEFkZHJlc3NcbiAgICovXG4gIHJlYWRvbmx5IGVtYWlsQWRkcmVzcz86IHN0cmluZztcblxuICAvKipcbiAgICogRmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIE1vbmdvREIgQ2xvdWQgc2hvdWxkIHNlbmQgZW1haWwgbm90aWZpY2F0aW9ucy4gVGhlIHJlc291cmNlIHJlcXVpcmVzIHRoaXMgcGFyYW1ldGVyIHdoZW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGhhdmUgYmVlbiBzZXQ6XG4gICAqXG4gICAqIC0gJ1wibm90aWZpY2F0aW9ucy50eXBlTmFtZVwiIDogXCJPUkdcIidcbiAgICogLSAnXCJub3RpZmljYXRpb25zLnR5cGVOYW1lXCIgOiBcIkdST1VQXCInXG4gICAqIC0gJ1wibm90aWZpY2F0aW9ucy50eXBlTmFtZVwiIDogXCJVU0VSXCInXG4gICAqXG4gICAqIEBzY2hlbWEgTm90aWZpY2F0aW9uVmlldyNFbWFpbEVuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVtYWlsRW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBtaW51dGVzIHRvIHdhaXQgYmV0d2VlbiBzdWNjZXNzaXZlIG5vdGlmaWNhdGlvbnMuIE1vbmdvREIgQ2xvdWQgc2VuZHMgbm90aWZpY2F0aW9ucyB1bnRpbCBzb21lb25lIGFja25vd2xlZGdlcyB0aGUgdW5hY2tub3dsZWRnZWQgYWxlcnQuXG4gICAqXG4gICAqIFBhZ2VyRHV0eSwgVmljdG9yT3BzLCBhbmQgT3BzR2VuaWUgbm90aWZpY2F0aW9ucyBkb24ndCByZXR1cm4gdGhpcyBlbGVtZW50LiBDb25maWd1cmUgYW5kIG1hbmFnZSB0aGUgbm90aWZpY2F0aW9uIGludGVydmFsIHdpdGhpbiBlYWNoIG9mIHRob3NlIHNlcnZpY2VzLlxuICAgKlxuICAgKiBAc2NoZW1hIE5vdGlmaWNhdGlvblZpZXcjSW50ZXJ2YWxNaW5cbiAgICovXG4gIHJlYWRvbmx5IGludGVydmFsTWluPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNaWNyb3NvZnQgVGVhbXMgV2ViaG9vayBVbmlmb3JtIFJlc291cmNlIExvY2F0b3IgKFVSTCkgdGhhdCBNb25nb0RCIENsb3VkIG5lZWRzIHRvIHNlbmQgdGhpcyBub3RpZmljYXRpb24gdmlhIE1pY3Jvc29mdCBUZWFtcy4gVGhlIHJlc291cmNlIHJlcXVpcmVzIHRoaXMgcGFyYW1ldGVyIHdoZW4gJ1wibm90aWZpY2F0aW9ucy50eXBlTmFtZVwiIDogXCJNSUNST1NPRlRfVEVBTVNcIicuIElmIHRoZSBVUkwgbGF0ZXIgYmVjb21lcyBpbnZhbGlkLCBNb25nb0RCIENsb3VkIHNlbmRzIGFuIGVtYWlsIHRvIHRoZSBwcm9qZWN0IG93bmVycy4gSWYgdGhlIGtleSByZW1haW5zIGludmFsaWQsIE1vbmdvREIgQ2xvdWQgcmVtb3ZlcyBpdC5cbiAgICpcbiAgICogQHNjaGVtYSBOb3RpZmljYXRpb25WaWV3I01pY3Jvc29mdFRlYW1zV2ViaG9va1VybFxuICAgKi9cbiAgcmVhZG9ubHkgbWljcm9zb2Z0VGVhbXNXZWJob29rVXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNb2JpbGUgcGhvbmUgbnVtYmVyIHRvIHdoaWNoIE1vbmdvREIgQ2xvdWQgc2VuZHMgYWxlcnQgbm90aWZpY2F0aW9ucy4gVGhlIHJlc291cmNlIHJlcXVpcmVzIHRoaXMgcGFyYW1ldGVyIHdoZW4gJ1wibm90aWZpY2F0aW9ucy50eXBlTmFtZVwiIDogXCJTTVNcIicuXG4gICAqXG4gICAqIEBzY2hlbWEgTm90aWZpY2F0aW9uVmlldyNNb2JpbGVOdW1iZXJcbiAgICovXG4gIHJlYWRvbmx5IG1vYmlsZU51bWJlcj86IHN0cmluZztcblxuICAvKipcbiAgICogSGlwQ2hhdCBBUEkgdG9rZW4gdGhhdCBNb25nb0RCIENsb3VkIG5lZWRzIHRvIHNlbmQgYWxlcnQgbm90aWZpY2F0aW9ucyB0byBIaXBDaGF0LiBUaGUgcmVzb3VyY2UgcmVxdWlyZXMgdGhpcyBwYXJhbWV0ZXIgd2hlbiAnXCJub3RpZmljYXRpb25zLnR5cGVOYW1lXCIgOiBcIkhJUF9DSEFUXCInXCIuIElmIHRoZSB0b2tlbiBsYXRlciBiZWNvbWVzIGludmFsaWQsIE1vbmdvREIgQ2xvdWQgc2VuZHMgYW4gZW1haWwgdG8gdGhlIHByb2plY3Qgb3duZXJzLiBJZiB0aGUgdG9rZW4gcmVtYWlucyBpbnZhbGlkLCBNb25nb0RCIENsb3VkIHJlbW92ZXMgaXQuXG4gICAqXG4gICAqIEBzY2hlbWEgTm90aWZpY2F0aW9uVmlldyNOb3RpZmljYXRpb25Ub2tlblxuICAgKi9cbiAgcmVhZG9ubHkgbm90aWZpY2F0aW9uVG9rZW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFQSSBLZXkgdGhhdCBNb25nb0RCIENsb3VkIG5lZWRzIHRvIHNlbmQgdGhpcyBub3RpZmljYXRpb24gdmlhIE9wc2dlbmllLiBUaGUgcmVzb3VyY2UgcmVxdWlyZXMgdGhpcyBwYXJhbWV0ZXIgd2hlbiAnXCJub3RpZmljYXRpb25zLnR5cGVOYW1lXCIgOiBcIk9QU19HRU5JRVwiJy4gSWYgdGhlIGtleSBsYXRlciBiZWNvbWVzIGludmFsaWQsIE1vbmdvREIgQ2xvdWQgc2VuZHMgYW4gZW1haWwgdG8gdGhlIHByb2plY3Qgb3duZXJzLiBJZiB0aGUga2V5IHJlbWFpbnMgaW52YWxpZCwgTW9uZ29EQiBDbG91ZCByZW1vdmVzIGl0LlxuICAgKlxuICAgKiBAc2NoZW1hIE5vdGlmaWNhdGlvblZpZXcjT3BzR2VuaWVBcGlLZXlcbiAgICovXG4gIHJlYWRvbmx5IG9wc0dlbmllQXBpS2V5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHNnZW5pZSByZWdpb24gdGhhdCBpbmRpY2F0ZXMgd2hpY2ggQVBJIFVuaWZvcm0gUmVzb3VyY2UgTG9jYXRvciAoVVJMKSB0byB1c2UuXG4gICAqXG4gICAqIEBzY2hlbWEgTm90aWZpY2F0aW9uVmlldyNPcHNHZW5pZVJlZ2lvblxuICAgKi9cbiAgcmVhZG9ubHkgb3BzR2VuaWVSZWdpb24/OiBOb3RpZmljYXRpb25WaWV3T3BzR2VuaWVSZWdpb247XG5cbiAgLyoqXG4gICAqIEZsb3dkb2NrIG9yZ2FuaXphdGlvbiBuYW1lIHRvIHdoaWNoIE1vbmdvREIgQ2xvdWQgc2VuZHMgYWxlcnQgbm90aWZpY2F0aW9ucy4gVGhpcyBuYW1lIGFwcGVhcnMgYWZ0ZXIgJ3d3dy5mbG93ZG9jay5jb20vYXBwLycgaW4gdGhlIFVuaWZvcm0gUmVzb3VyY2UgTG9jYXRvciAoVVJMKSBwYXRoLiBUaGUgcmVzb3VyY2UgcmVxdWlyZXMgdGhpcyBwYXJhbWV0ZXIgd2hlbiAnXCJub3RpZmljYXRpb25zLnR5cGVOYW1lXCIgOiBcIkZMT1dET0NLXCInLlxuICAgKlxuICAgKiBAc2NoZW1hIE5vdGlmaWNhdGlvblZpZXcjT3JnTmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgb3JnTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogTGlzdCB0aGF0IGNvbnRhaW5zIHRoZSBvbmUgb3IgbW9yZSBvcmdhbml6YXRpb24gb3IgcHJvamVjdCByb2xlcyB0aGF0IHJlY2VpdmUgdGhlIGNvbmZpZ3VyZWQgYWxlcnQuIFRoZSByZXNvdXJjZSByZXF1aXJlcyB0aGlzIHBhcmFtZXRlciB3aGVuICdcIm5vdGlmaWNhdGlvbnMudHlwZU5hbWVcIiA6IFwiR1JPVVBcIicgb3IgJ1wibm90aWZpY2F0aW9ucy50eXBlTmFtZVwiIDogXCJPUkdcIicuIElmIHlvdSBpbmNsdWRlIHRoaXMgcGFyYW1ldGVyLCBNb25nb0RCIENsb3VkIHNlbmRzIGFsZXJ0cyBvbmx5IHRvIHVzZXJzIGFzc2lnbmVkIHRoZSByb2xlcyB5b3Ugc3BlY2lmeSBpbiB0aGUgYXJyYXkuIElmIHlvdSBvbWl0IHRoaXMgcGFyYW1ldGVyLCBNb25nb0RCIENsb3VkIHNlbmRzIGFsZXJ0cyB0byB1c2VycyBhc3NpZ25lZCBhbnkgcm9sZS5cbiAgICpcbiAgICogQHNjaGVtYSBOb3RpZmljYXRpb25WaWV3I1JvbGVzXG4gICAqL1xuICByZWFkb25seSByb2xlcz86IE5vdGlmaWNhdGlvblZpZXdSb2xlc1tdO1xuXG4gIC8qKlxuICAgKiBIaXBDaGF0IEFQSSByb29tIG5hbWUgdG8gd2hpY2ggTW9uZ29EQiBDbG91ZCBzZW5kcyBhbGVydCBub3RpZmljYXRpb25zLiBUaGUgcmVzb3VyY2UgcmVxdWlyZXMgdGhpcyBwYXJhbWV0ZXIgd2hlbiAnXCJub3RpZmljYXRpb25zLnR5cGVOYW1lXCIgOiBcIkhJUF9DSEFUXCInXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgTm90aWZpY2F0aW9uVmlldyNSb29tTmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgcm9vbU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhZ2VyRHV0eSBzZXJ2aWNlIGtleSB0aGF0IE1vbmdvREIgQ2xvdWQgbmVlZHMgdG8gc2VuZCBub3RpZmljYXRpb25zIHZpYSBQYWdlckR1dHkuIFRoZSByZXNvdXJjZSByZXF1aXJlcyB0aGlzIHBhcmFtZXRlciB3aGVuICdcIm5vdGlmaWNhdGlvbnMudHlwZU5hbWVcIiA6IFwiUEFHRVJfRFVUWVwiJy4gSWYgdGhlIGtleSBsYXRlciBiZWNvbWVzIGludmFsaWQsIE1vbmdvREIgQ2xvdWQgc2VuZHMgYW4gZW1haWwgdG8gdGhlIHByb2plY3Qgb3duZXJzLiBJZiB0aGUga2V5IHJlbWFpbnMgaW52YWxpZCwgTW9uZ29EQiBDbG91ZCByZW1vdmVzIGl0LlxuICAgKlxuICAgKiBAc2NoZW1hIE5vdGlmaWNhdGlvblZpZXcjU2VydmljZUtleVxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZUtleT86IHN0cmluZztcblxuICAvKipcbiAgICogRGVncmVlIG9mIHNlcmlvdXNuZXNzIGdpdmVuIHRvIHRoaXMgbm90aWZpY2F0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIE5vdGlmaWNhdGlvblZpZXcjU2V2ZXJpdHlcbiAgICovXG4gIHJlYWRvbmx5IHNldmVyaXR5PzogTm90aWZpY2F0aW9uVmlld1NldmVyaXR5O1xuXG4gIC8qKlxuICAgKiBGbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgTW9uZ29EQiBDbG91ZCBzaG91bGQgc2VuZCB0ZXh0IG1lc3NhZ2Ugbm90aWZpY2F0aW9ucy4gVGhlIHJlc291cmNlIHJlcXVpcmVzIHRoaXMgcGFyYW1ldGVyIHdoZW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGhhdmUgYmVlbiBzZXQ6XG4gICAqXG4gICAqIC0gJ1wibm90aWZpY2F0aW9ucy50eXBlTmFtZVwiIDogXCJPUkdcIidcbiAgICogLSAnXCJub3RpZmljYXRpb25zLnR5cGVOYW1lXCIgOiBcIkdST1VQXCInXG4gICAqIC0gJ1wibm90aWZpY2F0aW9ucy50eXBlTmFtZVwiIDogXCJVU0VSXCInXG4gICAqXG4gICAqIEBzY2hlbWEgTm90aWZpY2F0aW9uVmlldyNTbXNFbmFibGVkXG4gICAqL1xuICByZWFkb25seSBzbXNFbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVW5pcXVlIDI0LWhleGFkZWNpbWFsIGRpZ2l0IHN0cmluZyB0aGF0IGlkZW50aWZpZXMgb25lIE1vbmdvREIgQ2xvdWQgdGVhbS4gVGhlIHJlc291cmNlIHJlcXVpcmVzIHRoaXMgcGFyYW1ldGVyIHdoZW4gJ1wibm90aWZpY2F0aW9ucy50eXBlTmFtZVwiIDogXCJURUFNXCInLlxuICAgKlxuICAgKiBAc2NoZW1hIE5vdGlmaWNhdGlvblZpZXcjVGVhbUlkXG4gICAqL1xuICByZWFkb25seSB0ZWFtSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIE1vbmdvREIgQ2xvdWQgdGVhbSB0aGF0IHJlY2VpdmVzIHRoaXMgbm90aWZpY2F0aW9uLiBUaGUgcmVzb3VyY2UgcmVxdWlyZXMgdGhpcyBwYXJhbWV0ZXIgd2hlbiAnXCJub3RpZmljYXRpb25zLnR5cGVOYW1lXCIgOiBcIlRFQU1cIicuXG4gICAqXG4gICAqIEBzY2hlbWEgTm90aWZpY2F0aW9uVmlldyNUZWFtTmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgdGVhbU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEh1bWFuLXJlYWRhYmxlIGxhYmVsIHRoYXQgZGlzcGxheXMgdGhlIGFsZXJ0IG5vdGlmaWNhdGlvbiB0eXBlLlxuICAgKlxuICAgKiBAc2NoZW1hIE5vdGlmaWNhdGlvblZpZXcjVHlwZU5hbWVcbiAgICovXG4gIHJlYWRvbmx5IHR5cGVOYW1lPzogTm90aWZpY2F0aW9uVmlld1R5cGVOYW1lO1xuXG4gIC8qKlxuICAgKiBNb25nb0RCIENsb3VkIHVzZXJuYW1lIG9mIHRoZSBwZXJzb24gdG8gd2hvbSBNb25nb0RCIENsb3VkIHNlbmRzIG5vdGlmaWNhdGlvbnMuIFNwZWNpZnkgb25seSBNb25nb0RCIENsb3VkIHVzZXJzIHdobyBiZWxvbmcgdG8gdGhlIHByb2plY3QgdGhhdCBvd25zIHRoZSBhbGVydCBjb25maWd1cmF0aW9uLiBUaGUgcmVzb3VyY2UgcmVxdWlyZXMgdGhpcyBwYXJhbWV0ZXIgd2hlbiAnXCJub3RpZmljYXRpb25zLnR5cGVOYW1lXCIgOiBcIlVTRVJcIicuXG4gICAqXG4gICAqIEBzY2hlbWEgTm90aWZpY2F0aW9uVmlldyNVc2VybmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgdXNlcm5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFQSSBrZXkgdGhhdCBNb25nb0RCIENsb3VkIG5lZWRzIHRvIHNlbmQgYWxlcnQgbm90aWZpY2F0aW9ucyB0byBTcGx1bmsgT24tQ2FsbC4gVGhlIHJlc291cmNlIHJlcXVpcmVzIHRoaXMgcGFyYW1ldGVyIHdoZW4gJ1wibm90aWZpY2F0aW9ucy50eXBlTmFtZVwiIDogXCJWSUNUT1JfT1BTXCInLiBJZiB0aGUga2V5IGxhdGVyIGJlY29tZXMgaW52YWxpZCwgTW9uZ29EQiBDbG91ZCBzZW5kcyBhbiBlbWFpbCB0byB0aGUgcHJvamVjdCBvd25lcnMuIElmIHRoZSBrZXkgcmVtYWlucyBpbnZhbGlkLCBNb25nb0RCIENsb3VkIHJlbW92ZXMgaXQuXG4gICAqXG4gICAqIEBzY2hlbWEgTm90aWZpY2F0aW9uVmlldyNWaWN0b3JPcHNBcGlLZXlcbiAgICovXG4gIHJlYWRvbmx5IHZpY3Rvck9wc0FwaUtleT86IHN0cmluZztcblxuICAvKipcbiAgICogUm91dGluZyBrZXkgdGhhdCBNb25nb0RCIENsb3VkIG5lZWRzIHRvIHNlbmQgYWxlcnQgbm90aWZpY2F0aW9ucyB0byBTcGx1bmsgT24tQ2FsbC4gVGhlIHJlc291cmNlIHJlcXVpcmVzIHRoaXMgcGFyYW1ldGVyIHdoZW4gJ1wibm90aWZpY2F0aW9ucy50eXBlTmFtZVwiIDogXCJWSUNUT1JfT1BTXCInLiBJZiB0aGUga2V5IGxhdGVyIGJlY29tZXMgaW52YWxpZCwgTW9uZ29EQiBDbG91ZCBzZW5kcyBhbiBlbWFpbCB0byB0aGUgcHJvamVjdCBvd25lcnMuIElmIHRoZSBrZXkgcmVtYWlucyBpbnZhbGlkLCBNb25nb0RCIENsb3VkIHJlbW92ZXMgaXQuXG4gICAqXG4gICAqIEBzY2hlbWEgTm90aWZpY2F0aW9uVmlldyNWaWN0b3JPcHNSb3V0aW5nS2V5XG4gICAqL1xuICByZWFkb25seSB2aWN0b3JPcHNSb3V0aW5nS2V5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBmaWVsZCBmb3IgeW91ciB3ZWJob29rIHNlY3JldC5cbiAgICpcbiAgICogQHNjaGVtYSBOb3RpZmljYXRpb25WaWV3I1dlYmhvb2tTZWNyZXRcbiAgICovXG4gIHJlYWRvbmx5IHdlYmhvb2tTZWNyZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFlvdXIgd2ViaG9vayBVUkwuXG4gICAqXG4gICAqIEBzY2hlbWEgTm90aWZpY2F0aW9uVmlldyNXZWJob29rVXJsXG4gICAqL1xuICByZWFkb25seSB3ZWJob29rVXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVbmlxdWUgMjQtaGV4YWRlY2ltYWwgZGlnaXQgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUgbm90aWZpZXIgdG8gdXNlIGZvciB0aGlzIGFsZXJ0IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgTm90aWZpY2F0aW9uVmlldyNOb3RpZmllcklkXG4gICAqL1xuICByZWFkb25seSBub3RpZmllcklkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVbmlxdWUgMjQtaGV4YWRlY2ltYWwgZGlnaXQgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUgdGhpcmQgcGFydHkgaW50ZWdyYXRpb24gdG8gdXNlIGZvciB0aGlzIGFsZXJ0IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgTm90aWZpY2F0aW9uVmlldyNJbnRlZ3JhdGlvbklkXG4gICAqL1xuICByZWFkb25seSBpbnRlZ3JhdGlvbklkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdOb3RpZmljYXRpb25WaWV3JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Ob3RpZmljYXRpb25WaWV3KFxuICBvYmo6IE5vdGlmaWNhdGlvblZpZXcgfCB1bmRlZmluZWRcbik6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBBcGlUb2tlbjogb2JqLmFwaVRva2VuLFxuICAgIENoYW5uZWxOYW1lOiBvYmouY2hhbm5lbE5hbWUsXG4gICAgRGF0YWRvZ0FwaUtleTogb2JqLmRhdGFkb2dBcGlLZXksXG4gICAgRGF0YWRvZ1JlZ2lvbjogb2JqLmRhdGFkb2dSZWdpb24sXG4gICAgRGVsYXlNaW46IG9iai5kZWxheU1pbixcbiAgICBFbWFpbEFkZHJlc3M6IG9iai5lbWFpbEFkZHJlc3MsXG4gICAgRW1haWxFbmFibGVkOiBvYmouZW1haWxFbmFibGVkLFxuICAgIEludGVydmFsTWluOiBvYmouaW50ZXJ2YWxNaW4sXG4gICAgTWljcm9zb2Z0VGVhbXNXZWJob29rVXJsOiBvYmoubWljcm9zb2Z0VGVhbXNXZWJob29rVXJsLFxuICAgIE1vYmlsZU51bWJlcjogb2JqLm1vYmlsZU51bWJlcixcbiAgICBOb3RpZmljYXRpb25Ub2tlbjogb2JqLm5vdGlmaWNhdGlvblRva2VuLFxuICAgIE9wc0dlbmllQXBpS2V5OiBvYmoub3BzR2VuaWVBcGlLZXksXG4gICAgT3BzR2VuaWVSZWdpb246IG9iai5vcHNHZW5pZVJlZ2lvbixcbiAgICBPcmdOYW1lOiBvYmoub3JnTmFtZSxcbiAgICBSb2xlczogb2JqLnJvbGVzPy5tYXAoKHkpID0+IHkpLFxuICAgIFJvb21OYW1lOiBvYmoucm9vbU5hbWUsXG4gICAgU2VydmljZUtleTogb2JqLnNlcnZpY2VLZXksXG4gICAgU2V2ZXJpdHk6IG9iai5zZXZlcml0eSxcbiAgICBTbXNFbmFibGVkOiBvYmouc21zRW5hYmxlZCxcbiAgICBUZWFtSWQ6IG9iai50ZWFtSWQsXG4gICAgVGVhbU5hbWU6IG9iai50ZWFtTmFtZSxcbiAgICBUeXBlTmFtZTogb2JqLnR5cGVOYW1lLFxuICAgIFVzZXJuYW1lOiBvYmoudXNlcm5hbWUsXG4gICAgVmljdG9yT3BzQXBpS2V5OiBvYmoudmljdG9yT3BzQXBpS2V5LFxuICAgIFZpY3Rvck9wc1JvdXRpbmdLZXk6IG9iai52aWN0b3JPcHNSb3V0aW5nS2V5LFxuICAgIFdlYmhvb2tTZWNyZXQ6IG9iai53ZWJob29rU2VjcmV0LFxuICAgIFdlYmhvb2tVcmw6IG9iai53ZWJob29rVXJsLFxuICAgIE5vdGlmaWVySWQ6IG9iai5ub3RpZmllcklkLFxuICAgIEludGVncmF0aW9uSWQ6IG9iai5pbnRlZ3JhdGlvbklkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoXG4gICAgKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQgPyByIDogeyAuLi5yLCBbaVswXV06IGlbMV0gfSksXG4gICAge31cbiAgKTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIEludGVnZXJUaHJlc2hvbGRWaWV3XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZWdlclRocmVzaG9sZFZpZXcge1xuICAvKipcbiAgICogSHVtYW4tcmVhZGFibGUgbGFiZWwgdGhhdCBpZGVudGlmaWVzIHRoZSBtZXRyaWMgYWdhaW5zdCB3aGljaCBNb25nb0RCIENsb3VkIGNoZWNrcyB0aGUgY29uZmlndXJlZCB0aHJlc2hvbGQuXG4gICAqXG4gICAqIEBzY2hlbWEgSW50ZWdlclRocmVzaG9sZFZpZXcjTWV0cmljTmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbWV0cmljTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGhvdyBNb25nb0RCIENsb3VkIGNvbXB1dGVzIHRoZSBjdXJyZW50IG1ldHJpYyB2YWx1ZSAoZS5nLiwgQVZFUkFHRSkuXG4gICAqXG4gICAqIEBzY2hlbWEgSW50ZWdlclRocmVzaG9sZFZpZXcjTW9kZVxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZT86IHN0cmluZztcblxuICAvKipcbiAgICogQ29tcGFyaXNvbiBvcGVyYXRvciB0byBhcHBseSB3aGVuIGNoZWNraW5nIHRoZSBjdXJyZW50IG1ldHJpYyB2YWx1ZS5cbiAgICpcbiAgICogQHNjaGVtYSBJbnRlZ2VyVGhyZXNob2xkVmlldyNPcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I/OiBJbnRlZ2VyVGhyZXNob2xkVmlld09wZXJhdG9yO1xuXG4gIC8qKlxuICAgKiBWYWx1ZSBvZiBtZXRyaWMgdGhhdCwgd2hlbiBleGNlZWRlZCwgdHJpZ2dlcnMgYW4gYWxlcnQuXG4gICAqXG4gICAqIEBzY2hlbWEgSW50ZWdlclRocmVzaG9sZFZpZXcjVGhyZXNob2xkXG4gICAqL1xuICByZWFkb25seSB0aHJlc2hvbGQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEVsZW1lbnQgdXNlZCB0byBleHByZXNzIHRoZSBxdWFudGl0eS4gVGhpcyBjYW4gYmUgYW4gZWxlbWVudCBvZiB0aW1lLCBzdG9yYWdlIGNhcGFjaXR5LCBhbmQgdGhlIGxpa2UuXG4gICAqXG4gICAqIEBzY2hlbWEgSW50ZWdlclRocmVzaG9sZFZpZXcjVW5pdHNcbiAgICovXG4gIHJlYWRvbmx5IHVuaXRzPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdJbnRlZ2VyVGhyZXNob2xkVmlldycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fSW50ZWdlclRocmVzaG9sZFZpZXcoXG4gIG9iajogSW50ZWdlclRocmVzaG9sZFZpZXcgfCB1bmRlZmluZWRcbik6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBNZXRyaWNOYW1lOiBvYmoubWV0cmljTmFtZSxcbiAgICBNb2RlOiBvYmoubW9kZSxcbiAgICBPcGVyYXRvcjogb2JqLm9wZXJhdG9yLFxuICAgIFRocmVzaG9sZDogb2JqLnRocmVzaG9sZCxcbiAgICBVbml0czogb2JqLnVuaXRzLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoXG4gICAgKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQgPyByIDogeyAuLi5yLCBbaVswXV06IGlbMV0gfSksXG4gICAge31cbiAgKTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBOYW1lIG9mIHRoZSBwYXJhbWV0ZXIgaW4gdGhlIHRhcmdldCBvYmplY3QgdGhhdCBNb25nb0RCIENsb3VkIGNoZWNrcy4gVGhlIHBhcmFtZXRlciBtdXN0IG1hdGNoIGFsbCBydWxlcyBmb3IgTW9uZ29EQiBDbG91ZCB0byBjaGVjayBmb3IgYWxlcnQgY29uZmlndXJhdGlvbnMuXG4gKlxuICogQHNjaGVtYSBNYXRjaGVyRmllbGROYW1lXG4gKi9cbmV4cG9ydCBlbnVtIE1hdGNoZXJGaWVsZE5hbWUge1xuICAvKiogQ0xVU1RFUl9O