awscdk-resources-mongodbatlas
Version:
MongoDB Atlas CDK Construct Library for AWS CloudFormation Resources
310 lines • 72.7 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CfnCluster = exports.AdvancedRegionConfigProviderName = exports.CfnClusterPropsEncryptionAtRestProvider = void 0;
exports.toJson_CfnClusterProps = toJson_CfnClusterProps;
exports.toJson_ProcessArgs = toJson_ProcessArgs;
exports.toJson_CfnClusterPropsBiConnector = toJson_CfnClusterPropsBiConnector;
exports.toJson_ConnectionStrings = toJson_ConnectionStrings;
exports.toJson_CfnClusterPropsLabels = toJson_CfnClusterPropsLabels;
exports.toJson_AdvancedReplicationSpec = toJson_AdvancedReplicationSpec;
exports.toJson_Tag = toJson_Tag;
exports.toJson_AdvancedRegionConfig = toJson_AdvancedRegionConfig;
exports.toJson_AdvancedAutoScaling = toJson_AdvancedAutoScaling;
exports.toJson_Specs = toJson_Specs;
exports.toJson_DiskGb = toJson_DiskGb;
exports.toJson_Compute = toJson_Compute;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
// Generated by cdk-import
const cdk = require("aws-cdk-lib");
/**
* Converts an object of type 'CfnClusterProps' to JSON representation.
*/
/* eslint-disable max-len, quote-props */
function toJson_CfnClusterProps(obj) {
if (obj === undefined) {
return undefined;
}
const result = {
AdvancedSettings: toJson_ProcessArgs(obj.advancedSettings),
BackupEnabled: obj.backupEnabled,
BiConnector: toJson_CfnClusterPropsBiConnector(obj.biConnector),
ClusterType: obj.clusterType,
ConnectionStrings: toJson_ConnectionStrings(obj.connectionStrings),
DiskSizeGB: obj.diskSizeGb,
EncryptionAtRestProvider: obj.encryptionAtRestProvider,
GlobalClusterSelfManagedSharding: obj.globalClusterSelfManagedSharding,
Profile: obj.profile,
ProjectId: obj.projectId,
Labels: obj.labels?.map((y) => toJson_CfnClusterPropsLabels(y)),
MongoDBMajorVersion: obj.mongoDbMajorVersion,
Name: obj.name,
Paused: obj.paused,
PitEnabled: obj.pitEnabled,
ReplicationSpecs: obj.replicationSpecs?.map((y) => toJson_AdvancedReplicationSpec(y)),
RootCertType: obj.rootCertType,
VersionReleaseSystem: obj.versionReleaseSystem,
TerminationProtectionEnabled: obj.terminationProtectionEnabled,
Tags: obj.tags?.map((y) => toJson_Tag(y)),
};
// filter undefined values
return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {});
}
/**
* Converts an object of type 'ProcessArgs' to JSON representation.
*/
/* eslint-disable max-len, quote-props */
function toJson_ProcessArgs(obj) {
if (obj === undefined) {
return undefined;
}
const result = {
DefaultReadConcern: obj.defaultReadConcern,
DefaultWriteConcern: obj.defaultWriteConcern,
FailIndexKeyTooLong: obj.failIndexKeyTooLong,
JavascriptEnabled: obj.javascriptEnabled,
MinimumEnabledTLSProtocol: obj.minimumEnabledTlsProtocol,
NoTableScan: obj.noTableScan,
OplogSizeMB: obj.oplogSizeMb,
SampleSizeBIConnector: obj.sampleSizeBiConnector,
SampleRefreshIntervalBIConnector: obj.sampleRefreshIntervalBiConnector,
OplogMinRetentionHours: obj.oplogMinRetentionHours,
TransactionLifetimeLimitSeconds: obj.transactionLifetimeLimitSeconds,
};
// filter undefined values
return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {});
}
/**
* Converts an object of type 'CfnClusterPropsBiConnector' to JSON representation.
*/
/* eslint-disable max-len, quote-props */
function toJson_CfnClusterPropsBiConnector(obj) {
if (obj === undefined) {
return undefined;
}
const result = {
ReadPreference: obj.readPreference,
Enabled: obj.enabled,
};
// filter undefined values
return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {});
}
/**
* Converts an object of type 'ConnectionStrings' to JSON representation.
*/
/* eslint-disable max-len, quote-props */
function toJson_ConnectionStrings(obj) {
if (obj === undefined) {
return undefined;
}
const result = {
Standard: obj.standard,
StandardSrv: obj.standardSrv,
Private: obj.private,
PrivateSrv: obj.privateSrv,
PrivateEndpoints: obj.privateEndpoints?.map((y) => y),
PrivateEndpointsSrv: obj.privateEndpointsSrv?.map((y) => y),
SRVShardOptimizedConnectionString: obj.srvShardOptimizedConnectionString?.map((y) => y),
};
// 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 */
/**
* Cloud service provider that manages your customer keys to provide an additional layer of encryption at rest for the cluster. To enable customer key management for encryption at rest, the cluster replicationSpecs[n].regionConfigs[m].{type}Specs.instanceSize setting must be M10 or higher and "backupEnabled" : false or omitted entirely.
*
* @schema CfnClusterPropsEncryptionAtRestProvider
*/
var CfnClusterPropsEncryptionAtRestProvider;
(function (CfnClusterPropsEncryptionAtRestProvider) {
/** AWS */
CfnClusterPropsEncryptionAtRestProvider["AWS"] = "AWS";
/** GCP */
CfnClusterPropsEncryptionAtRestProvider["GCP"] = "GCP";
/** AZURE */
CfnClusterPropsEncryptionAtRestProvider["AZURE"] = "AZURE";
/** NONE */
CfnClusterPropsEncryptionAtRestProvider["NONE"] = "NONE";
})(CfnClusterPropsEncryptionAtRestProvider || (exports.CfnClusterPropsEncryptionAtRestProvider = CfnClusterPropsEncryptionAtRestProvider = {}));
/**
* Converts an object of type 'CfnClusterPropsLabels' to JSON representation.
*/
/* eslint-disable max-len, quote-props */
function toJson_CfnClusterPropsLabels(obj) {
if (obj === undefined) {
return undefined;
}
const result = {
Key: obj.key,
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 'AdvancedReplicationSpec' to JSON representation.
*/
/* eslint-disable max-len, quote-props */
function toJson_AdvancedReplicationSpec(obj) {
if (obj === undefined) {
return undefined;
}
const result = {
ID: obj.id,
NumShards: obj.numShards,
AdvancedRegionConfigs: obj.advancedRegionConfigs?.map((y) => toJson_AdvancedRegionConfig(y)),
ZoneName: obj.zoneName,
};
// filter undefined values
return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {});
}
/**
* Converts an object of type 'Tag' to JSON representation.
*/
/* eslint-disable max-len, quote-props */
function toJson_Tag(obj) {
if (obj === undefined) {
return undefined;
}
const result = {
Key: obj.key,
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 'AdvancedRegionConfig' to JSON representation.
*/
/* eslint-disable max-len, quote-props */
function toJson_AdvancedRegionConfig(obj) {
if (obj === undefined) {
return undefined;
}
const result = {
AnalyticsAutoScaling: toJson_AdvancedAutoScaling(obj.analyticsAutoScaling),
AutoScaling: toJson_AdvancedAutoScaling(obj.autoScaling),
RegionName: obj.regionName,
BackingProviderName: obj.backingProviderName,
ProviderName: obj.providerName,
AnalyticsSpecs: toJson_Specs(obj.analyticsSpecs),
ElectableSpecs: toJson_Specs(obj.electableSpecs),
Priority: obj.priority,
ReadOnlySpecs: toJson_Specs(obj.readOnlySpecs),
};
// filter undefined values
return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {});
}
/**
* Converts an object of type 'AdvancedAutoScaling' to JSON representation.
*/
/* eslint-disable max-len, quote-props */
function toJson_AdvancedAutoScaling(obj) {
if (obj === undefined) {
return undefined;
}
const result = {
DiskGB: toJson_DiskGb(obj.diskGb),
Compute: toJson_Compute(obj.compute),
};
// 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 */
/**
* @schema AdvancedRegionConfigProviderName
*/
var AdvancedRegionConfigProviderName;
(function (AdvancedRegionConfigProviderName) {
/** AWS */
AdvancedRegionConfigProviderName["AWS"] = "AWS";
/** GCP */
AdvancedRegionConfigProviderName["GCP"] = "GCP";
/** AZURE */
AdvancedRegionConfigProviderName["AZURE"] = "AZURE";
/** TENANT */
AdvancedRegionConfigProviderName["TENANT"] = "TENANT";
})(AdvancedRegionConfigProviderName || (exports.AdvancedRegionConfigProviderName = AdvancedRegionConfigProviderName = {}));
/**
* Converts an object of type 'Specs' to JSON representation.
*/
/* eslint-disable max-len, quote-props */
function toJson_Specs(obj) {
if (obj === undefined) {
return undefined;
}
const result = {
DiskIOPS: obj.diskIops,
EbsVolumeType: obj.ebsVolumeType,
InstanceSize: obj.instanceSize,
NodeCount: obj.nodeCount,
};
// filter undefined values
return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {});
}
/**
* Converts an object of type 'DiskGb' to JSON representation.
*/
/* eslint-disable max-len, quote-props */
function toJson_DiskGb(obj) {
if (obj === undefined) {
return undefined;
}
const result = {
Enabled: obj.enabled,
};
// filter undefined values
return Object.entries(result).reduce((r, i) => (i[1] === undefined ? r : { ...r, [i[0]]: i[1] }), {});
}
/**
* Converts an object of type 'Compute' to JSON representation.
*/
/* eslint-disable max-len, quote-props */
function toJson_Compute(obj) {
if (obj === undefined) {
return undefined;
}
const result = {
Enabled: obj.enabled,
ScaleDownEnabled: obj.scaleDownEnabled,
MinInstanceSize: obj.minInstanceSize,
MaxInstanceSize: obj.maxInstanceSize,
};
// 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 */
/**
* A CloudFormation `MongoDB::Atlas::Cluster`
*
* @cloudformationResource MongoDB::Atlas::Cluster
* @stability external
*/
class CfnCluster extends cdk.CfnResource {
/**
* Create a new `MongoDB::Atlas::Cluster`.
*
* @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: CfnCluster.CFN_RESOURCE_TYPE_NAME,
properties: toJson_CfnClusterProps(props),
});
this.props = props;
this.attrStateName = cdk.Token.asString(this.getAtt("StateName"));
this.attrMongoDBVersion = cdk.Token.asString(this.getAtt("MongoDBVersion"));
this.attrCreatedDate = cdk.Token.asString(this.getAtt("CreatedDate"));
this.attrId = cdk.Token.asString(this.getAtt("Id"));
}
}
exports.CfnCluster = CfnCluster;
_a = JSII_RTTI_SYMBOL_1;
CfnCluster[_a] = { fqn: "awscdk-resources-mongodbatlas.CfnCluster", version: "3.10.0" };
/**
* The CloudFormation resource type name for this resource class.
*/
CfnCluster.CFN_RESOURCE_TYPE_NAME = "MongoDB::Atlas::Cluster";
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbDEtcmVzb3VyY2VzL2NsdXN0ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQXlKQSx3REFtQ0M7QUEyRkQsZ0RBd0JDO0FBNkJELDhFQWVDO0FBK0RELDREQXFCQztBQXNDRCxvRUFlQztBQThDRCx3RUFtQkM7QUE0QkQsZ0NBZUM7QUErREQsa0VBc0JDO0FBd0JELGdFQWVDO0FBaUVELG9DQWlCQztBQXFCRCxzQ0FjQztBQTZDRCx3Q0FpQkM7O0FBLzNCRCwwQkFBMEI7QUFDMUIsbUNBQW1DO0FBb0puQzs7R0FFRztBQUNILHlDQUF5QztBQUN6QyxTQUFnQixzQkFBc0IsQ0FDcEMsR0FBZ0M7SUFFaEMsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHO1FBQ2IsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDO1FBQzFELGFBQWEsRUFBRSxHQUFHLENBQUMsYUFBYTtRQUNoQyxXQUFXLEVBQUUsaUNBQWlDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztRQUMvRCxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7UUFDNUIsaUJBQWlCLEVBQUUsd0JBQXdCLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDO1FBQ2xFLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVTtRQUMxQix3QkFBd0IsRUFBRSxHQUFHLENBQUMsd0JBQXdCO1FBQ3RELGdDQUFnQyxFQUFFLEdBQUcsQ0FBQyxnQ0FBZ0M7UUFDdEUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPO1FBQ3BCLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUztRQUN4QixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFD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VUFBVSxFQUFFLHNCQUFzQixDQUFDLEtBQUssQ0FBRTtTQUMzQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVuQixJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLGVBQWUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQzs7QUEvQ0gsZ0NBZ0RDOzs7QUEvQ0M7O0dBRUc7QUFDb0IsaUNBQXNCLEdBQUcseUJBQXlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHZW5lcmF0ZWQgYnkgY2RrLWltcG9ydFxuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0ICogYXMgY29uc3RydWN0cyBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG4vKipcbiAqIFRoZSBjbHVzdGVyIHJlc291cmNlIHByb3ZpZGVzIGFjY2VzcyB0byB5b3VyIGNsdXN0ZXIgY29uZmlndXJhdGlvbnMuIFRoZSByZXNvdXJjZSBsZXRzIHlvdSBjcmVhdGUsIGVkaXQgYW5kIGRlbGV0ZSBjbHVzdGVycy4gVGhlIHJlc291cmNlIHJlcXVpcmVzIHlvdXIgUHJvamVjdCBJRC5cbiAqXG4gKiBAc2NoZW1hIENmbkNsdXN0ZXJQcm9wc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENmbkNsdXN0ZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIENmbkNsdXN0ZXJQcm9wcyNBZHZhbmNlZFNldHRpbmdzXG4gICAqL1xuICByZWFkb25seSBhZHZhbmNlZFNldHRpbmdzPzogUHJvY2Vzc0FyZ3M7XG5cbiAgLyoqXG4gICAqIEZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY2x1c3RlciBjYW4gcGVyZm9ybSBiYWNrdXBzLiBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGNsdXN0ZXIgY2FuIHBlcmZvcm0gYmFja3Vwcy4gWW91IG11c3Qgc2V0IHRoaXMgdmFsdWUgdG8gdHJ1ZSBmb3IgTlZNZSBjbHVzdGVycy4gQmFja3VwIHVzZXMgQ2xvdWQgQmFja3VwcyBmb3IgZGVkaWNhdGVkIGNsdXN0ZXJzIGFuZCBTaGFyZWQgQ2x1c3RlciBCYWNrdXBzIGZvciB0ZW5hbnQgY2x1c3RlcnMuIElmIHNldCB0byBmYWxzZSwgdGhlIGNsdXN0ZXIgZG9lc24ndCB1c2UgYmFja3Vwcy5cbiAgICpcbiAgICogQHNjaGVtYSBDZm5DbHVzdGVyUHJvcHMjQmFja3VwRW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgYmFja3VwRW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHRpbmdzIG5lZWRlZCB0byBjb25maWd1cmUgdGhlIE1vbmdvREIgQ29ubmVjdG9yIGZvciBCdXNpbmVzcyBJbnRlbGxpZ2VuY2UgZm9yIHRoaXMgY2x1c3Rlci5cbiAgICpcbiAgICogQHNjaGVtYSBDZm5DbHVzdGVyUHJvcHMjQmlDb25uZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IGJpQ29ubmVjdG9yPzogQ2ZuQ2x1c3RlclByb3BzQmlDb25uZWN0b3I7XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gb2Ygbm9kZXMgdGhhdCBjb21wcmlzZSB0aGUgY2x1c3Rlci5cbiAgICpcbiAgICogQHNjaGVtYSBDZm5DbHVzdGVyUHJvcHMjQ2x1c3RlclR5cGVcbiAgICovXG4gIHJlYWRvbmx5IGNsdXN0ZXJUeXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgY29ubmVjdGlvbiBzdHJpbmdzIHRoYXQgeW91ciBhcHBsaWNhdGlvbnMgdXNlIHRvIGNvbm5lY3QgdG8gdGhpcyBjbHVzdGVyLiBVc2UgdGhlIHBhcmFtZXRlcnMgaW4gdGhpcyBvYmplY3QgdG8gY29ubmVjdCB5b3VyIGFwcGxpY2F0aW9ucyB0byB0aGlzIGNsdXN0ZXIuIFNlZSB0aGUgTW9uZ29EQiBbQ29ubmVjdGlvbiBTdHJpbmcgVVJJIEZvcm1hdF0oaHR0cHM6Ly9kb2NzLm1vbmdvZGIuY29tL21hbnVhbC9yZWZlcmVuY2UvY29ubmVjdGlvbi1zdHJpbmcvKSByZWZlcmVuY2UgZm9yIGZ1cnRoZXIgZGV0YWlscy5cbiAgICpcbiAgICogQHNjaGVtYSBDZm5DbHVzdGVyUHJvcHMjQ29ubmVjdGlvblN0cmluZ3NcbiAgICovXG4gIHJlYWRvbmx5IGNvbm5lY3Rpb25TdHJpbmdzPzogQ29ubmVjdGlvblN0cmluZ3M7XG5cbiAgLyoqXG4gICAqIFN0b3JhZ2UgY2FwYWNpdHkgdGhhdCB0aGUgaG9zdCdzIHJvb3Qgdm9sdW1lIHBvc3Nlc3NlcyBleHByZXNzZWQgaW4gZ2lnYWJ5dGVzLiBJbmNyZWFzZSB0aGlzIG51bWJlciB0byBhZGQgY2FwYWNpdHkuIE1vbmdvREIgQ2xvdWQgcmVxdWlyZXMgdGhpcyBwYXJhbWV0ZXIgaWYgeW91IHNldCByZXBsaWNhdGlvblNwZWNzLiBJZiB5b3Ugc3BlY2lmeSBhIGRpc2sgc2l6ZSBiZWxvdyB0aGUgbWluaW11bSAoMTAgR0IpLCB0aGlzIHBhcmFtZXRlciBkZWZhdWx0cyB0byB0aGUgbWluaW11bSBkaXNrIHNpemUgdmFsdWUuIFN0b3JhZ2UgY2hhcmdlIGNhbGN1bGF0aW9ucyBkZXBlbmQgb24gd2hldGhlciB5b3UgY2hvb3NlIHRoZSBkZWZhdWx0IHZhbHVlIG9yIGEgY3VzdG9tIHZhbHVlLiBUaGUgbWF4aW11bSB2YWx1ZSBmb3IgZGlzayBzdG9yYWdlIGNhbm5vdCBleGNlZWQgNTAgdGltZXMgdGhlIG1heGltdW0gUkFNIGZvciB0aGUgc2VsZWN0ZWQgY2x1c3Rlci4gSWYgeW91IHJlcXVpcmUgbW9yZSBzdG9yYWdlIHNwYWNlLCBjb25zaWRlciB1cGdyYWRpbmcgeW91ciBjbHVzdGVyIHRvIGEgaGlnaGVyIHRpZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgQ2ZuQ2x1c3RlclByb3BzI0Rpc2tTaXplR0JcbiAgICovXG4gIHJlYWRvbmx5IGRpc2tTaXplR2I/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENsb3VkIHNlcnZpY2UgcHJvdmlkZXIgdGhhdCBtYW5hZ2VzIHlvdXIgY3VzdG9tZXIga2V5cyB0byBwcm92aWRlIGFuIGFkZGl0aW9uYWwgbGF5ZXIgb2YgZW5jcnlwdGlvbiBhdCByZXN0IGZvciB0aGUgY2x1c3Rlci4gVG8gZW5hYmxlIGN1c3RvbWVyIGtleSBtYW5hZ2VtZW50IGZvciBlbmNyeXB0aW9uIGF0IHJlc3QsIHRoZSBjbHVzdGVyIHJlcGxpY2F0aW9uU3BlY3Nbbl0ucmVnaW9uQ29uZmlnc1ttXS57dHlwZX1TcGVjcy5pbnN0YW5jZVNpemUgc2V0dGluZyBtdXN0IGJlIE0xMCBvciBoaWdoZXIgYW5kIFwiYmFja3VwRW5hYmxlZFwiIDogZmFsc2Ugb3Igb21pdHRlZCBlbnRpcmVseS5cbiAgICpcbiAgICogQHNjaGVtYSBDZm5DbHVzdGVyUHJvcHMjRW5jcnlwdGlvbkF0UmVzdFByb3ZpZGVyXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uQXRSZXN0UHJvdmlkZXI/OiBDZm5DbHVzdGVyUHJvcHNFbmNyeXB0aW9uQXRSZXN0UHJvdmlkZXI7XG5cbiAgLyoqXG4gICAqIChPcHRpb25hbCkgRmxhZyB0aGF0IGluZGljYXRlcyBpZiBjbHVzdGVyIHVzZXMgQXRsYXMtTWFuYWdlZCBTaGFyZGluZyAoZmFsc2UsIGRlZmF1bHQpIG9yIFNlbGYtTWFuYWdlZCBTaGFyZGluZyAodHJ1ZSkuIEl0IGNhbiBvbmx5IGJlIGVuYWJsZWQgZm9yIEdsb2JhbCBDbHVzdGVycyAoYEdFT1NIQVJERURgKS4gSXQgY2Fubm90IGJlIGNoYW5nZWQgb25jZSB0aGUgY2x1c3RlciBpcyBjcmVhdGVkLiBVc2UgdGhpcyBtb2RlIGlmIHlvdSdyZSBhbiBhZHZhbmNlZCB1c2VyIGFuZCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGlzIHRvbyByZXN0cmljdGl2ZSBmb3IgeW91ciB3b3JrbG9hZC4gSWYgeW91IHNlbGVjdCB0aGlzIG9wdGlvbiwgeW91IG11c3QgbWFudWFsbHkgY29uZmlndXJlIHRoZSBzaGFyZGluZyBzdHJhdGVneSwgbW9yZSBpbmZvIFtoZXJlXShodHRwczovL3d3dy5tb25nb2RiLmNvbS9kb2NzL2F0bGFzL3R1dG9yaWFsL2NyZWF0ZS1nbG9iYWwtY2x1c3Rlci8jc2VsZWN0LXlvdXItc2hhcmRpbmctY29uZmlndXJhdGlvbikuXG4gICAqXG4gICAqIEBzY2hlbWEgQ2ZuQ2x1c3RlclByb3BzI0dsb2JhbENsdXN0ZXJTZWxmTWFuYWdlZFNoYXJkaW5nXG4gICAqL1xuICByZWFkb25seSBnbG9iYWxDbHVzdGVyU2VsZk1hbmFnZWRTaGFyZGluZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFByb2ZpbGUgdXNlZCB0byBwcm92aWRlIGNyZWRlbnRpYWxzIGluZm9ybWF0aW9uLCAoYSBzZWNyZXQgd2l0aCB0aGUgY2ZuL2F0bGFzL3Byb2ZpbGUve1Byb2ZpbGV9LCBpcyByZXF1aXJlZCksIGlmIG5vdCBwcm92aWRlZCBkZWZhdWx0IGlzIHVzZWRcbiAgICpcbiAgICogQHNjaGVtYSBDZm5DbHVzdGVyUHJvcHMjUHJvZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJvZmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHByb2plY3QgdGhlIGNsdXN0ZXIgYmVsb25ncyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBDZm5DbHVzdGVyUHJvcHMjUHJvamVjdElkXG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQ29sbGVjdGlvbiBvZiBrZXktdmFsdWUgcGFpcnMgYmV0d2VlbiAxIHRvIDI1NSBjaGFyYWN0ZXJzIGluIGxlbmd0aCB0aGF0IHRhZyBhbmQgY2F0ZWdvcml6ZSB0aGUgY2x1c3Rlci4gVGhlIE1vbmdvREIgQ2xvdWQgY29uc29sZSBkb2Vzbid0IGRpc3BsYXkgeW91ciBsYWJlbHMuXG4gICAqXG4gICAqIEBzY2hlbWEgQ2ZuQ2x1c3RlclByb3BzI0xhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxzPzogQ2ZuQ2x1c3RlclByb3BzTGFiZWxzW107XG5cbiAgLyoqXG4gICAqIE1ham9yIE1vbmdvREIgdmVyc2lvbiBvZiB0aGUgY2x1c3Rlci4gTW9uZ29EQiBDbG91ZCBkZXBsb3lzIHRoZSBjbHVzdGVyIHdpdGggdGhlIGxhdGVzdCBzdGFibGUgcmVsZWFzZSBvZiB0aGUgc3BlY2lmaWVkIHZlcnNpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgQ2ZuQ2x1c3RlclByb3BzI01vbmdvREJNYWpvclZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IG1vbmdvRGJNYWpvclZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEh1bWFuLXJlYWRhYmxlIGxhYmVsIHRoYXQgaWRlbnRpZmllcyB0aGUgYWR2YW5jZWQgY2x1c3Rlci5cbiAgICpcbiAgICogQHNjaGVtYSBDZm5DbHVzdGVyUHJvcHMjTmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNsdXN0ZXIgaXMgcGF1c2VkIG9yIG5vdC5cbiAgICpcbiAgICogQHNjaGVtYSBDZm5DbHVzdGVyUHJvcHMjUGF1c2VkXG4gICAqL1xuICByZWFkb25seSBwYXVzZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBGbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNsdXN0ZXIgdXNlcyBjb250aW51b3VzIGNsb3VkIGJhY2t1cHMuXG4gICAqXG4gICAqIEBzY2hlbWEgQ2ZuQ2x1c3RlclByb3BzI1BpdEVuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IHBpdEVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIHNldHRpbmdzIHRoYXQgY29uZmlndXJlIHlvdXIgY2x1c3RlciByZWdpb25zLiBGb3IgR2xvYmFsIENsdXN0ZXJzLCBlYWNoIG9iamVjdCBpbiB0aGUgYXJyYXkgcmVwcmVzZW50cyBhIHpvbmUgd2hlcmUgeW91ciBjbHVzdGVycyBub2RlcyBkZXBsb3kuIEZvciBub24tR2xvYmFsIHJlcGxpY2Egc2V0cyBhbmQgc2hhcmRlZCBjbHVzdGVycywgdGhpcyBhcnJheSBoYXMgb25lIG9iamVjdCByZXByZXNlbnRpbmcgd2hlcmUgeW91ciBjbHVzdGVycyBub2RlcyBkZXBsb3kuXG4gICAqXG4gICAqIEBzY2hlbWEgQ2ZuQ2x1c3RlclByb3BzI1JlcGxpY2F0aW9uU3BlY3NcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxpY2F0aW9uU3BlY3M/OiBBZHZhbmNlZFJlcGxpY2F0aW9uU3BlY1tdO1xuXG4gIC8qKlxuICAgKiBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSB0aGF0IE1vbmdvREIgQ2xvdWQgY2x1c3RlciB1c2VzLiBNb25nb0RCIENsb3VkIHN1cHBvcnRzIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwLlxuICAgKlxuICAgKiBAc2NoZW1hIENmbkNsdXN0ZXJQcm9wcyNSb290Q2VydFR5cGVcbiAgICovXG4gIHJlYWRvbmx5IHJvb3RDZXJ0VHlwZT86IHN0cmluZztcblxuICAvKipcbiAgICogTWV0aG9kIGJ5IHdoaWNoIHRoZSBjbHVzdGVyIG1haW50YWlucyB0aGUgTW9uZ29EQiB2ZXJzaW9ucy4gSWYgdmFsdWUgaXMgQ09OVElOVU9VUywgeW91IG11c3Qgbm90IHNwZWNpZnkgbW9uZ29EQk1ham9yVmVyc2lvblxuICAgKlxuICAgKiBAc2NoZW1hIENmbkNsdXN0ZXJQcm9wcyNWZXJzaW9uUmVsZWFzZVN5c3RlbVxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvblJlbGVhc2VTeXN0ZW0/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0ZXJtaW5hdGlvbiBwcm90ZWN0aW9uIGlzIGVuYWJsZWQgb24gdGhlIGNsdXN0ZXIuIElmIHNldCB0byB0cnVlLCBNb25nb0RCIENsb3VkIHdvbid0IGRlbGV0ZSB0aGUgY2x1c3Rlci4gSWYgc2V0IHRvIGZhbHNlLCBNb25nb0RCIENsb3VkIHdpbGwgZGVsZXRlIHRoZSBjbHVzdGVyLlxuICAgKlxuICAgKiBAc2NoZW1hIENmbkNsdXN0ZXJQcm9wcyNUZXJtaW5hdGlvblByb3RlY3Rpb25FbmFibGVkXG4gICAqL1xuICByZWFkb25seSB0ZXJtaW5hdGlvblByb3RlY3Rpb25FbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTGlzdCBvZiBzZXR0aW5ncyB0aGF0IGNvbmZpZ3VyZSB5b3VyIGNsdXN0ZXIgcmVnaW9ucy4gRm9yIEdsb2JhbCBDbHVzdGVycywgZWFjaCBvYmplY3QgaW4gdGhlIGFycmF5IHJlcHJlc2VudHMgYSB6b25lIHdoZXJlIHlvdXIgY2x1c3RlcnMgbm9kZXMgZGVwbG95LiBGb3Igbm9uLUdsb2JhbCByZXBsaWNhIHNldHMgYW5kIHNoYXJkZWQgY2x1c3RlcnMsIHRoaXMgYXJyYXkgaGFzIG9uZSBvYmplY3QgcmVwcmVzZW50aW5nIHdoZXJlIHlvdXIgY2x1c3RlcnMgbm9kZXMgZGVwbG95LlxuICAgKlxuICAgKiBAc2NoZW1hIENmbkNsdXN0ZXJQcm9wcyNUYWdzXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogVGFnW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0NmbkNsdXN0ZXJQcm9wcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQ2ZuQ2x1c3RlclByb3BzKFxuICBvYmo6IENmbkNsdXN0ZXJQcm9wcyB8IHVuZGVmaW5lZFxuKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIEFkdmFuY2VkU2V0dGluZ3M6IHRvSnNvbl9Qcm9jZXNzQXJncyhvYmouYWR2YW5jZWRTZXR0aW5ncyksXG4gICAgQmFja3VwRW5hYmxlZDogb2JqLmJhY2t1cEVuYWJsZWQsXG4gICAgQmlDb25uZWN0b3I6IHRvSnNvbl9DZm5DbHVzdGVyUHJvcHNCaUNvbm5lY3RvcihvYmouYmlDb25uZWN0b3IpLFxuICAgIENsdXN0ZXJUeXBlOiBvYmouY2x1c3RlclR5cGUsXG4gICAgQ29ubmVjdGlvblN0cmluZ3M6IHRvSnNvbl9Db25uZWN0aW9uU3RyaW5ncyhvYmouY29ubmVjdGlvblN0cmluZ3MpLFxuICAgIERpc2tTaXplR0I6IG9iai5kaXNrU2l6ZUdiLFxuICAgIEVuY3J5cHRpb25BdFJlc3RQcm92aWRlcjogb2JqLmVuY3J5cHRpb25BdFJlc3RQcm92aWRlcixcbiAgICBHbG9iYWxDbHVzdGVyU2VsZk1hbmFnZWRTaGFyZGluZzogb2JqLmdsb2JhbENsdXN0ZXJTZWxmTWFuYWdlZFNoYXJkaW5nLFxuICAgIFByb2ZpbGU6IG9iai5wcm9maWxlLFxuICAgIFByb2plY3RJZDogb2JqLnByb2plY3RJZCxcbiAgICBMYWJlbHM6IG9iai5sYWJlbHM/Lm1hcCgoeSkgPT4gdG9Kc29uX0NmbkNsdXN0ZXJQcm9wc0xhYmVscyh5KSksXG4gICAgTW9uZ29EQk1ham9yVmVyc2lvbjogb2JqLm1vbmdvRGJNYWpvclZlcnNpb24sXG4gICAgTmFtZTogb2JqLm5hbWUsXG4gICAgUGF1c2VkOiBvYmoucGF1c2VkLFxuICAgIFBpdEVuYWJsZWQ6IG9iai5waXRFbmFibGVkLFxuICAgIFJlcGxpY2F0aW9uU3BlY3M6IG9iai5yZXBsaWNhdGlvblNwZWNzPy5tYXAoKHkpID0+XG4gICAgICB0b0pzb25fQWR2YW5jZWRSZXBsaWNhdGlvblNwZWMoeSlcbiAgICApLFxuICAgIFJvb3RDZXJ0VHlwZTogb2JqLnJvb3RDZXJ0VHlwZSxcbiAgICBWZXJzaW9uUmVsZWFzZVN5c3RlbTogb2JqLnZlcnNpb25SZWxlYXNlU3lzdGVtLFxuICAgIFRlcm1pbmF0aW9uUHJvdGVjdGlvbkVuYWJsZWQ6IG9iai50ZXJtaW5hdGlvblByb3RlY3Rpb25FbmFibGVkLFxuICAgIFRhZ3M6IG9iai50YWdzPy5tYXAoKHkpID0+IHRvSnNvbl9UYWcoeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoXG4gICAgKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQgPyByIDogeyAuLi5yLCBbaVswXV06IGlbMV0gfSksXG4gICAge31cbiAgKTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBZHZhbmNlZCBjb25maWd1cmF0aW9uIGRldGFpbHMgdG8gYWRkIGZvciBvbmUgY2x1c3RlciBpbiB0aGUgc3BlY2lmaWVkIHByb2plY3QuXG4gKlxuICogQHNjaGVtYSBwcm9jZXNzQXJnc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NBcmdzIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgbGV2ZWwgb2YgYWNrbm93bGVkZ21lbnQgcmVxdWVzdGVkIGZyb20gTW9uZ29EQiBmb3IgcmVhZCBvcGVyYXRpb25zIHNldCBmb3IgdGhpcyBjbHVzdGVyLlxuICAgKlxuICAgKiBAc2NoZW1hIHByb2Nlc3NBcmdzI0RlZmF1bHRSZWFkQ29uY2VyblxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdFJlYWRDb25jZXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGxldmVsIG9mIGFja25vd2xlZGdtZW50IHJlcXVlc3RlZCBmcm9tIE1vbmdvREIgZm9yIHdyaXRlIG9wZXJhdGlvbnMgc2V0IGZvciB0aGlzIGNsdXN0ZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgcHJvY2Vzc0FyZ3MjRGVmYXVsdFdyaXRlQ29uY2VyblxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdFdyaXRlQ29uY2Vybj86IHN0cmluZztcblxuICAvKipcbiAgICogRmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHlvdSBjYW4gaW5zZXJ0IG9yIHVwZGF0ZSBkb2N1bWVudHMgd2hlcmUgYWxsIGluZGV4ZWQgZW50cmllcyBkb24ndCBleGNlZWQgMTAyNCBieXRlcy4gSWYgeW91IHNldCB0aGlzIHRvIGZhbHNlLCBtb25nb2Qgd3JpdGVzIGRvY3VtZW50cyB0aGF0IGV4Y2VlZCB0aGlzIGxpbWl0IGJ1dCBkb2Vzbid0IGluZGV4IHRoZW0uXG4gICAqXG4gICAqIEBzY2hlbWEgcHJvY2Vzc0FyZ3MjRmFpbEluZGV4S2V5VG9vTG9uZ1xuICAgKi9cbiAgcmVhZG9ubHkgZmFpbEluZGV4S2V5VG9vTG9uZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY2x1c3RlciBhbGxvd3MgZXhlY3V0aW9uIG9mIG9wZXJhdGlvbnMgdGhhdCBwZXJmb3JtIHNlcnZlci1zaWRlIGV4ZWN1dGlvbnMgb2YgSmF2YVNjcmlwdC5cbiAgICpcbiAgICogQHNjaGVtYSBwcm9jZXNzQXJncyNKYXZhc2NyaXB0RW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgamF2YXNjcmlwdEVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBNaW5pbXVtIFRyYW5zcG9ydCBMYXllciBTZWN1cml0eSAoVExTKSB2ZXJzaW9uIHRoYXQgdGhlIGNsdXN0ZXIgYWNjZXB0cyBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMuIENsdXN0ZXJzIHVzaW5nIFRMUyAxLjAgb3IgMS4xIHNob3VsZCBjb25zaWRlciBzZXR0aW5nIFRMUyAxLjIgYXMgdGhlIG1pbmltdW0gVExTIHByb3RvY29sIHZlcnNpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgcHJvY2Vzc0FyZ3MjTWluaW11bUVuYWJsZWRUTFNQcm90b2NvbFxuICAgKi9cbiAgcmVhZG9ubHkgbWluaW11bUVuYWJsZWRUbHNQcm90b2NvbD86IHN0cmluZztcblxuICAvKipcbiAgICogRmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBjbHVzdGVyIGRpc2FibGVzIGV4ZWN1dGluZyBhbnkgcXVlcnkgdGhhdCByZXF1aXJlcyBhIGNvbGxlY3Rpb24gc2NhbiB0byByZXR1cm4gcmVzdWx0cy5cbiAgICpcbiAgICogQHNjaGVtYSBwcm9jZXNzQXJncyNOb1RhYmxlU2NhblxuICAgKi9cbiAgcmVhZG9ubHkgbm9UYWJsZVNjYW4/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTdG9yYWdlIGxpbWl0IG9mIGNsdXN0ZXIncyBvcGxvZyBleHByZXNzZWQgaW4gbWVnYWJ5dGVzLiBBIHZhbHVlIG9mIG51bGwgaW5kaWNhdGVzIHRoYXQgdGhlIGNsdXN0ZXIgdXNlcyB0aGUgZGVmYXVsdCBvcGxvZyBzaXplIHRoYXQgTW9uZ29EQiBDbG91ZCBjYWxjdWxhdGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIHByb2Nlc3NBcmdzI09wbG9nU2l6ZU1CXG4gICAqL1xuICByZWFkb25seSBvcGxvZ1NpemVNYj86IG51bWJlcjtcblxuICAvKipcbiAgICogSW50ZXJ2YWwgaW4gc2Vjb25kcyBhdCB3aGljaCB0aGUgbW9uZ29zcWxkIHByb2Nlc3MgcmUtc2FtcGxlcyBkYXRhIHRvIGNyZWF0ZSBpdHMgcmVsYXRpb25hbCBzY2hlbWEuXG4gICAqXG4gICAqIEBzY2hlbWEgcHJvY2Vzc0FyZ3MjU2FtcGxlU2l6ZUJJQ29ubmVjdG9yXG4gICAqL1xuICByZWFkb25seSBzYW1wbGVTaXplQmlDb25uZWN0b3I/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBkb2N1bWVudHMgcGVyIGRhdGFiYXNlIHRvIHNhbXBsZSB3aGVuIGdhdGhlcmluZyBzY2hlbWEgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgcHJvY2Vzc0FyZ3MjU2FtcGxlUmVmcmVzaEludGVydmFsQklDb25uZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IHNhbXBsZVJlZnJlc2hJbnRlcnZhbEJpQ29ubmVjdG9yPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNaW5pbXVtIHJldGVudGlvbiB3aW5kb3cgZm9yIGNsdXN0ZXIncyBvcGxvZyBleHByZXNzZWQgaW4gaG91cnMuIEEgdmFsdWUgb2YgbnVsbCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2x1c3RlciB1c2VzIHRoZSBkZWZhdWx0IG1pbmltdW0gb3Bsb2cgd2luZG93IHRoYXQgTW9uZ29EQiBDbG91ZCBjYWxjdWxhdGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIHByb2Nlc3NBcmdzI09wbG9nTWluUmV0ZW50aW9uSG91cnNcbiAgICovXG4gIHJlYWRvbmx5IG9wbG9nTWluUmV0ZW50aW9uSG91cnM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIExpZmV0aW1lLCBpbiBzZWNvbmRzLCBvZiBtdWx0aS1kb2N1bWVudCB0cmFuc2FjdGlvbnMuIEF0bGFzIGNvbnNpZGVycyB0aGUgdHJhbnNhY3Rpb25zIHRoYXQgZXhjZWVkIHRoaXMgbGltaXQgYXMgZXhwaXJlZCBhbmQgc28gYWJvcnRzIHRoZW0gdGhyb3VnaCBhIHBlcmlvZGljIGNsZWFudXAgcHJvY2Vzcy5cbiAgICpcbiAgICogQHNjaGVtYSBwcm9jZXNzQXJncyNUcmFuc2FjdGlvbkxpZmV0aW1lTGltaXRTZWNvbmRzXG4gICAqL1xuICByZWFkb25seSB0cmFuc2FjdGlvbkxpZmV0aW1lTGltaXRTZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdQcm9jZXNzQXJncycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fUHJvY2Vzc0FyZ3MoXG4gIG9iajogUHJvY2Vzc0FyZ3MgfCB1bmRlZmluZWRcbik6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBEZWZhdWx0UmVhZENvbmNlcm46IG9iai5kZWZhdWx0UmVhZENvbmNlcm4sXG4gICAgRGVmYXVsdFdyaXRlQ29uY2Vybjogb2JqLmRlZmF1bHRXcml0ZUNvbmNlcm4sXG4gICAgRmFpbEluZGV4S2V5VG9vTG9uZzogb2JqLmZhaWxJbmRleEtleVRvb0xvbmcsXG4gICAgSmF2YXNjcmlwdEVuYWJsZWQ6IG9iai5qYXZhc2NyaXB0RW5hYmxlZCxcbiAgICBNaW5pbXVtRW5hYmxlZFRMU1Byb3RvY29sOiBvYmoubWluaW11bUVuYWJsZWRUbHNQcm90b2NvbCxcbiAgICBOb1RhYmxlU2Nhbjogb2JqLm5vVGFibGVTY2FuLFxuICAgIE9wbG9nU2l6ZU1COiBvYmoub3Bsb2dTaXplTWIsXG4gICAgU2FtcGxlU2l6ZUJJQ29ubmVjdG9yOiBvYmouc2FtcGxlU2l6ZUJpQ29ubmVjdG9yLFxuICAgIFNhbXBsZVJlZnJlc2hJbnRlcnZhbEJJQ29ubmVjdG9yOiBvYmouc2FtcGxlUmVmcmVzaEludGVydmFsQmlDb25uZWN0b3IsXG4gICAgT3Bsb2dNaW5SZXRlbnRpb25Ib3Vyczogb2JqLm9wbG9nTWluUmV0ZW50aW9uSG91cnMsXG4gICAgVHJhbnNhY3Rpb25MaWZldGltZUxpbWl0U2Vjb25kczogb2JqLnRyYW5zYWN0aW9uTGlmZXRpbWVMaW1pdFNlY29uZHMsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZShcbiAgICAociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCA/IHIgOiB7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSxcbiAgICB7fVxuICApO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFNldHRpbmdzIG5lZWRlZCB0byBjb25maWd1cmUgdGhlIE1vbmdvREIgQ29ubmVjdG9yIGZvciBCdXNpbmVzcyBJbnRlbGxpZ2VuY2UgZm9yIHRoaXMgY2x1c3Rlci5cbiAqXG4gKiBAc2NoZW1hIENmbkNsdXN0ZXJQcm9wc0JpQ29ubmVjdG9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2ZuQ2x1c3RlclByb3BzQmlDb25uZWN0b3Ige1xuICAvKipcbiAgICogRGF0YSBzb3VyY2Ugbm9kZSBkZXNpZ25hdGVkIGZvciB0aGUgTW9uZ29EQiBDb25uZWN0b3IgZm9yIEJ1c2luZXNzIEludGVsbGlnZW5jZSBvbiBNb25nb0RCIENsb3VkLiBUaGUgTW9uZ29EQiBDb25uZWN0b3IgZm9yIEJ1c2luZXNzIEludGVsbGlnZW5jZSBvbiBNb25nb0RCIENsb3VkIHJlYWRzIGRhdGEgZnJvbSB0aGUgcHJpbWFyeSwgc2Vjb25kYXJ5LCBvciBhbmFseXRpY3Mgbm9kZSBiYXNlZCBvbiB5b3VyIHJlYWQgcHJlZmVyZW5jZXMuIERlZmF1bHRzIHRvIEFOQUxZVElDUyBub2RlLCBvciBTRUNPTkRBUlkgaWYgdGhlcmUgYXJlIG5vIEFOQUxZVElDUyBub2Rlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgQU5BTFlUSUNTIG5vZGUsIG9yIFNFQ09OREFSWSBpZiB0aGVyZSBhcmUgbm8gQU5BTFlUSUNTIG5vZGVzLlxuICAgKiBAc2NoZW1hIENmbkNsdXN0ZXJQcm9wc0JpQ29ubmVjdG9yI1JlYWRQcmVmZXJlbmNlXG4gICAqL1xuICByZWFkb25seSByZWFkUHJlZmVyZW5jZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIE1vbmdvREIgQ29ubmVjdG9yIGZvciBCdXNpbmVzcyBJbnRlbGxpZ2VuY2UgaXMgZW5hYmxlZCBvbiB0aGUgc3BlY2lmaWVkIGNsdXN0ZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgQ2ZuQ2x1c3RlclByb3BzQmlDb25uZWN0b3IjRW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0NmbkNsdXN0ZXJQcm9wc0JpQ29ubmVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9DZm5DbHVzdGVyUHJvcHNCaUNvbm5lY3RvcihcbiAgb2JqOiBDZm5DbHVzdGVyUHJvcHNCaUNvbm5lY3RvciB8IHVuZGVmaW5lZFxuKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIFJlYWRQcmVmZXJlbmNlOiBvYmoucmVhZFByZWZlcmVuY2UsXG4gICAgRW5hYmxlZDogb2JqLmVuYWJsZWQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZShcbiAgICAociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCA/IHIgOiB7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSxcbiAgICB7fVxuICApO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIENvbGxlY3Rpb24gb2YgVW5pZm9ybSBSZXNvdXJjZSBMb2NhdG9ycyB0aGF0IHBvaW50IHRvIHRoZSBNb25nb0RCIGRhdGFiYXNlLlxuICpcbiAqIEBzY2hlbWEgY29ubmVjdGlvblN0cmluZ3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uU3RyaW5ncyB7XG4gIC8qKlxuICAgKiBQdWJsaWMgY29ubmVjdGlvbiBzdHJpbmcgdGhhdCB5b3UgY2FuIHVzZSB0byBjb25uZWN0IHRvIHRoaXMgY2x1c3Rlci4gVGhpcyBjb25uZWN0aW9uIHN0cmluZyB1c2VzIHRoZSBtb25nb2RiOi8vIHByb3RvY29sLlxuICAgKlxuICAgKiBAc2NoZW1hIGNvbm5lY3Rpb25TdHJpbmdzI1N0YW5kYXJkXG4gICAqL1xuICByZWFkb25seSBzdGFuZGFyZD86IHN0cmluZztcblxuICAvKipcbiAgICogUHVibGljIGNvbm5lY3Rpb24gc3RyaW5nIHRoYXQgeW91IGNhbiB1c2UgdG8gY29ubmVjdCB0byB0aGlzIGNsdXN0ZXIuIFRoaXMgY29ubmVjdGlvbiBzdHJpbmcgdXNlcyB0aGUgbW9uZ29kYitzcnY6Ly8gcHJvdG9jb2wuXG4gICAqXG4gICAqIEBzY2hlbWEgY29ubmVjdGlvblN0cmluZ3MjU3RhbmRhcmRTcnZcbiAgICovXG4gIHJlYWRvbmx5IHN0YW5kYXJkU3J2Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOZXR3b3JrIHBlZXJpbmcgY29ubmVjdGlvbiBzdHJpbmdzIGZvciBlYWNoIGludGVyZmFjZSBWaXJ0dWFsIFByaXZhdGUgQ2xvdWQgKFZQQykgZW5kcG9pbnQgdGhhdCB5b3UgY29uZmlndXJlZCB0byBjb25uZWN0IHRvIHRoaXMgY2x1c3Rlci4gVGhpcyBjb25uZWN0aW9uIHN0cmluZyB1c2VzIHRoZSBtb25nb2RiK3NydjovLyBwcm90b2NvbC4gVGhlIHJlc291cmNlIHJldHVybnMgdGhpcyBwYXJhbWV0ZXIgb25jZSBzb21lb25lIGNyZWF0ZXMgYSBuZXR3b3JrIHBlZXJpbmcgY29ubmVjdGlvbiB0byB0aGlzIGNsdXN0ZXIuIFRoaXMgcHJvdG9jb2wgdGVsbHMgdGhlIGFwcGxpY2F0aW9uIHRvIGxvb2sgdXAgdGhlIGhvc3Qgc2VlZCBsaXN0IGluIHRoZSBEb21haW4gTmFtZSBTeXN0ZW0gKEROUykuIFRoaXMgbGlzdCBzeW5jaHJvbml6ZXMgd2l0aCB0aGUgbm9kZXMgaW4gYSBjbHVzdGVyLiBJZiB0aGUgY29ubmVjdGlvbiBzdHJpbmcgdXNlcyB0aGlzIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKSBmb3JtYXQsIHlvdSBkb24ndCBuZWVkIHRvIGFwcGVuZCB0aGUgc2VlZCBsaXN0IG9yIGNoYW5nZSB0aGUgVVJJIGlmIHRoZSBub2RlcyBjaGFuZ2UuIFVzZSB0aGlzIFVSSSBmb3JtYXQgaWYgeW91ciBkcml2ZXIgc3VwcG9ydHMgaXQuIElmIGl0IGRvZXNuJ3QsIHVzZSBjb25uZWN0aW9uU3RyaW5ncy5wcml2YXRlLiBGb3IgQW1hem9uIFdlYiBTZXJ2aWNlcyAoQVdTKSBjbHVzdGVycywgdGhpcyByZXNvdXJjZSByZXR1cm5zIHRoaXMgcGFyYW1ldGVyIG9ubHkgaWYgeW91IGVuYWJsZSBjdXN0b20gRE5TLlxuICAgKlxuICAgKiBAc2NoZW1hIGNvbm5lY3Rpb25TdHJpbmdzI1ByaXZhdGVcbiAgICovXG4gIHJlYWRvbmx5IHByaXZhdGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5ldHdvcmsgcGVlcmluZyBjb25uZWN0aW9uIHN0cmluZ3MgZm9yIGVhY2ggaW50ZXJmYWNlIFZpcnR1YWwgUHJpdmF0ZSBDbG91ZCAoVlBDKSBlbmRwb2ludCB0aGF0IHlvdSBjb25maWd1cmVkIHRvIGNvbm5lY3QgdG8gdGhpcyBjbHVzdGVyLiBUaGlzIGNvbm5lY3Rpb24gc3RyaW5nIHVzZXMgdGhlIG1vbmdvZGIrc3J2Oi8vIHByb3RvY29sLiBUaGUgcmVzb3VyY2UgcmV0dXJucyB0aGlzIHBhcmFtZXRlciB3aGVuIHNvbWVvbmUgY3JlYXRlcyBhIG5ldHdvcmsgcGVlcmluZyBjb25uZWN0aW9uIHRvIHRoaXMgY2x1c3Rlci4gVGhpcyBwcm90b2NvbCB0ZWxscyB0aGUgYXBwbGljYXRpb24gdG8gbG9vayB1cCB0aGUgaG9zdCBzZWVkIGxpc3QgaW4gdGhlIERvbWFpbiBOYW1lIFN5c3RlbSAoRE5TKS4gVGhpcyBsaXN0IHN5bmNocm9uaXplcyB3aXRoIHRoZSBub2RlcyBpbiBhIGNsdXN0ZXIuIElmIHRoZSBjb25uZWN0aW9uIHN0cmluZyB1c2VzIHRoaXMgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyIChVUkkpIGZvcm1hdCwgeW91IGRvbid0IG5lZWQgdG8gYXBwZW5kIHRoZSBzZWVkIGxpc3Qgb3IgY2hhbmdlIHRoZSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIgKFVSSSkgaWYgdGhlIG5vZGVzIGNoYW5nZS4gVXNlIHRoaXMgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyIChVUkkpIGZvcm1hdCBpZiB5b3VyIGRyaXZlciBzdXBwb3J0cyBpdC4gSWYgaXQgZG9lc24ndCwgdXNlIGNvbm5lY3Rpb25TdHJpbmdzLnByaXZhdGUuIEZvciBBbWF6b24gV2ViIFNlcnZpY2VzIChBV1MpIGNsdXN0ZXJzLCB0aGlzIHBhcmFtZXRlciByZXR1cm5zIG9ubHkgaWYgeW91IGVuYWJsZSBjdXN0b20gRE5TLlxuICAgKlxuICAgKiBAc2NoZW1hIGNvbm5lY3Rpb25TdHJpbmdzI1ByaXZhdGVTcnZcbiAgICovXG4gIHJlYWRvbmx5IHByaXZhdGVTcnY/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgZW5kcG9pbnQtYXdhcmUgY29ubmVjdGlvbiBzdHJpbmdzIHRoYXQgdXNlIEFXUy1ob3N0ZWQgY2x1c3RlcnMgd2l0aCBBbWF6b24gV2ViIFNlcnZpY2VzIChBV1MpIFByaXZhdGVMaW5rLiBFYWNoIGtleSBpZGVudGlmaWVzIGFuIEFtYXpvbiBXZWIgU2VydmljZXMgKEFXUykgaW50ZXJmYWNlIGVuZHBvaW50LiBFYWNoIHZhbHVlIGlkZW50aWZpZXMgdGhlIHJlbGF0ZWQgbW9uZ29kYjovLyBjb25uZWN0aW9uIHN0cmluZyB0aGF0IHlvdSB1c2UgdG8gY29ubmVjdCB0byBNb25nb0RCIENsb3VkIHRocm91Z2ggdGhlIGludGVyZmFjZSBlbmRwb2ludCB0aGF0IHRoZSBrZXkgbmFtZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgY29ubmVjdGlvblN0cmluZ3MjUHJpdmF0ZUVuZHBvaW50c1xuICAgKi9cbiAgcmVhZG9ubHkgcHJpdmF0ZUVuZHBvaW50cz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIGVuZHBvaW50LWF3YXJlIGNvbm5lY3Rpb24gc3RyaW5ncyB0aGF0IHVzZSBBV1MtaG9zdGVkIGNsdXN0ZXJzIHdpdGggQW1hem9uIFdlYiBTZXJ2aWNlcyAoQVdTKSBQcml2YXRlTGluay4gRWFjaCBrZXkgaWRlbnRpZmllcyBhbiBBbWF6b24gV2ViIFNlcnZpY2VzIChBV1MpIGludGVyZmFjZSBlbmRwb2ludC4gRWFjaCB2YWx1ZSBpZGVudGlmaWVzIHRoZSByZWxhdGVkIG1vbmdvZGI6Ly8gY29ubmVjdGlvbiBzdHJpbmcgdGhhdCB5b3UgdXNlIHRvIGNvbm5lY3QgdG8gQXRsYXMgdGhyb3VnaCB0aGUgaW50ZXJmYWNlIGVuZHBvaW50IHRoYXQgdGhlIGtleSBuYW1lcy5cbiAgICpcbiAgICogQHNjaGVtYSBjb25uZWN0aW9uU3RyaW5ncyNQcml2YXRlRW5kcG9pbnRzU3J2XG4gICAqL1xuICByZWFkb25seSBwcml2YXRlRW5kcG9pbnRzU3J2Pzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgZW5kcG9pbnQtYXdhcmUgY29ubmVjdGlvbiBzdHJpbmcgb3B0aW1pemVkIGZvciBzaGFyZGVkIGNsdXN0ZXJzIHRoYXQgdXNlcyB0aGUgYG1vbmdvZGIrc3J2Oi8vYCBwcm90b2NvbCB0byBjb25uZWN0IHRvIE1vbmdvREIgQ2xvdWQgdGhyb3VnaCBhIHByaXZhdGUgZW5kcG9pbnQuIElmIHRoZSBjb25uZWN0aW9uIHN0cmluZyB1c2VzIHRoaXMgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyIChVUkkpIGZvcm1hdCwgeW91IGRvbid0IG5lZWQgdG8gY2hhbmdlIHRoZSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIgKFVSSSkgaWYgdGhlIG5vZGVzIGNoYW5nZS4gVXNlIHRoaXMgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyIChVUkkpIGZvcm1hdCBpZiB5b3VyIGFwcGxpY2F0aW9uIGFuZCBBdGxhcyBjbHVzdGVyIHN1cHBvcnRzIGl0LiBJZiBpdCBkb2Vzbid0LCB1c2UgYW5kIGNvbnN1bHQgdGhlIGRvY3VtZW50YXRpb24gZm9yIGNvbm5lY3Rpb25TdHJpbmdzLnByaXZhdGVFbmRwb2ludFtuXS5zcnZDb25uZWN0aW9uU3RyaW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIGNvbm5lY3Rpb25TdHJpbmdzI1NSVlNoYXJkT3B0aW1pemVkQ29ubmVjdGlvblN0cmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgc3J2U2hhcmRPcHRpbWl6ZWRDb25uZWN0aW9uU3RyaW5nPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0Nvbm5lY3Rpb25TdHJpbmdzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBxdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Db25uZWN0aW9uU3RyaW5ncyhcbiAgb2JqOiBDb25uZWN0aW9uU3RyaW5ncyB8IHVuZGVmaW5lZFxuKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIFN0YW5kYXJkOiBvYmouc3RhbmRhcmQsXG4gICAgU3RhbmRhcmRTcnY6IG9iai5zdGFuZGFyZFNydixcbiAgICBQcml2YXRlOiBvYmoucHJpdmF0ZSxcbiAgICBQcml2YXRlU3J2OiBvYmoucHJpdmF0ZVNydixcbiAgICBQcml2YXRlRW5kcG9pbnRzOiBvYmoucHJpdmF0ZUVuZHBvaW50cz8ubWFwKCh5KSA9PiB5KSxcbiAgICBQcml2YXRlRW5kcG9pbnRzU3J2OiBvYmoucHJpdmF0ZUVuZHBvaW50c1Nydj8ubWFwKCh5KSA9PiB5KSxcbiAgICBTUlZTaGFyZE9wdGltaXplZENvbm5lY3Rpb25TdHJpbmc6XG4gICAgICBvYmouc3J2U2hhcmRPcHRpbWl6ZWRDb25uZWN0aW9uU3RyaW5nPy5tYXAoKHkpID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoXG4gICAgKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQgPyByIDogeyAuLi5yLCBbaVswXV06IGlbMV0gfSksXG4gICAge31cbiAgKTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBDbG91ZCBzZXJ2aWNlIHByb3ZpZGVyIHRoYXQgbWFuYWdlcyB5b3VyIGN1c3RvbWVyIGtleXMgdG8gcHJvdmlkZSBhbiBhZGRpdGlvbmFsIGxheWVyIG9mIGVuY3J5cHRpb24gYXQgcmVzdCBmb3IgdGhlIGNsdXN0ZXIuIFRvIGVuYWJsZSBjdXN0b21lciBrZXkgbWFuYWdlbWVudCBmb3IgZW5jcnlwdGlvbiBhdCByZXN0LCB0aGUgY2x1c3RlciByZXBsaWNhdGlvblNwZWNzW25dLnJlZ2lvbkNvbmZpZ3NbbV0ue3R5cGV9U3BlY3MuaW5zdGFuY2VTaXplIHNldHRpbmcgbXVzdCBiZSBNMTAgb3IgaGlnaGVyIGFuZCBcImJhY2t1cEVuYWJsZWRcIiA6IGZhbHNlIG9yIG9taXR0ZWQgZW50aX