272 lines
33 KiB
JavaScript
272 lines
33 KiB
JavaScript
![]() |
// vite.config.ts
|
||
|
import process3 from "node:process";
|
||
|
import { URL, fileURLToPath } from "node:url";
|
||
|
import { defineConfig, loadEnv } from "file:///D:/code/LIB/octopus-admin/node_modules/.pnpm/vite@5.4.7_@types+node@22.5.5_sass@1.79.3/node_modules/vite/dist/node/index.js";
|
||
|
|
||
|
// build/plugins/index.ts
|
||
|
import vue from "file:///D:/code/LIB/octopus-admin/node_modules/.pnpm/@vitejs+plugin-vue@5.1.4_vite@5.4.7_@types+node@22.5.5_sass@1.79.3__vue@3.5.7_typescript@5.6.2_/node_modules/@vitejs/plugin-vue/dist/index.mjs";
|
||
|
import vueJsx from "file:///D:/code/LIB/octopus-admin/node_modules/.pnpm/@vitejs+plugin-vue-jsx@4.0.1_vite@5.4.7_@types+node@22.5.5_sass@1.79.3__vue@3.5.7_typescript@5.6.2_/node_modules/@vitejs/plugin-vue-jsx/dist/index.mjs";
|
||
|
import VueDevtools from "file:///D:/code/LIB/octopus-admin/node_modules/.pnpm/vite-plugin-vue-devtools@7.4.5_rollup@4.24.2_vite@5.4.7_@types+node@22.5.5_sass@1.79.3__vue@3.5.7_typescript@5.6.2_/node_modules/vite-plugin-vue-devtools/dist/vite.mjs";
|
||
|
import progress from "file:///D:/code/LIB/octopus-admin/node_modules/.pnpm/vite-plugin-progress@0.0.7_vite@5.4.7_@types+node@22.5.5_sass@1.79.3_/node_modules/vite-plugin-progress/dist/index.mjs";
|
||
|
|
||
|
// build/plugins/router.ts
|
||
|
import ElegantVueRouter from "file:///D:/code/LIB/octopus-admin/node_modules/.pnpm/@elegant-router+vue@0.3.8/node_modules/@elegant-router/vue/dist/vite.mjs";
|
||
|
function setupElegantRouter() {
|
||
|
return ElegantVueRouter({
|
||
|
layouts: {
|
||
|
base: "src/layouts/base-layout/index.vue",
|
||
|
blank: "src/layouts/blank-layout/index.vue"
|
||
|
},
|
||
|
customRoutes: {
|
||
|
names: ["document"]
|
||
|
},
|
||
|
routePathTransformer(routeName, routePath) {
|
||
|
const key = routeName;
|
||
|
if (key === "login") {
|
||
|
const modules = ["pwd-login"];
|
||
|
const moduleReg = modules.join("|");
|
||
|
return `/login/:module(${moduleReg})?`;
|
||
|
}
|
||
|
return routePath;
|
||
|
},
|
||
|
onRouteMetaGen(routeName) {
|
||
|
const key = routeName;
|
||
|
const constantRoutes = ["login", "403", "404", "500"];
|
||
|
const meta = {
|
||
|
title: key,
|
||
|
i18nKey: `route.${key}`
|
||
|
};
|
||
|
if (constantRoutes.includes(key)) {
|
||
|
meta.constant = true;
|
||
|
}
|
||
|
return meta;
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// build/plugins/unocss.ts
|
||
|
import process from "node:process";
|
||
|
import path from "node:path";
|
||
|
import unocss from "file:///D:/code/LIB/octopus-admin/node_modules/.pnpm/@unocss+vite@0.62.4_rollup@4.24.2_vite@5.4.7_@types+node@22.5.5_sass@1.79.3_/node_modules/@unocss/vite/dist/index.mjs";
|
||
|
import presetIcons from "file:///D:/code/LIB/octopus-admin/node_modules/.pnpm/@unocss+preset-icons@0.62.4/node_modules/@unocss/preset-icons/dist/index.mjs";
|
||
|
import { FileSystemIconLoader } from "file:///D:/code/LIB/octopus-admin/node_modules/.pnpm/@iconify+utils@2.1.33/node_modules/@iconify/utils/lib/loader/node-loaders.mjs";
|
||
|
function setupUnocss(viteEnv) {
|
||
|
const { VITE_ICON_PREFIX, VITE_ICON_LOCAL_PREFIX } = viteEnv;
|
||
|
const localIconPath = path.join(process.cwd(), "src/assets/svg-icon");
|
||
|
const collectionName = VITE_ICON_LOCAL_PREFIX.replace(`${VITE_ICON_PREFIX}-`, "");
|
||
|
return unocss({
|
||
|
presets: [
|
||
|
presetIcons({
|
||
|
prefix: `${VITE_ICON_PREFIX}-`,
|
||
|
scale: 1,
|
||
|
extraProperties: {
|
||
|
display: "inline-block"
|
||
|
},
|
||
|
collections: {
|
||
|
[collectionName]: FileSystemIconLoader(
|
||
|
localIconPath,
|
||
|
(svg) => svg.replace(/^<svg\s/, '<svg width="1em" height="1em" ')
|
||
|
)
|
||
|
},
|
||
|
warn: true
|
||
|
})
|
||
|
]
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// build/plugins/unplugin.ts
|
||
|
import process2 from "node:process";
|
||
|
import path2 from "node:path";
|
||
|
import Icons from "file:///D:/code/LIB/octopus-admin/node_modules/.pnpm/unplugin-icons@0.19.3_@vue+compiler-sfc@3.5.7_webpack-sources@3.2.3/node_modules/unplugin-icons/dist/vite.js";
|
||
|
import IconsResolver from "file:///D:/code/LIB/octopus-admin/node_modules/.pnpm/unplugin-icons@0.19.3_@vue+compiler-sfc@3.5.7_webpack-sources@3.2.3/node_modules/unplugin-icons/dist/resolver.js";
|
||
|
import Components from "file:///D:/code/LIB/octopus-admin/node_modules/.pnpm/unplugin-vue-components@0.27.4_@babel+parser@7.26.1_rollup@4.24.2_vue@3.5.7_typescript@5.6.2__webpack-sources@3.2.3/node_modules/unplugin-vue-components/dist/vite.js";
|
||
|
import { AntDesignVueResolver, NaiveUiResolver } from "file:///D:/code/LIB/octopus-admin/node_modules/.pnpm/unplugin-vue-components@0.27.4_@babel+parser@7.26.1_rollup@4.24.2_vue@3.5.7_typescript@5.6.2__webpack-sources@3.2.3/node_modules/unplugin-vue-components/dist/resolvers.js";
|
||
|
import { FileSystemIconLoader as FileSystemIconLoader2 } from "file:///D:/code/LIB/octopus-admin/node_modules/.pnpm/unplugin-icons@0.19.3_@vue+compiler-sfc@3.5.7_webpack-sources@3.2.3/node_modules/unplugin-icons/dist/loaders.js";
|
||
|
import { createSvgIconsPlugin } from "file:///D:/code/LIB/octopus-admin/node_modules/.pnpm/vite-plugin-svg-icons@2.0.1_vite@5.4.7_@types+node@22.5.5_sass@1.79.3_/node_modules/vite-plugin-svg-icons/dist/index.mjs";
|
||
|
function setupUnplugin(viteEnv) {
|
||
|
const { VITE_ICON_PREFIX, VITE_ICON_LOCAL_PREFIX } = viteEnv;
|
||
|
const localIconPath = path2.join(process2.cwd(), "src/assets/svg-icon");
|
||
|
const collectionName = VITE_ICON_LOCAL_PREFIX.replace(`${VITE_ICON_PREFIX}-`, "");
|
||
|
const plugins = [
|
||
|
Icons({
|
||
|
compiler: "vue3",
|
||
|
customCollections: {
|
||
|
[collectionName]: FileSystemIconLoader2(
|
||
|
localIconPath,
|
||
|
(svg) => svg.replace(/^<svg\s/, '<svg width="1em" height="1em" ')
|
||
|
)
|
||
|
},
|
||
|
scale: 1,
|
||
|
defaultClass: "inline-block"
|
||
|
}),
|
||
|
Components({
|
||
|
dts: "src/typings/components.d.ts",
|
||
|
types: [{ from: "vue-router", names: ["RouterLink", "RouterView"] }],
|
||
|
resolvers: [
|
||
|
AntDesignVueResolver({
|
||
|
importStyle: false
|
||
|
}),
|
||
|
NaiveUiResolver(),
|
||
|
IconsResolver({ customCollections: [collectionName], componentPrefix: VITE_ICON_PREFIX })
|
||
|
]
|
||
|
}),
|
||
|
createSvgIconsPlugin({
|
||
|
iconDirs: [localIconPath],
|
||
|
symbolId: `${VITE_ICON_LOCAL_PREFIX}-[dir]-[name]`,
|
||
|
inject: "body-last",
|
||
|
customDomId: "__SVG_ICON_LOCAL__"
|
||
|
})
|
||
|
];
|
||
|
return plugins;
|
||
|
}
|
||
|
|
||
|
// build/plugins/html.ts
|
||
|
function setupHtmlPlugin(buildTime) {
|
||
|
const plugin = {
|
||
|
name: "html-plugin",
|
||
|
apply: "build",
|
||
|
transformIndexHtml(html) {
|
||
|
return html.replace("<head>", `<head>
|
||
|
<meta name="buildTime" content="${buildTime}">`);
|
||
|
}
|
||
|
};
|
||
|
return plugin;
|
||
|
}
|
||
|
|
||
|
// build/plugins/index.ts
|
||
|
function setupVitePlugins(viteEnv, buildTime) {
|
||
|
const plugins = [
|
||
|
vue(),
|
||
|
vueJsx(),
|
||
|
VueDevtools(),
|
||
|
setupElegantRouter(),
|
||
|
setupUnocss(viteEnv),
|
||
|
...setupUnplugin(viteEnv),
|
||
|
progress(),
|
||
|
setupHtmlPlugin(buildTime)
|
||
|
];
|
||
|
return plugins;
|
||
|
}
|
||
|
|
||
|
// src/utils/service.ts
|
||
|
import json5 from "file:///D:/code/LIB/octopus-admin/node_modules/.pnpm/json5@2.2.3/node_modules/json5/lib/index.js";
|
||
|
function createServiceConfig(env) {
|
||
|
const { VITE_SERVICE_BASE_URL, VITE_OTHER_SERVICE_BASE_URL } = env;
|
||
|
let other = {};
|
||
|
try {
|
||
|
if (VITE_OTHER_SERVICE_BASE_URL) {
|
||
|
other = json5.parse(VITE_OTHER_SERVICE_BASE_URL);
|
||
|
}
|
||
|
} catch {
|
||
|
console.error("VITE_OTHER_SERVICE_BASE_URL is not a valid json5 string");
|
||
|
}
|
||
|
const httpConfig = {
|
||
|
baseURL: VITE_SERVICE_BASE_URL,
|
||
|
other
|
||
|
};
|
||
|
const otherHttpKeys = Object.keys(httpConfig.other);
|
||
|
const otherConfig = otherHttpKeys.map((key) => {
|
||
|
return {
|
||
|
key,
|
||
|
baseURL: httpConfig.other[key],
|
||
|
proxyPattern: createProxyPattern(key)
|
||
|
};
|
||
|
});
|
||
|
const config = {
|
||
|
baseURL: httpConfig.baseURL,
|
||
|
proxyPattern: createProxyPattern(),
|
||
|
other: otherConfig
|
||
|
};
|
||
|
return config;
|
||
|
}
|
||
|
function createProxyPattern(key) {
|
||
|
if (!key) {
|
||
|
return "/snail-job";
|
||
|
}
|
||
|
return `/proxy-${key}`;
|
||
|
}
|
||
|
|
||
|
// build/config/proxy.ts
|
||
|
function createViteProxy(env, enable) {
|
||
|
const isEnableHttpProxy = enable && env.VITE_HTTP_PROXY === "Y";
|
||
|
if (!isEnableHttpProxy) return void 0;
|
||
|
const { baseURL, proxyPattern, other } = createServiceConfig(env);
|
||
|
const proxy = createProxyItem({ baseURL, proxyPattern });
|
||
|
other.forEach((item) => {
|
||
|
Object.assign(proxy, createProxyItem(item));
|
||
|
});
|
||
|
return proxy;
|
||
|
}
|
||
|
function createProxyItem(item) {
|
||
|
const proxy = {};
|
||
|
proxy[item.proxyPattern] = {
|
||
|
target: item.baseURL,
|
||
|
changeOrigin: true,
|
||
|
rewrite: (path3) => path3.replace(new RegExp(`^${item.proxyPattern}`), "")
|
||
|
};
|
||
|
return proxy;
|
||
|
}
|
||
|
|
||
|
// build/config/time.ts
|
||
|
import dayjs from "file:///D:/code/LIB/octopus-admin/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/dayjs.min.js";
|
||
|
import utc from "file:///D:/code/LIB/octopus-admin/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/utc.js";
|
||
|
import timezone from "file:///D:/code/LIB/octopus-admin/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/timezone.js";
|
||
|
function getBuildTime() {
|
||
|
dayjs.extend(utc);
|
||
|
dayjs.extend(timezone);
|
||
|
const buildTime = dayjs.tz(Date.now(), "Asia/Shanghai").format("YYYY-MM-DD HH:mm:ss");
|
||
|
return buildTime;
|
||
|
}
|
||
|
|
||
|
// vite.config.ts
|
||
|
var __vite_injected_original_import_meta_url = "file:///D:/code/LIB/octopus-admin/vite.config.ts";
|
||
|
var vite_config_default = defineConfig((configEnv) => {
|
||
|
const viteEnv = loadEnv(configEnv.mode, process3.cwd());
|
||
|
const buildTime = getBuildTime();
|
||
|
const enableProxy = configEnv.command === "serve" && !configEnv.isPreview;
|
||
|
return {
|
||
|
base: viteEnv.VITE_BASE_URL,
|
||
|
resolve: {
|
||
|
alias: {
|
||
|
"~": fileURLToPath(new URL("./", __vite_injected_original_import_meta_url)),
|
||
|
"@": fileURLToPath(new URL("./src", __vite_injected_original_import_meta_url))
|
||
|
}
|
||
|
},
|
||
|
css: {
|
||
|
preprocessorOptions: {
|
||
|
scss: {
|
||
|
api: "modern-compiler",
|
||
|
additionalData: `@use "@/styles/scss/global.scss" as *;`
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
plugins: setupVitePlugins(viteEnv, buildTime),
|
||
|
define: {
|
||
|
BUILD_TIME: JSON.stringify(buildTime)
|
||
|
},
|
||
|
server: {
|
||
|
host: "0.0.0.0",
|
||
|
port: 9527,
|
||
|
open: true,
|
||
|
proxy: createViteProxy(viteEnv, enableProxy),
|
||
|
fs: {
|
||
|
cachedChecks: false
|
||
|
}
|
||
|
},
|
||
|
preview: {
|
||
|
port: 9725
|
||
|
},
|
||
|
build: {
|
||
|
reportCompressedSize: false,
|
||
|
sourcemap: viteEnv.VITE_SOURCE_MAP === "Y",
|
||
|
commonjsOptions: {
|
||
|
ignoreTryCatch: false
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
});
|
||
|
export {
|
||
|
vite_config_default as default
|
||
|
};
|
||
|
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiLCAiYnVpbGQvcGx1Z2lucy9pbmRleC50cyIsICJidWlsZC9wbHVnaW5zL3JvdXRlci50cyIsICJidWlsZC9wbHVnaW5zL3Vub2Nzcy50cyIsICJidWlsZC9wbHVnaW5zL3VucGx1Z2luLnRzIiwgImJ1aWxkL3BsdWdpbnMvaHRtbC50cyIsICJzcmMvdXRpbHMvc2VydmljZS50cyIsICJidWlsZC9jb25maWcvcHJveHkudHMiLCAiYnVpbGQvY29uZmlnL3RpbWUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJEOlxcXFxjb2RlXFxcXExJQlxcXFxvY3RvcHVzLWFkbWluXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJEOlxcXFxjb2RlXFxcXExJQlxcXFxvY3RvcHVzLWFkbWluXFxcXHZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9EOi9jb2RlL0xJQi9vY3RvcHVzLWFkbWluL3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7IFVSTCwgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7IGRlZmluZUNvbmZpZywgbG9hZEVudiB9IGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHsgc2V0dXBWaXRlUGx1Z2lucyB9IGZyb20gJy4vYnVpbGQvcGx1Z2lucyc7XG5pbXBvcnQgeyBjcmVhdGVWaXRlUHJveHksIGdldEJ1aWxkVGltZSB9IGZyb20gJy4vYnVpbGQvY29uZmlnJztcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKGNvbmZpZ0VudiA9PiB7XG4gIGNvbnN0IHZpdGVFbnYgPSBsb2FkRW52KGNvbmZpZ0Vudi5tb2RlLCBwcm9jZXNzLmN3ZCgpKSBhcyB1bmtub3duIGFzIEVudi5JbXBvcnRNZXRhO1xuXG4gIGNvbnN0IGJ1aWxkVGltZSA9IGdldEJ1aWxkVGltZSgpO1xuXG4gIGNvbnN0IGVuYWJsZVByb3h5ID0gY29uZmlnRW52LmNvbW1hbmQgPT09ICdzZXJ2ZScgJiYgIWNvbmZpZ0Vudi5pc1ByZXZpZXc7XG5cbiAgcmV0dXJuIHtcbiAgICBiYXNlOiB2aXRlRW52LlZJVEVfQkFTRV9VUkwsXG4gICAgcmVzb2x2ZToge1xuICAgICAgYWxpYXM6IHtcbiAgICAgICAgJ34nOiBmaWxlVVJMVG9QYXRoKG5ldyBVUkwoJy4vJywgaW1wb3J0Lm1ldGEudXJsKSksXG4gICAgICAgICdAJzogZmlsZVVSTFRvUGF0aChuZXcgVVJMKCcuL3NyYycsIGltcG9ydC5tZXRhLnVybCkpXG4gICAgICB9XG4gICAgfSxcbiAgICBjc3M6IHtcbiAgICAgIHByZXByb2Nlc3Nvck9wdGlvbnM6IHtcbiAgICAgICAgc2Nzczoge1xuICAgICAgICAgIGFwaTogJ21vZGVybi1jb21waWxlcicsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IGBAdXNlIFwiQC9zdHlsZXMvc2Nzcy9nbG9iYWwuc2Nzc1wiIGFzICo7YFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBwbHVnaW5zOiBzZXR1cFZpdGVQbHVnaW5zKHZpdGVFbnYsIGJ1aWxkVGltZSksXG4gICAgZGVmaW5lOiB7XG4gICAgICBCVUlMRF9USU1FOiBKU09OLnN0cmluZ2lmeShidWlsZFRpbWUpXG4gICAgfSxcbiAgICBzZXJ2ZXI6IHtcbiAgICAgIGhvc3Q6ICcwLjAuMC4wJyxcbiAgICAgIHBvcnQ6IDk1MjcsXG4gICAgICBvcGVuOiB0cnVlLFxuICAgICAgcHJveHk6IGNyZWF0ZVZpdGVQcm94eSh2aXRlRW52LCBlbmFibGVQcm94eSksXG4gICAgICBmczoge1xuICAgICAgICBjYWNoZWRDaGVja3M6IGZhbHNlXG4gICAgICB9XG4gICAgfSxcbiAgICBwcmV2aWV3OiB7XG4gICAgICBwb3J0OiA5NzI1XG4gICAgfSxcbiAgICBidWlsZDoge1xuICAgICAgcmVwb3J0Q29tcHJlc3NlZFNpemU6IGZhbHNlLFxuICAgICAgc291cmNlbWFwOiB2aXRlRW52LlZJVEVfU09VUkNFX01BUCA9PT0gJ1knLFxuICAgICAgY29tbW9uanNPcHRpb25zOiB7XG4gICAgICAgIGlnbm9yZVRyeUNhdGNoOiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn0pO1xuIiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJEOlxcXFxjb2RlXFxcXExJQlxcXFxvY3RvcHVzLWFkbWluXFxcXGJ1aWxkXFxcXHBsdWdpbnNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkQ6XFxcXGNvZGVcXFxcTElCXFxcXG9jdG9wdXMtYWRtaW5cXFxcYnVpbGRcXFxccGx1Z2luc1xcXFxpbmRleC50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRDovY29kZS9MSUIvb2N0b3B1cy1hZG1pbi9idWlsZC9wbHVnaW5zL2luZGV4LnRzXCI7aW1wb3J0IHR5cGUgeyBQbHVnaW5PcHRpb24gfSBmcm9tICd2aXRlJztcbmltcG9ydCB2dWUgZnJvbSAnQHZpdGVqcy9wbHVnaW4tdnVlJztcbmltcG9ydCB2dWVKc3ggZnJvbSAnQHZpdGVqcy9wbHVnaW4tdnVlLWpzeCc7XG5pbXBvcnQgVnVlRGV2dG9vbHMgZnJvbSAndml0ZS1wbHVnaW4tdnVlLWRldnRvb2xzJztcbmltcG9ydCBwcm9ncmVzcyBmcm9tICd2aXRlLXBsdWdpbi1wcm9ncmVzcyc7XG5pbXBvcnQgeyBzZXR1cEVsZWdhbnRSb3V0ZXIgfSBmcm9tICcuL3JvdXRlcic7XG5pbXBvcnQgeyBzZXR1cFVub2NzcyB9IGZyb20gJy4vdW5vY3NzJztcbmltcG9ydCB7IHNldHVwVW5wbHVnaW4gfSBmcm9tICcuL3VucGx1Z2luJztcbmltcG9ydCB7IHNldHVwSHRtbFBsdWdpbiB9IGZyb20gJy4vaHRtbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cFZpdGVQbHVnaW5zKHZpdGVFbnY6IEVudi5JbXBvcnRNZXRhLCBidWlsZFRpbWU6IHN0cmluZykge1xuICBjb25zdCBwbHVnaW5zOiBQbHVnaW5PcHRpb24gPSBbXG4gICAgdnVlKCksXG4gICAgdnVlSnN4KCksXG4gICAgVnVlRGV2dG9vbHMoKSxcbiAgICBzZXR1cEVsZWdhbnRSb3V0ZXIoKSxcbiAgICBzZXR1cFVub2Nzcyh2aXRlRW52KSxcbiAgICAuLi5zZXR1cFVucGx1Z2luKHZpdGVFbnYpLFxuICAgIHByb2dyZXNzKCksXG4gICAgc2V0dXBIdG1sUGx1Z2luKGJ1a
|