@amazon-codecatalyst/blueprints.sam-serverless-application
Version:
This blueprint creates a project that leverages a serverless application model (SAM) to quickly create and deploy an API. You can choose Java, TypeScript, or Python as the programming language
176 lines • 60.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const runtimeMappings_1 = require("./runtimeMappings");
describe('runtime mappings', () => {
const fileTemplateContext = {
repositoryRelativePath: 'testRepositoryRelativePath',
lambdaFunctionName: 'testLambdaFunctionName',
};
describe('Java 11 Maven', () => {
const mapping = runtimeMappings_1.runtimeMappings['Java 11 Maven'];
it('includes additional template props', () => {
expect(mapping.templateProps).toContain('MemorySize: 512');
});
it('creates run-tests.sh and ide settings', () => {
expect(mapping.filesToCreate).toHaveLength(11);
expect(mapping.filesToCreate[0].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.codecatalyst/scripts/run-tests.sh');
expect(mapping.filesToCreate[0].resolveContent(fileTemplateContext)).toContain('-f testLambdaFunctionName/HelloWorldFunction');
expect(mapping.filesToCreate[1].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.idea/runConfigurations/run_tests.xml');
expect(mapping.filesToCreate[1].resolveContent(fileTemplateContext)).toContain('$PROJECT_DIR$/testLambdaFunctionName/HelloWorldFunction');
expect(mapping.filesToCreate[2].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.idea/runConfigurations/sam_build.xml');
expect(mapping.filesToCreate[2].resolveContent(fileTemplateContext)).toContain('$PROJECT_DIR$');
expect(mapping.filesToCreate[3].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.idea/runConfigurations/sam_local_invoke.xml');
expect(mapping.filesToCreate[3].resolveContent(fileTemplateContext)).toContain('sam local invoke testLambdaFunctionNameFunction --event testLambdaFunctionName/events/event.json');
expect(mapping.filesToCreate[4].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.idea/runConfigurations/sam_start_local_api.xml');
expect(mapping.filesToCreate[4].resolveContent(fileTemplateContext)).toContain('$PROJECT_DIR$');
expect(mapping.filesToCreate[5].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.idea/externalDependencies.xml');
expect(mapping.filesToCreate[5].resolveContent(fileTemplateContext)).toContain('aws.toolkit');
expect(mapping.filesToCreate[6].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.vscode/launch.json');
expect(mapping.filesToCreate[6].resolveContent(fileTemplateContext)).toContain('${workspaceFolder}/testLambdaFunctionName/HelloWorldFunction');
expect(mapping.filesToCreate[7].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.vscode/tasks.json');
expect(mapping.filesToCreate[7].resolveContent(fileTemplateContext)).toContain('${workspaceFolder}/testLambdaFunctionName/HelloWorldFunction');
expect(mapping.filesToCreate[8].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.vscode/extensions.json');
expect(mapping.filesToCreate[8].resolveContent(fileTemplateContext)).toContain('vscjava.vscode-maven');
expect(mapping.filesToCreate[9].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.cloud9/runners/SAM Project Builder.run');
expect(mapping.filesToCreate[9].resolveContent(fileTemplateContext)).toContain('sam build');
expect(mapping.filesToCreate[10].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.cloud9/runners/SAM Project Test Runner.run');
expect(mapping.filesToCreate[10].resolveContent(fileTemplateContext)).toContain('mvn test');
});
it('overrides pom.xml', () => {
expect(mapping.filesToOverride).toHaveLength(1);
expect(mapping.filesToOverride[0].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/HelloWorldFunction/pom.xml');
expect(mapping.filesToOverride[0].resolveContent(fileTemplateContext)).toContain('<artifactId>jacoco-maven-plugin</artifactId>');
});
it('does not change permissions on anything', () => {
expect(mapping.filesToChangePermissionsFor).toHaveLength(0);
});
});
describe('Java 11 Gradle', () => {
const mapping = runtimeMappings_1.runtimeMappings['Java 11 Gradle'];
it('includes additional template props', () => {
expect(mapping.templateProps).toContain('MemorySize: 512');
});
it('creates run-tests.sh and IDE settings', () => {
expect(mapping.filesToCreate).toHaveLength(11);
expect(mapping.filesToCreate[0].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.codecatalyst/scripts/run-tests.sh');
expect(mapping.filesToCreate[0].resolveContent(fileTemplateContext)).toContain('GRADLE_DIR=testLambdaFunctionName/HelloWorldFunction');
expect(mapping.filesToCreate[1].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.idea/runConfigurations/run_tests.xml');
expect(mapping.filesToCreate[1].resolveContent(fileTemplateContext)).toContain('$PROJECT_DIR$/testLambdaFunctionName/HelloWorldFunction');
expect(mapping.filesToCreate[2].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.idea/runConfigurations/sam_build.xml');
expect(mapping.filesToCreate[2].resolveContent(fileTemplateContext)).toContain('$PROJECT_DIR$');
expect(mapping.filesToCreate[3].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.idea/runConfigurations/sam_local_invoke.xml');
expect(mapping.filesToCreate[3].resolveContent(fileTemplateContext)).toContain('sam local invoke testLambdaFunctionNameFunction --event testLambdaFunctionName/events/event.json');
expect(mapping.filesToCreate[4].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.idea/runConfigurations/sam_start_local_api.xml');
expect(mapping.filesToCreate[4].resolveContent(fileTemplateContext)).toContain('$PROJECT_DIR$');
expect(mapping.filesToCreate[5].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.idea/externalDependencies.xml');
expect(mapping.filesToCreate[5].resolveContent(fileTemplateContext)).toContain('aws.toolkit');
expect(mapping.filesToCreate[6].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.vscode/launch.json');
expect(mapping.filesToCreate[6].resolveContent(fileTemplateContext)).toContain('${workspaceFolder}/testLambdaFunctionName/HelloWorldFunction');
expect(mapping.filesToCreate[7].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.vscode/tasks.json');
expect(mapping.filesToCreate[7].resolveContent(fileTemplateContext)).toContain('${workspaceFolder}/testLambdaFunctionName/HelloWorldFunction');
expect(mapping.filesToCreate[8].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.vscode/extensions.json');
expect(mapping.filesToCreate[8].resolveContent(fileTemplateContext)).toContain('vscjava.vscode-gradle');
expect(mapping.filesToCreate[9].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.cloud9/runners/SAM Project Builder.run');
expect(mapping.filesToCreate[9].resolveContent(fileTemplateContext)).toContain('sam build');
expect(mapping.filesToCreate[10].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.cloud9/runners/SAM Project Test Runner.run');
expect(mapping.filesToCreate[10].resolveContent(fileTemplateContext)).toContain('gradle test');
});
it('overrides build.gradle', () => {
expect(mapping.filesToOverride).toHaveLength(1);
expect(mapping.filesToOverride[0].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/HelloWorldFunction/build.gradle');
expect(mapping.filesToOverride[0].resolveContent(fileTemplateContext)).toContain("reportsDirectory = layout.buildDirectory.dir('coverage-reports')");
});
it('marks gradlew executable', () => {
expect(mapping.filesToChangePermissionsFor).toHaveLength(1);
expect(mapping.filesToChangePermissionsFor[0].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/testLambdaFunctionName/HelloWorldFunction/gradlew');
expect(mapping.filesToChangePermissionsFor[0].newPermissions).toEqual({ executable: true });
});
});
describe('Node.js 14', () => {
const mapping = runtimeMappings_1.runtimeMappings['Node.js 14'];
it('does not contain additional template props', () => {
expect(mapping.templateProps).toBe('');
});
it('creates eleven files', () => {
expect(mapping.filesToCreate).toHaveLength(11);
expect(mapping.filesToCreate[0].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.codecatalyst/scripts/run-tests.sh');
expect(mapping.filesToCreate[0].resolveContent(fileTemplateContext)).toContain('WORKING_DIR=testLambdaFunctionName/hello-world/');
expect(mapping.filesToCreate[1].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.idea/runConfigurations/all_tests_coverage.xml');
expect(mapping.filesToCreate[1].resolveContent(fileTemplateContext)).toContain('$PROJECT_DIR$/testLambdaFunctionName/hello-world/package.json');
expect(mapping.filesToCreate[2].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.idea/runConfigurations/sam_build.xml');
expect(mapping.filesToCreate[2].resolveContent(fileTemplateContext)).toContain('$PROJECT_DIR$');
expect(mapping.filesToCreate[3].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.idea/runConfigurations/sam_local_invoke.xml');
expect(mapping.filesToCreate[3].resolveContent(fileTemplateContext)).toContain('sam local invoke testLambdaFunctionNameFunction --event testLambdaFunctionName/events/event.json');
expect(mapping.filesToCreate[4].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.idea/runConfigurations/sam_start_local_api.xml');
expect(mapping.filesToCreate[4].resolveContent(fileTemplateContext)).toContain('$PROJECT_DIR$');
expect(mapping.filesToCreate[5].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.idea/externalDependencies.xml');
expect(mapping.filesToCreate[5].resolveContent(fileTemplateContext)).toContain('aws.toolkit');
expect(mapping.filesToCreate[6].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.vscode/launch.json');
expect(mapping.filesToCreate[6].resolveContent(fileTemplateContext)).toContain('${workspaceFolder}/testLambdaFunctionName');
expect(mapping.filesToCreate[7].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.vscode/tasks.json');
expect(mapping.filesToCreate[7].resolveContent(fileTemplateContext)).toContain('${workspaceFolder}/testLambdaFunctionName');
expect(mapping.filesToCreate[8].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.vscode/extensions.json');
expect(mapping.filesToCreate[8].resolveContent(fileTemplateContext)).toContain('AmazonWebServices.aws-toolkit-vscode');
expect(mapping.filesToCreate[9].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.cloud9/runners/SAM Project Builder.run');
expect(mapping.filesToCreate[9].resolveContent(fileTemplateContext)).toContain('sam build');
expect(mapping.filesToCreate[10].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.cloud9/runners/SAM Project Test Runner.run');
expect(mapping.filesToCreate[10].resolveContent(fileTemplateContext)).toContain('npm run test');
});
it('overrides package.json', () => {
expect(mapping.filesToOverride).toHaveLength(1);
expect(mapping.filesToOverride[0].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/hello-world/package.json');
expect(mapping.filesToOverride[0].resolveContent(fileTemplateContext)).toContain('hello world sample for NodeJS');
});
it('does not change permissions on anything', () => {
expect(mapping.filesToChangePermissionsFor).toHaveLength(0);
});
});
describe('Python 3.9', () => {
const mapping = runtimeMappings_1.runtimeMappings['Python 3.9'];
it('does not contain additional template props', () => {
expect(mapping.templateProps).toBe('');
});
it('creates fifteen files', () => {
expect(mapping.filesToCreate).toHaveLength(15);
expect(mapping.filesToCreate[0].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.codecatalyst/scripts/bootstrap.sh');
expect(mapping.filesToCreate[0].resolveContent(fileTemplateContext)).toContain('$VENV/bin/pip install -r testLambdaFunctionName/hello_world/requirements.txt');
expect(mapping.filesToCreate[1].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.codecatalyst/scripts/run-tests.sh');
expect(mapping.filesToCreate[1].resolveContent(fileTemplateContext)).toContain('PYTHONPATH=testLambdaFunctionName pytest --junitxml=test_results.xml --cov-report xml:test_coverage.xml --cov=. testLambdaFunctionName/tests/unit/');
expect(mapping.filesToCreate[2].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.coveragerc');
expect(mapping.filesToCreate[2].resolveContent(fileTemplateContext)).toContain('omit = testLambdaFunctionName/tests/integration/*');
expect(mapping.filesToCreate[3].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.idea/runConfigurations/application_integration_tests.xml');
expect(mapping.filesToCreate[3].resolveContent(fileTemplateContext)).toContain('$PROJECT_DIR$/testLambdaFunctionName/tests/integration');
expect(mapping.filesToCreate[4].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.idea/runConfigurations/application_unit_tests.xml');
expect(mapping.filesToCreate[4].resolveContent(fileTemplateContext)).toContain('$PROJECT_DIR$/testLambdaFunctionName/tests/unit');
expect(mapping.filesToCreate[5].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.idea/runConfigurations/sam_build.xml');
expect(mapping.filesToCreate[5].resolveContent(fileTemplateContext)).toContain('$PROJECT_DIR$');
expect(mapping.filesToCreate[6].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.idea/runConfigurations/sam_local_invoke.xml');
expect(mapping.filesToCreate[6].resolveContent(fileTemplateContext)).toContain('sam local invoke testLambdaFunctionNameFunction --event testLambdaFunctionName/events/event.json');
expect(mapping.filesToCreate[7].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.idea/runConfigurations/sam_start_local_api.xml');
expect(mapping.filesToCreate[7].resolveContent(fileTemplateContext)).toContain('$PROJECT_DIR$');
expect(mapping.filesToCreate[8].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.idea/externalDependencies.xml');
expect(mapping.filesToCreate[8].resolveContent(fileTemplateContext)).toContain('aws.toolkit');
expect(mapping.filesToCreate[9].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.vscode/launch.json');
expect(mapping.filesToCreate[9].resolveContent(fileTemplateContext)).toContain('${workspaceFolder}/testLambdaFunctionName');
expect(mapping.filesToCreate[10].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.vscode/tasks.json');
expect(mapping.filesToCreate[10].resolveContent(fileTemplateContext)).toContain('${workspaceFolder}/testLambdaFunctionName');
expect(mapping.filesToCreate[11].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.vscode/extensions.json');
expect(mapping.filesToCreate[11].resolveContent(fileTemplateContext)).toContain('ms-python.python');
expect(mapping.filesToCreate[12].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.vscode/settings.json');
expect(mapping.filesToCreate[12].resolveContent(fileTemplateContext)).toContain('"python.defaultInterpreterPath": "python"');
expect(mapping.filesToCreate[13].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.cloud9/runners/SAM Project Builder.run');
expect(mapping.filesToCreate[13].resolveContent(fileTemplateContext)).toContain('sam build');
expect(mapping.filesToCreate[14].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/.cloud9/runners/SAM Project Test Runner.run');
expect(mapping.filesToCreate[14].resolveContent(fileTemplateContext)).toContain('pytest tests');
});
it('overrides tests/requirements.txt', () => {
expect(mapping.filesToOverride).toHaveLength(1);
expect(mapping.filesToOverride[0].resolvePath(fileTemplateContext)).toBe('testRepositoryRelativePath/tests/requirements.txt');
expect(mapping.filesToOverride[0].resolveContent(fileTemplateContext)).toContain('boto3');
});
it('does not change permissions on anything', () => {
expect(mapping.filesToChangePermissionsFor).toHaveLength(0);
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZU1hcHBpbmdzLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcnVudGltZU1hcHBpbmdzLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx1REFBb0Q7QUFFcEQsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtJQUNoQyxNQUFNLG1CQUFtQixHQUFHO1FBQzFCLHNCQUFzQixFQUFFLDRCQUE0QjtRQUNwRCxrQkFBa0IsRUFBRSx3QkFBd0I7S0FDN0MsQ0FBQztJQUVGLFFBQVEsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO1FBQzdCLE1BQU0sT0FBTyxHQUFHLGlDQUFlLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFakQsRUFBRSxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsRUFBRTtZQUM1QyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzdELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRTtZQUMvQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywrREFBK0QsQ0FBQyxDQUFDO1lBQ3hJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7WUFFL0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0VBQWtFLENBQUMsQ0FBQztZQUMzSSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO1lBQzFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtFQUFrRSxDQUFDLENBQUM7WUFDM0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDaEcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3BFLHlFQUF5RSxDQUMxRSxDQUFDO1lBQ0YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQzVFLGtHQUFrRyxDQUNuRyxDQUFDO1lBQ0YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3BFLDRFQUE0RSxDQUM3RSxDQUFDO1lBQ0YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDaEcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsMkRBQTJELENBQUMsQ0FBQztZQUNwSSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUU5RixNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1lBQ3pILE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7WUFDL0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsK0NBQStDLENBQUMsQ0FBQztZQUN4SCxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO1lBQy9JLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxDQUFDLENBQUM7WUFDN0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUV2RyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO1lBQzdJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzVGLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNyRSx3RUFBd0UsQ0FDekUsQ0FBQztZQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlGLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtZQUMzQixNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRCxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1lBQ2xJLE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDbkksQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMseUNBQXlDLEVBQUUsR0FBRyxFQUFFO1lBQ2pELE1BQU0sQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUU7UUFDOUIsTUFBTSxPQUFPLEdBQUcsaUNBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRWxELEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRSxHQUFHLEVBQUU7WUFDNUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxHQUFHLEVBQUU7WUFDL0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsK0RBQStELENBQUMsQ0FBQztZQUN4SSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1lBRXZJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtFQUFrRSxDQUFDLENBQUM7WUFDM0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMseURBQXlELENBQUMsQ0FBQztZQUMxSSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO1lBQzNJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ2hHLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNwRSx5RUFBeUUsQ0FDMUUsQ0FBQztZQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUM1RSxrR0FBa0csQ0FDbkcsQ0FBQztZQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNwRSw0RUFBNEUsQ0FDN0UsQ0FBQztZQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ2hHLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLDJEQUEyRCxDQUFDLENBQUM7WUFDcEksTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFOUYsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0RBQWdELENBQUMsQ0FBQztZQUN6SCxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO1lBQy9JLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLCtDQUErQyxDQUFDLENBQUM7WUFDeEgsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsOERBQThELENBQUMsQ0FBQztZQUMvSSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1lBQzdILE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFFeEcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0VBQW9FLENBQUMsQ0FBQztZQUM3SSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM1RixNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDckUsd0VBQXdFLENBQ3pFLENBQUM7WUFDRixNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNqRyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUU7WUFDaEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsNERBQTRELENBQUMsQ0FBQztZQUN2SSxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FDOUUsa0VBQWtFLENBQ25FLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUU7WUFDbEMsTUFBTSxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1RCxNQUFNLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNsRiw4RUFBOEUsQ0FDL0UsQ0FBQztZQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDOUYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFO1FBQzFCLE1BQU0sT0FBTyxHQUFHLGlDQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFOUMsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEdBQUcsRUFBRTtZQUNwRCxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLEVBQUU7WUFDOUIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsK0RBQStELENBQUMsQ0FBQztZQUN4SSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO1lBRWxJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNwRSwyRUFBMkUsQ0FDNUUsQ0FBQztZQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLCtEQUErRCxDQUFDLENBQUM7WUFDaEosTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0VBQWtFLENBQUMsQ0FBQztZQUMzSSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNoRyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDcEUseUVBQXlFLENBQzFFLENBQUM7WUFDRixNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FDNUUsa0dBQWtHLENBQ25HLENBQUM7WUFDRixNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDcEUsNEVBQTRFLENBQzdFLENBQUM7WUFDRixNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNoRyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywyREFBMkQsQ0FBQyxDQUFDO1lBQ3BJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRTlGLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxDQUFDLENBQUM7WUFDekgsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsMkNBQTJDLENBQUMsQ0FBQztZQUU1SCxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1lBQ3hILE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7WUFFNUgsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0RBQW9ELENBQUMsQ0FBQztZQUM3SCxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1lBRXZILE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9FQUFvRSxDQUFDLENBQUM7WUFDN0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFNUYsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3JFLHdFQUF3RSxDQUN6RSxDQUFDO1lBQ0YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEcsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxFQUFFO1lBQ2hDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxDQUFDLENBQUM7WUFDaEksTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNwSCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxHQUFHLEVBQUU7WUFDakQsTUFBTSxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUU7UUFDMUIsTUFBTSxPQUFPLEdBQUcsaUNBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUU5QyxFQUFFLENBQUMsNENBQTRDLEVBQUUsR0FBRyxFQUFFO1lBQ3BELE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtZQUMvQixNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUUvQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywrREFBK0QsQ0FBQyxDQUFDO1lBQ3hJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUM1RSw4RUFBOEUsQ0FDL0UsQ0FBQztZQUVGLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLCtEQUErRCxDQUFDLENBQUM7WUFDeEksTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQzVFLG9KQUFvSixDQUNySixDQUFDO1lBRUYsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsd0NBQXdDLENBQUMsQ0FBQztZQUNqSCxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO1lBRXBJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNwRSxzRkFBc0YsQ0FDdkYsQ0FBQztZQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7WUFDekksTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3BFLCtFQUErRSxDQUNoRixDQUFDO1lBQ0YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsaURBQWlELENBQUMsQ0FBQztZQUNsSSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO1lBQzNJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ2hHLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNwRSx5RUFBeUUsQ0FDMUUsQ0FBQztZQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUM1RSxrR0FBa0csQ0FDbkcsQ0FBQztZQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNwRSw0RUFBNEUsQ0FDN0UsQ0FBQztZQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ2hHLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLDJEQUEyRCxDQUFDLENBQUM7WUFDcEksTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFOUYsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0RBQWdELENBQUMsQ0FBQztZQUN6SCxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1lBRTVILE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLCtDQUErQyxDQUFDLENBQUM7WUFDekgsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsMkNBQTJDLENBQUMsQ0FBQztZQUU3SCxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1lBQzlILE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFFcEcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0RBQWtELENBQUMsQ0FBQztZQUM1SCxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1lBRTdILE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9FQUFvRSxDQUFDLENBQUM7WUFDOUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFN0YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3JFLHdFQUF3RSxDQUN6RSxDQUFDO1lBQ0YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEcsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsa0NBQWtDLEVBQUUsR0FBRyxFQUFFO1lBQzFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1EQUFtRCxDQUFDLENBQUM7WUFDOUgsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUYsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMseUNBQXlDLEVBQUUsR0FBRyxFQUFFO1lBQ2pELE1BQU0sQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcnVudGltZU1hcHBpbmdzIH0gZnJvbSAnLi9ydW50aW1lTWFwcGluZ3MnO1xuXG5kZXNjcmliZSgncnVudGltZSBtYXBwaW5ncycsICgpID0+IHtcbiAgY29uc3QgZmlsZVRlbXBsYXRlQ29udGV4dCA9IHtcbiAgICByZXBvc2l0b3J5UmVsYXRpdmVQYXRoOiAndGVzdFJlcG9zaXRvcnlSZWxhdGl2ZVBhdGgnLFxuICAgIGxhbWJkYUZ1bmN0aW9uTmFtZTogJ3Rlc3RMYW1iZGFGdW5jdGlvbk5hbWUnLFxuICB9O1xuXG4gIGRlc2NyaWJlKCdKYXZhIDExIE1hdmVuJywgKCkgPT4ge1xuICAgIGNvbnN0IG1hcHBpbmcgPSBydW50aW1lTWFwcGluZ3NbJ0phdmEgMTEgTWF2ZW4nXTtcblxuICAgIGl0KCdpbmNsdWRlcyBhZGRpdGlvbmFsIHRlbXBsYXRlIHByb3BzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KG1hcHBpbmcudGVtcGxhdGVQcm9wcykudG9Db250YWluKCdNZW1vcnlTaXplOiA1MTInKTtcbiAgICB9KTtcblxuICAgIGl0KCdjcmVhdGVzIHJ1bi10ZXN0cy5zaCBhbmQgaWRlIHNldHRpbmdzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KG1hcHBpbmcuZmlsZXNUb0NyZWF0ZSkudG9IYXZlTGVuZ3RoKDExKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DcmVhdGVbMF0ucmVzb2x2ZVBhdGgoZmlsZVRlbXBsYXRlQ29udGV4dCkpLnRvQmUoJ3Rlc3RSZXBvc2l0b3J5UmVsYXRpdmVQYXRoLy5jb2RlY2F0YWx5c3Qvc2NyaXB0cy9ydW4tdGVzdHMuc2gnKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DcmVhdGVbMF0ucmVzb2x2ZUNvbnRlbnQoZmlsZVRlbXBsYXRlQ29udGV4dCkpLnRvQ29udGFpbignLWYgdGVzdExhbWJkYUZ1bmN0aW9uTmFtZS9IZWxsb1dvcmxkRnVuY3Rpb24nKTtcblxuICAgICAgZXhwZWN0KG1hcHBpbmcuZmlsZXNUb0NyZWF0ZVsxXS5yZXNvbHZlUGF0aChmaWxlVGVtcGxhdGVDb250ZXh0KSkudG9CZSgndGVzdFJlcG9zaXRvcnlSZWxhdGl2ZVBhdGgvLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvcnVuX3Rlc3RzLnhtbCcpO1xuICAgICAgZXhwZWN0KG1hcHBpbmcuZmlsZXNUb0NyZWF0ZVsxXS5yZXNvbHZlQ29udGVudChmaWxlVGVtcGxhdGVDb250ZXh0KSkudG9Db250YWluKCckUFJPSkVDVF9ESVIkL3Rlc3RMYW1iZGFGdW5jdGlvbk5hbWUvSGVsbG9Xb3JsZEZ1bmN0aW9uJyk7XG4gICAgICBleHBlY3QobWFwcGluZy5maWxlc1RvQ3JlYXRlWzJdLnJlc29sdmVQYXRoKGZpbGVUZW1wbGF0ZUNvbnRleHQpKS50b0JlKCd0ZXN0UmVwb3NpdG9yeVJlbGF0aXZlUGF0aC8uaWRlYS9ydW5Db25maWd1cmF0aW9ucy9zYW1fYnVpbGQueG1sJyk7XG4gICAgICBleHBlY3QobWFwcGluZy5maWxlc1RvQ3JlYXRlWzJdLnJlc29sdmVDb250ZW50KGZpbGVUZW1wbGF0ZUNvbnRleHQpKS50b0NvbnRhaW4oJyRQUk9KRUNUX0RJUiQnKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DcmVhdGVbM10ucmVzb2x2ZVBhdGgoZmlsZVRlbXBsYXRlQ29udGV4dCkpLnRvQmUoXG4gICAgICAgICd0ZXN0UmVwb3NpdG9yeVJlbGF0aXZlUGF0aC8uaWRlYS9ydW5Db25maWd1cmF0aW9ucy9zYW1fbG9jYWxfaW52b2tlLnhtbCcsXG4gICAgICApO1xuICAgICAgZXhwZWN0KG1hcHBpbmcuZmlsZXNUb0NyZWF0ZVszXS5yZXNvbHZlQ29udGVudChmaWxlVGVtcGxhdGVDb250ZXh0KSkudG9Db250YWluKFxuICAgICAgICAnc2FtIGxvY2FsIGludm9rZSB0ZXN0TGFtYmRhRnVuY3Rpb25OYW1lRnVuY3Rpb24gLS1ldmVudCB0ZXN0TGFtYmRhRnVuY3Rpb25OYW1lL2V2ZW50cy9ldmVudC5qc29uJyxcbiAgICAgICk7XG4gICAgICBleHBlY3QobWFwcGluZy5maWxlc1RvQ3JlYXRlWzRdLnJlc29sdmVQYXRoKGZpbGVUZW1wbGF0ZUNvbnRleHQpKS50b0JlKFxuICAgICAgICAndGVzdFJlcG9zaXRvcnlSZWxhdGl2ZVBhdGgvLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvc2FtX3N0YXJ0X2xvY2FsX2FwaS54bWwnLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DcmVhdGVbNF0ucmVzb2x2ZUNvbnRlbnQoZmlsZVRlbXBsYXRlQ29udGV4dCkpLnRvQ29udGFpbignJFBST0pFQ1RfRElSJCcpO1xuICAgICAgZXhwZWN0KG1hcHBpbmcuZmlsZXNUb0NyZWF0ZVs1XS5yZXNvbHZlUGF0aChmaWxlVGVtcGxhdGVDb250ZXh0KSkudG9CZSgndGVzdFJlcG9zaXRvcnlSZWxhdGl2ZVBhdGgvLmlkZWEvZXh0ZXJuYWxEZXBlbmRlbmNpZXMueG1sJyk7XG4gICAgICBleHBlY3QobWFwcGluZy5maWxlc1RvQ3JlYXRlWzVdLnJlc29sdmVDb250ZW50KGZpbGVUZW1wbGF0ZUNvbnRleHQpKS50b0NvbnRhaW4oJ2F3cy50b29sa2l0Jyk7XG5cbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DcmVhdGVbNl0ucmVzb2x2ZVBhdGgoZmlsZVRlbXBsYXRlQ29udGV4dCkpLnRvQmUoJ3Rlc3RSZXBvc2l0b3J5UmVsYXRpdmVQYXRoLy52c2NvZGUvbGF1bmNoLmpzb24nKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DcmVhdGVbNl0ucmVzb2x2ZUNvbnRlbnQoZmlsZVRlbXBsYXRlQ29udGV4dCkpLnRvQ29udGFpbignJHt3b3Jrc3BhY2VGb2xkZXJ9L3Rlc3RMYW1iZGFGdW5jdGlvbk5hbWUvSGVsbG9Xb3JsZEZ1bmN0aW9uJyk7XG4gICAgICBleHBlY3QobWFwcGluZy5maWxlc1RvQ3JlYXRlWzddLnJlc29sdmVQYXRoKGZpbGVUZW1wbGF0ZUNvbnRleHQpKS50b0JlKCd0ZXN0UmVwb3NpdG9yeVJlbGF0aXZlUGF0aC8udnNjb2RlL3Rhc2tzLmpzb24nKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DcmVhdGVbN10ucmVzb2x2ZUNvbnRlbnQoZmlsZVRlbXBsYXRlQ29udGV4dCkpLnRvQ29udGFpbignJHt3b3Jrc3BhY2VGb2xkZXJ9L3Rlc3RMYW1iZGFGdW5jdGlvbk5hbWUvSGVsbG9Xb3JsZEZ1bmN0aW9uJyk7XG4gICAgICBleHBlY3QobWFwcGluZy5maWxlc1RvQ3JlYXRlWzhdLnJlc29sdmVQYXRoKGZpbGVUZW1wbGF0ZUNvbnRleHQpKS50b0JlKCd0ZXN0UmVwb3NpdG9yeVJlbGF0aXZlUGF0aC8udnNjb2RlL2V4dGVuc2lvbnMuanNvbicpO1xuICAgICAgZXhwZWN0KG1hcHBpbmcuZmlsZXNUb0NyZWF0ZVs4XS5yZXNvbHZlQ29udGVudChmaWxlVGVtcGxhdGVDb250ZXh0KSkudG9Db250YWluKCd2c2NqYXZhLnZzY29kZS1tYXZlbicpO1xuXG4gICAgICBleHBlY3QobWFwcGluZy5maWxlc1RvQ3JlYXRlWzldLnJlc29sdmVQYXRoKGZpbGVUZW1wbGF0ZUNvbnRleHQpKS50b0JlKCd0ZXN0UmVwb3NpdG9yeVJlbGF0aXZlUGF0aC8uY2xvdWQ5L3J1bm5lcnMvU0FNIFByb2plY3QgQnVpbGRlci5ydW4nKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DcmVhdGVbOV0ucmVzb2x2ZUNvbnRlbnQoZmlsZVRlbXBsYXRlQ29udGV4dCkpLnRvQ29udGFpbignc2FtIGJ1aWxkJyk7XG4gICAgICBleHBlY3QobWFwcGluZy5maWxlc1RvQ3JlYXRlWzEwXS5yZXNvbHZlUGF0aChmaWxlVGVtcGxhdGVDb250ZXh0KSkudG9CZShcbiAgICAgICAgJ3Rlc3RSZXBvc2l0b3J5UmVsYXRpdmVQYXRoLy5jbG91ZDkvcnVubmVycy9TQU0gUHJvamVjdCBUZXN0IFJ1bm5lci5ydW4nLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DcmVhdGVbMTBdLnJlc29sdmVDb250ZW50KGZpbGVUZW1wbGF0ZUNvbnRleHQpKS50b0NvbnRhaW4oJ212biB0ZXN0Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnb3ZlcnJpZGVzIHBvbS54bWwnLCAoKSA9PiB7XG4gICAgICBleHBlY3QobWFwcGluZy5maWxlc1RvT3ZlcnJpZGUpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9PdmVycmlkZVswXS5yZXNvbHZlUGF0aChmaWxlVGVtcGxhdGVDb250ZXh0KSkudG9CZSgndGVzdFJlcG9zaXRvcnlSZWxhdGl2ZVBhdGgvSGVsbG9Xb3JsZEZ1bmN0aW9uL3BvbS54bWwnKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9PdmVycmlkZVswXS5yZXNvbHZlQ29udGVudChmaWxlVGVtcGxhdGVDb250ZXh0KSkudG9Db250YWluKCc8YXJ0aWZhY3RJZD5qYWNvY28tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGNoYW5nZSBwZXJtaXNzaW9ucyBvbiBhbnl0aGluZycsICgpID0+IHtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DaGFuZ2VQZXJtaXNzaW9uc0ZvcikudG9IYXZlTGVuZ3RoKDApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnSmF2YSAxMSBHcmFkbGUnLCAoKSA9PiB7XG4gICAgY29uc3QgbWFwcGluZyA9IHJ1bnRpbWVNYXBwaW5nc1snSmF2YSAxMSBHcmFkbGUnXTtcblxuICAgIGl0KCdpbmNsdWRlcyBhZGRpdGlvbmFsIHRlbXBsYXRlIHByb3BzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KG1hcHBpbmcudGVtcGxhdGVQcm9wcykudG9Db250YWluKCdNZW1vcnlTaXplOiA1MTInKTtcbiAgICB9KTtcblxuICAgIGl0KCdjcmVhdGVzIHJ1bi10ZXN0cy5zaCBhbmQgSURFIHNldHRpbmdzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KG1hcHBpbmcuZmlsZXNUb0NyZWF0ZSkudG9IYXZlTGVuZ3RoKDExKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DcmVhdGVbMF0ucmVzb2x2ZVBhdGgoZmlsZVRlbXBsYXRlQ29udGV4dCkpLnRvQmUoJ3Rlc3RSZXBvc2l0b3J5UmVsYXRpdmVQYXRoLy5jb2RlY2F0YWx5c3Qvc2NyaXB0cy9ydW4tdGVzdHMuc2gnKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DcmVhdGVbMF0ucmVzb2x2ZUNvbnRlbnQoZmlsZVRlbXBsYXRlQ29udGV4dCkpLnRvQ29udGFpbignR1JBRExFX0RJUj10ZXN0TGFtYmRhRnVuY3Rpb25OYW1lL0hlbGxvV29ybGRGdW5jdGlvbicpO1xuXG4gICAgICBleHBlY3QobWFwcGluZy5maWxlc1RvQ3JlYXRlWzFdLnJlc29sdmVQYXRoKGZpbGVUZW1wbGF0ZUNvbnRleHQpKS50b0JlKCd0ZXN0UmVwb3NpdG9yeVJlbGF0aXZlUGF0aC8uaWRlYS9ydW5Db25maWd1cmF0aW9ucy9ydW5fdGVzdHMueG1sJyk7XG4gICAgICBleHBlY3QobWFwcGluZy5maWxlc1RvQ3JlYXRlWzFdLnJlc29sdmVDb250ZW50KGZpbGVUZW1wbGF0ZUNvbnRleHQpKS50b0NvbnRhaW4oJyRQUk9KRUNUX0RJUiQvdGVzdExhbWJkYUZ1bmN0aW9uTmFtZS9IZWxsb1dvcmxkRnVuY3Rpb24nKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DcmVhdGVbMl0ucmVzb2x2ZVBhdGgoZmlsZVRlbXBsYXRlQ29udGV4dCkpLnRvQmUoJ3Rlc3RSZXBvc2l0b3J5UmVsYXRpdmVQYXRoLy5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL3NhbV9idWlsZC54bWwnKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DcmVhdGVbMl0ucmVzb2x2ZUNvbnRlbnQoZmlsZVRlbXBsYXRlQ29udGV4dCkpLnRvQ29udGFpbignJFBST0pFQ1RfRElSJCcpO1xuICAgICAgZXhwZWN0KG1hcHBpbmcuZmlsZXNUb0NyZWF0ZVszXS5yZXNvbHZlUGF0aChmaWxlVGVtcGxhdGVDb250ZXh0KSkudG9CZShcbiAgICAgICAgJ3Rlc3RSZXBvc2l0b3J5UmVsYXRpdmVQYXRoLy5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL3NhbV9sb2NhbF9pbnZva2UueG1sJyxcbiAgICAgICk7XG4gICAgICBleHBlY3QobWFwcGluZy5maWxlc1RvQ3JlYXRlWzNdLnJlc29sdmVDb250ZW50KGZpbGVUZW1wbGF0ZUNvbnRleHQpKS50b0NvbnRhaW4oXG4gICAgICAgICdzYW0gbG9jYWwgaW52b2tlIHRlc3RMYW1iZGFGdW5jdGlvbk5hbWVGdW5jdGlvbiAtLWV2ZW50IHRlc3RMYW1iZGFGdW5jdGlvbk5hbWUvZXZlbnRzL2V2ZW50Lmpzb24nLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DcmVhdGVbNF0ucmVzb2x2ZVBhdGgoZmlsZVRlbXBsYXRlQ29udGV4dCkpLnRvQmUoXG4gICAgICAgICd0ZXN0UmVwb3NpdG9yeVJlbGF0aXZlUGF0aC8uaWRlYS9ydW5Db25maWd1cmF0aW9ucy9zYW1fc3RhcnRfbG9jYWxfYXBpLnhtbCcsXG4gICAgICApO1xuICAgICAgZXhwZWN0KG1hcHBpbmcuZmlsZXNUb0NyZWF0ZVs0XS5yZXNvbHZlQ29udGVudChmaWxlVGVtcGxhdGVDb250ZXh0KSkudG9Db250YWluKCckUFJPSkVDVF9ESVIkJyk7XG4gICAgICBleHBlY3QobWFwcGluZy5maWxlc1RvQ3JlYXRlWzVdLnJlc29sdmVQYXRoKGZpbGVUZW1wbGF0ZUNvbnRleHQpKS50b0JlKCd0ZXN0UmVwb3NpdG9yeVJlbGF0aXZlUGF0aC8uaWRlYS9leHRlcm5hbERlcGVuZGVuY2llcy54bWwnKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DcmVhdGVbNV0ucmVzb2x2ZUNvbnRlbnQoZmlsZVRlbXBsYXRlQ29udGV4dCkpLnRvQ29udGFpbignYXdzLnRvb2xraXQnKTtcblxuICAgICAgZXhwZWN0KG1hcHBpbmcuZmlsZXNUb0NyZWF0ZVs2XS5yZXNvbHZlUGF0aChmaWxlVGVtcGxhdGVDb250ZXh0KSkudG9CZSgndGVzdFJlcG9zaXRvcnlSZWxhdGl2ZVBhdGgvLnZzY29kZS9sYXVuY2guanNvbicpO1xuICAgICAgZXhwZWN0KG1hcHBpbmcuZmlsZXNUb0NyZWF0ZVs2XS5yZXNvbHZlQ29udGVudChmaWxlVGVtcGxhdGVDb250ZXh0KSkudG9Db250YWluKCcke3dvcmtzcGFjZUZvbGRlcn0vdGVzdExhbWJkYUZ1bmN0aW9uTmFtZS9IZWxsb1dvcmxkRnVuY3Rpb24nKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DcmVhdGVbN10ucmVzb2x2ZVBhdGgoZmlsZVRlbXBsYXRlQ29udGV4dCkpLnRvQmUoJ3Rlc3RSZXBvc2l0b3J5UmVsYXRpdmVQYXRoLy52c2NvZGUvdGFza3MuanNvbicpO1xuICAgICAgZXhwZWN0KG1hcHBpbmcuZmlsZXNUb0NyZWF0ZVs3XS5yZXNvbHZlQ29udGVudChmaWxlVGVtcGxhdGVDb250ZXh0KSkudG9Db250YWluKCcke3dvcmtzcGFjZUZvbGRlcn0vdGVzdExhbWJkYUZ1bmN0aW9uTmFtZS9IZWxsb1dvcmxkRnVuY3Rpb24nKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DcmVhdGVbOF0ucmVzb2x2ZVBhdGgoZmlsZVRlbXBsYXRlQ29udGV4dCkpLnRvQmUoJ3Rlc3RSZXBvc2l0b3J5UmVsYXRpdmVQYXRoLy52c2NvZGUvZXh0ZW5zaW9ucy5qc29uJyk7XG4gICAgICBleHBlY3QobWFwcGluZy5maWxlc1RvQ3JlYXRlWzhdLnJlc29sdmVDb250ZW50KGZpbGVUZW1wbGF0ZUNvbnRleHQpKS50b0NvbnRhaW4oJ3ZzY2phdmEudnNjb2RlLWdyYWRsZScpO1xuXG4gICAgICBleHBlY3QobWFwcGluZy5maWxlc1RvQ3JlYXRlWzldLnJlc29sdmVQYXRoKGZpbGVUZW1wbGF0ZUNvbnRleHQpKS50b0JlKCd0ZXN0UmVwb3NpdG9yeVJlbGF0aXZlUGF0aC8uY2xvdWQ5L3J1bm5lcnMvU0FNIFByb2plY3QgQnVpbGRlci5ydW4nKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DcmVhdGVbOV0ucmVzb2x2ZUNvbnRlbnQoZmlsZVRlbXBsYXRlQ29udGV4dCkpLnRvQ29udGFpbignc2FtIGJ1aWxkJyk7XG4gICAgICBleHBlY3QobWFwcGluZy5maWxlc1RvQ3JlYXRlWzEwXS5yZXNvbHZlUGF0aChmaWxlVGVtcGxhdGVDb250ZXh0KSkudG9CZShcbiAgICAgICAgJ3Rlc3RSZXBvc2l0b3J5UmVsYXRpdmVQYXRoLy5jbG91ZDkvcnVubmVycy9TQU0gUHJvamVjdCBUZXN0IFJ1bm5lci5ydW4nLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DcmVhdGVbMTBdLnJlc29sdmVDb250ZW50KGZpbGVUZW1wbGF0ZUNvbnRleHQpKS50b0NvbnRhaW4oJ2dyYWRsZSB0ZXN0Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnb3ZlcnJpZGVzIGJ1aWxkLmdyYWRsZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9PdmVycmlkZSkudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgZXhwZWN0KG1hcHBpbmcuZmlsZXNUb092ZXJyaWRlWzBdLnJlc29sdmVQYXRoKGZpbGVUZW1wbGF0ZUNvbnRleHQpKS50b0JlKCd0ZXN0UmVwb3NpdG9yeVJlbGF0aXZlUGF0aC9IZWxsb1dvcmxkRnVuY3Rpb24vYnVpbGQuZ3JhZGxlJyk7XG4gICAgICBleHBlY3QobWFwcGluZy5maWxlc1RvT3ZlcnJpZGVbMF0ucmVzb2x2ZUNvbnRlbnQoZmlsZVRlbXBsYXRlQ29udGV4dCkpLnRvQ29udGFpbihcbiAgICAgICAgXCJyZXBvcnRzRGlyZWN0b3J5ID0gbGF5b3V0LmJ1aWxkRGlyZWN0b3J5LmRpcignY292ZXJhZ2UtcmVwb3J0cycpXCIsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ21hcmtzIGdyYWRsZXcgZXhlY3V0YWJsZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DaGFuZ2VQZXJtaXNzaW9uc0ZvcikudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgZXhwZWN0KG1hcHBpbmcuZmlsZXNUb0NoYW5nZVBlcm1pc3Npb25zRm9yWzBdLnJlc29sdmVQYXRoKGZpbGVUZW1wbGF0ZUNvbnRleHQpKS50b0JlKFxuICAgICAgICAndGVzdFJlcG9zaXRvcnlSZWxhdGl2ZVBhdGgvdGVzdExhbWJkYUZ1bmN0aW9uTmFtZS9IZWxsb1dvcmxkRnVuY3Rpb24vZ3JhZGxldycsXG4gICAgICApO1xuICAgICAgZXhwZWN0KG1hcHBpbmcuZmlsZXNUb0NoYW5nZVBlcm1pc3Npb25zRm9yWzBdLm5ld1Blcm1pc3Npb25zKS50b0VxdWFsKHsgZXhlY3V0YWJsZTogdHJ1ZSB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ05vZGUuanMgMTQnLCAoKSA9PiB7XG4gICAgY29uc3QgbWFwcGluZyA9IHJ1bnRpbWVNYXBwaW5nc1snTm9kZS5qcyAxNCddO1xuXG4gICAgaXQoJ2RvZXMgbm90IGNvbnRhaW4gYWRkaXRpb25hbCB0ZW1wbGF0ZSBwcm9wcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChtYXBwaW5nLnRlbXBsYXRlUHJvcHMpLnRvQmUoJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NyZWF0ZXMgZWxldmVuIGZpbGVzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KG1hcHBpbmcuZmlsZXNUb0NyZWF0ZSkudG9IYXZlTGVuZ3RoKDExKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DcmVhdGVbMF0ucmVzb2x2ZVBhdGgoZmlsZVRlbXBsYXRlQ29udGV4dCkpLnRvQmUoJ3Rlc3RSZXBvc2l0b3J5UmVsYXRpdmVQYXRoLy5jb2RlY2F0YWx5c3Qvc2NyaXB0cy9ydW4tdGVzdHMuc2gnKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DcmVhdGVbMF0ucmVzb2x2ZUNvbnRlbnQoZmlsZVRlbXBsYXRlQ29udGV4dCkpLnRvQ29udGFpbignV09SS0lOR19ESVI9dGVzdExhbWJkYUZ1bmN0aW9uTmFtZS9oZWxsby13b3JsZC8nKTtcblxuICAgICAgZXhwZWN0KG1hcHBpbmcuZmlsZXNUb0NyZWF0ZVsxXS5yZXNvbHZlUGF0aChmaWxlVGVtcGxhdGVDb250ZXh0KSkudG9CZShcbiAgICAgICAgJ3Rlc3RSZXBvc2l0b3J5UmVsYXRpdmVQYXRoLy5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL2FsbF90ZXN0c19jb3ZlcmFnZS54bWwnLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChtYXBwaW5nLmZpbGVzVG9DcmVhdGVbMV0ucmVzb2x2ZUNvbnRlbnQoZmlsZVRlbXBsYXRlQ29udGV4dCkpLnRvQ29udGFpbignJFBST0pFQ1RfRElSJC90ZXN0TGFtYmRhRnVuY3Rpb25OYW1lL2hlbGxvLXdvcmxkL3BhY2thZ2UuanNvbicpO1xuICAgICAgZXhwZWN0KG1hcHBpbmcuZmlsZXNUb0NyZWF0ZVsyXS5yZXNvbHZlUGF0aChmaWxlVGVtcGxhdGVDb250ZXh0KSkudG9CZSgndGVzdFJlcG9zaXRvcnlSZWxhdGl2ZVBhdGgvLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvc2FtX2J1aWxkLnhtbCcpO1xuICAgICAgZXhwZWN0KG1hcHBpbmcuZmlsZXNUb0NyZWF0ZVsyXS5yZXNvbHZlQ29udGVudChmaWxlVGVtcGxhdGVDb250ZXh0KSkudG9Db250YWluKCckUFJPSkVDVF9ESVIkJyk7XG4gICAgICBleHBlY3QobWFwcGluZy5maWxlc1RvQ3JlYXRlWzNdLnJlc29sdmVQYXRoKGZpbGVUZW1wbGF0ZUNvbnRleHQpKS50