新版本UI更新

This commit is contained in:
“yf”
2024-02-14 23:39:12 +08:00
commit e8744cf7e6
124 changed files with 18216 additions and 0 deletions

19
.devcontainer/Dockerfile Normal file
View File

@@ -0,0 +1,19 @@
# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.231.6/containers/javascript-node/.devcontainer/base.Dockerfile
# [Choice] Node.js version (use -bullseye variants on local arm64/Apple Silicon): 16, 14, 12, 16-bullseye, 14-bullseye, 12-bullseye, 16-buster, 14-buster, 12-buster
ARG VARIANT="16-bullseye"
FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:0-${VARIANT}
ENV TZ=Asia/Shanghai
# [Optional] Uncomment this section to install additional OS packages.
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
# && apt-get -y install --no-install-recommends <your-package-list-here>
# [Optional] Uncomment if you want to install an additional version of node using nvm
# ARG EXTRA_NODE_VERSION=10
# RUN su node -c "source /usr/local/share/nvm/nvm.sh && nvm install ${EXTRA_NODE_VERSION}"
# [Optional] Uncomment if you want to install more global node modules
RUN su node -c "yarn config set registry https://registry.npmmirror.com"
RUN su node -c "yarn config set sharp_binary_host https://npmmirror.com/mirrors/sharp"
RUN su node -c "yarn config set sharp_libvips_binary_host https://npmmirror.com/mirrors/sharp-libvips"

View File

@@ -0,0 +1,34 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
// https://github.com/microsoft/vscode-dev-containers/tree/v0.231.6/containers/javascript-node
{
"name": "Node.js",
"build": {
"dockerfile": "Dockerfile",
// Update 'VARIANT' to pick a Node version: 16, 14, 12.
// Append -bullseye or -buster to pin to an OS version.
// Use -bullseye variants on local arm64/Apple Silicon.
"args": { "VARIANT": "18-bullseye" }
},
// Set *default* container specific settings.json values on container create.
"settings": {},
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode"
],
// Use 'forwardPorts' to make a list of ports inside the container available locally.
"forwardPorts": [8000],
// Use 'postCreateCommand' to run commands after the container is created.
"postCreateCommand": "sudo chown node node_modules",
// Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
"remoteUser": "node",
"mounts": [
"source=mirrorfront-nodemodules,target=${containerWorkspaceFolder}/node_modules,type=volume"
]
}

3
.dockerignore Normal file
View File

@@ -0,0 +1,3 @@
.cache/
node_modules/
public/

10
.editorconfig Normal file
View File

@@ -0,0 +1,10 @@
root = true
[*]
end_of_line = lf
insert_final_newline = true
[*.{ts,tsx,js,jsx,json,yml}]
charset = utf-8
indent_style = space
indent_size = 2

4
.eslintignore Normal file
View File

@@ -0,0 +1,4 @@
build/
public/
.cache/
node_modules/

92
.eslintrc.js Normal file
View File

@@ -0,0 +1,92 @@
module.exports = {
env: {
browser: true,
node: true,
es2021: true,
},
extends: [
'eslint:recommended',
'plugin:react/recommended',
'plugin:@typescript-eslint/recommended',
'airbnb',
'prettier',
],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaFeatures: {
jsx: true,
},
ecmaVersion: 'latest',
sourceType: 'module',
},
plugins: ['react', '@typescript-eslint', 'prettier'],
rules: {
// needed by prettier
'prettier/prettier': 'warn',
'arrow-body-style': 'off',
'prefer-arrow-callback': 'off',
// allow jsx in typescript files
'react/jsx-filename-extension': [
2,
{
extensions: ['.js', '.jsx', '.ts', '.tsx'],
},
],
// from google/gts
'block-scoped-var': 'error',
'eqeqeq': 'error',
'no-var': 'error',
'prefer-const': 'error',
'eol-last': 'error',
'no-trailing-spaces': 'error',
'quotes': ['warn', 'single', { avoidEscape: true }],
'no-restricted-properties': [
'error',
{
object: 'describe',
property: 'only',
},
{
object: 'it',
property: 'only',
},
],
'react/function-component-definition': [
2,
{
namedComponents: 'arrow-function',
unnamedComponents: 'arrow-function',
},
],
'import/extensions': [
'error',
'never',
{
svg: 'always',
},
],
'no-unused-vars': 'off',
'@typescript-eslint/no-unused-vars': [
'warn',
{
argsIgnorePattern: '^_',
varsIgnorePattern: '^_',
caughtErrorsIgnorePattern: '^_',
},
],
'@typescript-eslint/no-explicit-any': 'off',
'react/destructuring-assignment': 'off',
'react/jsx-props-no-spreading': 'off',
'react/require-default-props': 'off',
'react/no-array-index-key': 'off',
'react/jsx-no-constructed-context-values': 'off',
'no-empty-function': 'off',
'@typescript-eslint/no-empty-function': 'off',
},
settings: {
'import/resolver': {
node: {},
typescript: {},
},
},
};

70
.github/workflows/codeql-analysis.yml vendored Normal file
View File

@@ -0,0 +1,70 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ main ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ main ]
schedule:
- cron: '41 5 * * 5'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'javascript' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://git.io/codeql-language-support
steps:
- name: Checkout repository
uses: actions/checkout@v2
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

81
.gitignore vendored Normal file
View File

@@ -0,0 +1,81 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Typescript v1 declaration files
src/typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# dotenv environment variable files
.env*
# gatsby files
.cache/
public
# Mac files
.DS_Store
# Yarn
yarn-error.log
.pnp/
.pnp.js
# Yarn Integrity file
.yarn-integrity
# JetBrains IDE config
.idea/
# config file
config.ts
# vscode config file
.vscode/
# pnpm packages
.pnpm-store/

29
.gitlab-ci.yml Normal file
View File

@@ -0,0 +1,29 @@
image: node:lts-bullseye
stages:
- build
- deploy
gatsby-build:
stage: build
variables:
CHOKIDAR_USEPOLLING: 1
cache:
paths:
- node_modules/
script:
- bash cached-restore.sh
- yarn run build
artifacts:
paths:
- public
deploy-webhook:
stage: deploy
only:
- main
script:
- curl "$WEBHOOK_DEPLOY_URL"
environment:
name: staging
url: https://mirrors.zju.edu.cn/index

4
.prettierignore Normal file
View File

@@ -0,0 +1,4 @@
.cache
package.json
package-lock.json
public

15
.prettierrc.js Normal file
View File

@@ -0,0 +1,15 @@
module.exports = {
// from google/gts
"bracketSpacing": false,
"singleQuote": true,
"trailingComma": "es5",
"arrowParens": "avoid",
// other rules
"tabWidth": 2,
"useTabs": false,
"jsxSingleQuote": false,
"semi": true,
"endOfLine": "lf",
"quoteProps": "consistent",
"bracketSpacing": true,
}

13
Dockerfile Normal file
View File

@@ -0,0 +1,13 @@
FROM node:18-bullseye
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn config set registry 'https://registry.npmmirror.com/' && \
yarn config set sharp_binary_host https://npmmirror.com/mirrors/sharp && \
yarn config set sharp_libvips_binary_host https://npmmirror.com/mirrors/sharp-libvips && \
yarn install --frozen-lockfile
COPY . .
RUN yarn run build
CMD ["yarn", "run", "serve"]

21
LICENSE Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2021 ZJUSCT
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

13
README.md Normal file
View File

