Files
dnd-claw/agent-console/.electron-userdata/Cache/Cache_Data/f_000011
T

684 lines
60 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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=cc68ba0b";
import { computed, reactive, ref } from "/@fs/D:/dndClaw/agent-console/node_modules/.vite/deps/vue.js?v=cc68ba0b";
import { agentSettings } from "/mock.ts";
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: "日常工作流管理",
tenant: "租户入驻"
};
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}`;
try {
if (!window.electronAPI) throw new Error("electronAPI 未注入");
const saved = await window.electronAPI.callAgent("llm:save", {
name,
provider: selectedProvider.value,
config: { ...apiForm }
});
testOk.value = true;
testResult.value = `✓ 连通性测试通过,配置「${name}」已存储到 agent-core (ID: ${saved.id.slice(0, 8)})`;
} catch (e) {
testResult.value = `✗ 存储失败:${e?.message || String(e)}`;
}
}
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 industries = ["零售", "餐饮", "教育", "医疗", "制造", "金融", "物流", "互联网", "其他"];
const scales = ["1-20 人", "21-100 人", "101-500 人", "500 人以上"];
const tenantForm = reactive({
name: "",
contact: "",
phone: "",
email: "",
industry: "",
scale: ""
});
const tenantSaving = ref(false);
const tenantResult = ref("");
const tenantOk = ref(false);
async function saveTenant() {
tenantSaving.value = true;
tenantResult.value = "";
tenantOk.value = false;
if (!tenantForm.name || !tenantForm.contact || !tenantForm.phone) {
tenantResult.value = "✗ 请填写租户名称、联系人、联系电话";
tenantSaving.value = false;
return;
}
try {
await new Promise((r) => setTimeout(r, 600));
tenantOk.value = true;
tenantResult.value = `✓ 租户「${tenantForm.name}」入驻申请已提交,等待审核`;
} catch (e) {
tenantResult.value = `✗ 提交失败:${e?.message || String(e)}`;
}
tenantSaving.value = false;
}
const __returned__ = { props, titleMap, title, features, providers, selectedProvider, currentProvider, apiForm, saving, testResult, testOk, fillDefaults, onProviderChange, testApi, saveAndTest, workflows, addWorkflow, industries, scales, tenantForm, tenantSaving, tenantResult, tenantOk, saveTenant };
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=cc68ba0b";
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" };
const _hoisted_22 = { class: "card" };
const _hoisted_23 = { class: "form-group" };
const _hoisted_24 = { class: "form-group" };
const _hoisted_25 = { class: "form-group" };
const _hoisted_26 = { class: "form-group" };
const _hoisted_27 = { class: "form-group" };
const _hoisted_28 = ["value"];
const _hoisted_29 = { class: "form-group" };
const _hoisted_30 = ["value"];
const _hoisted_31 = { class: "btn-row" };
const _hoisted_32 = ["disabled"];
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[8] || (_cache[8] = _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[10] || (_cache[10] = _createElementVNode(
"div",
{ class: "card-title" },
"大模型 API 设置",
-1
/* CACHED */
)),
_createCommentVNode(" 接入方式选择 "),
_createElementVNode("div", _hoisted_9, [
_cache[9] || (_cache[9] = _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[11] || (_cache[11] = _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 */
)) : $props.view === "tenant" ? (_openBlock(), _createElementBlock(
_Fragment,
{ key: 3 },
[
_createCommentVNode(" 租户入驻 "),
_createElementVNode("div", _hoisted_22, [
_cache[20] || (_cache[20] = _createElementVNode(
"div",
{ class: "card-title" },
"租户入驻信息",
-1
/* CACHED */
)),
_createElementVNode("div", _hoisted_23, [
_cache[12] || (_cache[12] = _createElementVNode(
"label",
null,
"租户名称",
-1
/* CACHED */
)),
_withDirectives(_createElementVNode(
"input",
{
"onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => $setup.tenantForm.name = $event),
type: "text",
placeholder: "请输入企业/租户名称"
},
null,
512
/* NEED_PATCH */
), [
[_vModelText, $setup.tenantForm.name]
])
]),
_createElementVNode("div", _hoisted_24, [
_cache[13] || (_cache[13] = _createElementVNode(
"label",
null,
"联系人",
-1
/* CACHED */
)),
_withDirectives(_createElementVNode(
"input",
{
"onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => $setup.tenantForm.contact = $event),
type: "text",
placeholder: "请输入联系人姓名"
},
null,
512
/* NEED_PATCH */
), [
[_vModelText, $setup.tenantForm.contact]
])
]),
_createElementVNode("div", _hoisted_25, [
_cache[14] || (_cache[14] = _createElementVNode(
"label",
null,
"联系电话",
-1
/* CACHED */
)),
_withDirectives(_createElementVNode(
"input",
{
"onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => $setup.tenantForm.phone = $event),
type: "text",
placeholder: "请输入联系电话"
},
null,
512
/* NEED_PATCH */
), [
[_vModelText, $setup.tenantForm.phone]
])
]),
_createElementVNode("div", _hoisted_26, [
_cache[15] || (_cache[15] = _createElementVNode(
"label",
null,
"联系邮箱",
-1
/* CACHED */
)),
_withDirectives(_createElementVNode(
"input",
{
"onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => $setup.tenantForm.email = $event),
type: "text",
placeholder: "请输入邮箱地址"
},
null,
512
/* NEED_PATCH */
), [
[_vModelText, $setup.tenantForm.email]
])
]),
_createElementVNode("div", _hoisted_27, [
_cache[17] || (_cache[17] = _createElementVNode(
"label",
null,
"所属行业",
-1
/* CACHED */
)),
_withDirectives(_createElementVNode(
"select",
{
"onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => $setup.tenantForm.industry = $event)
},
[
_cache[16] || (_cache[16] = _createElementVNode(
"option",
{ value: "" },
"请选择行业",
-1
/* CACHED */
)),
(_openBlock(), _createElementBlock(
_Fragment,
null,
_renderList($setup.industries, (ind) => {
return _createElementVNode("option", {
key: ind,
value: ind
}, _toDisplayString(ind), 9, _hoisted_28);
}),
64
/* STABLE_FRAGMENT */
))
],
512
/* NEED_PATCH */
), [
[_vModelSelect, $setup.tenantForm.industry]
])
]),
_createElementVNode("div", _hoisted_29, [
_cache[19] || (_cache[19] = _createElementVNode(
"label",
null,
"企业规模",
-1
/* CACHED */
)),
_withDirectives(_createElementVNode(
"select",
{
"onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => $setup.tenantForm.scale = $event)
},
[
_cache[18] || (_cache[18] = _createElementVNode(
"option",
{ value: "" },
"请选择规模",
-1
/* CACHED */
)),
(_openBlock(), _createElementBlock(
_Fragment,
null,
_renderList($setup.scales, (s) => {
return _createElementVNode("option", {
key: s,
value: s
}, _toDisplayString(s), 9, _hoisted_30);
}),
64
/* STABLE_FRAGMENT */
))
],
512
/* NEED_PATCH */
), [
[_vModelSelect, $setup.tenantForm.scale]
])
]),
_createElementVNode("div", _hoisted_31, [
_createElementVNode("button", {
class: "save-btn",
disabled: $setup.tenantSaving,
onClick: $setup.saveTenant
}, _toDisplayString($setup.tenantSaving ? "提交中…" : "提交入驻"), 9, _hoisted_32)
]),
$setup.tenantResult ? (_openBlock(), _createElementBlock(
"div",
{
key: 0,
class: _normalizeClass(["test-result", $setup.tenantOk ? "ok" : "err"])
},
_toDisplayString($setup.tenantResult),
3
/* TEXT, CLASS */
)) : _createCommentVNode("v-if", true)
])
],
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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QUE7O1lBS25DLG9CQUlNLE9BSk4sYUFJTTtBQUFBLGNBSEosb0JBRVM7QUFBQSxnQkFGRCxPQUFNO0FBQUEsZ0JBQVksVUFBVTtBQUFBLGdCQUFlLFNBQU87QUFBQSxrQ0FDckQsc0JBQVk7QUFBQTtZQUdSLHFDQUFYO0FBQUEsY0FFTTtBQUFBO0FBQUE7Z0JBRm1CLE9BQUssaUJBQUMsZUFBc0Isa0JBQVE7QUFBQTsrQkFDeEQsbUJBQVk7QUFBQTtBQUFBO0FBQUEiLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIlNldHRpbmdzUGFuZWwudnVlIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cbiAgPHNlY3Rpb24gY2xhc3M9XCJzZXR0aW5nc1wiPlxuICAgIDwhLS0g6aG26YOoIC0tPlxuICAgIDxoZWFkZXIgY2xhc3M9XCJoZWFkZXJcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJiYWNrLWJ0blwiIEBjbGljaz1cIiRlbWl0KCdiYWNrJylcIj7ihpAg6L+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+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90ZW1wbGF0ZT5cblxuICAgICAgPCEtLSDnp5/miLflhaXpqbsgLS0+XG4gICAgICA8dGVtcGxhdGUgdi1lbHNlLWlmPVwidmlldyA9PT0gJ3RlbmFudCdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10aXRsZVwiPuenn+aIt+WFpempu+S/oeaBrzwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8bGFiZWw+56ef5oi35ZCN56ewPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB2LW1vZGVsPVwidGVuYW50Rm9ybS5uYW1lXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeS8geS4mi/np5/miLflkI3np7BcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8bGFiZWw+6IGU57O75Lq6PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB2LW1vZGVsPVwidGVuYW50Rm9ybS5jb250YWN0XCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeiBlOezu+S6uuWnk+WQjVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxsYWJlbD7ogZTns7vnlLXor508L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHYtbW9kZWw9XCJ0ZW5hbnRGb3JtLnBob25lXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeiBlOezu+eUteivnVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxsYWJlbD7ogZTns7vpgq7nrrE8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHYtbW9kZWw9XCJ0ZW5hbnRGb3JtLmVtYWlsXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpemCrueuseWcsOWdgFwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxsYWJlbD7miYDlsZ7ooYzkuJo8L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdCB2LW1vZGVsPVwidGVuYW50Rm9ybS5pbmR1c3RyeVwiPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+6K+36YCJ5oup6KGM5LiaPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJpbmQgaW4gaW5kdXN0cmllc1wiIDprZXk9XCJpbmRcIiA6dmFsdWU9XCJpbmRcIj57eyBpbmQgfX08L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8bGFiZWw+5LyB5Lia6KeE5qihPC9sYWJlbD5cbiAgICAgICAgICAgIDxzZWxlY3Qgdi1tb2RlbD1cInRlbmFudEZvcm0uc2NhbGVcIj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPuivt+mAieaLqeinhOaooTwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwicyBpbiBzY2FsZXNcIiA6a2V5PVwic1wiIDp2YWx1ZT1cInNcIj57eyBzIH19PC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLXJvd1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNhdmUtYnRuXCIgOmRpc2FibGVkPVwidGVuYW50U2F2aW5nXCIgQGNsaWNrPVwic2F2ZVRlbmFudFwiPlxuICAgICAgICAgICAgICB7eyB0ZW5hbnRTYXZpbmcgPyAn5o+Q5Lqk5Lit4oCmJyA6ICfmj5DkuqTlhaXpqbsnIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHYtaWY9XCJ0ZW5hbnRSZXN1bHRcIiBjbGFzcz1cInRlc3QtcmVzdWx0XCIgOmNsYXNzPVwidGVuYW50T2sgPyAnb2snIDogJ2VycidcIj5cbiAgICAgICAgICAgIHt7IHRlbmFudFJlc3VsdCB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gIDwvc2VjdGlvbj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBjb21wdXRlZCwgcmVhY3RpdmUsIHJlZiB9IGZyb20gJ3Z1ZSdcbmltcG9ydCB7IGFnZW50U2V0dGluZ3MgfSBmcm9tICcuLi9tb2NrJ1xuaW1wb3J0IHR5cGUgeyBWaWV3VHlwZSB9IGZyb20gJy4uL3R5cGVzJ1xuXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHsgdmlldzogVmlld1R5cGUgfT4oKVxuZGVmaW5lRW1pdHM8eyAoZTogJ2JhY2snKTogdm9pZCB9PigpXG5cbmNvbnN0IHRpdGxlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBmZWF0dXJlczogJ+WKn+iDveW8gOWFsycsXG4gIGFwaTogJ+Wkp+aooeWeiyBBUEkg6K6+572uJyxcbiAgd29ya2Zsb3c6ICfml6XluLjlt6XkvZzmtYHnrqHnkIYnLFxuICB0ZW5hbnQ6ICfnp5/miLflhaXpqbsnXG59XG5jb25zdCB0aXRsZSA9IGNvbXB1dGVkKCgpID0+IHRpdGxlTWFwW3Byb3BzLnZpZXddID8/ICforr7nva4nKVxuXG4vLyDlip/og73lvIDlhbNcbmNvbnN0IGZlYXR1cmVzID0gYWdlbnRTZXR0aW5nc1xuXG4vKiA9PT09PT0g5aSn5qih5Z6LIEFQSSDphY3nva7vvJrlj6/mianlsZUgUHJvdmlkZXIg57uT5p6EID09PT09PSAqL1xuaW50ZXJmYWNlIEZpZWxkRGVmIHtcbiAga2V5OiBzdHJpbmdcbiAgbGFiZWw6IHN0cmluZ1xuICB0eXBlOiAndGV4dCcgfCAncGFzc3dvcmQnIHwgJ251bWJlcicgfCAnc2VsZWN0J1xuICBwbGFjZWhvbGRlcj86IHN0cmluZ1xuICBvcHRpb25zPzogc3RyaW5nW11cbiAgc3RlcD86IG51bWJlclxuICBkZWZhdWx0OiBzdHJpbmcgfCBudW1iZXJcbn1cblxuaW50ZXJmYWNlIFByb3ZpZGVyRGVmIHtcbiAga2V5OiBzdHJpbmdcbiAgbGFiZWw6IHN0cmluZ1xuICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gIGZpZWxkczogRmllbGREZWZbXVxufVxuXG4vLyDmlrDlop7mqKHlnovmjqXlhaXvvJrlnKjmraTmlbDnu4Tmt7vliqDkuIDkuKogUHJvdmlkZXJEZWYg5Y2z5Y+vXG5jb25zdCBwcm92aWRlcnM6IFByb3ZpZGVyRGVmW10gPSBbXG4gIHtcbiAgICBrZXk6ICdxaWFuZmFuX3YyJyxcbiAgICBsYWJlbDogJ+aWh+W/g+WNg+W4hiB2MicsXG4gICAgZGVzY3JpcHRpb246ICdCZWFyZXIgVG9rZW4g5pa55byP77yM5o6o6I2Q5L2/55SoJyxcbiAgICBmaWVsZHM6IFtcbiAgICAgIHsga2V5OiAnYmFzZVVybCcsIGxhYmVsOiAnQmFzZSBVUkwnLCB0eXBlOiAndGV4dCcsIGRlZmF1bHQ6ICdodHRwczovL3FpYW5mYW4uYmFpZHViY2UuY29tL3YyL2NoYXQvY29tcGxldGlvbnMnIH0sXG4gICAgICB7IGtleTogJ2F1dGhvcml6YXRpb24nLCBsYWJlbDogJ0F1dGhvcml6YXRpb24nLCB0eXBlOiAndGV4dCcsIGRlZmF1bHQ6ICdCZWFyZXIgYmNlLXYzL0FMVEFLLXQ2Y0VEVW1QUFNtb1lKYkdVUGoyZi9jMTM2YmU1M2NiOWQ2OWUyOTkwZGFkNjAzMGM5ZTE5YjE3MDhiMjg0JyB9LFxuICAgICAgeyBrZXk6ICdtb2RlbCcsIGxhYmVsOiAn5qih5Z6LJywgdHlwZTogJ3RleHQnLCBkZWZhdWx0OiAnZGVlcHNlZWstdjMuMicgfSxcbiAgICAgIHsga2V5OiAndGVtcGVyYXR1cmUnLCBsYWJlbDogJ1RlbXBlcmF0dXJlJywgdHlwZTogJ251bWJlcicsIGRlZmF1bHQ6IDAuOTM0LCBzdGVwOiAwLjAxIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdvcGVuYWknLFxuICAgIGxhYmVsOiAnT3BlbkFJIOWFvOWuue+8iE9wZW5BUEnvvIknLFxuICAgIGRlc2NyaXB0aW9uOiAn5pSv5oyBIE9wZW5BSSDlj4rlhbzlrrnmnI3liqHvvIhEZWVwU2Vla+OAgemAmuS5ieOAgeaZuuiwseetie+8iScsXG4gICAgZmllbGRzOiBbXG4gICAgICB7IGtleTogJ2Jhc2VVcmwnLCBsYWJlbDogJ0Jhc2UgVVJMJywgdHlwZTogJ3RleHQnLCBkZWZhdWx0OiAnaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MScsIHBsYWNlaG9sZGVyOiAnaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MScgfSxcbiAgICAgIHsga2V5OiAnYXBpS2V5JywgbGFiZWw6ICdBUEkgS2V5JywgdHlwZTogJ3Bhc3N3b3JkJywgZGVmYXVsdDogJycsIHBsYWNlaG9sZGVyOiAnc2stLi4uJyB9LFxuICAgICAgeyBrZXk6ICdtb2RlbCcsIGxhYmVsOiAn5qih5Z6LJywgdHlwZTogJ3RleHQnLCBkZWZhdWx0OiAnZ3B0LTRvLW1pbmknLCBwbGFjZWhvbGRlcjogJ2dwdC00by1taW5pJyB9LFxuICAgICAgeyBrZXk6ICd0ZW1wZXJhdHVyZScsIGxhYmVsOiAnVGVtcGVyYXR1cmUnLCB0eXBlOiAnbnVtYmVyJywgZGVmYXVsdDogMC43LCBzdGVwOiAwLjAxIH1cbiAgICBdXG4gIH1cbl1cblxuY29uc3Qgc2VsZWN0ZWRQcm92aWRlciA9IHJlZigncWlhbmZhbl92MicpXG5jb25zdCBjdXJyZW50UHJvdmlkZXIgPSBjb21wdXRlZCgoKSA9PiBwcm92aWRlcnMuZmluZCgocCkgPT4gcC5rZXkgPT09IHNlbGVjdGVkUHJvdmlkZXIudmFsdWUpKVxuXG5jb25zdCBhcGlGb3JtID0gcmVhY3RpdmU8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPj4oe30pXG5jb25zdCBzYXZpbmcgPSByZWYoZmFsc2UpXG5jb25zdCB0ZXN0UmVzdWx0ID0gcmVmKCcnKVxuY29uc3QgdGVzdE9rID0gcmVmKGZhbHNlKVxuXG5mdW5jdGlvbiBmaWxsRGVmYXVsdHMoKSB7XG4gIE9iamVjdC5rZXlzKGFwaUZvcm0pLmZvckVhY2goKGspID0+IGRlbGV0ZSBhcGlGb3JtW2tdKVxuICBmb3IgKGNvbnN0IGYgb2YgY3VycmVudFByb3ZpZGVyLnZhbHVlIS5maWVsZHMpIHtcbiAgICBhcGlGb3JtW2Yua2V5XSA9IGYuZGVmYXVsdFxuICB9XG59XG5maWxsRGVmYXVsdHMoKVxuXG5mdW5jdGlvbiBvblByb3ZpZGVyQ2hhbmdlKCkge1xuICBmaWxsRGVmYXVsdHMoKVxuICB0ZXN0UmVzdWx0LnZhbHVlID0gJydcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdEFwaSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgcHJvdmlkZXIgPSBzZWxlY3RlZFByb3ZpZGVyLnZhbHVlXG4gIGNvbnN0IGJhc2VVcmwgPSBTdHJpbmcoYXBpRm9ybS5iYXNlVXJsIHx8ICcnKVxuICBjb25zdCBtb2RlbCA9IFN0cmluZyhhcGlGb3JtLm1vZGVsIHx8ICcnKVxuICBjb25zdCB0ZW1wZXJhdHVyZSA9IE51bWJlcihhcGlGb3JtLnRlbXBlcmF0dXJlID8/IDAuNylcblxuICBsZXQgdXJsID0gYmFzZVVybFxuICBsZXQgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9XG4gIGNvbnN0IGJvZHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIG1vZGVsLFxuICAgIG1lc3NhZ2VzOiBbeyByb2xlOiAndXNlcicsIGNvbnRlbnQ6ICfkvaDlpb3vvIzor7flj6rlm57lpI1cIui/nuaOpeaIkOWKn1wi5Zub5Liq5a2XJyB9XSxcbiAgICB0ZW1wZXJhdHVyZSxcbiAgICBzdHJlYW06IGZhbHNlXG4gIH1cblxuICBpZiAocHJvdmlkZXIgPT09ICdxaWFuZmFuX3YyJykge1xuICAgIGhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IFN0cmluZyhhcGlGb3JtLmF1dGhvcml6YXRpb24gfHwgJycpXG4gIH0gZWxzZSB7XG4gICAgaWYgKCFiYXNlVXJsLmVuZHNXaXRoKCcvY2hhdC9jb21wbGV0aW9ucycpKSB7XG4gICAgICB1cmwgPSBiYXNlVXJsLnJlcGxhY2UoL1xcLyQvLCAnJykgKyAnL2NoYXQvY29tcGxldGlvbnMnXG4gICAgfVxuICAgIGhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9ICdCZWFyZXIgJyArIFN0cmluZyhhcGlGb3JtLmFwaUtleSB8fCAnJylcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KVxuICAgIH0pXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKClcblxuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICB0ZXN0UmVzdWx0LnZhbHVlID0gYOKclyDkv53lrZjlpLHotKXvvIzov57pgJrmgKfmtYvor5XmnKrpgJrov4fvvJpIVFRQICR7cmVzLnN0YXR1c30gJHtkYXRhPy5lcnJvcj8ubWVzc2FnZSB8fCByZXMuc3RhdHVzVGV4dH1gXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50ID0gZGF0YT8uY2hvaWNlcz8uWzBdPy5tZXNzYWdlPy5jb250ZW50XG4gICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHRlc3RSZXN1bHQudmFsdWUgPSBg4pyXIOS/neWtmOWksei0pe+8jOWTjeW6lOagvOW8j+W8guW4uO+8miR7SlNPTi5zdHJpbmdpZnkoZGF0YSkuc2xpY2UoMCwgMTIwKX1gXG4gICAgcmV0dXJuIGZhbHNlXG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRlc3RSZXN1bHQudmFsdWUgPSBg4pyXIOS/neWtmOWksei0pe+8jOivt+axguW8guW4uO+8miR7ZT8ubWVzc2FnZSB8fCBTdHJpbmcoZSl977yI5Y+v6IO95pivIENPUlMg5oiW572R57uc6Zeu6aKY77yJYFxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbi8qKlxuICog5rWL6K+V6YCa6L+H5ZCO77yM6YCa6L+HIElQQyDlsIbphY3nva7lrZjlgqjliLAgYWdlbnQtY29yZe+8iFNRTGl0Ze+8iVxuICogYWdlbnQtY29yZSDkvJroh6rliqjljrvph43vvIjlkIzlkI0gKyDlkIwgcHJvdmlkZXIg5YiZ5pu05paw77yJXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNhdmVBbmRUZXN0KCkge1xuICBzYXZpbmcudmFsdWUgPSB0cnVlXG4gIHRlc3RSZXN1bHQudmFsdWUgPSAnJ1xuICB0ZXN0T2sudmFsdWUgPSBmYWxzZVxuXG4gIGNvbnN0IG9rID0gYXdhaXQgdGVzdEFwaSgpXG4gIGlmIChvaykge1xuICAgIGNvbnN0IHByb3ZpZGVyTGFiZWwgPSBjdXJyZW50UHJvdmlkZXIudmFsdWU/LmxhYmVsID8/IHNlbGVjdGVkUHJvdmlkZXIudmFsdWVcbiAgICBjb25zdCBtb2RlbCA9IFN0cmluZyhhcGlGb3JtLm1vZGVsIHx8ICcnKVxuICAgIGNvbnN0IG5hbWUgPSBgJHtwcm92aWRlckxhYmVsfSDCtyAke21vZGVsfWBcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIXdpbmRvdy5lbGVjdHJvbkFQSSkgdGhyb3cgbmV3IEVycm9yKCdlbGVjdHJvbkFQSSDmnKrms6jlhaUnKVxuICAgICAgLy8g6LCD55SoIGFnZW50LWNvcmUg5L+d5a2Y5YiwIFNRTGl0ZVxuICAgICAgY29uc3Qgc2F2ZWQgPSBhd2FpdCB3aW5kb3cuZWxlY3Ryb25BUEkuY2FsbEFnZW50KCdsbG06c2F2ZScsIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcHJvdmlkZXI6IHNlbGVjdGVkUHJvdmlkZXIudmFsdWUsXG4gICAgICAgIGNvbmZpZzogeyAuLi5hcGlGb3JtIH1cbiAgICAgIH0pXG5cbiAgICAgIHRlc3RPay52YWx1ZSA9IHRydWVcbiAgICAgIHRlc3RSZXN1bHQudmFsdWUgPSBg4pyTIOi/numAmuaAp+a1i+ivlemAmui/h++8jOmFjee9ruOAjCR7bmFtZX3jgI3lt7LlrZjlgqjliLAgYWdlbnQtY29yZSAoSUQ6ICR7c2F2ZWQuaWQuc2xpY2UoMCwgOCl9KWBcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRlc3RSZXN1bHQudmFsdWUgPSBg4pyXIOWtmOWCqOWksei0pe+8miR7ZT8ubWVzc2FnZSB8fCBTdHJpbmcoZSl9YFxuICAgIH1cbiAgfVxuICBzYXZpbmcudmFsdWUgPSBmYWxzZVxufVxuXG4vKiA9PT09PT0g5bel5L2c5rWBID09PT09PSAqL1xuY29uc3Qgd29ya2Zsb3dzID0gcmVmKFtcbiAgeyBpZDogMSwgbmFtZTogJ+avj+aXpee7j+iQpeaVsOaNruaxh+aAuycsIGRlc2M6ICfmr4/ml6UgMDk6MDAg6Ieq5Yqo5rGH5oC75YmN5LiA5pel57uP6JCl5pWw5o2u5bm255Sf5oiQ5oql6KGoJywgZW5hYmxlZDogdHJ1ZSB9LFxuICB7IGlkOiAyLCBuYW1lOiAn6Zeo5bqX5beh5qOA5o+Q6YaSJywgZGVzYzogJ+avj+WRqOS4gCAxMDowMCDmjqjpgIHlt6Hmo4Dku7vliqHliLDotJ/otKPkuronLCBlbmFibGVkOiB0cnVlIH0sXG4gIHsgaWQ6IDMsIG5hbWU6ICflkZjlt6XmjpLnj63oh6rliqjkvJjljJYnLCBkZXNjOiAn5qC55o2u5a6i5rWB6aKE5rWL6Ieq5Yqo6LCD5pW05o6S54+t5bu66K6uJywgZW5hYmxlZDogZmFsc2UgfSxcbiAgeyBpZDogNCwgbmFtZTogJ+iuouWNleW8guW4uOmihOitpicsIGRlc2M6ICflrp7ml7bnm5HmjqforqLljZXpgIDmrL7njofvvIzotoXpmIjlgLzoh6rliqjlkYroraYnLCBlbmFibGVkOiB0cnVlIH1cbl0pXG5mdW5jdGlvbiBhZGRXb3JrZmxvdygpIHtcbiAgY29uc3QgbmFtZSA9IHByb21wdCgn6K+36L6T5YWl5bel5L2c5rWB5ZCN56ew77yaJylcbiAgaWYgKG5hbWUpIHtcbiAgICB3b3JrZmxvd3MudmFsdWUucHVzaCh7IGlkOiBEYXRlLm5vdygpLCBuYW1lLCBkZXNjOiAn5paw5bu655qE5bel5L2c5rWBJywgZW5hYmxlZDogZmFsc2UgfSlcbiAgfVxufVxuXG4vKiA9PT09PT0g56ef5oi35YWl6am7ID09PT09PSAqL1xuY29uc3QgaW5kdXN0cmllcyA9IFsn6Zu25ZSuJywgJ+mkkOmlricsICfmlZnogrInLCAn5Yy755aXJywgJ+WItumAoCcsICfph5Hono0nLCAn54mp5rWBJywgJ+S6kuiBlOe9kScsICflhbbku5YnXVxuY29uc3Qgc2NhbGVzID0gWycxLTIwIOS6uicsICcyMS0xMDAg5Lq6JywgJzEwMS01MDAg5Lq6JywgJzUwMCDkurrku6XkuIonXVxuXG5jb25zdCB0ZW5hbnRGb3JtID0gcmVhY3RpdmUoe1xuICBuYW1lOiAnJyxcbiAgY29udGFjdDogJycsXG4gIHBob25lOiAnJyxcbiAgZW1haWw6ICcnLFxuICBpbmR1c3RyeTogJycsXG4gIHNjYWxlOiAnJ1xufSlcbmNvbnN0IHRlbmFudFNhdmluZyA9IHJlZihmYWxzZSlcbmNvbnN0IHRlbmFudFJlc3VsdCA9IHJlZignJylcbmNvbnN0IHRlbmFudE9rID0gcmVmKGZhbHNlKVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlVGVuYW50KCkge1xuICB0ZW5hbnRTYXZpbmcudmFsdWUgPSB0cnVlXG4gIHRlbmFudFJlc3VsdC52YWx1ZSA9ICcnXG4gIHRlbmFudE9rLnZhbHVlID0gZmFsc2VcblxuICAvLyDnroDljZXmoKHpqoxcbiAgaWYgKCF0ZW5hbnRGb3JtLm5hbWUgfHwgIXRlbmFudEZvcm0uY29udGFjdCB8fCAhdGVuYW50Rm9ybS5waG9uZSkge1xuICAgIHRlbmFudFJlc3VsdC52YWx1ZSA9ICfinJcg6K+35aGr5YaZ56ef5oi35ZCN56ew44CB6IGU57O75Lq644CB6IGU57O755S16K+dJ1xuICAgIHRlbmFudFNhdmluZy52YWx1ZSA9IGZhbHNlXG4gICAgcmV0dXJuXG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRPRE86IOWQjue7reaOpeWFpSBhZ2VudC1jb3JlIOeahCB0ZW5hbnRzIOihqFxuICAgIC8vIGNvbnN0IHNhdmVkID0gYXdhaXQgd2luZG93LmVsZWN0cm9uQVBJLmNhbGxBZ2VudCgndGVuYW50OmNyZWF0ZScsIHsgLi4udGVuYW50Rm9ybSB9KVxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIDYwMCkpIC8vIOaooeaLn+aPkOS6pFxuICAgIHRlbmFudE9rLnZhbHVlID0gdHJ1ZVxuICAgIHRlbmFudFJlc3VsdC52YWx1ZSA9IGDinJMg56ef5oi344CMJHt0ZW5hbnRGb3JtLm5hbWV944CN5YWl6am755Sz6K+35bey5o+Q5Lqk77yM562J5b6F5a6h5qC4YFxuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0ZW5hbnRSZXN1bHQudmFsdWUgPSBg4pyXIOaPkOS6pOWksei0pe+8miR7ZT8ubWVzc2FnZSB8fCBTdHJpbmcoZSl9YFxuICB9XG4gIHRlbmFudFNhdmluZy52YWx1ZSA9IGZhbHNlXG59XG48L3NjcmlwdD5cblxuPHN0eWxlIHNjb3BlZD5cbi5zZXR0aW5ncyB7XG4gIGZsZXg6IDE7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGJhY2tncm91bmQ6IHZhcigtLWJnLXBhbmVsKTtcbiAgbWluLXdpZHRoOiAwO1xufVxuLmhlYWRlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMTZweDtcbiAgcGFkZGluZzogMTRweCAyMHB4O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcbn1cbi5iYWNrLWJ0biB7XG4gIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgcGFkZGluZzogNHB4IDEwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbn1cbi5iYWNrLWJ0bjpob3ZlciB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWJnLWhvdmVyKTtcbn1cbi5wYWdlLXRpdGxlIHtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgZm9udC1zaXplOiAxNXB4O1xufVxuLmJvZHkge1xuICBmbGV4OiAxO1xuICBvdmVyZmxvdy15OiBhdXRvO1xuICBwYWRkaW5nOiAyNHB4O1xufVxuLmNhcmQge1xuICBtYXgtd2lkdGg6IDYwMHB4O1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1zaWRlYmFyKTtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcbiAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgcGFkZGluZzogMjBweDtcbn1cbi5jYXJkLWhlYWQge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIG1hcmdpbi1ib3R0b206IDEycHg7XG59XG4uY2FyZC10aXRsZSB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgbWFyZ2luLWJvdHRvbTogMTRweDtcbn1cbi5zd2l0Y2gtcm93IHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBwYWRkaW5nOiAxMHB4IDA7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1xufVxuLnN3aXRjaC1yb3c6bGFzdC1jaGlsZCB7XG4gIGJvcmRlci1ib3R0b206IG5vbmU7XG59XG4uc3dpdGNoLWxhYmVsLXRleHQge1xuICBmb250LXNpemU6IDEzcHg7XG59XG4uc3dpdGNoLXJvdyBpbnB1dCB7XG4gIGFjY2VudC1jb2xvcjogdmFyKC0tcHJpbWFyeSk7XG4gIHdpZHRoOiAxOHB4O1xuICBoZWlnaHQ6IDE4cHg7XG59XG4uZm9ybS1ncm91cCB7XG4gIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogNnB4O1xufVxuLmZvcm0tZ3JvdXAgbGFiZWwge1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcbn1cbi5mb3JtLWdyb3VwIGlucHV0LFxuLmZvcm0tZ3JvdXAgc2VsZWN0IHtcbiAgcGFkZGluZzogOXB4IDEycHg7XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tYmctaW5wdXQpO1xuICBjb2xvcjogdmFyKC0tdGV4dC1wcmltYXJ5KTtcbiAgZm9udC1zaXplOiAxM3B4O1xufVxuLmZvcm0tZ3JvdXAgaW5wdXQ6Zm9jdXMsXG4uZm9ybS1ncm91cCBzZWxlY3Q6Zm9jdXMge1xuICBib3JkZXItY29sb3I6IHZhcigtLXByaW1hcnkpO1xuICBvdXRsaW5lOiBub25lO1xufVxuLmhpbnQge1xuICBmb250LXNpemU6IDExcHg7XG4gIGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcbn1cbi5idG4tcm93IHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAxMHB4O1xuICBtYXJnaW4tdG9wOiA4cHg7XG59XG4uc2F2ZS1idG4ge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5KTtcbiAgY29sb3I6ICNmZmY7XG4gIHBhZGRpbmc6IDlweCAyMHB4O1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbn1cbi5zYXZlLWJ0bjpkaXNhYmxlZCB7XG4gIG9wYWNpdHk6IDAuNjtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cbi50ZXN0LXJlc3VsdCB7XG4gIG1hcmdpbi10b3A6IDEycHg7XG4gIHBhZGRpbmc6IDEwcHggMTJweDtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjY7XG59XG4udGVzdC1yZXN1bHQub2sge1xuICBiYWNrZ3JvdW5kOiByZ2JhKDc2LCAyMTcsIDEwMCwgMC4xMik7XG4gIGNvbG9yOiB2YXIoLS1zdWNjZXNzKTtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tc3VjY2Vzcyk7XG59XG4udGVzdC1yZXN1bHQuZXJyIHtcbiAgYmFja2dyb3VuZDogcmdiYSgyMjEsIDgyLCA3NywgMC4xKTtcbiAgY29sb3I6IHZhcigtLWRhbmdlcik7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRhbmdlcik7XG59XG4uYWRkLWJ0biB7XG4gIGNvbG9yOiB2YXIoLS1wcmltYXJ5KTtcbiAgZm9udC1zaXplOiAxM3B4O1xufVxuLndvcmtmbG93LWl0ZW0ge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHBhZGRpbmc6IDEycHggMDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XG59XG4ud29ya2Zsb3ctaXRlbTpsYXN0LWNoaWxkIHtcbiAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbn1cbi53Zi1uYW1lIHtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBmb250LXdlaWdodDogNTAwO1xufVxuLndmLWRlc2Mge1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcbiAgbWFyZ2luLXRvcDogM3B4O1xufVxuLndmLXN0YXR1cyB7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgcGFkZGluZzogM3B4IDEwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDk5cHg7XG59XG4ud2Ytc3RhdHVzLm9uIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tc3VjY2Vzcyk7XG4gIGNvbG9yOiAjZmZmO1xufVxuLndmLXN0YXR1cy5vZmYge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS10ZXh0LW11dGVkKTtcbiAgY29sb3I6ICNmZmY7XG59XG48L3N0eWxlPlxuIl0sImZpbGUiOiJEOi9kbmRDbGF3L2FnZW50LWNvbnNvbGUvc3JjL3JlbmRlcmVyL2NvbXBvbmVudHMvU2V0dGluZ3NQYW5lbC52dWUifQ==