{{ subject.name }}
@@ -635,6 +635,19 @@ export default {
HomeworkEditDialog,
},
data() {
+ const defaultSubjects = [
+ { name: "语文", order: 0 },
+ { name: "数学", order: 1 },
+ { name: "英语", order: 2 },
+ { name: "物理", order: 3 },
+ { name: "化学", order: 4 },
+ { name: "生物", order: 5 },
+ { name: "政治", order: 6 },
+ { name: "历史", order: 7 },
+ { name: "地理", order: 8 },
+ { name: "其他", order: 9 }
+ ];
+
return {
dataKey: "",
provider: "",
@@ -666,34 +679,11 @@ export default {
selectedDate: new Date().toISOString().split("T")[0].replace(/-/g, ''),
selectedDateObj: new Date(),
refreshInterval: null,
- subjectOrder: [
- "语文",
- "数学",
- "英语",
- "物理",
- "化学",
- "生物",
- "政治",
- "历史",
- "地理",
- "其他",
- ],
showNoDataMessage: false,
noDataMessage: "",
isToday: false,
attendanceDialog: false,
- availableSubjects: [
- { key: "语文", name: "语文" },
- { key: "数学", name: "数学" },
- { key: "英语", name: "英语" },
- { key: "物理", name: "物理" },
- { key: "化学", name: "化学" },
- { key: "生物", name: "生物" },
- { key: "政治", name: "政治" },
- { key: "历史", name: "历史" },
- { key: "地理", name: "地理" },
- { key: "其他", name: "其他" },
- ],
+ availableSubjects: defaultSubjects,
isFullscreen: false,
},
loading: {
@@ -750,7 +740,7 @@ export default {
sortedItems() {
const key = `${JSON.stringify(
this.state.boardData.homework
- )}_${this.state.subjectOrder.join()}_${this.dynamicSort}`;
+ )}_${this.subjectOrder.join()}_${this.dynamicSort}`;
if (this.sortedItemsCache.key === key) {
return this.sortedItemsCache.value;
}
@@ -760,10 +750,10 @@ export default {
.map(([key, value]) => ({
key,
name:
- this.state.availableSubjects.find((s) => s.key === key)?.name ||
+ this.state.availableSubjects.find((s) => s.name === key)?.name ||
key,
content: value.content,
- order: this.state.subjectOrder.indexOf(key),
+ order: this.subjectOrder.indexOf(key),
rowSpan: Math.ceil(
(value.content.split("\n").filter((line) => line.trim()).length +
1) *
@@ -783,9 +773,9 @@ export default {
const usedKeys = Object.keys(this.state.boardData.homework).filter(
(key) => this.state.boardData.homework[key].content?.trim()
);
- return this.state.availableSubjects.filter(
- (subject) => !usedKeys.includes(subject.key)
- );
+ return this.state.availableSubjects
+ .filter(subject => !usedKeys.includes(subject.name))
+ .sort((a, b) => a.order - b.order);
},
emptySubjects() {
if (this.emptySubjectDisplay !== "button") return [];
@@ -911,6 +901,11 @@ export default {
return pinyinA.localeCompare(pinyinB);
});
},
+ subjectOrder() {
+ return [...this.state.availableSubjects]
+ .sort((a, b) => a.order - b.order)
+ .map(subject => subject.name);
+ },
},
watch: {
@@ -1183,6 +1178,7 @@ export default {
async loadConfig() {
try {
+ // 加载学生列表
try {
const response = await dataProvider.loadData("classworks-list-main");
@@ -1190,7 +1186,6 @@ export default {
this.state.studentList = response.map(
(student) => student.name
);
- return;
}
} catch (error) {
console.warn(
@@ -1198,6 +1193,18 @@ export default {
error
);
}
+
+ // 加载科目配置
+ try {
+ const subjectsResponse = await dataProvider.loadData("classworks-config-subject");
+ if (subjectsResponse && Array.isArray(subjectsResponse)) {
+ // 更新科目列表
+ this.state.availableSubjects = subjectsResponse;
+ }
+ } catch (error) {
+ console.warn("Failed to load subject configuration:", error);
+ // 保持默认科目列表
+ }
} catch (error) {
console.error("加载配置失败:", error);
this.$message.error("加载配置失败", error.message);
@@ -1225,7 +1232,7 @@ export default {
};
}
this.state.dialogTitle =
- this.state.availableSubjects.find((s) => s.key === subject)?.name ||
+ this.state.availableSubjects.find((s) => s.name === subject)?.name ||
subject;
this.state.textarea = this.state.boardData.homework[subject].content;
this.state.dialogVisible = true;
@@ -1404,44 +1411,6 @@ export default {
}));
},
- fixedGridLayout(items) {
- const rowSubjects = [
- ["语文", "数学", "英语"],
- ["物理", "化学", "生物"],
- ["政治", "历史", "地理", "其他"],
- ];
- return items
- .sort((a, b) => {
- const getRowIndex = (subject) => {
- for (let i = 0; i < rowSubjects.length; i++) {
- if (rowSubjects[i].includes(subject)) {
- return i;
- }
- }
- return rowSubjects.length;
- };
- const getColumnIndex = (subject) => {
- for (const row of rowSubjects) {
- const index = row.indexOf(subject);
- if (index !== -1) return index;
- }
- return 999;
- };
- const rowA = getRowIndex(a.key);
- const rowB = getRowIndex(b.key);
- if (rowA !== rowB) {
- return rowA - rowB;
- }
- const colA = getColumnIndex(a.key);
- const colB = getColumnIndex(b.key);
- return colA - colB;
- })
- .map((item, index) => ({
- ...item,
- order: index,
- rowSpan: item.content ? 2 : 1,
- }));
- },
setAllPresent() {
this.state.boardData.attendance = {
diff --git a/src/pages/settings.vue b/src/pages/settings.vue
index 2ec7b88..233baa0 100644
--- a/src/pages/settings.vue
+++ b/src/pages/settings.vue
@@ -2,12 +2,12 @@
-
+
-
+
+
+
@@ -150,15 +152,15 @@
/>
-
-
-
+
-
+
+
+
@@ -237,7 +239,8 @@ import SettingsExplorer from "@/components/settings/SettingsExplorer.vue";
import SettingsLinkGenerator from "@/components/SettingsLinkGenerator.vue";
import NamespaceSettingsCard from "@/components/settings/cards/NamespaceSettingsCard.vue";
import RandomPickerCard from "@/components/settings/cards/RandomPickerCard.vue";
-import HomeworkTemplateCard from '@/components/settings/cards/HomeworkTemplateCard.vue';
+import HomeworkTemplateCard from "@/components/settings/cards/HomeworkTemplateCard.vue";
+import SubjectManagementCard from "@/components/settings/cards/SubjectManagementCard.vue";
export default {
name: "Settings",
components: {
@@ -257,6 +260,7 @@ export default {
NamespaceSettingsCard,
RandomPickerCard,
HomeworkTemplateCard,
+ SubjectManagementCard,
},
setup() {
const { mobile } = useDisplay();
@@ -359,6 +363,16 @@ export default {
},
]
: []),
+ {
+ title: "科目",
+ icon: "mdi-book-edit",
+ value: "subject",
+ },
+ {
+ title: "学生列表",
+ icon: "mdi-account-group",
+ value: "student",
+ },
{
title: "分享设置",
icon: "mdi-share",
@@ -384,21 +398,13 @@ export default {
icon: "mdi-theme-light-dark",
value: "theme",
},
- {
- title: "学生列表",
- icon: "mdi-account-group",
- value: "student",
- },
+
{
title: "随机点名",
icon: "mdi-dice-multiple",
value: "randomPicker",
},
- {
- title: "作业模板",
- icon: "mdi-book-edit",
- value: "homework",
- },
+
{
title: "开发者",
icon: "mdi-developer-board",
@@ -425,7 +431,7 @@ export default {
handler(newValue) {
this.drawer = !newValue;
},
- immediate: true
+ immediate: true,
},
studentData: {
handler(newData) {
diff --git a/vite.config.mjs.timestamp-1751696302207-c76e023be42d5.mjs b/vite.config.mjs.timestamp-1751696302207-c76e023be42d5.mjs
new file mode 100644
index 0000000..64aad2b
--- /dev/null
+++ b/vite.config.mjs.timestamp-1751696302207-c76e023be42d5.mjs
@@ -0,0 +1,202 @@
+// vite.config.mjs
+import AutoImport from "file:///D:/Classworks/Classworks/node_modules/.pnpm/unplugin-auto-import@19.1.2/node_modules/unplugin-auto-import/dist/vite.js";
+import Components from "file:///D:/Classworks/Classworks/node_modules/.pnpm/unplugin-vue-components@28._3ac9cbb52ceac4398861ec149fbf8d84/node_modules/unplugin-vue-components/dist/vite.js";
+import Fonts from "file:///D:/Classworks/Classworks/node_modules/.pnpm/unplugin-fonts@1.3.1_vite@5_0da2dbaf8b043328ba6ac4ced11b18f9/node_modules/unplugin-fonts/dist/vite.mjs";
+import Layouts from "file:///D:/Classworks/Classworks/node_modules/.pnpm/vite-plugin-vue-layouts@0.1_c9f7ac9709945bf6ea55f41cc5804e0d/node_modules/vite-plugin-vue-layouts/dist/index.mjs";
+import Vue from "file:///D:/Classworks/Classworks/node_modules/.pnpm/@vitejs+plugin-vue@5.2.3_vi_aa2b6d6e474e4f3c89cafcd1f6e5b905/node_modules/@vitejs/plugin-vue/dist/index.mjs";
+import VueRouter from "file:///D:/Classworks/Classworks/node_modules/.pnpm/unplugin-vue-router@0.12.0__59687ba25f9c89d4ac9f890107322c9d/node_modules/unplugin-vue-router/dist/vite.js";
+import Vuetify, { transformAssetUrls } from "file:///D:/Classworks/Classworks/node_modules/.pnpm/vite-plugin-vuetify@2.1.1_v_25d6a1d522597c3e046942a3e5f2b058/node_modules/vite-plugin-vuetify/dist/index.mjs";
+import { VitePWA } from "file:///D:/Classworks/Classworks/node_modules/.pnpm/vite-plugin-pwa@1.0.0_@vite_b62e707a85f7d1184469c7453818db54/node_modules/vite-plugin-pwa/dist/index.js";
+import { defineConfig } from "file:///D:/Classworks/Classworks/node_modules/.pnpm/vite@5.4.17_sass-embedded@1.86.3_sass@1.86.3_terser@5.39.0/node_modules/vite/dist/node/index.js";
+import { fileURLToPath, URL } from "node:url";
+var __vite_injected_original_import_meta_url = "file:///D:/Classworks/Classworks/vite.config.mjs";
+var vite_config_default = defineConfig({
+ base: "./",
+ plugins: [
+ VueRouter(),
+ Layouts(),
+ Vue({
+ template: { transformAssetUrls }
+ }),
+ VitePWA({
+ registerType: "autoUpdate",
+ devOptions: {
+ navigateFallback: "index.html",
+ enabled: false,
+ suppressWarnings: true
+ },
+ lang: "zh-CN",
+ injectRegister: "auto",
+ strategies: "generateSW",
+ workbox: {
+ globPatterns: ["*"],
+ navigateFallback: "index.html",
+ runtimeCaching: [
+ {
+ urlPattern: ({ url, sameOrigin }) => {
+ return sameOrigin && url.pathname.endsWith("/assets/");
+ },
+ handler: "CacheFirst",
+ options: {
+ cacheName: "assets-cache",
+ expiration: {
+ maxEntries: 200,
+ maxAgeSeconds: 60 * 60 * 24 * 60
+ // 60 天
+ },
+ cacheableResponse: {
+ statuses: [0, 200]
+ }
+ }
+ },
+ {
+ urlPattern: ({ url, sameOrigin }) => {
+ return sameOrigin && url.pathname.startsWith("/pwa/");
+ },
+ handler: "StaleWhileRevalidate",
+ options: {
+ cacheName: "pwa-cache",
+ expiration: {
+ maxEntries: 50,
+ maxAgeSeconds: 60 * 60 * 24 * 7
+ // 7 天
+ },
+ cacheableResponse: {
+ statuses: [0, 200]
+ }
+ }
+ },
+ {
+ // 匹配当前域名下除了上述规则外的所有请求
+ urlPattern: ({ url, sameOrigin }) => {
+ if (!sameOrigin) return false;
+ const path = url.pathname;
+ return !(path.includes("/assets/") || path.includes("/pwa/"));
+ },
+ handler: "NetworkFirst",
+ options: {
+ cacheName: "other-resources",
+ expiration: {
+ maxEntries: 100,
+ maxAgeSeconds: 60 * 60 * 24
+ // 1 天
+ },
+ networkTimeoutSeconds: 10,
+ cacheableResponse: {
+ statuses: [0, 200]
+ }
+ }
+ }
+ ],
+ additionalManifestEntries: [],
+ clientsClaim: true,
+ skipWaiting: true,
+ importScripts: ["/sw-cache-manager.js"]
+ },
+ manifest: {
+ name: "Classworks\u4F5C\u4E1A\u677F",
+ short_name: "Classworks",
+ description: "\u8BB0\u5F55\uFF0C\u67E5\u770B\u5E76\u540C\u6B65\u4F5C\u4E1A",
+ theme_color: "#212121",
+ background_color: "#212121",
+ display: "standalone",
+ start_url: "./",
+ edge_side_panel: {
+ default_path: "./"
+ },
+ icons: [
+ {
+ src: "./pwa/image/pwa-64x64.png",
+ sizes: "64x64",
+ type: "image/png"
+ },
+ {
+ src: "./pwa/image/pwa-192x192.png",
+ sizes: "192x192",
+ type: "image/png"
+ },
+ {
+ src: "./pwa/image/pwa-512x512.png",
+ sizes: "512x512",
+ type: "image/png"
+ },
+ {
+ src: "./pwa/image/maskable-icon-512x512.png",
+ sizes: "512x512",
+ type: "image/png",
+ purpose: "maskable"
+ }
+ ],
+ shortcuts: [
+ {
+ name: "\u968F\u673A\u70B9\u540D",
+ short_name: "\u968F\u673A\u70B9\u540D",
+ url: "./#random-picker",
+ icons: [
+ {
+ src: "./pwa/image/pwa-64x64.png",
+ sizes: "64x64",
+ type: "image/png"
+ }
+ ]
+ }
+ ]
+ }
+ }),
+ // https://github.com/vuetifyjs/vuetify-loader/tree/master/packages/vite-plugin#readme
+ Vuetify({
+ autoImport: true,
+ styles: {
+ configFile: "src/styles/settings.scss"
+ }
+ }),
+ Components(),
+ Fonts({
+ google: {
+ families: [{
+ name: "Roboto",
+ styles: "wght@100;300;400;500;700;900"
+ }]
+ }
+ }),
+ AutoImport({
+ imports: [
+ "vue",
+ "vue-router"
+ ],
+ eslintrc: {
+ enabled: true
+ },
+ vueTemplate: true
+ })
+ ],
+ define: { "process.env": {} },
+ resolve: {
+ alias: {
+ "@": fileURLToPath(new URL("./src", __vite_injected_original_import_meta_url))
+ },
+ extensions: [
+ ".js",
+ ".json",
+ ".jsx",
+ ".mjs",
+ ".ts",
+ ".tsx",
+ ".vue"
+ ]
+ },
+ server: {
+ port: 3031
+ },
+ css: {
+ preprocessorOptions: {
+ sass: {
+ api: "modern-compiler"
+ }
+ }
+ }
+});
+export {
+ vite_config_default as default
+};
+//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcubWpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiRDpcXFxcQ2xhc3N3b3Jrc1xcXFxDbGFzc3dvcmtzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJEOlxcXFxDbGFzc3dvcmtzXFxcXENsYXNzd29ya3NcXFxcdml0ZS5jb25maWcubWpzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9EOi9DbGFzc3dvcmtzL0NsYXNzd29ya3Mvdml0ZS5jb25maWcubWpzXCI7Ly8gUGx1Z2luc1xyXG5pbXBvcnQgQXV0b0ltcG9ydCBmcm9tICd1bnBsdWdpbi1hdXRvLWltcG9ydC92aXRlJ1xyXG5pbXBvcnQgQ29tcG9uZW50cyBmcm9tICd1bnBsdWdpbi12dWUtY29tcG9uZW50cy92aXRlJ1xyXG5pbXBvcnQgRm9udHMgZnJvbSAndW5wbHVnaW4tZm9udHMvdml0ZSdcclxuaW1wb3J0IExheW91dHMgZnJvbSAndml0ZS1wbHVnaW4tdnVlLWxheW91dHMnXHJcbmltcG9ydCBWdWUgZnJvbSAnQHZpdGVqcy9wbHVnaW4tdnVlJ1xyXG5pbXBvcnQgVnVlUm91dGVyIGZyb20gJ3VucGx1Z2luLXZ1ZS1yb3V0ZXIvdml0ZSdcclxuaW1wb3J0IFZ1ZXRpZnksIHsgdHJhbnNmb3JtQXNzZXRVcmxzIH0gZnJvbSAndml0ZS1wbHVnaW4tdnVldGlmeSdcclxuaW1wb3J0IHsgVml0ZVBXQSB9IGZyb20gJ3ZpdGUtcGx1Z2luLXB3YSdcclxuXHJcbi8vIFV0aWxpdGllc1xyXG5pbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tICd2aXRlJ1xyXG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoLCBVUkwgfSBmcm9tICdub2RlOnVybCdcclxuXHJcbi8vIGh0dHBzOi8vdml0ZWpzLmRldi9jb25maWcvXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XHJcbiAgYmFzZTogJy4vJyxcclxuICBwbHVnaW5zOiBbXHJcbiAgICBWdWVSb3V0ZXIoKSxcclxuICAgIExheW91dHMoKSxcclxuICAgIFZ1ZSh7XHJcbiAgICAgIHRlbXBsYXRlOiB7IHRyYW5zZm9ybUFzc2V0VXJscyB9XHJcbiAgICB9KSxcclxuICAgIFZpdGVQV0Eoe1xyXG4gICAgICByZWdpc3RlclR5cGU6ICdhdXRvVXBkYXRlJyxcclxuICAgICAgZGV2T3B0aW9uczoge1xyXG4gICAgICAgIG5hdmlnYXRlRmFsbGJhY2s6ICdpbmRleC5odG1sJyxcclxuICAgICAgICBlbmFibGVkOiBmYWxzZSxcclxuICAgICAgICBzdXBwcmVzc1dhcm5pbmdzOiB0cnVlLFxyXG4gICAgICB9LFxyXG5cclxuICAgICAgbGFuZzogJ3poLUNOJyxcclxuICAgICAgaW5qZWN0UmVnaXN0ZXI6ICdhdXRvJyxcclxuICAgICAgc3RyYXRlZ2llczogJ2dlbmVyYXRlU1cnLFxyXG5cclxuXHJcbiAgICAgIHdvcmtib3g6IHtcclxuICAgICAgICBnbG9iUGF0dGVybnM6IFsnKiddLFxyXG4gICAgICAgIG5hdmlnYXRlRmFsbGJhY2s6ICdpbmRleC5odG1sJyxcclxuICAgICAgICBydW50aW1lQ2FjaGluZzogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB1cmxQYXR0ZXJuOiAoeyB1cmwsIHNhbWVPcmlnaW4gfSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiBzYW1lT3JpZ2luICYmIHVybC5wYXRobmFtZS5lbmRzV2l0aCgnL2Fzc2V0cy8nKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgaGFuZGxlcjogJ0NhY2hlRmlyc3QnLFxyXG4gICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgY2FjaGVOYW1lOiAnYXNzZXRzLWNhY2hlJyxcclxuICAgICAgICAgICAgICBleHBpcmF0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICBtYXhFbnRyaWVzOiAyMDAsXHJcbiAgICAgICAgICAgICAgICBtYXhBZ2VTZWNvbmRzOiA2MCAqIDYwICogMjQgKiA2MCAvLyA2MCBcdTU5MjlcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGNhY2hlYWJsZVJlc3BvbnNlOiB7XHJcbiAgICAgICAgICAgICAgICBzdGF0dXNlczogWzAsIDIwMF1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHVybFBhdHRlcm46ICh7IHVybCwgc2FtZU9yaWdpbiB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHNhbWVPcmlnaW4gJiYgdXJsLnBhdGhuYW1lLnN0YXJ0c1dpdGgoJy9wd2EvJyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGhhbmRsZXI6ICdTdGFsZVdoaWxlUmV2YWxpZGF0ZScsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBjYWNoZU5hbWU6ICdwd2EtY2FjaGUnLFxyXG4gICAgICAgICAgICAgIGV4cGlyYXRpb246IHtcclxuICAgICAgICAgICAgICAgIG1heEVudHJpZXM6IDUwLFxyXG4gICAgICAgICAgICAgICAgbWF4QWdlU2Vjb25kczogNjAgKiA2MCAqIDI0ICogNyAvLyA3IFx1NTkyOVxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgY2FjaGVhYmxlUmVzcG9uc2U6IHtcclxuICAgICAgICAgICAgICAgIHN0YXR1c2VzOiBbMCwgMjAwXVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy8gXHU1MzM5XHU5MTREXHU1RjUzXHU1MjREXHU1N0RGXHU1NDBEXHU0RTBCXHU5NjY0XHU0RTg2XHU0RTBBXHU4RkYwXHU4OUM0XHU1MjE5XHU1OTE2XHU3Njg0XHU2MjQwXHU2NzA5XHU4QkY3XHU2QzQyXHJcbiAgICAgICAgICAgIHVybFBhdHRlcm46ICh7IHVybCwgc2FtZU9yaWdpbiB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKCFzYW1lT3JpZ2luKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IHVybC5wYXRobmFtZTtcclxuICAgICAgICAgICAgICAvLyBcdTYzOTJcdTk2NjRcdTVERjJcdTdFQ0ZcdTc1MzFcdTUxNzZcdTRFRDZcdTg5QzRcdTUyMTlcdTU5MDRcdTc0MDZcdTc2ODRcdThERUZcdTVGODRcclxuICAgICAgICAgICAgICByZXR1cm4gIShwYXRoLmluY2x1ZGVzKCcvYXNzZXRzLycpIHx8IHBhdGguaW5jbHVkZXMoJy9wd2EvJykpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBoYW5kbGVyOiAnTmV0d29ya0ZpcnN0JyxcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIGNhY2hlTmFtZTogJ290aGVyLXJlc291cmNlcycsXHJcbiAgICAgICAgICAgICAgZXhwaXJhdGlvbjoge1xyXG4gICAgICAgICAgICAgICAgbWF4RW50cmllczogMTAwLFxyXG4gICAgICAgICAgICAgICAgbWF4QWdlU2Vjb25kczogNjAgKiA2MCAqIDI0IC8vIDEgXHU1OTI5XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBuZXR3b3JrVGltZW91dFNlY29uZHM6IDEwLFxyXG4gICAgICAgICAgICAgIGNhY2hlYWJsZVJlc3BvbnNlOiB7XHJcbiAgICAgICAgICAgICAgICBzdGF0dXNlczogWzAsIDIwMF1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBhZGRpdGlvbmFsTWFuaWZlc3RFbnRyaWVzOiBbXSxcclxuICAgICAgICBjbGllbnRzQ2xhaW06IHRydWUsXHJcbiAgICAgICAgc2tpcFdhaXRpbmc6IHRydWUsXHJcbiAgICAgICAgaW1wb3J0U2NyaXB0czogWycvc3ctY2FjaGUtbWFuYWdlci5qcyddXHJcbiAgICAgIH0sXHJcbiAgICAgIG1hbmlmZXN0OiB7XHJcbiAgICAgICAgbmFtZTogJ0NsYXNzd29ya3NcdTRGNUNcdTRFMUFcdTY3N0YnLFxyXG4gICAgICAgIHNob3J0X25hbWU6ICdDbGFzc3dvcmtzJyxcclxuICAgICAgICBkZXNjcmlwdGlvbjogJ1x1OEJCMFx1NUY1NVx1RkYwQ1x1NjdFNVx1NzcwQlx1NUU3Nlx1NTQwQ1x1NkI2NVx1NEY1Q1x1NEUxQScsXHJcbiAgICAgICAgdGhlbWVfY29sb3I6ICcjMjEyMTIxJyxcclxuICAgICAgICBiYWNrZ3JvdW5kX2NvbG9yOiAnIzIxMjEyMScsXHJcbiAgICAgICAgZGlzcGxheTogJ3N0YW5kYWxvbmUnLFxyXG4gICAgICAgIHN0YXJ0X3VybDogJy4vJyxcclxuICAgICAgICBlZGdlX3NpZGVfcGFuZWw6IHtcclxuICAgICAgICAgIGRlZmF1bHRfcGF0aDogJy4vJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGljb25zOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHNyYzogJy4vcHdhL2ltYWdlL3B3YS02NHg2NC5wbmcnLFxyXG4gICAgICAgICAgICBzaXplczogJzY0eDY0JyxcclxuICAgICAgICAgICAgdHlwZTogJ2ltYWdlL3BuZydcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHNyYzogJy4vcHdhL2ltYWdlL3B3YS0xOTJ4MTkyLnBuZycsXHJcbiAgICAgICAgICAgIHNpemVzOiAnMTkyeDE5MicsXHJcbiAgICAgICAgICAgIHR5cGU6ICdpbWFnZS9wbmcnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBzcmM6ICcuL3B3YS9pbWFnZS9wd2EtNTEyeDUxMi5wbmcnLFxyXG4gICAgICAgICAgICBzaXplczogJzUxMng1MTInLFxyXG4gICAgICAgICAgICB0eXBlOiAnaW1hZ2UvcG5nJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgc3JjOiAnLi9wd2EvaW1hZ2UvbWFza2FibGUtaWNvbi01MTJ4NTEyLnBuZycsXHJcbiAgICAgICAgICAgIHNpemVzOiAnNTEyeDUxMicsXHJcbiAgICAgICAgICAgIHR5cGU6ICdpbWFnZS9wbmcnLFxyXG4gICAgICAgICAgICBwdXJwb3NlOiAnbWFza2FibGUnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXSxcclxuICAgICAgICBzaG9ydGN1dHM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ1x1OTY4Rlx1NjczQVx1NzBCOVx1NTQwRCcsXHJcbiAgICAgICAgICAgIHNob3J0X25hbWU6ICdcdTk2OEZcdTY3M0FcdTcwQjlcdTU0MEQnLFxyXG4gICAgICAgICAgICB1cmw6ICcuLyNyYW5kb20tcGlja2VyJyxcclxuICAgICAgICAgICAgaWNvbnM6IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzcmM6ICcuL3B3YS9pbWFnZS9wd2EtNjR4NjQucG5nJyxcclxuICAgICAgICAgICAgICAgIHNpemVzOiAnNjR4NjQnLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2ltYWdlL3BuZydcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgfVxyXG4gICAgfSksXHJcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdnVldGlmeWpzL3Z1ZXRpZnktbG9hZGVyL3RyZWUvbWFzdGVyL3BhY2thZ2VzL3ZpdGUtcGx1Z2luI3JlYWRtZVxyXG4gICAgVnVldGlmeSh7XHJcbiAgICAgIGF1dG9JbXBvcnQ6IHRydWUsXHJcbiAgICAgIHN0eWxlczoge1xyXG4gICAgICAgIGNvbmZpZ0ZpbGU6ICdzcmMvc3R5bGVzL3NldHRpbmdzLnNjc3MnLFxyXG4gICAgICB9LFxyXG4gICAgfSksXHJcbiAgICBDb21wb25lbnRzKCksXHJcbiAgICBGb250cyh7XHJcbiAgICAgIGdvb2dsZToge1xyXG4gICAgICAgIGZhbWlsaWVzOiBbe1xyXG4gICAgICAgICAgbmFtZTogJ1JvYm90bycsXHJcbiAgICAgICAgICBzdHlsZXM6ICd3Z2h0QDEwMDszMDA7NDAwOzUwMDs3MDA7OTAwJyxcclxuICAgICAgICB9XSxcclxuICAgICAgfSxcclxuICAgIH0pLFxyXG4gICAgQXV0b0ltcG9ydCh7XHJcbiAgICAgIGltcG9ydHM6IFtcclxuICAgICAgICAndnVlJyxcclxuICAgICAgICAndnVlLXJvdXRlcicsXHJcbiAgICAgIF0sXHJcbiAgICAgIGVzbGludHJjOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgfSxcclxuICAgICAgdnVlVGVtcGxhdGU6IHRydWUsXHJcbiAgICB9KSxcclxuICBdLFxyXG4gIGRlZmluZTogeyAncHJvY2Vzcy5lbnYnOiB7fSB9LFxyXG4gIHJlc29sdmU6IHtcclxuICAgIGFsaWFzOiB7XHJcbiAgICAgICdAJzogZmlsZVVSTFRvUGF0aChuZXcgVVJMKCcuL3NyYycsIGltcG9ydC5tZXRhLnVybCkpXHJcbiAgICB9LFxyXG4gICAgZXh0ZW5zaW9uczogW1xyXG4gICAgICAnLmpzJyxcclxuICAgICAgJy5qc29uJyxcclxuICAgICAgJy5qc3gnLFxyXG4gICAgICAnLm1qcycsXHJcbiAgICAgICcudHMnLFxyXG4gICAgICAnLnRzeCcsXHJcbiAgICAgICcudnVlJyxcclxuICAgIF0sXHJcbiAgfSxcclxuICBzZXJ2ZXI6IHtcclxuICAgIHBvcnQ6IDMwMzEsXHJcbiAgfSxcclxuICBjc3M6IHtcclxuICAgIHByZXByb2Nlc3Nvck9wdGlvbnM6IHtcclxuICAgICAgc2Fzczoge1xyXG4gICAgICAgIGFwaTogJ21vZGVybi1jb21waWxlcicsXHJcbiAgICAg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