@softchef/cdk-restapi
Version:
Easy to manage Rest-API
168 lines • 23.2 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RestApi = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway");
const constructs_1 = require("constructs");
class RestApi extends constructs_1.Construct {
constructor(scope, id, props) {
super(scope, id);
this.resources = {};
let restApiProps = {};
if (props.enableCors !== false) {
restApiProps.defaultCorsPreflightOptions = {
allowMethods: aws_apigateway_1.Cors.ALL_METHODS,
allowOrigins: aws_apigateway_1.Cors.ALL_ORIGINS,
allowHeaders: [
'Origin',
'Content-Type',
'Fetch-Mode',
'Accept',
'X-Amz-Date',
'Accept-Encoding',
'Authorization',
'cache-control',
'SyncCenter',
'X-Api-Key',
'X-Amz-Security-Token',
'X-Amz-User-Agent',
],
};
}
if (props.authorizationType) {
this.globalAuthorizationType = props.authorizationType;
}
if (props.authorizer) {
this.globalAuthorizer = props.authorizer;
}
// Use custom or create new
this.awsRestApi = props.restApi ?? new aws_apigateway_1.RestApi(this, this.node.id, {
...props,
...restApiProps,
});
// Define resources
this.addResources(props.resources);
}
get restApi() {
return this.awsRestApi;
}
get restApiId() {
return this.awsRestApi.restApiId;
}
get url() {
return this.awsRestApi.url;
}
addResources(resources) {
for (const resource of resources) {
this.addResource(resource);
}
return this;
}
addResource(resource) {
const path = `/${resource.path.replace(/^\/{1}/, '')}`.replace(/\?.*/, '').split('/');
const lastPath = path.reduce((previous, current, index) => {
const part = `${previous}/${current}`;
if (!this.resources[part]) {
if (index === 1) {
if (current === '') {
this.resources[part] = this.awsRestApi.root;
}
else {
this.resources[part] = this.awsRestApi.root.addResource(current);
}
}
else {
this.resources[part] = this.resources[previous].addResource(current);
}
}
return part;
});
const authorizationType = resource.authorizationType
?? this.globalAuthorizationType
?? aws_apigateway_1.AuthorizationType.NONE;
let integration;
let methodOptions = {};
if (resource.lambdaFunction) {
integration = new aws_apigateway_1.LambdaIntegration(resource.lambdaFunction);
}
else if (resource.networkLoadBalancer) {
const pathParameters = resource.path.match(/\/\{[\w]*\}/g) ?? [];
const queryParameters = resource.path.match(/[\w]*=\{[\w]*\}/g) ?? [];
const methodRequestParameters = {};
const integrationRequestParameters = {};
for (const pathParameter of pathParameters) {
const [, key] = pathParameter.match(/\/\{([\w]*)\}/) ?? [];
methodRequestParameters[`method.request.path.${key}`] = true;
integrationRequestParameters[`integration.request.path.${key}`] = `method.request.path.${key}`;
}
for (const queryParameter of queryParameters) {
const [, key] = queryParameter.match(/[\w]*=\{([\w]*[\?]?)\}/) ?? [];
const keyName = key.replace(/\?$/, '');
methodRequestParameters[`method.request.querystring.${keyName}`] = /\?$/.test(key);
integrationRequestParameters[`integration.request.querystring.${keyName}`] = `method.request.querystring.${keyName}`;
}
methodOptions.requestParameters = {
...methodRequestParameters,
...resource.methodOptions?.requestParameters,
};
integration = new aws_apigateway_1.Integration({
type: resource.vpcLink ? aws_apigateway_1.IntegrationType.HTTP : aws_apigateway_1.IntegrationType.HTTP_PROXY,
integrationHttpMethod: resource.httpMethod.toString(),
uri: `http://${resource.networkLoadBalancer.loadBalancerDnsName}${resource.path.replace(/\?.*/, '')}`,
options: {
connectionType: aws_apigateway_1.ConnectionType.VPC_LINK,
vpcLink: resource.vpcLink ?? resource.vpcLinkProxy,
integrationResponses: [{
statusCode: '200',
}],
requestParameters: integrationRequestParameters,
...resource.vpcLinkIntegrationOptions,
},
});
methodOptions.methodResponses = [
{
statusCode: '200',
},
...(resource.methodOptions?.methodResponses ? resource.methodOptions?.methodResponses : []),
];
}
else if (resource.integration) {
integration = resource.integration;
}
else {
throw new Error('Must provide integration props, support lambdaFunction, API Gateway Integration types');
}
switch (authorizationType) {
case aws_apigateway_1.AuthorizationType.COGNITO:
case aws_apigateway_1.AuthorizationType.CUSTOM:
let authorizer;
if (resource.authorizer) {
authorizer = resource.authorizer;
}
else if (this.globalAuthorizer) {
authorizer = this.globalAuthorizer;
}
else {
throw new Error('You specify authorization type is COGNITO, but not specify authorizer.');
}
methodOptions.authorizationType = aws_apigateway_1.AuthorizationType.COGNITO;
methodOptions.authorizer = authorizer;
break;
case aws_apigateway_1.AuthorizationType.IAM:
methodOptions.authorizationType = aws_apigateway_1.AuthorizationType.IAM;
break;
case aws_apigateway_1.AuthorizationType.NONE:
default:
}
this.resources[lastPath].addMethod(resource.httpMethod.toString(), integration, {
...resource.methodOptions,
...methodOptions,
});
return this;
}
}
exports.RestApi = RestApi;
_a = JSII_RTTI_SYMBOL_1;
RestApi[_a] = { fqn: "@softchef/cdk-restapi.RestApi", version: "2.0.183" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC1hcGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcmVzdC1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrREFZb0M7QUFDcEMsMkNBRW9CO0FBNEJwQixNQUFhLE9BQVEsU0FBUSxzQkFBUztJQVlwQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQW1CO1FBQzNELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFMWCxjQUFTLEdBRWIsRUFBRSxDQUFDO1FBS0wsSUFBSSxZQUFZLEdBRVosRUFBRSxDQUFDO1FBRVAsSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLEtBQUssRUFBRTtZQUM5QixZQUFZLENBQUMsMkJBQTJCLEdBQUc7Z0JBQ3pDLFlBQVksRUFBRSxxQkFBSSxDQUFDLFdBQVc7Z0JBQzlCLFlBQVksRUFBRSxxQkFBSSxDQUFDLFdBQVc7Z0JBQzlCLFlBQVksRUFBRTtvQkFDWixRQUFRO29CQUNSLGNBQWM7b0JBQ2QsWUFBWTtvQkFDWixRQUFRO29CQUNSLFlBQVk7b0JBQ1osaUJBQWlCO29CQUNqQixlQUFlO29CQUNmLGVBQWU7b0JBQ2YsWUFBWTtvQkFDWixXQUFXO29CQUNYLHNCQUFzQjtvQkFDdEIsa0JBQWtCO2lCQUNuQjthQUNGLENBQUM7U0FDSDtRQUVELElBQUksS0FBSyxDQUFDLGlCQUFpQixFQUFFO1lBQzNCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUM7U0FDeEQ7UUFFRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUU7WUFDcEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7U0FDMUM7UUFDRCwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksd0JBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFD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RyxVQUFVLENBQUM7Z0JBQ3RDLE1BQU07WUFDUixLQUFLLGtDQUFpQixDQUFDLEdBQUc7Z0JBQ3hCLGFBQWEsQ0FBQyxpQkFBaUIsR0FBRyxrQ0FBaUIsQ0FBQyxHQUFHLENBQUM7Z0JBQ3hELE1BQU07WUFDUixLQUFLLGtDQUFpQixDQUFDLElBQUksQ0FBQztZQUM1QixRQUFRO1NBQ1Q7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FDaEMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsRUFDOUIsV0FBVyxFQUNYO1lBQ0UsR0FBRyxRQUFRLENBQUMsYUFBYTtZQUN6QixHQUFtQixhQUFhO1NBQ2pDLENBQ0YsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7QUFuTEgsMEJBb0xDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXV0aG9yaXphdGlvblR5cGUsXG4gIENvbm5lY3Rpb25UeXBlLFxuICBDb3JzLFxuICBJQXV0aG9yaXplcixcbiAgSW50ZWdyYXRpb24sXG4gIEludGVncmF0aW9uVHlwZSxcbiAgTGFtYmRhSW50ZWdyYXRpb24sXG4gIE1ldGhvZE9wdGlvbnMsXG4gIFJlc291cmNlLFxuICBSZXN0QXBpIGFzIEF3c1Jlc3RBcGksXG4gIFJlc3RBcGlQcm9wcyBhcyBBd3NSZXN0QXBpUHJvcHMsXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5JztcbmltcG9ydCB7XG4gIENvbnN0cnVjdCxcbn0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge1xuICBSZXN0QXBpUmVzb3VyY2VQcm9wcyxcbn0gZnJvbSAnLi9yZXNvdXJjZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdEFwaVByb3BzIGV4dGVuZHMgQXdzUmVzdEFwaVByb3BzIHtcbiAgLyoqXG4gICAqIEN1c3RvbSBSZXN0QXBpXG4gICAqL1xuICByZWFkb25seSByZXN0QXBpPzogQXdzUmVzdEFwaTtcbiAgLyoqXG4gICAqIERlZmluZSBSZXN0IEFQSSByZXNvdXJjZXNcbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlczogUmVzdEFwaVJlc291cmNlUHJvcHNbXTtcbiAgLyoqXG4gICAqIEVuYWJsZSBjb3JzLCBkZWZhdWx0IGlzIHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUNvcnM/OiBib29sZWFuO1xuICAvKipcbiAgICogU3BlY2lmeSBnbG9iYWxseSBBdXRob3JpemF0aW9uVHlwZSBieSBhd3MtYXBpZ2F0ZXdheS5BdXRob3JpemF0aW9uVHlwZSwgZGVmYXVsdCBpcyBOT05FXG4gICAqL1xuICByZWFkb25seSBhdXRob3JpemF0aW9uVHlwZT86IEF1dGhvcml6YXRpb25UeXBlO1xuICAvKipcbiAgICogU3BlY2lmeSBnbG9iYWxseSBBdXRob3JpemVyIGJ5IGF3cy1BdXRob3JpemVyLCBkZWZhdWx0IGlzIG51bGxcbiAgICovXG4gIHJlYWRvbmx5IGF1dGhvcml6ZXI/OiBJQXV0aG9yaXplciB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGNsYXNzIFJlc3RBcGkgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuXG4gIHByaXZhdGUgZ2xvYmFsQXV0aG9yaXphdGlvblR5cGU/OiBBdXRob3JpemF0aW9uVHlwZSB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGdsb2JhbEF1dGhvcml6ZXI/OiBJQXV0aG9yaXplciB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGF3c1Jlc3RBcGk6IEF3c1Jlc3RBcGk7XG5cbiAgcHJpdmF0ZSByZXNvdXJjZXM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBSZXNvdXJjZTtcbiAgfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBSZXN0QXBpUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgbGV0IHJlc3RBcGlQcm9wczoge1xuICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgIH0gPSB7fTtcblxuICAgIGlmIChwcm9wcy5lbmFibGVDb3JzICE9PSBmYWxzZSkge1xuICAgICAgcmVzdEFwaVByb3BzLmRlZmF1bHRDb3JzUHJlZmxpZ2h0T3B0aW9ucyA9IHtcbiAgICAgICAgYWxsb3dNZXRob2RzOiBDb3JzLkFMTF9NRVRIT0RTLFxuICAgICAgICBhbGxvd09yaWdpbnM6IENvcnMuQUxMX09SSUdJTlMsXG4gICAgICAgIGFsbG93SGVhZGVyczogW1xuICAgICAgICAgICdPcmlnaW4nLFxuICAgICAgICAgICdDb250ZW50LVR5cGUnLFxuICAgICAgICAgICdGZXRjaC1Nb2RlJyxcbiAgICAgICAgICAnQWNjZXB0JyxcbiAgICAgICAgICAnWC1BbXotRGF0ZScsXG4gICAgICAgICAgJ0FjY2VwdC1FbmNvZGluZycsXG4gICAgICAgICAgJ0F1dGhvcml6YXRpb24nLFxuICAgICAgICAgICdjYWNoZS1jb250cm9sJyxcbiAgICAgICAgICAnU3luY0NlbnRlcicsXG4gICAgICAgICAgJ1gtQXBpLUtleScsXG4gICAgICAgICAgJ1gtQW16LVNlY3VyaXR5LVRva2VuJyxcbiAgICAgICAgICAnWC1BbXotVXNlci1BZ2VudCcsXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5hdXRob3JpemF0aW9uVHlwZSkge1xuICAgICAgdGhpcy5nbG9iYWxBdXRob3JpemF0aW9uVHlwZSA9IHByb3BzLmF1dGhvcml6YXRpb25UeXBlO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5hdXRob3JpemVyKSB7XG4gICAgICB0aGlzLmdsb2JhbEF1dGhvcml6ZXIgPSBwcm9wcy5hdXRob3JpemVyO1xuICAgIH1cbiAgICAvLyBVc2UgY3VzdG9tIG9yIGNyZWF0ZSBuZXdcbiAgICB0aGlzLmF3c1Jlc3RBcGkgPSBwcm9wcy5yZXN0QXBpID8/IG5ldyBBd3NSZXN0QXBpKHRoaXMsIHRoaXMubm9kZS5pZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICAuLi5yZXN0QXBpUHJvcHMsXG4gICAgfSk7XG4gICAgLy8gRGVmaW5lIHJlc291cmNlc1xuICAgIHRoaXMuYWRkUmVzb3VyY2VzKHByb3BzLnJlc291cmNlcyk7XG4gIH1cblxuICBnZXQgcmVzdEFwaSgpOiBBd3NSZXN0QXBpIHtcbiAgICByZXR1cm4gdGhpcy5hd3NSZXN0QXBpO1xuICB9XG5cbiAgZ2V0IHJlc3RBcGlJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmF3c1Jlc3RBcGkucmVzdEFwaUlkO1xuICB9XG5cbiAgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmF3c1Jlc3RBcGkudXJsO1xuICB9XG5cbiAgcHVibGljIGFkZFJlc291cmNlcyhyZXNvdXJjZXM6IFJlc3RBcGlSZXNvdXJjZVByb3BzW10pOiB0aGlzIHtcbiAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJlc291cmNlcykge1xuICAgICAgdGhpcy5hZGRSZXNvdXJjZShyZXNvdXJjZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIGFkZFJlc291cmNlKHJlc291cmNlOiBSZXN0QXBpUmVzb3VyY2VQcm9wcyk6IHRoaXMge1xuICAgIGNvbnN0IHBhdGg6IHN0cmluZ1tdID0gYC8ke3Jlc291cmNlLnBhdGgucmVwbGFjZSgvXlxcL3sxfS8sICcnKX1gLnJlcGxhY2UoL1xcPy4qLywgJycpLnNwbGl0KCcvJyk7XG4gICAgY29uc3QgbGFzdFBhdGggPSBwYXRoLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwYXJ0OiBzdHJpbmcgPSBgJHtwcmV2aW91c30vJHtjdXJyZW50fWA7XG4gICAgICBpZiAoIXRoaXMucmVzb3VyY2VzW3BhcnRdKSB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMSkge1xuICAgICAgICAgIGlmIChjdXJyZW50ID09PSAnJykge1xuICAgICAgICAgICAgdGhpcy5yZXNvdXJjZXNbcGFydF0gPSA8UmVzb3VyY2U+IHRoaXMuYXdzUmVzdEFwaS5yb290O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc291cmNlc1twYXJ0XSA9IHRoaXMuYXdzUmVzdEFwaS5yb290LmFkZFJlc291cmNlKGN1cnJlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlc291cmNlc1twYXJ0XSA9IHRoaXMucmVzb3VyY2VzW3ByZXZpb3VzXS5hZGRSZXNvdXJjZShjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcnQ7XG4gICAgfSk7XG4gICAgY29uc3QgYXV0aG9yaXphdGlvblR5cGU6IEF1dGhvcml6YXRpb25UeXBlID0gcmVzb3VyY2UuYXV0aG9yaXphdGlvblR5cGVcbiAgICAgID8/IHRoaXMuZ2xvYmFsQXV0aG9yaXphdGlvblR5cGVcbiAgICAgID8/IEF1dGhvcml6YXRpb25UeXBlLk5PTkU7XG4gICAgbGV0IGludGVncmF0aW9uOiBJbnRlZ3JhdGlvbjtcbiAgICBsZXQgbWV0aG9kT3B0aW9uczoge1xuICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgIH0gPSB7fTtcbiAgICBpZiAocmVzb3VyY2UubGFtYmRhRnVuY3Rpb24pIHtcbiAgICAgIGludGVncmF0aW9uID0gbmV3IExhbWJkYUludGVncmF0aW9uKHJlc291cmNlLmxhbWJkYUZ1bmN0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHJlc291cmNlLm5ldHdvcmtMb2FkQmFsYW5jZXIpIHtcbiAgICAgIGNvbnN0IHBhdGhQYXJhbWV0ZXJzID0gcmVzb3VyY2UucGF0aC5tYXRjaCgvXFwvXFx7W1xcd10qXFx9L2cpID8/IFtdO1xuICAgICAgY29uc3QgcXVlcnlQYXJhbWV0ZXJzID0gcmVzb3VyY2UucGF0aC5tYXRjaCgvW1xcd10qPVxce1tcXHddKlxcfS9nKSA/PyBbXTtcbiAgICAgIGNvbnN0IG1ldGhvZFJlcXVlc3RQYXJhbWV0ZXJzOiB7XG4gICAgICAgIFtrZXk6IHN0cmluZ106IGJvb2xlYW47XG4gICAgICB9ID0ge307XG4gICAgICBjb25zdCBpbnRlZ3JhdGlvblJlcXVlc3RQYXJhbWV0ZXJzOiB7XG4gICAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgICAgIH0gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgcGF0aFBhcmFtZXRlciBvZiBwYXRoUGFyYW1ldGVycykge1xuICAgICAgICBjb25zdCBbLCBrZXldID0gcGF0aFBhcmFtZXRlci5tYXRjaCgvXFwvXFx7KFtcXHddKilcXH0vKSA/PyBbXTtcbiAgICAgICAgbWV0aG9kUmVxdWVzdFBhcmFtZXRlcnNbYG1ldGhvZC5yZXF1ZXN0LnBhdGguJHtrZXl9YF0gPSB0cnVlO1xuICAgICAgICBpbnRlZ3JhdGlvblJlcXVlc3RQYXJhbWV0ZXJzW2BpbnRlZ3JhdGlvbi5yZXF1ZXN0LnBhdGguJHtrZXl9YF0gPSBgbWV0aG9kLnJlcXVlc3QucGF0aC4ke2tleX1gO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBxdWVyeVBhcmFtZXRlciBvZiBxdWVyeVBhcmFtZXRlcnMpIHtcbiAgICAgICAgY29uc3QgWywga2V5XSA9IHF1ZXJ5UGFyYW1ldGVyLm1hdGNoKC9bXFx3XSo9XFx7KFtcXHddKltcXD9dPylcXH0vKSA/PyBbXTtcbiAgICAgICAgY29uc3Qga2V5TmFtZSA9IGtleS5yZXBsYWNlKC9cXD8kLywgJycpO1xuICAgICAgICBtZXRob2RSZXF1ZXN0UGFyYW1ldGVyc1tgbWV0aG9kLnJlcXVlc3QucXVlcnlzdHJpbmcuJHtrZXlOYW1lfWBdID0gL1xcPyQvLnRlc3Qoa2V5KTtcbiAgICAgICAgaW50ZWdyYXRpb25SZXF1ZXN0UGFyYW1ldGVyc1tgaW50ZWdyYXRpb24ucmVxdWVzdC5xdWVyeXN0cmluZy4ke2tleU5hbWV9YF0gPSBgbWV0aG9kLnJlcXVlc3QucXVlcnlzdHJpbmcuJHtrZXlOYW1lfWA7XG4gICAgICB9XG4gICAgICBtZXRob2RPcHRpb25zLnJlcXVlc3RQYXJhbWV0ZXJzID0ge1xuICAgICAgICAuLi5tZXRob2RSZXF1ZXN0UGFyYW1ldGVycyxcbiAgICAgICAgLi4ucmVzb3VyY2UubWV0aG9kT3B0aW9ucz8ucmVxdWVzdFBhcmFtZXRlcnMsXG4gICAgICB9O1xuICAgICAgaW50ZWdyYXRpb24gPSBuZXcgSW50ZWdyYXRpb24oe1xuICAgICAgICB0eXBlOiByZXNvdXJjZS52cGNMaW5rID8gSW50ZWdyYXRpb25UeXBlLkhUVFAgOiBJbnRlZ3JhdGlvblR5cGUuSFRUUF9QUk9YWSxcbiAgICAgICAgaW50ZWdyYXRpb25IdHRwTWV0aG9kOiByZXNvdXJjZS5odHRwTWV0aG9kLnRvU3RyaW5nKCksXG4gICAgICAgIHVyaTogYGh0dHA6Ly8ke3Jlc291cmNlLm5ldHdvcmtMb2FkQmFsYW5jZXIubG9hZEJhbGFuY2VyRG5zTmFtZX0ke3Jlc291cmNlLnBhdGgucmVwbGFjZSgvXFw/LiovLCAnJyl9YCxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGNvbm5lY3Rpb25UeXBlOiBDb25uZWN0aW9uVHlwZS5WUENfTElOSyxcbiAgICAgICAgICB2cGNMaW5rOiByZXNvdXJjZS52cGNMaW5rID8/IHJlc291cmNlLnZwY0xpbmtQcm94eSxcbiAgICAgICAgICBpbnRlZ3JhdGlvblJlc3BvbnNlczogW3tcbiAgICAgICAgICAgIHN0YXR1c0NvZGU6ICcyMDAnLFxuICAgICAgICAgIH1dLFxuICAgICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzOiBpbnRlZ3JhdGlvblJlcXVlc3RQYXJhbWV0ZXJzLFxuICAgICAgICAgIC4uLnJlc291cmNlLnZwY0xpbmtJbnRlZ3JhdGlvbk9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIG1ldGhvZE9wdGlvbnMubWV0aG9kUmVzcG9uc2VzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgc3RhdHVzQ29kZTogJzIwMCcsXG4gICAgICAgIH0sXG4gICAgICAgIC4uLihyZXNvdXJjZS5tZXRob2RPcHRpb25zPy5tZXRob2RSZXNwb25zZXMgPyByZXNvdXJjZS5tZXRob2RPcHRpb25zPy5tZXRob2RSZXNwb25zZXMgOiBbXSksXG4gICAgICBdO1xuICAgIH0gZWxzZSBpZiAocmVzb3VyY2UuaW50ZWdyYXRpb24pIHtcbiAgICAgIGludGVncmF0aW9uID0gcmVzb3VyY2UuaW50ZWdyYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBwcm92aWRlIGludGVncmF0aW9uIHByb3BzLCBzdXBwb3J0IGxhbWJkYUZ1bmN0aW9uLCBBUEkgR2F0ZXdheSBJbnRlZ3JhdGlvbiB0eXBlcycpO1xuICAgIH1cbiAgICBzd2l0Y2ggKGF1dGhvcml6YXRpb25UeXBlKSB7XG4gICAgICBjYXNlIEF1dGhvcml6YXRpb25UeXBlLkNPR05JVE86XG4gICAgICBjYXNlIEF1dGhvcml6YXRpb25UeXBlLkNVU1RPTTpcbiAgICAgICAgbGV0IGF1dGhvcml6ZXI6IElBdXRob3JpemVyO1xuICAgICAgICBpZiAocmVzb3VyY2UuYXV0aG9yaXplcikge1xuICAgICAgICAgIGF1dGhvcml6ZXIgPSByZXNvdXJjZS5hdXRob3JpemVyO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2xvYmFsQXV0aG9yaXplcikge1xuICAgICAgICAgIGF1dGhvcml6ZXIgPSB0aGlzLmdsb2JhbEF1dGhvcml6ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3Ugc3BlY2lmeSBhdXRob3JpemF0aW9uIHR5cGUgaXMgQ09HTklUTywgYnV0IG5vdCBzcGVjaWZ5IGF1dGhvcml6ZXIuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbWV0aG9kT3B0aW9ucy5hdXRob3JpemF0aW9uVHlwZSA9IEF1dGhvcml6YXRpb25UeXBlLkNPR05JVE87XG4gICAgICAgIG1ldGhvZE9wdGlvbnMuYXV0aG9yaXplciA9IGF1dGhvcml6ZXI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBdXRob3JpemF0aW9uVHlwZS5JQU06XG4gICAgICAgIG1ldGhvZE9wdGlvbnMuYXV0aG9yaXphdGlvblR5cGUgPSBBdXRob3JpemF0aW9uVHlwZS5JQU07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBdXRob3JpemF0aW9uVHlwZS5OT05FOlxuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gICAgdGhpcy5yZXNvdXJjZXNbbGFzdFBhdGhdLmFkZE1ldGhvZChcbiAgICAgIHJlc291cmNlLmh0dHBNZXRob2QudG9TdHJpbmcoKSxcbiAgICAgIGludGVncmF0aW9uLFxuICAgICAge1xuICAgICAgICAuLi5yZXNvdXJjZS5tZXRob2RPcHRpb25zLFxuICAgICAgICAuLi48TWV0aG9kT3B0aW9ucz4gbWV0aG9kT3B0aW9ucyxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufSJdfQ==