This is an automated email from the ASF dual-hosted git repository.

jin pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/incubator-hugegraph-computer.git


The following commit(s) were added to refs/heads/master by this push:
     new 20adc21e fix(vermeer): avoid binary file include in source code (#340)
20adc21e is described below

commit 20adc21eaf35a4ce7696368c29ac6730525af5ce
Author: Jingkai Yang <[email protected]>
AuthorDate: Thu Nov 13 16:10:16 2025 +0800

    fix(vermeer): avoid binary file include in source code (#340)
    
    * introducing auto-download .so and makefile
    
    * remove >800k files
    
    * fix(ui/Makefile): add ui dirs; change Makefile
    
    * fix(ui header): add header
    
    ---------
    
    Co-authored-by: Peng Junzhi <[email protected]>
---
 .gitignore                                        |   1 -
 vermeer/.gitignore                                |  11 +
 vermeer/Makefile                                  |  85 +++
 vermeer/README.md                                 |  75 ++-
 vermeer/README.zh-CN.md                           |  73 ++-
 vermeer/asset/assets_vfsdata.go                   | 609 ----------------------
 vermeer/build.sh                                  |  10 +
 vermeer/scripts/download_binaries.sh              | 189 +++++++
 vermeer/tools/protoc/linux64/protoc               | Bin 4648136 -> 0 bytes
 vermeer/tools/protoc/osxm1/protoc                 | Bin 3938995 -> 0 bytes
 vermeer/tools/supervisord/linux_amd64/supervisord | Bin 3800096 -> 0 bytes
 vermeer/tools/supervisord/linux_arm64/supervisord | Bin 3452480 -> 0 bytes
 vermeer/ui/ui/master.html                         | 101 ++++
 vermeer/ui/ui/worker.html                         | 119 +++++
 14 files changed, 619 insertions(+), 654 deletions(-)

diff --git a/.gitignore b/.gitignore
index 47829152..e909d27e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,6 @@
 target/
 **.db
 logs/
-ui
 node_modules
 upload-files/
 demo*
diff --git a/vermeer/.gitignore b/vermeer/.gitignore
index 53629789..b9d714e5 100644
--- a/vermeer/.gitignore
+++ b/vermeer/.gitignore
@@ -87,3 +87,14 @@ node_modules/
 # Others #
 ######################
 test/case/
+
+# Downloaded binaries (should be downloaded via scripts/download_binaries.sh) #
+######################
+tools/supervisord/*/supervisord*
+tools/protoc/*/protoc
+tools/protoc/*/bin/
+tools/protoc/*/include/
+
+# Generated files (should be generated via go generate) #
+######################
+asset/assets_vfsdata.go
diff --git a/vermeer/Makefile b/vermeer/Makefile
new file mode 100644
index 00000000..ba9cb73f
--- /dev/null
+++ b/vermeer/Makefile
@@ -0,0 +1,85 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+.PHONY: all init download-binaries generate-assets build clean help
+
+# Default target
+all: generate-assets build
+
+# Initialize project (first time setup)
+init: download-binaries
+       @echo "Installing Go dependencies..."
+       go mod download
+       @echo "Project initialized successfully!"
+
+# Download binary dependencies (supervisord, protoc)
+download-binaries:
+       @echo "Downloading binary dependencies..."
+       @./scripts/download_binaries.sh || (echo "Failed to download binaries" 
&& exit 1)
+
+# Generate assets (vfsdata.go for web UI)
+generate-assets:
+       @echo "Generating assets..."
+       @cd asset && go generate || (echo "Failed to generate assets" && exit 1)
+       @echo "Assets generated successfully!"
+
+# Build vermeer binary
+build:
+       @echo "Building vermeer..."
+       @go build -o vermeer
+       @echo "Build completed: ./vermeer"
+
+# Build for specific platform
+build-linux-amd64:
+       @echo "Building for linux/amd64..."
+       @CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o vermeer
+
+build-linux-arm64:
+       @echo "Building for linux/arm64..."
+       @CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o vermeer
+
+# Clean generated files and binaries
+clean:
+       @echo "Cleaning..."
+       @rm -f vermeer
+       @rm -f asset/assets_vfsdata.go
+       @echo "Clean completed!"
+
+# Clean including downloaded binaries
+clean-all: clean
+       @echo "Cleaning downloaded binaries..."
+       @rm -rf tools/supervisord/*/supervisord
+       @rm -rf tools/protoc/*/protoc
+       @rm -rf tools/protoc/*/bin
+       @rm -rf tools/protoc/*/include
+       @echo "All clean completed!"
+
+# Help
+help:
+       @echo "Vermeer Build System"
+       @echo ""
+       @echo "Usage:"
+       @echo "  make init              - First time setup (download binaries + 
go mod download)"
+       @echo "  make download-binaries - Download supervisord and protoc 
binaries for your platform"
+       @echo "  make generate-assets   - Generate assets_vfsdata.go from web 
UI (required before build)"
+       @echo "  make build             - Build vermeer for current platform 
(default: local architecture)"
+       @echo "  make build-linux-amd64 - Build for Linux AMD64 (for 
deployment)"
+       @echo "  make build-linux-arm64 - Build for Linux ARM64 (for ARM 
servers)"
+       @echo "  make clean             - Remove generated files and binaries 
(keep downloaded tools)"
+       @echo "  make clean-all         - Remove everything including 
downloaded tools"
+       @echo "  make all               - Generate assets and build (default 
target)"
+       @echo "  make help              - Show this help message"
diff --git a/vermeer/README.md b/vermeer/README.md
index 55ca14b0..2d9e8207 100644
--- a/vermeer/README.md
+++ b/vermeer/README.md
@@ -48,42 +48,73 @@ Configuration file reference config/supervisor.conf
 ./supervisord -c supervisor.conf -d
 ````
 
-## Compile
-Required
-* go 1.23
+## Build from Source
 
-### Install dependencies
+### Requirements
+* Go 1.23 or later
+* `curl` and `unzip` utilities (for downloading dependencies)
+* Internet connection (for first-time setup)
 
+### Quick Start
+
+**Recommended**: Use Makefile for building:
+
+```bash
+# First time setup (downloads binary dependencies)
+make init
+
+# Build vermeer
+make
 ```
-go mod tidy
+
+**Alternative**: Use the build script:
+
+```bash
+# For AMD64
+./build.sh amd64
+
+# For ARM64
+./build.sh arm64
 ```
 
-### Local compile
+# The script will:
+# - Auto-detect your OS and architecture if no parameter is provided
+# - Download required tools if not present
+# - Generate assets and build the binary
+# - Exit with error message if any step fails
+
+### Build Targets
 
+```bash
+make build              # Build for current platform
+make build-linux-amd64  # Build for Linux AMD64
+make build-linux-arm64  # Build for Linux ARM64
+make clean              # Clean generated files
+make help               # Show all available targets
 ```
-go build
+
+### Development Build
+
+For development with hot-reload of web UI:
+
+```bash
+go build -tags=dev
 ```
 
 ---
 
-### install grpc protobuf dependencies
-````
-go install google.golang.org/protobuf/cmd/[email protected] \
-go install google.golang.org/grpc/cmd/[email protected]
-````
-
-### protobuf build
-````
-../../tools/protoc/osxm1/protoc *.proto --go-grpc_out=. --go_out=.
-````
+### Protobuf Development
 
+If you need to regenerate protobuf files:
 
-### Cross Compile
+```bash
+# Install protobuf Go plugins
+go install google.golang.org/protobuf/cmd/[email protected]
+go install google.golang.org/grpc/cmd/[email protected]
 
-````
-linux: GOARCH=amd64 GOOS=linux go build 
-CC=x86_64-linux-musl-gcc CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build 
-buildmode=plugin
-````
+# Generate protobuf files
+tools/protoc/osxm1/protoc *.proto --go-grpc_out=. --go_out=.
+```
 
 ---
 
diff --git a/vermeer/README.zh-CN.md b/vermeer/README.zh-CN.md
index 1b125fa3..eeb7ee6d 100644
--- a/vermeer/README.zh-CN.md
+++ b/vermeer/README.zh-CN.md
@@ -48,44 +48,73 @@ worker: ./vermeer --env=worker01
 ./supervisord -c supervisor.conf -d
 ````
 
-## 编译
+## 从源码编译
 
-* Go 1.23
+### 环境要求
+* Go 1.23 或更高版本
+* `curl` 和 `unzip` 工具(用于下载依赖)
+* 互联网连接(首次构建时需要)
 
-### 安装依赖项
+### 快速开始
 
-```
-go mod tidy
+**推荐**: 使用 Makefile 进行构建:
+
+```bash
+# 首次设置(下载二进制依赖)
+make init
+
+# 构建 vermeer
+make
 ```
 
-### 本地编译
+**替代方案**: 使用构建脚本:
 
+```bash
+# AMD64 架构
+./build.sh amd64
+
+# ARM64 架构
+./build.sh arm64
 ```
-go build
+
+构建过程会自动:
+1. 自动检测操作系统和架构(如果未提供参数)
+2. 下载所需的二进制工具(supervisord, protoc)
+3. 生成 Web UI 资源文件
+4. 构建 vermeer 二进制文件
+
+### 构建目标
+
+```bash
+make build              # 为当前平台构建
+make build-linux-amd64  # 为 Linux AMD64 构建
+make build-linux-arm64  # 为 Linux ARM64 构建
+make clean              # 清理生成的文件
+make help               # 显示所有可用目标
 ```
 
-### grpc protobuf 依赖项安装
-````
-go install google.golang.org/protobuf/cmd/[email protected] \
-go install google.golang.org/grpc/cmd/[email protected]
-````
+### 开发构建
 
+如需在开发环境中热重载 Web UI:
 
+```bash
+go build -tags=dev
+```
 
-### protobuf build
-生成protobuf文件
-````
-../../tools/protoc/osxm1/protoc *.proto --go-grpc_out=. --go_out=.
-````
+---
 
+### Protobuf 开发
 
+如需重新生成 protobuf 文件:
 
-### 交叉编译
+```bash
+# 安装 protobuf Go 插件
+go install google.golang.org/protobuf/cmd/[email protected]
+go install google.golang.org/grpc/cmd/[email protected]
 
-````
-linux: GOARCH=amd64 GOOS=linux go build 
-CC=x86_64-linux-musl-gcc CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build 
-buildmode=plugin
-````
+# 生成 protobuf 文件
+tools/protoc/osxm1/protoc *.proto --go-grpc_out=. --go_out=.
+```
 
 ---
 
diff --git a/vermeer/asset/assets_vfsdata.go b/vermeer/asset/assets_vfsdata.go
deleted file mode 100644
index f669861f..00000000
--- a/vermeer/asset/assets_vfsdata.go
+++ /dev/null
@@ -1,609 +0,0 @@
-
-// Code generated by vfsgen; DO NOT EDIT.
-
-// +build !dev
-
-/*
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements. See the NOTICE file distributed with this
-work for additional information regarding copyright ownership. The ASF
-licenses this file to You under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-License for the specific language governing permissions and limitations
-under the License.
-*/
-
-
-package asset
-
-import (
-       "bytes"
-       "compress/gzip"
-       "fmt"
-       "io"
-       "io/ioutil"
-       "net/http"
-       "os"
-       pathpkg "path"
-       "time"
-)
-
-// Assets statically implements the virtual filesystem provided to vfsgen.
-var Assets = func() http.FileSystem {
-       fs := vfsgen۰FS{
-               "/": &vfsgen۰DirInfo{
-                       name:    "/",
-                       modTime: time.Date(2023, 8, 15, 8, 42, 45, 951375200, 
time.UTC),
-               },
-               "/lib": &vfsgen۰DirInfo{
-                       name:    "lib",
-                       modTime: time.Date(2023, 8, 15, 8, 42, 45, 934372100, 
time.UTC),
-               },
-               "/lib/bootstrap-4.3.1-dist": &vfsgen۰DirInfo{
-                       name:    "bootstrap-4.3.1-dist",
-                       modTime: time.Date(2023, 8, 15, 8, 42, 45, 353574500, 
time.UTC),
-               },
-               "/lib/bootstrap-4.3.1-dist/LICENSE": &vfsgen۰CompressedFileInfo{
-                       name:             "LICENSE",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
236570800, time.UTC),
-                       uncompressedSize: 1131,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\x74\x51\x4f\x8f\xa3\x36\x14\xbf\xfb\x53\xfc\x34\xa7\x19\x89\x4e\x77\xf6\xd6\xde\x1c\x70\x82\x55\xb0\x23\xe3\x6c\x9a\x23\x01\x67\x70\x45\x30\xb2\x9d\x46\xf9\xf6\x95\x49\x66\x47\x53\x69\x4f\x88\xe7\xf7\x7e\x7f\xf5\x60\x50\x73\x8d\xca\x76\x66\x0a\x06\xcf\x35\xd7\x2f\x84\xe4\x6e\xbe\x79\xfb\x3e\x44\x3c\x77\x2f\xf8\xfe\xed\xed\xed\xb7\xef\xdf\xde\xfe\x80\xbe\xda\x18\x8d\xcf\xc0\xa7\xee\xf5\xd7\x5b\x83\xc1\xca\xb9\x18\xa2\x
 [...]
-               },
-               "/lib/bootstrap-4.3.1-dist/css": &vfsgen۰DirInfo{
-                       name:    "css",
-                       modTime: time.Date(2023, 8, 15, 8, 42, 45, 327575000, 
time.UTC),
-               },
-               "/lib/bootstrap-4.3.1-dist/css/bootstrap-grid.min.css": 
&vfsgen۰CompressedFileInfo{
-                       name:             "bootstrap-grid.min.css",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
258571100, time.UTC),
-                       uncompressedSize: 48488,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xbc\x7d\xdd\x8f\xe3\x38\x76\xfd\xfb\xfe\x15\xb5\xf8\x61\x81\xdd\xc6\xa8\xca\xf2\x47\x7d\xb8\xb1\x3f\x24\x59\x2c\x82\x05\x66\xf3\x90\x6c\x9e\x82\x3c\xd8\x25\x95\xdb\x19\x52\x16\x24\xd5\x34\x9d\x46\xff\xef\x81\xf8\x25\x5e\xf2\x5e\x52\x5d\xa6\x66\x1e\xc6\x2a\xe9\xe8\x5c\x52\x97\xe4\x3d\xc7\x6a\x59\x0f\x9f\x7e\xff\xbb\xbb\x4f\x77\xff\x72\xb9\x0c\xfd\xd0\x1d\xda\xbb\x7f\xed\xce\xd5\xdd\xaf\xdb\xfb\xcd\x7d\x79\xf7\xc7\x2f\x
 [...]
-               },
-               "/lib/bootstrap-4.3.1-dist/css/bootstrap-grid.min.css.map": 
&vfsgen۰CompressedFileInfo{
-                       name:             "bootstrap-grid.min.css.map",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
277571600, time.UTC),
-                       uncompressedSize: 108539,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\xbd\x09\x73\xdc\xb8\xf1\x38\xfa\x55\x18\xc5\xa9\xbf\xbd\x9a\x91\xe6\xd4\xe5\xb7\x79\x2b\xc9\x92\xd6\xc9\xcf\x6b\x3b\x5e\x3f\x97\x5f\x9c\xfa\x99\x43\x52\x14\x2d\xf0\x10\xc9\xd1\x70\xbc\xe5\xef\xfe\x2f\x00\x3c\x1a\x24\x1a\xc0\x8c\x3c\xe3\xa4\xa2\xad\xc4\x92\xba\xd1\x07\x1a\x8d\xbe\x38\xc7\x1f\x3b\xf7\x5e\x9a\x05\x71\xb4\x73\x32\xee\xed\x64\xf1\x3c\x75\xbc\x6c\xe7\xe4\x9f\x3b\x7b\x7b\xfb\x7b\x7b\xfb\x99\x93\x65\xfb\x
 [...]
-               },
-               "/lib/bootstrap-4.3.1-dist/css/bootstrap-reboot.min.css": 
&vfsgen۰CompressedFileInfo{
-                       name:             "bootstrap-reboot.min.css",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
289571400, time.UTC),
-                       uncompressedSize: 4021,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xa4\x57\x4d\x6f\xdb\x38\xf3\xbf\xef\xa7\xd0\xba\x28\xb0\x0d\x48\x5b\x4e\xeb\xe6\xbf\x12\x7a\xe8\x06\x2d\xfe\x05\x9a\x1c\x9a\xdd\x53\xe1\x03\x25\x8e\x2c\x6e\x28\x0e\x1f\x72\x14\x27\x15\xf4\xdd\x1f\x50\x2f\xb6\x94\xd8\xed\xe1\x39\x59\x24\xe7\x8d\x33\xbf\xdf\x0c\xbd\xba\xf8\xfd\xb7\xe8\x22\xfa\x0b\x91\x3c\x39\x61\xa3\x6f\x90\x21\x52\xf4\xf0\x6e\xf9\x76\xb9\x8e\xfe\x28\x89\xac\x4f\x56\xab\x1d\x50\x36\xca\x2c\x73\xac\x56\x
 [...]
-               },
-               "/lib/bootstrap-4.3.1-dist/css/bootstrap-reboot.min.css.map": 
&vfsgen۰CompressedFileInfo{
-                       name:             "bootstrap-reboot.min.css.map",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
302581000, time.UTC),
-                       uncompressedSize: 32461,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\x7d\x0b\x73\xdb\xb6\xd2\xe8\x5f\xd9\xe3\xe6\xf4\xc4\x2d\xa9\x87\x13\xa7\x8d\xdc\xf4\x56\x96\x25\x47\x49\x1d\x37\x55\xf3\x65\x3a\x75\xe7\x08\x22\x21\x09\xc7\x24\xc0\x00\xa0\x65\x35\xe3\xff\x7e\x07\x4f\x82\x12\x65\x3b\x69\xe6\xcc\x37\xf7\xba\xd3\x51\x24\x12\x58\x2c\xf6\xbd\x8b\x25\xfd\x71\xef\x0a\x73\x41\x18\xdd\xeb\x3d\x89\xf6\x04\x2b\x79\x82\xc5\x5e\xef\x8f\xbd\x56\xab\xdd\x6a\xb5\x45\x22\x44\x7b\xc6\x98\x14\x92\x
 [...]
-               },
-               "/lib/bootstrap-4.3.1-dist/css/bootstrap.min.css": 
&vfsgen۰CompressedFileInfo{
-                       name:             "bootstrap.min.css",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
318573000, time.UTC),
-                       uncompressedSize: 155758,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\xbd\x6d\x8f\xe3\x38\x92\x20\xfc\xfd\xf9\x15\xda\x2c\x14\xba\x72\xda\x72\x49\xb2\x65\x3b\x9d\xe8\xc6\xce\x0e\x76\x71\x0b\x4c\xcf\x87\xe9\x5b\xe0\x80\xbe\x3a\x40\xb6\x68\x5b\x53\x7a\x3b\x49\xae\x54\xb6\xe1\xfd\xed\x0f\xf8\x26\xf1\x25\x48\x49\x4e\x67\x77\xef\xdd\x6d\xef\x54\xca\x54\x30\x22\xc8\x08\x06\x23\x28\x32\xf8\xf9\x4f\xff\xf4\xff\x39\x7f\x72\xfe\xa5\x28\x9a\xba\xa9\xa2\xd2\xf9\xb6\x9c\x2f\xe6\xbe\xf3\xe9\xd4\x
 [...]
-               },
-               "/lib/bootstrap-4.3.1-dist/css/bootstrap.min.css.map": 
&vfsgen۰CompressedFileInfo{
-                       name:             "bootstrap.min.css.map",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
345572600, time.UTC),
-                       uncompressedSize: 625953,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\xfd\x0b\x77\xda\x48\xb6\x28\x8e\x7f\x15\xdd\xf4\x9c\xff\x9d\x3e\x96\x6d\xc0\x18\xdb\xe9\xb9\xf3\x3f\xaa\x92\x84\x05\x01\x82\x89\xe3\xb8\x27\xb3\x26\x42\x94\x41\x46\x0f\xd0\x03\x8c\x67\xf5\x77\xff\xad\x7a\xaa\xf4\x02\x92\xce\xcc\xed\x73\x4f\x66\xcd\x4a\xe3\xda\xf5\xda\xbb\x76\xed\x57\xed\x2a\xfd\xf3\xcd\x06\x45\xb1\x1b\x06\x6f\xde\x5e\xa8\x6f\xe2\x30\x8d\x1c\x14\xbf\x79\xfb\xb7\x37\x67\x67\xe7\x67\x67\xe7\xb1\x13\x
 [...]
-               },
-               "/lib/bootstrap-4.3.1-dist/js": &vfsgen۰DirInfo{
-                       name:    "js",
-                       modTime: time.Date(2023, 8, 15, 8, 42, 45, 410573000, 
time.UTC),
-               },
-               "/lib/bootstrap-4.3.1-dist/js/bootstrap.bundle.min.js": 
&vfsgen۰CompressedFileInfo{
-                       name:             "bootstrap.bundle.min.js",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
367572300, time.UTC),
-                       uncompressedSize: 78635,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xdc\xbd\x7b\x73\xdb\xb6\xb6\x28\xfe\xff\xfd\x14\x12\x76\xb7\x42\x54\x10\x2d\xb7\xdd\xe7\x9c\x4d\x05\xd5\x38\xb6\xd3\xa4\x75\xec\x34\x76\x92\xb6\x2a\x8f\x37\x2d\x41\x12\x12\x0a\x64\x48\xc8\x8e\x6b\xe9\xf7\xd9\x7f\x83\x27\xc1\x97\xac\xf4\x74\xdf\x39\x73\x67\x32\xb1\x88\xf7\x63\x61\xbd\xb0\xb0\xd6\xc1\xd7\xdd\xff\xd3\xe9\x7c\xdd\x79\x96\x24\x3c\xe7\x59\x94\x76\x6e\xbf\xf3\xbf\xf5\x0f\x3b\xde\x92\xf3\x34\x0f\x0e\x0e\x16\x
 [...]
-               },
-               "/lib/bootstrap-4.3.1-dist/js/bootstrap.bundle.min.js.map": 
&vfsgen۰CompressedFileInfo{
-                       name:             "bootstrap.bundle.min.js.map",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
389572800, time.UTC),
-                       uncompressedSize: 311949,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xac\xfd\x6b\x53\xea\xcc\xba\x3f\x8c\x7e\x97\x51\xf3\xd5\x96\xbd\x10\x11\xd1\xff\x7e\xd5\xdd\x09\x21\x1c\x0c\x08\x88\xb8\xeb\x5f\xa3\x22\x44\x08\x42\x82\x49\x40\xf4\xf9\xf2\x4f\x5d\xd7\xaf\x3b\x09\xca\x18\xf7\x9c\x6b\xad\xbb\xea\x1e\x92\x4e\xa7\xd3\x87\xeb\x7c\xca\xff\xf3\xeb\x10\x24\x69\x18\x47\xbf\xfe\x4f\xbd\xf2\x2b\x8d\xf7\xc9\x3c\x48\x7f\xfd\x9f\xff\xff\xaf\xff\xfa\xaf\xea\x7f\xfd\x57\x75\x9d\x56\xd3\x64\x5e\xdd\x
 [...]
-               },
-               "/lib/bootstrap-4.3.1-dist/js/bootstrap.min.js": 
&vfsgen۰CompressedFileInfo{
-                       name:             "bootstrap.min.js",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
403573300, time.UTC),
-                       uncompressedSize: 58072,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xdc\xbd\x6b\x77\xdb\x36\xb6\x30\xfc\xfd\xfc\x0a\x09\xd3\x57\x21\x6a\x98\x91\xdb\xce\x99\x33\x52\x50\x2d\x27\x76\x1a\xb7\x8e\x9d\xc6\x4e\x7a\xd1\x68\xbc\x68\x09\x92\x90\x50\xa0\x42\x42\x76\x1c\x4b\xcf\x6f\x7f\x17\xae\x04\x48\x50\x96\x3b\xed\x59\xcf\x7a\xbe\xd8\x22\xee\x97\x8d\xbd\x37\xf6\x0d\x4f\xbf\x6e\xff\x57\xab\xf5\x75\xeb\x79\x96\xf1\x82\xe7\xc9\xb2\x75\xf3\x5d\xfc\x6d\x7c\xd0\x8a\xe6\x9c\x2f\x8b\xde\xd3\xa7\x33\x
 [...]
-               },
-               "/lib/bootstrap-4.3.1-dist/js/bootstrap.min.js.map": 
&vfsgen۰CompressedFileInfo{
-                       name:             "bootstrap.min.js.map",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
420573400, time.UTC),
-                       uncompressedSize: 190253,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xdc\xbd\x6b\x73\xea\x3c\xb3\x28\xf8\x5f\x56\xed\x4f\x13\xd7\x26\x84\x10\xc2\x99\x4f\x92\x6c\x8c\x31\xe6\x66\x08\x21\x53\xa7\x56\x11\x30\x60\x30\x36\x31\x86\x10\xe6\xcf\x4f\x75\xb7\x6c\xcb\x40\xb2\xd6\xb3\xf7\xfb\x9e\x99\x39\x4f\xd5\xb3\x62\x0b\x59\x97\x56\xab\x6f\xea\x6e\xfd\xdf\xbf\x8e\x5e\xbc\xf7\xa3\xf0\xd7\xff\xa8\x68\xbf\xf6\xd1\x21\x9e\x79\xfb\x5f\xff\xe3\xff\xfa\xf5\x9f\xff\x59\xfa\xcf\xff\x2c\xad\xf7\xa5\x7d\x
 [...]
-               },
-               "/lib/bootstrap4-glyphicons": &vfsgen۰DirInfo{
-                       name:    "bootstrap4-glyphicons",
-                       modTime: time.Date(2023, 8, 15, 8, 42, 45, 855371900, 
time.UTC),
-               },
-               "/lib/bootstrap4-glyphicons/css": &vfsgen۰DirInfo{
-                       name:    "css",
-                       modTime: time.Date(2023, 8, 15, 8, 42, 45, 442246200, 
time.UTC),
-               },
-               "/lib/bootstrap4-glyphicons/css/bootstrap-glyphicons.min.css": 
&vfsgen۰CompressedFileInfo{
-                       name:             "bootstrap-glyphicons.min.css",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
447254000, time.UTC),
-                       uncompressedSize: 11830,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xa4\x9a\x5d\x6f\x15\xb9\x19\xc7\xef\xf7\x53\xa4\xbb\x17\x01\xca\x24\x1b\x56\xed\x56\xc9\x45\xab\xae\x56\x2d\xd2\xb6\x37\xdd\xfb\xca\xe3\xf1\x99\x63\xe2\xb1\x07\xdb\x93\x93\x13\xb4\x12\xe7\x30\x73\x98\x23\x55\x6a\x12\x48\x08\xda\x5e\xc0\xc2\x2e\x20\xf5\x82\x77\x96\x4a\x55\xa5\x7e\x14\x3e\x00\xfd\x0a\xd5\x24\x40\xf3\x78\xfe\x0e\xd5\x72\x07\x27\x3f\x3f\xb6\x1f\x3f\x7e\xde\x3c\xcb\x67\x7e\xf6\xd1\xc2\x99\x85\xdf\x1a\xe3\x
 [...]
-               },
-               "/lib/bootstrap4-glyphicons/fonts": &vfsgen۰DirInfo{
-                       name:    "fonts",
-                       modTime: time.Date(2023, 8, 15, 8, 42, 45, 733377400, 
time.UTC),
-               },
-               "/lib/bootstrap4-glyphicons/fonts/fontawesome": &vfsgen۰DirInfo{
-                       name:    "fontawesome",
-                       modTime: time.Date(2023, 8, 15, 8, 42, 45, 714377800, 
time.UTC),
-               },
-               
"/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-brands-400.eot": 
&vfsgen۰CompressedFileInfo{
-                       name:             "fa-brands-400.eot",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
484247100, time.UTC),
-                       uncompressedSize: 98620,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\xbc\x79\x98\x5c\x55\xb9\xe8\xfd\xbe\x6b\xef\xbd\xd6\x9e\x6a\xef\x1a\xf6\x50\x55\x5d\x43\x77\x55\x77\xed\x1e\x92\x1e\x6a\xda\x49\x3a\xe9\xee\x8c\x84\x10\xc2\x14\x02\x61\x9e\x09\x18\x62\x20\x80\xc8\x64\x80\xa0\x08\xa8\xcc\x22\x20\x06\x04\x54\x8e\x87\x83\x8a\x0a\x8a\x9c\xa8\x88\x5c\x0f\x7a\x39\x8e\x47\x0e\x6a\x44\xaf\xd3\xe5\x68\xaa\xaa\x55\x44\xed\xfe\x9e\xb5\x57\x77\xd2\xe0\xfd\xce\xf3\xdc\x3f\xbf\xe7\xf9\xba\xf2\x
 [...]
-               },
-               
"/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-brands-400.svg": 
&vfsgen۰CompressedFileInfo{
-                       name:             "fa-brands-400.svg",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
516247600, time.UTC),
-                       uncompressedSize: 507478,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xc4\xbd\x5b\x93\x24\xb9\x95\x26\xf6\xce\x5f\x81\x2d\x99\xc9\x24\xb3\x0d\x6f\x9c\x0b\x6e\x23\xf6\xac\x86\xe0\x70\x63\xcc\x3c\xb4\x6b\xaa\x51\xca\xf6\xb1\xd8\x9d\x24\x4b\xdb\x5d\xd5\xea\x2a\xde\xe2\xd7\xcb\xce\x77\xe0\x99\x19\x40\x64\x27\xa5\x17\xf5\x43\x35\x12\x01\x87\xc3\xdd\x71\x39\x97\xef\x7c\xe7\xd7\xff\xe9\x6f\x3f\xfe\x10\xfe\xf2\xf8\xf3\x97\x8f\x9f\x3f\x7d\xfb\x8e\xb6\xf8\x2e\x7c\xf9\xfa\xe1\xd3\xf7\x1f\x7e\xf8\x
 [...]
-               },
-               
"/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-brands-400.ttf": 
&vfsgen۰CompressedFileInfo{
-                       name:             "fa-brands-400.ttf",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
536248500, time.UTC),
-                       uncompressedSize: 98384,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\xfc\x79\x98\x5c\x55\xb9\xe8\x8f\xbf\xef\xda\x7b\xaf\xb5\xa7\xda\xbb\x86\x3d\x54\x55\xd7\xd0\x5d\xd5\x5d\xbb\xa7\xf4\x50\xd3\x4e\xd2\x49\x77\x67\x24\x04\x08\x53\x08\x84\x79\x26\x60\x88\x61\x14\x99\x0c\x10\x14\x01\x95\x59\x04\xc4\x80\x80\x1e\x0e\x87\x83\x8a\x0a\x8a\x9c\xa8\x88\x5c\x0f\x7a\x39\x8e\x47\x0e\x6a\x44\xaf\xd3\xe5\x68\xaa\xaa\x55\x44\xed\xfe\x3d\x6b\xaf\xee\xa4\xc1\xfb\xbb\xcf\xf3\xfd\xf3\xfb\x3c\xdf\xae\x
 [...]
-               },
-               
"/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-brands-400.woff": 
&vfsgen۰FileInfo{
-                       name:    "fa-brands-400.woff",
-                       modTime: time.Date(2023, 8, 15, 8, 42, 45, 555248700, 
time.UTC),
-                       content: 
[]byte("\x77\x4f\x46\x46\x00\x01\x00\x00\x00\x00\xf8\xe0\x00\x0b\x00\x00\x00\x01\x80\x50\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x53\x55\x42\x00\x00\x01\x08\x00\x00\x00\x3b\x00\x00\x00\x54\x20\x8b\x25\x7a\x4f\x53\x2f\x32\x00\x00\x01\x44\x00\x00\x00\x43\x00\x00\x00\x56\x40\x3a\x50\xb8\x63\x6d\x61\x70\x00\x00\x01\x88\x00\x00\x0a\x1e\x00\x00\x16\x36\xff\x39\x17\x22\x67\x6c\x79\x66\x00\x00\x0b\xa8\x00\x00\xdd\xc6\x00\x01
 [...]
-               },
-               
"/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-brands-400.woff2": 
&vfsgen۰FileInfo{
-                       name:    "fa-brands-400.woff2",
-                       modTime: time.Date(2023, 8, 15, 8, 42, 45, 572249100, 
time.UTC),
-                       content: 
[]byte("\x77\x4f\x46\x32\x00\x01\x00\x00\x00\x00\xd4\x94\x00\x0b\x00\x00\x00\x01\x80\x50\x00\x00\xd4\x40\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x54\x06\x56\x00\xac\x36\x0a\x85\x9c\x48\x83\xff\x5d\x01\x36\x02\x24\x03\x8a\x2c\x0b\x85\x18\x00\x04\x20\x05\x86\x2a\x07\x9d\x79\x5b\x85\x2e\x71\x40\xbc\x7d\x20\xa0\x3b\xb8\x40\xa1\xf6\xa8\xc4\x93\x71\xcc\x02\x36\x0e\xc0\x63\xda\x56\xcc\x8a\x60\xe3\x00\x00\x4a\xdf\x4f\xf6\xff
 [...]
-               },
-               
"/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-regular-400.eot": 
&vfsgen۰CompressedFileInfo{
-                       name:             "fa-regular-400.eot",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
586255800, time.UTC),
-                       uncompressedSize: 31156,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\xbd\x6b\x78\x1c\xc7\x75\x20\x7a\x4e\xbf\xaa\xbb\xa7\xa7\xa7\x67\xa6\x7b\x7a\x66\x30\x18\xcc\x7b\xf0\x20\x06\x03\xcc\x8b\x4f\x10\x7c\x53\x12\x45\x51\x12\x25\x53\x6f\x80\xc0\x90\x80\x04\x12\x10\x00\xea\xe1\x28\x36\xe5\xc8\x5a\x39\x96\xbd\xb4\xd6\x9b\x87\xd7\x71\xe8\x5c\xc5\x71\x1c\x3b\xe1\xf5\xe7\xf8\xda\x8e\xbd\xa6\x14\xcb\x51\xb2\xf6\x5e\xc6\xeb\xf8\xfa\x4b\xfc\xc5\xf8\x12\x7f\xfb\x25\x59\x6f\x16\x80\xbc\xb1\xec\x
 [...]
-               },
-               
"/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-regular-400.svg": 
&vfsgen۰CompressedFileInfo{
-                       name:             "fa-regular-400.svg",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
605248500, time.UTC),
-                       uncompressedSize: 107199,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\xbd\x7b\x93\x1c\xc9\x91\x27\xf6\x3f\x3f\x45\x1c\x64\x26\x93\xcc\xae\x62\xc2\x1f\xe1\x11\xb1\xe2\xec\x09\x4c\x92\x5b\x6b\x56\xad\x3b\x53\xaf\x4a\x76\x7f\x82\x83\x26\x09\x5b\x0c\x30\x02\x86\xe4\xb2\x3f\xbd\xcc\x7f\x1e\x59\x9d\x59\xdd\x8d\xc6\xec\xae\xb4\x77\xb7\x33\x63\xe8\xca\x47\x64\x64\x64\x3c\x3c\xfc\xf9\xf3\x5f\xfe\xa7\x7f\xfa\xfe\x7d\xfa\xf3\xdd\xa7\xcf\xef\x3e\x7e\xf8\xf6\x15\xe5\xf2\x2a\x7d\xfe\xf1\xcd\x87\x
 [...]
-               },
-               
"/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-regular-400.ttf": 
&vfsgen۰CompressedFileInfo{
-                       name:             "fa-regular-400.ttf",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
620248500, time.UTC),
-                       uncompressedSize: 30928,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\xbd\x6b\x78\x1c\xc7\x75\x20\x7a\x4e\xbf\xaa\xbb\xa7\xa7\xa7\x67\xa6\x7b\x7a\x66\x30\x18\xcc\x7b\xf0\x20\x06\x03\xcc\x8b\x4f\x10\x7c\x53\x12\x45\x51\x12\x25\x53\x6f\x80\xc0\x90\x80\x04\x12\x10\x00\xea\xe1\x28\x0e\xe5\xc8\x5a\x39\x96\xbd\xb4\xd6\x9b\x87\xd7\x71\xa8\x5c\xc5\x71\x1c\x3b\xe1\xf5\xe7\xf8\xda\x8e\xbd\xa6\x1c\xcb\x51\xb2\xf6\x5e\xc6\xeb\xf8\xfa\x4b\xfc\xc5\xf8\x12\x7f\xfb\x25\x5e\x6f\x16\x80\xbc\xb1\xec\x
 [...]
-               },
-               
"/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-regular-400.woff": 
&vfsgen۰FileInfo{
-                       name:    "fa-regular-400.woff",
-                       modTime: time.Date(2023, 8, 15, 8, 42, 45, 631250300, 
time.UTC),
-                       content: 
[]byte("\x77\x4f\x46\x46\x00\x01\x00\x00\x00\x00\x39\x78\x00\x0b\x00\x00\x00\x00\x78\xd0\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x53\x55\x42\x00\x00\x01\x08\x00\x00\x00\x3b\x00\x00\x00\x54\x20\x8b\x25\x7a\x4f\x53\x2f\x32\x00\x00\x01\x44\x00\x00\x00\x43\x00\x00\x00\x56\x3f\xba\x50\x70\x63\x6d\x61\x70\x00\x00\x01\x88\x00\x00\x04\x21\x00\x00\x09\xea\x45\x47\x35\x15\x67\x6c\x79\x66\x00\x00\x05\xac\x00\x00\x2d\x45\x00\x00
 [...]
-               },
-               
"/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-regular-400.woff2": 
&vfsgen۰FileInfo{
-                       name:    "fa-regular-400.woff2",
-                       modTime: time.Date(2023, 8, 15, 8, 42, 45, 640249200, 
time.UTC),
-                       content: 
[]byte("\x77\x4f\x46\x32\x00\x01\x00\x00\x00\x00\x2f\xbc\x00\x0b\x00\x00\x00\x00\x78\xd0\x00\x00\x2f\x6b\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x54\x06\x56\x00\x93\x6a\x0a\x81\xc2\x24\x81\x9a\x61\x01\x36\x02\x24\x03\x83\x54\x0b\x81\x6c\x00\x04\x20\x05\x86\x12\x07\x8c\x06\x1b\x5a\x63\x75\x86\x1c\x6c\x1c\x00\x38\xf6\x5e\x3a\xa2\x6a\xd5\x95\xfd\xff\xe7\x24\x1d\x63\x38\x66\x0e\x14\xac\xea\xf5\x1f\xb2\x6e\xc2\x31\x64\x66
 [...]
-               },
-               
"/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-solid-900.eot": 
&vfsgen۰CompressedFileInfo{
-                       name:             "fa-solid-900.eot",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
653249100, time.UTC),
-                       uncompressedSize: 102152,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\x9d\x79\x7c\x1b\xd5\xb9\xf7\x7f\xcf\xec\x1a\x49\x63\xc9\xda\xbc\xc8\xb2\x16\x5b\x72\x12\xc7\x76\x2c\x4b\x72\x36\xdb\x71\x42\x08\x21\x04\x43\x16\xc2\x1a\x07\x92\x10\x20\x84\x90\x50\x08\x10\xa8\xc3\x1a\xd6\x86\xb5\xac\xa9\xa1\x94\xa6\xcb\xa5\x94\x4b\x69\x80\x16\x14\x0a\x94\x52\xca\x0d\xb4\xb7\xa5\x94\xb6\x6e\x4b\x29\x97\xb6\xb7\x92\xec\x72\x29\x8b\xfc\x7e\xce\x1c\x6d\x76\x12\x48\xef\xed\x9f\xaf\x95\xef\xcc\x99\x99\x
 [...]
-               },
-               
"/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-solid-900.svg": 
&vfsgen۰CompressedFileInfo{
-                       name:             "fa-solid-900.svg",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
674250200, time.UTC),
-                       uncompressedSize: 378215,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\xbd\x7b\x8f\x24\xc9\x91\x27\xf6\x3f\x3f\x85\x5f\x0b\x10\x24\xe0\xd2\xc7\xed\xe1\xaf\x15\x87\xa7\x66\x0c\xb9\xb9\x40\x94\xee\x80\x5a\xa5\x70\x7f\x36\xbb\x6b\x66\x5a\xec\xe9\xa6\xba\x7a\x38\x3b\xf5\xe9\x05\xfb\x99\x47\x64\x44\x56\x55\x67\x11\x77\xa0\xb4\x38\x72\x77\xba\x3c\x32\x3c\xfc\x61\x6e\x6e\x6e\x66\x6e\x8f\xdf\xfe\xa7\x7f\xfb\xe9\x43\xf8\xeb\xdd\xe7\xfb\xf7\x9f\x3e\x7e\xfb\x8a\x62\x7a\x15\xee\xbf\xbc\xf9\xf8\x
 [...]
-               },
-               
"/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-solid-900.ttf": 
&vfsgen۰CompressedFileInfo{
-                       name:             "fa-solid-900.ttf",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
688257400, time.UTC),
-                       uncompressedSize: 101932,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\x9d\x79\x7c\x5b\xd5\x99\xf7\x7f\xcf\xdd\x75\x25\x5d\x6b\x97\x17\x59\xd6\x62\x4b\x8e\xe3\xd8\x8e\x65\x49\xce\x66\x3b\x0b\x21\x04\x08\x81\x2c\x84\x35\x0e\x84\x90\x42\x08\x21\xa1\x10\x20\x50\x87\x35\xac\x0d\x6b\x59\x53\x43\x29\x4d\x97\x61\x28\x43\x69\x80\x16\x14\x0a\x94\x52\xca\x04\xa6\xd3\x52\x4a\x5b\xb7\xa5\x94\xa1\xed\x54\x92\x5d\x86\xb2\xc8\xef\xe7\xdc\xa3\xcd\x8e\x03\x74\xa6\x7f\xbe\x56\xbe\xf7\x9e\x7b\xee\xbd\x
 [...]
-               },
-               
"/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-solid-900.woff": 
&vfsgen۰FileInfo{
-                       name:    "fa-solid-900.woff",
-                       modTime: time.Date(2023, 8, 15, 8, 42, 45, 706389900, 
time.UTC),
-                       content: 
[]byte("\x77\x4f\x46\x46\x00\x01\x00\x00\x00\x00\xbe\x40\x00\x0b\x00\x00\x00\x01\x8e\x2c\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x53\x55\x42\x00\x00\x01\x08\x00\x00\x00\x3b\x00\x00\x00\x54\x20\x8b\x25\x7a\x4f\x53\x2f\x32\x00\x00\x01\x44\x00\x00\x00\x43\x00\x00\x00\x56\x3f\xb8\x50\xbe\x63\x6d\x61\x70\x00\x00\x01\x88\x00\x00\x0e\xa4\x00\x00\x20\x54\xd7\x4e\x52\xe5\x67\x6c\x79\x66\x00\x00\x10\x2c\x00\x00\x99\x8c\x00\x01
 [...]
-               },
-               
"/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-solid-900.woff2": 
&vfsgen۰FileInfo{
-                       name:    "fa-solid-900.woff2",
-                       modTime: time.Date(2023, 8, 15, 8, 42, 45, 722369600, 
time.UTC),
-                       content: 
[]byte("\x77\x4f\x46\x32\x00\x01\x00\x00\x00\x00\x97\x80\x00\x0b\x00\x00\x00\x01\x8e\x2c\x00\x00\x97\x2f\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x54\x06\x56\x00\xc0\x54\x0a\x85\x8b\x60\x84\x8a\x51\x01\x36\x02\x24\x03\x8f\x0c\x0b\x87\x48\x00\x04\x20\x05\x85\x7a\x07\xaf\x41\x5b\x0f\x49\x71\x44\xbc\x7d\x22\x8a\xdb\x01\xcc\xcb\xa5\x3c\xe6\xec\x08\x0b\x1b\x87\xcc\x18\x08\x43\x01\x3b\xf6\x08\x6c\x1c\x18\x64\x26\x53\xd9\xff
 [...]
-               },
-               "/lib/bootstrap4-glyphicons/fonts/glyphicons": &vfsgen۰DirInfo{
-                       name:    "glyphicons",
-                       modTime: time.Date(2023, 8, 15, 8, 42, 45, 829372900, 
time.UTC),
-               },
-               
"/lib/bootstrap4-glyphicons/fonts/glyphicons/glyphicons-halflings-regular.eot": 
&vfsgen۰CompressedFileInfo{
-                       name:             "glyphicons-halflings-regular.eot",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
747370200, time.UTC),
-                       uncompressedSize: 20127,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\x8c\xb0\x55\x50\xde\x61\x93\xed\xfb\xc7\xdd\xdd\x5f\xdc\xe1\xc5\x3d\xb8\xbb\xbb\xbb\xbb\x04\x08\xee\xee\xee\xee\x1e\x1c\x82\xbb\x3b\x04\x82\x04\x82\xbb\x93\x00\xa7\xe6\x9b\x53\x53\xbb\xf6\xdc\xec\x5f\xd5\x73\xf1\xac\x5e\xdd\xbd\xaa\x0b\x95\x00\x40\x54\x11\x00\x20\x01\x48\x00\x1a\xf8\x2f\x60\x80\xff\x06\x02\x48\x82\x00\x00\x68\x40\x41\xe5\xff\x17\x20\x81\xff\xa9\xfc\x37\xb4\x98\x81\x4c\xc0\xff\x82\x0e\x90\x06\x14\x00\x
 [...]
-               },
-               
"/lib/bootstrap4-glyphicons/fonts/glyphicons/glyphicons-halflings-regular.svg": 
&vfsgen۰CompressedFileInfo{
-                       name:             "glyphicons-halflings-regular.svg",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
773372500, time.UTC),
-                       uncompressedSize: 108738,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\xbd\x6d\x8f\x24\xc9\x91\x26\xf6\x7d\x7f\x85\x69\x04\xe8\x83\x04\xaf\x71\x33\x7f\xd7\x92\x7b\x80\x6e\x0f\x07\x01\x2a\xe9\x80\x3b\x9d\xa0\x4f\xc2\x1c\x39\x64\x12\x88\x25\x2f\x38\x71\xb9\xab\xfa\xf5\x82\x3d\x66\x1e\x99\x55\x5d\x19\x59\x5d\xd5\x33\xdd\xb3\x22\x38\xec\x8c\x8a\xf0\xf0\xf0\x17\x73\x77\x7b\x7d\xec\x37\xff\xe6\x5f\xfe\x69\xa1\xf3\x8f\x7f\xfd\xe9\x4f\x7f\xf9\xf3\x6f\xbf\xe3\x87\xf8\x1d\xfd\xb4\xfd\xf0\xe7\x
 [...]
-               },
-               
"/lib/bootstrap4-glyphicons/fonts/glyphicons/glyphicons-halflings-regular.ttf": 
&vfsgen۰CompressedFileInfo{
-                       name:             "glyphicons-halflings-regular.ttf",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
792372300, time.UTC),
-                       uncompressedSize: 45404,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\xfd\x7b\x7c\x1b\xd5\x95\x38\x80\xdf\x33\x73\x47\x33\x1a\x49\x33\x92\x35\x23\x59\xb6\x25\x7b\x24\x5b\xb2\x6c\xd9\x4e\x24\x4b\x4a\xe2\x44\x4e\x42\x48\x42\xe2\x3c\x20\x21\x24\x04\x42\x42\x06\x42\x02\x24\x26\x24\x21\x94\xf0\x0e\x6f\xd2\x86\x16\x1c\xc2\x7b\xc3\x2b\x0d\x84\x98\x47\x69\x29\xd9\xd2\x4d\x4b\xd1\x96\x6d\x4b\xa9\xcb\x16\x0a\xad\x9d\x05\xbe\xd9\x6e\xcb\x52\x1a\x0a\x38\xd6\xf8\xf7\xb9\x77\x24\x59\x56\x9c\x84\x
 [...]
-               },
-               
"/lib/bootstrap4-glyphicons/fonts/glyphicons/glyphicons-halflings-regular.woff":
 &vfsgen۰CompressedFileInfo{
-                       name:             "glyphicons-halflings-regular.woff",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
814374600, time.UTC),
-                       uncompressedSize: 23424,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\x64\xb4\x63\x70\x1d\xee\xf3\xff\x7d\xc2\xc6\x69\x6c\x3b\x8d\x1b\xdb\x4e\x63\xa3\xb1\x6d\xdb\x56\x63\xdb\xb6\x1b\x9b\x27\x56\xe3\xe4\xc4\x76\xce\x3d\x9f\xdf\xf7\x7e\xf6\xbf\x66\x5e\xf3\x9a\x6b\xf6\xc9\xbe\x77\x66\xd7\x43\x51\x52\x12\x00\x01\x00\x00\x00\xba\x81\x00\xd4\xff\xdc\xa8\xf7\xbf\xff\xff\xfb\x24\x25\xd5\x14\x00\x00\x08\x2d\x00\x00\x40\xf8\x1f\x76\xf4\xe9\x5b\x52\xe2\x12\x92\x00\x00\x84\x2b\x00\x00\x20\x01\x00\x
 [...]
-               },
-               
"/lib/bootstrap4-glyphicons/fonts/glyphicons/glyphicons-halflings-regular.woff2":
 &vfsgen۰FileInfo{
-                       name:    "glyphicons-halflings-regular.woff2",
-                       modTime: time.Date(2023, 8, 15, 8, 42, 45, 840374800, 
time.UTC),
-                       content: 
[]byte("\x77\x4f\x46\x32\x00\x01\x00\x00\x00\x00\x46\x6c\x00\x0f\x00\x00\x00\x00\xb1\x5c\x00\x00\x46\x09\x00\x01\x02\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x46\x46\x54\x4d\x1c\x1a\x20\x06\x60\x00\x8c\x72\x08\x04\x11\x08\x0a\x82\xa9\x24\x81\xe5\x65\x01\x36\x02\x24\x03\x86\x74\x0b\x84\x30\x00\x04\x20\x05\x87\x22\x07\x95\x51\x3f\x77\x65\x62\x66\x06\x1b\x65\x8c\x35\xec\x98\x8f\x80\xf3\x40\xa0\xc2\x3f\xfe\xbe\x08\x0a\xda\xf6\x88\x20
 [...]
-               },
-               "/lib/bootstrap4-glyphicons/maps": &vfsgen۰DirInfo{
-                       name:    "maps",
-                       modTime: time.Date(2023, 8, 15, 8, 42, 45, 885373300, 
time.UTC),
-               },
-               "/lib/bootstrap4-glyphicons/maps/glyphicons-fontawesome.less": 
&vfsgen۰CompressedFileInfo{
-                       name:             "glyphicons-fontawesome.less",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
871371200, time.UTC),
-                       uncompressedSize: 53867,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xb4\x7d\xcb\x92\xe3\x38\xb2\xe5\x3e\xbf\x22\xac\xae\xd9\xed\xaa\xb6\x60\x55\x90\xf1\x90\xa2\x7a\x31\xd3\x9b\x5e\xf7\xa6\x77\xb3\x01\x41\xa7\x88\x14\x48\x30\x01\x50\x0a\xe5\x58\xff\xfb\x18\x5f\x92\x03\xa0\xe0\x88\xe8\xb9\xb9\x48\x0b\x81\x3c\x4e\x12\x84\x03\xfe\x3a\xe0\xff\xae\x55\x67\xb3\x9a\x71\x78\xf8\xbf\xdf\x1e\x1e\x1e\x1e\x96\xdf\xad\x90\x97\x3f\x1f\xfe\xf2\x0f\xd5\xd9\x87\xbf\x9f\xc1\xa8\x16\x1e\x5e\x1f\xfe\xa1\x
 [...]
-               },
-               
"/lib/bootstrap4-glyphicons/maps/glyphicons-fontawesome.min.css": 
&vfsgen۰CompressedFileInfo{
-                       name:             "glyphicons-fontawesome.min.css",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
892372500, time.UTC),
-                       uncompressedSize: 42307,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xb4\x7d\xd9\x92\xdc\x36\x16\xe5\xaf\x38\xd4\x0f\xdd\x8e\x28\xba\x65\x7b\x3c\x13\xed\x7e\x98\x99\x97\xfe\x0f\x24\x89\x4c\x42\x45\x12\x34\x00\x56\x55\xaa\x63\x22\xaa\x72\x5f\x24\x85\x24\xcb\xda\xa5\x90\xad\xd5\x5a\x3c\x92\xad\xc5\xb6\x64\xcd\x27\xf5\x2f\x4c\x90\x99\x04\x97\x3c\x17\x59\xe5\x98\x79\x71\x58\x95\xe7\x82\x20\x96\x7b\x0f\xee\x02\xfe\xe7\xfd\xff\xf9\x1f\x5d\x99\x18\xaf\xcb\x7c\xfe\xef\xf5\xff\xc5\x22\xea\x7f\x
 [...]
-               },
-               "/lib/functions.js": &vfsgen۰CompressedFileInfo{
-                       name:             "functions.js",
-                       modTime:          time.Date(2023, 8, 15, 10, 9, 34, 
911240700, time.UTC),
-                       uncompressedSize: 5200,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xe4\x58\xdb\x8e\xdb\x36\x13\xbe\xcf\x53\x30\xf8\x05\x50\x46\xbc\x72\xf2\xa3\x57\xf6\x7a\x81\xa2\x39\x34\x41\xd3\x04\xd9\x05\xda\x22\x08\x1c\xda\x1c\xcb\x8a\x29\x52\x21\xa9\x75\x8c\x85\xde\xbd\x18\x52\xb2\x75\x74\xbc\xd9\x5e\x14\xa8\x2e\x76\x29\x72\x8e\xdf\xcc\x50\x33\x9e\x91\x70\x9d\xcb\x95\x4d\x94\x24\xe1\x88\xdc\x3d\x22\x84\x90\x95\x92\xc6\x92\x9f\xdf\xbf\x5e\xbc\xff\xf0\xe2\xe5\xeb\x3f\xc9\x9c\xd0\x09\xcb\x92\xc9\x
 [...]
-               },
-               "/lib/jquery-3.5.1.min.js": &vfsgen۰CompressedFileInfo{
-                       name:             "jquery-3.5.1.min.js",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
919376800, time.UTC),
-                       uncompressedSize: 89476,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xb4\xfd\x7b\x77\xdb\x36\x12\x38\x0c\xff\xff\x7e\x0a\x8b\x9b\x65\x81\x08\x92\xa5\xa4\xed\xf3\x2c\x65\x54\x27\x75\x92\x36\xbb\xbd\xc6\xe9\xb6\x5d\x8a\xe9\xa1\x45\xc8\x62\x43\x81\x2a\x09\xfa\x52\x91\xfb\xd9\xdf\x83\xc1\x85\x20\x45\xb9\xed\xfe\x7e\x4f\x7b\x62\x91\x20\xee\x18\xcc\x0c\x66\x06\x33\xe7\x4f\x47\x67\xbf\x7e\x5f\xb1\xe2\xe1\xec\xf6\xf9\xf4\x93\xe9\xfc\xac\x3e\x43\x6b\x7c\xf6\xcf\xab\xb3\xd7\x79\xc5\x93\x58\xa4\x
 [...]
-               },
-               "/lib/jquery-license": &vfsgen۰CompressedFileInfo{
-                       name:             "jquery-license",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
930373200, time.UTC),
-                       uncompressedSize: 1606,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\x64\x54\xcd\x92\xe2\x36\x10\xbe\xfb\x29\xbe\x9a\x53\x52\xe5\x62\xee\x9b\x9a\x83\x07\xc4\xa0\x0a\xc8\xc4\x16\x3b\x99\x53\x4a\xd8\x0d\xd6\x96\x2c\x11\x49\x1e\x96\xb7\x4f\x49\xc0\xce\xce\xe6\x44\xe1\x56\xf7\xf7\xd3\x3f\x73\x77\xba\x78\x7d\x1c\x22\xbe\xfd\x35\x91\xbf\x60\xe9\x26\xdb\xab\xa8\x9d\x85\xb2\x3d\x5c\x1c\xc8\xa3\x73\x36\x7a\xbd\x9f\xa2\xf3\xa1\xc4\x10\xe3\x29\x7c\x79\x7c\xfc\xf6\x6f\xca\x98\x39\x7f\x7c\x2c\x0a\x
 [...]
-               },
-               "/lib/vermeer.css": &vfsgen۰CompressedFileInfo{
-                       name:             "vermeer.css",
-                       modTime:          time.Date(2023, 8, 15, 9, 12, 5, 
447186600, time.UTC),
-                       uncompressedSize: 693,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\x6c\x52\xcd\x8a\xdb\x4c\x10\xbc\xfb\x29\xea\xf8\x7d\x06\xd9\x66\x89\x09\x68\x9f\x21\xb7\xdc\x97\xd6\x4c\xcb\xea\x78\xdc\x2d\x66\x5a\xb6\x9c\x25\xef\x1e\xf4\x63\x87\xcd\xe6\x22\x50\x51\x55\x2a\x55\xf5\x7e\x8b\x6f\x76\x65\x44\xbb\x29\x82\xa9\xb3\x3a\x1a\x0e\x34\x14\xc6\x8d\xd1\xd1\x95\x41\x68\x65\xe4\x08\xa5\x6b\x43\x19\xde\x91\x43\x0a\x8e\x87\x7e\x84\x53\x4a\xb8\x89\x77\x78\x99\x5e\x7b\x8a\x51\xf4\x84\xed\x7e\xd3\x58\x
 [...]
-               },
-               "/master.html": &vfsgen۰CompressedFileInfo{
-                       name:             "master.html",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
948372500, time.UTC),
-                       uncompressedSize: 3659,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xac\x57\x6d\x8f\xd3\xb8\x13\x7f\xbf\x9f\xc2\x18\xe9\x0f\x48\xb8\xd6\x2e\xa0\x3f\x3a\x92\x48\xa7\x05\x0e\x1d\x87\xe0\xc4\x8a\xd3\xdd\x9b\xd5\x24\x9e\x24\xde\xfa\x21\xd8\x4e\x69\xf9\xf4\x27\x3b\x49\x49\x4b\x5b\xd8\x83\x7d\xd3\x78\x3c\xf3\xf3\xcf\xf3\xe4\xd9\xec\xce\xf3\xb7\x97\x57\x7f\xbf\x7b\x41\xda\xa0\x55\x71\x76\x96\xc5\x5f\xa2\xc0\x34\x39\x45\x43\x93\x04\x41\x14\x67\x84\x10\x92\x69\x0c\x40\xda\x10\x3a\x86\x1f\x7b\x
 [...]
-               },
-               "/worker.html": &vfsgen۰CompressedFileInfo{
-                       name:             "worker.html",
-                       modTime:          time.Date(2023, 8, 15, 8, 42, 45, 
956374500, time.UTC),
-                       uncompressedSize: 4714,
-
-                       compressedContent: 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xac\x57\x5b\x8f\xd4\x36\x14\x7e\x9f\x5f\x61\xcc\x03\xad\x84\x27\xe2\xa6\xa2\x36\x93\x07\x16\x10\xea\x45\x6d\x05\xa2\x6a\x5f\x90\x93\x78\x12\xef\x38\x76\xb0\x9d\xd9\x1d\xde\x50\x5b\x15\x28\x2d\x6d\x9f\x4a\x55\xa9\x50\x21\x50\xa5\x72\x95\x5a\x10\x54\xf4\xcf\x30\xc3\xee\xbf\xa8\x1c\x27\xbb\xb9\xec\x6c\x27\xc3\xce\xc3\xce\xda\xf1\xf7\x9d\xcf\xe7\x7c\x3e\xce\xb8\xfb\x4e\x7e\xbc\x72\xee\xf3\x4f\x4e\x81\x58\x27\xcc\xeb\xf5\x
 [...]
-               },
-       }
-       fs["/"].(*vfsgen۰DirInfo).entries = []os.FileInfo{
-               fs["/lib"].(os.FileInfo),
-               fs["/master.html"].(os.FileInfo),
-               fs["/worker.html"].(os.FileInfo),
-       }
-       fs["/lib"].(*vfsgen۰DirInfo).entries = []os.FileInfo{
-               fs["/lib/bootstrap-4.3.1-dist"].(os.FileInfo),
-               fs["/lib/bootstrap4-glyphicons"].(os.FileInfo),
-               fs["/lib/functions.js"].(os.FileInfo),
-               fs["/lib/jquery-3.5.1.min.js"].(os.FileInfo),
-               fs["/lib/jquery-license"].(os.FileInfo),
-               fs["/lib/vermeer.css"].(os.FileInfo),
-       }
-       fs["/lib/bootstrap-4.3.1-dist"].(*vfsgen۰DirInfo).entries = 
[]os.FileInfo{
-               fs["/lib/bootstrap-4.3.1-dist/LICENSE"].(os.FileInfo),
-               fs["/lib/bootstrap-4.3.1-dist/css"].(os.FileInfo),
-               fs["/lib/bootstrap-4.3.1-dist/js"].(os.FileInfo),
-       }
-       fs["/lib/bootstrap-4.3.1-dist/css"].(*vfsgen۰DirInfo).entries = 
[]os.FileInfo{
-               
fs["/lib/bootstrap-4.3.1-dist/css/bootstrap-grid.min.css"].(os.FileInfo),
-               
fs["/lib/bootstrap-4.3.1-dist/css/bootstrap-grid.min.css.map"].(os.FileInfo),
-               
fs["/lib/bootstrap-4.3.1-dist/css/bootstrap-reboot.min.css"].(os.FileInfo),
-               
fs["/lib/bootstrap-4.3.1-dist/css/bootstrap-reboot.min.css.map"].(os.FileInfo),
-               
fs["/lib/bootstrap-4.3.1-dist/css/bootstrap.min.css"].(os.FileInfo),
-               
fs["/lib/bootstrap-4.3.1-dist/css/bootstrap.min.css.map"].(os.FileInfo),
-       }
-       fs["/lib/bootstrap-4.3.1-dist/js"].(*vfsgen۰DirInfo).entries = 
[]os.FileInfo{
-               
fs["/lib/bootstrap-4.3.1-dist/js/bootstrap.bundle.min.js"].(os.FileInfo),
-               
fs["/lib/bootstrap-4.3.1-dist/js/bootstrap.bundle.min.js.map"].(os.FileInfo),
-               
fs["/lib/bootstrap-4.3.1-dist/js/bootstrap.min.js"].(os.FileInfo),
-               
fs["/lib/bootstrap-4.3.1-dist/js/bootstrap.min.js.map"].(os.FileInfo),
-       }
-       fs["/lib/bootstrap4-glyphicons"].(*vfsgen۰DirInfo).entries = 
[]os.FileInfo{
-               fs["/lib/bootstrap4-glyphicons/css"].(os.FileInfo),
-               fs["/lib/bootstrap4-glyphicons/fonts"].(os.FileInfo),
-               fs["/lib/bootstrap4-glyphicons/maps"].(os.FileInfo),
-       }
-       fs["/lib/bootstrap4-glyphicons/css"].(*vfsgen۰DirInfo).entries = 
[]os.FileInfo{
-               
fs["/lib/bootstrap4-glyphicons/css/bootstrap-glyphicons.min.css"].(os.FileInfo),
-       }
-       fs["/lib/bootstrap4-glyphicons/fonts"].(*vfsgen۰DirInfo).entries = 
[]os.FileInfo{
-               
fs["/lib/bootstrap4-glyphicons/fonts/fontawesome"].(os.FileInfo),
-               fs["/lib/bootstrap4-glyphicons/fonts/glyphicons"].(os.FileInfo),
-       }
-       
fs["/lib/bootstrap4-glyphicons/fonts/fontawesome"].(*vfsgen۰DirInfo).entries = 
[]os.FileInfo{
-               
fs["/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-brands-400.eot"].(os.FileInfo),
-               
fs["/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-brands-400.svg"].(os.FileInfo),
-               
fs["/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-brands-400.ttf"].(os.FileInfo),
-               
fs["/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-brands-400.woff"].(os.FileInfo),
-               
fs["/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-brands-400.woff2"].(os.FileInfo),
-               
fs["/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-regular-400.eot"].(os.FileInfo),
-               
fs["/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-regular-400.svg"].(os.FileInfo),
-               
fs["/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-regular-400.ttf"].(os.FileInfo),
-               
fs["/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-regular-400.woff"].(os.FileInfo),
-               
fs["/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-regular-400.woff2"].(os.FileInfo),
-               
fs["/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-solid-900.eot"].(os.FileInfo),
-               
fs["/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-solid-900.svg"].(os.FileInfo),
-               
fs["/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-solid-900.ttf"].(os.FileInfo),
-               
fs["/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-solid-900.woff"].(os.FileInfo),
-               
fs["/lib/bootstrap4-glyphicons/fonts/fontawesome/fa-solid-900.woff2"].(os.FileInfo),
-       }
-       
fs["/lib/bootstrap4-glyphicons/fonts/glyphicons"].(*vfsgen۰DirInfo).entries = 
[]os.FileInfo{
-               
fs["/lib/bootstrap4-glyphicons/fonts/glyphicons/glyphicons-halflings-regular.eot"].(os.FileInfo),
-               
fs["/lib/bootstrap4-glyphicons/fonts/glyphicons/glyphicons-halflings-regular.svg"].(os.FileInfo),
-               
fs["/lib/bootstrap4-glyphicons/fonts/glyphicons/glyphicons-halflings-regular.ttf"].(os.FileInfo),
-               
fs["/lib/bootstrap4-glyphicons/fonts/glyphicons/glyphicons-halflings-regular.woff"].(os.FileInfo),
-               
fs["/lib/bootstrap4-glyphicons/fonts/glyphicons/glyphicons-halflings-regular.woff2"].(os.FileInfo),
-       }
-       fs["/lib/bootstrap4-glyphicons/maps"].(*vfsgen۰DirInfo).entries = 
[]os.FileInfo{
-               
fs["/lib/bootstrap4-glyphicons/maps/glyphicons-fontawesome.less"].(os.FileInfo),
-               
fs["/lib/bootstrap4-glyphicons/maps/glyphicons-fontawesome.min.css"].(os.FileInfo),
-       }
-
-       return fs
-}()
-
-type vfsgen۰FS map[string]interface{}
-
-func (fs vfsgen۰FS) Open(path string) (http.File, error) {
-       path = pathpkg.Clean("/" + path)
-       f, ok := fs[path]
-       if !ok {
-               return nil, &os.PathError{Op: "open", Path: path, Err: 
os.ErrNotExist}
-       }
-
-       switch f := f.(type) {
-       case *vfsgen۰CompressedFileInfo:
-               gr, err := gzip.NewReader(bytes.NewReader(f.compressedContent))
-               if err != nil {
-                       // This should never happen because we generate the 
gzip bytes such that they are always valid.
-                       panic("unexpected error reading own gzip compressed 
bytes: " + err.Error())
-               }
-               return &vfsgen۰CompressedFile{
-                       vfsgen۰CompressedFileInfo: f,
-                       gr:                        gr,
-               }, nil
-       case *vfsgen۰FileInfo:
-               return &vfsgen۰File{
-                       vfsgen۰FileInfo: f,
-                       Reader:          bytes.NewReader(f.content),
-               }, nil
-       case *vfsgen۰DirInfo:
-               return &vfsgen۰Dir{
-                       vfsgen۰DirInfo: f,
-               }, nil
-       default:
-               // This should never happen because we generate only the above 
types.
-               panic(fmt.Sprintf("unexpected type %T", f))
-       }
-}
-
-// vfsgen۰CompressedFileInfo is a static definition of a gzip compressed file.
-type vfsgen۰CompressedFileInfo struct {
-       name              string
-       modTime           time.Time
-       compressedContent []byte
-       uncompressedSize  int64
-}
-
-func (f *vfsgen۰CompressedFileInfo) Readdir(count int) ([]os.FileInfo, error) {
-       return nil, fmt.Errorf("cannot Readdir from file %s", f.name)
-}
-func (f *vfsgen۰CompressedFileInfo) Stat() (os.FileInfo, error) { return f, 
nil }
-
-func (f *vfsgen۰CompressedFileInfo) GzipBytes() []byte {
-       return f.compressedContent
-}
-
-func (f *vfsgen۰CompressedFileInfo) Name() string       { return f.name }
-func (f *vfsgen۰CompressedFileInfo) Size() int64        { return 
f.uncompressedSize }
-func (f *vfsgen۰CompressedFileInfo) Mode() os.FileMode  { return 0444 }
-func (f *vfsgen۰CompressedFileInfo) ModTime() time.Time { return f.modTime }
-func (f *vfsgen۰CompressedFileInfo) IsDir() bool        { return false }
-func (f *vfsgen۰CompressedFileInfo) Sys() interface{}   { return nil }
-
-// vfsgen۰CompressedFile is an opened compressedFile instance.
-type vfsgen۰CompressedFile struct {
-       *vfsgen۰CompressedFileInfo
-       gr      *gzip.Reader
-       grPos   int64 // Actual gr uncompressed position.
-       seekPos int64 // Seek uncompressed position.
-}
-
-func (f *vfsgen۰CompressedFile) Read(p []byte) (n int, err error) {
-       if f.grPos > f.seekPos {
-               // Rewind to beginning.
-               err = f.gr.Reset(bytes.NewReader(f.compressedContent))
-               if err != nil {
-                       return 0, err
-               }
-               f.grPos = 0
-       }
-       if f.grPos < f.seekPos {
-               // Fast-forward.
-               _, err = io.CopyN(ioutil.Discard, f.gr, f.seekPos-f.grPos)
-               if err != nil {
-                       return 0, err
-               }
-               f.grPos = f.seekPos
-       }
-       n, err = f.gr.Read(p)
-       f.grPos += int64(n)
-       f.seekPos = f.grPos
-       return n, err
-}
-func (f *vfsgen۰CompressedFile) Seek(offset int64, whence int) (int64, error) {
-       switch whence {
-       case io.SeekStart:
-               f.seekPos = 0 + offset
-       case io.SeekCurrent:
-               f.seekPos += offset
-       case io.SeekEnd:
-               f.seekPos = f.uncompressedSize + offset
-       default:
-               panic(fmt.Errorf("invalid whence value: %v", whence))
-       }
-       return f.seekPos, nil
-}
-func (f *vfsgen۰CompressedFile) Close() error {
-       return f.gr.Close()
-}
-
-// vfsgen۰FileInfo is a static definition of an uncompressed file (because 
it's not worth gzip compressing).
-type vfsgen۰FileInfo struct {
-       name    string
-       modTime time.Time
-       content []byte
-}
-
-func (f *vfsgen۰FileInfo) Readdir(count int) ([]os.FileInfo, error) {
-       return nil, fmt.Errorf("cannot Readdir from file %s", f.name)
-}
-func (f *vfsgen۰FileInfo) Stat() (os.FileInfo, error) { return f, nil }
-
-func (f *vfsgen۰FileInfo) NotWorthGzipCompressing() {}
-
-func (f *vfsgen۰FileInfo) Name() string       { return f.name }
-func (f *vfsgen۰FileInfo) Size() int64        { return int64(len(f.content)) }
-func (f *vfsgen۰FileInfo) Mode() os.FileMode  { return 0444 }
-func (f *vfsgen۰FileInfo) ModTime() time.Time { return f.modTime }
-func (f *vfsgen۰FileInfo) IsDir() bool        { return false }
-func (f *vfsgen۰FileInfo) Sys() interface{}   { return nil }
-
-// vfsgen۰File is an opened file instance.
-type vfsgen۰File struct {
-       *vfsgen۰FileInfo
-       *bytes.Reader
-}
-
-func (f *vfsgen۰File) Close() error {
-       return nil
-}
-
-// vfsgen۰DirInfo is a static definition of a directory.
-type vfsgen۰DirInfo struct {
-       name    string
-       modTime time.Time
-       entries []os.FileInfo
-}
-
-func (d *vfsgen۰DirInfo) Read([]byte) (int, error) {
-       return 0, fmt.Errorf("cannot Read from directory %s", d.name)
-}
-func (d *vfsgen۰DirInfo) Close() error               { return nil }
-func (d *vfsgen۰DirInfo) Stat() (os.FileInfo, error) { return d, nil }
-
-func (d *vfsgen۰DirInfo) Name() string       { return d.name }
-func (d *vfsgen۰DirInfo) Size() int64        { return 0 }
-func (d *vfsgen۰DirInfo) Mode() os.FileMode  { return 0755 | os.ModeDir }
-func (d *vfsgen۰DirInfo) ModTime() time.Time { return d.modTime }
-func (d *vfsgen۰DirInfo) IsDir() bool        { return true }
-func (d *vfsgen۰DirInfo) Sys() interface{}   { return nil }
-
-// vfsgen۰Dir is an opened dir instance.
-type vfsgen۰Dir struct {
-       *vfsgen۰DirInfo
-       pos int // Position within entries for Seek and Readdir.
-}
-
-func (d *vfsgen۰Dir) Seek(offset int64, whence int) (int64, error) {
-       if offset == 0 && whence == io.SeekStart {
-               d.pos = 0
-               return 0, nil
-       }
-       return 0, fmt.Errorf("unsupported Seek in directory %s", d.name)
-}
-
-func (d *vfsgen۰Dir) Readdir(count int) ([]os.FileInfo, error) {
-       if d.pos >= len(d.entries) && count > 0 {
-               return nil, io.EOF
-       }
-       if count <= 0 || count > len(d.entries)-d.pos {
-               count = len(d.entries) - d.pos
-       }
-       e := d.entries[d.pos : d.pos+count]
-       d.pos += count
-       return e, nil
-}
diff --git a/vermeer/build.sh b/vermeer/build.sh
index c2f48070..47cd42e3 100644
--- a/vermeer/build.sh
+++ b/vermeer/build.sh
@@ -28,6 +28,16 @@ go env -w GONOSUMDB=\*                          ## 目前有一些代码库还
 #go env -w CXX=/opt/compiler/gcc-8.2/bin/g++
 
 go mod download
+
+# Download binary dependencies if not exist
+echo "Checking binary dependencies..."
+./scripts/download_binaries.sh
+
+# Generate assets if not exist
+if [ ! -f "asset/assets_vfsdata.go" ]; then
+    echo "Generating assets..."
+    cd asset && go generate && cd ..
+fi
 ARCH=$1
 CGO_ENABLED=0 GOOS=linux GOARCH="$ARCH" go build
 
diff --git a/vermeer/scripts/download_binaries.sh 
b/vermeer/scripts/download_binaries.sh
new file mode 100755
index 00000000..797b9d66
--- /dev/null
+++ b/vermeer/scripts/download_binaries.sh
@@ -0,0 +1,189 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+set -e
+
+SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
+PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
+TOOLS_DIR="$PROJECT_ROOT/tools"
+
+# Versions
+SUPERVISORD_VERSION="0.6.9"
+PROTOC_VERSION="21.12"
+
+# Colors for output
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+NC='\033[0m' # No Color
+
+log_info() {
+    echo -e "${GREEN}[INFO]${NC} $1"
+}
+
+log_warn() {
+    echo -e "${YELLOW}[WARN]${NC} $1"
+}
+
+log_error() {
+    echo -e "${RED}[ERROR]${NC} $1"
+}
+
+# Download and verify file with MD5 checksum
+download_and_verify() {
+    local url=$1
+    local filepath=$2
+    local expected_md5=$3
+    local md5_cmd
+
+    # Detect md5 command (md5sum on Linux, md5 on macOS)
+    if command -v md5sum &> /dev/null; then
+        md5_cmd="md5sum"
+    elif command -v md5 &> /dev/null; then
+        md5_cmd="md5 -r"
+    else
+        log_warn "MD5 verification tool not found, skipping checksum 
verification"
+        expected_md5=""
+    fi
+
+    if [[ -f $filepath ]]; then
+        if [[ -n $expected_md5 ]]; then
+            log_info "File $filepath exists. Verifying MD5 checksum..."
+            actual_md5=$($md5_cmd "$filepath" | awk '{ print $1 }')
+            if [[ $actual_md5 != $expected_md5 ]]; then
+                log_warn "MD5 checksum mismatch for $filepath. Expected: 
$expected_md5, got: $actual_md5"
+                log_info "Deleting and re-downloading $filepath..."
+                rm -f "$filepath"
+            else
+                log_info "MD5 checksum verified for $filepath"
+                return 0
+            fi
+        else
+            log_info "File $filepath already exists, skipping download"
+            return 0
+        fi
+    fi
+
+    log_info "Downloading $filepath..."
+    if ! curl -L -f "$url" -o "$filepath"; then
+        log_error "Failed to download from $url"
+        return 1
+    fi
+
+    if [[ -n $expected_md5 ]]; then
+        actual_md5=$($md5_cmd "$filepath" | awk '{ print $1 }')
+        if [[ $actual_md5 != $expected_md5 ]]; then
+            log_error "MD5 checksum verification failed after download. 
Expected: $expected_md5, got: $actual_md5"
+            rm -f "$filepath"
+            return 1
+        fi
+        log_info "MD5 checksum verified successfully"
+    fi
+
+    return 0
+}
+
+# Download supervisord
+download_supervisord() {
+    local platform=$1
+    local arch=$2
+    local md5=$3
+    
+    SUPERVISORD_DIR="$TOOLS_DIR/supervisord/${platform}"
+    mkdir -p "$SUPERVISORD_DIR"
+    
+    local 
download_url="https://github.com/ochinchina/supervisord/releases/download/v${SUPERVISORD_VERSION}/supervisord_${SUPERVISORD_VERSION}_Linux_${arch}.tar.gz";
+    local temp_file="/tmp/supervisord_${platform}.tar.gz"
+    
+    log_info "Downloading supervisord for ${platform}..."
+    
+    if ! download_and_verify "$download_url" "$temp_file" "$md5"; then
+        return 1
+    fi
+    
+    if [ ! -f "$SUPERVISORD_DIR/supervisord" ]; then
+        tar -xzf "$temp_file" -C "$SUPERVISORD_DIR" --strip-components=1
+        chmod +x "$SUPERVISORD_DIR/supervisord"
+        log_info "Successfully extracted supervisord for ${platform}"
+    fi
+    
+    rm -f "$temp_file"
+    return 0
+}
+
+# Download protoc
+download_protoc() {
+    local platform=$1
+    local protoc_platform=$2
+    local md5=$3
+    
+    PROTOC_DIR="$TOOLS_DIR/protoc/${platform}"
+    mkdir -p "$PROTOC_DIR"
+    
+    local 
download_url="https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-${protoc_platform}.zip";
+    local temp_file="/tmp/protoc_${platform}.zip"
+    
+    log_info "Downloading protoc for ${platform}..."
+    
+    if ! download_and_verify "$download_url" "$temp_file" "$md5"; then
+        return 1
+    fi
+    
+    if [ ! -f "$PROTOC_DIR/protoc" ]; then
+        unzip -q "$temp_file" -d "$PROTOC_DIR"
+        chmod +x "$PROTOC_DIR/bin/protoc"
+        
+        # Move protoc binary to the root of protoc directory for compatibility
+        if [ -f "$PROTOC_DIR/bin/protoc" ]; then
+            cp "$PROTOC_DIR/bin/protoc" "$PROTOC_DIR/protoc"
+        fi
+        
+        log_info "Successfully extracted protoc for ${platform}"
+    fi
+    
+    rm -f "$temp_file"
+    return 0
+}
+
+# Main function
+main() {
+    log_info "Starting to download binary dependencies..."
+    log_info "Tools directory: $TOOLS_DIR"
+    
+    # Download supervisord for different platforms
+    # MD5 checksums for supervisord v4.2.5
+    download_supervisord "linux_amd64" "64-bit" "" # Add MD5 if available
+    download_supervisord "linux_arm64" "ARM64" "" # Add MD5 if available
+    
+    # Download protoc for different platforms
+    # MD5 checksums for protoc v21.12
+    download_protoc "linux64" "linux-x86_64" "" # Add MD5 if available
+    download_protoc "osxm1" "osx-aarch_64" "" # Add MD5 if available
+    
+    log_info "All binary dependencies downloaded successfully!"
+    log_info ""
+    log_info "Downloaded binaries:"
+    log_info "  - supervisord (linux_amd64, linux_arm64)"
+    log_info "  - protoc (linux64, osxm1, win64)"
+    log_info ""
+    log_info "Note: These binaries are excluded from source releases."
+    log_info "Users should run 'make download-binaries' before building."
+}
+
+# Run main function
+main "$@"
diff --git a/vermeer/tools/protoc/linux64/protoc 
b/vermeer/tools/protoc/linux64/protoc
deleted file mode 100644
index 53bf1e52..00000000
Binary files a/vermeer/tools/protoc/linux64/protoc and /dev/null differ
diff --git a/vermeer/tools/protoc/osxm1/protoc 
b/vermeer/tools/protoc/osxm1/protoc
deleted file mode 100644
index c0fdfb91..00000000
Binary files a/vermeer/tools/protoc/osxm1/protoc and /dev/null differ
diff --git a/vermeer/tools/supervisord/linux_amd64/supervisord 
b/vermeer/tools/supervisord/linux_amd64/supervisord
deleted file mode 100644
index 2746ae62..00000000
Binary files a/vermeer/tools/supervisord/linux_amd64/supervisord and /dev/null 
differ
diff --git a/vermeer/tools/supervisord/linux_arm64/supervisord 
b/vermeer/tools/supervisord/linux_arm64/supervisord
deleted file mode 100644
index cf09e442..00000000
Binary files a/vermeer/tools/supervisord/linux_arm64/supervisord and /dev/null 
differ
diff --git a/vermeer/ui/ui/master.html b/vermeer/ui/ui/master.html
new file mode 100644
index 00000000..27cb1060
--- /dev/null
+++ b/vermeer/ui/ui/master.html
@@ -0,0 +1,101 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with this
+work for additional information regarding copyright ownership. The ASF
+licenses this file to You under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+License for the specific language governing permissions and limitations
+under the License.
+-->
+
+<!DOCTYPE html>
+
+<html lang="en">
+
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <meta name="robots" content="noindex,nofollow">
+    <title>Vermeer Master</title>
+
+    <script src="/ui/lib/jquery-3.5.1.min.js"></script>
+    <script src="/ui/lib/bootstrap-4.3.1-dist/js/bootstrap.min.js"></script>
+    <script src="/ui/lib/functions.js"></script>
+
+    <link type="text/css" rel="stylesheet" 
href="/ui/lib/bootstrap-4.3.1-dist/css/bootstrap.min.css">
+    <link type="text/css" rel="stylesheet" href="/ui/lib/vermeer.css">
+    <link type="text/css" rel="stylesheet" 
href="/ui/lib/bootstrap4-glyphicons/css/bootstrap-glyphicons.min.css">
+</head>
+
+<body>
+    <nav class="navbar fixed-top navbar-expand-sm navbar-dark bg-dark">
+        <div class="container-fluid">
+            <button type="button" class="navbar-toggler" 
data-toggle="collapse" data-target="#nav-content"
+                aria-expanded="false" aria-controls="nav-content" 
aria-label="Toggle navigation">
+                <span class="navbar-toggler-icon"></span>
+            </button>
+            <a class="navbar-brand" href="#">Vermeer</a>
+            <!-- Collect the nav links, forms, and other content for toggling 
-->
+            <div id="nav-content" class="navbar-collapse collapse">
+                <ul class="navbar-nav">
+                    <li class="nav-item active" onclick="" id="metrics-li">
+                        <a class="nav-link" href="#">Master</a>
+                    </li>
+                    <li class="nav-item" onclick="alert('doing')" 
id="status-li">
+                        <a class="nav-link" href="#">Status</a>
+                    </li>
+                    <li class="nav-item">
+                        <a class="nav-link"
+                            
href="https://ku.baidu-int.com/knowledge/HFVrC7hq1Q/pKzJfZczuc/s_2oxmmDFf/m-FWVh8rSyajEE";
+                            target="_blank">Help</a>
+                    </li>
+                </ul>
+            </div>
+        </div>
+    </nav>
+    <div class="container-fluid text-left">
+        <form class="form-inline">
+            <div class="form-group mx-sm-3 mb-2">
+                <label for="inputPassword2" class="sr-only">Password</label>
+                <input type="password" class="form-control" id="admin_token" 
placeholder="Admin Token">
+            </div>
+            <button type="button" class="btn btn-primary mb-2" 
id="token_submit"
+                onclick="vermeer.login()">Login</button>
+        </form>
+    </div>
+    <div class="container-fluid text-center">
+        <h2>Graphs</h2>
+        <table id="graphs_table" class="table"></table>
+    </div>
+    <div class="container-fluid text-center">
+        <h2>Tasks</h2>
+        <table id="tasks_table" class="table"></table>
+    </div>
+
+    <div id="msg-modal" class="modal fade" tabindex="-1" role="dialog" 
aria-labelledby="msg-header" aria-hidden="true">
+        <div class="modal-dialog modal-lg">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h5 class="modal-title">Message</h5>
+                    <button type="button" class="close" data-dismiss="modal" 
aria-label="Close">
+                        <span aria-hidden="true">&times;</span>
+                    </button>
+                </div>
+                <div class="modal-body">
+                    <p id="msg-modal-msg"><!-- To be filled dynamically. 
--></p>
+                </div>
+                <div class="modal-footer">
+                    <button class="btn btn-primary" 
data-dismiss="modal">OK</button>
+                </div>
+            </div>
+        </div>
+    </div>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/vermeer/ui/ui/worker.html b/vermeer/ui/ui/worker.html
new file mode 100644
index 00000000..3d07eb97
--- /dev/null
+++ b/vermeer/ui/ui/worker.html
@@ -0,0 +1,119 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with this
+work for additional information regarding copyright ownership. The ASF
+licenses this file to You under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+License for the specific language governing permissions and limitations
+under the License.
+-->
+
+<!DOCTYPE html>
+
+<html lang="en">
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <meta name="robots" content="noindex,nofollow">
+    <title>Vermeer Master</title>
+
+    <!-- <script src="/static/lib/jquery-3.5.1.min.js"></script>
+        <script 
src="/static/lib/bootstrap-4.3.1-dist/js/bootstrap.min.js"></script>
+        <script src="/static/lib/functions.js"></script>
+        
+        <link type="text/css" rel="stylesheet" 
href="/static/lib/bootstrap-4.3.1-dist/css/bootstrap.min.css">
+        <link type="text/css" rel="stylesheet" href="/static/lib/vermeer.css">
+        <link type="text/css" rel="stylesheet" 
href="/static/lib/bootstrap4-glyphicons/css/bootstrap-glyphicons.min.css">      
   -->
+
+    <script src="./lib/jquery-3.5.1.min.js"></script>
+    <script src="./lib/bootstrap-4.3.1-dist/js/bootstrap.min.js"></script>
+    <script src="./lib/functions.js"></script>
+
+    <link type="text/css" rel="stylesheet" 
href="./lib/bootstrap-4.3.1-dist/css/bootstrap.min.css">
+    <link type="text/css" rel="stylesheet" href="./lib/vermeer.css">
+    <link type="text/css" rel="stylesheet" 
href="./lib/bootstrap4-glyphicons/css/bootstrap-glyphicons.min.css">
+
+</head>
+
+<body>
+    <nav class="navbar fixed-top navbar-expand-sm navbar-dark bg-dark">
+        <div class="container-fluid">
+            <button type="button" class="navbar-toggler" 
data-toggle="collapse" data-target="#nav-content"
+                aria-expanded="false" aria-controls="nav-content" 
aria-label="Toggle navigation">
+                <span class="navbar-toggler-icon"></span>
+            </button>
+            <a class="navbar-brand" href="#">Vermeer</a>
+            <!-- Collect the nav links, forms, and other content for toggling 
-->
+            <div id="nav-content" class="navbar-collapse collapse">
+                <ul class="navbar-nav">
+                    <li class="nav-item active" onclick="" id="metrics-li">
+                        <a class="nav-link" href="#">Summary</a>
+                    </li>
+                    <li class="nav-item" onclick="alert('doing')" 
id="status-li">
+                        <a class="nav-link" href="#">Status</a>
+                    </li>
+                    <li class="nav-item">
+                        <a class="nav-link"
+                            
href="https://ku.baidu-int.com/knowledge/HFVrC7hq1Q/pKzJfZczuc/s_2oxmmDFf/m-FWVh8rSyajEE";
+                            target="_blank">Help</a>
+                    </li>
+                </ul>
+            </div>
+        </div>
+    </nav>
+    
+      <div class="container mt-5">
+        <h2>Bootstrap 颜色示例</h2>
+    
+        <!-- 按钮样式 -->
+        <button class="btn btn-primary">主要按钮</button>
+        <button class="btn btn-secondary">次要按钮</button>
+        <button class="btn btn-success">成功按钮</button>
+        <button class="btn btn-danger">危险按钮</button>
+        <button class="btn btn-warning">警告按钮</button>
+        <button class="btn btn-info">信息按钮</button>
+        <button class="btn btn-light">浅色按钮</button>
+        <button class="btn btn-dark">深色按钮</button>
+    
+        <!-- 标签样式 -->
+        <span class="badge badge-primary">主要标签</span>
+        <span class="badge badge-secondary">次要标签</span>
+        <span class="badge badge-success">成功标签</span>
+        <span class="badge badge-danger">危险标签</span>
+        <span class="badge badge-warning">警告标签</span>
+        <span class="badge badge-info">信息标签</span>
+        <span class="badge badge-light">浅色标签</span>
+        <span class="badge badge-dark">深色标签</span>
+    
+        <!-- 背景颜色 -->
+        <div class="bg-primary text-white p-3">主要背景颜色</div>
+        <div class="bg-secondary text-white p-3">次要背景颜色</div>
+        <div class="bg-success text-white p-3">成功背景颜色</div>
+        <div class="bg-danger text-white p-3">危险背景颜色</div>
+        <div class="bg-warning text-dark p-3">警告背景颜色</div>
+        <div class="bg-info text-white p-3">信息背景颜色</div>
+        <div class="bg-light p-3">浅色背景颜色</div>
+        <div class="bg-dark text-white p-3">深色背景颜色</div>
+      </div>
+
+      <div class="container">
+        <h2>Bootstrap Badge 大小控制示例</h2>
+    
+        <!-- 默认的 badge -->
+        <span class="badge badge-primary">Default Badge</span>
+    
+        <!-- 大尺寸的 badge -->
+        <span class="badge badge-primary badge-lg">Large Badge</span>
+    
+        <!-- 小尺寸的 badge -->
+        <span class="badge badge-primary badge-sm">Small Badge</span>
+      </div>
+</body>
+
+</html>
\ No newline at end of file

Reply via email to