443 lines
43 KiB
Plaintext
443 lines
43 KiB
Plaintext
import { createHotContext as __vite__createHotContext } from "/@vite/client";import.meta.hot = __vite__createHotContext("/components/SettingsPanel.vue");import { defineComponent as _defineComponent } from "/@fs/D:/dndClaw/agent-console/node_modules/.vite/deps/vue.js?v=4266a811";
|
||
import { computed, reactive, ref } from "/@fs/D:/dndClaw/agent-console/node_modules/.vite/deps/vue.js?v=4266a811";
|
||
import { agentSettings } from "/mock.ts";
|
||
const STORAGE_KEY = "agent-console-api-list";
|
||
const _sfc_main = /* @__PURE__ */ _defineComponent({
|
||
__name: "SettingsPanel",
|
||
props: {
|
||
view: { type: String, required: true }
|
||
},
|
||
emits: ["back"],
|
||
setup(__props, { expose: __expose }) {
|
||
__expose();
|
||
const props = __props;
|
||
const titleMap = {
|
||
features: "功能开关",
|
||
api: "大模型 API 设置",
|
||
workflow: "日常工作流管理"
|
||
};
|
||
const title = computed(() => titleMap[props.view] ?? "设置");
|
||
const features = agentSettings;
|
||
const providers = [
|
||
{
|
||
key: "qianfan_v2",
|
||
label: "文心千帆 v2",
|
||
description: "Bearer Token 方式,推荐使用",
|
||
fields: [
|
||
{ key: "baseUrl", label: "Base URL", type: "text", default: "https://qianfan.baidubce.com/v2/chat/completions" },
|
||
{ key: "authorization", label: "Authorization", type: "text", default: "Bearer bce-v3/ALTAK-t6cEDUmPPSmoYJbGUPj2f/c136be53cb9d69e2990dad6030c9e19b1708b284" },
|
||
{ key: "model", label: "模型", type: "text", default: "deepseek-v3.2" },
|
||
{ key: "temperature", label: "Temperature", type: "number", default: 0.934, step: 0.01 }
|
||
]
|
||
},
|
||
{
|
||
key: "openai",
|
||
label: "OpenAI 兼容(OpenAPI)",
|
||
description: "支持 OpenAI 及兼容服务(DeepSeek、通义、智谱等)",
|
||
fields: [
|
||
{ key: "baseUrl", label: "Base URL", type: "text", default: "https://api.openai.com/v1", placeholder: "https://api.openai.com/v1" },
|
||
{ key: "apiKey", label: "API Key", type: "password", default: "", placeholder: "sk-..." },
|
||
{ key: "model", label: "模型", type: "text", default: "gpt-4o-mini", placeholder: "gpt-4o-mini" },
|
||
{ key: "temperature", label: "Temperature", type: "number", default: 0.7, step: 0.01 }
|
||
]
|
||
}
|
||
];
|
||
const selectedProvider = ref("qianfan_v2");
|
||
const currentProvider = computed(() => providers.find((p) => p.key === selectedProvider.value));
|
||
const apiForm = reactive({});
|
||
const saving = ref(false);
|
||
const testResult = ref("");
|
||
const testOk = ref(false);
|
||
function fillDefaults() {
|
||
Object.keys(apiForm).forEach((k) => delete apiForm[k]);
|
||
for (const f of currentProvider.value.fields) {
|
||
apiForm[f.key] = f.default;
|
||
}
|
||
}
|
||
fillDefaults();
|
||
function onProviderChange() {
|
||
fillDefaults();
|
||
testResult.value = "";
|
||
}
|
||
async function testApi() {
|
||
const provider = selectedProvider.value;
|
||
const baseUrl = String(apiForm.baseUrl || "");
|
||
const model = String(apiForm.model || "");
|
||
const temperature = Number(apiForm.temperature ?? 0.7);
|
||
let url = baseUrl;
|
||
let headers = { "Content-Type": "application/json" };
|
||
const body = {
|
||
model,
|
||
messages: [{ role: "user", content: '你好,请只回复"连接成功"四个字' }],
|
||
temperature,
|
||
stream: false
|
||
};
|
||
if (provider === "qianfan_v2") {
|
||
headers["Authorization"] = String(apiForm.authorization || "");
|
||
} else {
|
||
if (!baseUrl.endsWith("/chat/completions")) {
|
||
url = baseUrl.replace(/\/$/, "") + "/chat/completions";
|
||
}
|
||
headers["Authorization"] = "Bearer " + String(apiForm.apiKey || "");
|
||
}
|
||
try {
|
||
const res = await fetch(url, {
|
||
method: "POST",
|
||
headers,
|
||
body: JSON.stringify(body)
|
||
});
|
||
const data = await res.json();
|
||
if (!res.ok) {
|
||
testResult.value = `✗ 保存失败,连通性测试未通过:HTTP ${res.status} ${data?.error?.message || res.statusText}`;
|
||
return false;
|
||
}
|
||
const content = data?.choices?.[0]?.message?.content;
|
||
if (content) {
|
||
return true;
|
||
}
|
||
testResult.value = `✗ 保存失败,响应格式异常:${JSON.stringify(data).slice(0, 120)}`;
|
||
return false;
|
||
} catch (e) {
|
||
testResult.value = `✗ 保存失败,请求异常:${e?.message || String(e)}(可能是 CORS 或网络问题)`;
|
||
return false;
|
||
}
|
||
}
|
||
async function saveAndTest() {
|
||
saving.value = true;
|
||
testResult.value = "";
|
||
testOk.value = false;
|
||
const ok = await testApi();
|
||
if (ok) {
|
||
const providerLabel = currentProvider.value?.label ?? selectedProvider.value;
|
||
const model = String(apiForm.model || "");
|
||
const name = `${providerLabel} · ${model}`;
|
||
const list = JSON.parse(localStorage.getItem(STORAGE_KEY) || "[]");
|
||
const idx = list.findIndex(
|
||
(c) => c.provider === selectedProvider.value && c.model === model
|
||
);
|
||
const entry = {
|
||
id: idx >= 0 ? list[idx].id : `api-${Date.now()}`,
|
||
name,
|
||
provider: selectedProvider.value,
|
||
...apiForm
|
||
};
|
||
if (idx >= 0) list[idx] = entry;
|
||
else list.push(entry);
|
||
localStorage.setItem(STORAGE_KEY, JSON.stringify(list));
|
||
testOk.value = true;
|
||
testResult.value = `✓ 连通性测试通过,配置「${name}」已保存`;
|
||
}
|
||
saving.value = false;
|
||
}
|
||
const workflows = ref([
|
||
{ id: 1, name: "每日经营数据汇总", desc: "每日 09:00 自动汇总前一日经营数据并生成报表", enabled: true },
|
||
{ id: 2, name: "门店巡检提醒", desc: "每周一 10:00 推送巡检任务到负责人", enabled: true },
|
||
{ id: 3, name: "员工排班自动优化", desc: "根据客流预测自动调整排班建议", enabled: false },
|
||
{ id: 4, name: "订单异常预警", desc: "实时监控订单退款率,超阈值自动告警", enabled: true }
|
||
]);
|
||
function addWorkflow() {
|
||
const name = prompt("请输入工作流名称:");
|
||
if (name) {
|
||
workflows.value.push({ id: Date.now(), name, desc: "新建的工作流", enabled: false });
|
||
}
|
||
}
|
||
const __returned__ = { props, titleMap, title, features, providers, selectedProvider, currentProvider, apiForm, saving, testResult, testOk, fillDefaults, onProviderChange, testApi, STORAGE_KEY, saveAndTest, workflows, addWorkflow };
|
||
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
||
return __returned__;
|
||
}
|
||
});
|
||
import { createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, vModelSelect as _vModelSelect, withDirectives as _withDirectives, vModelDynamic as _vModelDynamic, vModelText as _vModelText, normalizeClass as _normalizeClass } from "/@fs/D:/dndClaw/agent-console/node_modules/.vite/deps/vue.js?v=4266a811";
|
||
const _hoisted_1 = { class: "settings" };
|
||
const _hoisted_2 = { class: "header" };
|
||
const _hoisted_3 = { class: "page-title" };
|
||
const _hoisted_4 = { class: "body" };
|
||
const _hoisted_5 = {
|
||
key: 0,
|
||
class: "card"
|
||
};
|
||
const _hoisted_6 = { class: "switch-label-text" };
|
||
const _hoisted_7 = ["checked", "onChange"];
|
||
const _hoisted_8 = { class: "card" };
|
||
const _hoisted_9 = { class: "form-group" };
|
||
const _hoisted_10 = ["value"];
|
||
const _hoisted_11 = { class: "hint" };
|
||
const _hoisted_12 = ["onUpdate:modelValue", "type", "placeholder"];
|
||
const _hoisted_13 = ["onUpdate:modelValue", "step"];
|
||
const _hoisted_14 = ["onUpdate:modelValue"];
|
||
const _hoisted_15 = ["value"];
|
||
const _hoisted_16 = { class: "btn-row" };
|
||
const _hoisted_17 = ["disabled"];
|
||
const _hoisted_18 = { class: "card" };
|
||
const _hoisted_19 = { class: "wf-info" };
|
||
const _hoisted_20 = { class: "wf-name" };
|
||
const _hoisted_21 = { class: "wf-desc" };
|
||
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
||
return _openBlock(), _createElementBlock("section", _hoisted_1, [
|
||
_createCommentVNode(" 顶部 "),
|
||
_createElementVNode("header", _hoisted_2, [
|
||
_createElementVNode("button", {
|
||
class: "back-btn",
|
||
onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("back"))
|
||
}, "← 返回对话"),
|
||
_createElementVNode(
|
||
"div",
|
||
_hoisted_3,
|
||
_toDisplayString($setup.title),
|
||
1
|
||
/* TEXT */
|
||
)
|
||
]),
|
||
_createElementVNode("div", _hoisted_4, [
|
||
_createCommentVNode(" 功能开关 "),
|
||
$props.view === "features" ? (_openBlock(), _createElementBlock("div", _hoisted_5, [
|
||
_cache[2] || (_cache[2] = _createElementVNode(
|
||
"div",
|
||
{ class: "card-title" },
|
||
"智能体行为",
|
||
-1
|
||
/* CACHED */
|
||
)),
|
||
(_openBlock(true), _createElementBlock(
|
||
_Fragment,
|
||
null,
|
||
_renderList($setup.features, (s) => {
|
||
return _openBlock(), _createElementBlock("label", {
|
||
key: s.key,
|
||
class: "switch-row"
|
||
}, [
|
||
_createElementVNode(
|
||
"span",
|
||
_hoisted_6,
|
||
_toDisplayString(s.label),
|
||
1
|
||
/* TEXT */
|
||
),
|
||
_createElementVNode("input", {
|
||
type: "checkbox",
|
||
checked: s.value,
|
||
onChange: ($event) => s.value = $event.target.checked
|
||
}, null, 40, _hoisted_7)
|
||
]);
|
||
}),
|
||
128
|
||
/* KEYED_FRAGMENT */
|
||
))
|
||
])) : $props.view === "api" ? (_openBlock(), _createElementBlock(
|
||
_Fragment,
|
||
{ key: 1 },
|
||
[
|
||
_createCommentVNode(" 大模型 API 设置 "),
|
||
_createElementVNode("div", _hoisted_8, [
|
||
_cache[4] || (_cache[4] = _createElementVNode(
|
||
"div",
|
||
{ class: "card-title" },
|
||
"大模型 API 设置",
|
||
-1
|
||
/* CACHED */
|
||
)),
|
||
_createCommentVNode(" 接入方式选择 "),
|
||
_createElementVNode("div", _hoisted_9, [
|
||
_cache[3] || (_cache[3] = _createElementVNode(
|
||
"label",
|
||
null,
|
||
"接入方式",
|
||
-1
|
||
/* CACHED */
|
||
)),
|
||
_withDirectives(_createElementVNode(
|
||
"select",
|
||
{
|
||
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $setup.selectedProvider = $event),
|
||
onChange: $setup.onProviderChange
|
||
},
|
||
[
|
||
(_openBlock(), _createElementBlock(
|
||
_Fragment,
|
||
null,
|
||
_renderList($setup.providers, (p) => {
|
||
return _createElementVNode("option", {
|
||
key: p.key,
|
||
value: p.key
|
||
}, _toDisplayString(p.label), 9, _hoisted_10);
|
||
}),
|
||
64
|
||
/* STABLE_FRAGMENT */
|
||
))
|
||
],
|
||
544
|
||
/* NEED_HYDRATION, NEED_PATCH */
|
||
), [
|
||
[_vModelSelect, $setup.selectedProvider]
|
||
]),
|
||
_createElementVNode(
|
||
"div",
|
||
_hoisted_11,
|
||
_toDisplayString($setup.currentProvider?.description),
|
||
1
|
||
/* TEXT */
|
||
)
|
||
]),
|
||
_createCommentVNode(" 动态字段 "),
|
||
(_openBlock(true), _createElementBlock(
|
||
_Fragment,
|
||
null,
|
||
_renderList($setup.currentProvider?.fields, (f) => {
|
||
return _openBlock(), _createElementBlock("div", {
|
||
key: f.key,
|
||
class: "form-group"
|
||
}, [
|
||
_createElementVNode(
|
||
"label",
|
||
null,
|
||
_toDisplayString(f.label),
|
||
1
|
||
/* TEXT */
|
||
),
|
||
f.type === "text" || f.type === "password" ? _withDirectives((_openBlock(), _createElementBlock("input", {
|
||
key: 0,
|
||
"onUpdate:modelValue": ($event) => $setup.apiForm[f.key] = $event,
|
||
type: f.type,
|
||
placeholder: f.placeholder
|
||
}, null, 8, _hoisted_12)), [
|
||
[_vModelDynamic, $setup.apiForm[f.key]]
|
||
]) : f.type === "number" ? _withDirectives((_openBlock(), _createElementBlock("input", {
|
||
key: 1,
|
||
"onUpdate:modelValue": ($event) => $setup.apiForm[f.key] = $event,
|
||
type: "number",
|
||
step: f.step ?? 0.01
|
||
}, null, 8, _hoisted_13)), [
|
||
[
|
||
_vModelText,
|
||
$setup.apiForm[f.key],
|
||
void 0,
|
||
{ number: true }
|
||
]
|
||
]) : f.type === "select" ? _withDirectives((_openBlock(), _createElementBlock("select", {
|
||
key: 2,
|
||
"onUpdate:modelValue": ($event) => $setup.apiForm[f.key] = $event
|
||
}, [
|
||
(_openBlock(true), _createElementBlock(
|
||
_Fragment,
|
||
null,
|
||
_renderList(f.options, (opt) => {
|
||
return _openBlock(), _createElementBlock("option", {
|
||
key: opt,
|
||
value: opt
|
||
}, _toDisplayString(opt), 9, _hoisted_15);
|
||
}),
|
||
128
|
||
/* KEYED_FRAGMENT */
|
||
))
|
||
], 8, _hoisted_14)), [
|
||
[_vModelSelect, $setup.apiForm[f.key]]
|
||
]) : _createCommentVNode("v-if", true)
|
||
]);
|
||
}),
|
||
128
|
||
/* KEYED_FRAGMENT */
|
||
)),
|
||
_createElementVNode("div", _hoisted_16, [
|
||
_createElementVNode("button", {
|
||
class: "save-btn",
|
||
disabled: $setup.saving,
|
||
onClick: $setup.saveAndTest
|
||
}, _toDisplayString($setup.saving ? "测试中…" : "测试并保存"), 9, _hoisted_17)
|
||
]),
|
||
$setup.testResult ? (_openBlock(), _createElementBlock(
|
||
"div",
|
||
{
|
||
key: 0,
|
||
class: _normalizeClass(["test-result", $setup.testOk ? "ok" : "err"])
|
||
},
|
||
_toDisplayString($setup.testResult),
|
||
3
|
||
/* TEXT, CLASS */
|
||
)) : _createCommentVNode("v-if", true)
|
||
])
|
||
],
|
||
64
|
||
/* STABLE_FRAGMENT */
|
||
)) : $props.view === "workflow" ? (_openBlock(), _createElementBlock(
|
||
_Fragment,
|
||
{ key: 2 },
|
||
[
|
||
_createCommentVNode(" 日常工作流管理 "),
|
||
_createElementVNode("div", _hoisted_18, [
|
||
_createElementVNode("div", { class: "card-head" }, [
|
||
_cache[5] || (_cache[5] = _createElementVNode(
|
||
"div",
|
||
{ class: "card-title" },
|
||
"工作流列表",
|
||
-1
|
||
/* CACHED */
|
||
)),
|
||
_createElementVNode("button", {
|
||
class: "add-btn",
|
||
onClick: $setup.addWorkflow
|
||
}, "+ 新建")
|
||
]),
|
||
(_openBlock(true), _createElementBlock(
|
||
_Fragment,
|
||
null,
|
||
_renderList($setup.workflows, (w) => {
|
||
return _openBlock(), _createElementBlock("div", {
|
||
key: w.id,
|
||
class: "workflow-item"
|
||
}, [
|
||
_createElementVNode("div", _hoisted_19, [
|
||
_createElementVNode(
|
||
"div",
|
||
_hoisted_20,
|
||
_toDisplayString(w.name),
|
||
1
|
||
/* TEXT */
|
||
),
|
||
_createElementVNode(
|
||
"div",
|
||
_hoisted_21,
|
||
_toDisplayString(w.desc),
|
||
1
|
||
/* TEXT */
|
||
)
|
||
]),
|
||
_createElementVNode(
|
||
"div",
|
||
{
|
||
class: _normalizeClass(["wf-status", w.enabled ? "on" : "off"])
|
||
},
|
||
_toDisplayString(w.enabled ? "已启用" : "已停用"),
|
||
3
|
||
/* TEXT, CLASS */
|
||
)
|
||
]);
|
||
}),
|
||
128
|
||
/* KEYED_FRAGMENT */
|
||
))
|
||
])
|
||
],
|
||
64
|
||
/* STABLE_FRAGMENT */
|
||
)) : _createCommentVNode("v-if", true)
|
||
])
|
||
]);
|
||
}
|
||
import "/components/SettingsPanel.vue?vue&type=style&index=0&scoped=b65b5cd7&lang.css";
|
||
_sfc_main.__hmrId = "b65b5cd7";
|
||
typeof __VUE_HMR_RUNTIME__ !== "undefined" && __VUE_HMR_RUNTIME__.createRecord(_sfc_main.__hmrId, _sfc_main);
|
||
import.meta.hot.on("file-changed", ({ file }) => {
|
||
__VUE_HMR_RUNTIME__.CHANGED_FILE = file;
|
||
});
|
||
import.meta.hot.accept((mod) => {
|
||
if (!mod) return;
|
||
const { default: updated, _rerender_only } = mod;
|
||
if (_rerender_only) {
|
||
__VUE_HMR_RUNTIME__.rerender(updated.__hmrId, updated.render);
|
||
} else {
|
||
__VUE_HMR_RUNTIME__.reload(updated.__hmrId, updated);
|
||
}
|
||
});
|
||
import _export_sfc from "/@id/__x00__plugin-vue:export-helper";
|
||
export default /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-b65b5cd7"], ["__file", "D:/dndClaw/agent-console/src/renderer/components/SettingsPanel.vue"]]);
|
||
|
||
//# sourceMappingURL=data:application/json;base64,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TTtBQUFBLG9CQUZKO0FBQUEsc0JBQXVDO0FBQUEsc0JBQXZDO0FBQUEsc0JBQXVDLGlCQUFmLEVBQUUsSUFBSTtBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQUM5QjtBQUFBLHNCQUF1QztBQUFBLHNCQUF2QztBQUFBLHNCQUF1QyxpQkFBZixFQUFFLElBQUk7QUFBQTtBQUFBO0FBQUE7QUFBQTtrQkFFaEM7QUFBQSxvQkFFTTtBQUFBO0FBQUEsc0JBRkQsT0FBSyxpQkFBQyxhQUFvQixFQUFFLFVBQU87QUFBQTtxQ0FDbkMsRUFBRSxVQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUEiLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIlNldHRpbmdzUGFuZWwudnVlIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cbiAgPHNlY3Rpb24gY2xhc3M9XCJzZXR0aW5nc1wiPlxuICAgIDwhLS0g6aG26YOoIC0tPlxuICAgIDxoZWFkZXIgY2xhc3M9XCJoZWFkZXJcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJiYWNrLWJ0blwiIEBjbGljaz1cIiRlbWl0KCdiYWNrJylcIj7ihpAg6L+U5Zue5a+56K+dPC9idXR0b24+XG4gICAgICA8ZGl2IGNsYXNzPVwicGFnZS10aXRsZVwiPnt7IHRpdGxlIH19PC9kaXY+XG4gICAgPC9oZWFkZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYm9keVwiPlxuICAgICAgPCEtLSDlip/og73lvIDlhbMgLS0+XG4gICAgICA8dGVtcGxhdGUgdi1pZj1cInZpZXcgPT09ICdmZWF0dXJlcydcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10aXRsZVwiPuaZuuiDveS9k+ihjOS4ujwvZGl2PlxuICAgICAgICAgIDxsYWJlbCB2LWZvcj1cInMgaW4gZmVhdHVyZXNcIiA6a2V5PVwicy5rZXlcIiBjbGFzcz1cInN3aXRjaC1yb3dcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3dpdGNoLWxhYmVsLXRleHRcIj57eyBzLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIDpjaGVja2VkPVwicy52YWx1ZVwiXG4gICAgICAgICAgICAgIEBjaGFuZ2U9XCJzLnZhbHVlID0gKCRldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90ZW1wbGF0ZT5cblxuICAgICAgPCEtLSDlpKfmqKHlnosgQVBJIOiuvue9riAtLT5cbiAgICAgIDx0ZW1wbGF0ZSB2LWVsc2UtaWY9XCJ2aWV3ID09PSAnYXBpJ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRpdGxlXCI+5aSn5qih5Z6LIEFQSSDorr7nva48L2Rpdj5cblxuICAgICAgICAgIDwhLS0g5o6l5YWl5pa55byP6YCJ5oupIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8bGFiZWw+5o6l5YWl5pa55byPPC9sYWJlbD5cbiAgICAgICAgICAgIDxzZWxlY3Qgdi1tb2RlbD1cInNlbGVjdGVkUHJvdmlkZXJcIiBAY2hhbmdlPVwib25Qcm92aWRlckNoYW5nZVwiPlxuICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwicCBpbiBwcm92aWRlcnNcIiA6a2V5PVwicC5rZXlcIiA6dmFsdWU9XCJwLmtleVwiPlxuICAgICAgICAgICAgICAgIHt7IHAubGFiZWwgfX1cbiAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoaW50XCI+e3sgY3VycmVudFByb3ZpZGVyPy5kZXNjcmlwdGlvbiB9fTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSDliqjmgIHlrZfmrrUgLS0+XG4gICAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiZiBpbiBjdXJyZW50UHJvdmlkZXI/LmZpZWxkc1wiIDprZXk9XCJmLmtleVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGxhYmVsPnt7IGYubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB2LWlmPVwiZi50eXBlID09PSAndGV4dCcgfHwgZi50eXBlID09PSAncGFzc3dvcmQnXCJcbiAgICAgICAgICAgICAgICB2LW1vZGVsPVwiYXBpRm9ybVtmLmtleV1cIlxuICAgICAgICAgICAgICAgIDp0eXBlPVwiZi50eXBlXCJcbiAgICAgICAgICAgICAgICA6cGxhY2Vob2xkZXI9XCJmLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdi1lbHNlLWlmPVwiZi50eXBlID09PSAnbnVtYmVyJ1wiXG4gICAgICAgICAgICAgICAgdi1tb2RlbC5udW1iZXI9XCJhcGlGb3JtW2Yua2V5XVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgOnN0ZXA9XCJmLnN0ZXAgPz8gMC4wMVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzZWxlY3Qgdi1lbHNlLWlmPVwiZi50eXBlID09PSAnc2VsZWN0J1wiIHYtbW9kZWw9XCJhcGlGb3JtW2Yua2V5XVwiPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJvcHQgaW4gZi5vcHRpb25zXCIgOmtleT1cIm9wdFwiIDp2YWx1ZT1cIm9wdFwiPnt7IG9wdCB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLXJvd1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNhdmUtYnRuXCIgOmRpc2FibGVkPVwic2F2aW5nXCIgQGNsaWNrPVwic2F2ZUFuZFRlc3RcIj5cbiAgICAgICAgICAgICAge3sgc2F2aW5nID8gJ+a1i+ivleS4reKApicgOiAn5rWL6K+V5bm25L+d5a2YJyB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiB2LWlmPVwidGVzdFJlc3VsdFwiIGNsYXNzPVwidGVzdC1yZXN1bHRcIiA6Y2xhc3M9XCJ0ZXN0T2sgPyAnb2snIDogJ2VycidcIj5cbiAgICAgICAgICAgIHt7IHRlc3RSZXN1bHQgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3RlbXBsYXRlPlxuXG4gICAgICA8IS0tIOaXpeW4uOW3peS9nOa1geeuoeeQhiAtLT5cbiAgICAgIDx0ZW1wbGF0ZSB2LWVsc2UtaWY9XCJ2aWV3ID09PSAnd29ya2Zsb3cnXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdGl0bGVcIj7lt6XkvZzmtYHliJfooag8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhZGQtYnRuXCIgQGNsaWNrPVwiYWRkV29ya2Zsb3dcIj7vvIsg5paw5bu6PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiB2LWZvcj1cIncgaW4gd29ya2Zsb3dzXCIgOmtleT1cIncuaWRcIiBjbGFzcz1cIndvcmtmbG93LWl0ZW1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3Zi1pbmZvXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3Zi1uYW1lXCI+e3sgdy5uYW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3Zi1kZXNjXCI+e3sgdy5kZXNjIH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3Zi1zdGF0dXNcIiA6Y2xhc3M9XCJ3LmVuYWJsZWQgPyAnb24nIDogJ29mZidcIj5cbiAgICAgICAgICAgICAge3sgdy5lbmFibGVkID8gJ+W3suWQr+eUqCcgOiAn5bey5YGc55SoJyB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgPC9zZWN0aW9uPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGNvbXB1dGVkLCByZWFjdGl2ZSwgcmVmIH0gZnJvbSAndnVlJ1xuaW1wb3J0IHsgYWdlbnRTZXR0aW5ncyB9IGZyb20gJy4uL21vY2snXG5pbXBvcnQgdHlwZSB7IFZpZXdUeXBlIH0gZnJvbSAnLi4vdHlwZXMnXG5cbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHM8eyB2aWV3OiBWaWV3VHlwZSB9PigpXG5kZWZpbmVFbWl0czx7IChlOiAnYmFjaycpOiB2b2lkIH0+KClcblxuY29uc3QgdGl0bGVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIGZlYXR1cmVzOiAn5Yqf6IO95byA5YWzJyxcbiAgYXBpOiAn5aSn5qih5Z6LIEFQSSDorr7nva4nLFxuICB3b3JrZmxvdzogJ+aXpeW4uOW3peS9nOa1geeuoeeQhidcbn1cbmNvbnN0IHRpdGxlID0gY29tcHV0ZWQoKCkgPT4gdGl0bGVNYXBbcHJvcHMudmlld10gPz8gJ+iuvue9ricpXG5cbi8vIOWKn+iDveW8gOWFs1xuY29uc3QgZmVhdHVyZXMgPSBhZ2VudFNldHRpbmdzXG5cbi8qID09PT09PSDlpKfmqKHlnosgQVBJIOmFjee9ru+8muWPr+aJqeWxlSBQcm92aWRlciDnu5PmnoQgPT09PT09ICovXG5pbnRlcmZhY2UgRmllbGREZWYge1xuICBrZXk6IHN0cmluZ1xuICBsYWJlbDogc3RyaW5nXG4gIHR5cGU6ICd0ZXh0JyB8ICdwYXNzd29yZCcgfCAnbnVtYmVyJyB8ICdzZWxlY3QnXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nXG4gIG9wdGlvbnM/OiBzdHJpbmdbXVxuICBzdGVwPzogbnVtYmVyXG4gIGRlZmF1bHQ6IHN0cmluZyB8IG51bWJlclxufVxuXG5pbnRlcmZhY2UgUHJvdmlkZXJEZWYge1xuICBrZXk6IHN0cmluZ1xuICBsYWJlbDogc3RyaW5nXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgZmllbGRzOiBGaWVsZERlZltdXG59XG5cbi8vIOaWsOWinuaooeWei+aOpeWFpe+8muWcqOatpOaVsOe7hOa3u+WKoOS4gOS4qiBQcm92aWRlckRlZiDljbPlj69cbmNvbnN0IHByb3ZpZGVyczogUHJvdmlkZXJEZWZbXSA9IFtcbiAge1xuICAgIGtleTogJ3FpYW5mYW5fdjInLFxuICAgIGxhYmVsOiAn5paH5b+D5Y2D5biGIHYyJyxcbiAgICBkZXNjcmlwdGlvbjogJ0JlYXJlciBUb2tlbiDmlrnlvI/vvIzmjqjojZDkvb/nlKgnLFxuICAgIGZpZWxkczogW1xuICAgICAgeyBrZXk6ICdiYXNlVXJsJywgbGFiZWw6ICdCYXNlIFVSTCcsIHR5cGU6ICd0ZXh0JywgZGVmYXVsdDogJ2h0dHBzOi8vcWlhbmZhbi5iYWlkdWJjZS5jb20vdjIvY2hhdC9jb21wbGV0aW9ucycgfSxcbiAgICAgIHsga2V5OiAnYXV0aG9yaXphdGlvbicsIGxhYmVsOiAnQXV0aG9yaXphdGlvbicsIHR5cGU6ICd0ZXh0JywgZGVmYXVsdDogJ0JlYXJlciBiY2UtdjMvQUxUQUstdDZjRURVbVBQU21vWUpiR1VQajJmL2MxMzZiZTUzY2I5ZDY5ZTI5OTBkYWQ2MDMwYzllMTliMTcwOGIyODQnIH0sXG4gICAgICB7IGtleTogJ21vZGVsJywgbGFiZWw6ICfmqKHlnosnLCB0eXBlOiAndGV4dCcsIGRlZmF1bHQ6ICdkZWVwc2Vlay12My4yJyB9LFxuICAgICAgeyBrZXk6ICd0ZW1wZXJhdHVyZScsIGxhYmVsOiAnVGVtcGVyYXR1cmUnLCB0eXBlOiAnbnVtYmVyJywgZGVmYXVsdDogMC45MzQsIHN0ZXA6IDAuMDEgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgIGtleTogJ29wZW5haScsXG4gICAgbGFiZWw6ICdPcGVuQUkg5YW85a6577yIT3BlbkFQSe+8iScsXG4gICAgZGVzY3JpcHRpb246ICfmlK/mjIEgT3BlbkFJIOWPiuWFvOWuueacjeWKoe+8iERlZXBTZWVr44CB6YCa5LmJ44CB5pm66LCx562J77yJJyxcbiAgICBmaWVsZHM6IFtcbiAgICAgIHsga2V5OiAnYmFzZVVybCcsIGxhYmVsOiAnQmFzZSBVUkwnLCB0eXBlOiAndGV4dCcsIGRlZmF1bHQ6ICdodHRwczovL2FwaS5vcGVuYWkuY29tL3YxJywgcGxhY2Vob2xkZXI6ICdodHRwczovL2FwaS5vcGVuYWkuY29tL3YxJyB9LFxuICAgICAgeyBrZXk6ICdhcGlLZXknLCBsYWJlbDogJ0FQSSBLZXknLCB0eXBlOiAncGFzc3dvcmQnLCBkZWZhdWx0OiAnJywgcGxhY2Vob2xkZXI6ICdzay0uLi4nIH0sXG4gICAgICB7IGtleTogJ21vZGVsJywgbGFiZWw6ICfmqKHlnosnLCB0eXBlOiAndGV4dCcsIGRlZmF1bHQ6ICdncHQtNG8tbWluaScsIHBsYWNlaG9sZGVyOiAnZ3B0LTRvLW1pbmknIH0sXG4gICAgICB7IGtleTogJ3RlbXBlcmF0dXJlJywgbGFiZWw6ICdUZW1wZXJhdHVyZScsIHR5cGU6ICdudW1iZXInLCBkZWZhdWx0OiAwLjcsIHN0ZXA6IDAuMDEgfVxuICAgIF1cbiAgfVxuXVxuXG5jb25zdCBzZWxlY3RlZFByb3ZpZGVyID0gcmVmKCdxaWFuZmFuX3YyJylcbmNvbnN0IGN1cnJlbnRQcm92aWRlciA9IGNvbXB1dGVkKCgpID0+IHByb3ZpZGVycy5maW5kKChwKSA9PiBwLmtleSA9PT0gc2VsZWN0ZWRQcm92aWRlci52YWx1ZSkpXG5cbmNvbnN0IGFwaUZvcm0gPSByZWFjdGl2ZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+Pih7fSlcbmNvbnN0IHNhdmluZyA9IHJlZihmYWxzZSlcbmNvbnN0IHRlc3RSZXN1bHQgPSByZWYoJycpXG5jb25zdCB0ZXN0T2sgPSByZWYoZmFsc2UpXG5cbmZ1bmN0aW9uIGZpbGxEZWZhdWx0cygpIHtcbiAgT2JqZWN0LmtleXMoYXBpRm9ybSkuZm9yRWFjaCgoaykgPT4gZGVsZXRlIGFwaUZvcm1ba10pXG4gIGZvciAoY29uc3QgZiBvZiBjdXJyZW50UHJvdmlkZXIudmFsdWUhLmZpZWxkcykge1xuICAgIGFwaUZvcm1bZi5rZXldID0gZi5kZWZhdWx0XG4gIH1cbn1cbmZpbGxEZWZhdWx0cygpXG5cbmZ1bmN0aW9uIG9uUHJvdmlkZXJDaGFuZ2UoKSB7XG4gIGZpbGxEZWZhdWx0cygpXG4gIHRlc3RSZXN1bHQudmFsdWUgPSAnJ1xufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0QXBpKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBwcm92aWRlciA9IHNlbGVjdGVkUHJvdmlkZXIudmFsdWVcbiAgY29uc3QgYmFzZVVybCA9IFN0cmluZyhhcGlGb3JtLmJhc2VVcmwgfHwgJycpXG4gIGNvbnN0IG1vZGVsID0gU3RyaW5nKGFwaUZvcm0ubW9kZWwgfHwgJycpXG4gIGNvbnN0IHRlbXBlcmF0dXJlID0gTnVtYmVyKGFwaUZvcm0udGVtcGVyYXR1cmUgPz8gMC43KVxuXG4gIGxldCB1cmwgPSBiYXNlVXJsXG4gIGxldCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH1cbiAgY29uc3QgYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgbW9kZWwsXG4gICAgbWVzc2FnZXM6IFt7IHJvbGU6ICd1c2VyJywgY29udGVudDogJ+S9oOWlve+8jOivt+WPquWbnuWkjVwi6L+e5o6l5oiQ5YqfXCLlm5vkuKrlrZcnIH1dLFxuICAgIHRlbXBlcmF0dXJlLFxuICAgIHN0cmVhbTogZmFsc2VcbiAgfVxuXG4gIGlmIChwcm92aWRlciA9PT0gJ3FpYW5mYW5fdjInKSB7XG4gICAgaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gU3RyaW5nKGFwaUZvcm0uYXV0aG9yaXphdGlvbiB8fCAnJylcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWJhc2VVcmwuZW5kc1dpdGgoJy9jaGF0L2NvbXBsZXRpb25zJykpIHtcbiAgICAgIHVybCA9IGJhc2VVcmwucmVwbGFjZSgvXFwvJC8sICcnKSArICcvY2hhdC9jb21wbGV0aW9ucydcbiAgICB9XG4gICAgaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gJ0JlYXJlciAnICsgU3RyaW5nKGFwaUZvcm0uYXBpS2V5IHx8ICcnKVxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpXG4gICAgfSlcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKVxuXG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIHRlc3RSZXN1bHQudmFsdWUgPSBg4pyXIOS/neWtmOWksei0pe+8jOi/numAmuaAp+a1i+ivleacqumAmui/h++8mkhUVFAgJHtyZXMuc3RhdHVzfSAke2RhdGE/LmVycm9yPy5tZXNzYWdlIHx8IHJlcy5zdGF0dXNUZXh0fWBcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnQgPSBkYXRhPy5jaG9pY2VzPy5bMF0/Lm1lc3NhZ2U/LmNvbnRlbnRcbiAgICBpZiAoY29udGVudCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgdGVzdFJlc3VsdC52YWx1ZSA9IGDinJcg5L+d5a2Y5aSx6LSl77yM5ZON5bqU5qC85byP5byC5bi477yaJHtKU09OLnN0cmluZ2lmeShkYXRhKS5zbGljZSgwLCAxMjApfWBcbiAgICByZXR1cm4gZmFsc2VcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGVzdFJlc3VsdC52YWx1ZSA9IGDinJcg5L+d5a2Y5aSx6LSl77yM6K+35rGC5byC5bi477yaJHtlPy5tZXNzYWdlIHx8IFN0cmluZyhlKX3vvIjlj6/og73mmK8gQ09SUyDmiJbnvZHnu5zpl67popjvvIlgXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuaW50ZXJmYWNlIFNhdmVkQXBpIHtcbiAgaWQ6IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbiAgcHJvdmlkZXI6IHN0cmluZ1xuICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXJcbn1cblxuY29uc3QgU1RPUkFHRV9LRVkgPSAnYWdlbnQtY29uc29sZS1hcGktbGlzdCdcblxuYXN5bmMgZnVuY3Rpb24gc2F2ZUFuZFRlc3QoKSB7XG4gIHNhdmluZy52YWx1ZSA9IHRydWVcbiAgdGVzdFJlc3VsdC52YWx1ZSA9ICcnXG4gIHRlc3RPay52YWx1ZSA9IGZhbHNlXG5cbiAgY29uc3Qgb2sgPSBhd2FpdCB0ZXN0QXBpKClcbiAgaWYgKG9rKSB7XG4gICAgY29uc3QgcHJvdmlkZXJMYWJlbCA9IGN1cnJlbnRQcm92aWRlci52YWx1ZT8ubGFiZWwgPz8gc2VsZWN0ZWRQcm92aWRlci52YWx1ZVxuICAgIGNvbnN0IG1vZGVsID0gU3RyaW5nKGFwaUZvcm0ubW9kZWwgfHwgJycpXG4gICAgY29uc3QgbmFtZSA9IGAke3Byb3ZpZGVyTGFiZWx9IMK3ICR7bW9kZWx9YFxuXG4gICAgY29uc3QgbGlzdDogU2F2ZWRBcGlbXSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oU1RPUkFHRV9LRVkpIHx8ICdbXScpXG4gICAgY29uc3QgaWR4ID0gbGlzdC5maW5kSW5kZXgoXG4gICAgICAoYykgPT4gYy5wcm92aWRlciA9PT0gc2VsZWN0ZWRQcm92aWRlci52YWx1ZSAmJiBjLm1vZGVsID09PSBtb2RlbFxuICAgIClcbiAgICBjb25zdCBlbnRyeTogU2F2ZWRBcGkgPSB7XG4gICAgICBpZDogaWR4ID49IDAgPyBsaXN0W2lkeF0uaWQgOiBgYXBpLSR7RGF0ZS5ub3coKX1gLFxuICAgICAgbmFtZSxcbiAgICAgIHByb3ZpZGVyOiBzZWxlY3RlZFByb3ZpZGVyLnZhbHVlLFxuICAgICAgLi4uYXBpRm9ybVxuICAgIH1cbiAgICBpZiAoaWR4ID49IDApIGxpc3RbaWR4XSA9IGVudHJ5XG4gICAgZWxzZSBsaXN0LnB1c2goZW50cnkpXG5cbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkobGlzdCkpXG4gICAgdGVzdE9rLnZhbHVlID0gdHJ1ZVxuICAgIHRlc3RSZXN1bHQudmFsdWUgPSBg4pyTIOi/numAmuaAp+a1i+ivlemAmui/h++8jOmFjee9ruOAjCR7bmFtZX3jgI3lt7Lkv53lrZhgXG4gIH1cbiAgc2F2aW5nLnZhbHVlID0gZmFsc2Vcbn1cblxuLyogPT09PT09IOW3peS9nOa1gSA9PT09PT0gKi9cbmNvbnN0IHdvcmtmbG93cyA9IHJlZihbXG4gIHsgaWQ6IDEsIG5hbWU6ICfmr4/ml6Xnu4/okKXmlbDmja7msYfmgLsnLCBkZXNjOiAn5q+P5pelIDA5OjAwIOiHquWKqOaxh+aAu+WJjeS4gOaXpee7j+iQpeaVsOaNruW5tueUn+aIkOaKpeihqCcsIGVuYWJsZWQ6IHRydWUgfSxcbiAgeyBpZDogMiwgbmFtZTogJ+mXqOW6l+W3oeajgOaPkOmGkicsIGRlc2M6ICfmr4/lkajkuIAgMTA6MDAg5o6o6YCB5beh5qOA5Lu75Yqh5Yiw6LSf6LSj5Lq6JywgZW5hYmxlZDogdHJ1ZSB9LFxuICB7IGlkOiAzLCBuYW1lOiAn5ZGY5bel5o6S54+t6Ieq5Yqo5LyY5YyWJywgZGVzYzogJ+agueaNruWuoua1gemihOa1i+iHquWKqOiwg+aVtOaOkuePreW7uuiuricsIGVuYWJsZWQ6IGZhbHNlIH0sXG4gIHsgaWQ6IDQsIG5hbWU6ICforqLljZXlvILluLjpooToraYnLCBkZXNjOiAn5a6e5pe255uR5o6n6K6i5Y2V6YCA5qy+546H77yM6LaF6ZiI5YC86Ieq5Yqo5ZGK6K2mJywgZW5hYmxlZDogdHJ1ZSB9XG5dKVxuZnVuY3Rpb24gYWRkV29ya2Zsb3coKSB7XG4gIGNvbnN0IG5hbWUgPSBwcm9tcHQoJ+ivt+i+k+WFpeW3peS9nOa1geWQjeensO+8micpXG4gIGlmIChuYW1lKSB7XG4gICAgd29ya2Zsb3dzLnZhbHVlLnB1c2goeyBpZDogRGF0ZS5ub3coKSwgbmFtZSwgZGVzYzogJ+aWsOW7uueahOW3peS9nOa1gScsIGVuYWJsZWQ6IGZhbHNlIH0pXG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgc2NvcGVkPlxuLnNldHRpbmdzIHtcbiAgZmxleDogMTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYmFja2dyb3VuZDogdmFyKC0tYmctcGFuZWwpO1xuICBtaW4td2lkdGg6IDA7XG59XG4uaGVhZGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAxNnB4O1xuICBwYWRkaW5nOiAxNHB4IDIwcHg7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1xufVxuLmJhY2stYnRuIHtcbiAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBwYWRkaW5nOiA0cHggMTBweDtcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xufVxuLmJhY2stYnRuOmhvdmVyIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tYmctaG92ZXIpO1xufVxuLnBhZ2UtdGl0bGUge1xuICBmb250LXdlaWdodDogNjAwO1xuICBmb250LXNpemU6IDE1cHg7XG59XG4uYm9keSB7XG4gIGZsZXg6IDE7XG4gIG92ZXJmbG93LXk6IGF1dG87XG4gIHBhZGRpbmc6IDI0cHg7XG59XG4uY2FyZCB7XG4gIG1heC13aWR0aDogNjAwcHg7XG4gIGJhY2tncm91bmQ6IHZhcigtLWJnLXNpZGViYXIpO1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1xuICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICBwYWRkaW5nOiAyMHB4O1xufVxuLmNhcmQtaGVhZCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgbWFyZ2luLWJvdHRvbTogMTJweDtcbn1cbi5jYXJkLXRpdGxlIHtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBmb250LXdlaWdodDogNjAwO1xuICBtYXJnaW4tYm90dG9tOiAxNHB4O1xufVxuLnN3aXRjaC1yb3cge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHBhZGRpbmc6IDEwcHggMDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XG59XG4uc3dpdGNoLXJvdzpsYXN0LWNoaWxkIHtcbiAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbn1cbi5zd2l0Y2gtbGFiZWwtdGV4dCB7XG4gIGZvbnQtc2l6ZTogMTNweDtcbn1cbi5zd2l0Y2gtcm93IGlucHV0IHtcbiAgYWNjZW50LWNvbG9yOiB2YXIoLS1wcmltYXJ5KTtcbiAgd2lkdGg6IDE4cHg7XG4gIGhlaWdodDogMThweDtcbn1cbi5mb3JtLWdyb3VwIHtcbiAgbWFyZ2luLWJvdHRvbTogMTZweDtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiA2cHg7XG59XG4uZm9ybS1ncm91cCBsYWJlbCB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xufVxuLmZvcm0tZ3JvdXAgaW5wdXQsXG4uZm9ybS1ncm91cCBzZWxlY3Qge1xuICBwYWRkaW5nOiA5cHggMTJweDtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1pbnB1dCk7XG4gIGNvbG9yOiB2YXIoLS10ZXh0LXByaW1hcnkpO1xuICBmb250LXNpemU6IDEzcHg7XG59XG4uZm9ybS1ncm91cCBpbnB1dDpmb2N1cyxcbi5mb3JtLWdyb3VwIHNlbGVjdDpmb2N1cyB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tcHJpbWFyeSk7XG4gIG91dGxpbmU6IG5vbmU7XG59XG4uaGludCB7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgY29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xufVxuLmJ0bi1yb3cge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDEwcHg7XG4gIG1hcmdpbi10b3A6IDhweDtcbn1cbi5zYXZlLWJ0biB7XG4gIGJhY2tncm91bmQ6IHZhcigtLXByaW1hcnkpO1xuICBjb2xvcjogI2ZmZjtcbiAgcGFkZGluZzogOXB4IDIwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgZm9udC1zaXplOiAxM3B4O1xufVxuLnNhdmUtYnRuOmRpc2FibGVkIHtcbiAgb3BhY2l0eTogMC42O1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxuLnRlc3QtcmVzdWx0IHtcbiAgbWFyZ2luLXRvcDogMTJweDtcbiAgcGFkZGluZzogMTBweCAxMnB4O1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGluZS1oZWlnaHQ6IDEuNjtcbn1cbi50ZXN0LXJlc3VsdC5vayB7XG4gIGJhY2tncm91bmQ6IHJnYmEoNzYsIDIxNywgMTAwLCAwLjEyKTtcbiAgY29sb3I6IHZhcigtLXN1Y2Nlc3MpO1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1zdWNjZXNzKTtcbn1cbi50ZXN0LXJlc3VsdC5lcnIge1xuICBiYWNrZ3JvdW5kOiByZ2JhKDIyMSwgODIsIDc3LCAwLjEpO1xuICBjb2xvcjogdmFyKC0tZGFuZ2VyKTtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZGFuZ2VyKTtcbn1cbi5hZGQtYnRuIHtcbiAgY29sb3I6IHZhcigtLXByaW1hcnkpO1xuICBmb250LXNpemU6IDEzcHg7XG59XG4ud29ya2Zsb3ctaXRlbSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgcGFkZGluZzogMTJweCAwO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcbn1cbi53b3JrZmxvdy1pdGVtOmxhc3QtY2hpbGQge1xuICBib3JkZXItYm90dG9tOiBub25lO1xufVxuLndmLW5hbWUge1xuICBmb250LXNpemU6IDEzcHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG4ud2YtZGVzYyB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xuICBtYXJnaW4tdG9wOiAzcHg7XG59XG4ud2Ytc3RhdHVzIHtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBwYWRkaW5nOiAzcHggMTBweDtcbiAgYm9yZGVyLXJhZGl1czogOTlweDtcbn1cbi53Zi1zdGF0dXMub24ge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1zdWNjZXNzKTtcbiAgY29sb3I6ICNmZmY7XG59XG4ud2Ytc3RhdHVzLm9mZiB7XG4gIGJhY2tncm91bmQ6IHZhcigtLXRleHQtbXV0ZWQpO1xuICBjb2xvcjogI2ZmZjtcbn1cbjwvc3R5bGU+XG4iXSwiZmlsZSI6IkQ6L2RuZENsYXcvYWdlbnQtY29uc29sZS9zcmMvcmVuZGVyZXIvY29tcG9uZW50cy9TZXR0aW5nc1BhbmVsLnZ1ZSJ9 |