@@ -0,0 +1,13 @@
![cover](https://raw.githubusercontent.com/RalXYZ/repo-pictures/main/mirror-front/cover.png)
# 荆楚理工学院开源镜像站
back-end JSON format: [MirrorsDotNet API](https://github.com/ZJUSCT/MirrorsDotNet/blob/main/Docs/Swagger.json)
## Deployment
All static files must be mapped to `/static/*`.
## Special Thanks
UI Designer: [Rynco Maekawa](https://github.com/lynzrand)

25
babel-extract.config.js Normal file
View File

@@ -0,0 +1,25 @@
const config = require('./config');
module.exports = {
presets: ['babel-preset-gatsby'],
plugins: [
[
'i18next-extract',
{
locales: config.locales,
keySeparator: null,
nsSeparator: null,
keyAsDefaultValue: [config.defaultLanguage],
useI18nextDefaultValue: [config.defaultLanguage],
outputPath: 'locales/{{locale}}/{{ns}}.json',
customTransComponents: [['gatsby-plugin-react-i18next', 'Trans']]
}
]
],
overrides: [
{
test: [`**/*.ts`, `**/*.tsx`],
plugins: [[`@babel/plugin-transform-typescript`, { isTSX: true }]]
}
]
};

16
cached-restore.sh Normal file
View File

@@ -0,0 +1,16 @@
#!/bin/bash
md5sum yarn.lock || true
md5sum node_modules/yarn.lock || true
if cmp -s "yarn.lock" "node_modules/yarn.lock"; then
echo "yarn.lock did not change, skipping install"
else
echo "yarn.lock changed, reinstalling packages"
yarn config set registry https://mirrors.zju.edu.cn/npm
yarn config set sharp_binary_host https://npmmirror.com/mirrors/sharp
yarn config set sharp_libvips_binary_host https://npmmirror.com/mirrors/sharp-libvips
yarn install --frozen-lockfile
sed -i 's/fonts.googleapis.com/fonts.loli.net/g' node_modules/gatsby-plugin-webfonts/modules/google.js
cp yarn.lock node_modules/yarn.lock
fi

6
caddy/Caddyfile Normal file
View File

@@ -0,0 +1,6 @@
localhost:50000
file_server
reverse_proxy /api/* https://mirror.zju.edu.cn {
header_up Host {upstream_hostport}
}

1
caddy/docs Normal file
View File

@@ -0,0 +1 @@
index/docs

1
caddy/en Normal file
View File

@@ -0,0 +1 @@
index/en

1
caddy/index Normal file
View File

@@ -0,0 +1 @@
../public/

1
caddy/index.html Normal file
View File

@@ -0,0 +1 @@
index/index.html

21
config.js Normal file
View File

@@ -0,0 +1,21 @@
module.exports = {
documentSources: {
mirrors: {
folder: '/:lang/:segment+',
path: '/:lang?/docs/:segment+',
template: `./src/templates/mirror-doc.tsx`,
getLanguageFromPath: true
},
news: {
folder: '/:lang/:segment+',
path: '/:lang?/news/:segment+',
template: `./src/templates/news.tsx`,
getLanguageFromPath: true
}
},
defaultLanguage: 'zh',
locales: ['zh', 'en'],
siteUrl: 'https://mirrors.zju.edu.cn',
pathPrefix: '',
assetPrefix: '/index',
};

10
docker-compose.yml Normal file
View File

@@ -0,0 +1,10 @@
version: "3"
services:
web:
image: git.zju.edu.cn:5050/zju-mirror/mirror-front
restart: always
ports:
- 6001:9000
environment:
- TZ=Asia/Shanghai

61
docs/zh/CPAN.mdx Normal file
View File

@@ -0,0 +1,61 @@
---
mirrorId: CPAN
---
[CPAN](https://www.cpan.org/) (The Comprehensive Perl Archive Network) 镜像源的配置文件为 `MyConfig.pm` (一般位于 `$HOME/.cpan/CPAN/MyConfig.pm` ),可使用包管理脚本 `cpan` 进行修改。
首先需确保 `MyConfig.pm` 配置文件存在,在命令行中执行:
```bash
# 确保 MyConfig.pm 配置文件存在,如不存在则自动生成
PERL_MM_USE_DEFAULT=1 perl -MCPAN -e 'mkmyconfig'
# 不使用默认配置,手动确认各个配置选项
perl -MCPAN -e 'mkmyconfig'
```
### 在 CPAN Shell 中手动设置镜像
在命令行中执行 `cpan` 进入 cpan shell
```bash
cpan shell -- CPAN exploration and modules installation
Enter 'h' for help.
# 列出当前的镜像设置
cpan[1]> o conf urllist
# 将本站镜像加入镜像列表首位
# 注:若已在列表中则可跳过本步直接退出,修改列表不会执行自动去重
cpan[2]> o conf urllist unshift https://mirrors.zju.edu.cn/CPAN/
# 或将本站镜像加入镜像列表末尾
# 注:本命令和上面的命令执行一个即可,修改列表不会执行自动去重
cpan[3]> o conf urllist push https://mirrors.zju.edu.cn/CPAN/
# 或清空镜像列表,仅保留本站
cpan[4]> o conf urllist https://mirrors.zju.edu.cn/CPAN/
# 保存修改后的配置至 MyConfig.pm
cpan[5]> o conf commit
# 退出 cpan shell
cpan[6]> quit
```
### 在命令行中使用脚本设置
在命令行中执行:
```bash
# 若本站不在镜像列表中则将其加入列表首位
if ! (
perl -MCPAN -e 'CPAN::HandleConfig->load();' \
-e 'CPAN::HandleConfig->prettyprint("urllist")' |
grep -qF 'https://mirrors.zju.edu.cn/CPAN/'
); then
perl -MCPAN -e 'CPAN::HandleConfig->load();' \
-e 'CPAN::HandleConfig->edit("urllist", "unshift", "https://mirrors.zju.edu.cn/CPAN/");' \
-e 'CPAN::HandleConfig->commit()'
fi
```

25
docs/zh/CRAN.mdx Normal file
View File

@@ -0,0 +1,25 @@
---
mirrorId: CRAN
---
[CRAN](https://cran.r-project.org/) (The Comprehensive R Archive Network) 镜像源配置文件之一是 `.Rprofile` (linux 下位于 `$HOME/.Rprofile` )。
在文末添加如下语句:
```bash
options("repos" = c(CRAN="https://mirrors.zju.edu.cn/CRAN/"))
```
打开 R 即可使用该 CRAN 镜像源安装 R 软件包。
### Ubuntu 下添加 CRAN 镜像安装 R
参考 [README 里的步骤](https://mirrors.zju.edu.cn/CRAN/bin/linux/ubuntu),运行
```bash
sudo apt update -qq
sudo apt install --no-install-recommends software-properties-common dirmngr
wget -qO- https://mirrors.zju.edu.cn/misc/cran/marutter_pubkey.asc | sudo tee -a /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc
sudo add-apt-repository "deb https://mirrors.zju.edu.cn/CRAN/bin/linux/ubuntu $(lsb_release -cs)-cran40/"
```

63
docs/zh/CTAN.mdx Normal file
View File

@@ -0,0 +1,63 @@
---
mirrorId: CTAN
---
CTAN (The Comprehensive TeX Archive Network) 是所有 TeX 排版系统相关材料的汇集地,收录了编译引擎、宏包及字体等的源代码与说明文档。目前,绝大多数 LaTeX 宏包会被上传至 CTAN 核心站点,随后同步到遍布全球的各个镜像。
- CTAN 主页: https://www.ctan.org/
- 浙江大学镜像: https://mirrors.zju.edu.cn/CTAN/
本文提供了 TeX Live 和 MiKTeX 两大主要发行版的镜像配置方法。
### TeX Live
TeX Live 是目前使用最为广泛的 TeX 发行版,支持 Windows、Linux 和 macOS。其中在 macOS 上发行的版本称为 MacTeX。
#### 安装
TeX Live 发行版的常见安装方法可以参考[此文档](https://mirrors.zju.edu.cn/CTAN/info/install-latex-guide-zh-cn/install-latex-guide-zh-cn.pdf)。
除每年更新的完整版 ISO 镜像以外, CTAN 镜像中也包含在线安装器。这种方法可以使安装的所有宏包均为最新版本,但受网络连接状况影响较大。操作方法为(*很可能需要管理员权限*
1. 下载 [`install-tl.zip`](https://mirrors.zju.edu.cn/CTAN/systems/texlive/tlnet/install-tl.zip) 并解压缩
2. Windows 下双击运行其中的 `install-tl.bat` 。如果有图形化界面,可以在进入安装器前的右下角按钮指定使用镜像源。
Linux 下使用如下命令:
```bash
perl install-tl --repository https://mirrors.zju.edu.cn/CTAN/systems/texlive/tlnet
```
#### 切换镜像
TeX Live 使用的 CTAN 镜像源可以从内置的包管理器 `tlmgr` 更改(*很可能需要管理员权限*)。
在命令行中执行
```bash
tlmgr option repository https://mirrors.zju.edu.cn/CTAN/systems/texlive/tlnet
```
即可永久更改镜像源。
如果只需要临时切换,可以用如下命令:
```bash
tlmgr update --all --repository https://mirrors.zju.edu.cn/CTAN/systems/texlive/tlnet
```
其中的 ```update --all``` 指令可根据需要修改。
### MiKTeX
MiKTeX 发行版的特点在于仅安装用户需要的宏包,节省了磁盘空间占用,但在部分实现细节上与 TeX Live 有所出入。该发行版支持 Windows、Linux 和 macOS。
#### 安装
MiKTeX 仅提供 Windows 和 macOS 的独立安装包,前往 TeX 排版系统下载页即可。在 Linux 下的安装请参考[官方文档](https://miktex.org/howto/install-miktex-unx)。
#### 切换镜像
MiKTeX 使用的 CTAN 镜像源可以从内置的 MiKTeX Console 图形化应用程序进行切换,也可以使用如下命令:
```bash
mpm --set-repository=https://mirrors.zju.edu.cn/CTAN/systems/win32/miktex/tm/packages/
```

14
docs/zh/almalinux.mdx Normal file
View File

@@ -0,0 +1,14 @@
---
mirrorId: almalinux
---
> 以下命令在 AlmaLinux 9.1 上经过测试,结合您使用的实际版本命令也许有所更改。
输入以下命令替换配置:
```bash
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#\s*baseurl=https://repo.almalinux.org/almalinux|baseurl=https://mirrors.zju.edu.cn/almalinux|g' \
-i.bak \
/etc/yum.repos.d/almalinux-*.repo
```

11
docs/zh/alpine.mdx Normal file
View File

@@ -0,0 +1,11 @@
---
mirrorId: alpine
---
Alpine Linux 是一个面向安全、轻量级的,基于 musl libc 与 busybox 项目的 Linux 发行版。
在终端输入以下命令以替换浙大镜像源:
```bash
sed -i 's/dl-cdn.alpinelinux.org/mirrors.zju.edu.cn/g' /etc/apk/repositories
```

51
docs/zh/anaconda.mdx Normal file
View File

@@ -0,0 +1,51 @@
---
mirrorId: anaconda
---
Anaconda 是一个用于科学计算的 Python 发行版,支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包。
Anaconda 安装包可以到 https://mirrors.zju.edu.cn/anaconda/archive/ 下载。
浙大镜像源与其同步上游 TUNA 镜像源提供的软件包一致。
> TUNA 提供了 Anaconda 仓库与第三方源( conda-forge、msys2、pytorch 等,[查看完整列表](https://mirrors.zju.edu.cn/anaconda/cloud/))的镜像。
>
> 注: 由于更新过快难以同步,我们不同步 `pytorch-nightly`, `pytorch-nightly-cpu`, `ignite-nightly` 这三个包。
各系统都可以通过修改用户目录下的 `.condarc` 文件来使用浙大镜像源。Windows 用户无法直接创建名为 `.condarc` 的文件,可先执行 `conda config --set show_channel_urls yes` 生成该文件之后再修改。
修改 `.condarc` 配置如下:
```yaml
channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.zju.edu.cn/anaconda/pkgs/main
- https://mirrors.zju.edu.cn/anaconda/pkgs/r
- https://mirrors.zju.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.zju.edu.cn/anaconda/cloud
msys2: https://mirrors.zju.edu.cn/anaconda/cloud
bioconda: https://mirrors.zju.edu.cn/anaconda/cloud
menpo: https://mirrors.zju.edu.cn/anaconda/cloud
pytorch: https://mirrors.zju.edu.cn/anaconda/cloud
pytorch-lts: https://mirrors.zju.edu.cn/anaconda/cloud
simpleitk: https://mirrors.zju.edu.cn/anaconda/cloud
```
即可添加 Anaconda Python 免费仓库。
运行 `conda clean -i` 清除索引缓存,保证用的是镜像站提供的索引。
运行 `conda create -n myenv numpy` 测试一下吧。
### Miniconda 镜像使用帮助
Miniconda 是一个 Anaconda 的轻量级替代,默认只包含了 python 和 conda ,但是可以通过 pip 和 conda 来安装所需要的包。
Miniconda 安装包可以到 https://mirrors.zju.edu.cn/anaconda/miniconda/ 下载。
### 其他第三方源
暂不支持。

13
docs/zh/anolis.mdx Normal file
View File

@@ -0,0 +1,13 @@
---
mirrorId: anolis
---
> 以下代码在 AnolisOS 8.6 上经过测试,结合您所使用的系统版本,命令可能有所不同。
输入以下命令替换配置:
```bash
sed -e 's|mirrors.openanolis.cn|mirrors.zju.edu.cn|g' \
-i.bak \
/etc/yum.repos.d/AnolisOS-*.repo
```

15
docs/zh/archlinux.mdx Normal file
View File

@@ -0,0 +1,15 @@
---
mirrorId: archlinux
---
编辑 `/etc/pacman.d/mirrorlist` 在文件的最顶端添加:
```plaintext
Server = https://mirrors.zju.edu.cn/archlinux/$repo/os/$arch
```
更新软件包缓存:
```bash
sudo pacman -Syy
```

19
docs/zh/archlinuxcn.mdx Normal file
View File

@@ -0,0 +1,19 @@
---
mirrorId: archlinuxcn
---
Arch Linux 中文社区仓库 是由 Arch Linux 中文社区驱动的非官方用户仓库。包含中文用户常用软件、工具、字体/美化包等。
完整的包信息列表(包名称/架构/维护者/状态)请 [点击这里](https://github.com/archlinuxcn/repo) 查看。
- 官方仓库地址: https://repo.archlinuxcn.org
- 镜像地址: https://mirrors.zju.edu.cn/archlinuxcn/
使用方法:在 `/etc/pacman.conf` 文件末尾添加以下两行:
```toml
[archlinuxcn]
Server = https://mirrors.zju.edu.cn/archlinuxcn/$arch
```
之后安装 `archlinuxcn-keyring` 包导入 GPG key。

32
docs/zh/bioconductor.mdx Normal file
View File

@@ -0,0 +1,32 @@
---
mirrorId: bioconductor
---
Bioconductor 为高通量基因组数据的分析和可视化提供开源工具。Bioconductor 多数软件包采用 R 统计编程语言开发。Bioconductor 每年释出两个版本,并有活跃的用户社区。
使用方法:[Bioconductor](https://www.bioconductor.org/) 镜像源配置文件之一是 `.Rprofile`linux 下位于 `~/.Rprofile`, Windows 下位于 `~\library\base\R\Rprofile`)。
在文末添加如下语句或在 R/RStudio 终端下键入:
```R
options(BioC_mirror="https://mirrors.zju.edu.cn/bioconductor")
```
即可使用该 Bioconductor 镜像源安装 Bioconductor 软件包。命令如下:
```R
if (!requireNamespace("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("$package_name")
```
### 离线使用
如果您的网络环境处于校内但无法访问公网,在完成下列步骤后,即可正常使用 Bioconductor 镜像。
1. 确保 BiocManager 的版本不低于 `1.30.12`。
2. 使用一台可以访问公网的设备,访问 [https://bioconductor.org/config.yaml](https://bioconductor.org/config.yaml) 下载 `config.yaml`,并将该文件拷贝到 BiocManager 所在的校内设备上。然后,在 `~/.Rprofile` 添加如下配置:
```R
options(
BIOCONDUCTOR_CONFIG_FILE = "file:///path/to/config.yaml" # config.yaml 所在的路径
)
```

43
docs/zh/centos-vault.mdx Normal file
View File

@@ -0,0 +1,43 @@
---
mirrorId: centos-vault
---
该文件夹提供较早版本的 CentOS例如 CentOS 6同时提供当前 CentOS 大版本的历史小版本的归档;
还提供 CentOS 各个版本的源代码和调试符号。
建议先备份 `/etc/yum.repos.d/` 内的文件。
需要确定您所需要的小版本,如无特殊需要则使用该大版本的最后一个小版本,比如 6.105.11,我们将其标记为 `$minorver`,需要您在之后的命令中替换。
然后编辑 `/etc/yum.repos.d/` 中的相应文件,在 `mirrorlist=` 开头行前面加 `#` 注释掉;并将 `baseurl=` 开头行取消注释(如果被注释的话)。
- 对于 CentOS 8 之前的版本,请把该行内的域名及路径(例如`mirror.centos.org/centos/$releasever`)替换为 `{{mirror}}/$minorver`。
- 对于 CentOS 8请注意域名及路径发生了更换此时需要替换的字段为 `http://mirror.centos.org/$contentdir/$releasever` 。
以上步骤可以被下方的命令完成
```shell
# CentOS 8 之前
minorver=6.10
sed -e "s|^mirrorlist=|#mirrorlist=|g" \
-e "s|^#baseurl=http://mirror.centos.org/centos/\$releasever|baseurl=https://mirrors.zju.edu.cn/$minorver|g" \
-i.bak \
/etc/yum.repos.d/CentOS-*.repo
# CentOS 8 之后
minorver=8.5.2111
sed -e "s|^mirrorlist=|#mirrorlist=|g" \
-e "s|^#baseurl=http://mirror.centos.org/\$contentdir/\$releasever|baseurl=https://mirrors.zju.edu.cn/$minorver|g" \
-i.bak \
/etc/yum.repos.d/CentOS-*.repo
```
注意其中的`*`通配符,如果只需要替换一些文件中的源,请自行增删。
注意,如果需要启用其中一些 repo需要将其中的 `enabled=0` 改为 `enabled=1`。
最后,更新软件包缓存
```shell
yum makecache
```

35
docs/zh/centos.mdx Normal file
View File

@@ -0,0 +1,35 @@
---
mirrorId: centos
---
在使用 CentOS 镜像前,请检查您所应该使用的对应软件源:
| CentOS 版本 | 架构 | 对应软件源 |
|---|---|---|
| 6 及之前 | - | centos-vault |
| 7 | x86_64 | centos |
| 7 | 其他 | centos-altarch |
| 8 ~ 8.1 | x86_64 | centos |
| 8 ~ 8.1 | 其他 | centos-altarch |
| 8.1 ~ 8.5 | - | centos-vault |
| 8 Stream | - | centos |
| 9 Stream | - | centos-stream |
使用以下命令切换源并备份原始配置:
```bash
sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://mirror.centos.org|baseurl=https://mirrors.zju.edu.cn|g' \
-i.bak \
/etc/yum.repos.d/CentOS-*.repo
```
注意其中的*通配符,如果只需要替换一些文件中的源,请自行增删。
如果需要启用其中一些 repo需要将其中的 `enabled=0` 改为 `enabled=1`。
然后,更新软件包缓存:
```bash
sudo yum makecache
```

View File

@@ -0,0 +1,16 @@
---
mirrorId: crates.io-index.git
isGit: true
---
编辑 `~/.cargo/config` 文件,添加以下内容:
```toml
[source.crates-io]
replace-with = 'zju'
[source.zju]
registry = "https://mirrors.zju.edu.cn/git/crates.io-index.git"
```
该镜像可加快 cargo 读取软件包索引的速度。

15
docs/zh/cygwin.mdx Normal file
View File

@@ -0,0 +1,15 @@
---
mirrorId: cygwin
---
从 https://cygwin.com 上下载 [setup-x86.exe](https://cygwin.com/setup-x86.exe) 或 [setup-x86_64.exe](https://cygwin.com/setup-x86_64.exe) 。
选择 `Install from Internet` , 在 `User URL` 处输入以下地址:
```plaintext
https://mirrors.zju.edu.cn/cygwin/
```
点击 `Add` 按钮, 然后选中 `https://mirrors.zju.edu.cn` , 点击“下一步”进行安装。
注意,该列表为可多选列表,把上面不需要的镜像点掉。

View File

@@ -0,0 +1,7 @@
---
mirrorId: debian-security
---
`debian-security` 是 Debian 的安全更新软件源。
请参阅 Debian 镜像源的使用帮助。

72
docs/zh/debian.mdx Normal file
View File

@@ -0,0 +1,72 @@
---
mirrorId: debian
---
import ConfigGenerator from '../../src/components/config-generator'
export const debianVersions = [
"bookworm", // 12
"bullseye", // 11
"buster", // 10
"stretch", // 9
"jessie", // 8
"testing", // next stable in dev
"sid", // unstable
]
export const GenDebianConfig = (version) => {
if (version === 'sid') { // unstable
return `# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.zju.edu.cn/debian/ sid main contrib non-free non-free-firmware
# deb-src https://mirrors.zju.edu.cn/debian/ sid main contrib non-free non-free-firmware`
} else if (version === 'bullseye') { // 11
return `# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.zju.edu.cn/debian/ ${version} main contrib non-free
# deb-src https://mirrors.zju.edu.cn/debian/ ${version} main contrib non-free
deb https://mirrors.zju.edu.cn/debian/ ${version}-updates main contrib non-free
# deb-src https://mirrors.zju.edu.cn/debian/ ${version}-updates main contrib non-free\n
deb https://mirrors.zju.edu.cn/debian/ ${version}-backports main contrib non-free
# deb-src https://mirrors.zju.edu.cn/debian/ ${version}-backports main contrib non-free\n
deb https://mirrors.zju.edu.cn/debian-security ${version}-security main contrib non-free
# deb-src https://mirrors.zju.edu.cn/debian-security ${version}-security main contrib non-free`
} else if (version === 'buster' || version === 'stretch') { // 9, 10
return `# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.zju.edu.cn/debian/ ${version} main contrib non-free
# deb-src https://mirrors.zju.edu.cn/debian/ ${version} main contrib non-free
deb https://mirrors.zju.edu.cn/debian/ ${version}-updates main contrib non-free
# deb-src https://mirrors.zju.edu.cn/debian/ ${version}-updates main contrib non-free
deb https://mirrors.zju.edu.cn/debian/ ${version}-backports main contrib non-free
# deb-src https://mirrors.zju.edu.cn/debian/ ${version}-backports main contrib non-free
deb https://mirrors.zju.edu.cn/debian-security ${version}/updates main contrib non-free
# deb-src https://mirrors.zju.edu.cn/debian-security ${version}/updates main contrib non-free`
} else if (version === 'jessie') { // 8
return `# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.zju.edu.cn/debian/ jessie main contrib non-free
# deb-src https://mirrors.zju.edu.cn/debian/ jessie main contrib non-free
deb https://mirrors.zju.edu.cn/debian/ jessie-updates main contrib non-free
# deb-src https://mirrors.zju.edu.cn/debian/ jessie-updates main contrib non-free
deb https://mirrors.zju.edu.cn/debian-security jessie/updates main contrib non-free
# deb-src https://mirrors.zju.edu.cn/debian-security jessie/updates main contrib non-free`
}
return `# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.zju.edu.cn/debian/ ${version} main contrib non-free non-free-firmware
# deb-src https://mirrors.zju.edu.cn/debian/ ${version} main contrib non-free non-free-firmware
deb https://mirrors.zju.edu.cn/debian/ ${version}-updates main contrib non-free non-free-firmware
# deb-src https://mirrors.zju.edu.cn/debian/ ${version}-updates main contrib non-free non-free-firmware
deb https://mirrors.zju.edu.cn/debian/ ${version}-backports main contrib non-free non-free-firmware
# deb-src https://mirrors.zju.edu.cn/debian/ ${version}-backports main contrib non-free non-free-firmware
deb https://mirrors.zju.edu.cn/debian-security ${version}-security main contrib non-free non-free-firmware
# deb-src https://mirrors.zju.edu.cn/debian-security ${version}-security main contrib non-free non-free-firmware`
}
Debian 的软件源配置文件是 `/etc/apt/sources.list`。将系统自带的该文件做个备份,将该文件替换为下面内容,即可使用我们的软件源镜像。
如果遇到无法拉取 https 源的情况,请先使用 http 源并安装:
```bash
sudo apt install apt-transport-https ca-certificates
```
再使用我们的软件源镜像。
<ConfigGenerator promptString="请选择您的 Debian 版本:" versionList={debianVersions} configGen={GenDebianConfig} language="bash" />

5
docs/zh/deepin.mdx Normal file
View File

@@ -0,0 +1,5 @@
---
mirrorId: deepin
---
编辑 `/etc/apt/sources.list` ,将其中的 URL 替换为 `http://mirrors.zju.edu.cn/deepin` 。

82
docs/zh/docker-ce.mdx Normal file
View File

@@ -0,0 +1,82 @@
---
mirrorId: docker-ce
---
import ConfigGenerator from '../../src/components/config-generator'
export const osList = ['Debian', 'Ubuntu'];
export const genCommand = (os) => {
const o = os.toLowerCase();
return `#信任 Docker 的 GPG 公钥:\n
curl -fsSL https://download.docker.com/linux/${o}/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg\n
#添加软件仓库:\n
echo \\\n
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.zju.edu.cn/docker-ce/linux/${o} \\\n
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null\n
#最后安装\n
sudo apt-get update
sudo apt-get install docker-ce
`;
}
export const osList2 = ['CentOS/RHEL', 'Fedora'];
export const genCommand2 = (os) => {
const o = os.toLowerCase().charAt(0) == 'c' ? 'centos' : 'fedora';
return `yum-config-manager --add-repo https://download.docker.com/linux/${o}/docker-ce.repo`;
}
注意: 本镜像只提供 docker 程序安装包,非 dockerhub
### Linux 平台使用说明
#### Debian/Ubuntu 用户
以下内容根据 [官方文档](https://docs.docker.com/engine/install/debian/) 修改而来。
如果你过去安装过 docker ,先删掉:
```bash
sudo apt-get remove docker docker-engine docker.io containerd runc
```
首先安装依赖:
```bash
sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common
```
根据你的发行版,下面的内容有所不同。你使用的发行版:
<ConfigGenerator promptString="选择你使用的发行版:" versionList={osList} defaultVersion={'Debian'} configGen={genCommand} />
#### Fedora/CentOS/RHEL
以下内容根据 [官方文档](https://docs.docker.com/engine/install/centos/) 修改而来。
如果你之前安装过 docker ,先删掉:
```bash
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
```
安装一些依赖:
```bash
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
```
根据你的发行版下载repo文件:
<ConfigGenerator promptString="选择你使用的发行版:" versionList={osList2} defaultVersion={'CentOS/RHEL'} configGen={genCommand2} />
把软件仓库地址替换为浙大源:
```bash
sudo sed -i 's+download.docker.com+mirrors.zju.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
```
最后安装:
```bash
sudo yum makecache fast
sudo yum install docker-ce
```

91
docs/zh/elpa.mdx Normal file
View File

@@ -0,0 +1,91 @@
---
mirrorId: elpa
---
ELPA 是 Emacs 内建包管理器 `package.el` 的软件源,镜像站支持了如下 ELPA
- gnu
- gnu-devel
- melpa
- nongnu
- nongnu-devel
- org
- stable-melpa
根据你的需求,设置 package-archives比如用 GNU ELPA 和 MELPA
```lisp
(setq package-archives '(("gnu" . "https://mirrors.zju.edu.cn/elpa/gnu/")
("nongnu" . "https://mirrors.zju.edu.cn/elpa/nongnu/")
("melpa" . "https://mirrors.zju.edu.cn/elpa/melpa/")))
(package-initialize) ;; You might already have this line
```
### Spacemacs 用户
#### master 分支
添加下面的代码到`.spacemacs`的`dotspacemacs/user-init()`
```lisp
(setq configuration-layer--elpa-archives
'(("melpa-cn" . "https://mirrors.zju.edu.cn/elpa/melpa/")
("org-cn" . "https://mirrors.zju.edu.cn/elpa/org/")
("gnu-cn" . "https://mirrors.zju.edu.cn/elpa/gnu/")))
```
#### develop 分支
使用 `configuration-layer-elpa-archives` 代替原来的 `configuration-layer--elpa-archives` `--` 换成 `-`
```lisp
(setq configuration-layer-elpa-archives
'(("melpa-cn" . "https://mirrors.zju.edu.cn/elpa/melpa/")
("org-cn" . "https://mirrors.zju.edu.cn/elpa/org/")
("gnu-cn" . "https://mirrors.zju.edu.cn/elpa/gnu/")))
```
### Cask 用户
[Cask](https://github.com/cask/cask) 是一个 Emacs Lisp 的项目管理工具。这里还是以 GNU ELPA 和 MELPA 为例,在添加下面的代码到 Cask
```lisp
(source "gnu" "https://mirrors.zju.edu.cn/elpa/gnu/")
(source "melpa" "https://mirrors.zju.edu.cn/elpa/melpa/")
```
### 关于 ELPA 的选择
(来自[@xuchunyang](https://github.com/xuchunyang))
假如不清楚需要用哪些 ELPA 的话
- `gnu` 一般是必备的,其它的 elpa 中的包会依赖 `gnu` 中的包
- `nongnu` 建议启用,类似于 `melpa` 但是 Emacs 官方维护的
- `melpa` 滚动升级,收录了的包的数量最大
- `stable-melpa` 依据源码的 TagGit升级数量比 `melpa` 少,因为很多包作者根本不打 Tag
- `org` 仅仅为了 `org-plus-contrib` 这一个包org 重度用户使用
- `gnu-devel` 收录 `gnu` 中的包的开发中版本,一般不必启用(与 `gnu` 的关系类似于 `melpa` 与 `stable-melpa` 的关系)
- `nongnu-devel` 收录 `nongnu` 中的包的开发中版本,一般不必启用
### 上游
本文档参考了 http://elpa.emacs-china.org/ 提供的帮助。
### URL Bug
各个仓库的 URL 末尾一定要加`/`,否则会无法拉取,提示`Failed to download melpa archive`。
事实上,末尾没有`/`的话emacs 会去尝试取以下链接:
```plaintext
https://mirrors.zju.edu.cn/elpa/melpaarchive-contents
```
而正常的链接应该是
```plaintext
https://mirrors.zju.edu.cn/elpa/melpa/archive-contents
```
这个是 emacs 自己的 bug。在 https://github.com/melpa/melpa/issues/2139 中有描述。

50
docs/zh/elrepo.mdx Normal file
View File

@@ -0,0 +1,50 @@
---
mirrorId: elrepo
---
import ConfigGenerator from '../../src/components/config-generator'
export const osVersion = ['7', '8', '6'];
export const versionName = [
'RHEL-7, SL-7, CentOS-7',
'RHEL-8, SL-8, CentOS-8',
'RHEL-6, SL-6, CentOS-6'
];
export const configGen = (version) => {
return `
yum install https://www.elrepo.org/elrepo-release-${version}.el${version}.elrepo.noarch.rpm`;
}
首先按照[官网的安装说明](https://elrepo.org/tiki/tiki-index.php),配置 ELRepo
```bash
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
```
接着,按照你的系统版本,运行:
<ConfigGenerator
promptString=""
versionList={osVersion}
friendlyNameList={versionName}
configGen={configGen} />
接下来是换源,建议先备份 `/etc/yum.repos.d/elrepo.repo`
```shell
cp /etc/yum.repos.d/elrepo.repo /etc/yum.repos.d/elrepo.repo.bak
```
然后编辑 /etc/yum.repos.d/elrepo.repo 文件,在 `mirrorlist=` 开头的行前面加 `#` 注释掉;并将 `http://elrepo.org/linux` 替换为
```plaintext
https://mirrors.zju.edu.cn/elrepo
```
最后,更新软件包缓存
```shell
yum makecache
```

67
docs/zh/epel.mdx Normal file
View File

@@ -0,0 +1,67 @@
---
mirrorId: epel
---
EPEL(Extra Packages for Enterprise Linux) 是由 Fedora Special Interest Group 维护的 Enterprise LinuxRHEL、CentOS中经
常用到的包。
下面以 CentOS 7 为例讲解如何使用本镜像站的 epel 镜像。CentOS 8 同样可用该方法。
首先从 CentOS Extras 这个源里安装 epel-release
```shell
yum install epel-release
```
修改`/etc/yum.repos.d/epel.repo`,将`mirrorlist`和`metalink`开头的行注释掉。
接下来,取消注释这个文件里`baseurl`开头的行,并将其中的`http://download.fedoraproject.org/pub/epel`替换成`https://mirrors.zju.edu.cn/epel`。
可以用如下命令自动替换:(来自 https://github.com/tuna/issues/issues/687
```shell
sed -e 's!^metalink=!#metalink=!g' \
-e 's!^#baseurl=!baseurl=!g' \
-e 's!http://download\.fedoraproject\.org/pub/epel!https://mirrors.zju.edu.cn/epel!g' \
-e 's!http://download\.example/pub/epel!https://mirrors.zju.edu.cn/epel!g' \
-i /etc/yum.repos.d/epel*.repo
```
修改结果如下:(仅供参考,不同版本可能不同)
```ini
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=https://mirrors.zju.edu.cn/epel/7/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
baseurl=https://mirrors.zju.edu.cn/epel/7/$basearch/debug
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
baseurl=https://mirrors.zju.edu.cn/epel/7/SRPMS
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
```
运行 `yum update` 测试一下吧。

70
docs/zh/fedora.mdx Normal file
View File

@@ -0,0 +1,70 @@
---
mirrorId: fedora
---
Fedora 默认使用 [Metalink](https://zh.fedoracommunity.org/2018/04/05/fedora-secures-package-delivery.html) 给出推荐的镜像列表,保证用户使用的镜像仓库足够新,并且能够尽快拿到安全更新,从而提供更好的安全性。所以通常情况下使用默认配置即可,无需更改配置文件。
由于 Metalink 需要从国外的 Fedora 项目服务器上获取元信息,所以对于校园内网、无国外访问等特殊情况, metalink 并不适用,此时可以如下修改配置文件。
Fedora 的软件源配置文件可以有多个,其中: 系统默认的 `fedora` 仓库配置文件为 `/etc/yum.repos.d/fedora.repo` ,系统默认的 `updates` 仓库配置文件为 `/etc/yum.repos.d/fedora-updates.repo` 。将上述两个文件先做个备份,根据 Fedora 系统版本分别替换为下面内容,之后通过 `sudo dnf makecache` 命令更新本地缓存,即可使用 TUNA 的软件源镜像。
### Fedora 29 或更旧版本
Fedora 29 及更旧版本已不再受官方支持, Fedora 官方已将 Fedora 29 及更旧版本的软件仓库从主镜像中移除,并转移至了 archive 镜像中。故Fedora 29 及更旧版本无法使用 ZJU 的镜像。请使用默认配置文件,以使 `yum` / `dnf` 自动获取可用的镜像源。
### Fedora 30 或更新版本
`fedora` 仓库 (/etc/yum.repos.d/fedora.repo)
```ini
[fedora]
name=Fedora $releasever - $basearch
failovermethod=priority
baseurl=https://mirrors.zju.edu.cn/fedora/releases/$releasever/Everything/$basearch/os/
metadata_expire=28d
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
```
`updates` 仓库 (/etc/yum.repos.d/fedora-updates.repo)
```ini
[updates]
name=Fedora $releasever - $basearch - Updates
failovermethod=priority
baseurl=https://mirrors.zju.edu.cn/fedora/updates/$releasever/Everything/$basearch/
enabled=1
gpgcheck=1
metadata_expire=6h
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
```
`fedora-modular` 仓库 (/etc/yum.repos.d/fedora-modular.repo)
```ini
[fedora-modular]
name=Fedora Modular $releasever - $basearch
failovermethod=priority
baseurl=https://mirrors.zju.edu.cn/fedora/releases/$releasever/Modular/$basearch/os/
enabled=1
metadata_expire=7d
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
```
`updates-modular` 仓库 (/etc/yum.repos.d/fedora-updates-modular.repo)
```ini
[updates-modular]
name=Fedora Modular $releasever - $basearch - Updates
failovermethod=priority
baseurl=https://mirrors.zju.edu.cn/fedora/updates/$releasever/Modular/$basearch/
enabled=1
gpgcheck=1
metadata_expire=6h
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
```

View File

@@ -0,0 +1,34 @@
---
mirrorId: gentoo-portage.git
isGit: true
---
第一次使用 `git` 同步方式的用户需要进行如下操作:
- 修改 `/etc/portage/repos.conf/gentoo.conf`
- 将 `sync-type` 改为 `git`
- 将 `sync-uri` 改为
```text
https://mirrors.zju.edu.cn/git/gentoo-portage.git
```
- 删除 `/var/db/repos/gentoo`
- 执行 `emerge --sync`
已经配置 `git` 同步的用户只需:
- 修改 `/etc/portage/repos.conf/gentoo.conf`
- 将 `sync-uri` 改为
```text
https://mirrors.zju.edu.cn/git/gentoo-portage.git
```
- 于 `/var/db/repos/gentoo` 下,执行
```bash
git remote set-url origin https://mirrors.zju.edu.cn/git/gentoo-portage.git
```
- 执行 `emerge --sync`

View File

@@ -0,0 +1,29 @@
---
mirrorId: gentoo-portage
---
### Portage 配置
#### rsync 方式
修改 `/etc/portage/repos.conf/gentoo.conf` ,将
```conf
sync-uri = rsync://rsync.gentoo.org/gentoo-portage
```
修改为
```conf
sync-uri = rsync://mirror.zju.edu.cn/gentoo-portage
```
#### git 方式
参考 [Gentoo Portage Git 帮助](/docs/gentoo-portage.git/)。
### Distfiles 配置
参考 [Gentoo 帮助](/docs/gentoo/)。
配置好 Portage 与 Distfiles 后,执行 `emerge --sync` 进行更新。

31
docs/zh/gentoo.mdx Normal file
View File

@@ -0,0 +1,31 @@
---
mirrorId: gentoo
---
本仓库是 Gentoo 的 Stage 3 镜像。
### Distfiles 配置
在 `/etc/portage/make.conf` 中加入:
```conf
GENTOO_MIRRORS="https://mirrors.zju.edu.cn/gentoo"
```
关于 Portage 配置可以参考 [Gentoo Portage 镜像](/docs/gentoo-portage/)。
配置好 Portage 与 Distfiles 后,执行 `emerge --sync` 进行更新。
### Gentoo Prefix Bootstrap 镜像配置
在运行 Bootstrap 脚本之前,可通过设置以下环境变量选择 Bootstrap 过程中使用的镜像。
```bash
export GENTOO_MIRRORS="https://mirrors.zju.edu.cn/gentoo"
export SNAPSHOT_URL="https://mirrors.zju.edu.cn/gentoo/snapshots"
# export GNU_URL="http://mirrors.zju.edu.cn/gnu"
```
`GNU_URL` 的具体设置可以参考 [GNU 帮助](/docs/gnu/)。
Bootstrap 成功后,若对 Gentoo Portage 和 Distfiles 换源,可参照以上几节,只需将 `/etc` 换成 `$EPREFIX/etc`

10
docs/zh/glibc.git.mdx Normal file
View File

@@ -0,0 +1,10 @@
---
mirrorId: glibc.git
isGit: true
---
此仓库提供 glibc.git 的镜像:
```bash
git clone https://mirrors.zju.edu.cn/git/glibc.git
```

15
docs/zh/gnu.mdx Normal file
View File

@@ -0,0 +1,15 @@
---
mirrorId: gnu
---
### Gentoo
本节供 [Gentoo 帮助](/docs/gentoo/) 使用
```bash
export GNU_URL="https://mirrors.zju.edu.cn/gnu"
```
### 其他使用
直接进入文件浏览界面,选取需要的文件进行下载

176
docs/zh/homebrew.git.mdx Normal file
View File

@@ -0,0 +1,176 @@
---
mirrorId: homebrew
isGit: true
---
> 该镜像仍在施工中,可能无法正常工作
**注:该镜像是 Homebrew / Linuxbrew 源程序以及 formula / cask 索引的镜像(即 `brew update` 时所更新内容)。镜像站同时提供相应的二进制预编译包的镜像([Homebrew bottles](https://mirrors.zju.edu.cn/homebrew-bottles) **
镜像站提供了 https://github.com/Homebrew 组织下的以下 `repo``brew`, `homebrew-core`, `homebrew-cask`, `homebrew-cask-fonts`, `homebrew-cask-drivers`, `homebrew-cask-versions`, `homebrew-command-not-found`, `install`。
### 日常使用(只使用 Homebrew bottles 镜像)
```bash
export HOMEBREW_API_DOMAIN="https://mirrors.zju.edu.cn/homebrew-bottles/api"
export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.zju.edu.cn/homebrew-bottles"
export HOMEBREW_PIP_INDEX_URL="https://mirrors.zju.edu.cn/pypi/web/simple/"
```
### 首次安装 Homebrew / Linuxbrew
首先,需要确保系统中安装了 bash、git 和 curl对于 macOS 用户需额外要求安装 Command Line Tools (CLT) for Xcode。
- 对于 macOS 用户,系统自带 bash、git 和 curl在命令行输入 `xcode-select --install` 安装 CLT for Xcode 即可。
- 对于 Linux 用户,系统自带 bash仅需额外安装 git 和 curl。
接着,在终端输入以下几行命令设置环境变量:
```bash
export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.zju.edu.cn/git/homebrew/brew.git"
export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.zju.edu.cn/git/homebrew/homebrew-core.git"
export HOMEBREW_INSTALL_FROM_API=1
# export HOMEBREW_API_DOMAIN
# export HOMEBREW_BOTTLE_DOMAIN
# export HOMEBREW_PIP_INDEX_URL
```
前往 [Homebrew bottles 镜像使用帮助](/docs/homebrew-bottles/)中「临时替换」一节设置好 `HOMEBREW_API_DOMAIN` 与 `HOMEBREW_BOTTLE_DOMAIN`。
前往 [PyPI 镜像使用帮助](/docs/pypi/)中「Homebrew」一节设置好 `HOMEBREW_PIP_INDEX_URL`。
_注自 `brew` 4.0 起,`HOMEBREW_INSTALL_FROM_API` 会成为默认行为,无需设置;大部分用户无需再克隆 homebrew/core 仓库,故无需设置 `HOMEBREW_CORE_GIT_REMOTE` 环境变量。但若需要运行 `brew` 的开发命令或者 `brew` 安装在非官方支持的默认 prefix 位置,则仍需设置 `HOMEBREW_CORE_GIT_REMOTE` 环境变量;如果不想通过 API 安装,可以设置 `HOMEBREW_NO_INSTALL_FROM_API=1`。_
最后,在终端运行以下命令以安装 Homebrew / Linuxbrew
```bash
# 从镜像下载安装脚本并安装 Homebrew / Linuxbrew
git clone --depth=1 https://mirrors.zju.edu.cn/git/homebrew/install.git brew-install
/bin/bash brew-install/install.sh
rm -rf brew-install
# 也可从 GitHub 获取官方安装脚本安装 Homebrew / Linuxbrew
/bin/bash -c "$(curl -fsSL https://github.com/Homebrew/install/raw/master/install.sh)"
```
这样在首次安装的时候也可以使用镜像。更多信息请参考 [Homebrew 官方安装文档](https://docs.brew.sh/Installation)。
_* 安装成功后需将 brew 程序的相关路径加入到环境变量中_
- _以下针对基于 Apple Silicon CPU 设备上的 macOS 系统(命令行运行 `uname -m` 应输出 `arm64`)上的 Homebrew_
```bash
test -r ~/.bash_profile && echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.bash_profile
test -r ~/.zprofile && echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
```
_对基于 Intel CPU 设备上的 macOS 系统(命令行运行 `uname -m` 应输出 `x86_64`的用户可跳过本步。_
- _以下针对 Linux 系统上的 Linuxbrew_
```bash
test -d ~/.linuxbrew && eval "$(~/.linuxbrew/bin/brew shellenv)"
test -d /home/linuxbrew/.linuxbrew && eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
test -r ~/.bash_profile && echo "eval \"\$($(brew --prefix)/bin/brew shellenv)\"" >> ~/.bash_profile
test -r ~/.profile && echo "eval \"\$($(brew --prefix)/bin/brew shellenv)\"" >> ~/.profile
test -r ~/.zprofile && echo "eval \"\$($(brew --prefix)/bin/brew shellenv)\"" >> ~/.zprofile
```
_参考了 [https://docs.brew.sh/Homebrew-on-Linux](https://docs.brew.sh/Homebrew-on-Linux)。_
### 替换现有仓库上游
替换 brew 程序本身的源Homebrew / Linuxbrew 相同:
```bash
# export HOMEBREW_API_DOMAIN=
export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.zju.edu.cn/git/homebrew/brew.git"
brew update
```
前往 [Homebrew bottles 镜像使用帮助](/docs/homebrew-bottles/)中「临时替换」一节设置好 `HOMEBREW_API_DOMAIN`
以下针对 macOS 系统上的 Homebrew
```bash
# 手动设置
export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.zju.edu.cn/git/homebrew/homebrew-core.git"
# 注:自 brew 4.0 起,大部分 Homebrew 用户无需设置 homebrew/core 和 homebrew/cask 镜像,只需设置 HOMEBREW_API_DOMAIN 即可。
# 如果需要使用 Homebrew 的开发命令 (如 `brew cat <formula>`),则仍然需要设置 homebrew/core 和 homebrew/cask 镜像。
# 请按需执行如下两行命令:
brew tap --custom-remote --force-auto-update homebrew/core https://mirrors.zju.edu.cn/git/homebrew/homebrew-core.git
brew tap --custom-remote --force-auto-update homebrew/cask https://mirrors.zju.edu.cn/git/homebrew/homebrew-cask.git
# 除 homebrew/core 和 homebrew/cask 仓库外的 tap 仓库仍然需要设置镜像
brew tap --custom-remote --force-auto-update homebrew/cask-fonts https://mirrors.zju.edu.cn/git/homebrew/homebrew-cask-fonts.git
brew tap --custom-remote --force-auto-update homebrew/cask-drivers https://mirrors.zju.edu.cn/git/homebrew/homebrew-cask-drivers.git
brew tap --custom-remote --force-auto-update homebrew/cask-versions https://mirrors.zju.edu.cn/git/homebrew/homebrew-cask-versions.git
brew tap --custom-remote --force-auto-update homebrew/command-not-found https://mirrors.zju.edu.cn/git/homebrew/homebrew-command-not-found.git
brew update
# 或使用下面的几行命令自动设置
export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.zju.edu.cn/git/homebrew/homebrew-core.git"
for tap in core cask{,-fonts,-drivers,-versions} command-not-found; do
brew tap --custom-remote --force-auto-update "homebrew/${tap}" "https://mirrors.zju.edu.cn/git/homebrew/homebrew-${tap}.git"
done
brew update
```
以下针对 Linux 系统上的 Linuxbrew
```bash
export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.zju.edu.cn/git/homebrew/homebrew-core.git"
# 注:自 brew 4.0 起,使用默认 prefix (即 "/home/linuxbrew/.linuxbrew") 的大部分 Homebrew 用户无需设置 homebrew/core 镜像,只需设置 HOMEBREW_API_DOMAIN 即可。
# 如果不是默认 prefix 或者需要使用 Homebrew 的开发命令 (如 `brew cat <formula>`),则仍然需要设置 homebrew/core 镜像。
# 请按需执行如下命令:
brew tap --custom-remote --force-auto-update homebrew/core https://mirrors.zju.edu.cn/git/homebrew/homebrew-core.git
# 除 homebrew/core 仓库外的 tap 仓库仍然需要设置镜像
brew tap --custom-remote --force-auto-update homebrew/command-not-found https://mirrors.zju.edu.cn/git/homebrew/homebrew-command-not-found.git
brew update
```
**注:如果用户设置了环境变量 `HOMEBREW_BREW_GIT_REMOTE` 和 `HOMEBREW_CORE_GIT_REMOTE`,则每次执行 `brew update` 时,`brew` 程序本身和 Core Tap (`homebrew-core`) 的远程将被自动设置。推荐用户将这两个环境变量设置加入 shell 的 profile 设置中。**
```bash
test -r ~/.bash_profile && echo 'export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.zju.edu.cn/git/homebrew/brew.git"' >> ~/.bash_profile # bash
test -r ~/.bash_profile && echo 'export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.zju.edu.cn/git/homebrew/homebrew-core.git"' >> ~/.bash_profile
test -r ~/.profile && echo 'export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.zju.edu.cn/git/homebrew/brew.git"' >> ~/.profile
test -r ~/.profile && echo 'export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.zju.edu.cn/git/homebrew/homebrew-core.git"' >> ~/.profile
test -r ~/.zprofile && echo 'export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.zju.edu.cn/git/homebrew/brew.git"' >> ~/.zprofile # zsh
test -r ~/.zprofile && echo 'export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.zju.edu.cn/git/homebrew/homebrew-core.git"' >> ~/.zprofile
```
对于 `HOMEBREW_API_DOMAIN` 与其余 bottles 相关环境变量的持久化,可以参考 [Homebrew Bottles 帮助](/docs/homebrew-bottles/)。
_镜像迁移说明Linuxbrew 核心仓库(`linuxbrew-core`)自 2021 年 10 月 25 日(`brew` 版本 3.3.0 起被弃用Linuxbrew 用户应迁移至 `homebrew-core`。Linuxbrew 用户请依新版镜像说明重新设置镜像。注意迁移前请先运行 `brew update` 将 `brew` 更新至 3.3.0 或以上版本。迁移过程中若出现任何问题,可使用如下命令重新安装 `homebrew-core`_
```bash
export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.zju.edu.cn/git/homebrew/homebrew-core.git"
rm -rf "$(brew --repo homebrew/core)"
brew tap --custom-remote --force-auto-update homebrew/core https://mirrors.zju.edu.cn/git/homebrew/homebrew-core.git
```
### 复原仓库上游
_(感谢 Snowonion Lee 提供说明)_
```bash
# brew 程序本身Homebrew / Linuxbrew 相同
unset HOMEBREW_API_DOMAIN
unset HOMEBREW_BREW_GIT_REMOTE
git -C "$(brew --repo)" remote set-url origin https://github.com/Homebrew/brew
# 以下针对 macOS 系统上的 Homebrew
unset HOMEBREW_CORE_GIT_REMOTE
BREW_TAPS="$(BREW_TAPS="$(brew tap 2>/dev/null)"; echo -n "${BREW_TAPS//$'\n'/:}")"
for tap in core cask{,-fonts,-drivers,-versions} command-not-found; do
if [[ ":${BREW_TAPS}:" == *":homebrew/${tap}:"* ]]; then # 只复原已安装的 Tap
brew tap --custom-remote "homebrew/${tap}" "https://github.com/Homebrew/homebrew-${tap}"
fi
done
# 以下针对 Linux 系统上的 Linuxbrew
unset HOMEBREW_API_DOMAIN
unset HOMEBREW_CORE_GIT_REMOTE
brew tap --custom-remote homebrew/core https://github.com/Homebrew/homebrew-core
brew tap --custom-remote homebrew/command-not-found https://github.com/Homebrew/homebrew-command-not-found
# 重新拉取远程
brew update
```
**注:重置回默认远程后,用户应该删除 shell 的 profile 设置中的环境变量 `HOMEBREW_BREW_GIT_REMOTE` 和 `HOMEBREW_CORE_GIT_REMOTE` 以免运行 `brew update` 时远程再次被更换。**

24
docs/zh/ius.mdx Normal file
View File

@@ -0,0 +1,24 @@
---
mirrorId: ius
---
### 设置
如果要在您的系统上启用 IUS 仓库,请安装 **ius-release** 包。此包包含 IUS 的仓库配置和签名公钥。此外,许多 IUS 中的软件包依赖于 [EPEL](http://mirrors.zju.edu.cn/docs/epel/) 仓库,因此也要安装 **epel-release** 包。
#### RHEL/CentOS 7
```bash
yum install \
https://mirrors.zju.edu.cn/ius/ius-release-el7.rpm \
https://mirrors.zju.edu.cn/epel/epel-release-latest-7.noarch.rpm
```
#### 测试
IUS 软件包在被发布到主仓库之前,将首先在 ius-testing 中提供。安装 ius-release 时,默认情况下 ius-testing 仓库是禁用的。如果您希望参与测试新的 IUS 软件包,请启用它。
```bash
yum install yum-utils
yum-config-manager --enable ius-testing
```

19
docs/zh/kali.mdx Normal file
View File

@@ -0,0 +1,19 @@
---
mirrorId: kali
---
### 手动替换
编辑 `/etc/apt/sources.list` 文件,在文件最前面添加以下条目:
```properties
deb https://mirrors.zju.edu.cn/kali kali-rolling main non-free contrib
#deb-src https://mirrors.zju.edu.cn/kali kali-rolling main non-free contrib
```
### sed 替换
执行如下命令 sed 替换
```bash
sed -i "s@http://http.kali.org/kali@https://mirrors.zju.edu.cn/kali@g" /etc/apt/sources.list
```

36
docs/zh/linux.git.mdx Normal file
View File

@@ -0,0 +1,36 @@
---
mirrorId: linux.git
---
如需克隆 Linux 代码,使用
```bash
git clone https://mirrors.zju.edu.cn/git/linux.git
```
若要将 mirror 加入已有代码库,可在已有仓库中运行
```bash
git remote add mirror https://mirrors.zju.edu.cn/git/linux.git
```
或运行
```bash
git remote set-url origin https://mirrors.zju.edu.cn/git/linux.git
```
将默认上游设置为镜像站
### 增量下载
如果需要其它 linux 分支的代码(如树莓派内核代码),可以在 clone 本项目基础上增量下载分支的代码,从而加速下载
以树莓派为例,具体操作为
```bash
git clone https://mirrors.zju.edu.cn/git/linux.git
git remote add rasp https://github.com/raspberrypi/linux.git
git fetch rasp
```

31
docs/zh/linuxmint.mdx Normal file
View File

@@ -0,0 +1,31 @@
---
mirrorId: linuxmint
---
import ConfigGenerator from '../../src/components/config-generator'
export const linuxmintVersionMap = {
"21.1": "vera",
"21": "vanessa",
"20.3": "una",
"20.2": "uma",
"20.1": "ulyssa",
}
export const GetConfig = (version) => {
var versionName = linuxmintVersionMap[version]
return `deb https://mirrors.zju.edu.cn/linuxmint/ ${versionName} main upstream import backport`
}
Linux Mint 也采用 apt 作为包管理器,与 Ubuntu 和 Debian 类似,你需要编辑 `/etc/apt/sources.list` 和 `/etc/apt/sources.list.d/*` 中的路径。对于来自 Ubuntu 与 Debian 的部分源,可以参考 [Ubuntu 帮助](/docs/ubuntu/)与 [Debian 帮助](/docs/debian/)进行修改。
需要修改 `/etc/apt/sources.list.d/official-package-repositories.list`(注意备份),把 `packages.linuxmint.com` 替换为镜像源
<ConfigGenerator promptString="Linux Mint 版本:" versionList={Object.keys(linuxmintVersionMap)} defaultVersion="21.1" configGen={GetConfig} language="text" />
然后运行 `apt update` 即可。
注:完成后请不要再使用 mintsources自带的图形化软件源设置工具进行任何操作因为在操作后无论是否有按“确定”mintsources 均会复写 `/etc/apt/sources.list.d/official-package-repositories.list`。

27
docs/zh/llvm-apt.mdx Normal file
View File

@@ -0,0 +1,27 @@
---
mirrorId: llvm-apt
---
import ConfigGenerator from '../../src/components/config-generator'
### 安装脚本
export const llvmVersionMap = {
"默认": "",
"15": "15",
"14": "14",
"13": "13",
"12": "12",
"11": "11",
}
export const GetConfig = (version) => {
var versionName = llvmVersionMap[version]
return `wget https://mirrors.zju.edu.cn/llvm-apt/llvm.sh
chmod +x llvm.sh
./llvm.sh ${versionName} all -m https://mirrors.zju.edu.cn/llvm-apt`
}
使用下面的指令进行配置。
<ConfigGenerator promptString="请选择您需要的 LLVM 版本:" versionList={Object.keys(llvmVersionMap)} defaultVersion="默认" configGen={GetConfig} language="bash" />

33
docs/zh/manjaro.mdx Normal file
View File

@@ -0,0 +1,33 @@
---
mirrorId: manjaro
---
> 镜像站已正常工作,但可能未进入中国镜像站列表。
>
> 手动设置方法可参照 [ArchLinux 文档](/docs/archlinux)
包含架构:`i686`, `x86_64`, `aarch64`
目前 AArch64 (ARM) 架构的 manjaro 源位于主源manjaro-arm 镜像上游已不再更新。
### 使用说明
生成可用中国镜像站列表:
```shell
pacman-mirrors -i -c China -m rank
```
勾选
```plaintext
https://mirrors.zju.edu.cn/manjaro/
```
然后按 ``OK`` 键两次。
最后刷新缓存:
```bash
pacman -Syy
```

29
docs/zh/msys2.mdx Normal file
View File

@@ -0,0 +1,29 @@
---
mirrorId: msys2
---
### 收录架构
* MINGW: i686, x86_64, ucrt64, clang64
* MSYS: i686, x86_64
### 安装
请访问镜像目录下的 `distrib/` 目录
```conf
# x86_64
https://mirrors.zju.edu.cn/msys2/distrib/x86_64/
# i686
https://mirrors.zju.edu.cn/msys2/distrib/i686/
```
找到名为 `msys2-<架构>-<日期>.exe` 的文件(如 `msys2-x86_64-20141113.exe`),下载安装即可。
### pacman 的配置
直接运行
```bash
sed -i "s#https\?://mirror.msys2.org/#https://mirrors.zju.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist*
```

31
docs/zh/npm.mdx Normal file
View File

@@ -0,0 +1,31 @@
---
mirrorId: npm
---
### Yarn
#### 临时修改
```bash
yarn add <package> --registry https://mirrors.zju.edu.cn/npm
```
#### 永久修改
```bash
yarn config set registry https://mirrors.zju.edu.cn/npm
```
### NPM
#### 临时修改
```bash
npm install <package> --registry=https://mirrors.zju.edu.cn/npm
```
#### 永久修改
```bash
npm config set registry https://mirrors.zju.edu.cn/npm
```

78
docs/zh/opensuse.mdx Normal file
View File

@@ -0,0 +1,78 @@
---
mirrorId: opensuse
---
openSUSE 项目是一个由 Novell 赞助的社区项目。该项目旨在推进 Linux 的广泛应用,提供自由、易于入手和美观实用的 openSUSE Linux 发行版。openSUSE 使用 `zypper` 作为包管理器。
openSUSE 默认使用 [MirrorBrain](https://zh.opensuse.org/MirrorBrain) 技术统一镜像入口,在下载时自动分配镜像站点,从而给用户提供更好的安全性,通常情况下使用默认配置即可。
使用 MirrorBrain 需要从位于德国的 openSUSE 主服务器上获取元数据,这可能导致使用默认软件源时获取元数据较慢,此时可以使用镜像源替换默认软件源。
### openSUSE Leap 15.2 或更新版本使用方法
禁用官方软件源
```bash
zypper mr -da
```
添加镜像源
```bash
zypper ar -cfg 'https://mirrors.zju.edu.cn/opensuse/distribution/leap/$releasever/repo/oss/' mirror-oss
zypper ar -cfg 'https://mirrors.zju.edu.cn/opensuse/distribution/leap/$releasever/repo/non-oss/' mirror-non-oss
zypper ar -cfg 'https://mirrors.zju.edu.cn/opensuse/update/leap/$releasever/oss/' mirror-update
zypper ar -cfg 'https://mirrors.zju.edu.cn/opensuse/update/leap/$releasever/non-oss/' mirror-update-non-oss
```
Leap 15.3 用户还需添加 sle 和 backports 源
```bash
zypper ar -cfg 'https://mirrors.zju.edu.cn/opensuse/update/leap/$releasever/sle/' mirror-sle-update
zypper ar -cfg 'https://mirrors.zju.edu.cn/opensuse/update/leap/$releasever/backports/' mirror-backports-update
```
Leap 15.3 注:若在安装时**没有**启用在线软件源sle 源和 backports 源将在系统首次更新后引入,请确保系统在更新后仅启用了**六个**所需软件源。可使用 `zypper lr` 检查软件源状态,并使用 `zypper mr -d` 禁用多余的软件源。
### openSUSE Tumbleweed 使用方法
禁用官方软件源
```bash
zypper mr -da
```
添加镜像源
```bash
zypper ar -cfg 'https://mirrors.zju.edu.cn/opensuse/tumbleweed/repo/oss/' mirror-oss
zypper ar -cfg 'https://mirrors.zju.edu.cn/opensuse/tumbleweed/repo/non-oss/' mirror-non-oss
```
刷新软件源
```bash
zypper ref
```
Tumbleweed 注Tumbleweed 安装后默认会启用 oss, non-oss, update, 3 个官方软件源,
其中 oss 及 non-oss 源用于发布 Tumbleweed 的每日构建快照,快照中已包含系统所需的全部软件包及更新。
update 源仅用于推送临时安全补丁,如当日快照已发布但仍有临时安全补丁时,会首先推送至 update 源,并在次日合入下一版快照。
由于 update 源存在较强的时效性,上游镜像并未同步 update 源,镜像源亦无法提供该源的镜像。
禁用 update 源并不会使系统缺失任何功能或安全更新,仅会导致极少数更新晚些推送,如有需求可以重新启用官方 update 源。
### 图形界面下配置方法
以 openSUSE Leap 15.3 为例:
1. 打开 YaST
2. 点击 Software 分组中的 Software Repositories
3. 在打开的窗口上方的列表中点击 Main Repository点击 Edit
4. 将 download.opensuse.org 替换为
```plaintext
mirrors.zju.edu.cn/opensuse
```
点 OK
5. 再用同样的方法编辑 Non-OSS Repository, Main Update Repository, Update Repository (Non-Oss) 和 Update repository with updates from SUSE Linux Enterprise 15。

28
docs/zh/openwrt.mdx Normal file
View File

@@ -0,0 +1,28 @@
---
mirrorId: openwrt
---
OpenWRT曾用名 LEDE是一款广泛应用于路由器的嵌入式操作系统。本站提供 OpenWRT 的包管理器 `opkg` 的 release 部分镜像。
部分镜像站(例如 TUNA/BFSU并不包含 snapshots 镜像USTC 提供了对 snapshots 的反代,请在替换之前确认各镜像站的情况。
### 手工替换
登录到路由器,并编辑 `/etc/opkg/distfeeds.conf` 文件,将其中的 `http://downloads.openwrt.org` 替换为
```plaintext
https://mirrors.zju.edu.cn/openwrt
```
即可。
### 自动替换
执行如下命令自动替换
```shell
sed -i 's_https\?://downloads.openwrt.org_https://mirrors.zju.edu.cn/openwrt_' /etc/opkg/distfeeds.conf
```
注:使用 HTTPS 可以有效避免国内运营商的缓存劫持,但需要另行安装 `libustream-openssl ca-bundle ca-certificates` 。

14
docs/zh/packman.mdx Normal file
View File

@@ -0,0 +1,14 @@
---
mirrorId: packman
---
openSUSE 非官方社区软件源,主要收录允许自由分发但存在专利纠纷的软件,
例如多媒体解码器等。
### 使用说明
以 openSUSE Leap 为例添加软件源:
```bash
zypper ar -fcg https://mirrors.zju.edu.cn/packman/suse/openSUSE_Leap_\$releasever/ mirror-packman
```

23
docs/zh/pypi.mdx Normal file
View File

@@ -0,0 +1,23 @@
---
mirrorId: pypi
---
> pypi 镜像目前仅为校内用户提供镜像服务。若您的网络环境处于校外, pip 的 HTTP(S) 请求将会被重定向( 302 )至清华 TUNA 镜像站。
### 临时使用
```bash
pip install -i https://mirrors.zju.edu.cn/pypi/web/simple some-package
```
注意,`simple` 不能少,若使用 http 镜像需要加上 `--trusted-host mirrors.zju.edu.cn`
### 设为默认
升级 pip 到最新的版本 (>=10.0.0) 后进行配置:
```bash
pip install pip -U
pip config set global.index-url https://mirrors.zju.edu.cn/pypi/web/simple
```
如果您到 pip 默认源的网络连接较差,临时使用本镜像站来升级 pip
```bash
pip install -i https://mirrors.zju.edu.cn/pypi/web/simple pip -U
```

30
docs/zh/raspberrypi.mdx Normal file
View File

@@ -0,0 +1,30 @@
---
mirrorId: raspberrypi
---
import ConfigGenerator from '../../src/components/config-generator'
export const osVersion = ['11', '10', '9'];
export const versionName = [
'Debian 11 (bullseye)',
'Debian 10 (buster)',
'Debian 9 (stretch)',
];
export const configGen = (version) => {
const versionMap = {
'9': 'stretch',
'10': 'buster',
'11': 'bullseye',
};
const release_name = versionMap[version];
return `deb https://mirrors.zju.edu.cn/raspberrypi/ ${release_name} main
`;
}
编辑 `/etc/apt/sources.list.d/raspi.list`
<ConfigGenerator
promptString=""
versionList={osVersion}
friendlyNameList={versionName}
configGen={configGen} />

82
docs/zh/raspbian.mdx Normal file
View File

@@ -0,0 +1,82 @@
---
mirrorId: raspbian
---
import ConfigGenerator from '../../src/components/config-generator'
### Raspbian 简介
Raspbian 是专门用于 ARM 卡片式计算机 Raspberry Pi® “树莓派”的操作系统,
其基于 Debian 开发,针对 Raspberry Pi 硬件优化。
Raspbian 并非由树莓派的开发与维护机构 The Raspberry Pi Foundation
“树莓派基金会”官方支持。其维护者是一群 Raspberry Pi 硬件和 Debian 项目的爱好者。
Raspbian 系统由于从诞生开始就基于(为了 armhf也必须基于当时还是
testing 版本的 7.0/wheezy所以 Raspbian 不倾向于使用 stable/testing
表示版本。
### 使用说明
首先通过 `uname -m` 确定你使用的系统的架构。
编辑镜像站后,请使用`sudo apt-get update`命令,更新软件源列表,同时检查您的编辑是否正确。
#### armv7l
export const osVersion = ['11', '10', '9'];
export const versionName = [
'Debian 11 (bullseye)',
'Debian 10 (buster)',
'Debian 9 (stretch)',
];
export const configGen = (version) => {
const versionMap = {
'9': 'stretch',
'10': 'buster',
'11': 'bullseye',
};
const release_name = versionMap[version];
return `deb https://mirrors.zju.edu.cn/raspbian/raspbian/ ${release_name} main non-free contrib rpi
# deb-src https://mirrors.zju.edu.cn/raspbian/raspbian/ ${release_name} main non-free contrib rpi
deb [arch=arm64] https://mirrors.zju.edu.cn/raspbian/multiarch/ ${release_name} main
`;
}
编辑 `/etc/apt/sources.list`
<ConfigGenerator
promptString=""
versionList={osVersion}
friendlyNameList={versionName}
configGen={configGen} />
注意:网址末尾的`raspbian`重复两次是必须的。因为 Raspbian 的仓库中除了 APT 软件源还包含其他代码。APT 软件源不在仓库的根目录,而在`raspbian/`子目录下。
#### aarch64
aarch64 用户可直接参考 [Debian 帮助](/docs/debian/)
#### raspberry 镜像
对于两个架构,编辑 `/etc/apt/sources.list.d/raspi.list` 文件,这需要查看 [Raspberrypi 帮助](/docs/raspberrypi/)。
### 相关链接
#### Raspbian 链接
* Raspbian 主页:[https://www.raspbian.org](https://www.raspbian.org)
* 文档:[https://www.raspbian.org/RaspbianDocumentation](https://www.raspbian.org/RaspbianDocumentation)
* Bug 反馈:[https://www.raspbian.org/RaspbianBugs](https://www.raspbian.org/RaspbianBugs)
* 镜像列表: [https://www.raspbian.org/RaspbianMirrors](https://www.raspbian.org/RaspbianMirrors)
#### 树莓派链接
* 树莓派基金会主页:[https://www.raspberrypi.org/](https://www.raspberrypi.org/)
* 树莓派基金会论坛 Raspberry Pi OS 版块:[https://raspberrypi.org/forums/viewforum.php?f=66](https://raspberrypi.org/forums/viewforum.php?f=66)
### 关于本文档
本文档内容的原始版本由 Raspberry Pi 中文社区“树莓爱好者论坛” 按照 [知识共享署名 - 非商业性使用 3.0 中国大陆许可协议](http://creativecommons.org/licenses/by-nc/3.0/cn/) 提供。

27
docs/zh/rocky.mdx Normal file
View File

@@ -0,0 +1,27 @@
---
mirrorId: rocky
---
> 本项文档参照 http://mirrors.ustc.edu.cn/help/rocky.html 编写。
对于 Rocky Linux 9 ,输入以下命令替换配置:
```bash
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.zju.edu.cn/rocky|g' \
-i.bak \
/etc/yum.repos.d/rocky-extras.repo \
/etc/yum.repos.d/rocky.repo
```
对于 Rocky Linux 8 ,输入以下命令替换配置:
```bash
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.zju.edu.cn/rocky|g' \
-i.bak \
/etc/yum.repos.d/Rocky-AppStream.repo \
/etc/yum.repos.d/Rocky-BaseOS.repo \
/etc/yum.repos.d/Rocky-Extras.repo \
/etc/yum.repos.d/Rocky-PowerTools.repo
```

48
docs/zh/ros.mdx Normal file
View File

@@ -0,0 +1,48 @@
---
mirrorId: ros
---
ROS (Robot Operating System, 机器人操作系统) 提供一系列程序库和工具以帮助软件开发者创建机器人应用软件。它提供了硬件抽象、设备驱动、函数库、可视化工具、消息传递和软件包管理等诸多功能。ROS遵循BSD开源许可协议。
### ROS 安装指南
根据使用的 ROS 版本与使用的操作系统,在本镜像站 ROS Wiki 镜像中找到对应 [安装指南](http://mirrors.zju.edu.cn/roswiki/ROS(2f)Installation.html)。
**如需要在安装中使用本镜像站加速安装,请先阅读以下内容。**
### ROS 软件包镜像
在安装指南“ 1.2 Setup your sources.list ”节,将命令替换为以下内容:
```bash
sudo sh -c 'echo "deb http://mirrors.zju.edu.cn/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
```
在安装指南“ 1.3 Setup your keys ”节,将命令替换为以下内容:
```bash
sudo apt install curl # if you haven't already installed curl
curl -s http://mirrors.zju.edu.cn/rosdistro/ros.asc | sudo apt-key add -
```
在安装指南“ 1.6.1 Initialize rosdep ”节,将:
```bash
sudo rosdep init
rosdep update
```
替换为:
```bash
# 手动模拟 rosdep init
sudo mkdir -p /etc/ros/rosdep/sources.list.d/
sudo curl -o /etc/ros/rosdep/sources.list.d/20-default.list https://mirrors.zju.edu.cn/rosdistro/rosdep/sources.list.d/20-default.list
# 为 rosdep update 换源
export ROSDISTRO_INDEX_URL=https://mirrors.zju.edu.cn/rosdistro/index-v4.yaml
rosdep update
# 每次 rosdep update 之前,均需要增加该环境变量
# 为了持久化该设定,可以将其写入 .bashrc 中,例如
echo 'export ROSDISTRO_INDEX_URL=https://mirrors.zju.edu.cn/rosdistro/index-v4.yaml' >> ~/.bashrc
```

18
docs/zh/ros2.mdx Normal file
View File

@@ -0,0 +1,18 @@
---
mirrorId: ros2
---
请参照 [官方指南](https://docs.ros.org/en/foxy/Installation/Ubuntu-Install-Debians.html) ,流程中仅做如下修改:
下载并安装 ROS 的 GPG Key
```bash
sudo apt install curl gnupg2
sudo curl -sSL https://mirrors.zju.edu.cn/rosdistro/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
```
添加软件仓库,更新索引:
```bash
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://mirrors.zju.edu.cn/ros2/ubuntu $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
```

5
docs/zh/rosdistro.mdx Normal file
View File

@@ -0,0 +1,5 @@
---
mirrorId: rosdistro
---
参照 ROS 说明: [链接](/docs/ros/)

37
docs/zh/rustup.mdx Normal file
View File

@@ -0,0 +1,37 @@
---
mirrorId: rustup
---
[Rustup](https://rustup.rs/) 是 Rust 官方的跨平台 Rust 安装工具。
镜像站只会保留一段时间的 nightly如果在安装时出现错误请用 `RUSTUP_DIST_SERVER= rustup ...` 来使用官方源。
使用 rustup 安装 rust 时,若要启用镜像源,执行:
```bash
# for bash
RUSTUP_DIST_SERVER=https://mirrors.zju.edu.cn/rustup rustup install stable # for stable
# for fish
env RUSTUP_DIST_SERVER=https://mirrors.zju.edu.cn/rustup rustup install stable # for stable
# for bash
RUSTUP_DIST_SERVER=https://mirrors.zju.edu.cn/rustup rustup install nightly # for nightly
# for fish
env RUSTUP_DIST_SERVER=https://mirrors.zju.edu.cn/rustup rustup install nightly # for nightly
# for bash
RUSTUP_DIST_SERVER=https://mirrors.zju.edu.cn/rustup rustup install nightly-YYYY-mm-dd
# for fish
env RUSTUP_DIST_SERVER=https://mirrors.zju.edu.cn/rustup rustup install nightly-YYYY-mm-dd
```
若要长期启用镜像源,执行:
```bash
# for bash
echo 'export RUSTUP_UPDATE_ROOT=https://mirrors.zju.edu.cn/rustup/rustup' >> ~/.bash_profile
echo 'export RUSTUP_DIST_SERVER=https://mirrors.zju.edu.cn/rustup' >> ~/.bash_profile
# for fish
echo 'set -x RUSTUP_UPDATE_ROOT https://mirrors.zju.edu.cn/rustup/rustup' >> ~/.config/fish/config.fish
echo 'set -x RUSTUP_DIST_SERVER https://mirrors.zju.edu.cn/rustup' >> ~/.config/fish/config.fish
```
rustup 在判断是否需要更新时依赖于 toml 的 sha256由于 toml 内容中相关链接被替换为镜像源,第一次切换到镜像源时各个 channel 会被认为需要更新。

42
docs/zh/ubuntu-ports.mdx Normal file
View File

@@ -0,0 +1,42 @@
---
mirrorId: ubuntu-ports
---
import ConfigGenerator from '../../src/components/config-generator'
export const ubuntuVersionMap = {
"23.04": "lunar",
"22.10": "kinetic",
"22.04 LTS": "jammy",
"20.04 LTS": "focal",
"18.04 LTS": "bionic",
"16.04 LTS": "xenial",
"14.04 LTS": "trusty",
}
export const GenUbuntuConfig = (version) => {
var ubuntuName = ubuntuVersionMap[version]
return `# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.zju.edu.cn/ubuntu-ports/ ${ubuntuName} main restricted universe multiverse
# deb-src https://mirrors.zju.edu.cn/ubuntu-ports/ ${ubuntuName} main restricted universe multiverse
deb https://mirrors.zju.edu.cn/ubuntu-ports/ ${ubuntuName}-updates main restricted universe multiverse
# deb-src https://mirrors.zju.edu.cn/ubuntu-ports/ ${ubuntuName}-updates main restricted universe multiverse
deb https://mirrors.zju.edu.cn/ubuntu-ports/ ${ubuntuName}-backports main restricted universe multiverse
# deb-src https://mirrors.zju.edu.cn/ubuntu-ports/ ${ubuntuName}-backports main restricted universe multiverse
deb https://mirrors.zju.edu.cn/ubuntu-ports/ ${ubuntuName}-security main restricted universe multiverse
# deb-src https://mirrors.zju.edu.cn/ubuntu-ports/ ${ubuntuName}-security main restricted universe multiverse\n
# 预发布软件源,不建议启用
# deb https://mirrors.zju.edu.cn/ubuntu-ports/ ${ubuntuName}-proposed main restricted universe multiverse
# deb-src https://mirrors.zju.edu.cn/ubuntu-ports/ ${ubuntuName}-proposed main restricted universe multiverse`
}
export const defaultVersion = Object.keys(ubuntuVersionMap).find(x => x.indexOf("LTS") > 0);
> ubuntu-ports 镜像目前仅为校内反向代理清华 TUNA 镜像站。若您的网络环境处于校外, apt 的 HTTP(S) 请求将会被重定向( 302 )至 TUNA 镜像站。
Ubuntu 的软件源配置文件是 `/etc/apt/sources.list`。将系统自带的该文件做个备份,将该文件替换为下面内容,即可使用我们的软件源镜像。
<ConfigGenerator promptString="请选择您的 Ubuntu 版本:" versionList={Object.keys(ubuntuVersionMap)} defaultVersion={defaultVersion} configGen={GenUbuntuConfig} language="bash" />
本镜像仅包含 arm64 armhf ppc64el riscv64 s390x 架构的软件包。

39
docs/zh/ubuntu.mdx Normal file
View File

@@ -0,0 +1,39 @@
---
mirrorId: ubuntu
---
import ConfigGenerator from '../../src/components/config-generator'
export const ubuntuVersionMap = {
"23.04": "lunar",
"22.10": "kinetic",
"22.04 LTS": "jammy",
"20.04 LTS": "focal",
"18.04 LTS": "bionic",
"16.04 LTS": "xenial",
"14.04 LTS": "trusty",
}
export const GenUbuntuConfig = (version) => {
var ubuntuName = ubuntuVersionMap[version]
return `# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.jcut.edu.cn/ubuntu/ ${ubuntuName} main restricted universe multiverse
# deb-src https://mirrors.jcut.edu.cn/ubuntu/ ${ubuntuName} main restricted universe multiverse
deb https://mirrors.jcut.edu.cn/ubuntu/ ${ubuntuName}-updates main restricted universe multiverse
# deb-src https://mirrors.jcut.edu.cn/ubuntu/ ${ubuntuName}-updates main restricted universe multiverse
deb https://mirrors.jcut.edu.cn/ubuntu/ ${ubuntuName}-backports main restricted universe multiverse
# deb-src https://mirrors.jcut.edu.cn/ubuntu/ ${ubuntuName}-backports main restricted universe multiverse
deb https://mirrors.jcut.edu.cn/ubuntu/ ${ubuntuName}-security main restricted universe multiverse
# deb-src https://mirrors.jcut.edu.cn/ubuntu/ ${ubuntuName}-security main restricted universe multiverse\n
# 预发布软件源,不建议启用
# deb https://mirrors.jcut.edu.cn/ubuntu/ ${ubuntuName}-proposed main restricted universe multiverse
# deb-src https://mirrors.jcut.edu.cn/ubuntu/ ${ubuntuName}-proposed main restricted universe multiverse`
}
export const defaultVersion = Object.keys(ubuntuVersionMap).find(x => x.indexOf("LTS") > 0);
Ubuntu 的软件源配置文件是 `/etc/apt/sources.list`。将系统自带的该文件做个备份,将该文件替换为下面内容,即可使用我们的软件源镜像。
<ConfigGenerator promptString="请选择您的 Ubuntu 版本:" versionList={Object.keys(ubuntuVersionMap)} defaultVersion={defaultVersion} configGen={GenUbuntuConfig} language="bash" />
本镜像仅包含 32/64 位 x86 架构处理器的软件包,在 ARM(arm64, armhf)、PowerPC(ppc64el)、RISC-V(riscv64) 和 S390x 等架构的设备上(对应官方源为`ports.ubuntu.com`)请使用 [ubuntu-ports](/docs/ubuntu-ports) 镜像。

1
gatsby-browser.js Normal file
View File

@@ -0,0 +1 @@
import './src/styles/global.scss';

141
gatsby-config.js Normal file
View File

@@ -0,0 +1,141 @@
/**
* Configure your Gatsby site with this file.
*
* See: https://www.gatsbyjs.com/docs/gatsby-config/
*/
const { createProxyMiddleware } = require('http-proxy-middleware');
const config = require('./config');
module.exports = {
siteMetadata: {
title: 'JCUT Mirror',
siteUrl: config.siteUrl,
description: 'JCUT Mirror is a non-profit program aimed at popularizing open source software and facilitating efficient access to various resources of open source projects by all users.',
author: 'JCUT YF',
},
assetPrefix: config.assetPrefix,
pathPrefix: config.pathPrefix,
plugins: [
{
resolve: `gatsby-theme-material-ui`,
options: {
webFontsConfig: {
fonts: {
google: [
{
family: `Metrophobic`
},
],
},
},
}
},
{
resolve: 'gatsby-source-filesystem',
options: {
name: 'mirrors',
path: `${__dirname}/docs`,
}
},
{
resolve: 'gatsby-source-filesystem',
options: {
name: 'locales',
path: `${__dirname}/locales`,
}
},
{
resolve: 'gatsby-source-filesystem',
options: {
name: 'news',
path: `${__dirname}/news`,
}
},
{
resolve: "gatsby-plugin-mdx",
options: {
mdxOptions: {
remarkPlugins: [
// Add GitHub Flavored Markdown (GFM) support
// Warning: Most of the remark ecosystem is ESM which means that packages
// like remark-gfm dont work out of the box with Gatsby v5. To make remark-gfm
// compatible with the current Gatsby version, we have to use an old version of
// remark-gfm. Please take care in future updates.
require(`remark-gfm`),
],
},
}
},
{
resolve: "gatsby-plugin-react-svg",
options: {
rule: {
include: /icons/,
omitKeys: [
'inkscapePageshadow', 'inkscapePageopacity', 'inkscapePagecheckerboard',
'inkscapeZoom', 'inkscapeCx', 'inkscapeCy', 'inkscapeWindowWidth', 'inkscapeWindowHeight',
'inkscapeWindowX', 'inkscapeWindowY', 'inkscapeWindowMaximized', 'inkscapeCurrentLayer',
'sodipodiNodetypes', 'sodipodiDocname', 'inkscapeVersion', 'xmlnsInkscape', 'xmlnsSodipodi',
'xmlnsSvg',
]
}
}
},
{
resolve: `gatsby-plugin-react-i18next`,
options: {
localeJsonSourceName: 'locales', // name given to `gatsby-source-filesystem` plugin.
languages: config.locales,
defaultLanguage: config.defaultLanguage,
redirect: false,
// if you are using Helmet, you must include siteUrl, and make sure you add http:https
siteUrl: config.siteUrl,
// you can pass any i18next options
// pass following options to allow message content as a key
i18nextOptions: {
interpolation: {
escapeValue: false // not needed for react as it escapes by default
},
keySeparator: false,
nsSeparator: false
},
pages: Object.values(config.documentSources).map(
s => ({
matchPath: s.path,
getLanguageFromPath: s.getLanguageFromPath,
})
)
}
},
{
resolve: 'gatsby-plugin-manifest',
options: {
icon: 'resource/icons/favicon.svg',
},
},
`gatsby-plugin-preact`,
`gatsby-plugin-sass`,
{
resolve: "gatsby-plugin-sitemap",
options: {
serialize: ({ path }) => {
return {
url: path,
lastmod: new Date(0).toISOString(),
};
},
},
},
],
developMiddleware: app => {
app.use(
'/api',
createProxyMiddleware({
target: 'http://mirrors.zju.edu.cn',
onProxyReq: (proxyRes, req, res) => {
proxyRes.setHeader('host', 'mirrors.zju.edu.cn');
},
}),
);
}
}

196
gatsby-node.js Normal file
View File

@@ -0,0 +1,196 @@
const { match, compile } = require("path-to-regexp");
const { createFilePath } = require(`gatsby-source-filesystem`)
const { createContentDigest } = require(`gatsby-core-utils`)
const config = require('./config');
const mdxResolverPassthrough = (fieldName) => async (
source,
args,
context,
info
) => {
const type = info.schema.getType(`Mdx`);
const mdxNode = context.nodeModel.getNodeById({
id: source.parent,
});
const resolver = type.getFields()[fieldName].resolve;
const result = await resolver(mdxNode, args, context, info);
return result;
}
exports.createSchemaCustomization = ({ actions, schema }) => {
const { createTypes } = actions;
// interface for all kinds of documents
createTypes(`interface Document implements Node {
id: ID!
title: String
source: String!
body: String!
html: String!
slug: String!
date: Date @dateformat
tags: [String]!
tableOfContents: JSON
frontmatter: JSON
locale: String!
}`);
// MDX document implements Document interface
createTypes(
schema.buildObjectType({
name: `MdxDocument`,
fields: {
id: { type: `ID!` },
title: {
type: `String`,
},
source: {
type: `String!`,
},
slug: {
type: `String!`,
},
date: { type: `Date`, extensions: { dateformat: {} } },
tags: { type: `[String]!` },
tableOfContents: {
type: `JSON`,
resolve: mdxResolverPassthrough(`tableOfContents`),
},
body: {
type: `String!`,
resolve: mdxResolverPassthrough(`body`),
},
html: {
type: `String!`,
resolve: mdxResolverPassthrough(`html`),
},
frontmatter: {
type: `JSON`,
resolve: mdxResolverPassthrough(`frontmatter`),
},
locale: {
type: `String!`,
},
},
interfaces: [`Node`, `Document`],
extensions: {
infer: false,
},
})
);
}
// create fields for documents slugs and sources
exports.onCreateNode = async (
{ node, actions, getNode, createNodeId, store, cache, reporter },
) => {
const { createNode, createParentChildLink } = actions;
if (node.internal.type !== `Mdx`) return;
// create source field according to source name passed to gatsby-source-filesystem
const fileNode = getNode(node.parent);
const source = fileNode.sourceInstanceName;
const docConfig = config.documentSources[source];
if (!docConfig) reporter.panic(`Unknown source of documents ${source}`);
const { folder: folderLayout, path: pathTemplate } = docConfig;
let slug, locale;
if (node.frontmatter.slug) {
// a relative slug gets turned into a sub path
slug = node.frontmatter.slug;
locale = match(pathTemplate)(path)?.params?.lang;
} else {
// otherwise use the filepath function from gatsby-source-filesystem
const path = createFilePath({
node: fileNode,
getNode,
});
const pathMatch = match(folderLayout)(path);
if (!pathMatch) reporter.panic(`Path ${path} does not match the layout ${folderLayout}`);
const params = pathMatch.params;
locale = params.lang;
// remove default language from slug
if (params.lang === config.defaultLanguage) params.lang = undefined;
slug = compile(pathTemplate)(params);
}
// normalize use of trailing slash
slug = slug.replace(/\/*$/, `/`);
const fieldData = {
title: node.frontmatter.title,
tags: node.frontmatter.tags || [],
slug,
source,
locale,
date: node.frontmatter.date
};
const id = createNodeId(`${node.id} >>> MdxDocument`);
await createNode({
...fieldData,
// required fields
id,
parent: node.id,
children: [],
internal: {
type: `MdxDocument`,
contentDigest: createContentDigest(fieldData),
contentFilePath: node.internal.contentFilePath,
content: JSON.stringify(fieldData),
description: `Mdx implementation of the Document interface`,
},
});
createParentChildLink({ parent: node, child: getNode(id) });
}
exports.createPages = async ({ graphql, actions, reporter }) => {
const { createPage } = actions;
const result = await graphql(`
{
allDocument {
nodes {
id
slug
source
frontmatter
internal {
contentFilePath
}
}
}
}
`);
if (result.errors) {
reporter.panic(result.errors);
}
const { allDocument } = result.data;
const docs = allDocument.nodes;
// create pages for documents
docs.forEach((doc, index) => {
const previous = index === docs.length - 1 ? null : docs[index + 1];
const next = index === 0 ? null : docs[index - 1];
const { slug, frontmatter } = doc;
createPage({
path: slug,
component: `${require.resolve(
config.documentSources[doc.source]?.template
)}?__contentFilePath=${doc.internal.contentFilePath}`,
context: {
id: doc.id,
previousId: previous ? previous.id : undefined,
nextId: next ? next.id : undefined,
frontmatter
},
});
})
}

View File

@@ -0,0 +1,37 @@
{
"Blog": "Blog",
"Email": "Email",
"GitHub": "GitHub",
"ISO": "ISO",
"JCUT Mirror": "JCUT Mirror",
"MirrorZ 镜像站项目": "The MirrorZ Project",
"使用说明": "Help",
"关于我们": "About Us",
"安装映像": "Installation Image",
"展开": "Expand",
"常用镜像": "Popular Mirrors",
"所有镜像": "All Mirrors",
"折叠": "Collapse",
"文件列表": "File List",
"最近更新于 {{date}}": "Last updated at {{date}}",
"本镜像站提供了包括 Docker, PostgreSQL, Ubuntu 等项目源的镜像,以服务教育和科学研究为目的,提倡自由、平等、协作、共享的精神。": "We provide a variety of mirrors including Docker, PostgreSQL, and Ubuntu, for the purpose of serving education and scientific research, and promoting the spirit of freedom, equality, collaboration, and sharing.",
"浅色": "Light",
"浙江大学信息技术中心": "Information Technology Center of Zhejiang University",
"浙江大学开源软件镜像站": "Open Source Software Mirror Site of Zhejiang University",
"浙江大学开源软件镜像站是一个致力于普及开源软件,方便校内外用户高效访问开源项目的各种资源的非盈利计划。": "JCUT Mirror is a non-profit program aimed at popularizing open source software and facilitating efficient access to various resources of open source projects by all users.",
"根据相关法律法规,本站不对欧盟用户提供服务。": "According to the relevant laws and regulations, this site does not provide services to EU users.",
"深色": "Dark",
"清华大学 TUNA 协会": "TUNA @ Tsinghua University",
"版本": "Version",
"特别鸣谢": "Special Thanks",
"系统默认": "System Default",
"语言": "Language",
"返回": "Back",
"显示镜像目录名称": "List mirrors by directory",
"显示镜像名称": "List mirrors by name",
"校外网络": "Off-Campus",
"校内网络 - IPv4": "On-Campus - IPv4",
"校内网络 - IPv6": "On-Campus - IPv6",
"近期更新": "Latest Update",
"问题反馈与镜像请求GitHub": "Issues & Mirror Request (GitHub)"
}

View File

@@ -0,0 +1,37 @@
{
"Blog": "Blog",
"Email": "Email",
"GitHub": "GitHub",
"ISO": "ISO",
"JCUT Mirror": "JCUT Mirror",
"MirrorZ 镜像站项目": "MirrorZ 镜像站项目",
"使用说明": "使用说明",
"关于我们": "关于我们",
"安装映像": "安装映像",
"展开": "展开",
"常用镜像": "常用镜像",
"所有镜像": "所有镜像",
"折叠": "折叠",
"文件列表": "文件列表",
"最近更新于 {{date}}": "最近更新于 {{date}}",
"本镜像站提供了包括 Docker, PostgreSQL, Ubuntu 等项目源的镜像,以服务教育和科学研究为目的,提倡自由、平等、协作、共享的精神。": "本镜像站提供了包括 Docker, PostgreSQL, Ubuntu 等项目源的镜像,以服务教育和科学研究为目的,提倡自由、平等、协作、共享的精神。",
"浅色": "浅色",
"浙江大学信息技术中心": "浙江大学信息技术中心",
"浙江大学开源软件镜像站": "浙江大学开源软件镜像站",
"浙江大学开源软件镜像站是一个致力于普及开源软件,方便校内外用户高效访问开源项目的各种资源的非盈利计划。": "浙江大学开源软件镜像站是一个致力于普及开源软件,方便校内外用户高效访问开源项目的各种资源的非盈利计划。",
"根据相关法律法规,本站不对欧盟用户提供服务。": "根据相关法律法规,本站不对欧盟用户提供服务。",
"深色": "深色",
"清华大学 TUNA 协会": "清华大学 TUNA 协会",
"版本": "版本",
"特别鸣谢": "特别鸣谢",
"系统默认": "系统默认",
"语言": "语言",
"返回": "返回",
"显示镜像目录名称": "显示镜像目录名称",
"显示镜像名称": "显示镜像名称",
"校外网络": "校外网络",
"校内网络 - IPv4": "校内网络 - IPv4",
"校内网络 - IPv6": "校内网络 - IPv6",
"近期更新": "近期更新",
"问题反馈与镜像请求GitHub": "问题反馈与镜像请求GitHub"
}

View File

@@ -0,0 +1,8 @@
---
title: Introducing our new mirror site!
name: hello_mirror
author: NCJ @ ZJUSCT Falcon Team
date: 2022-11-15
---
After more than a year's development, the new ZJU Mirror site is finally here. It's developed and maintained by [ZJUSCT](https://www.zjusct.io/) with hardware support from [Information Technology Center of Zhejiang University](https://zuits.zju.edu.cn/). Issues related to the new mirror site including mirror request and bugs can be reported in [our dedicated issue repo](https://github.com/ZJUSCT/mirror-issues). Hope you enjoy using it!

View File

@@ -0,0 +1,20 @@
---
title: 欢迎使用全新的荆楚理工学院开源镜像站
name: hello_mirror
author: YF @ JCIOT Mirrors Team
date: 2024-02-15
---
经过一年多的开发与测试,全新的荆楚理工学院开源软件镜像站正式上线了!新镜像站由[浙江大学超算队ZJUSCT](https://www.zjusct.io/)建设与维护,[浙江大学信息技术中心](https://zuits.zju.edu.cn/)提供设备支持,其拥有更多的镜像、全新设计的前端网站和管理后端、以及更加稳健的镜像同步服务,欢迎大家使用!
### 从测试版镜像站迁移
今年上半年我们在 `https://mirror.zju.edu.cn` 提供了新站的测试版服务,该域名未来也将持续提供服务,但镜像站网站上的帮助文档将全部使用正式版的域名(`https://mirrors.zju.edu.cn`)。您可以通过将所有相关 URL 的 `mirror` 更改为 `mirrors` 来切换到正式版镜像站。
### 开源代码
我们目前已经将镜像站所使用的[前端](https://github.com/ZJUSCT/mirror-front)和[后端](https://github.com/ZJUSCT/MirrorsDotNet)代码公开在 [ZJUSCT 的 GitHub 组织下](https://github.com/ZJUSCT/),欢迎大家 star🌟
### 想要反馈意见?
镜像请求、故障报告、以及其他你对 mirror 的改进意见都可以在我们提供的[专用 issue 仓库](https://github.com/ZJUSCT/mirror-issues)里进行反馈。期待大家的声音。

89
package.json Normal file
View File

@@ -0,0 +1,89 @@
{
"name": "zju-mirror",
"private": false,
"description": "ZJU open source mirror site",
"version": "0.1.0",
"license": "MIT",
"scripts": {
"build": "gatsby build --prefix-paths",
"develop": "gatsby develop -H 0.0.0.0",
"format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"",
"start": "gatsby develop",
"serve": "gatsby serve -H 0.0.0.0 -p 9000",
"clean": "gatsby clean",
"test": "echo \"Write tests! -> https://gatsby.dev/unit-testing\" && exit 1",
"extract": "yarn run babel --config-file ./babel-extract.config.js -o tmp/chunk.js 'src/**/*.{js,jsx,ts,tsx}' && rm -rf tmp",
"types-check": "tsc --noEmit --project ./tsconfig.json",
"lint-check": "eslint src/**/*"
},
"dependencies": {
"@emotion/react": "^11.9.0",
"@emotion/styled": "^11.8.1",
"@fontsource/poppins": "^4.5.10",
"@formatjs/intl-displaynames": "^5.4.3",
"@iconify/icons-logos": "^1.2.6",
"@iconify/icons-simple-icons": "^1.2.44",
"@iconify/icons-mdi": "^1.2.44",
"@iconify/icons-file-icons": "^1.2.3",
"@iconify/react": "^3.2.1",
"@mdx-js/react": "^2.3.0",
"@mui/icons-material": "^5.6.2",
"@mui/material": "^5.6.3",
"gatsby": "^5.9.1",
"gatsby-plugin-manifest": "^5.6.0",
"gatsby-plugin-mdx": "^5.6.0",
"gatsby-plugin-preact": "^7.6.1",
"gatsby-plugin-react-i18next": "^3.0.1",
"gatsby-plugin-react-svg": "^3.1.0",
"gatsby-plugin-sass": "^6.6.0",
"gatsby-plugin-sitemap": "^6.7.0",
"gatsby-source-filesystem": "^5.6.0",
"gatsby-theme-material-ui": "^5.2.0",
"gatsby-theme-material-ui-top-layout": "^5.2.0",
"i18next": "^21.6.16",
"js-search": "^2.0.0",
"natsort": "^2.0.3",
"path-to-regexp": "^6.2.0",
"preact": "^10.12.1",
"preact-render-to-string": "^5.2.6",
"prism-react-renderer": "^1.3.1",
"react": "^18.1.0",
"react-dom": "^18.1.0",
"react-helmet": "^6.1.0",
"react-i18next": "^11.16.7",
"remark-gfm": "^1",
"sass": "^1.53.0"
},
"devDependencies": {
"@babel/cli": "^7.17.10",
"@babel/plugin-transform-typescript": "^7.16.8",
"@types/js-search": "^1.4.0",
"@types/mdx": "^2.0.1",
"@types/mdx-js__react": "^1.5.5",
"@types/node": "^18.0.0",
"@types/react": "^18.0.14",
"@types/react-dom": "^18.0.5",
"@typescript-eslint/eslint-plugin": "^5.28.0",
"@typescript-eslint/parser": "^5.28.0",
"babel-plugin-i18next-extract": "^0.8.3",
"eslint": "^8.2.0",
"eslint-config-airbnb": "19.0.4",
"eslint-config-prettier": "^8.5.0",
"eslint-import-resolver-typescript": "^3.2.1",
"eslint-plugin-import": "^2.25.3",
"eslint-plugin-jsx-a11y": "^6.5.1",
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-react": "^7.30.0",
"eslint-plugin-react-hooks": "^4.3.0",
"http-proxy-middleware": "^2.0.6",
"prettier": "2.7.1",
"typescript": "^4.7.3"
},
"repository": {
"type": "git",
"url": "https://github.com/ZJUSCT/mirror-front"
},
"bugs": {
"url": "https://github.com/ZJUSCT/mirror-front/issues"
}
}

127
resource/icons/favicon.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 134 KiB

56
resource/icons/jciot.svg Normal file
View File

@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 27.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1"
id="Layer_1" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" sodipodi:docname="zjusct.svg"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1009.8 304.3"
style="enable-background:new 0 0 1009.8 304.3;" xml:space="preserve">
<style type="text/css">
.st0{fill:#1D1D1D;}
.st1{fill:#FFFFFF;}
.st2{fill:#FEFEFE;}
.st3{fill:#ADADAD;}
</style>
<sodipodi:namedview bordercolor="#ffffff" borderopacity="1" id="namedview37" inkscape:current-layer="Layer_1" inkscape:cx="501.27629" inkscape:cy="87.570194" inkscape:pagecheckerboard="1" inkscape:pageopacity="0" inkscape:pageshadow="0" inkscape:window-height="1021" inkscape:window-maximized="1" inkscape:window-width="1920" inkscape:window-x="0" inkscape:window-y="28" inkscape:zoom="1.3874584" pagecolor="#505050" showgrid="false">
</sodipodi:namedview>
<g id="path35">
<rect class="st0" width="1009.8" height="304.3"/>
</g>
<path id="path16" sodipodi:nodetypes="ccccccccccccccc" class="st1" d="M50.5,154.9c6.8-0.3,11.7,1.4,16.8,2.2
c12.7,2.1,25.8,1.2,38.1-2.6c5.1-1.6,8.6-0.5,11,4.2c0.1,0.2,0.2,0.3,0.3,0.5c6.4,13.5,12.5,17.5,26.3,19.8
c3.3,0.6,11.7-0.1,14.6-1.1c18.1-6.1,33.8-17.6,49.9-28c8.7-5.6,17.1-11.6,25.7-17.3c1.5-1,2.7-2.8,5.3-2.4
c-0.4,0.9-0.8,1.7-1.2,2.5c-13.9,20.6-25.8,37.3-41.7,56.5c-3.1,3.7-7.5,7.6-11.3,9.6c-9.2,4.8-20.6,4.5-30.5,0.9
C118.3,187.1,83.9,172.1,50.5,154.9z"/>
<path id="path20" class="st1" d="M753.5,161.6c-8.5,0-16.9-0.1-25.3,0.1c-3.2,0.1-4.2-1-4.3-4.2c-1-23.9,7.1-32.4,31.2-32.4
c12.3,0,24.6,0.1,36.8-0.1c4-0.1,5.8,1.1,5.2,5.1c0,0.6,0,1.1,0,1.7c0,7.5,0,7.6-7.4,7.6h-40.3c-3.3,0-6.5,0.2-9,2.9
c-0.6,0.7-2.3,2.1-1.7,3.9c0.7,1.9,2.6,1.7,4,1.7c15.4,0.1,30.7,0,46.1,0.1c9.8,0,8.4-1.2,8.6,8.5c0.2,4.2-0.3,8.4-1.3,12.5
c-2.5,9.1-10.1,14.9-21.3,15.3c-15.7,0.5-31.5,0.1-47.2,0.3c-2.7,0-3.7-0.9-3.7-3.6c0-10.2-0.7-10.4,9.7-10.4c12.7,0,25.3,0,38,0
c4.2,0,8.1-0.6,10.3-4.8c1.4-2.7,1.3-4.2-2.4-4.2C770.9,161.7,762.2,161.7,753.5,161.6z"/>
<path id="path22" class="st1" d="M467.8,184.2l44.8-45.4c-12.2,0-22.9,0.1-33.6,0.1c-5.3,0-6-2.4-6-6.2c0-3.3-1.1-7.7,5.8-7.6
c21.3,0.3,42.6,0.1,65.6,0.1l-44.6,45.7c9.5-0.2,17.7,0.6,25.9-0.6c2.1-0.3,3.7-1.8,5-3.6c1.1-1.6,0.5-4.6,3.3-4.8
c3.6-0.3,7.3-0.2,10.9,0.1c2.3,0.3,1.1,2.4,0.9,3.8c-1.7,10.6-8,17.7-19.7,18.3C507.1,184.9,487.9,184.2,467.8,184.2z"/>
<path id="path24" class="st1" d="M844.5,184.6c-10.9,0-21.9,0-32.8,0c-2.5,0-4.5-0.1-4.4-3.5c0.2-10.1-0.4-20.3,0.5-30.3
c1.4-16,11-25,27-25.5c14.4-0.5,28.8,0,43.2-0.2c3.1,0,3.9,1.2,3.8,4.1c-0.2,12.6,1.3,10.1-9.7,10.2c-11.5,0.2-23-0.1-34.5,0.1
c-10.9,0.1-15.6,5-15.8,15.9c0,3.4-0.1,6.9-0.1,10.3c0,4.2,1.4,5,5.3,5c16.3-0.2,32.6,0,48.9-0.2c4.3-0.1,6.1,0.8,5.9,5.6
c-0.4,8.4,0,8.5-8.6,8.5L844.5,184.6z"/>
<path id="path26" class="st1" d="M639,154.9c0-8.2,0.2-16.4-0.1-24.6c-0.1-3.9,1.1-5.2,5.2-5.2c10.4,0,9.2-1.2,9.4,9.4
c0.2,10.6-0.2,21-0.1,31.5c0,3.9,1.2,4.7,4.9,4.8c9.7,0.1,18,0.6,27-0.9c9.9-1.7,14.3-6.7,14.4-16.6c0-7.8,0.1-15.6-0.1-23.4
c-0.1-3.4,1-4.7,4.5-4.6c12.6,0.3,10.1-1.2,10.2,9.8c0.1,8,0.4,15.9-0.8,23.9c-2.5,17.1-12.3,25-28.1,25.6
c-14.2,0.6-28.4,0.1-42.6,0.2c-3.1,0-4-1.1-3.9-4C639.1,172,639,163.4,639,154.9z"/>
<path id="path28" class="st1" d="M628,155.4c0,8.2-0.1,16.4,0.1,24.6c0.1,3.3-0.7,4.7-4.4,4.7c-14.6-0.2-29.2,0.1-43.8-0.2
c-11.9-0.2-22.1-7.7-25.8-17.8c-1.2-3.4-1.4-5.4,3.2-5.1c5.3,0.3,10.8-1.1,14.3,5.3c1.8,3.3,6.6,3.6,10.5,3.7c9,0.2,18,0.1,27.1,0.1
c3.5,0,4.2-1.2,4.2-4.4c0-7.5,0-14.9,0-22.3c0-3.5-1-4.5-4.5-4.5c-4.9,0-6.4-0.5-6.4-5.8c0.1-9.7-1-8.3,8.9-8.5
c4-0.1,8.1,0,12.1-0.1c3.5,0,4.8,1,4.7,4.5C627.9,138.2,628,146.8,628,155.4z"/>
<path id="path30" class="st2" d="M936.1,125.2c7.5,0,15-0.1,22.4-0.1c4.2,0,4.9,1,4.9,4.8c0.1,10.8,1.5,9.5-9.4,9.6
c-7.8,0-13.3-0.5-15.9,2.7c-2.3,2.8-2.3,9.3-2.3,15.1c0,7.6,0.1,15.2,0,22.9c0,3.7-0.7,4.6-4.5,4.5c-11.2-0.3-9.9,1.5-10-9.9
c-0.2-9.7,0.2-19.3,0.1-29.2c-0.1-4.6-0.8-6.2-6-6.2c-6.2,0-10.7,0.6-14.4,7.5c-2.1,4-7.8,2.6-11.5,1.4c-3.4-1.2-1.6-4-0.8-5.6
c5.1-10.3,10.6-17,23.7-17.4c0.4,0,0.8,0,1.2,0L936.1,125.2z"/>
<path id="path32" class="st3" d="M254.1,220.2c-21.3-2.6-42.4-5.7-63-11.4l-0.5-1.6c7.4-3.6,14.7-7.3,22.1-10.8
c1.2-0.6,2.2,0.4,3.1,1c11.4,8.1,24,14.2,36.5,20.4C253.2,218.2,254.2,218.4,254.1,220.2z"/>
<path id="path34" class="st3" d="M211.5,85.9c21.7,2.4,42.8,5.8,63.5,11.3l0.2,1.6L254,109.5c-1.1,0.5-2.3,0.3-3.2-0.5
c-12-8.7-25.4-14.8-38.4-21.6C212.1,87.3,212,86.8,211.5,85.9z"/>
<path id="path2057" sodipodi:nodetypes="ccccccccccccccc" class="st1" d="M415.1,151.4c-6.8,0.4-11.7-1.4-16.8-2.2
c-12.7-2.1-25.8-1.2-38.1,2.6c-5.1,1.6-8.6,0.5-11-4.2c-0.1-0.2-0.2-0.3-0.3-0.5c-6.4-13.5-12.5-17.5-26.3-19.8
c-3.3-0.6-11.7,0.1-14.6,1.1c-18.1,6.1-33.8,17.6-49.9,28c-8.7,5.6-17.1,11.6-25.7,17.3c-1.5,1-2.7,2.8-5.3,2.4
c0.4-0.9,0.8-1.7,1.2-2.5c13.9-20.6,25.8-37.3,41.7-56.5c3.1-3.7,7.5-7.6,11.3-9.6c9.2-4.8,20.6-4.5,30.5-0.9
C347.3,119.2,381.8,134.2,415.1,151.4L415.1,151.4z"/>
</svg>

After

Width:  |  Height:  |  Size: 5.0 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 460 KiB

61
resource/icons/jcut.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 807 KiB

61
resource/icons/jcut1.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 807 KiB

122
resource/icons/zju-dark.svg Normal file
View File

@@ -0,0 +1,122 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_2" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 311.68 69.84">
<g id="_图层_1" data-name="图层 1">
<g>
<g>
<path d="m82.6,64.77h5.21v.55h-6.11v-.19l5.27-7.96h-4.85v-.55h5.78v.16l-5.29,8Z" style="fill: #fff;"/>
<path d="m98.31,65.31v-4.18h-4.98v4.18h-.6v-8.71h.6v3.98h4.98v-3.98h.6v8.71h-.6Z" style="fill: #fff;"/>
<path d="m103.63,65.31v-8.71h4.07v.55h-3.47v3.49h3.22v.55h-3.22v3.57h3.67v.55h-4.27Z" style="fill: #fff;"/>
<path d="m115.17,62.31c0,2.1-.73,3.15-2.19,3.15-.23,0-.45-.03-.66-.09v-.58c.24.08.46.12.67.12.56,0,.96-.21,1.21-.63.25-.42.37-1.08.37-1.98v-5.69h.59v5.71Z" style="fill: #fff;"/>
<path d="m119.85,65.31v-8.71h.6v8.71h-.6Z" style="fill: #fff;"/>
<path d="m131.34,65.31l-1-2.71h-3.78l-1,2.71h-.66l3.28-8.71h.57l3.25,8.71h-.67Zm-2.67-7.29c-.04-.12-.08-.24-.11-.36-.03-.1-.06-.2-.09-.3h-.02c-.07.27-.14.48-.2.65l-1.46,4.04h3.36l-1.47-4.02Z" style="fill: #fff;"/>
<path d="m142.87,65.31l-5.19-7.04c-.11-.14-.2-.28-.28-.43l-.08-.12h-.02c0,.11.01.23.01.38v7.2h-.6v-8.71h.46l5.15,6.98c.11.15.24.34.37.56h.03c-.02-.28-.03-.53-.03-.73v-6.81h.6v8.71h-.42Z" style="fill: #fff;"/>
<path d="m154.52,64.71c-.9.51-1.82.76-2.77.76-1.19,0-2.15-.4-2.88-1.21-.73-.8-1.1-1.86-1.1-3.17s.39-2.42,1.18-3.3c.79-.88,1.84-1.32,3.16-1.32.77,0,1.51.15,2.23.46v.66c-.79-.38-1.56-.57-2.31-.57-1.1,0-1.98.38-2.64,1.12-.67.75-1,1.7-1,2.87,0,1.22.31,2.18.94,2.87.62.69,1.47,1.04,2.53,1.04.79,0,1.47-.17,2.06-.51v-2.87h-2.05v-.55h2.65v3.72Z" style="fill: #fff;"/>
<path d="m172.33,61.84c0,2.42-1.03,3.63-3.1,3.63s-2.94-1.17-2.94-3.5v-5.36h.6v5.28c0,2.02.82,3.03,2.46,3.03s2.39-.98,2.39-2.95v-5.36h.6v5.23Z" style="fill: #fff;"/>
<path d="m183.1,65.31l-5.19-7.04c-.1-.14-.2-.28-.28-.43l-.08-.12h-.02c0,.11.01.23.01.38v7.2h-.6v-8.71h.46l5.15,6.98c.11.15.24.34.37.56h.03c-.02-.28-.03-.53-.03-.73v-6.81h.6v8.71h-.42Z" style="fill: #fff;"/>
<path d="m188.19,65.31v-8.71h.6v8.71h-.6Z" style="fill: #fff;"/>
<path d="m197.02,65.31h-.45l-3.18-8.71h.67l2.52,7.01c.1.29.18.57.22.83h.02c.04-.21.12-.49.25-.84l2.68-7h.64l-3.38,8.71Z" style="fill: #fff;"/>
<path d="m205.01,65.31v-8.71h4.07v.55h-3.47v3.49h3.22v.55h-3.22v3.57h3.67v.55h-4.27Z" style="fill: #fff;"/>
<path d="m218.41,65.31l-1.16-2.55c-.24-.53-.48-.88-.72-1.06-.24-.18-.54-.27-.9-.27h-1.08v3.88h-.6v-8.71h2.42c.77,0,1.37.21,1.81.62.44.42.66.96.66,1.64,0,.63-.18,1.15-.54,1.57-.36.42-.86.69-1.51.81v.02c.34.14.68.56,1.01,1.26l1.29,2.77h-.68Zm-3.85-8.15v3.73h1.5c.66,0,1.19-.17,1.58-.52.39-.35.59-.83.59-1.43,0-.55-.18-.99-.53-1.3-.35-.31-.86-.47-1.51-.47h-1.63Z" style="fill: #fff;"/>
<path d="m223.82,65v-.69c.62.4,1.25.6,1.89.6.68,0,1.2-.14,1.55-.42.35-.28.53-.67.53-1.18,0-.44-.12-.8-.36-1.07-.24-.26-.75-.63-1.54-1.08-.88-.51-1.44-.94-1.68-1.29-.23-.35-.35-.75-.35-1.2,0-.62.24-1.14.72-1.57.48-.43,1.12-.64,1.91-.64.52,0,1.04.09,1.55.26v.63c-.51-.23-1.05-.35-1.63-.35s-1.06.15-1.41.45c-.35.3-.52.68-.52,1.14s.12.8.36,1.06c.24.26.75.62,1.53,1.07.81.46,1.35.87,1.62,1.23.27.36.4.77.4,1.24,0,.67-.23,1.21-.69,1.63-.46.42-1.12.63-1.96.63-.3,0-.64-.05-1.04-.14-.39-.09-.69-.2-.9-.32Z" style="fill: #fff;"/>
<path d="m233.01,65.31v-8.71h.6v8.71h-.6Z" style="fill: #fff;"/>
<path d="m241.19,57.16v8.15h-.6v-8.15h-2.51v-.55h5.62v.55h-2.51Z" style="fill: #fff;"/>
<path d="m251.43,62v3.31h-.59v-3.3l-2.67-5.41h.67l2.03,4.2c.07.15.16.36.27.64h.02c.06-.15.16-.36.3-.63l2.12-4.21h.65l-2.81,5.4Z" style="fill: #fff;"/>
</g>
<line x1="81.29" y1="34.19" x2="309.03" y2="34.19" style="fill: #fff; stroke: #fff; stroke-miterlimit: 10; stroke-width: .74px;"/>
<g>
<path d="m152.49,26.66c-1.06-.23-.43-.56-.6-1.47-.14-.78-.85-1.55-.83-2.13.06-1.56,2.06-1.46,3.28-.96.22.09.47.42.69.74.56.8,1.21,1.97.35,2.85-.75.76-1.97,1.17-2.89.97" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m140.42,25.04s-.07-.03-.1-.04c.01-.12.02-.23.03-.34.33-.13,3.22-2.01,3.21-2.09.84-.67,1.6-1.42,1.83-2.49-2.07.68-4.03,2.18-6.17,2.34-.99-.25-1.67-.79-2.37-1.09,0-.05,0-.09,0-.12-1.13-.74-1.24-1.69.01-2.11,2.16.48,5.46-1.06,7.49-1.84.46-.2,1.77-.67,2.12-1.08.48-2.85.17-5.7.34-8.42.69-1.97,1.92-.63,3.14.36.08.16.36.34.61.71.03,0,.07,0,.12,0,.52.82.66,1.2-.14,1.96-.54,1.34-.8,2.82-.73,4.36,1.48-.21,2.38-1.51,4.09-1.53.41.8.36,1.47-.4,2.13-1.25.6-2.61,1.14-4.03,1.78-.33,1.44-.9,3.2-1.91,4.37-.15.17-.88.85-1.06.95-.92.54-1.75,1.18-2.75,1.47-2.78.77-2.81.64-3.32.71" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m113.83,29.89c-1.02-.47-1.95-1.71-2.51-2.48.09-.27.19-.55.3-.8,2.41-1.81,4.8-3.48,6.99-5.64.66-1.02,1.53-2.08,2.24-3.09.03-.02.08-.04.12-.04,0-.05,0-.08,0-.11.62-.48.88-.61,1.4.18.04.66-1.15,1.37-1.52,1.99-.46,1.18-.99,2.38-1.59,3.58q-.19.22-.96,1.48c-.65.5-1.51,1.81-1.87,2.61-.76.44-1.09,1.79-2,2.26-.21.01-.39.04-.58.07" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m128.07,21.44c-1.49-.06-1.91-1.02-2.72-1.88-.02-.39.21-.63.24-.9q.37-.09.6-.23c.62-.09.85-.05,1.52-.09.86-.19,3.05-1.7,3.78-1.05.11,1.81-1.86,3.63-3.43,4.15" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m116.65,18.59c-.57-.5-.68-2.79-.73-3.52.42-1.29,1.72-1.34,2.8-.5.86,1.13,1.44,1.6.54,2.91-1.02.88-1.47.94-2.61,1.11" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m127.67,17.47c-.15-.7.81-2.19.53-2.55-.36.05-.73.19-1.11.21-.89-.43-1.88-1.52-1.52-2.36.66-.75.41-.56,1.44-.62.99-.44,1.97-.87,2.97-1.29,1.67-.31,2.44.61,2.54,2.24-.3,1.06-1,1.89-1.69,2.72-.89.48-1.69,1.02-2.49,1.54-.23.03-.45.08-.67.12" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m118.54,12.75c-.35-.31-.2-.48-.02-.79-.04-.69-.46-1.25-.5-1.91.22-1.21,0-1.66,1-2.24.78.35,3.5,1.73,2.85,3.26-.75.95-2.26,1.55-3.33,1.68" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m83.32,31.02c-1.62-.62-3.03-3.82-1.08-4.61.05-.28.29-.57.53-.65,0-.05,0-.09,0-.12,1.57-1.52,2.6-3.64,3.92-5.32.34-.64.52-1.25,1.25-1.43.36.32.24,1.05.13,1.61.16.14.72.04,1.06-.07,1.09-.94,2.51-1.77,3.6-2.76.06-.49.11-.97.19-1.44-.76.18-3.26.77-2.66-.64.94-.37,2.36-1.17,2.86-2.19.24-1.03.11-2.17.62-2.9,1.05-.54,2.29.79,2.5,1.92.42.75,1.74-.18.1,2.12-.35.26-.33.76-.26,1.28.12,0,.24.02.36.03.92-.66,1.92-1.37,2.96-1.97.29-1.48.52-2.71,1.23-3.95,1.02-.7,2.4.06,3.4.85.77-.05,1.25-.37,1.93-.88q.27-.08.78-.08c.21.36.29.74.32,1.28-.49,1.5-4.79,1.99-3.97,3.74.75-.05,1.01-.87,1.29-1.42.84-.45,2.66.09,3.54.74.98,1.19.22,1.6-.87,2.35-.11.16-.22.32-.31.48q-.07,2.41-.04,5.66c-.37.88-.64,1.31-1.32,2.02,0,.03,0,.07,0,.1-.05,0-.09,0-.12,0-.42.73-1.44,1.44-2.04.76-.01-2.67.14-5.44.05-7.99-.05,0-.1.02-.13.04-.19,1.3-1.5,3.75-2.61,4.55-1.03.06-1.89-.53-2.18-1.41.1-.26.31-.33.52-.51.58-1.18.41-3.37.4-4.53-.83.12-2.24,2.01-2.87,2.71-.42.33-.85.67-1.26,1.01-.3.99-.53,1.97-.79,3.03-.23.47-.46.97-.68,1.46-.05,0-.09,0-.12,0-.39.66-1.65,2.38-2.4,1.3,0-.15-.02-.29,0-.43.63-.93,1.11-2.23,1.13-3.29-1.03.34-1.7,1.27-2.73,1.33-.59-.12-1.18-.3-1.57-.5,0-.05,0-.09,0-.12-.25-.16-.5-.38-.65-.32-.19.58-.37,1.17-.54,1.77-1.06,2.21-1.84,4.38-2.52,6.8-.39.38-.52.44-.93.54" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m85.34,18.3c-.32-.46.07-1.07.09-1.6-.5-1.51-.9-2.64.06-3.91.15-.03.31-.03.46-.05.7.49,1.69,1.61,2.29,2.41.73,1.81-1.6,2.62-2.91,3.15" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m86.79,12.45c-.38-.13-.37-.22-.45-.35.18-.37.36-.59.28-.96-.93-1.42-.87-3.58.73-4.3.47.05.47.45.68,1.09,1.04,1.01,2.98,2.27,1.14,3.64-.78.34-1.62.61-2.39.88" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m164.01,17.99c-1.45-.45-1.17-2.83-.93-3.79,1.06-.67,2.45.73,2.52,1.97-.27,1.37-.26,1.57-1.59,1.82" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m171.85,28.96c-.05-.03-.09-.06-.13-.08-1.85.12-3.62-.06-5.28-.65q-.08-.14-.09-.37c.98-.57,2.36-.41,3.1-1.44.12-.8.21-1.48.13-2.17-1.84.12-2.82,1.41-4.27,1.94-1.24.08-3.46-1.05-3.83-2.04,0-1.6.33-.88,2.05-.99,2.04-.36,4.08-1.53,6.05-2.4q.42-.32.65-.41c.44-1.33.75-1.57,2.13-1.84q.54-.27,2.12-1.23c.04-.15.08-.31.14-.46-2.4.28-4.34,2.23-6.25,3.51-.95.26-1.67.1-2.33-.19-.42.06-2.81.48-1.65-.47.71-.28,1.25-.79,2.01-1.12,1.8-1.21,3.88-2.25,5.82-3.37-.02-.3-.13-.46-.19-.55,0-.41.08-.61.2-.92-.37.12-.47.1-.53.37-1.15.51-1.64,1.55-2.61.45-.26,1.01-.98,1.71-1.99,1.78-1.03-.53-1.05-2.25-1.24-3.05-.07-.09-.22-.76-.5-1.54-.47-.95-1.32-2.01-.75-2.87.73-.45,1.02-.62,1.64.37.53.41,1.21.95,1.74,1.66.04,0,.07,0,.12,0,.33.87,1.12,2.02,1.04,3.14.54-.32,1.31-.94.91-1.63-.89-.48-.39-1.31.24-1.62q.44.02,1.01-.03c-.01-.22-.03-.22-.14-.35-.74-.25-.6-.43-.4-1.04-.87-.32-1.19-1.23-.86-1.87q2.51-.63,3.69-1.01c.78-.97,1.63-3.64,3.15-3.15.47.56.8,1.5.71,2.44-.19.4-.46.74-.53,1.18.15-.01.3,0,.45,0,1.05-.52,1.54-1.14,2.16.42,1.01.55,1.38.41,1,1.88-.74,1.48-1.53,3.07-2.35,4.55-.01.07-.03.14-.02.2.19.04.37.08.56.14.11.67.13,1.49.11,2.31-.63.93-1.43.93-2.44,1.06-1.28.64-2.43,1.17-3.63,1.88,0,.24-.04.48.08.79.61-.02,1.23-.02,1.86-.03.69.45.63,1.7.2,2.43-.7.1-1.12.19-1.66.48-.06.34-.13.68-.19,1.04.05,1.33.74,4.54-1.23,4.85m3.93-16.41c.62-.63,1.05-1.25,1-2.11-.52-.45-1.42-.52-1.96-.49q-.07.24-.69,1.4c.05.03.12.06.19.09-.06.02-.13.04-.18.08,0,.03.02.06.04.11.27.04.43-.18.55-.37.97-.16.99.19.92,1.22.04.02.07.03.12.06" style="fill: #fff; fill-rule: evenodd;"/>
</g>
<g>
<path d="m34.92,0c19.23,0,34.92,15.69,34.92,34.92s-15.69,34.92-34.92,34.92S0,54.16,0,34.92,15.69,0,34.92,0m0,1.39C16.46,1.39,1.39,16.46,1.39,34.92s15.06,33.53,33.53,33.53,33.53-15.06,33.53-33.53S53.39,1.39,34.92,1.39" style="fill: #fff;"/>
<path d="m22.66,49.81c-2.18-1.81-3.97-4.09-5.2-6.68-1.18-2.49-1.84-5.27-1.84-8.21,0-10.63,8.67-19.3,19.3-19.3s19.3,8.67,19.3,19.3c0,2.93-.66,5.72-1.84,8.21-1.22,2.59-3.01,4.87-5.2,6.68l-.44-.54c2.11-1.75,3.83-3.94,5.01-6.44,1.13-2.4,1.77-5.09,1.77-7.91,0-10.25-8.36-18.61-18.61-18.61s-18.61,8.36-18.61,18.61c0,2.83.64,5.51,1.77,7.91,1.18,2.49,2.9,4.69,5.01,6.44l-.44.54Z" style="fill: #fff;"/>
<polygon points="5.02 46.59 3.7 43.05 4.42 42.8 10.46 43.72 9.53 41.24 10.25 40.99 11.45 44.23 10.74 44.47 4.7 43.56 5.73 46.33 5.02 46.59" style="fill: #fff; fill-rule: evenodd;"/>
<polygon points="7.31 51.4 6.95 50.69 9.79 49.24 8.89 47.49 6.05 48.94 5.69 48.23 11.76 45.12 12.12 45.82 9.56 47.13 10.46 48.89 13.02 47.57 13.38 48.28 7.31 51.4" style="fill: #fff; fill-rule: evenodd;"/>
<polygon points="10.19 55.24 8.04 52.23 13.73 48.69 15.78 51.56 15.15 51.96 13.58 49.77 11.82 50.87 13.26 52.88 12.62 53.27 11.19 51.26 9.16 52.52 10.83 54.85 10.19 55.24" style="fill: #fff; fill-rule: evenodd;"/>
<polygon points="15.03 59.98 14.31 59.37 18.5 54.22 19.22 54.83 15.03 59.98" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m18.28,62.24l.86-1.83-1.04-.75-1.55,1.51-.71-.55,4.91-4.85.99.6-2.62,6.34-.84-.47Zm1.25-2.72l1.02-2.35-.09-.08-1.77,1.81.84.62Z" style="fill: #fff; fill-rule: evenodd;"/>
<polygon points="23.2 64.62 22.31 64.21 22.83 59.48 20.89 63.46 20 63.05 23.08 56.96 23.88 57.33 23.51 61.82 25.51 58.11 26.25 58.42 23.2 64.62" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m27.78,65.99l-.57-.19.05-.54c-.13.11-.31.19-.53.22-.22.04-.44.02-.67-.06-.47-.15-.82-.52-1.05-1.11-.23-.59-.18-1.4.14-2.43.35-1.13.78-1.91,1.28-2.35.5-.44,1.28-.68,1.96-.47.73.23,1.21,1.14,1,2.38l-.87-.07c.15-.53.07-1.37-.45-1.54-.43-.14-.9,0-1.2.33-.3.34-.6.97-.88,1.91-.27.89-.35,1.53-.23,1.94.12.41.33.66.62.76.29.09.56.06.8-.12.24-.17.43-.5.58-.98l.12-.4-1.05-.34.22-.68,1.72.56-.98,3.17Z" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m36.86,64.48c-.02.62-.19,1.1-.49,1.44-.31.35-.78.51-1.42.48-.64-.02-1.11-.22-1.39-.59-.28-.37-.41-.86-.4-1.48l.15-4.65.82.04-.15,4.65c-.02.44.07.76.26.97.18.21.43.32.74.34.31.01.56-.08.76-.28.2-.2.3-.51.32-.95l.15-4.65.82.03-.15,4.65Z" style="fill: #fff; fill-rule: evenodd;"/>
<polygon points="41.52 65.72 40.79 65.84 38.48 61.4 38.84 66.17 37.97 66.29 37.46 59.61 38.46 59.52 40.36 62.63 40.01 59.28 40.73 59.15 41.52 65.72" style="fill: #fff; fill-rule: evenodd;"/>
<polygon points="44.01 65.03 43.16 65.29 41.38 58.97 42.23 58.7 44.01 65.03" style="fill: #fff; fill-rule: evenodd;"/>
<polygon points="46.32 57.02 47.4 64 46.56 64.41 42.86 58.49 43.68 58.14 46.25 62.18 45.53 57.36 46.32 57.02" style="fill: #fff; fill-rule: evenodd;"/>
<polygon points="53.19 60.97 50.07 62.66 46.67 56.82 49.64 55.22 50.02 55.87 47.75 57.09 48.81 58.9 50.89 57.78 51.26 58.42 49.19 59.55 50.4 61.63 52.81 60.32 53.19 60.97" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m56.74,58.48l-.69.59-2.42-2.01-.62.57,1.63,2.22-.69.71-4-5.62,1.27-.91c.41-.29.94-.5,1.43-.44,1.24.15,1.78.99,1.72,1.96-.02.31-.04.61-.16.91l2.52,2Zm-4.31-3.96c-.51-.13-.91.26-1.27.54l1.33,1.76c.41-.3.59-.36.9-.89.13-.64-.15-1.2-.96-1.41" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m58.9,53.05c1.4.84,1.07,3.22-.76,3.5-.49.07-1.08-.08-1.32-.23l.31-.71c.3.06.61.18.9.12,1.19-.23,1.14-1.46.44-1.97-.24-.18-.58-.2-.87-.17-.8.09-1.32.69-2.21.75-.97.06-1.65-.54-1.82-1.49-.08-.5.04-.99.29-1.38.51-.81,1.61-.92,2.41-.45l-.31.73c-.43-.22-1.2-.22-1.49.23-.15.23-.2.48-.16.72.1.54.46.86.98.79.87-.1,1.45-.81,2.3-.79.4.01.88.11,1.29.36" style="fill: #fff; fill-rule: evenodd;"/>
<polygon points="61.85 52.19 61.35 52.81 55.59 49.2 56.09 48.58 61.85 52.19" style="fill: #fff; fill-rule: evenodd;"/>
<polygon points="58.94 44.91 58.31 46.09 63.74 49.29 63.37 49.96 57.94 46.77 57.3 47.95 56.63 47.55 58.27 44.51 58.94 44.91" style="fill: #fff; fill-rule: evenodd;"/>
<polygon points="59.94 40.42 63.25 43.38 65.47 44.33 65.2 45.08 63.15 44.28 58.43 44.18 58.65 43.42 61.95 43.47 59.62 41.33 59.94 40.42" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m14.52,57c-.59.59-1.13.89-1.64.91-.51.02-.97-.19-1.38-.61-.37-.38-.56-.83-.56-1.34,0-.26.08-.53.23-.8l.75.46c-.07.13-.1.25-.1.37,0,.28.08.51.26.69.25.26.52.37.79.35.28-.02.61-.23,1.01-.63l3.32-3.29.62.63-3.29,3.25Z" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m25.81,55.85l-2.32-1.44.21-.37.86.53,1.38-2.41-.87-.54.19-.32c.33.2.59.32.78.34.19.03.36-.05.49-.24l.5.31-1.86,3.23.84.53-.21.36Zm6.94-1.47c.04-.19-.02-.35-.19-.5-.17-.15-.42-.25-.76-.3-.31-.04-.58-.02-.8.06-.22.08-.35.22-.39.41-.03.14,0,.26.08.37.08.11.21.21.4.32.08.04.21.11.38.19.17.08.33.14.47.2.27-.09.46-.19.58-.31.12-.12.19-.26.23-.43m-.3,2.08c.03-.17.01-.31-.07-.42-.08-.12-.26-.24-.54-.39-.09-.04-.21-.09-.36-.16-.15-.06-.33-.14-.52-.22-.26.07-.46.17-.62.3-.15.12-.25.29-.29.48-.05.25.03.47.23.67.2.19.47.32.83.37.36.05.66.02.91-.09.25-.11.39-.28.44-.52m-1.44,1.02c-.32-.04-.6-.11-.85-.21-.25-.1-.45-.22-.61-.35-.16-.14-.27-.29-.33-.45-.06-.17-.07-.33-.04-.5.04-.22.18-.41.4-.58.22-.16.52-.27.89-.33v-.02c-.29-.16-.49-.32-.62-.48-.12-.16-.16-.35-.12-.55.06-.31.29-.54.7-.7.41-.16.89-.19,1.44-.12.58.08,1.03.24,1.34.49.31.24.43.52.37.82-.04.19-.16.36-.36.51-.2.16-.47.26-.81.32v.02c.34.16.6.34.76.52.16.19.21.41.16.66-.07.35-.33.62-.77.8-.45.18-.96.23-1.56.15m8.05-2.55c0-.28-.04-.51-.12-.69-.08-.18-.19-.32-.32-.42-.12-.08-.25-.15-.38-.18-.12-.03-.26-.05-.41-.05-.35,0-.62.08-.82.24-.21.17-.31.41-.31.72,0,.17.03.32.1.44.07.11.18.21.33.29.1.06.23.1.36.12.13.02.28.03.43.03.18,0,.38-.02.58-.06.21-.04.39-.1.54-.17,0-.03,0-.06.01-.11,0-.05,0-.1,0-.16m-3.22-.35c0-.22.06-.42.16-.59.11-.18.25-.33.43-.46.18-.12.39-.22.64-.29.25-.07.5-.11.76-.11.29,0,.55.04.78.1.24.06.43.16.61.28.22.15.38.35.5.6.12.25.18.57.18.95,0,.34-.06.67-.18.98-.12.31-.29.57-.52.78-.24.21-.53.38-.87.49-.34.11-.76.17-1.25.17-.11,0-.23,0-.36-.01-.13-.01-.25-.03-.36-.05v-.54h.04c.07.03.18.06.33.08.15.02.3.03.45.03.55,0,.98-.12,1.3-.36.31-.24.49-.58.53-1.03-.22.1-.44.18-.64.22-.2.05-.43.07-.67.07s-.44-.02-.63-.05c-.19-.03-.38-.1-.57-.2-.23-.11-.4-.26-.51-.43-.12-.18-.17-.38-.17-.63m9.12-3.58l-.15,4.31-.66.41.06-4.07-2.52,1.22-.22-.49,3.16-1.64.33.26Z" style="fill: #fff; fill-rule: evenodd;"/>
<g>
<path d="m46.32,16.13c-.51-.25-.15-.34-.12-.81.02-.41-.24-.88-.16-1.17.22-.78,1.22-.48,1.77-.08.1.07.19.26.26.46.18.47.36,1.14-.18,1.47-.47.3-1.13.35-1.57.14" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m40.45,13.84s-.03-.02-.04-.04c.02-.06.04-.12.05-.16.18-.03,1.86-.62,1.87-.66.51-.23.97-.52,1.23-1.03-1.12.08-2.29.6-3.38.42-.47-.25-.75-.6-1.06-.84,0-.02,0-.04.01-.06-.48-.51-.41-1,.27-1.05,1.02.5,2.87.13,3.98,0,.25-.05.97-.12,1.2-.29.59-1.37.78-2.84,1.2-4.19.59-.9,1.04-.08,1.53.57.02.09.14.21.22.43.02,0,.03,0,.06.01.16.47.18.68-.31.96-.43.6-.75,1.31-.9,2.1.77.08,1.38-.46,2.24-.27.11.45,0,.79-.46,1.02-.7.15-1.45.25-2.24.4-.34.68-.84,1.5-1.5,1.96-.09.07-.55.32-.65.35-.53.16-1.02.37-1.56.4-1.49.05-1.49-.02-1.75-.04" style="fill: #fff; fill-rule: evenodd;"/>
</g>
<g>
<path d="m23.44,18.81c-.62-.04-1.34-.48-1.78-.77,0-.16-.02-.32-.01-.47.87-1.41,1.76-2.76,2.44-4.3.13-.66.36-1.38.52-2.04.01-.01.03-.03.05-.05-.01-.02-.02-.04-.02-.05.22-.37.33-.49.75-.19.15.33-.31.93-.38,1.32,0,.7-.03,1.42-.09,2.16q-.05.15-.19.95c-.23.39-.41,1.24-.44,1.71-.3.38-.2,1.14-.57,1.57-.1.04-.19.1-.28.15" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m29.04,11.6c-.78.26-1.18-.13-1.77-.41-.09-.2-.02-.37-.06-.51q.17-.12.26-.24c.3-.17.42-.2.76-.36.4-.27,1.22-1.49,1.73-1.31.42.91-.22,2.24-.92,2.83" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m22.6,12.44c-.39-.14-.91-1.3-1.08-1.66-.04-.74.61-1.03,1.33-.82.67.41,1.06.53.87,1.39-.34.65-.56.78-1.11,1.1" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m28.03,9.65c-.22-.33-.03-1.28-.24-1.41-.18.1-.34.24-.53.33-.55-.04-1.27-.41-1.26-.91.19-.52.1-.37.61-.61.42-.42.83-.83,1.26-1.26.79-.49,1.37-.18,1.75.63.06.61-.13,1.17-.32,1.74-.36.43-.66.86-.97,1.29-.12.07-.22.13-.32.2" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m22.39,9.07c-.24-.09-.2-.2-.17-.4-.16-.34-.49-.55-.64-.88-.13-.67-.34-.85.06-1.35.47.02,2.15.18,2.12,1.1-.19.63-.84,1.24-1.37,1.53" style="fill: #fff; fill-rule: evenodd;"/>
</g>
<path d="m13.81,32.08c-.72.5-2.47.17-2.24-.87-.1-.1-.15-.29-.12-.41-.02-.01-.04-.02-.05-.03-.18-1.09-.77-2.14-1.1-3.16-.17-.33-.37-.58-.24-.93.24-.06.51.2.71.4.11-.03.23-.29.27-.46-.08-.72-.02-1.55-.12-2.29-.19-.16-.37-.33-.55-.49-.15.37-.62,1.58-1.03.93.11-.5.18-1.32-.1-1.83-.36-.39-.87-.66-1.03-1.09.07-.6.99-.74,1.52-.51.43.04.43-.77.92.57.01.22.22.35.46.48.04-.05.08-.09.11-.14,0-.58-.02-1.2.03-1.81-.53-.54-.98-.99-1.3-1.64,0-.62.71-.99,1.33-1.18.2-.34.2-.62.19-1.06q.04-.14.19-.35c.21.01.39.09.63.23.49.64-.54,2.58.43,2.74.2-.33-.08-.67-.22-.95.06-.48.8-1.08,1.33-1.26.78-.07.73.36.73,1.03.04.1.07.19.11.27q.99.72,2.35,1.64c.26.41.37.64.47,1.13.01,0,.03.02.04.03-.01.02-.02.04-.03.06.19.38.19,1.01-.27,1.07-1.12-.76-2.23-1.62-3.33-2.32-.01.03-.02.05-.02.07.49.46,1.14,1.7,1.15,2.4-.27.45-.76.63-1.21.51-.08-.12-.05-.22-.07-.36-.33-.58-1.29-1.14-1.78-1.47-.19.38.19,1.51.31,1.98.02.27.04.54.06.81.33.41.68.79,1.04,1.2.13.23.27.47.42.7-.01.02-.02.03-.03.05.16.35.52,1.37-.15,1.37-.06-.04-.12-.07-.18-.12-.21-.53-.61-1.1-1.05-1.42-.16.52.04,1.08-.23,1.52-.22.21-.47.41-.66.52-.02-.01-.04-.02-.05-.03-.14.06-.3.1-.32.18.19.24.38.49.58.73.62,1.08,1.31,2.02,2.12,3.01.05.27.04.35-.04.54" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m9.07,27.59c-.28,0-.43-.33-.64-.5-.78-.22-1.36-.38-1.62-1.15.03-.07.07-.14.11-.2.4-.15,1.16-.24,1.66-.27.97.21.64,1.42.48,2.12" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m7.04,25.3c-.17.12-.2.09-.28.09-.1-.18-.14-.32-.32-.39-.86-.03-1.75-.67-1.59-1.54.16-.18.32-.07.65.03.72-.15,1.8-.6,1.84.57-.07.42-.21.85-.31,1.25" style="fill: #fff; fill-rule: evenodd;"/>
<path d="m51.32,26.41h-8.49c-2.48,0-3.75,2.42-4.69,4.62l-1.43-3.22,2.4-.88c-1.41-1.33-5.79-2.06-6.37-.05l-1.03,4.16c-.82-1.88-1.97-4.62-4.56-4.62h-8.62c1.12,1.98,2.19,2.7,6.16,2.53l.52,1.36-4.35.02c1.28,2.37,2.02,2.47,5.52,2.37l.74,1.63-3.42.12c.73,1.67,1.51,2.39,4.44,2.26l.57,1.45h-2.72c1.02,1.7,1.52,2.47,3.68,2.28l.58,1.58h-1.88c.81,1.82,1.76,1.89,2.92,2.08,1.04.16,1.19,2.11-.02,2.74l3.66,5.93,3.66-5.94c-1.22-.63-1.07-2.58-.02-2.74,1.16-.18,2.11-.25,2.92-2.08h-1.88l.58-1.58c2.15.19,2.66-.58,3.68-2.26h-2.72s.57-1.46.57-1.46c2.93.13,3.71-.58,4.44-2.26l-3.42-.12.74-1.63c3.5.1,4.24,0,5.52-2.37l-4.35-.02.52-1.37c3.96.17,5.03-.54,6.16-2.52" style="fill: #fff;"/>
<path d="m64.25,22.34l.03-.07c.12-.31.11-.43.08-.49-.04-.07-.17-.11-.38-.16-.06-.02-.12-.02-.2-.03l-.12-.02-.04-.08s-.08-.08-.14-.12l-.16-.06-.04-.02.21-.16c.15-.12.32-.17.51-.23l.02-.05.08.03c.3-.26.5-.64.53-1.04-.09-.12-.25-.18-.48-.18-.3,0-.66.12-.98.21-.2.07-.44.14-.66.19l-.08-.04c-.54-.26-.57-.27-1.7-.87-.08.06-.15.13-.18.23-.07.16-.06.35.03.52l.11.08h0s0,.01,0,.01l-.27.14c-.06.04-.08.04-.07.04h0l-.08.07s.02.08.07.15l.02.12c0,.11-.02.15-.11.25l-.03.13h0v.02l-.16-.13c-.22-.17-.24-.19-.4-.34-.04,0-.09-.01-.14-.01-.12,0-.22.04-.27.11-.05.07-.04.15,0,.27l-.02.06c-.04.16-.17.44-.68.45h-.26s-.1,0-.18.04c0,.34.15.37.51.43.14.02.28.04.48.09.03-.01.07-.02.1-.02.08,0,.14.03.21.06l.27.11.1.03.05.02-.33.16c-.12.07-.21.11-.33.24-.02.09-.07.18-.15.28v.07s-.15-.03-.15-.03c-.24-.06-.49-.12-.73-.18l-.38-.1c-.67-.18-1.49-.39-2.27-.53-.19-.07-.36-.1-.54-.13l-.37-.04-.02.1c.09.07.21.16.4.28l.02.06c.11.26.28.57.69.8.27.05.55.09.88.12.97.11,1.98.23,2.76.82l.21.1h.05s0,0,0,0h0l-.29.15c-.07.04-.14.08-.23.16l-.09-.02q-.94-.21-1.27-.32c-.34-.22-.5-.29-.68-.29-.14,0-.3.06-.56.22-.02,0-.03.01-.04.02h-.01s-.02.02-.02.03l-.1-.04c-.1-.04-.11-.04-.39-.08-.26-.09-.53-.18-.81-.27-.81-.26-1.65-.54-2.34-1-.2-.17-.34-.33-.45-.46-.04-.05-.06-.07-.08-.07h0l-.07-.08c-.05.01-.14.09-.28.24-.15.46.27,1.56.64,1.88.26.12.54.17.84.22.49.09,1,.18,1.49.59l.13.03h.01s-.12.17-.12.17c-.16.21-.35.38-.56.58l-.09.08c-.06.05-.12.1-.17.16h-.09c-.07.02-.13.03-.21.03-.36,0-.67-.17-.94-.33-.09-.05-.18-.09-.31-.13l-.05.09c.37.65.89,1.24,1.58,1.81l.06.1c.08.05.17.07.25.07h.01c.49-.01,1.02-.68,1.42-1.18.08-.1.16-.21.25-.3l.1-.07c.37-.27.4-.29.38-.29l.09.02c.31.09.51.21.81.37.29-.13.59-.42.56-.74l-.12-.11c-.18-.16-.35-.32-.53-.48l-.09-.02.06-.15c.07-.16.16-.25.29-.38l.02-.07.12.03c.53.12,1,.27,1.58.44l.5.17.12.09c.29.22.5.38.83.38.05,0,.1,0,.18-.04.31-.32.49-.53.61-.78h0s0-.01,0-.02c-.1-.14-.14-.18-.16-.18l.09-.11s.06-.06.15-.11c.85-.27,1.78-.61,2.46-.85.41-.25.45-.28.31-.66-.03-.06-.06-.14-.11-.24m-3.32.51l.14-.12c.19-.18.28-.26.29-.35,0-.03-.05-.08-.13-.14h-.04s-.05,0-.09,0c-.15,0-.25-.07-.3-.14l-.06-.05v-.07s.06-.18.06-.18h-.03s.19-.07.19-.07q.63-.21.73-.27l.05-.08.12.1c.13.12.57.51.64,1.02l-.06.07c-.33.4-.79.46-1.22.48l-.12.03-.06-.18-.08-.05h0Z" style="fill: #fff;"/>
<path d="m57.3,21.35c-.19,0-.37-.06-.53-.17-.1-.41.2-.84.42-1.16.07-.11.13-.19.18-.26l.04-.1.07-.14c.09-.17.18-.34.26-.53.03-.1.06-.2.08-.29.13-.53.23-.86.5-.95.21.03.31.06.36.14.05.08.03.18,0,.38l-.03.08c.03.06.04.16.05.25.06.31.07.64.04.93v.12c-.03.12-.06.21-.1.32-.12.37-.26.8-.54,1.05l-.11.11-.08.04c-.19.12-.39.19-.59.19h-.02Z" style="fill: #fff;"/>
<path d="m57.3,21.34h.02c.19,0,.39-.07.58-.19l.07-.04.11-.1c.27-.25.41-.67.53-1.05.03-.1.07-.2.08-.31l.02-.12c.03-.33.01-.64-.04-.93-.01-.09-.02-.18-.04-.26h-.01l.03-.07c.04-.19.06-.3.01-.37-.05-.07-.14-.1-.34-.13-.26.09-.36.41-.48.91-.03.1-.06.2-.09.32-.08.19-.17.36-.26.53l-.08.14-.04.09c-.04.08-.1.16-.18.26-.22.32-.52.75-.42,1.14.16.11.33.17.52.17" style="fill: #fff;"/>
<path d="m55.43,20.87c-.09,0-.21-.05-.43-.19-.29-.64.74-1.38.86-1.46.17.04.26.13.32.29.12.33.03.79-.19,1.05-.31.22-.44.31-.56.31h0Z" style="fill: #fff;"/>
<path d="m55.43,20.85h0c.11,0,.24-.09.54-.3.22-.26.3-.72.19-1.04-.05-.15-.14-.24-.29-.28-.12.08-1.13.81-.86,1.43.21.13.33.19.42.19" style="fill: #fff;"/>
</g>
</g>
<g>
<path d="m190.2,14.25c.78-1.6,1.42-3.26,1.9-4.98l1.48.42c-.4,1.41-.89,2.79-1.46,4.14v13.32h-1.48v-10.4c-.54.88-1.11,1.73-1.72,2.54l-.97-1.32c.86-1.16,1.61-2.4,2.25-3.72Zm9.88-5.16c.45.81.88,1.63,1.32,2.46h5.32v1.4h-13.16v-1.4h6.11c-.36-.67-.74-1.33-1.11-2l1.52-.46Zm5.02,5.56v1.28h-10.42v-1.28h10.42Zm0,2.94v1.3h-10.42v-1.3h10.42Zm-.02,2.96v6.56h-1.52v-1.12h-7.33v1.12h-1.52v-6.56h10.36Zm-8.85,4.1h7.33v-2.76h-7.33v2.76Z" style="fill: #fff;"/>
<path d="m210.48,21.23l1.38.46c-.61,1.69-1.37,3.31-2.29,4.86l-1.3-.7c.88-1.47,1.61-3.01,2.21-4.62Zm5.1-10.2c.24-.64.47-1.29.67-1.96l1.74.32c-.19.56-.38,1.11-.59,1.64h6.8v9.38h-6.62c.76.93,1.5,1.87,2.25,2.82l-1.21.86c-.72-1.01-1.46-2.01-2.25-2.98l.99-.7h-6.64v-9.38h4.86Zm-3.4,2.72h10.57v-1.48h-10.57v1.48Zm0,2.68h10.57v-1.44h-10.57v1.44Zm10.57,2.74v-1.5h-10.57v1.5h10.57Zm-8.02,2.14v2.76c-.01.23,0,.45.06.66.04.12.1.23.18.32.11.11.24.18.41.22.23.05.46.08.69.08h3.12c.24,0,.49-.02.75-.06.12-.04.24-.08.36-.12.13-.09.23-.21.28-.36.07-.19.11-.39.12-.6l.08-1.74,1.48.38c-.05.65-.12,1.3-.18,1.94-.04.33-.13.65-.26.96-.09.19-.22.35-.36.48-.23.17-.48.29-.75.36-.39.07-.78.1-1.15.1h-4.05c-.39,0-.77-.05-1.13-.14-.28-.07-.53-.21-.73-.42-.13-.17-.24-.37-.3-.58-.09-.37-.13-.77-.12-1.18v-3.06h1.52Zm9.09-.24c1,1.45,1.97,2.93,2.91,4.42l-1.3.74c-.89-1.51-1.83-2.99-2.81-4.44l1.19-.72Z" style="fill: #fff;"/>
<path d="m230.34,25.31c.2,0,.4-.02.59-.06.15-.03.27-.08.36-.16.07-.08.12-.17.16-.26.04-.19.06-.38.06-.58v-4.42c-.92.31-1.83.62-2.73.94l-.49-1.62c1.08-.29,2.15-.63,3.22-1v-3.78h-2.53v-1.58h2.53v-3.54h1.54v3.54h2.12v1.58h-2.12v3.24c.63-.21,1.27-.44,1.92-.68l.24.82.22.76c-.81.27-1.61.53-2.39.8v5.56c0,.35-.04.69-.12,1.02-.07.19-.16.35-.28.5-.2.17-.43.29-.69.34-.38.08-.75.12-1.11.12h-1.6l-.3-1.54h1.4Zm7.37-7.62h-2.06v-1.44h4.39v-2.84h-4.41v-1.46h4.41v-2.82h1.52v2.82h5.18v1.46h-5.18v2.84h3.85v1.48c-.43,1.13-.97,2.21-1.62,3.22-.54.83-1.17,1.57-1.9,2.22.76.61,1.57,1.13,2.45,1.56.9.44,1.84.82,2.81,1.14l-.59,1.6c-1.2-.49-2.36-1.06-3.48-1.7-.84-.48-1.63-1.03-2.37-1.66-.8.55-1.62,1.04-2.47,1.48-1.21.61-2.46,1.19-3.72,1.72l-.81-1.52c1.17-.43,2.33-.91,3.46-1.46.81-.39,1.59-.83,2.35-1.34-1.27-1.39-2.27-2.95-3-4.68l1.19-.62Zm1.52,2.54c.43.67.92,1.29,1.48,1.86,1.4-1.19,2.42-2.65,3.04-4.4h-5.83c.36.88.8,1.73,1.32,2.54Z" style="fill: #fff;"/>
<path d="m253.35,19.91c1.46-1.52,2.69-3.21,3.68-5.08h-7.47v-1.56h7.79v-4.06h1.58v4.06h7.91v1.56h-7.59c.94,1.85,2.15,3.53,3.62,5.02,1.43,1.43,3,2.69,4.72,3.78l-.93,1.56c-1.7-1.16-3.27-2.48-4.72-3.96-1.16-1.21-2.17-2.54-3.02-3.98v9.94h-1.58v-9.94c-.88,1.44-1.88,2.77-3.02,4-1.4,1.49-2.94,2.85-4.59,4.06l-1.03-1.5c1.67-1.13,3.22-2.43,4.64-3.9Zm8.28-10.56c.99.85,1.97,1.71,2.96,2.56l-1.01,1.06c-.96-.89-1.93-1.77-2.91-2.62l.97-1Z" style="fill: #fff;"/>
<path d="m279.2,9.17v3.86h7.06v9.18h-1.6v-1.24h-5.47v6.22h-1.6v-6.22h-5.4v1.28h-1.6v-9.22h7v-3.86h1.6Zm-7,10.3h5.4v-4.92h-5.4v4.92Zm7-4.92v4.92h5.47v-4.92h-5.47Z" style="fill: #fff;"/>
<path d="m291.67,14.95l1.62.34c-.62,2.68-1.43,5.29-2.43,7.82l-1.54-.5c.96-2.49,1.74-5.05,2.35-7.66Zm4.45-1.74v10.14c-.01.29.01.57.08.84.04.15.11.28.22.4.15.15.33.24.55.28.3.07.6.09.91.08h2.37c.34.01.67,0,1.01-.06.18-.04.34-.11.49-.2.16-.12.28-.28.36-.48.08-.27.13-.55.14-.84.04-.97.07-1.96.08-2.96l1.66.36-.16,3.18c-.03.45-.11.89-.26,1.3-.11.24-.26.45-.45.64-.28.24-.61.4-.99.48-.51.11-1.03.16-1.56.16h-3.06c-.51,0-1.01-.05-1.5-.16-.36-.09-.68-.27-.95-.54-.19-.21-.32-.45-.4-.7-.14-.48-.2-.97-.18-1.48v-10.44h1.64Zm1.38-3.98c1.54,1.91,3.04,3.84,4.49,5.8l-1.38.98c-1.4-1.99-2.85-3.94-4.35-5.86l1.23-.92Zm7.21,5.38c1.17,2.47,2.33,4.93,3.46,7.4l-1.54.66c-1.09-2.49-2.22-4.97-3.38-7.44l1.46-.62Z" style="fill: #fff;"/>
</g>
<g>
<path d="m84.37,49.77h-1.56v-9.1h1.56v9.1Z" style="fill: #fff;"/>
<path d="m94.33,49.77h-1.65l-4.35-6.69c-.11-.17-.2-.34-.27-.53h-.04c.03.19.05.61.05,1.25v5.97h-1.46v-9.1h1.76l4.2,6.53c.18.27.29.46.34.56h.03c-.04-.24-.06-.65-.06-1.23v-5.87h1.45v9.1Z" style="fill: #fff;"/>
<path d="m101.49,41.95h-3.4v2.74h3.14v1.28h-3.14v3.81h-1.51v-9.1h4.91v1.28Z" style="fill: #fff;"/>
<path d="m106.86,49.92c-1.31,0-2.36-.43-3.15-1.28-.79-.85-1.18-1.96-1.18-3.32,0-1.46.4-2.63,1.21-3.5s1.9-1.31,3.28-1.31c1.28,0,2.31.42,3.09,1.27.78.85,1.17,1.95,1.17,3.32,0,1.49-.4,2.66-1.2,3.52s-1.87,1.29-3.21,1.29Zm.07-8.08c-.83,0-1.51.31-2.03.93-.52.62-.78,1.44-.78,2.46s.25,1.83.76,2.44,1.17.93,1.99.93c.87,0,1.56-.29,2.06-.88s.76-1.41.76-2.47-.24-1.93-.73-2.52c-.49-.59-1.16-.89-2.02-.89Z" style="fill: #fff;"/>
<path d="m119.97,49.77h-1.76l-1.45-2.44c-.13-.22-.26-.42-.38-.57-.12-.16-.25-.29-.38-.39-.13-.1-.27-.18-.42-.22s-.32-.07-.51-.07h-.61v3.69h-1.5v-9.1h3c.43,0,.82.05,1.18.15s.67.25.94.46c.27.21.48.46.63.77.15.31.23.67.23,1.08,0,.32-.05.62-.14.89-.09.27-.23.51-.41.72-.18.21-.39.39-.63.54-.25.15-.53.26-.83.34v.03c.17.09.31.2.43.31.12.11.24.23.35.35s.22.25.33.4c.11.15.23.33.36.52l1.62,2.56Zm-5.53-7.88v2.96h1.26c.23,0,.45-.04.64-.11.2-.07.37-.18.51-.31s.26-.3.34-.5.12-.41.12-.65c0-.44-.14-.78-.41-1.02s-.67-.37-1.19-.37h-1.27Z" style="fill: #fff;"/>
<path d="m130.81,49.77h-1.5v-5.89c0-.48.03-1.07.09-1.77h-.03c-.09.4-.18.68-.25.86l-2.72,6.8h-1.04l-2.72-6.75c-.08-.2-.16-.5-.24-.91h-.03c.03.36.05.96.05,1.78v5.88h-1.4v-9.1h2.13l2.39,6.06c.18.47.3.81.36,1.04h.03c.16-.48.28-.83.38-1.07l2.44-6.04h2.05v9.1Z" style="fill: #fff;"/>
<path d="m140.52,49.77h-1.66l-.82-2.32h-3.58l-.79,2.32h-1.65l3.41-9.1h1.7l3.38,9.1Zm-2.88-3.55l-1.26-3.63c-.04-.12-.08-.31-.12-.57h-.03c-.04.24-.08.43-.13.57l-1.25,3.63h2.79Z" style="fill: #fff;"/>
<path d="m146.69,41.95h-2.62v7.82h-1.51v-7.82h-2.61v-1.28h6.73v1.28Z" style="fill: #fff;"/>
<path d="m149.58,49.77h-1.56v-9.1h1.56v9.1Z" style="fill: #fff;"/>
<path d="m155.57,49.92c-1.31,0-2.36-.43-3.15-1.28-.79-.85-1.18-1.96-1.18-3.32,0-1.46.4-2.63,1.21-3.5s1.9-1.31,3.28-1.31c1.28,0,2.31.42,3.09,1.27.78.85,1.17,1.95,1.17,3.32,0,1.49-.4,2.66-1.2,3.52s-1.87,1.29-3.21,1.29Zm.07-8.08c-.83,0-1.51.31-2.03.93-.52.62-.78,1.44-.78,2.46s.25,1.83.76,2.44,1.17.93,1.99.93c.87,0,1.56-.29,2.06-.88s.76-1.41.76-2.47-.24-1.93-.73-2.52c-.49-.59-1.16-.89-2.02-.89Z" style="fill: #fff;"/>
<path d="m169.36,49.77h-1.65l-4.35-6.69c-.11-.17-.2-.34-.27-.53h-.04c.03.19.05.61.05,1.25v5.97h-1.46v-9.1h1.76l4.2,6.53c.18.27.29.46.34.56h.03c-.04-.24-.06-.65-.06-1.23v-5.87h1.45v9.1Z" style="fill: #fff;"/>
<path d="m181.03,41.95h-2.62v7.82h-1.51v-7.82h-2.61v-1.28h6.73v1.28Z" style="fill: #fff;"/>
<path d="m187.47,49.77h-5.11v-9.1h4.91v1.28h-3.4v2.58h3.13v1.28h-3.13v2.69h3.6v1.28Z" style="fill: #fff;"/>
<path d="m195.44,49.38c-.69.36-1.54.53-2.56.53-1.32,0-2.38-.42-3.17-1.25s-1.19-1.93-1.19-3.28c0-1.46.45-2.63,1.34-3.53.89-.9,2.03-1.35,3.39-1.35.88,0,1.61.12,2.19.37v1.5c-.61-.36-1.29-.55-2.03-.55-.99,0-1.78.32-2.4.95-.61.63-.92,1.47-.92,2.53s.29,1.8.86,2.4c.57.59,1.32.89,2.25.89.86,0,1.6-.2,2.23-.61v1.4Z" style="fill: #fff;"/>
<path d="m204.48,49.77h-1.52v-3.95h-4.28v3.95h-1.51v-9.1h1.51v3.83h4.28v-3.83h1.52v9.1Z" style="fill: #fff;"/>
<path d="m214.44,49.77h-1.65l-4.35-6.69c-.11-.17-.2-.34-.27-.53h-.04c.03.19.05.61.05,1.25v5.97h-1.46v-9.1h1.76l4.2,6.53c.18.27.29.46.34.56h.03c-.04-.24-.06-.65-.06-1.23v-5.87h1.45v9.1Z" style="fill: #fff;"/>
<path d="m220.45,49.92c-1.31,0-2.36-.43-3.15-1.28-.79-.85-1.18-1.96-1.18-3.32,0-1.46.4-2.63,1.21-3.5s1.9-1.31,3.28-1.31c1.28,0,2.31.42,3.09,1.27.78.85,1.17,1.95,1.17,3.32,0,1.49-.4,2.66-1.2,3.52s-1.87,1.29-3.21,1.29Zm.07-8.08c-.83,0-1.51.31-2.03.93-.52.62-.78,1.44-.78,2.46s.25,1.83.76,2.44,1.17.93,1.99.93c.87,0,1.56-.29,2.06-.88s.76-1.41.76-2.47-.24-1.93-.73-2.52c-.49-.59-1.16-.89-2.02-.89Z" style="fill: #fff;"/>
<path d="m231.56,49.77h-5.04v-9.1h1.51v7.83h3.53v1.28Z" style="fill: #fff;"/>
<path d="m236.24,49.92c-1.31,0-2.36-.43-3.15-1.28-.79-.85-1.18-1.96-1.18-3.32,0-1.46.4-2.63,1.21-3.5s1.9-1.31,3.28-1.31c1.28,0,2.31.42,3.09,1.27.78.85,1.17,1.95,1.17,3.32,0,1.49-.4,2.66-1.2,3.52s-1.87,1.29-3.21,1.29Zm.07-8.08c-.83,0-1.51.31-2.03.93-.52.62-.78,1.44-.78,2.46s.25,1.83.76,2.44,1.17.93,1.99.93c.87,0,1.56-.29,2.06-.88s.76-1.41.76-2.47-.24-1.93-.73-2.52c-.49-.59-1.16-.89-2.02-.89Z" style="fill: #fff;"/>
<path d="m249.42,49.14c-.95.52-2,.77-3.17.77-1.35,0-2.44-.42-3.27-1.26s-1.25-1.95-1.25-3.33.46-2.57,1.37-3.47c.91-.9,2.07-1.36,3.48-1.36,1.01,0,1.86.15,2.55.44v1.56c-.7-.47-1.53-.7-2.49-.7s-1.76.32-2.38.96c-.62.64-.93,1.47-.93,2.48s.27,1.87.8,2.47c.53.6,1.26.9,2.17.9.63,0,1.17-.12,1.62-.36v-2.16h-1.92v-1.27h3.42v4.32Z" style="fill: #fff;"/>
<path d="m257.72,40.66l-2.98,5.8v3.31h-1.51v-3.28l-2.91-5.83h1.72l1.79,3.9s.08.22.19.53h.02c.04-.14.11-.31.21-.53l1.87-3.9h1.6Z" style="fill: #fff;"/>
<path d="m268.8,49.38c-.69.36-1.54.53-2.56.53-1.32,0-2.38-.42-3.17-1.25s-1.19-1.93-1.19-3.28c0-1.46.45-2.63,1.34-3.53.89-.9,2.03-1.35,3.39-1.35.88,0,1.61.12,2.19.37v1.5c-.61-.36-1.29-.55-2.03-.55-.99,0-1.78.32-2.4.95-.61.63-.92,1.47-.92,2.53s.29,1.8.86,2.4c.57.59,1.32.89,2.25.89.86,0,1.6-.2,2.23-.61v1.4Z" style="fill: #fff;"/>
<path d="m275.64,49.77h-5.11v-9.1h4.91v1.28h-3.4v2.58h3.13v1.28h-3.13v2.69h3.6v1.28Z" style="fill: #fff;"/>
<path d="m284.98,49.77h-1.65l-4.35-6.69c-.11-.17-.2-.34-.27-.53h-.04c.03.19.05.61.05,1.25v5.97h-1.46v-9.1h1.76l4.2,6.53c.18.27.29.46.34.56h.03c-.04-.24-.06-.65-.06-1.23v-5.87h1.45v9.1Z" style="fill: #fff;"/>
<path d="m293.07,41.95h-2.62v7.82h-1.51v-7.82h-2.61v-1.28h6.73v1.28Z" style="fill: #fff;"/>
<path d="m299.51,49.77h-5.11v-9.1h4.91v1.28h-3.4v2.58h3.13v1.28h-3.13v2.69h3.6v1.28Z" style="fill: #fff;"/>
<path d="m308.16,49.77h-1.76l-1.45-2.44c-.13-.22-.26-.42-.38-.57-.12-.16-.25-.29-.38-.39-.13-.1-.27-.18-.42-.22s-.32-.07-.51-.07h-.61v3.69h-1.5v-9.1h3c.43,0,.82.05,1.18.15s.67.25.94.46c.27.21.48.46.63.77.15.31.23.67.23,1.08,0,.32-.05.62-.14.89-.09.27-.23.51-.41.72-.18.21-.39.39-.63.54-.25.15-.53.26-.83.34v.03c.17.09.31.2.43.31.12.11.24.23.35.35s.22.25.33.4c.11.15.23.33.36.52l1.62,2.56Zm-5.53-7.88v2.96h1.26c.23,0,.45-.04.64-.11.2-.07.37-.18.51-.31s.26-.3.34-.5.12-.41.12-.65c0-.44-.14-.78-.41-1.02s-.67-.37-1.19-.37h-1.27Z" style="fill: #fff;"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 33 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 134 KiB

122
resource/icons/zju.svg Normal file
View File

@@ -0,0 +1,122 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_2" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 311.68 69.84">
<g id="_图层_1" data-name="图层 1">
<g>
<g>
<path d="m82.6,64.77h5.21v.55h-6.11v-.19l5.27-7.96h-4.85v-.55h5.78v.16l-5.29,8Z" style="fill: #003f89;"/>
<path d="m98.31,65.31v-4.18h-4.98v4.18h-.6v-8.71h.6v3.98h4.98v-3.98h.6v8.71h-.6Z" style="fill: #003f89;"/>
<path d="m103.63,65.31v-8.71h4.07v.55h-3.47v3.49h3.22v.55h-3.22v3.57h3.67v.55h-4.27Z" style="fill: #003f89;"/>
<path d="m115.17,62.31c0,2.1-.73,3.15-2.19,3.15-.23,0-.45-.03-.66-.09v-.58c.24.08.46.12.67.12.56,0,.96-.21,1.21-.63.25-.42.37-1.08.37-1.98v-5.69h.59v5.71Z" style="fill: #003f89;"/>
<path d="m119.85,65.31v-8.71h.6v8.71h-.6Z" style="fill: #003f89;"/>
<path d="m131.34,65.31l-1-2.71h-3.78l-1,2.71h-.66l3.28-8.71h.57l3.25,8.71h-.67Zm-2.67-7.29c-.04-.12-.08-.24-.11-.36-.03-.1-.06-.2-.09-.3h-.02c-.07.27-.14.48-.2.65l-1.46,4.04h3.36l-1.47-4.02Z" style="fill: #003f89;"/>
<path d="m142.87,65.31l-5.19-7.04c-.11-.14-.2-.28-.28-.43l-.08-.12h-.02c0,.11.01.23.01.38v7.2h-.6v-8.71h.46l5.15,6.98c.11.15.24.34.37.56h.03c-.02-.28-.03-.53-.03-.73v-6.81h.6v8.71h-.42Z" style="fill: #003f89;"/>
<path d="m154.52,64.71c-.9.51-1.82.76-2.77.76-1.19,0-2.15-.4-2.88-1.21-.73-.8-1.1-1.86-1.1-3.17s.39-2.42,1.18-3.3c.79-.88,1.84-1.32,3.16-1.32.77,0,1.51.15,2.23.46v.66c-.79-.38-1.56-.57-2.31-.57-1.1,0-1.98.38-2.64,1.12-.67.75-1,1.7-1,2.87,0,1.22.31,2.18.94,2.87.62.69,1.47,1.04,2.53,1.04.79,0,1.47-.17,2.06-.51v-2.87h-2.05v-.55h2.65v3.72Z" style="fill: #003f89;"/>
<path d="m172.33,61.84c0,2.42-1.03,3.63-3.1,3.63s-2.94-1.17-2.94-3.5v-5.36h.6v5.28c0,2.02.82,3.03,2.46,3.03s2.39-.98,2.39-2.95v-5.36h.6v5.23Z" style="fill: #003f89;"/>
<path d="m183.1,65.31l-5.19-7.04c-.1-.14-.2-.28-.28-.43l-.08-.12h-.02c0,.11.01.23.01.38v7.2h-.6v-8.71h.46l5.15,6.98c.11.15.24.34.37.56h.03c-.02-.28-.03-.53-.03-.73v-6.81h.6v8.71h-.42Z" style="fill: #003f89;"/>
<path d="m188.19,65.31v-8.71h.6v8.71h-.6Z" style="fill: #003f89;"/>
<path d="m197.02,65.31h-.45l-3.18-8.71h.67l2.52,7.01c.1.29.18.57.22.83h.02c.04-.21.12-.49.25-.84l2.68-7h.64l-3.38,8.71Z" style="fill: #003f89;"/>
<path d="m205.01,65.31v-8.71h4.07v.55h-3.47v3.49h3.22v.55h-3.22v3.57h3.67v.55h-4.27Z" style="fill: #003f89;"/>
<path d="m218.41,65.31l-1.16-2.55c-.24-.53-.48-.88-.72-1.06-.24-.18-.54-.27-.9-.27h-1.08v3.88h-.6v-8.71h2.42c.77,0,1.37.21,1.81.62.44.42.66.96.66,1.64,0,.63-.18,1.15-.54,1.57-.36.42-.86.69-1.51.81v.02c.34.14.68.56,1.01,1.26l1.29,2.77h-.68Zm-3.85-8.15v3.73h1.5c.66,0,1.19-.17,1.58-.52.39-.35.59-.83.59-1.43,0-.55-.18-.99-.53-1.3-.35-.31-.86-.47-1.51-.47h-1.63Z" style="fill: #003f89;"/>
<path d="m223.82,65v-.69c.62.4,1.25.6,1.89.6.68,0,1.2-.14,1.55-.42.35-.28.53-.67.53-1.18,0-.44-.12-.8-.36-1.07-.24-.26-.75-.63-1.54-1.08-.88-.51-1.44-.94-1.68-1.29-.23-.35-.35-.75-.35-1.2,0-.62.24-1.14.72-1.57.48-.43,1.12-.64,1.91-.64.52,0,1.04.09,1.55.26v.63c-.51-.23-1.05-.35-1.63-.35s-1.06.15-1.41.45c-.35.3-.52.68-.52,1.14s.12.8.36,1.06c.24.26.75.62,1.53,1.07.81.46,1.35.87,1.62,1.23.27.36.4.77.4,1.24,0,.67-.23,1.21-.69,1.63-.46.42-1.12.63-1.96.63-.3,0-.64-.05-1.04-.14-.39-.09-.69-.2-.9-.32Z" style="fill: #003f89;"/>
<path d="m233.01,65.31v-8.71h.6v8.71h-.6Z" style="fill: #003f89;"/>
<path d="m241.19,57.16v8.15h-.6v-8.15h-2.51v-.55h5.62v.55h-2.51Z" style="fill: #003f89;"/>
<path d="m251.43,62v3.31h-.59v-3.3l-2.67-5.41h.67l2.03,4.2c.07.15.16.36.27.64h.02c.06-.15.16-.36.3-.63l2.12-4.21h.65l-2.81,5.4Z" style="fill: #003f89;"/>
</g>
<line x1="81.29" y1="34.19" x2="309.03" y2="34.19" style="fill: #003f89; stroke: #004088; stroke-miterlimit: 10; stroke-width: .74px;"/>
<g>
<path d="m152.49,26.66c-1.06-.23-.43-.56-.6-1.47-.14-.78-.85-1.55-.83-2.13.06-1.56,2.06-1.46,3.28-.96.22.09.47.42.69.74.56.8,1.21,1.97.35,2.85-.75.76-1.97,1.17-2.89.97" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m140.42,25.04s-.07-.03-.1-.04c.01-.12.02-.23.03-.34.33-.13,3.22-2.01,3.21-2.09.84-.67,1.6-1.42,1.83-2.49-2.07.68-4.03,2.18-6.17,2.34-.99-.25-1.67-.79-2.37-1.09,0-.05,0-.09,0-.12-1.13-.74-1.24-1.69.01-2.11,2.16.48,5.46-1.06,7.49-1.84.46-.2,1.77-.67,2.12-1.08.48-2.85.17-5.7.34-8.42.69-1.97,1.92-.63,3.14.36.08.16.36.34.61.71.03,0,.07,0,.12,0,.52.82.66,1.2-.14,1.96-.54,1.34-.8,2.82-.73,4.36,1.48-.21,2.38-1.51,4.09-1.53.41.8.36,1.47-.4,2.13-1.25.6-2.61,1.14-4.03,1.78-.33,1.44-.9,3.2-1.91,4.37-.15.17-.88.85-1.06.95-.92.54-1.75,1.18-2.75,1.47-2.78.77-2.81.64-3.32.71" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m113.83,29.89c-1.02-.47-1.95-1.71-2.51-2.48.09-.27.19-.55.3-.8,2.41-1.81,4.8-3.48,6.99-5.64.66-1.02,1.53-2.08,2.24-3.09.03-.02.08-.04.12-.04,0-.05,0-.08,0-.11.62-.48.88-.61,1.4.18.04.66-1.15,1.37-1.52,1.99-.46,1.18-.99,2.38-1.59,3.58q-.19.22-.96,1.48c-.65.5-1.51,1.81-1.87,2.61-.76.44-1.09,1.79-2,2.26-.21.01-.39.04-.58.07" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m128.07,21.44c-1.49-.06-1.91-1.02-2.72-1.88-.02-.39.21-.63.24-.9q.37-.09.6-.23c.62-.09.85-.05,1.52-.09.86-.19,3.05-1.7,3.78-1.05.11,1.81-1.86,3.63-3.43,4.15" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m116.65,18.59c-.57-.5-.68-2.79-.73-3.52.42-1.29,1.72-1.34,2.8-.5.86,1.13,1.44,1.6.54,2.91-1.02.88-1.47.94-2.61,1.11" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m127.67,17.47c-.15-.7.81-2.19.53-2.55-.36.05-.73.19-1.11.21-.89-.43-1.88-1.52-1.52-2.36.66-.75.41-.56,1.44-.62.99-.44,1.97-.87,2.97-1.29,1.67-.31,2.44.61,2.54,2.24-.3,1.06-1,1.89-1.69,2.72-.89.48-1.69,1.02-2.49,1.54-.23.03-.45.08-.67.12" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m118.54,12.75c-.35-.31-.2-.48-.02-.79-.04-.69-.46-1.25-.5-1.91.22-1.21,0-1.66,1-2.24.78.35,3.5,1.73,2.85,3.26-.75.95-2.26,1.55-3.33,1.68" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m83.32,31.02c-1.62-.62-3.03-3.82-1.08-4.61.05-.28.29-.57.53-.65,0-.05,0-.09,0-.12,1.57-1.52,2.6-3.64,3.92-5.32.34-.64.52-1.25,1.25-1.43.36.32.24,1.05.13,1.61.16.14.72.04,1.06-.07,1.09-.94,2.51-1.77,3.6-2.76.06-.49.11-.97.19-1.44-.76.18-3.26.77-2.66-.64.94-.37,2.36-1.17,2.86-2.19.24-1.03.11-2.17.62-2.9,1.05-.54,2.29.79,2.5,1.92.42.75,1.74-.18.1,2.12-.35.26-.33.76-.26,1.28.12,0,.24.02.36.03.92-.66,1.92-1.37,2.96-1.97.29-1.48.52-2.71,1.23-3.95,1.02-.7,2.4.06,3.4.85.77-.05,1.25-.37,1.93-.88q.27-.08.78-.08c.21.36.29.74.32,1.28-.49,1.5-4.79,1.99-3.97,3.74.75-.05,1.01-.87,1.29-1.42.84-.45,2.66.09,3.54.74.98,1.19.22,1.6-.87,2.35-.11.16-.22.32-.31.48q-.07,2.41-.04,5.66c-.37.88-.64,1.31-1.32,2.02,0,.03,0,.07,0,.1-.05,0-.09,0-.12,0-.42.73-1.44,1.44-2.04.76-.01-2.67.14-5.44.05-7.99-.05,0-.1.02-.13.04-.19,1.3-1.5,3.75-2.61,4.55-1.03.06-1.89-.53-2.18-1.41.1-.26.31-.33.52-.51.58-1.18.41-3.37.4-4.53-.83.12-2.24,2.01-2.87,2.71-.42.33-.85.67-1.26,1.01-.3.99-.53,1.97-.79,3.03-.23.47-.46.97-.68,1.46-.05,0-.09,0-.12,0-.39.66-1.65,2.38-2.4,1.3,0-.15-.02-.29,0-.43.63-.93,1.11-2.23,1.13-3.29-1.03.34-1.7,1.27-2.73,1.33-.59-.12-1.18-.3-1.57-.5,0-.05,0-.09,0-.12-.25-.16-.5-.38-.65-.32-.19.58-.37,1.17-.54,1.77-1.06,2.21-1.84,4.38-2.52,6.8-.39.38-.52.44-.93.54" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m85.34,18.3c-.32-.46.07-1.07.09-1.6-.5-1.51-.9-2.64.06-3.91.15-.03.31-.03.46-.05.7.49,1.69,1.61,2.29,2.41.73,1.81-1.6,2.62-2.91,3.15" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m86.79,12.45c-.38-.13-.37-.22-.45-.35.18-.37.36-.59.28-.96-.93-1.42-.87-3.58.73-4.3.47.05.47.45.68,1.09,1.04,1.01,2.98,2.27,1.14,3.64-.78.34-1.62.61-2.39.88" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m164.01,17.99c-1.45-.45-1.17-2.83-.93-3.79,1.06-.67,2.45.73,2.52,1.97-.27,1.37-.26,1.57-1.59,1.82" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m171.85,28.96c-.05-.03-.09-.06-.13-.08-1.85.12-3.62-.06-5.28-.65q-.08-.14-.09-.37c.98-.57,2.36-.41,3.1-1.44.12-.8.21-1.48.13-2.17-1.84.12-2.82,1.41-4.27,1.94-1.24.08-3.46-1.05-3.83-2.04,0-1.6.33-.88,2.05-.99,2.04-.36,4.08-1.53,6.05-2.4q.42-.32.65-.41c.44-1.33.75-1.57,2.13-1.84q.54-.27,2.12-1.23c.04-.15.08-.31.14-.46-2.4.28-4.34,2.23-6.25,3.51-.95.26-1.67.1-2.33-.19-.42.06-2.81.48-1.65-.47.71-.28,1.25-.79,2.01-1.12,1.8-1.21,3.88-2.25,5.82-3.37-.02-.3-.13-.46-.19-.55,0-.41.08-.61.2-.92-.37.12-.47.1-.53.37-1.15.51-1.64,1.55-2.61.45-.26,1.01-.98,1.71-1.99,1.78-1.03-.53-1.05-2.25-1.24-3.05-.07-.09-.22-.76-.5-1.54-.47-.95-1.32-2.01-.75-2.87.73-.45,1.02-.62,1.64.37.53.41,1.21.95,1.74,1.66.04,0,.07,0,.12,0,.33.87,1.12,2.02,1.04,3.14.54-.32,1.31-.94.91-1.63-.89-.48-.39-1.31.24-1.62q.44.02,1.01-.03c-.01-.22-.03-.22-.14-.35-.74-.25-.6-.43-.4-1.04-.87-.32-1.19-1.23-.86-1.87q2.51-.63,3.69-1.01c.78-.97,1.63-3.64,3.15-3.15.47.56.8,1.5.71,2.44-.19.4-.46.74-.53,1.18.15-.01.3,0,.45,0,1.05-.52,1.54-1.14,2.16.42,1.01.55,1.38.41,1,1.88-.74,1.48-1.53,3.07-2.35,4.55-.01.07-.03.14-.02.2.19.04.37.08.56.14.11.67.13,1.49.11,2.31-.63.93-1.43.93-2.44,1.06-1.28.64-2.43,1.17-3.63,1.88,0,.24-.04.48.08.79.61-.02,1.23-.02,1.86-.03.69.45.63,1.7.2,2.43-.7.1-1.12.19-1.66.48-.06.34-.13.68-.19,1.04.05,1.33.74,4.54-1.23,4.85m3.93-16.41c.62-.63,1.05-1.25,1-2.11-.52-.45-1.42-.52-1.96-.49q-.07.24-.69,1.4c.05.03.12.06.19.09-.06.02-.13.04-.18.08,0,.03.02.06.04.11.27.04.43-.18.55-.37.97-.16.99.19.92,1.22.04.02.07.03.12.06" style="fill: #003f89; fill-rule: evenodd;"/>
</g>
<g>
<path d="m34.92,0c19.23,0,34.92,15.69,34.92,34.92s-15.69,34.92-34.92,34.92S0,54.16,0,34.92,15.69,0,34.92,0m0,1.39C16.46,1.39,1.39,16.46,1.39,34.92s15.06,33.53,33.53,33.53,33.53-15.06,33.53-33.53S53.39,1.39,34.92,1.39" style="fill: #003f89;"/>
<path d="m22.66,49.81c-2.18-1.81-3.97-4.09-5.2-6.68-1.18-2.49-1.84-5.27-1.84-8.21,0-10.63,8.67-19.3,19.3-19.3s19.3,8.67,19.3,19.3c0,2.93-.66,5.72-1.84,8.21-1.22,2.59-3.01,4.87-5.2,6.68l-.44-.54c2.11-1.75,3.83-3.94,5.01-6.44,1.13-2.4,1.77-5.09,1.77-7.91,0-10.25-8.36-18.61-18.61-18.61s-18.61,8.36-18.61,18.61c0,2.83.64,5.51,1.77,7.91,1.18,2.49,2.9,4.69,5.01,6.44l-.44.54Z" style="fill: #003f89;"/>
<polygon points="5.02 46.59 3.7 43.05 4.42 42.8 10.46 43.72 9.53 41.24 10.25 40.99 11.45 44.23 10.74 44.47 4.7 43.56 5.73 46.33 5.02 46.59" style="fill: #003f89; fill-rule: evenodd;"/>
<polygon points="7.31 51.4 6.95 50.69 9.79 49.24 8.89 47.49 6.05 48.94 5.69 48.23 11.76 45.12 12.12 45.82 9.56 47.13 10.46 48.89 13.02 47.57 13.38 48.28 7.31 51.4" style="fill: #003f89; fill-rule: evenodd;"/>
<polygon points="10.19 55.24 8.04 52.23 13.73 48.69 15.78 51.56 15.15 51.96 13.58 49.77 11.82 50.87 13.26 52.88 12.62 53.27 11.19 51.26 9.16 52.52 10.83 54.85 10.19 55.24" style="fill: #003f89; fill-rule: evenodd;"/>
<polygon points="15.03 59.98 14.31 59.37 18.5 54.22 19.22 54.83 15.03 59.98" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m18.28,62.24l.86-1.83-1.04-.75-1.55,1.51-.71-.55,4.91-4.85.99.6-2.62,6.34-.84-.47Zm1.25-2.72l1.02-2.35-.09-.08-1.77,1.81.84.62Z" style="fill: #003f89; fill-rule: evenodd;"/>
<polygon points="23.2 64.62 22.31 64.21 22.83 59.48 20.89 63.46 20 63.05 23.08 56.96 23.88 57.33 23.51 61.82 25.51 58.11 26.25 58.42 23.2 64.62" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m27.78,65.99l-.57-.19.05-.54c-.13.11-.31.19-.53.22-.22.04-.44.02-.67-.06-.47-.15-.82-.52-1.05-1.11-.23-.59-.18-1.4.14-2.43.35-1.13.78-1.91,1.28-2.35.5-.44,1.28-.68,1.96-.47.73.23,1.21,1.14,1,2.38l-.87-.07c.15-.53.07-1.37-.45-1.54-.43-.14-.9,0-1.2.33-.3.34-.6.97-.88,1.91-.27.89-.35,1.53-.23,1.94.12.41.33.66.62.76.29.09.56.06.8-.12.24-.17.43-.5.58-.98l.12-.4-1.05-.34.22-.68,1.72.56-.98,3.17Z" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m36.86,64.48c-.02.62-.19,1.1-.49,1.44-.31.35-.78.51-1.42.48-.64-.02-1.11-.22-1.39-.59-.28-.37-.41-.86-.4-1.48l.15-4.65.82.04-.15,4.65c-.02.44.07.76.26.97.18.21.43.32.74.34.31.01.56-.08.76-.28.2-.2.3-.51.32-.95l.15-4.65.82.03-.15,4.65Z" style="fill: #003f89; fill-rule: evenodd;"/>
<polygon points="41.52 65.72 40.79 65.84 38.48 61.4 38.84 66.17 37.97 66.29 37.46 59.61 38.46 59.52 40.36 62.63 40.01 59.28 40.73 59.15 41.52 65.72" style="fill: #003f89; fill-rule: evenodd;"/>
<polygon points="44.01 65.03 43.16 65.29 41.38 58.97 42.23 58.7 44.01 65.03" style="fill: #003f89; fill-rule: evenodd;"/>
<polygon points="46.32 57.02 47.4 64 46.56 64.41 42.86 58.49 43.68 58.14 46.25 62.18 45.53 57.36 46.32 57.02" style="fill: #003f89; fill-rule: evenodd;"/>
<polygon points="53.19 60.97 50.07 62.66 46.67 56.82 49.64 55.22 50.02 55.87 47.75 57.09 48.81 58.9 50.89 57.78 51.26 58.42 49.19 59.55 50.4 61.63 52.81 60.32 53.19 60.97" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m56.74,58.48l-.69.59-2.42-2.01-.62.57,1.63,2.22-.69.71-4-5.62,1.27-.91c.41-.29.94-.5,1.43-.44,1.24.15,1.78.99,1.72,1.96-.02.31-.04.61-.16.91l2.52,2Zm-4.31-3.96c-.51-.13-.91.26-1.27.54l1.33,1.76c.41-.3.59-.36.9-.89.13-.64-.15-1.2-.96-1.41" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m58.9,53.05c1.4.84,1.07,3.22-.76,3.5-.49.07-1.08-.08-1.32-.23l.31-.71c.3.06.61.18.9.12,1.19-.23,1.14-1.46.44-1.97-.24-.18-.58-.2-.87-.17-.8.09-1.32.69-2.21.75-.97.06-1.65-.54-1.82-1.49-.08-.5.04-.99.29-1.38.51-.81,1.61-.92,2.41-.45l-.31.73c-.43-.22-1.2-.22-1.49.23-.15.23-.2.48-.16.72.1.54.46.86.98.79.87-.1,1.45-.81,2.3-.79.4.01.88.11,1.29.36" style="fill: #003f89; fill-rule: evenodd;"/>
<polygon points="61.85 52.19 61.35 52.81 55.59 49.2 56.09 48.58 61.85 52.19" style="fill: #003f89; fill-rule: evenodd;"/>
<polygon points="58.94 44.91 58.31 46.09 63.74 49.29 63.37 49.96 57.94 46.77 57.3 47.95 56.63 47.55 58.27 44.51 58.94 44.91" style="fill: #003f89; fill-rule: evenodd;"/>
<polygon points="59.94 40.42 63.25 43.38 65.47 44.33 65.2 45.08 63.15 44.28 58.43 44.18 58.65 43.42 61.95 43.47 59.62 41.33 59.94 40.42" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m14.52,57c-.59.59-1.13.89-1.64.91-.51.02-.97-.19-1.38-.61-.37-.38-.56-.83-.56-1.34,0-.26.08-.53.23-.8l.75.46c-.07.13-.1.25-.1.37,0,.28.08.51.26.69.25.26.52.37.79.35.28-.02.61-.23,1.01-.63l3.32-3.29.62.63-3.29,3.25Z" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m25.81,55.85l-2.32-1.44.21-.37.86.53,1.38-2.41-.87-.54.19-.32c.33.2.59.32.78.34.19.03.36-.05.49-.24l.5.31-1.86,3.23.84.53-.21.36Zm6.94-1.47c.04-.19-.02-.35-.19-.5-.17-.15-.42-.25-.76-.3-.31-.04-.58-.02-.8.06-.22.08-.35.22-.39.41-.03.14,0,.26.08.37.08.11.21.21.4.32.08.04.21.11.38.19.17.08.33.14.47.2.27-.09.46-.19.58-.31.12-.12.19-.26.23-.43m-.3,2.08c.03-.17.01-.31-.07-.42-.08-.12-.26-.24-.54-.39-.09-.04-.21-.09-.36-.16-.15-.06-.33-.14-.52-.22-.26.07-.46.17-.62.3-.15.12-.25.29-.29.48-.05.25.03.47.23.67.2.19.47.32.83.37.36.05.66.02.91-.09.25-.11.39-.28.44-.52m-1.44,1.02c-.32-.04-.6-.11-.85-.21-.25-.1-.45-.22-.61-.35-.16-.14-.27-.29-.33-.45-.06-.17-.07-.33-.04-.5.04-.22.18-.41.4-.58.22-.16.52-.27.89-.33v-.02c-.29-.16-.49-.32-.62-.48-.12-.16-.16-.35-.12-.55.06-.31.29-.54.7-.7.41-.16.89-.19,1.44-.12.58.08,1.03.24,1.34.49.31.24.43.52.37.82-.04.19-.16.36-.36.51-.2.16-.47.26-.81.32v.02c.34.16.6.34.76.52.16.19.21.41.16.66-.07.35-.33.62-.77.8-.45.18-.96.23-1.56.15m8.05-2.55c0-.28-.04-.51-.12-.69-.08-.18-.19-.32-.32-.42-.12-.08-.25-.15-.38-.18-.12-.03-.26-.05-.41-.05-.35,0-.62.08-.82.24-.21.17-.31.41-.31.72,0,.17.03.32.1.44.07.11.18.21.33.29.1.06.23.1.36.12.13.02.28.03.43.03.18,0,.38-.02.58-.06.21-.04.39-.1.54-.17,0-.03,0-.06.01-.11,0-.05,0-.1,0-.16m-3.22-.35c0-.22.06-.42.16-.59.11-.18.25-.33.43-.46.18-.12.39-.22.64-.29.25-.07.5-.11.76-.11.29,0,.55.04.78.1.24.06.43.16.61.28.22.15.38.35.5.6.12.25.18.57.18.95,0,.34-.06.67-.18.98-.12.31-.29.57-.52.78-.24.21-.53.38-.87.49-.34.11-.76.17-1.25.17-.11,0-.23,0-.36-.01-.13-.01-.25-.03-.36-.05v-.54h.04c.07.03.18.06.33.08.15.02.3.03.45.03.55,0,.98-.12,1.3-.36.31-.24.49-.58.53-1.03-.22.1-.44.18-.64.22-.2.05-.43.07-.67.07s-.44-.02-.63-.05c-.19-.03-.38-.1-.57-.2-.23-.11-.4-.26-.51-.43-.12-.18-.17-.38-.17-.63m9.12-3.58l-.15,4.31-.66.41.06-4.07-2.52,1.22-.22-.49,3.16-1.64.33.26Z" style="fill: #003f89; fill-rule: evenodd;"/>
<g>
<path d="m46.32,16.13c-.51-.25-.15-.34-.12-.81.02-.41-.24-.88-.16-1.17.22-.78,1.22-.48,1.77-.08.1.07.19.26.26.46.18.47.36,1.14-.18,1.47-.47.3-1.13.35-1.57.14" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m40.45,13.84s-.03-.02-.04-.04c.02-.06.04-.12.05-.16.18-.03,1.86-.62,1.87-.66.51-.23.97-.52,1.23-1.03-1.12.08-2.29.6-3.38.42-.47-.25-.75-.6-1.06-.84,0-.02,0-.04.01-.06-.48-.51-.41-1,.27-1.05,1.02.5,2.87.13,3.98,0,.25-.05.97-.12,1.2-.29.59-1.37.78-2.84,1.2-4.19.59-.9,1.04-.08,1.53.57.02.09.14.21.22.43.02,0,.03,0,.06.01.16.47.18.68-.31.96-.43.6-.75,1.31-.9,2.1.77.08,1.38-.46,2.24-.27.11.45,0,.79-.46,1.02-.7.15-1.45.25-2.24.4-.34.68-.84,1.5-1.5,1.96-.09.07-.55.32-.65.35-.53.16-1.02.37-1.56.4-1.49.05-1.49-.02-1.75-.04" style="fill: #003f89; fill-rule: evenodd;"/>
</g>
<g>
<path d="m23.44,18.81c-.62-.04-1.34-.48-1.78-.77,0-.16-.02-.32-.01-.47.87-1.41,1.76-2.76,2.44-4.3.13-.66.36-1.38.52-2.04.01-.01.03-.03.05-.05-.01-.02-.02-.04-.02-.05.22-.37.33-.49.75-.19.15.33-.31.93-.38,1.32,0,.7-.03,1.42-.09,2.16q-.05.15-.19.95c-.23.39-.41,1.24-.44,1.71-.3.38-.2,1.14-.57,1.57-.1.04-.19.1-.28.15" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m29.04,11.6c-.78.26-1.18-.13-1.77-.41-.09-.2-.02-.37-.06-.51q.17-.12.26-.24c.3-.17.42-.2.76-.36.4-.27,1.22-1.49,1.73-1.31.42.91-.22,2.24-.92,2.83" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m22.6,12.44c-.39-.14-.91-1.3-1.08-1.66-.04-.74.61-1.03,1.33-.82.67.41,1.06.53.87,1.39-.34.65-.56.78-1.11,1.1" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m28.03,9.65c-.22-.33-.03-1.28-.24-1.41-.18.1-.34.24-.53.33-.55-.04-1.27-.41-1.26-.91.19-.52.1-.37.61-.61.42-.42.83-.83,1.26-1.26.79-.49,1.37-.18,1.75.63.06.61-.13,1.17-.32,1.74-.36.43-.66.86-.97,1.29-.12.07-.22.13-.32.2" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m22.39,9.07c-.24-.09-.2-.2-.17-.4-.16-.34-.49-.55-.64-.88-.13-.67-.34-.85.06-1.35.47.02,2.15.18,2.12,1.1-.19.63-.84,1.24-1.37,1.53" style="fill: #003f89; fill-rule: evenodd;"/>
</g>
<path d="m13.81,32.08c-.72.5-2.47.17-2.24-.87-.1-.1-.15-.29-.12-.41-.02-.01-.04-.02-.05-.03-.18-1.09-.77-2.14-1.1-3.16-.17-.33-.37-.58-.24-.93.24-.06.51.2.71.4.11-.03.23-.29.27-.46-.08-.72-.02-1.55-.12-2.29-.19-.16-.37-.33-.55-.49-.15.37-.62,1.58-1.03.93.11-.5.18-1.32-.1-1.83-.36-.39-.87-.66-1.03-1.09.07-.6.99-.74,1.52-.51.43.04.43-.77.92.57.01.22.22.35.46.48.04-.05.08-.09.11-.14,0-.58-.02-1.2.03-1.81-.53-.54-.98-.99-1.3-1.64,0-.62.71-.99,1.33-1.18.2-.34.2-.62.19-1.06q.04-.14.19-.35c.21.01.39.09.63.23.49.64-.54,2.58.43,2.74.2-.33-.08-.67-.22-.95.06-.48.8-1.08,1.33-1.26.78-.07.73.36.73,1.03.04.1.07.19.11.27q.99.72,2.35,1.64c.26.41.37.64.47,1.13.01,0,.03.02.04.03-.01.02-.02.04-.03.06.19.38.19,1.01-.27,1.07-1.12-.76-2.23-1.62-3.33-2.32-.01.03-.02.05-.02.07.49.46,1.14,1.7,1.15,2.4-.27.45-.76.63-1.21.51-.08-.12-.05-.22-.07-.36-.33-.58-1.29-1.14-1.78-1.47-.19.38.19,1.51.31,1.98.02.27.04.54.06.81.33.41.68.79,1.04,1.2.13.23.27.47.42.7-.01.02-.02.03-.03.05.16.35.52,1.37-.15,1.37-.06-.04-.12-.07-.18-.12-.21-.53-.61-1.1-1.05-1.42-.16.52.04,1.08-.23,1.52-.22.21-.47.41-.66.52-.02-.01-.04-.02-.05-.03-.14.06-.3.1-.32.18.19.24.38.49.58.73.62,1.08,1.31,2.02,2.12,3.01.05.27.04.35-.04.54" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m9.07,27.59c-.28,0-.43-.33-.64-.5-.78-.22-1.36-.38-1.62-1.15.03-.07.07-.14.11-.2.4-.15,1.16-.24,1.66-.27.97.21.64,1.42.48,2.12" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m7.04,25.3c-.17.12-.2.09-.28.09-.1-.18-.14-.32-.32-.39-.86-.03-1.75-.67-1.59-1.54.16-.18.32-.07.65.03.72-.15,1.8-.6,1.84.57-.07.42-.21.85-.31,1.25" style="fill: #003f89; fill-rule: evenodd;"/>
<path d="m51.32,26.41h-8.49c-2.48,0-3.75,2.42-4.69,4.62l-1.43-3.22,2.4-.88c-1.41-1.33-5.79-2.06-6.37-.05l-1.03,4.16c-.82-1.88-1.97-4.62-4.56-4.62h-8.62c1.12,1.98,2.19,2.7,6.16,2.53l.52,1.36-4.35.02c1.28,2.37,2.02,2.47,5.52,2.37l.74,1.63-3.42.12c.73,1.67,1.51,2.39,4.44,2.26l.57,1.45h-2.72c1.02,1.7,1.52,2.47,3.68,2.28l.58,1.58h-1.88c.81,1.82,1.76,1.89,2.92,2.08,1.04.16,1.19,2.11-.02,2.74l3.66,5.93,3.66-5.94c-1.22-.63-1.07-2.58-.02-2.74,1.16-.18,2.11-.25,2.92-2.08h-1.88l.58-1.58c2.15.19,2.66-.58,3.68-2.26h-2.72s.57-1.46.57-1.46c2.93.13,3.71-.58,4.44-2.26l-3.42-.12.74-1.63c3.5.1,4.24,0,5.52-2.37l-4.35-.02.52-1.37c3.96.17,5.03-.54,6.16-2.52" style="fill: #003f89;"/>
<path d="m64.25,22.34l.03-.07c.12-.31.11-.43.08-.49-.04-.07-.17-.11-.38-.16-.06-.02-.12-.02-.2-.03l-.12-.02-.04-.08s-.08-.08-.14-.12l-.16-.06-.04-.02.21-.16c.15-.12.32-.17.51-.23l.02-.05.08.03c.3-.26.5-.64.53-1.04-.09-.12-.25-.18-.48-.18-.3,0-.66.12-.98.21-.2.07-.44.14-.66.19l-.08-.04c-.54-.26-.57-.27-1.7-.87-.08.06-.15.13-.18.23-.07.16-.06.35.03.52l.11.08h0s0,.01,0,.01l-.27.14c-.06.04-.08.04-.07.04h0l-.08.07s.02.08.07.15l.02.12c0,.11-.02.15-.11.25l-.03.13h0v.02l-.16-.13c-.22-.17-.24-.19-.4-.34-.04,0-.09-.01-.14-.01-.12,0-.22.04-.27.11-.05.07-.04.15,0,.27l-.02.06c-.04.16-.17.44-.68.45h-.26s-.1,0-.18.04c0,.34.15.37.51.43.14.02.28.04.48.09.03-.01.07-.02.1-.02.08,0,.14.03.21.06l.27.11.1.03.05.02-.33.16c-.12.07-.21.11-.33.24-.02.09-.07.18-.15.28v.07s-.15-.03-.15-.03c-.24-.06-.49-.12-.73-.18l-.38-.1c-.67-.18-1.49-.39-2.27-.53-.19-.07-.36-.1-.54-.13l-.37-.04-.02.1c.09.07.21.16.4.28l.02.06c.11.26.28.57.69.8.27.05.55.09.88.12.97.11,1.98.23,2.76.82l.21.1h.05s0,0,0,0h0l-.29.15c-.07.04-.14.08-.23.16l-.09-.02q-.94-.21-1.27-.32c-.34-.22-.5-.29-.68-.29-.14,0-.3.06-.56.22-.02,0-.03.01-.04.02h-.01s-.02.02-.02.03l-.1-.04c-.1-.04-.11-.04-.39-.08-.26-.09-.53-.18-.81-.27-.81-.26-1.65-.54-2.34-1-.2-.17-.34-.33-.45-.46-.04-.05-.06-.07-.08-.07h0l-.07-.08c-.05.01-.14.09-.28.24-.15.46.27,1.56.64,1.88.26.12.54.17.84.22.49.09,1,.18,1.49.59l.13.03h.01s-.12.17-.12.17c-.16.21-.35.38-.56.58l-.09.08c-.06.05-.12.1-.17.16h-.09c-.07.02-.13.03-.21.03-.36,0-.67-.17-.94-.33-.09-.05-.18-.09-.31-.13l-.05.09c.37.65.89,1.24,1.58,1.81l.06.1c.08.05.17.07.25.07h.01c.49-.01,1.02-.68,1.42-1.18.08-.1.16-.21.25-.3l.1-.07c.37-.27.4-.29.38-.29l.09.02c.31.09.51.21.81.37.29-.13.59-.42.56-.74l-.12-.11c-.18-.16-.35-.32-.53-.48l-.09-.02.06-.15c.07-.16.16-.25.29-.38l.02-.07.12.03c.53.12,1,.27,1.58.44l.5.17.12.09c.29.22.5.38.83.38.05,0,.1,0,.18-.04.31-.32.49-.53.61-.78h0s0-.01,0-.02c-.1-.14-.14-.18-.16-.18l.09-.11s.06-.06.15-.11c.85-.27,1.78-.61,2.46-.85.41-.25.45-.28.31-.66-.03-.06-.06-.14-.11-.24m-3.32.51l.14-.12c.19-.18.28-.26.29-.35,0-.03-.05-.08-.13-.14h-.04s-.05,0-.09,0c-.15,0-.25-.07-.3-.14l-.06-.05v-.07s.06-.18.06-.18h-.03s.19-.07.19-.07q.63-.21.73-.27l.05-.08.12.1c.13.12.57.51.64,1.02l-.06.07c-.33.4-.79.46-1.22.48l-.12.03-.06-.18-.08-.05h0Z" style="fill: #003f89;"/>
<path d="m57.3,21.35c-.19,0-.37-.06-.53-.17-.1-.41.2-.84.42-1.16.07-.11.13-.19.18-.26l.04-.1.07-.14c.09-.17.18-.34.26-.53.03-.1.06-.2.08-.29.13-.53.23-.86.5-.95.21.03.31.06.36.14.05.08.03.18,0,.38l-.03.08c.03.06.04.16.05.25.06.31.07.64.04.93v.12c-.03.12-.06.21-.1.32-.12.37-.26.8-.54,1.05l-.11.11-.08.04c-.19.12-.39.19-.59.19h-.02Z" style="fill: #003f89;"/>
<path d="m57.3,21.34h.02c.19,0,.39-.07.58-.19l.07-.04.11-.1c.27-.25.41-.67.53-1.05.03-.1.07-.2.08-.31l.02-.12c.03-.33.01-.64-.04-.93-.01-.09-.02-.18-.04-.26h-.01l.03-.07c.04-.19.06-.3.01-.37-.05-.07-.14-.1-.34-.13-.26.09-.36.41-.48.91-.03.1-.06.2-.09.32-.08.19-.17.36-.26.53l-.08.14-.04.09c-.04.08-.1.16-.18.26-.22.32-.52.75-.42,1.14.16.11.33.17.52.17" style="fill: #003f89;"/>
<path d="m55.43,20.87c-.09,0-.21-.05-.43-.19-.29-.64.74-1.38.86-1.46.17.04.26.13.32.29.12.33.03.79-.19,1.05-.31.22-.44.31-.56.31h0Z" style="fill: #003f89;"/>
<path d="m55.43,20.85h0c.11,0,.24-.09.54-.3.22-.26.3-.72.19-1.04-.05-.15-.14-.24-.29-.28-.12.08-1.13.81-.86,1.43.21.13.33.19.42.19" style="fill: #003f89;"/>
</g>
</g>
<g>
<path d="m190.2,14.25c.78-1.6,1.42-3.26,1.9-4.98l1.48.42c-.4,1.41-.89,2.79-1.46,4.14v13.32h-1.48v-10.4c-.54.88-1.11,1.73-1.72,2.54l-.97-1.32c.86-1.16,1.61-2.4,2.25-3.72Zm9.88-5.16c.45.81.88,1.63,1.32,2.46h5.32v1.4h-13.16v-1.4h6.11c-.36-.67-.74-1.33-1.11-2l1.52-.46Zm5.02,5.56v1.28h-10.42v-1.28h10.42Zm0,2.94v1.3h-10.42v-1.3h10.42Zm-.02,2.96v6.56h-1.52v-1.12h-7.33v1.12h-1.52v-6.56h10.36Zm-8.85,4.1h7.33v-2.76h-7.33v2.76Z" style="fill: #004088;"/>
<path d="m210.48,21.23l1.38.46c-.61,1.69-1.37,3.31-2.29,4.86l-1.3-.7c.88-1.47,1.61-3.01,2.21-4.62Zm5.1-10.2c.24-.64.47-1.29.67-1.96l1.74.32c-.19.56-.38,1.11-.59,1.64h6.8v9.38h-6.62c.76.93,1.5,1.87,2.25,2.82l-1.21.86c-.72-1.01-1.46-2.01-2.25-2.98l.99-.7h-6.64v-9.38h4.86Zm-3.4,2.72h10.57v-1.48h-10.57v1.48Zm0,2.68h10.57v-1.44h-10.57v1.44Zm10.57,2.74v-1.5h-10.57v1.5h10.57Zm-8.02,2.14v2.76c-.01.23,0,.45.06.66.04.12.1.23.18.32.11.11.24.18.41.22.23.05.46.08.69.08h3.12c.24,0,.49-.02.75-.06.12-.04.24-.08.36-.12.13-.09.23-.21.28-.36.07-.19.11-.39.12-.6l.08-1.74,1.48.38c-.05.65-.12,1.3-.18,1.94-.04.33-.13.65-.26.96-.09.19-.22.35-.36.48-.23.17-.48.29-.75.36-.39.07-.78.1-1.15.1h-4.05c-.39,0-.77-.05-1.13-.14-.28-.07-.53-.21-.73-.42-.13-.17-.24-.37-.3-.58-.09-.37-.13-.77-.12-1.18v-3.06h1.52Zm9.09-.24c1,1.45,1.97,2.93,2.91,4.42l-1.3.74c-.89-1.51-1.83-2.99-2.81-4.44l1.19-.72Z" style="fill: #004088;"/>
<path d="m230.34,25.31c.2,0,.4-.02.59-.06.15-.03.27-.08.36-.16.07-.08.12-.17.16-.26.04-.19.06-.38.06-.58v-4.42c-.92.31-1.83.62-2.73.94l-.49-1.62c1.08-.29,2.15-.63,3.22-1v-3.78h-2.53v-1.58h2.53v-3.54h1.54v3.54h2.12v1.58h-2.12v3.24c.63-.21,1.27-.44,1.92-.68l.24.82.22.76c-.81.27-1.61.53-2.39.8v5.56c0,.35-.04.69-.12,1.02-.07.19-.16.35-.28.5-.2.17-.43.29-.69.34-.38.08-.75.12-1.11.12h-1.6l-.3-1.54h1.4Zm7.37-7.62h-2.06v-1.44h4.39v-2.84h-4.41v-1.46h4.41v-2.82h1.52v2.82h5.18v1.46h-5.18v2.84h3.85v1.48c-.43,1.13-.97,2.21-1.62,3.22-.54.83-1.17,1.57-1.9,2.22.76.61,1.57,1.13,2.45,1.56.9.44,1.84.82,2.81,1.14l-.59,1.6c-1.2-.49-2.36-1.06-3.48-1.7-.84-.48-1.63-1.03-2.37-1.66-.8.55-1.62,1.04-2.47,1.48-1.21.61-2.46,1.19-3.72,1.72l-.81-1.52c1.17-.43,2.33-.91,3.46-1.46.81-.39,1.59-.83,2.35-1.34-1.27-1.39-2.27-2.95-3-4.68l1.19-.62Zm1.52,2.54c.43.67.92,1.29,1.48,1.86,1.4-1.19,2.42-2.65,3.04-4.4h-5.83c.36.88.8,1.73,1.32,2.54Z" style="fill: #004088;"/>
<path d="m253.35,19.91c1.46-1.52,2.69-3.21,3.68-5.08h-7.47v-1.56h7.79v-4.06h1.58v4.06h7.91v1.56h-7.59c.94,1.85,2.15,3.53,3.62,5.02,1.43,1.43,3,2.69,4.72,3.78l-.93,1.56c-1.7-1.16-3.27-2.48-4.72-3.96-1.16-1.21-2.17-2.54-3.02-3.98v9.94h-1.58v-9.94c-.88,1.44-1.88,2.77-3.02,4-1.4,1.49-2.94,2.85-4.59,4.06l-1.03-1.5c1.67-1.13,3.22-2.43,4.64-3.9Zm8.28-10.56c.99.85,1.97,1.71,2.96,2.56l-1.01,1.06c-.96-.89-1.93-1.77-2.91-2.62l.97-1Z" style="fill: #004088;"/>
<path d="m279.2,9.17v3.86h7.06v9.18h-1.6v-1.24h-5.47v6.22h-1.6v-6.22h-5.4v1.28h-1.6v-9.22h7v-3.86h1.6Zm-7,10.3h5.4v-4.92h-5.4v4.92Zm7-4.92v4.92h5.47v-4.92h-5.47Z" style="fill: #004088;"/>
<path d="m291.67,14.95l1.62.34c-.62,2.68-1.43,5.29-2.43,7.82l-1.54-.5c.96-2.49,1.74-5.05,2.35-7.66Zm4.45-1.74v10.14c-.01.29.01.57.08.84.04.15.11.28.22.4.15.15.33.24.55.28.3.07.6.09.91.08h2.37c.34.01.67,0,1.01-.06.18-.04.34-.11.49-.2.16-.12.28-.28.36-.48.08-.27.13-.55.14-.84.04-.97.07-1.96.08-2.96l1.66.36-.16,3.18c-.03.45-.11.89-.26,1.3-.11.24-.26.45-.45.64-.28.24-.61.4-.99.48-.51.11-1.03.16-1.56.16h-3.06c-.51,0-1.01-.05-1.5-.16-.36-.09-.68-.27-.95-.54-.19-.21-.32-.45-.4-.7-.14-.48-.2-.97-.18-1.48v-10.44h1.64Zm1.38-3.98c1.54,1.91,3.04,3.84,4.49,5.8l-1.38.98c-1.4-1.99-2.85-3.94-4.35-5.86l1.23-.92Zm7.21,5.38c1.17,2.47,2.33,4.93,3.46,7.4l-1.54.66c-1.09-2.49-2.22-4.97-3.38-7.44l1.46-.62Z" style="fill: #004088;"/>
</g>
<g>
<path d="m84.37,49.77h-1.56v-9.1h1.56v9.1Z" style="fill: #004188;"/>
<path d="m94.33,49.77h-1.65l-4.35-6.69c-.11-.17-.2-.34-.27-.53h-.04c.03.19.05.61.05,1.25v5.97h-1.46v-9.1h1.76l4.2,6.53c.18.27.29.46.34.56h.03c-.04-.24-.06-.65-.06-1.23v-5.87h1.45v9.1Z" style="fill: #004188;"/>
<path d="m101.49,41.95h-3.4v2.74h3.14v1.28h-3.14v3.81h-1.51v-9.1h4.91v1.28Z" style="fill: #004188;"/>
<path d="m106.86,49.92c-1.31,0-2.36-.43-3.15-1.28-.79-.85-1.18-1.96-1.18-3.32,0-1.46.4-2.63,1.21-3.5s1.9-1.31,3.28-1.31c1.28,0,2.31.42,3.09,1.27.78.85,1.17,1.95,1.17,3.32,0,1.49-.4,2.66-1.2,3.52s-1.87,1.29-3.21,1.29Zm.07-8.08c-.83,0-1.51.31-2.03.93-.52.62-.78,1.44-.78,2.46s.25,1.83.76,2.44,1.17.93,1.99.93c.87,0,1.56-.29,2.06-.88s.76-1.41.76-2.47-.24-1.93-.73-2.52c-.49-.59-1.16-.89-2.02-.89Z" style="fill: #004188;"/>
<path d="m119.97,49.77h-1.76l-1.45-2.44c-.13-.22-.26-.42-.38-.57-.12-.16-.25-.29-.38-.39-.13-.1-.27-.18-.42-.22s-.32-.07-.51-.07h-.61v3.69h-1.5v-9.1h3c.43,0,.82.05,1.18.15s.67.25.94.46c.27.21.48.46.63.77.15.31.23.67.23,1.08,0,.32-.05.62-.14.89-.09.27-.23.51-.41.72-.18.21-.39.39-.63.54-.25.15-.53.26-.83.34v.03c.17.09.31.2.43.31.12.11.24.23.35.35s.22.25.33.4c.11.15.23.33.36.52l1.62,2.56Zm-5.53-7.88v2.96h1.26c.23,0,.45-.04.64-.11.2-.07.37-.18.51-.31s.26-.3.34-.5.12-.41.12-.65c0-.44-.14-.78-.41-1.02s-.67-.37-1.19-.37h-1.27Z" style="fill: #004188;"/>
<path d="m130.81,49.77h-1.5v-5.89c0-.48.03-1.07.09-1.77h-.03c-.09.4-.18.68-.25.86l-2.72,6.8h-1.04l-2.72-6.75c-.08-.2-.16-.5-.24-.91h-.03c.03.36.05.96.05,1.78v5.88h-1.4v-9.1h2.13l2.39,6.06c.18.47.3.81.36,1.04h.03c.16-.48.28-.83.38-1.07l2.44-6.04h2.05v9.1Z" style="fill: #004188;"/>
<path d="m140.52,49.77h-1.66l-.82-2.32h-3.58l-.79,2.32h-1.65l3.41-9.1h1.7l3.38,9.1Zm-2.88-3.55l-1.26-3.63c-.04-.12-.08-.31-.12-.57h-.03c-.04.24-.08.43-.13.57l-1.25,3.63h2.79Z" style="fill: #004188;"/>
<path d="m146.69,41.95h-2.62v7.82h-1.51v-7.82h-2.61v-1.28h6.73v1.28Z" style="fill: #004188;"/>
<path d="m149.58,49.77h-1.56v-9.1h1.56v9.1Z" style="fill: #004188;"/>
<path d="m155.57,49.92c-1.31,0-2.36-.43-3.15-1.28-.79-.85-1.18-1.96-1.18-3.32,0-1.46.4-2.63,1.21-3.5s1.9-1.31,3.28-1.31c1.28,0,2.31.42,3.09,1.27.78.85,1.17,1.95,1.17,3.32,0,1.49-.4,2.66-1.2,3.52s-1.87,1.29-3.21,1.29Zm.07-8.08c-.83,0-1.51.31-2.03.93-.52.62-.78,1.44-.78,2.46s.25,1.83.76,2.44,1.17.93,1.99.93c.87,0,1.56-.29,2.06-.88s.76-1.41.76-2.47-.24-1.93-.73-2.52c-.49-.59-1.16-.89-2.02-.89Z" style="fill: #004188;"/>
<path d="m169.36,49.77h-1.65l-4.35-6.69c-.11-.17-.2-.34-.27-.53h-.04c.03.19.05.61.05,1.25v5.97h-1.46v-9.1h1.76l4.2,6.53c.18.27.29.46.34.56h.03c-.04-.24-.06-.65-.06-1.23v-5.87h1.45v9.1Z" style="fill: #004188;"/>
<path d="m181.03,41.95h-2.62v7.82h-1.51v-7.82h-2.61v-1.28h6.73v1.28Z" style="fill: #004188;"/>
<path d="m187.47,49.77h-5.11v-9.1h4.91v1.28h-3.4v2.58h3.13v1.28h-3.13v2.69h3.6v1.28Z" style="fill: #004188;"/>
<path d="m195.44,49.38c-.69.36-1.54.53-2.56.53-1.32,0-2.38-.42-3.17-1.25s-1.19-1.93-1.19-3.28c0-1.46.45-2.63,1.34-3.53.89-.9,2.03-1.35,3.39-1.35.88,0,1.61.12,2.19.37v1.5c-.61-.36-1.29-.55-2.03-.55-.99,0-1.78.32-2.4.95-.61.63-.92,1.47-.92,2.53s.29,1.8.86,2.4c.57.59,1.32.89,2.25.89.86,0,1.6-.2,2.23-.61v1.4Z" style="fill: #004188;"/>
<path d="m204.48,49.77h-1.52v-3.95h-4.28v3.95h-1.51v-9.1h1.51v3.83h4.28v-3.83h1.52v9.1Z" style="fill: #004188;"/>
<path d="m214.44,49.77h-1.65l-4.35-6.69c-.11-.17-.2-.34-.27-.53h-.04c.03.19.05.61.05,1.25v5.97h-1.46v-9.1h1.76l4.2,6.53c.18.27.29.46.34.56h.03c-.04-.24-.06-.65-.06-1.23v-5.87h1.45v9.1Z" style="fill: #004188;"/>
<path d="m220.45,49.92c-1.31,0-2.36-.43-3.15-1.28-.79-.85-1.18-1.96-1.18-3.32,0-1.46.4-2.63,1.21-3.5s1.9-1.31,3.28-1.31c1.28,0,2.31.42,3.09,1.27.78.85,1.17,1.95,1.17,3.32,0,1.49-.4,2.66-1.2,3.52s-1.87,1.29-3.21,1.29Zm.07-8.08c-.83,0-1.51.31-2.03.93-.52.62-.78,1.44-.78,2.46s.25,1.83.76,2.44,1.17.93,1.99.93c.87,0,1.56-.29,2.06-.88s.76-1.41.76-2.47-.24-1.93-.73-2.52c-.49-.59-1.16-.89-2.02-.89Z" style="fill: #004188;"/>
<path d="m231.56,49.77h-5.04v-9.1h1.51v7.83h3.53v1.28Z" style="fill: #004188;"/>
<path d="m236.24,49.92c-1.31,0-2.36-.43-3.15-1.28-.79-.85-1.18-1.96-1.18-3.32,0-1.46.4-2.63,1.21-3.5s1.9-1.31,3.28-1.31c1.28,0,2.31.42,3.09,1.27.78.85,1.17,1.95,1.17,3.32,0,1.49-.4,2.66-1.2,3.52s-1.87,1.29-3.21,1.29Zm.07-8.08c-.83,0-1.51.31-2.03.93-.52.62-.78,1.44-.78,2.46s.25,1.83.76,2.44,1.17.93,1.99.93c.87,0,1.56-.29,2.06-.88s.76-1.41.76-2.47-.24-1.93-.73-2.52c-.49-.59-1.16-.89-2.02-.89Z" style="fill: #004188;"/>
<path d="m249.42,49.14c-.95.52-2,.77-3.17.77-1.35,0-2.44-.42-3.27-1.26s-1.25-1.95-1.25-3.33.46-2.57,1.37-3.47c.91-.9,2.07-1.36,3.48-1.36,1.01,0,1.86.15,2.55.44v1.56c-.7-.47-1.53-.7-2.49-.7s-1.76.32-2.38.96c-.62.64-.93,1.47-.93,2.48s.27,1.87.8,2.47c.53.6,1.26.9,2.17.9.63,0,1.17-.12,1.62-.36v-2.16h-1.92v-1.27h3.42v4.32Z" style="fill: #004188;"/>
<path d="m257.72,40.66l-2.98,5.8v3.31h-1.51v-3.28l-2.91-5.83h1.72l1.79,3.9s.08.22.19.53h.02c.04-.14.11-.31.21-.53l1.87-3.9h1.6Z" style="fill: #004188;"/>
<path d="m268.8,49.38c-.69.36-1.54.53-2.56.53-1.32,0-2.38-.42-3.17-1.25s-1.19-1.93-1.19-3.28c0-1.46.45-2.63,1.34-3.53.89-.9,2.03-1.35,3.39-1.35.88,0,1.61.12,2.19.37v1.5c-.61-.36-1.29-.55-2.03-.55-.99,0-1.78.32-2.4.95-.61.63-.92,1.47-.92,2.53s.29,1.8.86,2.4c.57.59,1.32.89,2.25.89.86,0,1.6-.2,2.23-.61v1.4Z" style="fill: #004188;"/>
<path d="m275.64,49.77h-5.11v-9.1h4.91v1.28h-3.4v2.58h3.13v1.28h-3.13v2.69h3.6v1.28Z" style="fill: #004188;"/>
<path d="m284.98,49.77h-1.65l-4.35-6.69c-.11-.17-.2-.34-.27-.53h-.04c.03.19.05.61.05,1.25v5.97h-1.46v-9.1h1.76l4.2,6.53c.18.27.29.46.34.56h.03c-.04-.24-.06-.65-.06-1.23v-5.87h1.45v9.1Z" style="fill: #004188;"/>
<path d="m293.07,41.95h-2.62v7.82h-1.51v-7.82h-2.61v-1.28h6.73v1.28Z" style="fill: #004188;"/>
<path d="m299.51,49.77h-5.11v-9.1h4.91v1.28h-3.4v2.58h3.13v1.28h-3.13v2.69h3.6v1.28Z" style="fill: #004188;"/>
<path d="m308.16,49.77h-1.76l-1.45-2.44c-.13-.22-.26-.42-.38-.57-.12-.16-.25-.29-.38-.39-.13-.1-.27-.18-.42-.22s-.32-.07-.51-.07h-.61v3.69h-1.5v-9.1h3c.43,0,.82.05,1.18.15s.67.25.94.46c.27.21.48.46.63.77.15.31.23.67.23,1.08,0,.32-.05.62-.14.89-.09.27-.23.51-.41.72-.18.21-.39.39-.63.54-.25.15-.53.26-.83.34v.03c.17.09.31.2.43.31.12.11.24.23.35.35s.22.25.33.4c.11.15.23.33.36.52l1.62,2.56Zm-5.53-7.88v2.96h1.26c.23,0,.45-.04.64-.11.2-.07.37-.18.51-.31s.26-.3.34-.5.12-.41.12-.65c0-.44-.14-.78-.41-1.02s-.67-.37-1.19-.37h-1.27Z" style="fill: #004188;"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 33 KiB

View File

@@ -0,0 +1,52 @@
import Highlight, {
defaultProps,
Language,
PrismTheme,
} from 'prism-react-renderer';
import React from 'react';
import prismDarkTheme from 'prism-react-renderer/themes/vsDark';
import prismLightTheme from 'prism-react-renderer/themes/github';
import { useTheme } from '@mui/material';
export interface CodeBlockProps {
children: string;
language: Language;
codeStyle?: React.CSSProperties;
}
export default ({ children, codeStyle, language }: CodeBlockProps) => {
const theme = useTheme();
const prismTheme =
theme.palette.mode === 'light' ? prismLightTheme : prismDarkTheme;
return (
<Highlight
{...defaultProps}
code={children.trim()}
theme={prismTheme as PrismTheme}
language={language}
>
{({ className, style, tokens, getLineProps, getTokenProps }) => (
<code
className={className}
style={{
display: 'block',
padding: 20,
overflowX: 'auto',
borderRadius: 5,
...style,
...codeStyle,
}}
>
{tokens.map((line, i) => (
<div key={i} {...getLineProps({ line, key: i })}>
{line.map((token, key) => (
<span key={key} {...getTokenProps({ token, key })} />
))}
</div>
))}
</code>
)}
</Highlight>
);
};

View File

@@ -0,0 +1,72 @@
import React, { useState } from 'react';
import {
FormControl,
InputLabel,
Select,
MenuItem,
Box,
Grid,
Typography,
} from '@mui/material';
import { Language } from 'prism-react-renderer';
import { Trans } from 'gatsby-plugin-react-i18next';
import CodeBlock from './code-block';
export default ({
promptString,
versionList,
friendlyNameList,
defaultVersion,
language,
configGen,
}: {
promptString: string;
versionList: string[];
friendlyNameList: string[] | undefined;
defaultVersion: string | undefined;
language: Language;
configGen: (version: string) => string;
}) => {
const [version, setVersion] = useState(defaultVersion ?? versionList[0]);
return (
<Box>
<Grid
container
direction="row"
justifyContent="flex-start"
alignItems="flex-end"
>
<Grid item sx={{ mb: 1 }}>
<Typography component="p">{promptString}</Typography>
</Grid>
<Grid item>
<FormControl variant="standard" sx={{ m: 1, minWidth: 120 }}>
<InputLabel id="demo-simple-select-helper-label">
<Trans></Trans>
</InputLabel>
<Select
labelId="demo-simple-select-helper-label"
id="demo-simple-select-helper"
label="Age"
onChange={event => {
setVersion(event.target.value as string);
}}
defaultValue={version}
>
{versionList.map((item, i) => {
const desc =
friendlyNameList === undefined ? item : friendlyNameList[i];
return (
<MenuItem key={i} value={item}>
{desc}
</MenuItem>
);
})}
</Select>
</FormControl>
</Grid>
</Grid>
<CodeBlock language={language}>{configGen(version)}</CodeBlock>
</Box>
);
};

View File

@@ -0,0 +1,108 @@
import { PaletteMode, ThemeOptions } from '@mui/material';
import '@fontsource/poppins';
export default function configTheme(mode: PaletteMode): ThemeOptions {
return {
palette:
mode === 'light'
? {
primary: {
main: '#21a675',
},
neutral: {
main: '#f2f7f9',
},
success: {
main: '#27a881',
},
warning: {
main: '#37adc7',
},
info: {
main: '#6780da',
light: '#63a0cf;',
},
error: {
main: '#e44918',
},
background: {
default: '#F0F3F8',
},
}
: {
primary: {
main: '#39DE96',
},
neutral: {
main: '#070707',
},
success: {
main: '#27a881',
},
warning: {
main: '#37adc7',
},
info: {
main: '#6780da',
light: '#63a0cf;',
},
error: {
main: '#e44918',
},
background: {
default: '#070707',
paper: '#161718',
},
},
typography: {
h1: {
fontFamily: '"Poppins", sans-serif',
fontWeight: 700,
},
h2: {
fontFamily: '"Metropolis", sans-serif',
fontWeight: 700,
},
h3: {
fontFamily: '"Metropolis", sans-serif',
fontWeight: 700,
},
h5: {
fontFamily: '"Metropolis", sans-serif',
fontWeight: 700,
},
h6: {
fontFamily: '"Metropolis", sans-serif',
fontWeight: 700,
},
subtitle1: {
fontFamily: '"Metropolis", sans-serif',
fontWeight: 700,
},
subtitle2: {
fontFamily: '"Metropolis", sans-serif',
fontWeight: 700,
},
},
};
}
/* the code below decares customized color */
declare module '@mui/material/styles' {
interface Palette {
neutral: Palette['primary'];
}
// allow configuration using `createTheme`
interface PaletteOptions {
neutral?: PaletteOptions['primary'];
}
}
// Update the Button"s color prop options
declare module '@mui/material/Button' {
interface ButtonPropsColorOverrides {
neutral: true;
}
}

View File

@@ -0,0 +1,49 @@
import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';
import { Box, Button, Collapse } from '@mui/material/';
import natsort from 'natsort';
import * as React from 'react';
import { useTranslation } from 'react-i18next';
import File, { FileProps } from './file';
export interface FileListProps {
files: FileProps[];
}
export default ({ files }: FileListProps) => {
const { t } = useTranslation();
const [showAll, setShowAll] = React.useState<boolean>(false);
var sorter = natsort({desc: true});
files.sort(function (a, b) {
return sorter(a.name, b.name);
});
return (
<Box display="flex" flexDirection="column" alignContent="center">
<Box display="flex" gap="8px" flexWrap="wrap">
{files.map(({ name, url }, i) => (
<Collapse
unmountOnExit
in={i < 4 || showAll}
sx={{ width: { xs: '100%', md: 'calc(50% - 4px)' } }}
>
<File name={name} url={url} />
</Collapse>
))}
</Box>
{files.length > 4 && (
<Button
sx={{ mt: 1 }}
variant="text"
onClick={() => setShowAll(!showAll)}
startIcon={
showAll ? <KeyboardArrowUpIcon /> : <KeyboardArrowDownIcon />
}
>
{showAll ? t('折叠') : t('展开')}
</Button>
)}
</Box>
);
};

46
src/components/file.tsx Normal file
View File

@@ -0,0 +1,46 @@
import React from 'react';
import { Card, Grid, Typography } from '@mui/material';
import AlbumIcon from '@mui/icons-material/Album';
import { Trans } from 'gatsby-plugin-react-i18next';
import { CardActionArea } from 'gatsby-theme-material-ui';
export interface FileProps {
name: string;
url: string;
}
export default ({ name, url }: FileProps) => {
return (
<Card className="zju-mirror-card" style={{ height: '100%' }}>
<CardActionArea to={url} sx={{ p: 2 }}>
<Grid
container
direction="row"
justifyContent="flex-start"
alignItems="stretch"
spacing={1}
>
<Grid item height="0px">
<AlbumIcon color="primary" />
</Grid>
<Grid item>
<Typography
variant="subtitle1"
component="div"
color="primary"
lineHeight={1.5}
fontWeight={400}
>
<Trans>ISO</Trans>
</Typography>
</Grid>
<Grid item>
<Typography variant="subtitle1" component="div" lineHeight={1.5}>
{name}
</Typography>
</Grid>
</Grid>
</CardActionArea>
</Card>
);
};

172
src/components/footer.tsx Normal file
View File

@@ -0,0 +1,172 @@
import { Box, Grid, Link, Typography } from '@mui/material';
import { Trans } from 'gatsby-plugin-react-i18next';
import React from 'react';
import JCIOT from '../../resource/icons/jciot.svg';
import JCUT from '../../resource/icons/jcut.svg';
import JcutDark from '../../resource/icons/jcut-dark.svg';
import { useTheme } from '@mui/material';
export default () => {
const theme = useTheme();
const JCUTIcon = theme.palette.mode === 'light' ? JCUT : JcutDark;
return (
<Box sx={{ px: { xs: 4, sm: 8 }, py: 6 }}>
<Grid
container
direction="row"
justifyContent="space-between"
alignItems="flex-start"
rowSpacing={2}
>
<Grid item>
<Grid
container
direction="row"
justifyContent="flex-start"
alignItems="flex-start"
columns={2}
rowSpacing={2}
columnSpacing={8}
>
<Grid item xs={2} md={1}>
<Box maxWidth={520}>
<Typography gutterBottom variant="body2" color="text.secondary">
<Trans>
便访
</Trans>
</Typography>
<Typography gutterBottom variant="body2" color="text.secondary">
<Trans>
</Trans>
</Typography>
<Typography gutterBottom variant="body2" color="text.secondary">
<Trans>
JCIOT团队开发运行维护YangFan,ZhaoYinghao为本站建设作出的贡献
</Trans>
</Typography>
<Typography gutterBottom variant="body2" color="text.secondary">
<Trans>
ZJUSCT开源的mirror-front与清华大学TUNA开源的tunasync项目ZJUSCT与TUNA为国内开源生态作出的伟大贡献
Apache License 2.0 CC BY-NC-SA 4.0 GitHub
</Trans>
</Typography>
<Typography gutterBottom variant="body2" color="text.secondary">
<Link
href="https://github.com/ZJUSCT/mirror-issues"
color="text.secondary"
underline="hover"
>
<Trans>GitHub</Trans>
</Link>
</Typography>
<Typography variant="body2" color="text.secondary">
<Trans></Trans>
</Typography>
</Box>
</Grid>
<Grid item xs={2} md={1}>
<Grid
container
direction="row"
justifyContent="flex-start"
alignItems="flex-end"
columnSpacing={8}
>
<Grid item>
<Typography
gutterBottom
variant="body1"
color="text.secondary"
fontWeight={700}
>
<Trans>-JCIOT团队</Trans>
</Typography>
<Typography gutterBottom variant="body2">
<Link
href="mailto:mirrors@zju.edu.cn"
color="text.secondary"
underline="hover"
>
<Trans>Email</Trans>
</Link>
</Typography>
<Typography gutterBottom variant="body2">
<Link
href="https://github.com/zjusct"
color="text.secondary"
underline="hover"
>
<Trans>GitHub</Trans>
</Link>
</Typography>
<Typography gutterBottom variant="body2">
<Link
href="https://www.zjusct.io"
color="text.secondary"
underline="hover"
>
<Trans>Blog</Trans>
</Link>
</Typography>
</Grid>
<Grid item>
<Typography
gutterBottom
variant="body1"
color="text.secondary"
fontWeight={700}
>
<Trans></Trans>
</Typography>
<Typography gutterBottom variant="body2">
<Link
href="http://zuits.zju.edu.cn"
color="text.secondary"
underline="hover"
>
<Trans></Trans>
</Link>
</Typography>
<Typography gutterBottom variant="body2">
<Link
href="https://tuna.moe"
color="text.secondary"
underline="hover"
>
<Trans> TUNA </Trans>
</Link>
</Typography>
<Typography gutterBottom variant="body2">
<Link
href="https://mirrorz.org/"
color="text.secondary"
underline="hover"
>
<Trans> MirrorZ </Trans>
</Link>
</Typography>
</Grid>
</Grid>
</Grid>
</Grid>
</Grid>
<Grid item>
<Grid container direction="row" columnSpacing={4} rowSpacing={2} alignItems="center">
<Grid item>
<Link href="https://zuits.zju.edu.cn/">
<JCUT width="16rem"/>
</Link>
</Grid>
<Grid item>
<Link href="https://www.zjusct.io">
<JCUTIcon width="12rem"/>
</Link>
</Grid>
</Grid>
</Grid>
</Grid>
</Box>
);
};

View File

@@ -0,0 +1,52 @@
import { Box, Card, CardContent, Grid, Typography } from '@mui/material';
import { CardActionArea } from 'gatsby-theme-material-ui';
import * as React from 'react';
export type mirrorBrief = {
name: string;
img: React.ReactNode;
desc: string;
};
export interface FrequentlyUsedMirrorCardProps {
name: string;
icon: React.ReactNode;
desc: string;
url: string;
}
export default ({ name, icon, desc, url }: FrequentlyUsedMirrorCardProps) => {
return (
<Card className="zju-mirror-card" style={{ height: '100%' }}>
<CardActionArea to={url} style={{ height: '100%' }}>
<Grid
container
direction="column"
justifyContent="flex-start"
alignItems="center"
>
<Box sx={{ pt: 4 }}>{icon}</Box>
<CardContent>
<Grid
container
direction="column"
justifyContent="flex-start"
alignItems="center"
>
<Typography variant="h6" component="div" textAlign="center">
{name}
</Typography>
<Typography
variant="body2"
color="text.secondary"
textAlign="center"
>
{desc}
</Typography>
</Grid>
</CardContent>
</Grid>
</CardActionArea>
</Card>
);
};

View File

@@ -0,0 +1,57 @@
import TranslateIcon from '@mui/icons-material/Translate';
import IconButton from '@mui/material/IconButton';
import Menu from '@mui/material/Menu';
import MenuItem from '@mui/material/MenuItem';
import ToolTip from '@mui/material/Tooltip';
import { useI18next, useTranslation } from 'gatsby-plugin-react-i18next';
import React from 'react';
import { Link } from '../utils/i18n-link';
import '@formatjs/intl-displaynames/polyfill';
import '@formatjs/intl-displaynames/locale-data/en';
import '@formatjs/intl-displaynames/locale-data/zh';
function languageName(lang: string) {
const { language } = useI18next();
const origName = new Intl.DisplayNames([lang], { type: 'language' }).of(lang);
const name = new Intl.DisplayNames([language], { type: 'language' }).of(lang);
return origName === name ? origName : `${origName} (${name})`;
}
export default () => {
const { t } = useTranslation();
const [anchorEl, setAnchorEl] = React.useState<Element | null>(null);
const { languages, originalPath } = useI18next();
return (
<>
<ToolTip title={t('语言')}>
<IconButton
aria-label="switch languages"
color="primary"
onClick={e => setAnchorEl(e.currentTarget)}
>
<TranslateIcon fontSize="small" />
</IconButton>
</ToolTip>
<Menu
anchorEl={anchorEl}
keepMounted
open={Boolean(anchorEl)}
onClose={() => setAnchorEl(null)}
>
{languages.map(lng => (
<Link
key={lng}
to={originalPath}
language={lng}
color="inherit"
underline="none"
>
<MenuItem dense>{languageName(lng)}</MenuItem>
</Link>
))}
</Menu>
</>
);
};

View File

@@ -0,0 +1,46 @@
import InfoIcon from '@mui/icons-material/Info';
import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';
import { Tooltip } from '@mui/material';
import { IconButton } from 'gatsby-theme-material-ui';
import { useTranslation } from 'react-i18next';
import * as React from 'react';
import { usePrefs } from './preferences-context';
const nameMode = {
friendly: {
name: '显示镜像目录名称',
icon: InfoIcon,
},
raw: {
name: '显示镜像名称',
icon: InfoOutlinedIcon,
},
};
const getModeName = (m: boolean): string => (m ? 'friendly' : 'raw');
export default () => {
const { t } = useTranslation();
const [prefs, setPrefs] = usePrefs();
const modeName = getModeName(prefs.friendlyName);
const mode = modeName === 'friendly' ? nameMode.friendly : nameMode.raw;
const toggle = () => {
setPrefs({
...prefs,
friendlyName: !prefs.friendlyName,
});
};
return (
<Tooltip title={t(mode.name)}>
<IconButton
aria-label="toggle friendly name"
color="primary"
onClick={toggle}
>
<mode.icon fontSize="small" />
</IconButton>
</Tooltip>
);
};

View File

@@ -0,0 +1,50 @@
import React from 'react';
import { Link, Grid, Hidden } from '@mui/material';
import { MirrorDto } from '../types/mirror';
export default ({ data }: { data: MirrorDto[] }) => {
const caps: { [key: string]: boolean } = {};
data.forEach(mirror => {
if (mirror.id.length < 0) {
throw new Error('mirror id empty');
}
const cap = mirror.id[0].toLocaleUpperCase();
caps[cap] = true;
});
const buttons: React.ReactNode[] = [];
for (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i += 1) {
const char = String.fromCharCode(i);
if (caps[char]) {
buttons.push(
<Link href={`#${char}`} style={{ textDecoration: 'none' }}>
{char}
</Link>
);
};
}
return (
<Hidden smDown>
<Grid
container
flexDirection="column"
flexWrap="nowrap"
spacing={1}
sx={{
position: 'fixed',
bottom: '1rem',
right: '1rem',
width: 'fit-content',
}}
>
{buttons.map(fab => (
<Grid item>{fab}</Grid>
))}
</Grid>
</Hidden>
);
};

View File

@@ -0,0 +1,34 @@
import { createContext, useContext, useState } from 'react';
import * as React from 'react';
type Preferences = {
friendlyName: boolean;
};
type PrefsContextInterface = [
Preferences,
React.Dispatch<React.SetStateAction<Preferences>>
];
const defaultPrefs: Preferences = {
friendlyName: true,
};
const PrefsContext = createContext<PrefsContextInterface>(
{} as PrefsContextInterface
);
const PrefsProvider = ({ children }: { children: React.ReactNode }) => {
const [prefs, setPrefs] = useState(defaultPrefs);
const value = React.useMemo(
() => [prefs, setPrefs] as PrefsContextInterface,
[prefs]
);
return (
<PrefsContext.Provider value={value}>{children}</PrefsContext.Provider>
);
};
const usePrefs = () => useContext(PrefsContext);
export { Preferences as PrefsInterface, PrefsContext, PrefsProvider, usePrefs };

View File

@@ -0,0 +1,83 @@
import { Card, Grid, Typography, Tooltip } from '@mui/material';
import { useI18next } from 'gatsby-plugin-react-i18next';
import { CardActionArea } from 'gatsby-theme-material-ui';
import * as React from 'react';
import { Locale, Mirror } from '../types/mirror';
import StatusIndicator from './status-indicator';
import { getUrl } from '../utils/url';
import { usePrefs } from './preferences-context';
import VerifiedIcon from '@mui/icons-material/Verified';
import officialCertificatedMirrorList from '../utils/official-certificated-mirror-list';
const SearchItemCard = (props: { queryItem: Mirror }) => {
const { language } = useI18next();
const lang = language as Locale;
const [prefs, _] = usePrefs();
return (
<Card className="zju-mirror-card" style={{ height: '100%' }}>
<CardActionArea
to={getUrl(
props.queryItem.docUrl || props.queryItem.url,
!!props.queryItem.docUrl
)}
style={{ height: '100%' }}
>
<Grid
container
direction="column"
justifyContent="space-between"
alignItems="flex-start"
height="100%"
padding={2}
>
<Grid item width="100%">
<Grid
container
direction="row"
flexWrap="nowrap"
justifyContent="flex-start"
alignItems="flex-end"
spacing={1}
>
<Grid item>
<Typography variant="h6" component="div">
{prefs.friendlyName
? props.queryItem.name[lang]
: props.queryItem.id}
</Typography>
</Grid>
<Grid
item
display={
officialCertificatedMirrorList.includes(props.queryItem.id)
? 'block'
: 'none'
}
>
<Tooltip
title={
lang === 'zh'
? `已加入 ${props.queryItem.id} 官方镜像列表`
: `Added to ${props.queryItem.id} official mirror list`
}
placement="top"
>
<VerifiedIcon fontSize="small" color="primary" />
</Tooltip>
</Grid>
</Grid>
<Typography gutterBottom variant="body2" color="text.secondary">
{props.queryItem.desc[lang]}
</Typography>
</Grid>
<Grid item>
<StatusIndicator status={props.queryItem.status} fontSize={12} />
</Grid>
</Grid>
</CardActionArea>
</Card>
);
};
export default SearchItemCard;

Some files were not shown because too many files have changed in this diff Show More