@aws/pdk
Version:
All documentation is located at: https://aws.github.io/aws-pdk
528 lines • 88.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateDocsProjects = exports.generateAsyncLibraryProjects = exports.generateAsyncModelProject = exports.generateModelProject = exports.generateLibraryProjects = exports.generateAsyncRuntimeProjects = exports.generateRuntimeProjects = exports.generateAsyncHandlersProjects = exports.generateHandlersProjects = exports._generateInfraProject = exports.generateAsyncInfraProject = exports.generateInfraProject = void 0;
/*! Copyright [Amazon.com](http://amazon.com/), Inc. or its affiliates. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0 */
const path = require("path");
const log4js_1 = require("log4js");
const projen_1 = require("projen");
const languages_1 = require("../languages");
const generated_asyncapi_html_documentation_project_1 = require("./documentation/generated-asyncapi-html-documentation-project");
const generated_asyncapi_markdown_documentation_project_1 = require("./documentation/generated-asyncapi-markdown-documentation-project");
const generated_html_redoc_documentation_project_1 = require("./documentation/generated-html-redoc-documentation-project");
const generated_markdown_documentation_project_1 = require("./documentation/generated-markdown-documentation-project");
const generated_plantuml_documentation_project_1 = require("./documentation/generated-plantuml-documentation-project");
const generated_java_async_handlers_project_1 = require("./handlers/generated-java-async-handlers-project");
const generated_java_handlers_project_1 = require("./handlers/generated-java-handlers-project");
const generated_python_async_handlers_project_1 = require("./handlers/generated-python-async-handlers-project");
const generated_python_handlers_project_1 = require("./handlers/generated-python-handlers-project");
const generated_typescript_async_handlers_project_1 = require("./handlers/generated-typescript-async-handlers-project");
const generated_typescript_handlers_project_1 = require("./handlers/generated-typescript-handlers-project");
const generated_java_async_cdk_infrastructure_project_1 = require("./infrastructure/cdk/generated-java-async-cdk-infrastructure-project");
const generated_java_cdk_infrastructure_project_1 = require("./infrastructure/cdk/generated-java-cdk-infrastructure-project");
const generated_python_async_cdk_infrastructure_project_1 = require("./infrastructure/cdk/generated-python-async-cdk-infrastructure-project");
const generated_python_cdk_infrastructure_project_1 = require("./infrastructure/cdk/generated-python-cdk-infrastructure-project");
const generated_typescript_async_cdk_infrastructure_project_1 = require("./infrastructure/cdk/generated-typescript-async-cdk-infrastructure-project");
const generated_typescript_cdk_infrastructure_project_1 = require("./infrastructure/cdk/generated-typescript-cdk-infrastructure-project");
const typescript_react_query_hooks_library_1 = require("./library/typescript-react-query-hooks-library");
const typescript_websocket_client_library_1 = require("./library/typescript-websocket-client-library");
const typescript_websocket_hooks_library_1 = require("./library/typescript-websocket-hooks-library");
const generated_java_async_runtime_project_1 = require("./runtime/generated-java-async-runtime-project");
const generated_java_runtime_project_1 = require("./runtime/generated-java-runtime-project");
const generated_python_async_runtime_project_1 = require("./runtime/generated-python-async-runtime-project");
const generated_python_runtime_project_1 = require("./runtime/generated-python-runtime-project");
const generated_typescript_async_runtime_project_1 = require("./runtime/generated-typescript-async-runtime-project");
const generated_typescript_runtime_project_1 = require("./runtime/generated-typescript-runtime-project");
const open_api_async_model_project_1 = require("../model/openapi/open-api-async-model-project");
const open_api_model_project_1 = require("../model/openapi/open-api-model-project");
const smithy_async_model_project_1 = require("../model/smithy/smithy-async-model-project");
const smithy_model_project_1 = require("../model/smithy/smithy-model-project");
const type_spec_async_model_project_1 = require("../model/type-spec/type-spec-async-model-project");
const type_spec_model_project_1 = require("../model/type-spec/type-spec-model-project");
const types_1 = require("../types");
const logger = (0, log4js_1.getLogger)();
// No dashes or underscores since this is used in the package name in imports
const sanitiseJavaProjectName = (name) => name.replace(/@/g, "").replace(/[\-/_]/g, "");
// kebab-case for java artifact ids
const sanitiseJavaArtifactId = (name) => name.replace(/@/g, "").replace(/[/_]/g, "-");
// kebab-case for typescript packages
const sanitiseTypescriptPackageName = (name) => name.replace(/_/g, "-");
// snake_case for python modules
const sanitisePythonModuleName = (name) => name.replace(/@/g, "").replace(/[\-/]/g, "_");
// Use dashes in project name since distributable's PKG-INFO always converts _ to -
// https://stackoverflow.com/questions/36300788/python-package-wheel-pkg-info-name
const sanitisePythonPackageName = (name) => name.replace(/@/g, "").replace(/[_/]/g, "-");
const generateLanguageProject = (suffix, language, projectConstructors, options) => {
const packageName = `${options.parentPackageName}-${language}-${suffix}`;
const commonOptions = {
outdir: path.join(options.generatedCodeDir, language),
specPath: options.parsedSpecPath,
parent: options.parent,
};
switch (language) {
case languages_1.Language.TYPESCRIPT: {
logger.trace(`Attempting to generate TYPESCRIPT ${suffix} project.`);
return new projectConstructors[language]({
...options,
...commonOptions,
name: sanitiseTypescriptPackageName(packageName),
...options.typescriptOptions,
isWithinMonorepo: options.isWithinMonorepo,
});
}
case languages_1.Language.PYTHON: {
logger.trace(`Attempting to generate PYTHON ${suffix} project.`);
return new projectConstructors[language]({
...options,
...commonOptions,
name: sanitisePythonPackageName(packageName),
moduleName: sanitisePythonModuleName(packageName),
...options.pythonOptions,
});
}
case languages_1.Language.JAVA: {
logger.trace(`Attempting to generate JAVA ${suffix} project.`);
return new projectConstructors[language]({
...options,
...commonOptions,
name: sanitiseJavaProjectName(packageName),
artifactId: sanitiseJavaArtifactId(packageName),
groupId: "com.generated.api",
...options.javaOptions,
});
}
default:
throw new Error(`Unknown ${suffix} language ${language}`);
}
};
const generateLanguageProjects = (suffix, languages, projectConstructors, options) => {
const projects = {};
languages.forEach((language) => {
const project = generateLanguageProject(suffix, language, projectConstructors, options);
if (project != null) {
projects[language] = project;
}
});
return projects;
};
/**
* Returns a generated infrastructure project for the given language
*/
const generateInfraProject = (language, options) => {
return (0, exports._generateInfraProject)(language, {
[languages_1.Language.JAVA]: generated_java_cdk_infrastructure_project_1.GeneratedJavaCdkInfrastructureProject,
[languages_1.Language.PYTHON]: generated_python_cdk_infrastructure_project_1.GeneratedPythonCdkInfrastructureProject,
[languages_1.Language.TYPESCRIPT]: generated_typescript_cdk_infrastructure_project_1.GeneratedTypescriptCdkInfrastructureProject,
}, options);
};
exports.generateInfraProject = generateInfraProject;
/**
* Returns a generated async infrastructure project for the given language
*/
const generateAsyncInfraProject = (language, options) => {
return (0, exports._generateInfraProject)(language, {
[languages_1.Language.JAVA]: generated_java_async_cdk_infrastructure_project_1.GeneratedJavaAsyncCdkInfrastructureProject,
[languages_1.Language.PYTHON]: generated_python_async_cdk_infrastructure_project_1.GeneratedPythonAsyncCdkInfrastructureProject,
[languages_1.Language.TYPESCRIPT]: generated_typescript_async_cdk_infrastructure_project_1.GeneratedTypescriptAsyncCdkInfrastructureProject,
}, options);
};
exports.generateAsyncInfraProject = generateAsyncInfraProject;
const _generateInfraProject = (language, projectConstructors, options) => {
new projen_1.TextFile(options.parent, path.join(options.generatedCodeDir, "README.md"), {
lines: [
"## Generated Infrastructure",
"",
"This directory contains a generated type-safe CDK construct which can provision the API gateway infrastructure for an API based on your model.",
],
readonly: true,
});
return generateLanguageProject("infra", language, projectConstructors, {
...options,
typescriptOptions: {
...options.typescriptOptions,
generatedTypescriptTypes: options.generatedRuntimes.typescript,
},
pythonOptions: {
...options.pythonOptions,
generatedPythonTypes: options.generatedRuntimes.python,
},
javaOptions: {
...options.javaOptions,
generatedJavaTypes: options.generatedRuntimes.java,
},
});
};
exports._generateInfraProject = _generateInfraProject;
/**
* Create handlers projects in the given languages
* @param languages the languages to generate for
* @param options options for the projects to be created
*/
const generateHandlersProjects = (languages, options) => {
return _generateHandlersProjects(languages, {
[languages_1.Language.JAVA]: generated_java_handlers_project_1.GeneratedJavaHandlersProject,
[languages_1.Language.PYTHON]: generated_python_handlers_project_1.GeneratedPythonHandlersProject,
[languages_1.Language.TYPESCRIPT]: generated_typescript_handlers_project_1.GeneratedTypescriptHandlersProject,
}, options);
};
exports.generateHandlersProjects = generateHandlersProjects;
/**
* Create async handlers projects in the given languages
* @param languages the languages to generate for
* @param options options for the projects to be created
*/
const generateAsyncHandlersProjects = (languages, options) => {
return _generateHandlersProjects(languages, {
[languages_1.Language.JAVA]: generated_java_async_handlers_project_1.GeneratedJavaAsyncHandlersProject,
[languages_1.Language.PYTHON]: generated_python_async_handlers_project_1.GeneratedPythonAsyncHandlersProject,
[languages_1.Language.TYPESCRIPT]: generated_typescript_async_handlers_project_1.GeneratedTypescriptAsyncHandlersProject,
}, options);
};
exports.generateAsyncHandlersProjects = generateAsyncHandlersProjects;
const _generateHandlersProjects = (languages, projectConstructors, options) => {
if (languages.length > 0) {
new projen_1.TextFile(options.parent, path.join(options.generatedCodeDir, "README.md"), {
lines: [
"## Handlers",
"",
"This directory contains lambda handlers for implementing your API.",
"",
"Whenever an operation is annotated with the `@handler` trait in Smithy (or the `x-handler` vendor extension in OpenAPI), a stub handler implementation will be generated for you, which you are free to modify.",
],
readonly: true,
});
}
return generateLanguageProjects("handlers", languages, projectConstructors, {
...options,
typescriptOptions: {
...options.typescriptOptions,
generatedTypescriptTypes: options.generatedRuntimes.typescript,
},
pythonOptions: {
...options.pythonOptions,
generatedPythonTypes: options.generatedRuntimes.python,
},
javaOptions: {
...options.javaOptions,
generatedJavaTypes: options.generatedRuntimes.java,
},
});
};
/**
* Create runtime projects in the given languages
* @param languages the languages to generate for
* @param options options for the projects to be created
*/
const generateRuntimeProjects = (languages, options) => {
return _generateRuntimeProjects(languages, {
[languages_1.Language.JAVA]: generated_java_runtime_project_1.GeneratedJavaRuntimeProject,
[languages_1.Language.PYTHON]: generated_python_runtime_project_1.GeneratedPythonRuntimeProject,
[languages_1.Language.TYPESCRIPT]: generated_typescript_runtime_project_1.GeneratedTypescriptRuntimeProject,
}, options);
};
exports.generateRuntimeProjects = generateRuntimeProjects;
/**
* Create async runtime projects in the given languages
* @param languages the languages to generate for
* @param options options for the projects to be created
*/
const generateAsyncRuntimeProjects = (languages, options) => {
return _generateRuntimeProjects(languages, {
[languages_1.Language.JAVA]: generated_java_async_runtime_project_1.GeneratedJavaAsyncRuntimeProject,
[languages_1.Language.PYTHON]: generated_python_async_runtime_project_1.GeneratedPythonAsyncRuntimeProject,
[languages_1.Language.TYPESCRIPT]: generated_typescript_async_runtime_project_1.GeneratedTypescriptAsyncRuntimeProject,
}, options);
};
exports.generateAsyncRuntimeProjects = generateAsyncRuntimeProjects;
const _generateRuntimeProjects = (languages, projectConstructors, options) => {
new projen_1.TextFile(options.parent, path.join(options.generatedCodeDir, "README.md"), {
lines: [
"## Generated Runtimes",
"",
"This directory contains generated runtime projects based on your API model.",
"",
"Each runtime project includes types from your API model, as well as type-safe client and server code.",
],
readonly: true,
});
return generateLanguageProjects("runtime", languages, projectConstructors, options);
};
/**
* Returns a generated client project for the given language
*/
const generateLibraryProject = (library, options) => {
const packageName = `${options.parentPackageName}-${library}`;
const commonOptions = {
outdir: path.join(options.generatedCodeDir, library),
specPath: options.parsedSpecPath,
parent: options.parent,
};
switch (library) {
case languages_1.Library.TYPESCRIPT_REACT_QUERY_HOOKS: {
return new typescript_react_query_hooks_library_1.TypescriptReactQueryHooksLibrary({
...commonOptions,
name: sanitiseTypescriptPackageName(packageName),
...options.typescriptReactQueryHooksOptions,
isWithinMonorepo: options.isWithinMonorepo,
});
}
default:
throw new Error(`Unknown library ${library}`);
}
};
/**
* Create library projects
* @param libraries the libraries to generate for
* @param options options for the projects to be created
*/
const generateLibraryProjects = (libraries, options) => {
if (libraries.length > 0) {
new projen_1.TextFile(options.parent, path.join(options.generatedCodeDir, "README.md"), {
lines: [
"## Generated Libraries",
"",
"This directory contains generated libraries based on your API model.",
],
readonly: true,
});
}
const generatedLibraries = {};
libraries.forEach((library) => {
const project = generateLibraryProject(library, options);
if (project != null) {
generatedLibraries[library] = project;
}
});
return generatedLibraries;
};
exports.generateLibraryProjects = generateLibraryProjects;
const generateModelProject = ({ modelLanguage, modelOptions, ...options }) => {
if (modelLanguage === types_1.ModelLanguage.SMITHY) {
if (!modelOptions.smithy) {
throw new Error(`modelOptions.smithy is required when selected model language is ${types_1.ModelLanguage.SMITHY}`);
}
const smithy = new smithy_model_project_1.SmithyModelProject({
...options,
smithyOptions: modelOptions.smithy,
});
return {
smithy,
parsedSpecFile: options.parsedSpecFile,
apiName: smithy.apiName,
outdir: smithy.outdir,
};
}
else if (modelLanguage === types_1.ModelLanguage.OPENAPI) {
if (!modelOptions.openapi) {
throw new Error(`modelOptions.openapi is required when selected model language is ${types_1.ModelLanguage.OPENAPI}`);
}
const openapi = new open_api_model_project_1.OpenApiModelProject({
...options,
openApiOptions: modelOptions.openapi,
});
return {
openapi,
parsedSpecFile: options.parsedSpecFile,
apiName: openapi.apiName,
outdir: openapi.outdir,
};
}
else if (modelLanguage === types_1.ModelLanguage.TYPESPEC) {
if (!modelOptions.typeSpec) {
throw new Error(`modelOptions.typeSpec is required when selected model language is ${types_1.ModelLanguage.TYPESPEC}`);
}
const typeSpec = new type_spec_model_project_1.TypeSpecModelProject({
...options,
name: sanitiseTypescriptPackageName(options.name),
typeSpecOptions: modelOptions.typeSpec,
});
return {
typeSpec,
parsedSpecFile: options.parsedSpecFile,
apiName: typeSpec.apiName,
outdir: typeSpec.outdir,
};
}
else {
throw new Error(`Unknown model language ${modelLanguage}`);
}
};
exports.generateModelProject = generateModelProject;
const generateAsyncModelProject = ({ modelLanguage, modelOptions, ...options }) => {
if (modelLanguage === types_1.ModelLanguage.SMITHY) {
if (!modelOptions.smithy) {
throw new Error(`modelOptions.smithy is required when selected model language is ${types_1.ModelLanguage.SMITHY}`);
}
const smithy = new smithy_async_model_project_1.SmithyAsyncModelProject({
...options,
smithyOptions: modelOptions.smithy,
});
return {
smithy,
parsedSpecFile: options.parsedSpecFile,
asyncApiSpecFile: options.asyncApiSpecFile,
apiName: smithy.apiName,
outdir: smithy.outdir,
};
}
else if (modelLanguage === types_1.ModelLanguage.OPENAPI) {
if (!modelOptions.openapi) {
throw new Error(`modelOptions.openapi is required when selected model language is ${types_1.ModelLanguage.OPENAPI}`);
}
const openapi = new open_api_async_model_project_1.OpenApiAsyncModelProject({
...options,
openApiOptions: modelOptions.openapi,
});
return {
openapi,
parsedSpecFile: options.parsedSpecFile,
asyncApiSpecFile: options.asyncApiSpecFile,
apiName: openapi.apiName,
outdir: openapi.outdir,
};
}
else if (modelLanguage === types_1.ModelLanguage.TYPESPEC) {
if (!modelOptions.typeSpec) {
throw new Error(`modelOptions.typeSpec is required when selected model language is ${types_1.ModelLanguage.TYPESPEC}`);
}
const typeSpec = new type_spec_async_model_project_1.TypeSpecAsyncModelProject({
...options,
name: sanitiseTypescriptPackageName(options.name),
typeSpecOptions: modelOptions.typeSpec,
});
return {
typeSpec,
parsedSpecFile: options.parsedSpecFile,
asyncApiSpecFile: options.asyncApiSpecFile,
apiName: typeSpec.apiName,
outdir: typeSpec.outdir,
};
}
else {
throw new Error(`Unknown model language ${modelLanguage}`);
}
};
exports.generateAsyncModelProject = generateAsyncModelProject;
/**
* Returns a generated client project for the given language
*/
const generateAsyncLibraryProject = (library, options) => {
const packageName = `${options.parentPackageName}-${library}`;
const commonOptions = {
outdir: path.join(options.generatedCodeDir, library),
specPath: options.parsedSpecPath,
parent: options.parent,
};
switch (library) {
case languages_1.WebSocketLibrary.TYPESCRIPT_WEBSOCKET_CLIENT: {
return new typescript_websocket_client_library_1.TypescriptWebsocketClientLibrary({
...commonOptions,
name: sanitiseTypescriptPackageName(packageName),
...options.typescriptWebSocketClientOptions,
isWithinMonorepo: options.isWithinMonorepo,
});
}
case languages_1.WebSocketLibrary.TYPESCRIPT_WEBSOCKET_HOOKS: {
return new typescript_websocket_hooks_library_1.TypescriptWebsocketHooksLibrary({
...commonOptions,
clientPackageName: options.typescriptWebSocketHooksOptions.clientPackageName ??
sanitiseTypescriptPackageName(`${options.parentPackageName}-${languages_1.WebSocketLibrary.TYPESCRIPT_WEBSOCKET_CLIENT}`),
name: sanitiseTypescriptPackageName(packageName),
...options.typescriptWebSocketClientOptions,
isWithinMonorepo: options.isWithinMonorepo,
});
}
default:
throw new Error(`Unknown library ${library}`);
}
};
/**
* Create library projects
* @param libraries the libraries to generate for
* @param options options for the projects to be created
*/
const generateAsyncLibraryProjects = (libraries, options) => {
if (libraries.length > 0) {
new projen_1.TextFile(options.parent, path.join(options.generatedCodeDir, "README.md"), {
lines: [
"## Generated Libraries",
"",
"This directory contains generated libraries based on your API model.",
],
readonly: true,
});
}
const generatedLibraries = {};
libraries.forEach((library) => {
const project = generateAsyncLibraryProject(library, options);
if (project != null) {
generatedLibraries[library] = project;
}
});
return generatedLibraries;
};
exports.generateAsyncLibraryProjects = generateAsyncLibraryProjects;
const generateDocsProject = (format, options) => {
const commonProps = {
name: `${options.parentPackageName}-documentation-${format.replace(/_/g, "-")}`,
parent: options.parent,
outdir: path.join(options.generatedDocsDir, format),
specPath: options.parsedSpecPath,
};
switch (format) {
case languages_1.DocumentationFormat.HTML_REDOC: {
return new generated_html_redoc_documentation_project_1.GeneratedHtmlRedocDocumentationProject({
...commonProps,
...options.documentationOptions?.htmlRedoc,
});
}
case languages_1.DocumentationFormat.MARKDOWN: {
return new generated_markdown_documentation_project_1.GeneratedMarkdownDocumentationProject({
...commonProps,
...options.documentationOptions?.markdown,
});
}
case languages_1.DocumentationFormat.PLANTUML: {
return new generated_plantuml_documentation_project_1.GeneratedPlantumlDocumentationProject({
...commonProps,
...options.documentationOptions?.plantuml,
});
}
case languages_1.WebSocketDocumentationFormat.HTML: {
return new generated_asyncapi_html_documentation_project_1.GeneratedAsyncApiHtmlDocumentationProject({
...commonProps,
...options.asyncDocumentationOptions?.html,
});
}
case languages_1.WebSocketDocumentationFormat.MARKDOWN: {
return new generated_asyncapi_markdown_documentation_project_1.GeneratedAsyncApiMarkdownDocumentationProject({
...commonProps,
...options.asyncDocumentationOptions?.markdown,
});
}
default:
throw new Error(`Unknown documentation format ${format}`);
}
};
const generateDocsProjects = (formats, options) => {
if (formats.length > 0) {
new projen_1.TextFile(options.parent, path.join(options.generatedDocsDir, "README.md"), {
lines: [
"## Generated Documentation",
"",
"This directory contains generated documentation based on your API model.",
],
readonly: true,
});
}
const generatedClients = {};
formats.forEach((format) => {
const project = generateDocsProject(format, options);
if (project != null) {
generatedClients[format] = project;
}
});
return generatedClients;
};
exports.generateDocsProjects = generateDocsProjects;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJnZW5lcmF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTtzQ0FDc0M7QUFDdEMsNkJBQTZCO0FBQzdCLG1DQUFtQztBQUNuQyxtQ0FBMkM7QUFFM0MsNENBTXNCO0FBQ3RCLGlJQUEwSDtBQUMxSCx5SUFBa0k7QUFDbEksMkhBQW9IO0FBQ3BILHVIQUFpSDtBQUNqSCx1SEFBaUg7QUFDakgsNEdBQXFHO0FBRXJHLGdHQUEwRjtBQUMxRixnSEFBeUc7QUFFekcsb0dBQThGO0FBQzlGLHdIQUFpSDtBQUVqSCw0R0FBc0c7QUFDdEcsMElBQWtJO0FBQ2xJLDhIQUF1SDtBQUN2SCw4SUFBc0k7QUFDdEksa0lBQTJIO0FBQzNILHNKQUE4STtBQUM5SSwwSUFBbUk7QUFDbkkseUdBR3dEO0FBQ3hELHVHQUd1RDtBQUN2RCxxR0FHc0Q7QUFDdEQseUdBQWtHO0FBRWxHLDZGQUdrRDtBQUNsRCw2R0FBc0c7QUFFdEcsaUdBR29EO0FBQ3BELHFIQUE4RztBQUU5Ryx5R0FHd0Q7QUFDeEQsZ0dBQXlGO0FBQ3pGLG9GQUE4RTtBQUM5RSwyRkFBcUY7QUFDckYsK0VBQTBFO0FBSzFFLG9HQUE2RjtBQUM3Rix3RkFBa0Y7QUFDbEYsb0NBTWtCO0FBRWxCLE1BQU0sTUFBTSxHQUFHLElBQUEsa0JBQVMsR0FBRSxDQUFDO0FBMEkzQiw2RUFBNkU7QUFDN0UsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFLENBQy9DLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFaEQsbUNBQW1DO0FBQ25DLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FB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Q0FBQztRQUNEO1lBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM5RCxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUssTUFBTSxvQkFBb0IsR0FBRyxDQUNsQyxPQUErRCxFQUMvRCxPQUFvQyxFQUNILEVBQUU7SUFDbkMsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksaUJBQVEsQ0FDVixPQUFPLENBQUMsTUFBTSxFQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxFQUNoRDtZQUNFLEtBQUssRUFBRTtnQkFDTCw0QkFBNEI7Z0JBQzVCLEVBQUU7Z0JBQ0YsMEVBQTBFO2FBQzNFO1lBQ0QsUUFBUSxFQUFFLElBQUk7U0FDZixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxnQkFBZ0IsR0FBb0MsRUFBRSxDQUFDO0lBQzdELE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUN6QixNQUFNLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckQsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7WUFDcEIsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBQ3JDLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sZ0JBQWdCLENBQUM7QUFDMUIsQ0FBQyxDQUFDO0FBNUJXLFFBQUEsb0JBQW9CLHdCQTRCL0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgQ29weXJpZ2h0IFtBbWF6b24uY29tXShodHRwOi8vYW1hem9uLmNvbS8pLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAgKi9cbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJsb2c0anNcIjtcbmltcG9ydCB7IFByb2plY3QsIFRleHRGaWxlIH0gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHsgTm9kZVBhY2thZ2VNYW5hZ2VyIH0gZnJvbSBcInByb2plbi9saWIvamF2YXNjcmlwdFwiO1xuaW1wb3J0IHtcbiAgRG9jdW1lbnRhdGlvbkZvcm1hdCxcbiAgTGFuZ3VhZ2UsXG4gIExpYnJhcnksXG4gIFdlYlNvY2tldERvY3VtZW50YXRpb25Gb3JtYXQsXG4gIFdlYlNvY2tldExpYnJhcnksXG59IGZyb20gXCIuLi9sYW5ndWFnZXNcIjtcbmltcG9ydCB7IEdlbmVyYXRlZEFzeW5jQXBpSHRtbERvY3VtZW50YXRpb25Qcm9qZWN0IH0gZnJvbSBcIi4vZG9jdW1lbnRhdGlvbi9nZW5lcmF0ZWQtYXN5bmNhcGktaHRtbC1kb2N1bWVudGF0aW9uLXByb2plY3RcIjtcbmltcG9ydCB7IEdlbmVyYXRlZEFzeW5jQXBpTWFya2Rvd25Eb2N1bWVudGF0aW9uUHJvamVjdCB9IGZyb20gXCIuL2RvY3VtZW50YXRpb24vZ2VuZXJhdGVkLWFzeW5jYXBpLW1hcmtkb3duLWRvY3VtZW50YXRpb24tcHJvamVjdFwiO1xuaW1wb3J0IHsgR2VuZXJhdGVkSHRtbFJlZG9jRG9jdW1lbnRhdGlvblByb2plY3QgfSBmcm9tIFwiLi9kb2N1bWVudGF0aW9uL2dlbmVyYXRlZC1odG1sLXJlZG9jLWRvY3VtZW50YXRpb24tcHJvamVjdFwiO1xuaW1wb3J0IHsgR2VuZXJhdGVkTWFya2Rvd25Eb2N1bWVudGF0aW9uUHJvamVjdCB9IGZyb20gXCIuL2RvY3VtZW50YXRpb24vZ2VuZXJhdGVkLW1hcmtkb3duLWRvY3VtZW50YXRpb24tcHJvamVjdFwiO1xuaW1wb3J0IHsgR2VuZXJhdGVkUGxhbnR1bWxEb2N1bWVudGF0aW9uUHJvamVjdCB9IGZyb20gXCIuL2RvY3VtZW50YXRpb24vZ2VuZXJhdGVkLXBsYW50dW1sLWRvY3VtZW50YXRpb24tcHJvamVjdFwiO1xuaW1wb3J0IHsgR2VuZXJhdGVkSmF2YUFzeW5jSGFuZGxlcnNQcm9qZWN0IH0gZnJvbSBcIi4vaGFuZGxlcnMvZ2VuZXJhdGVkLWphdmEtYXN5bmMtaGFuZGxlcnMtcHJvamVjdFwiO1xuaW1wb3J0IHsgR2VuZXJhdGVkSmF2YUhhbmRsZXJzQmFzZVByb2plY3QgfSBmcm9tIFwiLi9oYW5kbGVycy9nZW5lcmF0ZWQtamF2YS1oYW5kbGVycy1iYXNlLXByb2plY3RcIjtcbmltcG9ydCB7IEdlbmVyYXRlZEphdmFIYW5kbGVyc1Byb2plY3QgfSBmcm9tIFwiLi9oYW5kbGVycy9nZW5lcmF0ZWQtamF2YS1oYW5kbGVycy1wcm9qZWN0XCI7XG5pbXBvcnQgeyBHZW5lcmF0ZWRQeXRob25Bc3luY0hhbmRsZXJzUHJvamVjdCB9IGZyb20gXCIuL2hhbmRsZXJzL2dlbmVyYXRlZC1weXRob24tYXN5bmMtaGFuZGxlcnMtcHJvamVjdFwiO1xuaW1wb3J0IHsgR2VuZXJhdGVkUHl0aG9uSGFuZGxlcnNCYXNlUHJvamVjdCB9IGZyb20gXCIuL2hhbmRsZXJzL2dlbmVyYXRlZC1weXRob24taGFuZGxlcnMtYmFzZS1wcm9qZWN0XCI7XG5pbXBvcnQgeyBHZW5lcmF0ZWRQeXRob25IYW5kbGVyc1Byb2plY3QgfSBmcm9tIFwiLi9oYW5kbGVycy9nZW5lcmF0ZWQtcHl0aG9uLWhhbmRsZXJzLXByb2plY3RcIjtcbmltcG9ydCB7IEdlbmVyYXRlZFR5cGVzY3JpcHRBc3luY0hhbmRsZXJzUHJvamVjdCB9IGZyb20gXCIuL2hhbmRsZXJzL2dlbmVyYXRlZC10eXBlc2NyaXB0LWFzeW5jLWhhbmRsZXJzLXByb2plY3RcIjtcbmltcG9ydCB7IEdlbmVyYXRlZFR5cGVzY3JpcHRIYW5kbGVyc0Jhc2VQcm9qZWN0IH0gZnJvbSBcIi4vaGFuZGxlcnMvZ2VuZXJhdGVkLXR5cGVzY3JpcHQtaGFuZGxlcnMtYmFzZS1wcm9qZWN0XCI7XG5pbXBvcnQgeyBHZW5lcmF0ZWRUeXBlc2NyaXB0SGFuZGxlcnNQcm9qZWN0IH0gZnJvbSBcIi4vaGFuZGxlcnMvZ2VuZXJhdGVkLXR5cGVzY3JpcHQtaGFuZGxlcnMtcHJvamVjdFwiO1xuaW1wb3J0IHsgR2VuZXJhdGVkSmF2YUFzeW5jQ2RrSW5mcmFzdHJ1Y3R1cmVQcm9qZWN0IH0gZnJvbSBcIi4vaW5mcmFzdHJ1Y3R1cmUvY2RrL2dlbmVyYXRlZC1qYXZhLWFzeW5jLWNkay1pbmZyYXN0cnVjdHVyZS1wcm9qZWN0XCI7XG5pbXBvcnQgeyBHZW5lcmF0ZWRKYXZhQ2RrSW5mcmFzdHJ1Y3R1cmVQcm9qZWN0IH0gZnJvbSBcIi4vaW5mcmFzdHJ1Y3R1cmUvY2RrL2dlbmVyYXRlZC1qYXZhLWNkay1pbmZyYXN0cnVjdHVyZS1wcm9qZWN0XCI7XG5pbXBvcnQgeyBHZW5lcmF0ZWRQeXRob25Bc3luY0Nka0luZnJhc3RydWN0dXJlUHJvamVjdCB9IGZyb20gXCIuL2luZnJhc3RydWN0dXJlL2Nkay9nZW5lcmF0ZWQtcHl0aG9uLWFzeW5jLWNkay1pbmZyYXN0cnVjdHVyZS1wcm9qZWN0XCI7XG5pbXBvcnQgeyBHZW5lcmF0ZWRQeXRob25DZGtJbmZyYXN0cnVjdHVyZVByb2plY3QgfSBmcm9tIFwiLi9pbmZyYXN0cnVjdHVyZS9jZGsvZ2VuZXJhdGVkLXB5dGhvbi1jZGstaW5mcmFzdHJ1Y3R1cmUtcHJvamVjdFwiO1xuaW1wb3J0IHsgR2VuZXJhdGVkVHlwZXNjcmlwdEFzeW5jQ2RrSW5mcmFzdHJ1Y3R1cmVQcm9qZWN0IH0gZnJvbSBcIi4vaW5mcmFzdHJ1Y3R1cmUvY2RrL2dlbmVyYXRlZC10eXBlc2NyaXB0LWFzeW5jLWNkay1pbmZyYXN0cnVjdHVyZS1wcm9qZWN0XCI7XG5pbXBvcnQgeyBHZW5lcmF0ZWRUeXBlc2NyaXB0Q2RrSW5mcmFzdHJ1Y3R1cmVQcm9qZWN0IH0gZnJvbSBcIi4vaW5mcmFzdHJ1Y3R1cmUvY2RrL2dlbmVyYXRlZC10eXBlc2NyaXB0LWNkay1pbmZyYXN0cnVjdHVyZS1wcm9qZWN0XCI7XG5pbXBvcnQge1xuICBHZW5lcmF0ZWRUeXBlc2NyaXB0UmVhY3RRdWVyeUhvb2tzUHJvamVjdE9wdGlvbnMsXG4gIFR5cGVzY3JpcHRSZWFjdFF1ZXJ5SG9va3NMaWJyYXJ5LFxufSBmcm9tIFwiLi9saWJyYXJ5L3R5cGVzY3JpcHQtcmVhY3QtcXVlcnktaG9va3MtbGlicmFyeVwiO1xuaW1wb3J0IHtcbiAgVHlwZXNjcmlwdFdlYnNvY2tldENsaWVudExpYnJhcnksXG4gIFR5cGVzY3JpcHRXZWJzb2NrZXRDbGllbnRMaWJyYXJ5T3B0aW9ucyxcbn0gZnJvbSBcIi4vbGlicmFyeS90eXBlc2NyaXB0LXdlYnNvY2tldC1jbGllbnQtbGlicmFyeVwiO1xuaW1wb3J0IHtcbiAgVHlwZXNjcmlwdFdlYnNvY2tldEhvb2tzTGlicmFyeSxcbiAgVHlwZXNjcmlwdFdlYnNvY2tldEhvb2tzTGlicmFyeU9wdGlvbnMsXG59IGZyb20gXCIuL2xpYnJhcnkvdHlwZXNjcmlwdC13ZWJzb2NrZXQtaG9va3MtbGlicmFyeVwiO1xuaW1wb3J0IHsgR2VuZXJhdGVkSmF2YUFzeW5jUnVudGltZVByb2plY3QgfSBmcm9tIFwiLi9ydW50aW1lL2dlbmVyYXRlZC1qYXZhLWFzeW5jLXJ1bnRpbWUtcHJvamVjdFwiO1xuaW1wb3J0IHsgR2VuZXJhdGVkSmF2YVJ1bnRpbWVCYXNlUHJvamVjdCB9IGZyb20gXCIuL3J1bnRpbWUvZ2VuZXJhdGVkLWphdmEtcnVudGltZS1iYXNlLXByb2plY3RcIjtcbmltcG9ydCB7XG4gIEdlbmVyYXRlZEphdmFSdW50aW1lUHJvamVjdCxcbiAgR2VuZXJhdGVkSmF2YVR5cGVzUHJvamVjdE9wdGlvbnMsXG59IGZyb20gXCIuL3J1bnRpbWUvZ2VuZXJhdGVkLWphdmEtcnVudGltZS1wcm9qZWN0XCI7XG5pbXBvcnQgeyBHZW5lcmF0ZWRQeXRob25Bc3luY1J1bnRpbWVQcm9qZWN0IH0gZnJvbSBcIi4vcnVudGltZS9nZW5lcmF0ZWQtcHl0aG9uLWFzeW5jLXJ1bnRpbWUtcHJvamVjdFwiO1xuaW1wb3J0IHsgR2VuZXJhdGVkUHl0aG9uUnVudGltZUJhc2VQcm9qZWN0IH0gZnJvbSBcIi4vcnVudGltZS9nZW5lcmF0ZWQtcHl0aG9uLXJ1bnRpbWUtYmFzZS1wcm9qZWN0XCI7XG5pbXBvcnQge1xuICBHZW5lcmF0ZWRQeXRob25SdW50aW1lUHJvamVjdCxcbiAgR2VuZXJhdGVkUHl0aG9uVHlwZXNQcm9qZWN0T3B0aW9ucyxcbn0gZnJvbSBcIi4vcnVudGltZS9nZW5lcmF0ZWQtcHl0aG9uLXJ1bnRpbWUtcHJvamVjdFwiO1xuaW1wb3J0IHsgR2VuZXJhdGVkVHlwZXNjcmlwdEFzeW5jUnVudGltZVByb2plY3QgfSBmcm9tIFwiLi9ydW50aW1lL2dlbmVyYXRlZC10eXBlc2NyaXB0LWFzeW5jLXJ1bnRpbWU