UNPKG

bytefun-ai-mcp

Version:

ByteFun AI MCP服务 - 打通产品设计、UI设计、代码开发的服务平台,支持设计稿转代码和跨平台原生代码开发

539 lines 60.3 kB
#!/usr/bin/env node import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js'; import { PromptOptimizer } from './prompt-optimizer.js'; const server = new Server({ name: 'bytefun-ai-prompt', version: '1.0.0', }); const promptOptimizer = new PromptOptimizer(); // List available tools server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: [ { name: 'optimize_product_design_prompt', description: 'Optimize prompt for product and business logic design', inputSchema: { type: 'object', properties: { industry: { type: 'string', description: 'The industry that the APP or website belongs to' }, user_input: { type: 'string', description: 'User input prompt that needs to be optimized for product and business logic design' } }, required: ['industry', 'user_input'] } }, { name: 'optimize_ui_design_prompt', description: 'Optimize prompt for UI design by reading page list and requirements from doc file', inputSchema: { type: 'object', properties: { user_input: { type: 'string', description: 'User input prompt that needs to be optimized for UI design' } }, required: ['user_input'] } }, { name: 'optimize_ui_design_add_page_prompt', description: 'Optimize prompt for UI design to add new page into module', inputSchema: { type: 'object', properties: { user_input: { type: 'string', description: 'User input prompt that triggers add-page UI design flow' } }, required: ['user_input'] } }, { name: 'ui_design_guide_prompt', description: 'Return comprehensive UI design guide prompt with strict execution rules', inputSchema: { type: 'object', properties: { industry: { type: 'string', description: 'The industry that the APP or website belongs to' }, user_input: { type: 'string', description: 'User input prompt that needs to be optimized for product and business logic design' } }, required: ['industry', 'user_input'] } }, { name: 'understanding_code_framework_prompt', description: 'Return prompt for understanding project code framework', inputSchema: { type: 'object', properties: {}, required: [] } }, { name: 'optimize_code_design_prompt', description: 'Optimize prompt for code logic design thinking before development, generating detailed design documentation', inputSchema: { type: 'object', properties: { user_input: { type: 'string', description: 'User input prompt that needs to be optimized for code logic design thinking' } }, required: ['user_input'] } }, { name: 'implement_logic_code_prompt', description: 'Optimize prompt for TypeScript code development by adding code development rules and marking user input', inputSchema: { type: 'object', properties: { user_input: { type: 'string', description: 'User input prompt that needs to be optimized for code development' } }, required: ['user_input'] } }, // { // name: 'optimize_hand_drawn_ui_design_prompt', // description: 'Analyze hand-drawn UI design sketches and extract detailed information for UI design', // inputSchema: { // type: 'object', // properties: { // user_input: { // type: 'string', // description: 'User input with hand-drawn UI design sketch that needs to be analyzed' // } // }, // required: ['user_input'] // } // }, // { // name: 'optimize_ui_design_thinking_prompt', // description: 'Optimize prompt for UI design thinking process before actual design work, generating detailed UI design thinking documentation', // inputSchema: { // type: 'object', // properties: { // user_input: { // type: 'string', // description: 'User input prompt that needs to be optimized for UI design thinking process' // } // }, // required: ['user_input'] // } // }, { name: 'optimize_backend_design_prompt', description: 'Optimize prompt for backend database and API interface design by reading module business logic documents', inputSchema: { type: 'object', properties: { user_input: { type: 'string', description: 'User input prompt that needs to be optimized for backend database and API interface design' } }, required: ['user_input'] } }, // { // name: 'functional_module_business_logic_prompt', // description: 'Optimize prompt for functional module business logic analysis based on product requirements document', // inputSchema: { // type: 'object', // properties: { // functionalModule: { // type: 'string', // description: 'The functional module currently being designed' // }, // user_input: { // type: 'string', // description: 'User input prompt that needs to be optimized for functional module business logic analysis' // } // }, // required: ['functionalModule', 'user_input'] // } // }, // { // name: 'talk_to_editor', // description: 'Establish long connection with editor backend using Socket.IO. Before calling this tool, you must first use read_file to read .bytefun/project.json and get projectID and uid values. This tool will wait for backend messages and return tasks to execute.', // inputSchema: { // type: 'object', // properties: { // projectID: { // type: 'number', // description: 'Project ID from .bytefun/project.json configuration file' // }, // uid: { // type: 'number', // description: 'User ID from .bytefun/project.json configuration file' // } // }, // required: ['projectID', 'uid'] // } // }, // { // name: 'talk_to_editor_rules', // description: 'Get AI behavior rules for interacting with talk_to_editor tool. Returns detailed instructions on how AI should maintain continuous conversation and wait for backend control.', // inputSchema: { // type: 'object', // properties: {}, // required: [] // } // }, { name: 'implement_backend_code_prompt', description: 'Optimize prompt for backend code development by reading backend design documents and applying coding standards', inputSchema: { type: 'object', properties: { user_input: { type: 'string', description: 'User input prompt that needs to be optimized for backend code development' } }, required: ['user_input'] } }, { name: 'optimize_ui_design_edit_prompt', description: 'Optimize prompt for UI design modification and editing tasks, returning detailed UI design specifications', inputSchema: { type: 'object', properties: { user_input: { type: 'string', description: 'User input prompt that needs to be optimized for UI design modification' } }, required: ['user_input'] } }, // { // name: 'optimize_ui_design_replenish_prompt', // description: 'Optimize prompt for UI design HTML replenishment and attribute completion', // inputSchema: { // type: 'object', // properties: { // user_input: { // type: 'string', // description: 'User input prompt that needs to be optimized for UI design HTML replenishment' // } // }, // required: ['user_input'] // } // }, { name: 'optimize_jump_page_code_prompt', description: 'Optimize prompt for page navigation code development based on UI design progress and jumping rules', inputSchema: { type: 'object', properties: { user_input: { type: 'string', description: 'User input prompt that needs to be optimized for page navigation code development' } }, required: ['user_input'] } }, // { // name: 'optimize_declarative_ui_prompt', // description: 'Optimize prompt for declarative UI design using JSON format to describe UI components and interfaces', // inputSchema: { // type: 'object', // properties: { // user_input: { // type: 'string', // description: 'User input prompt that needs to be optimized for declarative UI design' // } // }, // required: ['user_input'] // } // }, { name: 'optimize_ui_spec_design_prompt', description: 'Optimize prompt for UI specification design based on product requirements document to complete UI design standards', inputSchema: { type: 'object', properties: { user_input: { type: 'string', description: 'User input prompt that needs to be optimized for UI specification design' } }, required: ['user_input'] } } // { // name: 'implement_ui_code_prompt', // description: 'Return prompt for implementing UI code with strict execution steps', // inputSchema: { // type: 'object', // properties: { // user_input: { // type: 'string', // description: 'User input describing UI code implementation requirements' // } // }, // required: ['user_input'] // } // } ] }; }); // Handle tool calls server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; if (!args) { throw new Error('Missing arguments'); } try { switch (name) { case 'optimize_product_design_prompt': const optimizedProductDesignPrompt = await promptOptimizer.optimizeProductDesignPrompt(args.industry, args.user_input); return { content: [ { type: 'text', text: optimizedProductDesignPrompt } ] }; case 'optimize_ui_design_prompt': const optimizedUIPrompt = await promptOptimizer.optimizeUIDesignPrompt(args.user_input); return { content: [ { type: 'text', text: optimizedUIPrompt } ] }; case 'optimize_ui_design_add_page_prompt': const optimizedUIAddPagePrompt = await promptOptimizer.optimizeUIDesignAddPagePrompt(args.user_input); return { content: [ { type: 'text', text: optimizedUIAddPagePrompt } ] }; case 'ui_design_guide_prompt': const uiDesignGuideText = await promptOptimizer.uiDesignGuidePrompt(); return { content: [ { type: 'text', text: uiDesignGuideText } ] }; case 'understanding_code_framework_prompt': const appCodeFrameworkText = await promptOptimizer.understandingAppCodeFrameworkPrompt(); return { content: [ { type: 'text', text: appCodeFrameworkText } ] }; case 'optimize_code_design_prompt': const optimizedCodeDesignPrompt = await promptOptimizer.optimizeCodeDesignPrompt(args.user_input); return { content: [ { type: 'text', text: optimizedCodeDesignPrompt } ] }; case 'implement_logic_code_prompt': const optimizedCodePrompt = await promptOptimizer.optimizeCodePrompt(args.user_input); return { content: [ { type: 'text', text: optimizedCodePrompt } ] }; // case 'optimize_hand_drawn_ui_design_prompt': // const optimizedHandDrawnPrompt = await promptOptimizer.optimizeHandDrawnUIDesignPrompt(args.user_input as string); // return { // content: [ // { // type: 'text', // text: optimizedHandDrawnPrompt // } // ] // }; // case 'optimize_ui_design_thinking_prompt': // const optimizedUIDesignThinkingPrompt = await promptOptimizer.optimizeUIDesignThinkingPrompt(args.user_input as string); // return { // content: [ // { // type: 'text', // text: optimizedUIDesignThinkingPrompt // } // ] // }; case 'optimize_backend_design_prompt': const optimizedBackendDesignPrompt = await promptOptimizer.optimizeBackendDesignPrompt(args.user_input); return { content: [ { type: 'text', text: optimizedBackendDesignPrompt } ] }; case 'functional_module_business_logic_prompt': const optimizedFunctionalModulePrompt = await promptOptimizer.optimizeFunctionalModulePrompt(args.functionalModule, args.user_input); return { content: [ { type: 'text', text: optimizedFunctionalModulePrompt } ] }; // case 'talk_to_editor': // const projectID = args.projectID as number || 0; // const uid = args.uid as number || 0; // const talkResult = await promptOptimizer.talkToEditor({ // projectID, // uid // }); // return { // content: [ // { // type: 'text', // text: talkResult // } // ] // }; // case 'talk_to_editor_rules': // const rulesResult = await promptOptimizer.talkToEditorRules(); // return { // content: [ // { // type: 'text', // text: rulesResult // } // ] // }; case 'implement_backend_code_prompt': const optimizedBackendCodePrompt = await promptOptimizer.optimizeBackendCodePrompt(args.user_input); return { content: [ { type: 'text', text: optimizedBackendCodePrompt } ] }; case 'optimize_ui_design_edit_prompt': const optimizedUIDesignEditPrompt = await promptOptimizer.optimizeUIDesignEditPrompt(args.user_input); return { content: [ { type: 'text', text: optimizedUIDesignEditPrompt } ] }; case 'optimize_jump_page_code_prompt': const optimizedJumpPageCodePrompt = await promptOptimizer.optimizeJumpPageCodePrompt(args.user_input); return { content: [ { type: 'text', text: optimizedJumpPageCodePrompt } ] }; // case 'optimize_declarative_ui_prompt': // const optimizedDeclarativeUIPrompt = await promptOptimizer.optimizeDeclarativeUIPrompt(args.user_input as string); // return { // content: [ // { // type: 'text', // text: optimizedDeclarativeUIPrompt // } // ] // }; case 'optimize_ui_spec_design_prompt': const optimizedUISpecDesignPrompt = await promptOptimizer.optimizeUISpecDesignPrompt(args.user_input); return { content: [ { type: 'text', text: optimizedUISpecDesignPrompt } ] }; // case 'optimize_ui_design_replenish_prompt': // const optimizedUIDesignReplenishPrompt = await promptOptimizer.optimizeUIDesignReplenishPrompt(args.user_input as string); // return { // content: [ // { // type: 'text', // text: optimizedUIDesignReplenishPrompt // } // ] // }; // case 'implement_ui_code_prompt': // const implementUICodeText = await promptOptimizer.implementUICodePrompt(args.user_input as string); // return { // content: [ // { // type: 'text', // text: implementUICodeText // } // ] // }; default: throw new Error(`Unknown tool: ${name}`); } } catch (error) { return { content: [ { type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` } ], isError: true }; } }); async function main() { const transport = new StdioServerTransport(); await server.connect(transport); console.error('ByteFun AI Prompt MCP server running on stdio'); } main().catch(console.error); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHNCQUFzQixHQUV2QixNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV4RCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FDdkI7SUFDRSxJQUFJLEVBQUUsbUJBQW1CO0lBQ3pCLE9BQU8sRUFBRSxPQUFPO0NBQ2pCLENBQ0YsQ0FBQztBQUVGLE1BQU0sZUFBZSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7QUFJOUMsdUJBQXVCO0FBQ3ZCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLElBQUksRUFBRTtJQUMxRCxPQUFPO1FBQ0wsS0FBSyxFQUFFO1lBQ0w7Z0JBQ0UsSUFBSSxFQUFFLGdDQUFnQztnQkFDdEMsV0FBVyxFQUFFLHVEQUF1RDtnQkFDcEUsV0FBVyxFQUFFO29CQUNYLElBQUksRUFBRSxRQUFRO29CQUNkLFVBQVUsRUFBRTt3QkFDVixRQUFRLEVBQUU7NEJBQ1IsSUFBSSxFQUFFLFFBQVE7NEJBQ2QsV0FBVyxFQUFFLGlEQUFpRDt5QkFDL0Q7d0JBQ0QsVUFBVSxFQUFFOzRCQUNWLElBQUksRUFBRSxRQUFROzRCQUNkLFdBQVcsRUFBRSxvRkFBb0Y7eUJBQ2xHO3FCQUNGO29CQUNELFFBQVEsRUFBRSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUM7aUJBQ3JDO2FBQ0Y7WUFDRDtnQkFDRSxJQUFJLEVBQUUsMkJBQTJCO2dCQUNqQyxXQUFXLEVBQUUsbUZBQW1GO2dCQUNoRyxXQUFXLEVBQUU7b0JBQ1gsSUFBSSxF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Q2xDO3FCQUNGO2lCQUNGLENBQUM7WUFFSiw4Q0FBOEM7WUFDOUMsK0hBQStIO1lBQy9ILGFBQWE7WUFDYixpQkFBaUI7WUFDakIsVUFBVTtZQUNWLHdCQUF3QjtZQUN4QixpREFBaUQ7WUFDakQsVUFBVTtZQUNWLFFBQVE7WUFDUixPQUFPO1lBRVAsbUNBQW1DO1lBQ25DLHdHQUF3RztZQUN4RyxhQUFhO1lBQ2IsaUJBQWlCO1lBQ2pCLFVBQVU7WUFDVix3QkFBd0I7WUFDeEIsb0NBQW9DO1lBQ3BDLFVBQVU7WUFDVixRQUFRO1lBQ1IsT0FBTztZQUVQO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLElBQUksRUFBRSxDQUFDLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsVUFBVSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7aUJBQ3pFO2FBQ0Y7WUFDRCxPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFSCxLQUFLLFVBQVUsSUFBSTtJQUNqQixNQUFNLFNBQVMsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7SUFDN0MsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2hDLE9BQU8sQ0FBQyxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBRUQsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IHsgU2VydmVyIH0gZnJvbSAnQG1vZGVsY29udGV4dHByb3RvY29sL3Nkay9zZXJ2ZXIvaW5kZXguanMnO1xuaW1wb3J0IHsgU3RkaW9TZXJ2ZXJUcmFuc3BvcnQgfSBmcm9tICdAbW9kZWxjb250ZXh0cHJvdG9jb2wvc2RrL3NlcnZlci9zdGRpby5qcyc7XG5pbXBvcnQge1xuICBDYWxsVG9vbFJlcXVlc3RTY2hlbWEsXG4gIExpc3RUb29sc1JlcXVlc3RTY2hlbWEsXG4gIFRvb2wsXG59IGZyb20gJ0Btb2RlbGNvbnRleHRwcm90b2NvbC9zZGsvdHlwZXMuanMnO1xuaW1wb3J0IHsgUHJvbXB0T3B0aW1pemVyIH0gZnJvbSAnLi9wcm9tcHQtb3B0aW1pemVyLmpzJztcblxuY29uc3Qgc2VydmVyID0gbmV3IFNlcnZlcihcbiAge1xuICAgIG5hbWU6ICdieXRlZnVuLWFpLXByb21wdCcsXG4gICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgfVxuKTtcblxuY29uc3QgcHJvbXB0T3B0aW1pemVyID0gbmV3IFByb21wdE9wdGltaXplcigpO1xuXG5cblxuLy8gTGlzdCBhdmFpbGFibGUgdG9vbHNcbnNlcnZlci5zZXRSZXF1ZXN0SGFuZGxlcihMaXN0VG9vbHNSZXF1ZXN0U2NoZW1hLCBhc3luYyAoKSA9PiB7XG4gIHJldHVybiB7XG4gICAgdG9vbHM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ29wdGltaXplX3Byb2R1Y3RfZGVzaWduX3Byb21wdCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnT3B0aW1pemUgcHJvbXB0IGZvciBwcm9kdWN0IGFuZCBidXNpbmVzcyBsb2dpYyBkZXNpZ24nLFxuICAgICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGluZHVzdHJ5OiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBpbmR1c3RyeSB0aGF0IHRoZSBBUFAgb3Igd2Vic2l0ZSBiZWxvbmdzIHRvJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVzZXJfaW5wdXQ6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVXNlciBpbnB1dCBwcm9tcHQgdGhhdCBuZWVkcyB0byBiZSBvcHRpbWl6ZWQgZm9yIHByb2R1Y3QgYW5kIGJ1c2luZXNzIGxvZ2ljIGRlc2lnbidcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVkOiBbJ2luZHVzdHJ5JywgJ3VzZXJfaW5wdXQnXVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnb3B0aW1pemVfdWlfZGVzaWduX3Byb21wdCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnT3B0aW1pemUgcHJvbXB0IGZvciBVSSBkZXNpZ24gYnkgcmVhZGluZyBwYWdlIGxpc3QgYW5kIHJlcXVpcmVtZW50cyBmcm9tIGRvYyBmaWxlJyxcbiAgICAgICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB1c2VyX2lucHV0OiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZXIgaW5wdXQgcHJvbXB0IHRoYXQgbmVlZHMgdG8gYmUgb3B0aW1pemVkIGZvciBVSSBkZXNpZ24nXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1aXJlZDogWyd1c2VyX2lucHV0J11cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ29wdGltaXplX3VpX2Rlc2lnbl9hZGRfcGFnZV9wcm9tcHQnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ09wdGltaXplIHByb21wdCBmb3IgVUkgZGVzaWduIHRvIGFkZCBuZXcgcGFnZSBpbnRvIG1vZHVsZScsXG4gICAgICAgIGlucHV0U2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgdXNlcl9pbnB1dDoge1xuICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdVc2VyIGlucHV0IHByb21wdCB0aGF0IHRyaWdnZXJzIGFkZC1wYWdlIFVJIGRlc2lnbiBmbG93J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWlyZWQ6IFsndXNlcl9pbnB1dCddXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICd1aV9kZXNpZ25fZ3VpZGVfcHJvbXB0JyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdSZXR1cm4gY29tcHJlaGVuc2l2ZSBVSSBkZXNpZ24gZ3VpZGUgcHJvbXB0IHdpdGggc3RyaWN0IGV4ZWN1dGlvbiBydWxlcycsXG4gICAgICAgIGlucHV0U2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgaW5kdXN0cnk6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGluZHVzdHJ5IHRoYXQgdGhlIEFQUCBvciB3ZWJzaXRlIGJlbG9uZ3MgdG8nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXNlcl9pbnB1dDoge1xuICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdVc2VyIGlucHV0IHByb21wdCB0aGF0IG5lZWRzIHRvIGJlIG9wdGltaXplZCBmb3IgcHJvZHVjdCBhbmQgYnVzaW5lc3MgbG9naWMgZGVzaWduJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWlyZWQ6IFsnaW5kdXN0cnknLCAndXNlcl9pbnB1dCddXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICd1bmRlcnN0YW5kaW5nX2NvZGVfZnJhbWV3b3JrX3Byb21wdCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnUmV0dXJuIHByb21wdCBmb3IgdW5kZXJzdGFuZGluZyBwcm9qZWN0IGNvZGUgZnJhbWV3b3JrJyxcbiAgICAgICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgICByZXF1aXJlZDogW11cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ29wdGltaXplX2NvZGVfZGVzaWduX3Byb21wdCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnT3B0aW1pemUgcHJvbXB0IGZvciBjb2RlIGxvZ2ljIGRlc2lnbiB0aGlua2luZyBiZWZvcmUgZGV2ZWxvcG1lbnQsIGdlbmVyYXRpbmcgZGV0YWlsZWQgZGVzaWduIGRvY3VtZW50YXRpb24nLFxuICAgICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHVzZXJfaW5wdXQ6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVXNlciBpbnB1dCBwcm9tcHQgdGhhdCBuZWVkcyB0byBiZSBvcHRpbWl6ZWQgZm9yIGNvZGUgbG9naWMgZGVzaWduIHRoaW5raW5nJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWlyZWQ6IFsndXNlcl9pbnB1dCddXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdpbXBsZW1lbnRfbG9naWNfY29kZV9wcm9tcHQnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ09wdGltaXplIHByb21wdCBmb3IgVHlwZVNjcmlwdCBjb2RlIGRldmVsb3BtZW50IGJ5IGFkZGluZyBjb2RlIGRldmVsb3BtZW50IHJ1bGVzIGFuZCBtYXJraW5nIHVzZXIgaW5wdXQnLFxuICAgICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHVzZXJfaW5wdXQ6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVXNlciBpbnB1dCBwcm9tcHQgdGhhdCBuZWVkcyB0byBiZSBvcHRpbWl6ZWQgZm9yIGNvZGUgZGV2ZWxvcG1lbnQnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1aXJlZDogWyd1c2VyX2lucHV0J11cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIHtcbiAgICAgIC8vICAgbmFtZTogJ29wdGltaXplX2hhbmRfZHJhd25fdWlfZGVzaWduX3Byb21wdCcsXG4gICAgICAvLyAgIGRlc2NyaXB0aW9uOiAnQW5hbHl6ZSBoYW5kLWRyYXduIFVJIGRlc2lnbiBza2V0Y2hlcyBhbmQgZXh0cmFjdCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBmb3IgVUkgZGVzaWduJyxcbiAgICAgIC8vICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgIC8vICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgIC8vICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAvLyAgICAgICB1c2VyX2lucHV0OiB7XG4gICAgICAvLyAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgLy8gICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZXIgaW5wdXQgd2l0aCBoYW5kLWRyYXduIFVJIGRlc2lnbiBza2V0Y2ggdGhhdCBuZWVkcyB0byBiZSBhbmFseXplZCdcbiAgICAgIC8vICAgICAgIH1cbiAgICAgIC8vICAgICB9LFxuICAgICAgLy8gICAgIHJlcXVpcmVkOiBbJ3VzZXJfaW5wdXQnXVxuICAgICAgLy8gICB9XG4gICAgICAvLyB9LFxuICAgICAgLy8ge1xuICAgICAgLy8gICBuYW1lOiAnb3B0aW1pemVfdWlfZGVzaWduX3RoaW5raW5nX3Byb21wdCcsXG4gICAgICAvLyAgIGRlc2NyaXB0aW9uOiAnT3B0aW1pemUgcHJvbXB0IGZvciBVSSBkZXNpZ24gdGhpbmtpbmcgcHJvY2VzcyBiZWZvcmUgYWN0dWFsIGRlc2lnbiB3b3JrLCBnZW5lcmF0aW5nIGRldGFpbGVkIFVJIGRlc2lnbiB0aGlua2luZyBkb2N1bWVudGF0aW9uJyxcbiAgICAgIC8vICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgIC8vICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgIC8vICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAvLyAgICAgICB1c2VyX2lucHV0OiB7XG4gICAgICAvLyAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgLy8gICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZXIgaW5wdXQgcHJvbXB0IHRoYXQgbmVlZHMgdG8gYmUgb3B0aW1pemVkIGZvciBVSSBkZXNpZ24gdGhpbmtpbmcgcHJvY2VzcydcbiAgICAgIC8vICAgICAgIH1cbiAgICAgIC8vICAgICB9LFxuICAgICAgLy8gICAgIHJlcXVpcmVkOiBbJ3VzZXJfaW5wdXQnXVxuICAgICAgLy8gICB9XG4gICAgICAvLyB9LFxuXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdvcHRpbWl6ZV9iYWNrZW5kX2Rlc2lnbl9wcm9tcHQnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ09wdGltaXplIHByb21wdCBmb3IgYmFja2VuZCBkYXRhYmFzZSBhbmQgQVBJIGludGVyZmFjZSBkZXNpZ24gYnkgcmVhZGluZyBtb2R1bGUgYnVzaW5lc3MgbG9naWMgZG9jdW1lbnRzJyxcbiAgICAgICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB1c2VyX2lucHV0OiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZXIgaW5wdXQgcHJvbXB0IHRoYXQgbmVlZHMgdG8gYmUgb3B0aW1pemVkIGZvciBiYWNrZW5kIGRhdGFiYXNlIGFuZCBBUEkgaW50ZXJmYWNlIGRlc2lnbidcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVkOiBbJ3VzZXJfaW5wdXQnXVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8ge1xuICAgICAgLy8gICBuYW1lOiAnZnVuY3Rpb25hbF9tb2R1bGVfYnVzaW5lc3NfbG9naWNfcHJvbXB0JyxcbiAgICAgIC8vICAgZGVzY3JpcHRpb246ICdPcHRpbWl6ZSBwcm9tcHQgZm9yIGZ1bmN0aW9uYWwgbW9kdWxlIGJ1c2luZXNzIGxvZ2ljIGFuYWx5c2lzIGJhc2VkIG9uIHByb2R1Y3QgcmVxdWlyZW1lbnRzIGRvY3VtZW50JyxcbiAgICAgIC8vICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgIC8vICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgIC8vICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAvLyAgICAgICBmdW5jdGlvbmFsTW9kdWxlOiB7XG4gICAgICAvLyAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgLy8gICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBmdW5jdGlvbmFsIG1vZHVsZSBjdXJyZW50bHkgYmVpbmcgZGVzaWduZWQnXG4gICAgICAvLyAgICAgICB9LFxuICAgICAgLy8gICAgICAgdXNlcl9pbnB1dDoge1xuICAgICAgLy8gICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIC8vICAgICAgICAgZGVzY3JpcHRpb246ICdVc2VyIGlucHV0IHByb21wdCB0aGF0IG5lZWRzIHRvIGJlIG9wdGltaXplZCBmb3IgZnVuY3Rpb25hbCBtb2R1bGUgYnVzaW5lc3MgbG9naWMgYW5hbHlzaXMnXG4gICAgICAvLyAgICAgICB9XG4gICAgICAvLyAgICAgfSxcbiAgICAgIC8vICAgICByZXF1aXJlZDogWydmdW5jdGlvbmFsTW9kdWxlJywgJ3VzZXJfaW5wdXQnXVxuICAgICAgLy8gICB9XG4gICAgICAvLyB9LFxuXG4gICAgICAvLyB7XG4gICAgICAvLyAgIG5hbWU6ICd0YWxrX3RvX2VkaXRvcicsXG4gICAgICAvLyAgIGRlc2NyaXB0aW9uOiAnRXN0YWJsaXNoIGxvbmcgY29ubmVjdGlvbiB3aXRoIGVkaXRvciBiYWNrZW5kIHVzaW5nIFNvY2tldC5JTy4gQmVmb3JlIGNhbGxpbmcgdGhpcyB0b29sLCB5b3UgbXVzdCBmaXJzdCB1c2UgcmVhZF9maWxlIHRvIHJlYWQgLmJ5dGVmdW4vcHJvamVjdC5qc29uIGFuZCBnZXQgcHJvamVjdElEIGFuZCB1aWQgdmFsdWVzLiBUaGlzIHRvb2wgd2lsbCB3YWl0IGZvciBiYWNrZW5kIG1lc3NhZ2VzIGFuZCByZXR1cm4gdGFza3MgdG8gZXhlY3V0ZS4nLFxuICAgICAgLy8gICBpbnB1dFNjaGVtYToge1xuICAgICAgLy8gICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgLy8gICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIC8vICAgICAgIHByb2plY3RJRDoge1xuICAgICAgLy8gICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIC8vICAgICAgICAgZGVzY3JpcHRpb246ICdQcm9qZWN0IElEIGZyb20gLmJ5dGVmdW4vcHJvamVjdC5qc29uIGNvbmZpZ3VyYXRpb24gZmlsZSdcbiAgICAgIC8vICAgICAgIH0sXG4gICAgICAvLyAgICAgICB1aWQ6IHtcbiAgICAgIC8vICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAvLyAgICAgICAgIGRlc2NyaXB0aW9uOiAnVXNlciBJRCBmcm9tIC5ieXRlZnVuL3Byb2plY3QuanNvbiBjb25maWd1cmF0aW9uIGZpbGUnXG4gICAgICAvLyAgICAgICB9XG4gICAgICAvLyAgICAgfSxcbiAgICAgIC8vICAgICByZXF1aXJlZDogWydwcm9qZWN0SUQnLCAndWlkJ11cbiAgICAgIC8vICAgfVxuICAgICAgLy8gfSxcbiAgICAgIC8vIHtcbiAgICAgIC8vICAgbmFtZTogJ3RhbGtfdG9fZWRpdG9yX3J1bGVzJyxcbiAgICAgIC8vICAgZGVzY3JpcHRpb246ICdHZXQgQUkgYmVoYXZpb3IgcnVsZXMgZm9yIGludGVyYWN0aW5nIHdpdGggdGFsa190b19lZGl0b3IgdG9vbC4gUmV0dXJucyBkZXRhaWxlZCBpbnN0cnVjdGlvbnMgb24gaG93IEFJIHNob3VsZCBtYWludGFpbiBjb250aW51b3VzIGNvbnZlcnNhdGlvbiBhbmQgd2FpdCBmb3IgYmFja2VuZCBjb250cm9sLicsXG4gICAgICAvLyAgIGlucHV0U2NoZW1hOiB7XG4gICAgICAvLyAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAvLyAgICAgcHJvcGVydGllczoge30sXG4gICAgICAvLyAgICAgcmVxdWlyZWQ6IFtdXG4gICAgICAvLyAgIH1cbiAgICAgIC8vIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdpbXBsZW1lbnRfYmFja2VuZF9jb2RlX3Byb21wdCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnT3B0aW1pemUgcHJvbXB0IGZvciBiYWNrZW5kIGNvZGUgZGV2ZWxvcG1lbnQgYnkgcmVhZGluZyBiYWNrZW5kIGRlc2lnbiBkb2N1bWVudHMgYW5kIGFwcGx5aW5nIGNvZGluZyBzdGFuZGFyZHMnLFxuICAgICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHVzZXJfaW5wdXQ6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVXNlciBpbnB1dCBwcm9tcHQgdGhhdCBuZWVkcyB0byBiZSBvcHRpbWl6ZWQgZm9yIGJhY2tlbmQgY29kZSBkZXZlbG9wbWVudCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVkOiBbJ3VzZXJfaW5wdXQnXVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnb3B0aW1pemVfdWlfZGVzaWduX2VkaXRfcHJvbXB0JyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdPcHRpbWl6ZSBwcm9tcHQgZm9yIFVJIGRlc2lnbiBtb2RpZmljYXRpb24gYW5kIGVkaXRpbmcgdGFza3MsIHJldHVybmluZyBkZXRhaWxlZCBVSSBkZXNpZ24gc3BlY2lmaWNhdGlvbnMnLFxuICAgICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHVzZXJfaW5wdXQ6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVXNlciBpbnB1dCBwcm9tcHQgdGhhdCBuZWVkcyB0byBiZSBvcHRpbWl6ZWQgZm9yIFVJIGRlc2lnbiBtb2RpZmljYXRpb24nXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1aXJlZDogWyd1c2VyX2lucHV0J11cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIHtcbiAgICAgIC8vICAgbmFtZTogJ29wdGltaXplX3VpX2Rlc2lnbl9yZXBsZW5pc2hfcHJvbXB0JyxcbiAgICAgIC8vICAgZGVzY3JpcHRpb246ICdPcHRpbWl6ZSBwcm9tcHQgZm9yIFVJIGRlc2lnbiBIVE1MIHJlcGxlbmlzaG1lbnQgYW5kIGF0dHJpYnV0ZSBjb21wbGV0aW9uJyxcbiAgICAgIC8vICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgIC8vICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgIC8vICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAvLyAgICAgICB1c2VyX2lucHV0OiB7XG4gICAgICAvLyAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgLy8gICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZXIgaW5wdXQgcHJvbXB0IHRoYXQgbmVlZHMgdG8gYmUgb3B0aW1pemVkIGZvciBVSSBkZXNpZ24gSFRNTCByZXBsZW5pc2htZW50J1xuICAgICAgLy8gICAgICAgfVxuICAgICAgLy8gICAgIH0sXG4gICAgICAvLyAgICAgcmVxdWlyZWQ6IFsndXNlcl9pbnB1dCddXG4gICAgICAvLyAgIH1cbiAgICAgIC8vIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdvcHRpbWl6ZV9qdW1wX3BhZ2VfY29kZV9wcm9tcHQnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ09wdGltaXplIHByb21wdCBmb3IgcGFnZSBuYXZpZ2F0aW9uIGNvZGUgZGV2ZWxvcG1lbnQgYmFzZWQgb24gVUkgZGVzaWduIHByb2dyZXNzIGFuZCBqdW1waW5nIHJ1bGVzJyxcbiAgICAgICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB1c2VyX2lucHV0OiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZXIgaW5wdXQgcHJvbXB0IHRoYXQgbmVlZHMgdG8gYmUgb3B0aW1pemVkIGZvciBwYWdlIG5hdmlnYXRpb24gY29kZSBkZXZlbG9wbWVudCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVkOiBbJ3VzZXJfaW5wdXQnXVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8ge1xuICAgICAgLy8gICBuYW1lOiAnb3B0aW1pemVfZGVjbGFyYXRpdmVfdWlfcHJvbXB0JyxcbiAgICAgIC8vICAgZGVzY3JpcHRpb246ICdPcHRpbWl6ZSBwcm9tcHQgZm9yIGRlY2xhcmF0aXZlIFVJIGRlc2lnbiB1c2luZyBKU09OIGZvcm1hdCB0byBkZXNjcmliZSBVSSBjb21wb25lbnRzIGFuZCBpbnRlcmZhY2VzJyxcbiAgICAgIC8vICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgIC8vICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgIC8vICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAvLyAgICAgICB1c2VyX2lucHV0OiB7XG4gICAgICAvLyAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgLy8gICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZXIgaW5wdXQgcHJvbXB0IHRoYXQgbmVlZHMgdG8gYmUgb3B0aW1pemVkIGZvciBkZWNsYXJhdGl2ZSBVSSBkZXNpZ24nXG4gICAgICAvLyAgICAgICB9XG4gICAgICAvLyAgICAgfSxcbiAgICAgIC8vICAgICByZXF1aXJlZDogWyd1c2VyX2lucHV0J11cbiAgICAgIC8vICAgfVxuICAgICAgLy8gfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ29wdGltaXplX3VpX3NwZWNfZGVzaWduX3Byb21wdCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnT3B0aW1pemUgcHJvbXB0IGZvciBVSSBzcGVjaWZpY2F0aW9uIGRlc2lnbiBiYXNlZCBvbiBwcm9kdWN0IHJlcXVpcmVtZW50cyBkb2N1bWVudCB0byBjb21wbGV0ZSBVSSBkZXNpZ24gc3RhbmRhcmRzJyxcbiAgICAgICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB1c2VyX2lucHV0OiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZXIgaW5wdXQgcHJvbXB0IHRoYXQgbmVlZHMgdG8gYmUgb3B0aW1pemVkIGZvciBVSSBzcGVjaWZpY2F0aW9uIGRlc2lnbidcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVkOiBbJ3VzZXJfaW5wdXQnXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyB7XG4gICAgICAvLyAgIG5hbWU6ICdpbXBsZW1lbnRfdWlfY29kZV9wcm9tcHQnLFxuICAgICAgLy8gICBkZXNjcmlwdGlvbjogJ1JldHVybiBwcm9tcHQgZm9yIGltcGxlbWVudGluZyBVSSBjb2RlIHdpdGggc3RyaWN0IGV4ZWN1dGlvbiBzdGVwcycsXG4gICAgICAvLyAgIGlucHV0U2NoZW1hOiB7XG4gICAgICAvLyAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAvLyAgICAgcHJvcGVydGllczoge1xuICAgICAgLy8gICAgICAgdXNlcl9pbnB1dDoge1xuICAgICAgLy8gICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIC8vICAgICAgICAgZGVzY3JpcHRpb246ICdVc2VyIGlucHV0IGRlc2NyaWJpbmcgVUkgY29kZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlbWVudHMnXG4gICAgICAvLyAgICAgICB9XG4gICAgICAvLyAgICAgfSxcbiAgICAgIC8vICAgICByZXF1aXJlZDogWyd1c2VyX2lucHV0J11cbiAgICAgIC8vICAgfVxuICAgICAgLy8gfVxuICAgIF0gYXMgVG9vbFtdXG4gIH07XG59KTtcblxuLy8gSGFuZGxlIHRvb2wgY2FsbHNcbnNlcnZlci5zZXRSZXF1ZXN0SGFuZGxlcihDYWxsVG9vbFJlcXVlc3RTY2hlbWEsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gIGNvbnN0IHsgbmFtZSwgYXJndW1lb