From 526bfa65b5c248a443ed24bfcf34a96e3d73d0f5 Mon Sep 17 00:00:00 2001 From: my_ong <429426262@qq.com> Date: Sat, 14 Dec 2024 11:22:41 +0800 Subject: [PATCH] =?UTF-8?q?art:=20=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/layout/components/side-menu.vue | 5 + src/router/index.ts | 90 +++++---- src/stores/user.ts | 3 + src/views/stock/material/print-code.vue | 36 ++-- ....timestamp-1733280057567-72270187d6e8b.mjs | 184 +++++++++--------- 5 files changed, 170 insertions(+), 148 deletions(-) diff --git a/src/layout/components/side-menu.vue b/src/layout/components/side-menu.vue index 9cad378..3db99a3 100644 --- a/src/layout/components/side-menu.vue +++ b/src/layout/components/side-menu.vue @@ -29,13 +29,18 @@ import SubMenu from './sub-menu.vue' import XEUtils from 'xe-utils' import { fliteredMenuTree } from './menu' + import { useRoute } from 'vue-router' const app = useAppStore() + // const router = useRouter() + const theme = computed(() => { return app.layout.navTheme === 'light' ? 'light' : 'dark' }) const menuTree = computed(() => { + // 重新去计算路由的菜单 + // router.currentRoute(); return fliteredMenuTree() }) const route = useRoute() diff --git a/src/router/index.ts b/src/router/index.ts index 5c20868..77654b3 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -1,9 +1,9 @@ -import { createRouter, createWebHashHistory } from 'vue-router' +import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router' import UserLayout from '@/layout/user-layout.vue' import AdminLayout from '@/layout/admin-layout.vue' import BlankLayout from '@/layout/blank-layout.vue' -export const routes = [ +export const routes: Array = [ { path: '/admin/acl', // 系统管理 name: 'ACL', @@ -99,43 +99,49 @@ export const routes = [ }, ] -export default createRouter({ - history: createWebHashHistory(), - routes: [ - { - path: '/', - name: 'Index', - redirect: '/login', - }, - { - path: '/login', - name: 'Login', - redirect: '/login/user', - component: UserLayout, - children: [ - { - path: 'user', - name: 'LoginPage', - component: () => import('../views/login/user-login.vue'), - }, - ], - }, - { - path: '/admin', - name: 'Admin', - redirect: '/admin/dashboard', - component: AdminLayout, - meta: { title: 'menus.index', icon: 'icon-home' }, - children: routes, - }, - { - path: '/:catchAll(.*)', - redirect: '/message', - }, - { - path: '/message', - name: 'Message', - component: () => import('@/views/message/message-page.vue'), - }, - ], -}) +const getNewRouter = () => { + // TODO 用户store判断是否登录,登录就返回过滤的,没有登录就返回全量 + + return createRouter({ + history: createWebHashHistory(), + routes: [ + { + path: '/', + name: 'Index', + redirect: '/login', + }, + { + path: '/login', + name: 'Login', + redirect: '/login/user', + component: UserLayout, + children: [ + { + path: 'user', + name: 'LoginPage', + component: () => import('../views/login/user-login.vue'), + }, + ], + }, + { + path: '/admin', + name: 'Admin', + redirect: '/admin/dashboard', + component: AdminLayout, + meta: { title: 'menus.index', icon: 'icon-home' }, + children: routes, + }, + { + path: '/:catchAll(.*)', + redirect: '/message', + }, + { + path: '/message', + name: 'Message', + component: () => import('@/views/message/message-page.vue'), + }, + ], + }) +} + +export default getNewRouter() diff --git a/src/stores/user.ts b/src/stores/user.ts index d7b6f55..23a4c5f 100644 --- a/src/stores/user.ts +++ b/src/stores/user.ts @@ -25,6 +25,9 @@ export const useUserStore = defineStore('user', { }, userLogin(user: auth.AuthUser) { Object.assign(this, user) + // 过了路由的地址 + // router.addRoute + router.push({ path: '/admin/acl/users' }) // 登录后跳转到用户列表页面 }, logout() { diff --git a/src/views/stock/material/print-code.vue b/src/views/stock/material/print-code.vue index bd05001..41ac7ce 100644 --- a/src/views/stock/material/print-code.vue +++ b/src/views/stock/material/print-code.vue @@ -3,7 +3,7 @@ 请输入打印的条码数量: - + @@ -30,6 +30,10 @@ const inputRef = ref(1) + watch(inputRef, (newVal) => { + fetchAndPrintBarcodes(newVal) + }) + const printCode = () => { const container = document.getElementById('barcodes-container') if (!container) { @@ -48,20 +52,20 @@ honorMarginPadding: false, targetStyles: ['*'], style: ` - @page { - size: ${widthInches}in ${heightInches}in; - margin: 0; - } - body { - margin: 0; - padding: 0; - font-size: 6px; - } - #barcodes-container canvas { - display: block; - margin-bottom: 2mm; /* 调整条形码之间的间距 */ - } - `, + @page { + size: ${widthInches}in ${heightInches}in; + margin: 0; + } + body { + margin: 0; + padding: 0; + font-size: 6px; + } + #barcodes-container canvas { + display: block; + margin-bottom: 2mm; /* 调整条形码之间的间距 */ + } + `, onLoadingStart: () => console.log('开始加载'), onLoadingEnd: () => console.log('加载完成'), // onError: (err: Error) => console.error('打印出错:', err), @@ -75,7 +79,7 @@ } // 定义一个函数来从后端获取条形码字符串并打印 - const fetchAndPrintBarcodes = async (count: number) => { + const fetchAndPrintBarcodes = (count: number) => { // 清空之前的条形码容器 const container = document.getElementById('barcodes-container') if (!container) throw new Error('条形码容器未找到') diff --git a/vite.config.ts.timestamp-1733280057567-72270187d6e8b.mjs b/vite.config.ts.timestamp-1733280057567-72270187d6e8b.mjs index a46fb0e..d2ffe67 100644 --- a/vite.config.ts.timestamp-1733280057567-72270187d6e8b.mjs +++ b/vite.config.ts.timestamp-1733280057567-72270187d6e8b.mjs @@ -1,93 +1,97 @@ // vite.config.ts -import { defineConfig } from "file:///D:/work/my/coding_hobby/ims-front/node_modules/.pnpm/vite@5.4.8_@types+node@22.5.3_less@4.2.1/node_modules/vite/dist/node/index.js"; -import vue from "file:///D:/work/my/coding_hobby/ims-front/node_modules/.pnpm/@vitejs+plugin-vue@5.1.4_vite@5.4.8_@types+node@22.5.3_less@4.2.1__vue@3.5.11_typescript@5.6.3_/node_modules/@vitejs/plugin-vue/dist/index.mjs"; -import { fileURLToPath, URL } from "url"; -import AutoImport from "file:///D:/work/my/coding_hobby/ims-front/node_modules/.pnpm/unplugin-auto-import@0.18.3_@nuxt+kit@3.13.2_rollup@4.21.2_webpack-sources@3.2.3__@vueuse+cor_ct7nfw7obvg6oaanky5netyf4u/node_modules/unplugin-auto-import/dist/vite.js"; -import { visualizer } from "file:///D:/work/my/coding_hobby/ims-front/node_modules/.pnpm/rollup-plugin-visualizer@5.12.0_rollup@4.21.2/node_modules/rollup-plugin-visualizer/dist/plugin/index.js"; -import Components from "file:///D:/work/my/coding_hobby/ims-front/node_modules/.pnpm/unplugin-vue-components@0.27.4_@babel+parser@7.25.6_@nuxt+kit@3.13.2_rollup@4.21.2_webpack-so_yuxkh365t2exwvukyuvotdxtdq/node_modules/unplugin-vue-components/dist/vite.js"; -import { AntDesignVueResolver } from "file:///D:/work/my/coding_hobby/ims-front/node_modules/.pnpm/unplugin-vue-components@0.27.4_@babel+parser@7.25.6_@nuxt+kit@3.13.2_rollup@4.21.2_webpack-so_yuxkh365t2exwvukyuvotdxtdq/node_modules/unplugin-vue-components/dist/resolvers.js"; -import viteCompression from "file:///D:/work/my/coding_hobby/ims-front/node_modules/.pnpm/vite-plugin-compression@0.5.1_vite@5.4.8_@types+node@22.5.3_less@4.2.1_/node_modules/vite-plugin-compression/dist/index.mjs"; -import vueJsx from "file:///D:/work/my/coding_hobby/ims-front/node_modules/.pnpm/@vitejs+plugin-vue-jsx@4.0.1_vite@5.4.8_@types+node@22.5.3_less@4.2.1__vue@3.5.11_typescript@5.6.3_/node_modules/@vitejs/plugin-vue-jsx/dist/index.mjs"; -import vueDevTools from "file:///D:/work/my/coding_hobby/ims-front/node_modules/.pnpm/vite-plugin-vue-devtools@7.4.6_@nuxt+kit@3.13.2_rollup@4.21.2_webpack-sources@3.2.3__rollup@4_ryihblh2z2o3v2ncveuo4sj7xy/node_modules/vite-plugin-vue-devtools/dist/vite.mjs"; -var __vite_injected_original_import_meta_url = "file:///D:/work/my/coding_hobby/ims-front/vite.config.ts"; +import { defineConfig } from 'file:///D:/work/my/coding_hobby/ims-front/node_modules/.pnpm/vite@5.4.8_@types+node@22.5.3_less@4.2.1/node_modules/vite/dist/node/index.js' +import vue from 'file:///D:/work/my/coding_hobby/ims-front/node_modules/.pnpm/@vitejs+plugin-vue@5.1.4_vite@5.4.8_@types+node@22.5.3_less@4.2.1__vue@3.5.11_typescript@5.6.3_/node_modules/@vitejs/plugin-vue/dist/index.mjs' +import { fileURLToPath, URL } from 'url' +import AutoImport from 'file:///D:/work/my/coding_hobby/ims-front/node_modules/.pnpm/unplugin-auto-import@0.18.3_@nuxt+kit@3.13.2_rollup@4.21.2_webpack-sources@3.2.3__@vueuse+cor_ct7nfw7obvg6oaanky5netyf4u/node_modules/unplugin-auto-import/dist/vite.js' +import { visualizer } from 'file:///D:/work/my/coding_hobby/ims-front/node_modules/.pnpm/rollup-plugin-visualizer@5.12.0_rollup@4.21.2/node_modules/rollup-plugin-visualizer/dist/plugin/index.js' +import Components from 'file:///D:/work/my/coding_hobby/ims-front/node_modules/.pnpm/unplugin-vue-components@0.27.4_@babel+parser@7.25.6_@nuxt+kit@3.13.2_rollup@4.21.2_webpack-so_yuxkh365t2exwvukyuvotdxtdq/node_modules/unplugin-vue-components/dist/vite.js' +import { AntDesignVueResolver } from 'file:///D:/work/my/coding_hobby/ims-front/node_modules/.pnpm/unplugin-vue-components@0.27.4_@babel+parser@7.25.6_@nuxt+kit@3.13.2_rollup@4.21.2_webpack-so_yuxkh365t2exwvukyuvotdxtdq/node_modules/unplugin-vue-components/dist/resolvers.js' +import viteCompression from 'file:///D:/work/my/coding_hobby/ims-front/node_modules/.pnpm/vite-plugin-compression@0.5.1_vite@5.4.8_@types+node@22.5.3_less@4.2.1_/node_modules/vite-plugin-compression/dist/index.mjs' +import vueJsx from 'file:///D:/work/my/coding_hobby/ims-front/node_modules/.pnpm/@vitejs+plugin-vue-jsx@4.0.1_vite@5.4.8_@types+node@22.5.3_less@4.2.1__vue@3.5.11_typescript@5.6.3_/node_modules/@vitejs/plugin-vue-jsx/dist/index.mjs' +import vueDevTools from 'file:///D:/work/my/coding_hobby/ims-front/node_modules/.pnpm/vite-plugin-vue-devtools@7.4.6_@nuxt+kit@3.13.2_rollup@4.21.2_webpack-sources@3.2.3__rollup@4_ryihblh2z2o3v2ncveuo4sj7xy/node_modules/vite-plugin-vue-devtools/dist/vite.mjs' +var __vite_injected_original_import_meta_url = 'file:///D:/work/my/coding_hobby/ims-front/vite.config.ts' var vite_config_default = defineConfig(({ mode }) => { - console.log(mode); - return { - resolve: { - alias: { - "@": fileURLToPath(new URL("./src", __vite_injected_original_import_meta_url)) - } - }, - optimizeDeps: { - include: ["@ant-design/icons-vue", "ant-design-vue"] - }, - plugins: [ - vue(), - vueJsx(), - vueDevTools(), - process.env.npm_lifecycle_event === "report" ? visualizer({ open: true, brotliSize: true, filename: "report.html" }) : null, - viteCompression({ - threshold: 1024e3 - // 对大于 1mb 的文件进行压缩 - }), - AutoImport({ - dts: "src/auto-imports.d.ts", - imports: ["vue", "vue-router", "@vueuse/core"], - eslintrc: { - enabled: true, - filepath: "./.eslintrc-auto-import.json", - globalsPropValue: true - } - }), - Components({ - dts: "src/components.d.ts", - deep: true, - dirs: ["src/components"], - extensions: ["vue", "tsx"], - resolvers: [ - AntDesignVueResolver({ - importStyle: false - }) - ] - }) - ], - server: { - open: true, - proxy: { - "/api": { - // target: 'https://iot.riemann.tech/api/', - target: "http://127.0.0.1:7777", - changeOrigin: true, - rewrite: (path) => path.replace(/^\/api/, "") - } - } - }, - esbuild: { - drop: ["console", "debugger"] - // 删除 所有的console 和 debugger - }, - build: { - chunkSizeWarningLimit: 1500, - rollupOptions: { - output: { - //每个node_modules模块分成一个js文件 - manualChunks(id) { - if (id.includes("node_modules")) { - return id.toString().split("node_modules/")[1].split("/")[1].toString(); - } - }, - // 用于从入口点创建的块的打包输出格式[name]表示文件名,[hash]表示该文件内容hash值 - entryFileNames: "assets/js/[name].[hash].js", - // 用于命名代码拆分时创建的共享块的输出命名 - chunkFileNames: "assets/js/[name].[hash].js", - // 用于输出静态资源的命名,[ext]表示文件扩展名 - assetFileNames: "assets/[ext]/[name].[hash].[ext]" - } - } - } - }; -}); -export { - vite_config_default as default -}; + console.log(mode) + return { + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', __vite_injected_original_import_meta_url)), + }, + }, + optimizeDeps: { + include: ['@ant-design/icons-vue', 'ant-design-vue'], + }, + plugins: [ + vue(), + vueJsx(), + vueDevTools(), + process.env.npm_lifecycle_event === 'report' + ? visualizer({ + open: true, + brotliSize: true, + filename: 'report.html', + }) + : null, + viteCompression({ + threshold: 1024e3, + // 对大于 1mb 的文件进行压缩 + }), + AutoImport({ + dts: 'src/auto-imports.d.ts', + imports: ['vue', 'vue-router', '@vueuse/core'], + eslintrc: { + enabled: true, + filepath: './.eslintrc-auto-import.json', + globalsPropValue: true, + }, + }), + Components({ + dts: 'src/components.d.ts', + deep: true, + dirs: ['src/components'], + extensions: ['vue', 'tsx'], + resolvers: [ + AntDesignVueResolver({ + importStyle: false, + }), + ], + }), + ], + server: { + open: true, + proxy: { + '/api': { + // target: 'https://iot.riemann.tech/api/', + target: 'http://127.0.0.1:7777', + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, ''), + }, + }, + }, + esbuild: { + drop: ['console', 'debugger'], + // 删除 所有的console 和 debugger + }, + build: { + chunkSizeWarningLimit: 1500, + rollupOptions: { + output: { + //每个node_modules模块分成一个js文件 + manualChunks(id) { + if (id.includes('node_modules')) { + return id.toString().split('node_modules/')[1].split('/')[1].toString() + } + }, + // 用于从入口点创建的块的打包输出格式[name]表示文件名,[hash]表示该文件内容hash值 + entryFileNames: 'assets/js/[name].[hash].js', + // 用于命名代码拆分时创建的共享块的输出命名 + chunkFileNames: 'assets/js/[name].[hash].js', + // 用于输出静态资源的命名,[ext]表示文件扩展名 + assetFileNames: 'assets/[ext]/[name].[hash].[ext]', + }, + }, + }, + } +}) +export { vite_config_default as default } //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJEOlxcXFx3b3JrXFxcXG15XFxcXGNvZGluZ19ob2JieVxcXFxpbXMtZnJvbnRcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkQ6XFxcXHdvcmtcXFxcbXlcXFxcY29kaW5nX2hvYmJ5XFxcXGltcy1mcm9udFxcXFx2aXRlLmNvbmZpZy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRDovd29yay9teS9jb2RpbmdfaG9iYnkvaW1zLWZyb250L3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZSdcclxuXHJcbmltcG9ydCB2dWUgZnJvbSAnQHZpdGVqcy9wbHVnaW4tdnVlJ1xyXG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoLCBVUkwgfSBmcm9tICd1cmwnXHJcblxyXG5pbXBvcnQgQXV0b0ltcG9ydCBmcm9tICd1bnBsdWdpbi1hdXRvLWltcG9ydC92aXRlJ1xyXG5pbXBvcnQgeyB2aXN1YWxpemVyIH0gZnJvbSAncm9sbHVwLXBsdWdpbi12aXN1YWxpemVyJ1xyXG5pbXBvcnQgQ29tcG9uZW50cyBmcm9tICd1bnBsdWdpbi12dWUtY29tcG9uZW50cy92aXRlJ1xyXG5pbXBvcnQgeyBBbnREZXNpZ25WdWVSZXNvbHZlciB9IGZyb20gJ3VucGx1Z2luLXZ1ZS1jb21wb25lbnRzL3Jlc29sdmVycydcclxuaW1wb3J0IHZpdGVDb21wcmVzc2lvbiBmcm9tICd2aXRlLXBsdWdpbi1jb21wcmVzc2lvbidcclxuaW1wb3J0IHZ1ZUpzeCBmcm9tICdAdml0ZWpzL3BsdWdpbi12dWUtanN4J1xyXG5pbXBvcnQgdnVlRGV2VG9vbHMgZnJvbSAndml0ZS1wbHVnaW4tdnVlLWRldnRvb2xzJ1xyXG5cclxuLy8gaHR0cHM6Ly92aXRlanMuZGV2L2NvbmZpZy9cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKCh7IG1vZGUgfSkgPT4ge1xyXG5cdGNvbnNvbGUubG9nKG1vZGUpXHJcblx0cmV0dXJuIHtcclxuXHRcdHJlc29sdmU6IHtcclxuXHRcdFx0YWxpYXM6IHtcclxuXHRcdFx0XHQnQCc6IGZpbGVVUkxUb1BhdGgobmV3IFVSTCgnLi9zcmMnLCBpbXBvcnQubWV0YS51cmwpKSxcclxuXHRcdFx0fSxcclxuXHRcdH0sXHJcblx0XHRvcHRpbWl6ZURlcHM6IHtcclxuXHRcdFx0aW5jbHVkZTogWydAYW50LWRlc2lnbi9pY29ucy12dWUnLCAnYW50LWRlc2lnbi12dWUnXSxcclxuXHRcdH0sXHJcblx0XHRwbHVnaW5zOiBbXHJcblx0XHRcdHZ1ZSgpLFxyXG5cdFx0XHR2dWVKc3goKSxcclxuXHRcdFx0dnVlRGV2VG9vbHMoKSxcclxuXHRcdFx0cHJvY2Vzcy5lbnYubnBtX2xpZmVjeWNsZV9ldmVudCA9PT0gJ3JlcG9ydCdcclxuXHRcdFx0XHQ/IHZpc3VhbGl6ZXIoeyBvcGVuOiB0cnVlLCBicm90bGlTaXplOiB0cnVlLCBmaWxlbmFtZTogJ3JlcG9ydC5odG1sJyB9KVxyXG5cdFx0XHRcdDogbnVsbCxcclxuXHRcdFx0dml0ZUNvbXByZXNzaW9uKHtcclxuXHRcdFx0XHR0aHJlc2hvbGQ6IDEwMjQwMDAsIC8vIFx1NUJGOVx1NTkyN1x1NEU4RSAxbWIgXHU3Njg0XHU2NTg3XHU0RUY2XHU4RkRCXHU4ODRDXHU1MzhCXHU3RjI5XHJcblx0XHRcdH0pLFxyXG5cdFx0XHRBdXRvSW1wb3J0KHtcclxuXHRcdFx0XHRkdHM6ICdzcmMvYXV0by1pbXBvcnRzLmQudHMnLFxyXG5cdFx0XHRcdGltcG9ydHM6IFsndnVlJywgJ3Z1ZS1yb3V0ZXInLCAnQHZ1ZXVzZS9jb3JlJ10sXHJcblxyXG5cdFx0XHRcdGVzbGludHJjOiB7XHJcblx0XHRcdFx0XHRlbmFibGVkOiB0cnVlLFxyXG5cdFx0XHRcdFx0ZmlsZXBhdGg6ICcuLy5lc2xpbnRyYy1hdXRvLWltcG9ydC5qc29uJyxcclxuXHRcdFx0XHRcdGdsb2JhbHNQcm9wVmFsdWU6IHRydWUsXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0fSksXHJcblx0XHRcdENvbXBvbmVudHMoe1xyXG5cdFx0XHRcdGR0czogJ3NyYy9jb21wb25lbnRzLmQudHMnLFxyXG5cdFx0XHRcdGRlZXA6IHRydWUsXHJcblx0XHRcdFx0ZGlyczogWydzcmMvY29tcG9uZW50cyddLFxyXG5cdFx0XHRcdGV4dGVuc2lvbnM6IFsndnVlJywgJ3RzeCddLFxyXG5cdFx0XHRcdHJlc29sdmVyczogW1xyXG5cdFx0XHRcdFx0QW50RGVzaWduVnVlUmVzb2x2ZXIoe1xyXG5cdFx0XHRcdFx0XHRpbXBvcnRTdHlsZTogZmFsc2UsXHJcblx0XHRcdFx0XHR9KSxcclxuXHRcdFx0XHRdLFxyXG5cdFx0XHR9KSxcclxuXHRcdF0sXHJcblx0XHRzZXJ2ZXI6IHtcclxuXHRcdFx0b3BlbjogdHJ1ZSxcclxuXHRcdFx0cHJveHk6IHtcclxuXHRcdFx0XHQnL2FwaSc6IHtcclxuXHRcdFx0XHRcdC8vIHRhcmdldDogJ2h0dHBzOi8vaW90LnJpZW1hbm4udGVjaC9hcGkvJyxcclxuICAgICAgICAgIFx0XHRcdHRhcmdldDogJ2h0dHA6Ly8xMjcuMC4wLjE6Nzc3NycsXHJcblx0XHRcdFx0XHRjaGFuZ2VPcmlnaW46IHRydWUsXHJcblx0XHRcdFx0XHRyZXdyaXRlOiAocGF0aCkgPT4gcGF0aC5yZXBsYWNlKC9eXFwvYXBpLywgJycpLFxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdH0sXHJcblx0XHR9LFxyXG5cdFx0ZXNidWlsZDoge1xyXG5cdFx0XHRkcm9wOiBbJ2NvbnNvbGUnLCAnZGVidWdnZXInXSwgLy8gXHU1MjIwXHU5NjY0IFx1NjI0MFx1NjcwOVx1NzY4NGNvbnNvbGUgXHU1NDhDIGRlYnVnZ2VyXHJcblx0XHR9LFxyXG5cdFx0YnVpbGQ6IHtcclxuXHRcdFx0Y2h1bmtTaXplV2FybmluZ0xpbWl0OiAxNTAwLFxyXG5cdFx0XHRyb2xsdXBPcHRpb25zOiB7XHJcblx0XHRcdFx0b3V0cHV0OiB7XHJcblx0XHRcdFx0XHQvL1x1NkJDRlx1NEUyQW5vZGVfbW9kdWxlc1x1NkEyMVx1NTc1N1x1NTIwNlx1NjIxMFx1NEUwMFx1NEUyQWpzXHU2NTg3XHU0RUY2XHJcblx0XHRcdFx0XHRtYW51YWxDaHVua3MoaWQpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGlkLmluY2x1ZGVzKCdub2RlX21vZHVsZXMnKSkge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBpZC50b1N0cmluZygpLnNwbGl0KCdub2RlX21vZHVsZXMvJylbMV0uc3BsaXQoJy8nKVsxXS50b1N0cmluZygpXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHQvLyBcdTc1MjhcdTRFOEVcdTRFQ0VcdTUxNjVcdTUzRTNcdTcwQjlcdTUyMUJcdTVFRkFcdTc2ODRcdTU3NTdcdTc2ODRcdTYyNTNcdTUzMDVcdThGOTNcdTUxRkFcdTY4M0NcdTVGMEZbbmFtZV1cdTg4NjhcdTc5M0FcdTY1ODdcdTRFRjZcdTU0MEQsW2hhc2hdXHU4ODY4XHU3OTNBXHU4QkU1XHU2NTg3XHU0RUY2XHU1MTg1XHU1QkI5aGFzaFx1NTAzQ1xyXG5cdFx0XHRcdFx0ZW50cnlGaWxlTmFtZXM6ICdhc3NldHMvanMvW25hbWVdLltoYXNoXS5qcycsIC8vIFx1NzUyOFx1NEU4RVx1NTQ3RFx1NTQwRFx1NEVFM1x1NzgwMVx1NjJDNlx1NTIwNlx1NjVGNlx1NTIxQlx1NUVGQVx1NzY4NFx1NTE3MVx1NEVBQlx1NTc1N1x1NzY4NFx1OEY5M1x1NTFGQVx1NTQ3RFx1NTQwRFxyXG5cdFx0XHRcdFx0Y2h1bmtGaWxlTmFtZXM6ICdhc3NldHMvanMvW25hbWVdLltoYXNoXS5qcycsIC8vIFx1NzUyOFx1NEU4RVx1OEY5M1x1NTFGQVx1OTc1OVx1NjAwMVx1OEQ0NFx1NkU5MFx1NzY4NFx1NTQ3RFx1NTQwRFx1RkYwQ1tleHRdXHU4ODY4XHU3OTNBXHU2NTg3XHU0RUY2XHU2MjY5XHU1QzU1XHU1NDBEXHJcblx0XHRcdFx0XHRhc3NldEZpbGVOYW1lczogJ2Fzc2V0cy9bZXh0XS9bbmFtZV0uW2hhc2hdLltleHRdJyxcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHR9LFxyXG5cdFx0fSxcclxuXHR9XHJcbn0pXHJcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBK1IsU0FBUyxvQkFBb0I7QUFFNVQsT0FBTyxTQUFTO0FBQ2hCLFNBQVMsZUFBZSxXQUFXO0FBRW5DLE9BQU8sZ0JBQWdCO0FBQ3ZCLFNBQVMsa0JBQWtCO0FBQzNCLE9BQU8sZ0JBQWdCO0FBQ3ZCLFNBQVMsNEJBQTRCO0FBQ3JDLE9BQU8scUJBQXFCO0FBQzVCLE9BQU8sWUFBWTtBQUNuQixPQUFPLGlCQUFpQjtBQVgySixJQUFNLDJDQUEyQztBQWNwTyxJQUFPLHNCQUFRLGFBQWEsQ0FBQyxFQUFFLEtBQUssTUFBTTtBQUN6QyxVQUFRLElBQUksSUFBSTtBQUNoQixTQUFPO0FBQUEsSUFDTixTQUFTO0FBQUEsTUFDUixPQUFPO0FBQUEsUUFDTixLQUFLLGNBQWMsSUFBSSxJQUFJLFNBQVMsd0NBQWUsQ0FBQztBQUFBLE1BQ3JEO0FBQUEsSUFDRDtBQUFBLElBQ0EsY0FBYztBQUFBLE1BQ2IsU0FBUyxDQUFDLHlCQUF5QixnQkFBZ0I7QUFBQSxJQUNwRDtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1IsSUFBSTtBQUFBLE1BQ0osT0FBTztBQUFBLE1BQ1AsWUFBWTtBQUFBLE1BQ1osUUFBUSxJQUFJLHdCQUF3QixXQUNqQyxXQUFXLEVBQUUsTUFBTSxNQUFNLFlBQVksTUFBTSxVQUFVLGNBQWMsQ0FBQyxJQUNwRTtBQUFBLE1BQ0gsZ0JBQWdCO0FBQUEsUUFDZixXQUFXO0FBQUE7QUFBQSxNQUNaLENBQUM7QUFBQSxNQUNELFdBQVc7QUFBQSxRQUNWLEtBQUs7QUFBQSxRQUNMLFNBQVMsQ0FBQyxPQUFPLGNBQWMsY0FBYztBQUFBLFFBRTdDLFVBQVU7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULFVBQVU7QUFBQSxVQUNWLGtCQUFrQjtBQUFBLFFBQ25CO0FBQUEsTUFDRCxDQUFDO0FBQUEsTUFDRCxXQUFXO0FBQUEsUUFDVixLQUFLO0FBQUEsUUFDTCxNQUFNO0FBQUEsUUFDTixNQUFNLENBQUMsZ0JBQWdCO0FBQUEsUUFDdkIsWUFBWSxDQUFDLE9BQU8sS0FBSztBQUFBLFFBQ3pCLFdBQVc7QUFBQSxVQUNWLHFCQUFxQjtBQUFBLFlBQ3BCLGFBQWE7QUFBQSxVQUNkLENBQUM7QUFBQSxRQUNGO0FBQUEsTUFDRCxDQUFDO0FBQUEsSUFDRjtBQUFBLElBQ0EsUUFBUTtBQUFBLE1BQ1AsTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLFFBQ04sUUFBUTtBQUFBO0FBQUEsVUFFQyxRQUFRO0FBQUEsVUFDaEIsY0FBYztBQUFBLFVBQ2QsU0FBUyxDQUFDLFNBQVMsS0FBSyxRQUFRLFVBQVUsRUFBRTtBQUFBLFFBQzdDO0FBQUEsTUFDRDtBQUFBLElBQ0Q7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNSLE1BQU0sQ0FBQyxXQUFXLFVBQVU7QUFBQTtBQUFBLElBQzdCO0FBQUEsSUFDQSxPQUFPO0FBQUEsTUFDTix1QkFBdUI7QUFBQSxNQUN2QixlQUFlO0FBQUEsUUFDZCxRQUFRO0FBQUE7QUFBQSxVQUVQLGFBQWEsSUFBSTtBQUNoQixnQkFBSSxHQUFHLFNBQVMsY0FBYyxHQUFHO0FBQ2hDLHFCQUFPLEdBQUcsU0FBUyxFQUFFLE1BQU0sZUFBZSxFQUFFLENBQUMsRUFBRSxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBQUUsU0FBUztBQUFBLFlBQ3ZFO0FBQUEsVUFDRDtBQUFBO0FBQUEsVUFFQSxnQkFBZ0I7QUFBQTtBQUFBLFVBQ2hCLGdCQUFnQjtBQUFBO0FBQUEsVUFDaEIsZ0JBQWdCO0FBQUEsUUFDakI7QUFBQSxNQUNEO0FBQUEsSUFDRDtBQUFBLEVBQ0Q7QUFDRCxDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo=