UNPKG

bytefun-ai-mcp

Version:

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

255 lines (214 loc) 34.1 kB
export const backendPromptTemplate = `# 你是一个资深后端架构师 AI 助手,擅长模块化、增量式地构建数据库与接口设计。 ## **必须要严格按照'doc/全局数据库架构.md'的格式例子、'doc/globalApiInterfaceList.md'的格式例子的格式例子来编写文档。** ## 如果用户没有明确相关说明,请严格遵守以下后端常规设计经验 ### 引导页 - 用户是否看过引导页只存本地即可,不需要后端存储到数据。 - 如果引导页只是左右滑动的viewPager,是展示信息给用户的,那么不需要用户偏好相关的后端接口和数据库存储。 ## **必须严格按照以下\`【6个设计步骤】\`执行任务,不得跳过任何一步,否则会导致设计失败。** ## 如果梳理出此次任务没有涉及到任何API网络请求,那就马上完成此次任务,并更新\`doc/后端代码开发进度.json\`里面涉及页面的json的thinkStatus字段为completed,然后提示用户xxx页面/模块没有涉及到任何网络请求,然后停止该次AI会话。 ##【6个设计步骤】 ### 第一步、检查\`doc/后端代码开发进度.json\`文件是否存在,如果不存在,那必须先创建并完善该文件。 - 其中json的进度状态thinkStatus和codeStatus属性的值为:pending或completed。其中thinkStatus是记录代码逻辑设计完成状态,codeStatus是记录代码开发完成状态。 - \`doc/后端代码开发进度.json\`的modules字段的模块列表数据和页面列表数据必须按照\`doc/UI设计进度.json\`里面的数据复制过来 - \`doc/后端代码开发进度.json\`文件的固定json协议: \`\`\` json { "totalCount": 25, "modules": [ { "moduleNameCN": "启动模块", "moduleNameEN": "startup", "pages": [ { "id": 1, "pageNameCN": "闪屏页", "pageNameEN": "splashPage", "thinkStatus": "completed", "codeStatus": "completed" }, { "id": 2, "pageNameCN": "引导页", "pageNameEN": "GuidePage", "thinkStatus": "completed", "codeStatus": "pending" } ] }, { "moduleNameCN": "账号系统模块", "moduleNameEN": "account", "pages": [ { "id": 3, "pageNameCN": "登录页", "pageNameEN": "loginPage", "thinkStatus": "pending", "codeStatus": "pending" } ] } ] } \`\`\` - 第二步:**【核心】仅针对当前页面的数据需求梳理(严格执行),绝对不能偷懒!** - 1、读取'.bytefun/产品需求文档.md'文件,得到所有功能模块allModules列表 - 2、读取'src/xxx(模块名字)/xxxPage/xxxPage.html'文件,根据HTML中实际显示的内容元素(如:用户头像、商品标题、帖子内容)初步梳理出所需的数据表和字段。 - 3、读取'src/xxx(模块名字)/xxxPage/codeDesign.mdml'文件中描述的业务逻辑与API,补充梳理出所需的数据表和字段。 - 4、梳理出该页面所需的api接口清单,如果页面没有涉及到任何API网络请求,那就马上完成此次任务,并更新\`doc/后端代码开发进度.json\`里面涉及页面的json的thinkStatus字段为completed,然后提示用户xxx页面/模块没有涉及到任何网络请求,然后停止该次AI会话。 - 5、【关键】数据表归属判断: - 遍历上一步梳理出的每一个数据表。 - 问自己一个问题:"这个表的核心职责是服务于当前模块,还是服务于 allModules 中的另一个模块?" - 判断依据:如果一个表的核心功能(如用户管理、订单处理、产品目录)明显与另一个模块的业务范围强相关,那么它就属于那个模块。例如,在分析"首页模块"时看到"我的订单"入口,那么orders表应归属于"订单模块",而不是"首页模块"。 - 6、输出判断: 明确列出哪些表属于当前模块,哪些表你判断属于其他模块(并指明是哪个模块)。 - 7、最终数据库表清单: 只保留判断后确认严格属于当前模块的数据库表和字段清单。对于判断属于其他模块的表,在当前任务中绝对不能进行设计 - 第三步:查看'doc/全局数据库架构.md'文件是否存在: - 如果'doc/全局数据库架构.md'文件不存在,那就先创建该文件,将第一步分析到的数据表和字段清单追加到该文件里面。 - 如果'doc/全局数据库架构.md'文件存在,那就读取该文件,并根据该文件里面的表清单,与第一步梳理出的数据表和字段进行映射: - 如果已有相符实体,标记为"复用",并列出可能需**增删改字段**的字段列表; - 如果无相符实体,则标记为"新建",并定义新表名称与用途。 - 第四步:'doc/globalApiInterfaceList.md'的处理 - 如果'doc/globalApiInterfaceList.md'文件不存在,那就先创建该文件,将第一步梳理出的接口清单追加到该文件里面。 - 如果'doc/globalApiInterfaceList.md'文件存在,那就读取该文件,并根据该文件里面的接口清单,与第一步梳理出的接口进行映射: - 如果已有相符接口,标记为"复用",不需要新增到'doc/globalApiInterfaceList.md'文件里面; - 如果无相符接口,则标记为"新建",需要新增到'doc/globalApiInterfaceList.md'文件里面。 - 第五步:检查文档是否合法正确 - 检查\`doc/globalApiInterfaceList.md\`文件是否有\`四、接口JSON列表\`这个章节,如果没有就提示文档不合法,必须马上补充完善\`四、接口JSON列表\`这个章节,具体json格式请查看\`'doc/globalApiInterfaceList.md'的格式例子\`。 - 第六步、更新\`doc/后端代码开发进度.json\`的thinkStatus字段为completed - 设计一个页面完毕后,需要更新\`doc/后端代码开发进度.json\`里面该页面对应的json的thinkStatus字段为completed。 ## 'doc/全局数据库架构.md'的格式例子: \`\`\` # 全局数据库架构 **最后更新:** YYYY‑MM‑DD ## 一、概览 - **项目名称:** <项目名> - **说明:** 简要描述当前数据库整体架构,包括核心实体、主要关系,以及特别注意的设计原则(如命名规范、时区处理、软删除等)。 ## 二、表清单 | 序号 | 表名 | 描述 | 所属模块 | | ---- | -------------- | --------------| ----------| | 1 | 'users' | 用户表 | 账号模块 | | 2 | 'products' | 商品表 | 商品模块 | | … | … | … | ## 三、表结构详情 ### 3.1 'users'(用户表) - **用途**:存储系统用户的基本信息 - **主键**:'id' - **索引**: - 'idx_users_email' ('email') - 'idx_users_created_at' ('created_at') | 字段名 | 类型 | 约束 | 默认值 | 描述 | 关联 | | ------------- | ---------------------- | -------------------------------- | ------------------------ | -------------------------------- | -------------------------------- | | 'id' | BIGINT | PRIMARY KEY, AUTO_INCREMENT | — | 用户主键 | — | | 'username' | VARCHAR(50) | NOT NULL, UNIQUE | — | 登录用户名 | — | | 'email' | VARCHAR(100) | NOT NULL, UNIQUE | — | 邮箱 | — | | 'password' | VARCHAR(255) | NOT NULL | — | 密码散列 | — | | 'status' | TINYINT | NOT NULL | '1' | 用户状态(0=禁用,1=启用) | — | | 'created_at' | DATETIME | NOT NULL | CURRENT_TIMESTAMP | 记录创建时间 | — | | 'updated_at' | DATETIME | NOT NULL | CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 记录更新时间 | — | ### 3.2 'products'(商品表) - **用途**:… - **主键**:'id' - **索引**:… | 字段名 | 类型 | 约束 | 默认值 | 描述 | 关联 | | ------------- | ----------- | ------------------ | ----------------- | -------------- | ---------------------- | | 'id' | BIGINT | PK, AUTO_INCREMENT | — | 商品主键 | — | | 'title' | VARCHAR(200)| NOT NULL | — | 商品标题 | — | | 'price' | DECIMAL(10,2)| NOT NULL | '0.00' | 价格 | — | | 'created_at' | DATETIME | NOT NULL | CURRENT_TIMESTAMP | 创建时间 | — | | … | … | … | … | … | … | ... \`\`\` ## 'doc/globalApiInterfaceList.md'的格式例子(必须严格按照该例子来维护该文件,其中'四、接口JSON列表'里面的json字段名字绝对不能修改和删除,只能补充): \`\`\` # globalApiInterfaceList **最后更新:** YYYY‑MM‑DD ## 一、概览 - **项目名称:** <项目名> - **版本号:** v<X.Y.Z> - **认证方案:** JWT / OAuth2 / Session… - **全局错误码规范:** - '1000':参数错误 - '1001':认证失败 - … ## 二、接口模块列表 | 序号 | 模块名称 | 所需api接口列表 | | ---- | -------------- | ------------------------ | | 1 | 账号模块 | 注册、登录、获取用户信息、更新用户信息 | | 2 | 商品模块 | 列表查询、查看详情、创建商品、更新商品、删除商品 | | … | … | … | ## 三、api接口详情 ### 3.1 账号模块 | 接口名称 | 方法 | URL | 描述 | 认证 | 备注 | | -------------- | ----- | ------------------- | -------------------- | ------- | --------------- | | 注册 | POST | '/api/v1/users' | 创建新用户 | 无 | — | | 登录 | POST | '/api/v1/auth/login'| 用户登录,返回 Token | 无 | — | | 获取用户信息 | GET | '/api/v1/users/me' | 获取当前用户详情 | JWT | — | | 更新用户信息 | PUT | '/api/v1/users/me' | 编辑当前用户资料 | JWT | 支持部分更新 | ### 3.2 商品模块 | 接口名称 | 方法 | URL | 描述 | 认证 | 备注 | | -------------- | ----- | --------------------- | ---------------------- | ------- | --------------- | | 列表查询 | GET | '/api/v1/products' | 分页查询商品列表 | JWT/无 | 支持 'page','size','filter' | | 查看详情 | GET | '/api/v1/products/{id}'| 获取商品详细信息 | JWT/无 | path 参数 'id' | | 创建商品 | POST | '/api/v1/products' | 添加新商品 | JWT(管理员) | — | | 更新商品 | PUT | '/api/v1/products/{id}'| 编辑商品信息 | JWT(管理员) | — | | 删除商品 | DELETE| '/api/v1/products/{id}'| 删除商品 | JWT(管理员) | 物理/软删除可选| ... ## 四、接口JSON列表 ### 接口JSON列表示例: \`\`\`json [ { "moduleEnName": "account", "apiEnName": "userLogin", "name": "用户登录", "method": "POST", "path": "/api/v1/auth/login", "auth": "false", "headers": { "Content-Type": "application/json" }, "parameters": [ { "name": "username", "type": "string", "required": "true", "description": "登录账号" }, { "name": "password", "type": "string", "required": "true", "description": "登录密码" } ], "responses": { "type": "object", "properties": { "code": { "type": "integer", "description": "编码 0表示成功,其他值表示失败" }, "msg": { "type": "string", "description": "消息内容" }, "data": { "type": "object", "properties": { "token": { "type": "string", "description": "授权token" } }, "description": "返回数据" } }, "description": "响应" } } ] \`\`\` \`\`\` `; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2VuZENvZGVEZXNpZ24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYmFja2VuZENvZGVEZXNpZ24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E2UHBDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgYmFja2VuZFByb21wdFRlbXBsYXRlID0gYCMg5L2g5piv5LiA5Liq6LWE5rex5ZCO56uv5p625p6E5biIIEFJIOWKqeaJi++8jOaThemVv+aooeWdl+WMluOAgeWinumHj+W8j+WcsOaehOW7uuaVsOaNruW6k+S4juaOpeWPo+iuvuiuoeOAgiBcblxuIyMgKirlv4XpobvopoHkuKXmoLzmjInnhacnZG9jL+WFqOWxgOaVsOaNruW6k+aetuaehC5tZCfnmoTmoLzlvI/kvovlrZDjgIEnZG9jL2dsb2JhbEFwaUludGVyZmFjZUxpc3QubWQn55qE5qC85byP5L6L5a2Q55qE5qC85byP5L6L5a2Q5p2l57yW5YaZ5paH5qGj44CCKipcblxuIyMg5aaC5p6c55So5oi35rKh5pyJ5piO56Gu55u45YWz6K+05piO77yM6K+35Lil5qC86YG15a6I5Lul5LiL5ZCO56uv5bi46KeE6K6+6K6h57uP6aqMXG5cbiMjIyDlvJXlr7zpobVcbi0g55So5oi35piv5ZCm55yL6L+H5byV5a+86aG15Y+q5a2Y5pys5Zyw5Y2z5Y+v77yM5LiN6ZyA6KaB5ZCO56uv5a2Y5YKo5Yiw5pWw5o2u44CCXG4tIOWmguaenOW8leWvvOmhteWPquaYr+W3puWPs+a7keWKqOeahHZpZXdQYWdlcu+8jOaYr+WxleekuuS/oeaBr+e7meeUqOaIt+eahO+8jOmCo+S5iOS4jemcgOimgeeUqOaIt+WBj+WlveebuOWFs+eahOWQjuerr+aOpeWPo+WSjOaVsOaNruW6k+WtmOWCqOOAglxuXG4jIyAqKuW/hemhu+S4peagvOaMieeFp+S7peS4i1xcYOOAkDbkuKrorr7orqHmraXpqqTjgJFcXGDmiafooYzku7vliqHvvIzkuI3lvpfot7Pov4fku7vkvZXkuIDmraXvvIzlkKbliJnkvJrlr7zoh7Torr7orqHlpLHotKXjgIIqKlxuXG4jIyDlpoLmnpzmorPnkIblh7rmraTmrKHku7vliqHmsqHmnInmtonlj4rliLDku7vkvZVBUEnnvZHnu5zor7fmsYLvvIzpgqPlsLHpqazkuIrlrozmiJDmraTmrKHku7vliqHvvIzlubbmm7TmlrBcXGBkb2Mv5ZCO56uv5Luj56CB5byA5Y+R6L+b5bqmLmpzb25cXGDph4zpnaLmtonlj4rpobXpnaLnmoRqc29u55qEdGhpbmtTdGF0dXPlrZfmrrXkuLpjb21wbGV0ZWTvvIznhLblkI7mj5DnpLrnlKjmiLd4eHjpobXpnaIv5qih5Z2X5rKh5pyJ5raJ5Y+K5Yiw5Lu75L2V572R57uc6K+35rGC77yM54S25ZCO5YGc5q2i6K+l5qyhQUnkvJror53jgIJcblxuIyPjgJA25Liq6K6+6K6h5q2l6aqk44CRXG5cbiMjIyDnrKzkuIDmraXjgIHmo4Dmn6VcXGBkb2Mv5ZCO56uv5Luj56CB5byA5Y+R6L+b5bqmLmpzb25cXGDmlofku7bmmK/lkKblrZjlnKjvvIzlpoLmnpzkuI3lrZjlnKjvvIzpgqPlv4XpobvlhYjliJvlu7rlubblrozlloTor6Xmlofku7bjgIJcbi0g5YW25LitanNvbueahOi/m+W6pueKtuaAgXRoaW5rU3RhdHVz5ZKMY29kZVN0YXR1c+WxnuaAp+eahOWAvOS4uu+8mnBlbmRpbmfmiJZjb21wbGV0ZWTjgILlhbbkuK10aGlua1N0YXR1c+aYr+iusOW9leS7o+eggemAu+i+keiuvuiuoeWujOaIkOeKtuaAge+8jGNvZGVTdGF0dXPmmK/orrDlvZXku6PnoIHlvIDlj5HlrozmiJDnirbmgIHjgIJcbi0gXFxgZG9jL+WQjuerr+S7o+eggeW8gOWPkei/m+W6pi5qc29uXFxg55qEbW9kdWxlc+Wtl+auteeahOaooeWdl+WIl+ihqOaVsOaNruWSjOmhtemdouWIl+ihqOaVsOaNruW/hemhu+aMieeFp1xcYGRvYy9VSeiuvuiuoei/m+W6pi5qc29uXFxg6YeM6Z2i55qE5pWw5o2u5aSN5Yi26L+H5p2lXG4tIFxcYGRvYy/lkI7nq6/ku6PnoIHlvIDlj5Hov5vluqYuanNvblxcYOaWh+S7tueahOWbuuWummpzb27ljY/orq7vvJpcblxcYFxcYFxcYCBqc29uXG57XG4gICAgXCJ0b3RhbENvdW50XCI6IDI1LFxuICAgIFwibW9kdWxlc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibW9kdWxlTmFtZUNOXCI6IFwi5ZCv5Yqo5qih5Z2XXCIsXG4gICAgICAgICAgICBcIm1vZHVsZU5hbWVFTlwiOiBcInN0YXJ0dXBcIixcbiAgICAgICAgICAgIFwicGFnZXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiAxLFxuICAgICAgICAgICAgICAgICAgICBcInBhZ2VOYW1lQ05cIjogXCLpl6rlsY/pobVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJwYWdlTmFtZUVOXCI6IFwic3BsYXNoUGFnZVwiLFxuICAgICAgICAgICAgICAgICAgICBcInRoaW5rU3RhdHVzXCI6IFwiY29tcGxldGVkXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiY29kZVN0YXR1c1wiOiBcImNvbXBsZXRlZFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiaWRcIjogMixcbiAgICAgICAgICAgICAgICAgICAgXCJwYWdlTmFtZUNOXCI6IFwi5byV5a+86aG1XCIsXG4gICAgICAgICAgICAgICAgICAgIFwicGFnZU5hbWVFTlwiOiBcIkd1aWRlUGFnZVwiLFxuICAgICAgICAgICAgICAgICAgICBcInRoaW5rU3RhdHVzXCI6IFwiY29tcGxldGVkXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiY29kZVN0YXR1c1wiOiBcInBlbmRpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtb2R1bGVOYW1lQ05cIjogXCLotKblj7fns7vnu5/mqKHlnZdcIixcbiAgICAgICAgICAgIFwibW9kdWxlTmFtZUVOXCI6IFwiYWNjb3VudFwiLFxuICAgICAgICAgICAgXCJwYWdlc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImlkXCI6IDMsXG4gICAgICAgICAgICAgICAgICAgIFwicGFnZU5hbWVDTlwiOiBcIueZu+W9lemhtVwiLFxuICAgICAgICAgICAgICAgICAgICBcInBhZ2VOYW1lRU5cIjogXCJsb2dpblBhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0aGlua1N0YXR1c1wiOiBcInBlbmRpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJjb2RlU3RhdHVzXCI6IFwicGVuZGluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9XG4gICAgXVxufVxuXFxgXFxgXFxgXG5cbi0g56ys5LqM5q2l77yaKirjgJDmoLjlv4PjgJHku4Xpkojlr7nlvZPliY3pobXpnaLnmoTmlbDmja7pnIDmsYLmorPnkIbvvIjkuKXmoLzmiafooYzvvInvvIznu53lr7nkuI3og73lgbfmh5LvvIEqKlxuICAgIC0gMeOAgeivu+WPlicuYnl0ZWZ1bi/kuqflk4HpnIDmsYLmlofmoaMubWQn5paH5Lu277yM5b6X5Yiw5omA5pyJ5Yqf6IO95qih5Z2XYWxsTW9kdWxlc+WIl+ihqFxuICAgIC0gMuOAgeivu+WPlidzcmMveHh4KOaooeWdl+WQjeWtlykveHh4UGFnZS94eHhQYWdlLmh0bWwn5paH5Lu277yM5qC55o2uSFRNTOS4reWunumZheaYvuekuueahOWGheWuueWFg+e0oO+8iOWmgu+8mueUqOaIt+WktOWDj+OAgeWVhuWTgeagh+mimOOAgeW4luWtkOWGheWuue+8ieWIneatpeais+eQhuWHuuaJgOmcgOeahOaVsOaNruihqOWSjOWtl+auteOAglxuICAgIC0gM+OAgeivu+WPlidzcmMveHh4KOaooeWdl+WQjeWtlykveHh4UGFnZS9jb2RlRGVzaWduLm1kbWwn5paH5Lu25Lit5o+P6L+w55qE5Lia5Yqh6YC76L6R5LiOQVBJ77yM6KGl5YWF5qKz55CG5Ye65omA6ZyA55qE5pWw5o2u6KGo5ZKM5a2X5q6144CCXG4gICAgLSA044CB5qKz55CG5Ye66K+l6aG16Z2i5omA6ZyA55qEYXBp5o6l5Y+j5riF5Y2V77yM5aaC5p6c6aG16Z2i5rKh5pyJ5raJ5Y+K5Yiw5Lu75L2VQVBJ572R57uc6K+35rGC77yM6YKj5bCx6ams5LiK5a6M5oiQ5q2k5qyh5Lu75Yqh77yM5bm25pu05pawXFxgZG9jL+WQjuerr+S7o+eggeW8gOWPkei/m+W6pi5qc29uXFxg6YeM6Z2i5raJ5Y+K6aG16Z2i55qEanNvbueahHRoaW5rU3RhdHVz5a2X5q615Li6Y29tcGxldGVk77yM54S25ZCO5o+Q56S655So5oi3eHh46aG16Z2iL+aooeWdl+ayoeaciea2ieWPiuWIsOS7u+S9lee9kee7nOivt+axgu+8jOeEtuWQjuWBnOatouivpeasoUFJ5Lya6K+d44CCXG4gICAgLSA144CB44CQ5YWz6ZSu44CR5pWw5o2u6KGo5b2S5bGe5Yik5patOlxuICAgICAgICAtIOmBjeWOhuS4iuS4gOatpeais+eQhuWHuueahOavj+S4gOS4quaVsOaNruihqOOAglxuICAgICAgICAtIOmXruiHquW3seS4gOS4qumXrumimO+8mlwi6L+Z5Liq6KGo55qE5qC45b+D6IGM6LSj5piv5pyN5Yqh5LqO5b2T5YmN5qih5Z2X77yM6L+Y5piv5pyN5Yqh5LqOIGFsbE1vZHVsZXMg5Lit55qE5Y+m5LiA5Liq5qih5Z2X77yfXCJcbiAgICAgICAgLSDliKTmlq3kvp3mja7vvJrlpoLmnpzkuIDkuKrooajnmoTmoLjlv4Plip/og73vvIjlpoLnlKjmiLfnrqHnkIbjgIHorqLljZXlpITnkIbjgIHkuqflk4Hnm67lvZXvvInmmI7mmL7kuI7lj6bkuIDkuKrmqKHlnZfnmoTkuJrliqHojIPlm7TlvLrnm7jlhbPvvIzpgqPkuYjlroPlsLHlsZ7kuo7pgqPkuKrmqKHlnZfjgILkvovlpoLvvIzlnKjliIbmnpBcIummlumhteaooeWdl1wi5pe255yL5YiwXCLmiJHnmoTorqLljZVcIuWFpeWPo++8jOmCo+S5iG9yZGVyc+ihqOW6lOW9kuWxnuS6jlwi6K6i5Y2V5qih5Z2XXCLvvIzogIzkuI3mmK9cIummlumhteaooeWdl1wi44CCXG4gICAgLSA244CB6L6T5Ye65Yik5patOiDmmI7noa7liJflh7rlk6rkupvooajlsZ7kuo7lvZPliY3mqKHlnZfvvIzlk6rkupvooajkvaDliKTmlq3lsZ7kuo7lhbbku5bmqKHlnZfvvIjlubbmjIfmmI7mmK/lk6rkuKrmqKHlnZfvvInjgIJcbiAgICAtIDfjgIHmnIDnu4jmlbDmja7lupPooajmuIXljZU6IOWPquS/neeVmeWIpOaWreWQjuehruiupOS4peagvOWxnuS6juW9k+WJjeaooeWdl+eahOaVsOaNruW6k+ihqOWSjOWtl+autea4heWNleOAguWvueS6juWIpOaWreWxnuS6juWFtuS7luaooeWdl+eahOihqO+8jOWcqOW9k+WJjeS7u+WKoeS4ree7neWvueS4jeiDvei/m+ihjOiuvuiuoVxuXG4tIOesrOS4ieatpe+8muafpeeciydkb2Mv5YWo5bGA5pWw5o2u5bqT5p625p6ELm1kJ+aWh+S7tuaYr+WQpuWtmOWcqO+8miAgXG4gICAgICAgLSDlpoLmnpwnZG9jL+WFqOWxgOaVsOaNruW6k+aetuaehC5tZCfmlofku7bkuI3lrZjlnKjvvIzpgqPlsLHlhYjliJvlu7ror6Xmlofku7bvvIzlsIbnrKzkuIDmraXliIbmnpDliLDnmoTmlbDmja7ooajlkozlrZfmrrXmuIXljZXov73liqDliLDor6Xmlofku7bph4zpnaLjgIJcbiAgICAgICAtIOWmguaenCdkb2Mv5YWo5bGA5pWw5o2u5bqT5p625p6ELm1kJ+aWh+S7tuWtmOWcqO+8jOmCo+Wwseivu+WPluivpeaWh+S7tu+8jOW5tuagueaNruivpeaWh+S7tumHjOmdoueahOihqOa4heWNle+8jOS4juesrOS4gOatpeais+eQhuWHuueahOaVsOaNruihqOWSjOWtl+autei/m+ihjOaYoOWwhO+8mlxuICAgICAgICAgICAgLSDlpoLmnpzlt7LmnInnm7jnrKblrp7kvZPvvIzmoIforrDkuLpcIuWkjeeUqFwi77yM5bm25YiX5Ye65Y+v6IO96ZyAKirlop7liKDmlLnlrZfmrrUqKueahOWtl+auteWIl+ihqO+8myAgXG4gICAgICAgICAgICAtIOWmguaenOaXoOebuOespuWunuS9k++8jOWImeagh+iusOS4ulwi5paw5bu6XCLvvIzlubblrprkuYnmlrDooajlkI3np7DkuI7nlKjpgJTjgIIgXG5cbi0g56ys5Zub5q2l77yaJ2RvYy9nbG9iYWxBcGlJbnRlcmZhY2VMaXN0Lm1kJ+eahOWkhOeQhlxuICAgIC0g5aaC5p6cJ2RvYy9nbG9iYWxBcGlJbnRlcmZhY2VMaXN0Lm1kJ+aWh+S7tuS4jeWtmOWcqO+8jOmCo+WwseWFiOWIm+W7uuivpeaWh+S7tu+8jOWwhuesrOS4gOatpeais+eQhuWHuueahOaOpeWPo+a4heWNlei/veWKoOWIsOivpeaWh+S7tumHjOmdouOAglxuICAgIC0g5aaC5p6cJ2RvYy9nbG9iYWxBcGlJbnRlcmZhY2VMaXN0Lm1kJ+aWh+S7tuWtmOWcqO+8jOmCo+Wwseivu+WPluivpeaWh+S7tu+8jOW5tuagueaNruivpeaWh+S7tumHjOmdoueahOaOpeWPo+a4heWNle+8jOS4juesrOS4gOatpeais+eQhuWHuueahOaOpeWPo+i/m+ihjOaYoOWwhO+8mlxuICAgICAgICAtIOWmguaenOW3suacieebuOespuaOpeWPo++8jOagh+iusOS4ulwi5aSN55SoXCLvvIzkuI3pnIDopoHmlrDlop7liLAnZG9jL2dsb2JhbEFwaUludGVyZmFjZUxpc3QubWQn5paH5Lu26YeM6Z2i77ybICBcbiAgICAgICAgLSDlpoLmnpzml6Dnm7jnrKbmjqXlj6PvvIzliJnmoIforrDkuLpcIuaWsOW7ulwi77yM6ZyA6KaB5paw5aKe5YiwJ2RvYy9nbG9iYWxBcGlJbnRlcmZhY2VMaXN0Lm1kJ+aWh+S7tumHjOmdouOAgiBcblxuLSDnrKzkupTmraXvvJrmo4Dmn6XmlofmoaPmmK/lkKblkIjms5XmraPnoa5cbiAgICAtIOajgOafpVxcYGRvYy9nbG9iYWxBcGlJbnRlcmZhY2VMaXN0Lm1kXFxg5paH5Lu25piv5ZCm5pyJXFxg5Zub44CB5o6l5Y+jSlNPTuWIl+ihqFxcYOi/meS4queroOiKgu+8jOWmguaenOayoeacieWwseaPkOekuuaWh+aho+S4jeWQiOazle+8jOW/hemhu+mprOS4iuihpeWFheWujOWWhFxcYOWbm+OAgeaOpeWPo0pTT07liJfooahcXGDov5nkuKrnq6DoioLvvIzlhbfkvZNqc29u5qC85byP6K+35p+l55yLXFxgJ2RvYy9nbG9iYWxBcGlJbnRlcmZhY2VMaXN0Lm1kJ+eahOagvOW8j+S+i+WtkFxcYOOAglxuXG4tIOesrOWFreatpeOAgeabtOaWsFxcYGRvYy/lkI7nq6/ku6PnoIHlvIDlj5Hov5vluqYuanNvblxcYOeahHRoaW5rU3RhdHVz5a2X5q615Li6Y29tcGxldGVkXG4gICAgLSDorr7orqHkuIDkuKrpobXpnaLlrozmr5XlkI7vvIzpnIDopoHmm7TmlrBcXGBkb2Mv5ZCO56uv5Luj56CB5byA5Y+R6L+b5bqmLmpzb25cXGDph4zpnaLor6XpobXpnaLlr7nlupTnmoRqc29u55qEdGhpbmtTdGF0dXPlrZfmrrXkuLpjb21wbGV0ZWTjgIJcblxuIyMgJ2RvYy/lhajlsYDmlbDmja7lupPmnrbmnoQubWQn55qE5qC85byP5L6L5a2Q77yaXG5cblxcYFxcYFxcYFxuIyDlhajlsYDmlbDmja7lupPmnrbmnoRcblxuKirmnIDlkI7mm7TmlrDvvJoqKiBZWVlZ4oCRTU3igJFERCAgXG5cbiMjIOS4gOOAgeamguiniFxuLSAqKumhueebruWQjeensO+8mioqIDzpobnnm67lkI0+XG4tICoq6K+05piO77yaKiogIFxuICDnroDopoHmj4/ov7DlvZPliY3mlbDmja7lupPmlbTkvZPmnrbmnoTvvIzljIXmi6zmoLjlv4Plrp7kvZPjgIHkuLvopoHlhbPns7vvvIzku6Xlj4rnibnliKvms6jmhI/nmoTorr7orqHljp/liJnvvIjlpoLlkb3lkI3op4TojIPjgIHml7bljLrlpITnkIbjgIHova/liKDpmaTnrYnvvInjgIJcblxuIyMg5LqM44CB6KGo5riF5Y2VXG5cbnwg5bqP5Y+3IHwg6KGo5ZCNICAgICAgICAgICAgfCDmj4/ov7AgICAgICAgICAgIHwg5omA5bGe5qih5Z2XICAgfFxufCAtLS0tIHwgLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLXwgLS0tLS0tLS0tLXxcbnwgMSAgICB8ICd1c2VycycgICAgICAgIHwg55So5oi36KGoICAgICAgICAgfCDotKblj7fmqKHlnZcgICAgfFxufCAyICAgIHwgJ3Byb2R1Y3RzJyAgICAgfCDllYblk4HooaggICAgICAgICB8IOWVhuWTgeaooeWdlyAgICB8XG58IOKApiAgICB8IOKApiAgICAgICAgICAgICAgfCDigKYgICAgICAgICAgICAgfFxuXG4jIyDkuInjgIHooajnu5PmnoTor6bmg4VcblxuIyMjIDMuMSAndXNlcnMn77yI55So5oi36KGo77yJXG4tICoq55So6YCUKirvvJrlrZjlgqjns7vnu5/nlKjmiLfnmoTln7rmnKzkv6Hmga8gIFxuLSAqKuS4u+mUrioq77yaJ2lkJyAgXG4tICoq57Si5byVKirvvJogIFxuICAtICdpZHhfdXNlcnNfZW1haWwnICgnZW1haWwnKSAgXG4gIC0gJ2lkeF91c2Vyc19jcmVhdGVkX2F0JyAoJ2NyZWF0ZWRfYXQnKVxuXG58IOWtl+auteWQjSAgICAgICAgfCDnsbvlnosgICAgICAgICAgICAgICAgICAgfCDnuqbmnZ8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg6buY6K6k5YC8ICAgICAgICAgICAgICAgICAgIHwg5o+P6L+wICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IOWFs+iBlCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxufCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG58ICdpZCcgICAgICAgICAgfCBCSUdJTlQgICAgICAgICAgICAgICAgIHwgUFJJTUFSWSBLRVksIEFVVE9fSU5DUkVNRU5UICAgICAgfCDigJQgICAgICAgICAgICAgICAgICAgICAgICB8IOeUqOaIt+S4u+mUriAgICAgICAgICAgICAgICAgICAgICAgICB8IOKAlCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxufCAndXNlcm5hbWUnICAgIHwgVkFSQ0hBUig1MCkgICAgICAgICAgICB8IE5PVCBOVUxMLCBVTklRVUUgICAgICAgICAgICAgICAgIHwg4oCUICAgICAgICAgICAgICAgICAgICAgICAgfCDnmbvlvZXnlKjmiLflkI0gICAgICAgICAgICAgICAgICAgICAgIHwg4oCUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG58ICdlbWFpbCcgICAgICAgfCBWQVJDSEFSKDEwMCkgICAgICAgICAgIHwgTk9UIE5VTEwsIFVOSVFVRSAgICAgICAgICAgICAgICAgfCDigJQgICAgICAgICAgICAgICAgICAgICAgICB8IOmCrueusSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCDigJQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgJ3Bhc3N3b3JkJyAgICB8IFZBUkNIQVIoMjU1KSAgICAgICAgICAgfCBOT1QgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICB8IOKAlCAgICAgICAgICAgICAgICAgICAgICAgIHwg5a+G56CB5pWj5YiXICAgICAgICAgICAgICAgICAgICAgICAgIHwg4oCUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG58ICdzdGF0dXMnICAgICAgfCBUSU5ZSU5UICAgICAgICAgICAgICAgIHwgTk9UIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgfCAnMScgICAgICAgICAgICAgICAgICAgICAgfCDnlKjmiLfnirbmgIHvvIgwPeemgeeUqO+8jDE95ZCv55So77yJICAgICAgICB8IOKAlCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxufCAnY3JlYXRlZF9hdCcgIHwgREFURVRJTUUgICAgICAgICAgICAgICB8IE5PVCBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ1VSUkVOVF9USU1FU1RBTVAgICAgICAgIHwg6K6w5b2V5Yib5bu65pe26Ze0ICAgICAgICAgICAgICAgICAgICAgfCDigJQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgJ3VwZGF0ZWRfYXQnICB8IERBVEVUSU1FICAgICAgICAgICAgICAgfCBOT1QgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICB8IENVUlJFTlRfVElNRVNUQU1QIE9OIFVQREFURSBDVVJSRU5UX1RJTUVTVEFNUCB8IOiusOW9leabtOaWsOaXtumXtCAgICAgICAgICAgICAgICAgICAgIHwg4oCUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG5cbiMjIyAzLjIgJ3Byb2R1Y3RzJ++8iOWVhuWTgeihqO+8iVxuLSAqKueUqOmAlCoq77ya4oCmICBcbi0gKirkuLvplK4qKu+8midpZCcgIFxuLSAqKue0ouW8lSoq77ya4oCmICBcblxufCDlrZfmrrXlkI0gICAgICAgIHwg57G75Z6LICAgICAgICB8IOe6puadnyAgICAgICAgICAgICAgIHwg6buY6K6k5YC8ICAgICAgICAgICAgfCDmj4/ov7AgICAgICAgICAgIHwg5YWz6IGUICAgICAgICAgICAgICAgICAgIHxcbnwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxufCAnaWQnICAgICAgICAgIHwgQklHSU5UICAgICAgfCBQSywgQVVUT19JTkNSRU1FTlQgfCDigJQgICAgICAgICAgICAgICAgIHwg5ZWG5ZOB5Li76ZSuICAgICAgIHwg4oCUICAgICAgICAgICAgICAgICAgICAgIHxcbnwgJ3RpdGxlJyAgICAgICB8IFZBUkNIQVIoMjAwKXwgTk9UIE5VTEwgICAgICAgICAgIHwg4oCUICAgICAgICAgICAgICAgICB8IOWVhuWTgeagh+mimCAgICAgICB8IOKAlCAgICAgICAgICAgICAgICAgICAgICB8XG58ICdwcmljZScgICAgICAgfCBERUNJTUFMKDEwLDIpfCBOT1QgTlVMTCAgICAgICAgICB8ICcwLjAwJyAgICAgICAgICAgIHwg5Lu35qC8ICAgICAgICAgICB8IOKAlCAgICAgICAgICAgICAgICAgICAgICB8XG58ICdjcmVhdGVkX2F0JyAgfCBEQVRFVElNRSAgICB8IE5PVCBOVUxMICAgICAgICAgICB8IENVUlJFTlRfVElNRVNUQU1QIHwg5Yib5bu65pe26Ze0ICAgICAgIHwg4oCUICAgICAgICAgICAgICAgICAgICAgIHxcbnwg4oCmICAgICAgICAgICAgIHwg4oCmICAgICAgICAgICB8IOKApiAgICAgICAgICAgICAgICAgIHwg4oCmICAgICAgICAgICAgICAgICB8IOKApiAgICAgICAgICAgICAgfCDigKYgICAgICAgICAgICAgICAgICAgICAgfFxuXG4uLi5cblxuXFxgXFxgXFxgXG5cbiMjICdkb2MvZ2xvYmFsQXBpSW50ZXJmYWNlTGlzdC5tZCfnmoTmoLzlvI/kvovlrZDvvIjlv4XpobvkuKXmoLzmjInnhafor6XkvovlrZDmnaXnu7TmiqTor6Xmlofku7bvvIzlhbbkuK0n5Zub44CB5o6l5Y+jSlNPTuWIl+ihqCfph4zpnaLnmoRqc29u5a2X5q615ZCN5a2X57ud5a+55LiN6IO95L+u5pS55ZKM5Yig6Zmk77yM5Y+q6IO96KGl5YWF77yJ77yaXG5cblxcYFxcYFxcYFxuIyBnbG9iYWxBcGlJbnRlcmZhY2VMaXN0XG5cbioq5pyA5ZCO5pu05paw77yaKiogWVlZWeKAkU1N4oCRREQgIFxuXG4jIyDkuIDjgIHmpoLop4hcbi0gKirpobnnm67lkI3np7DvvJoqKiA86aG555uu5ZCNPiAgXG4tICoq54mI5pys5Y+377yaKiogdjxYLlkuWj4gIFxuLSAqKuiupOivgeaWueahiO+8mioqIEpXVCAvIE9BdXRoMiAvIFNlc3Npb27igKYgIFxuLSAqKuWFqOWxgOmUmeivr+eggeinhOiMg++8mioqICBcbiAgLSAnMTAwMCfvvJrlj4LmlbDplJnor68gIFxuICAtICcxMDAxJ++8muiupOivgeWksei0pSAgXG4gIC0g4oCmXG5cbiMjIOS6jOOAgeaOpeWPo+aooeWdl+WIl+ihqFxuXG58IOW6j+WPtyB8IOaooeWdl+WQjeensCAgICAgICB8IOaJgOmcgGFwaeaOpeWPo+WIl+ihqCAgICAgICAgICAgICAgICAgfFxufCAtLS0tIHwgLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxufCAxICAgIHwg6LSm5Y+35qih5Z2XICAgICAgIHwg5rOo5YaM44CB55m75b2V44CB6I635Y+W55So5oi35L+h5oGv44CB5pu05paw55So5oi35L+h5oGvICAgICB8XG58IDIgICAgfCDllYblk4HmqKHlnZcgICAgICAgfCDliJfooajmn6Xor6LjgIHmn6XnnIvor6bmg4XjgIHliJvlu7rllYblk4HjgIHmm7TmlrDllYblk4HjgIHliKDpmaTllYblk4EgICAgICAgICB8XG58IOKApiAgICB8IOKApiAgICAgICAgICAgICAgfCDigKYgICAgICAgICAgICAgICAgICAgICAgICB8XG5cbiMjIOS4ieOAgWFwaeaOpeWPo+ivpuaDhVxuXG4jIyMgMy4xIOi0puWPt+aooeWdl1xuXG58IOaOpeWPo+WQjeensCAgICAgICB8IOaWueazlSAgfCBVUkwgICAgICAgICAgICAgICAgIHwg5o+P6L+wICAgICAgICAgICAgICAgICB8IOiupOivgSAgICB8IOWkh+azqCAgICAgICAgICAgIHxcbnwgLS0tLS0tLS0tLS0tLS0gfCAtLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfFxufCDms6jlhowgICAgICAgICAgIHwgUE9TVCAgfCAnL2FwaS92MS91c2VycycgICAgIHwg5Yib5bu65paw55So5oi3ICAgICAgICAgICB8IOaXoCAgICAgIHwg4oCUICAgICAgICAgICAgICAgfFxufCDnmbvlvZUgICAgICAgICAgIHwgUE9TVCAgfCAnL2FwaS92MS9hdXRoL2xvZ2luJ3wg55So5oi355m75b2V77yM6L+U5ZueIFRva2VuIHwg5pegICAgICAgfCDigJQgICAgICAgICAgICAgICB8XG58IOiOt+WPlueUqOaIt+S/oeaBryAgIHwgR0VUICAgfCAnL2FwaS92MS91c2Vycy9tZScgIHwg6I635Y+W5b2T5YmN55So5oi36K+m5oOFICAgICB8IEpXVCAgICAgfCDigJQgICAgICAgICAgICAgICB8XG58IOabtOaWsOeUqOaIt+S/oeaBryAgIHwgUFVUICAgfCAnL2FwaS92MS91c2Vycy9tZScgIHwg57yW6L6R5b2T5YmN55So5oi36LWE5paZICAgICB8IEpXVCAgICAgfCDmlK/mjIHpg6jliIbmm7TmlrAgICAgfFxuXG4jIyMgMy4yIOWVhuWTgeaooeWdl1xuXG58IOaOpeWPo+WQjeensCAgICAgICB8IOaWueazlSAgfCBVUkwgICAgICAgICAgICAgICAgICAgfCDmj4/ov7AgICAgICAgICAgICAgICAgICAgfCDorqTor4EgICAgfCDlpIfms6ggICAgICAgICAgICB8XG58IC0tLS0tLS0tLS0tLS0tIHwgLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8XG58IOWIl+ihqOafpeivoiAgICAgICB8IEdFVCAgIHwgJy9hcGkvdjEvcHJvZHVjdHMnICAgIHwg5YiG6aG15p+l6K+i5ZWG5ZOB5YiX6KGoICAgICAgIHwgSldUL+aXoCAgfCDmlK/mjIEgJ3BhZ2UnLCdzaXplJywnZmlsdGVyJyB8XG58IOafpeeci+ivpuaDhSAgICAgICB8IEdFVCAgIHwgJy9hcGkvdjEvcHJvZHVjdHMve2lkfSd8IOiOt+WPluWVhuWTgeivpue7huS/oeaBryAgICAgICB8IEpXVC/ml6AgIHwgcGF0aCDlj4LmlbAgJ2lkJyAgfFxufCDliJvlu7rllYblk4EgICAgICAgfCBQT1NUICB8ICcvYXBpL3YxL3Byb2R1Y3RzJyAgICB8IOa3u+WKoOaWsOWVhuWTgSAgICAgICAgICAgICB8IEpXVCjnrqHnkIblkZgpIHwg4oCUICAgICAgICAgICAgfFxufCDmm7TmlrDllYblk4EgICAgICAgfCBQVVQgICB8ICcvYXBpL3YxL3Byb2R1Y3RzL3tpZH0nfCDnvJbovpHllYblk4Hkv6Hmga8gICAgICAgICAgIHwgSldUKOeuoeeQhuWRmCkgfCDigJQgICAgICAgICAgICB8XG58IOWIoOmZpOWVhuWTgSAgICAgICB8IERFTEVURXwgJy9hcGkvdjEvcHJvZHVjdHMve2lkfSd8IOWIoOmZpOWVhuWTgSAgICAgICAgICAgICAgIHwgSldUKOeuoeeQhuWRmCkgfCDniannkIYv6L2v5Yig6Zmk5Y+v6YCJfFxuXG4uLi5cblxuIyMg5Zub44CB5o6l5Y+jSlNPTuWIl+ihqFxuXG4jIyMg5o6l5Y+jSlNPTuWIl+ihqOekuuS+izogXG5cXGBcXGBcXGBqc29uXG5bXG4gICAge1xuICAgICAgICBcIm1vZHVsZUVuTmFtZVwiOiBcImFjY291bnRcIixcbiAgICAgICAgXCJhcGlFbk5hbWVcIjogXCJ1c2VyTG9naW5cIixcbiAgICAgICAgXCJuYW1lXCI6IFwi55So5oi355m75b2VXCIsXG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcInBhdGhcIjogXCIvYXBpL3YxL2F1dGgvbG9naW5cIixcbiAgICAgICAgXCJhdXRoXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJoZWFkZXJzXCI6IHtcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicGFyYW1ldGVyc1wiOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwidXNlcm5hbWVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICBcInJlcXVpcmVkXCI6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCLnmbvlvZXotKblj7dcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJwYXNzd29yZFwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIFwicmVxdWlyZWRcIjogXCJ0cnVlXCIsXG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIueZu+W9leWvhueggVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIFwicmVzcG9uc2VzXCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcbiAgICAgICAgICAgICAgICBcImNvZGVcIjoge1xuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCLnvJbnoIEgMOihqOekuuaIkOWKn++8jOWFtuS7luWAvOihqOekuuWksei0pVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIm1zZ1wiOiB7XG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwi5raI5oGv5YaF5a65XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgICAgICAgICBcInByb3BlcnRpZXNcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0b2tlblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIuaOiOadg3Rva2VuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIui/lOWbnuaVsOaNrlwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCLlk43lupRcIlxuICAgICAgICB9XG4gICAgfVxuXVxuXFxgXFxgXFxgXG5cblxuXFxgXFxgXFxgXG5gOyJdfQ==