Browse Source

init qrcode

master
liujiangyong 10 months ago
commit
5d2973da62
  1. 154
      .gitignore
  2. 1
      README.md
  3. 50
      api/.vscode/launch.json
  4. 36
      api/Dockerfile
  5. 3
      api/app/index.js
  6. 110
      api/app/lib/controllers/auth/index.js
  7. 87
      api/app/lib/controllers/organization/authority.js
  8. 332
      api/app/lib/controllers/organization/user.js
  9. 68
      api/app/lib/index.js
  10. 83
      api/app/lib/middlewares/api-log.js
  11. 23
      api/app/lib/middlewares/attachment.js
  12. 149
      api/app/lib/middlewares/authenticator.js
  13. 45
      api/app/lib/models/department.js
  14. 44
      api/app/lib/models/resource.js
  15. 105
      api/app/lib/models/user.js
  16. 52
      api/app/lib/models/user_resource.js
  17. 43
      api/app/lib/models/user_token.js
  18. 11
      api/app/lib/routes/auth/index.js
  19. 17
      api/app/lib/routes/index.js
  20. 28
      api/app/lib/routes/organization/authority.js
  21. 42
      api/app/lib/routes/organization/user.js
  22. 49
      api/app/lib/schedule/clearExpiredData.js
  23. 36
      api/app/lib/schedule/index.js
  24. 36
      api/app/lib/service/clickHouseClient.js
  25. 67
      api/app/lib/service/paasRequest.js
  26. 41
      api/app/lib/service/redis.js
  27. 31
      api/app/lib/service/socket.js
  28. 17
      api/app/lib/utils/index.js
  29. 62
      api/app/lib/utils/push.js
  30. 82
      api/app/lib/utils/xlsxDownload.js
  31. 150
      api/config.js
  32. 49
      api/package.json
  33. 35
      api/sequelize-automate.config.js
  34. 12
      api/server.js
  35. 25
      jenkinsfile_api
  36. 25
      jenkinsfile_web
  37. 3
      script/1.0.0/data/1.admin_user.sql
  38. 73
      script/1.0.0/schema/1.init_org_manage.sql
  39. 43
      script/1.0.0/schema/2.init_qrcode.sql
  40. 19
      web/.babelrc
  41. 23
      web/.vscode/launch.json
  42. 4
      web/.vscode/settings.json
  43. 56
      web/Dockerfile
  44. BIN
      web/client/assets/font_sc/D-DINExp-Italic.otf
  45. BIN
      web/client/assets/font_sc/PingFang SC Medium.ttf
  46. BIN
      web/client/assets/font_sc/PingFang SC Regular.ttf
  47. BIN
      web/client/assets/font_sc/YouSheBiaoTiHei-2.ttf
  48. 370
      web/client/assets/font_sc/demo.css
  49. 514
      web/client/assets/font_sc/demo_fontclass.html
  50. 695
      web/client/assets/font_sc/demo_symbol.html
  51. 552
      web/client/assets/font_sc/demo_unicode.html
  52. 175
      web/client/assets/font_sc/iconfont.css
  53. BIN
      web/client/assets/font_sc/iconfont.eot
  54. 1
      web/client/assets/font_sc/iconfont.js
  55. 270
      web/client/assets/font_sc/iconfont.svg
  56. BIN
      web/client/assets/font_sc/iconfont.ttf
  57. BIN
      web/client/assets/font_sc/iconfont.woff
  58. 1
      web/client/assets/fonticon/YaHei_Regular.typeface.json
  59. 521
      web/client/assets/fonticon/iconfont.css
  60. BIN
      web/client/assets/fonticon/iconfont.eot
  61. 1
      web/client/assets/fonticon/iconfont.js
  62. 927
      web/client/assets/fonticon/iconfont.svg
  63. BIN
      web/client/assets/fonticon/iconfont.ttf
  64. BIN
      web/client/assets/fonticon/iconfont.woff
  65. BIN
      web/client/assets/images/avatar/1.png
  66. BIN
      web/client/assets/images/avatar/10.png
  67. BIN
      web/client/assets/images/avatar/11.png
  68. BIN
      web/client/assets/images/avatar/12.png
  69. BIN
      web/client/assets/images/avatar/2.png
  70. BIN
      web/client/assets/images/avatar/3.png
  71. BIN
      web/client/assets/images/avatar/4.png
  72. BIN
      web/client/assets/images/avatar/5.png
  73. BIN
      web/client/assets/images/avatar/6.png
  74. BIN
      web/client/assets/images/avatar/7.png
  75. BIN
      web/client/assets/images/avatar/8.png
  76. BIN
      web/client/assets/images/avatar/9.png
  77. BIN
      web/client/assets/images/avatar/avatar.jpg
  78. BIN
      web/client/assets/images/login/login_a.png
  79. BIN
      web/client/assets/images/login/login_b.png
  80. BIN
      web/client/assets/images/logo.png
  81. 9
      web/client/assets/images/logo.svg
  82. BIN
      web/client/assets/images/menu/device.png
  83. 3
      web/client/assets/images/menu/home.svg
  84. 6
      web/client/assets/images/menu/issue.svg
  85. 3
      web/client/assets/images/menu/org.svg
  86. 3
      web/client/assets/images/menu/structure.svg
  87. 8
      web/client/assets/images/menu/xun.svg
  88. 109
      web/client/assets/images/no_deploy.svg
  89. BIN
      web/client/assets/images/no_qcoder.png
  90. 3
      web/client/assets/images/search.svg
  91. 6
      web/client/assets/images/show_map.svg
  92. 42
      web/client/index.ejs
  93. 49
      web/client/index.html
  94. 19
      web/client/index.js
  95. 25
      web/client/src/app.js
  96. 0
      web/client/src/components/README.txt
  97. 316
      web/client/src/components/Upload/index.js
  98. 389
      web/client/src/components/Uploads/index.js
  99. 683
      web/client/src/components/export/index.js
  100. 13
      web/client/src/components/export/index.less

154
.gitignore

@ -0,0 +1,154 @@
# ---> Go
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
# Test binary, built with `go test -c`
*.test
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
# Dependency directories (remove the comment below to include it)
# vendor/
# ---> Node
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# 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
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
.env.test
.env.production
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
*yarn.lock
*package-lock.json
*log/
*downloadFiles/
web/client/assets/color.less
package-lock.json
development.text
development.log
web/node_modules
web/log
# weapp
project.private.config.json
miniprogram_npm
web/log/development.txt
api/log/development.log

1
README.md

@ -0,0 +1 @@
# 飞尚码尚来二维码管理系统

50
api/.vscode/launch.json

@ -0,0 +1,50 @@
{
// 使 IntelliSense
//
// 访: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "启动 API",
"program": "${workspaceRoot}/server.js",
"env": {
"NODE_ENV": "development"
},
"args": [
"-p 4900",
//
// "-g postgres://FashionAdmin:123456@10.8.30.39:5432/Inspection",
"-g postgres://postgres:123456@10.8.16.77:5432/qrcode",
//
// "--apiEmisUrl http://10.8.30.161:1111",
// "--qnak XuDgkao6cL0HidoMAPnA5OB10Mc_Ew08mpIfRJK5",
// "--qnsk yewcieZLzKZuDfig0wLZ9if9jKp2P_1jd3CMJPSa",
// "--qnbkt dev-hr",
// "--qndmn http://resources.anxinyun.cn",
// "--qndmn http://rjkwed13l.hn-bkt.clouddn.com",
"--qnak 5XrM4wEB9YU6RQwT64sPzzE6cYFKZgssdP5Kj3uu",
"--qnsk w6j2ixR_i-aelc6I7S3HotKIX-ukMzcKmDfH6-M5",
"--qnbkt anxinyun-test",
"--qndmn http://test.resources.anxinyun.cn",
]
},
{
"type": "node",
"request": "launch",
"name": "run mocha",
"program": "${workspaceRoot}/node_modules/mocha/bin/_mocha",
"stopOnEntry": false,
"args": [
"app/test/*.test.js",
"--no-timeouts"
],
"cwd": "${workspaceRoot}",
"runtimeExecutable": null,
"env": {
"NODE_ENV": "development"
}
}
]
}

36
api/Dockerfile

@ -0,0 +1,36 @@
FROM registry.cn-hangzhou.aliyuncs.com/fs-devops/node:12-dev as builder
COPY ./api/ /var/app
WORKDIR /var/app
EXPOSE 8080
RUN npm config set registry=https://nexus.ngaiot.com/repository/fs-npm/
RUN echo "{\"time\":\"$BUILD_TIMESTAMP\",\"build\": \"$BUILD_NUMBER\",\"revision\": \"$SVN_REVISION_1\",\"URL\":\"$SVN_URL_1\"}" > version.json
RUN npm cache clean -f
RUN rm -rf package-lock.json
RUN npm install --registry https://nexus.ngaiot.com/repository/fs-npm/
FROM registry.cn-hangzhou.aliyuncs.com/fs-devops/node:12
COPY --from=builder --chown=node /var/app /home/node/app
WORKDIR /home/node/app
CMD ["node", "server.js"]
# 旧版本构建方式
# FROM repository.anxinyun.cn/base-images/nodejs12:20.10.12.2
# COPY . /var/app
# WORKDIR /var/app
# EXPOSE 8080
# CMD ["-u", "http://localhost:8088"]
# ENTRYPOINT [ "node", "server.js" ]

3
api/app/index.js

@ -0,0 +1,3 @@
'use strict';
module.exports = require('./lib');

110
api/app/lib/controllers/auth/index.js

@ -0,0 +1,110 @@
'use strict';
const Hex = require('crypto-js/enc-hex');
const SHA1 = require('crypto-js/sha1');
const MD5 = require('crypto-js/md5');
const moment = require('moment');
const uuid = require('uuid');
async function login(ctx, next) {
const transaction = await ctx.fs.dc.orm.transaction();
try {
const models = ctx.fs.dc.models;
const params = ctx.request.body;
let password = Hex.stringify(MD5(params.password));
const userRes = await models.User.findOne({
where: {
username: params.username,
password: password,
delete: false,
enable: true
},
attributes: { exclude: ['password'] },
include: [{
attributes: ["resourceId"],
model: models.UserResource
}]
});
if (!userRes) {
ctx.status = 400;
ctx.body = {
"message": "账号或密码错误"
}
}
if (userRes)
if (userRes && !userRes.enable) {
ctx.status = 400;
ctx.body = { message: "该用户已被禁用" }
} else {
const token = uuid.v4();
let deptInfo = null;
if (userRes) {
const { departmentId } = userRes.dataValues;
deptInfo = await models.Department.findOne({
where: {
id: departmentId
}
})
}
if (!userRes) {
ctx.status = 400;
ctx.body = { message: "暂无登录权限,请联系管理员" }
return;
}
let userData = userRes.dataValues;
let userRslt = Object.assign(userData, {
authorized: true,
token: token,
userResources: userRes ? userRes.userResources.map(r => r.resourceId) : [],
type: deptInfo ? deptInfo.type : '',
deptName: deptInfo ? deptInfo.name : '',
});
await models.UserToken.create({
token: token,
userInfo: userRslt,
expired: moment().add(30, 'days').format()
});
ctx.status = 200;
ctx.body = userRslt;
}
await transaction.commit();
} catch (error) {
await transaction.rollback();
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = {
"message": "登录失败"
}
}
}
async function logout(ctx) {
try {
const models = ctx.fs.dc.models;
const params = ctx.request.body;
await models.UserToken.destroy({
where: {
token: params.token,
}
});
ctx.status = 204;
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = {
message: typeof error == 'string' ? error : undefined
}
}
}
module.exports = {
login,
logout,
};

87
api/app/lib/controllers/organization/authority.js

@ -0,0 +1,87 @@
async function getResource(ctx, next) {
try {
const models = ctx.fs.dc.models;
const res = await models.Resource.findAll({
where: { parentResource: null },
include: [{
model: models.Resource,
}]
})
ctx.body = res;
ctx.status = 200;
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = {
"message": "查询所有权限数据失败"
}
}
}
async function getUserResource(ctx, next) {
try {
const models = ctx.fs.dc.models;
const { userId } = ctx.query;
const res = await models.UserResource.findAll({
where: { userId: userId },
include: [{
model: models.Resource,
}]
})
ctx.body = res;
ctx.status = 200;
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = {
"message": "查询用户权限数据失败"
}
}
}
async function updateUserRes(ctx, next) {
const transaction = await ctx.fs.dc.orm.transaction();
try {
const models = ctx.fs.dc.models;
const { userId, resCode } = ctx.request.body;
const res = await models.UserResource.findAll({
attributes: ["resourceId"],
raw: true,
where: { userId: userId }
})
const addRes = resCode.filter(r => !res.some(rr => rr.resourceId == r)).map(r => { return { userId: userId, resourceId: r } });
const delRes = res.filter(r => !resCode.includes(r.resourceId)).map(r => r.resourceId);
addRes.length && await models.UserResource.bulkCreate(addRes, { transaction: transaction });
delRes.length && await models.UserResource.destroy({
where: {
resourceId: { $in: delRes },
userId: userId
},
transaction: transaction
})
ctx.status = 204;
await transaction.commit();
} catch (error) {
await transaction.rollback();
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = {
"message": "更新用户权限数据失败"
}
}
}
module.exports = {
getResource,
getUserResource,
updateUserRes
};

332
api/app/lib/controllers/organization/user.js

@ -0,0 +1,332 @@
'use strict';
const Hex = require('crypto-js/enc-hex');
const MD5 = require('crypto-js/md5');
async function getDepMessage(ctx, next) {
let error = { name: 'FindError', message: '获取部门列表失败' };
let rslt = [];
try {
const models = ctx.fs.dc.models;
let list = await models.Department.findAll({});
let deptMap = []
list.filter(l => !l.dependence).map(ld => {//一级
deptMap.push({
id: ld.id,
name: ld.name,
dependence: ld.dependence,
subordinate: []
})
})
list.filter(l => l.dependence).map(ld => {//二级
let parent = deptMap.find(dm => dm.id == ld.dependence);
if (parent) {
parent.subordinate.push({
id: ld.id,
name: ld.name,
dependence: ld.dependence,
subordinate: []
})
}
})
rslt = deptMap;
error = null;
} catch (err) {
ctx.fs.logger.error(`path: ${ctx.path}, error: ${err}`);
}
if (error) {
ctx.status = 400;
ctx.body = error;
} else {
ctx.status = 200;
ctx.body = rslt;
}
}
async function createDept(ctx, next) {
const models = ctx.fs.dc.models;
try {
let rslt = ctx.request.body;
await models.Department.create(Object.assign({}, rslt, { read: 1 }))
ctx.status = 204;
ctx.body = { message: '新建部门成功' }
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = { message: '新建部门失败' }
}
}
async function updateDept(ctx, next) {
try {
const models = ctx.fs.dc.models;
const { id } = ctx.params;
const body = ctx.request.body;
await models.Department.update(
body,
{ where: { id: id } }
)
ctx.status = 204;
ctx.body = { message: '修改部门成功' }
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = { message: '修改部门失败' }
}
}
async function delDept(ctx, next) {
let errMsg = "删除部门失败";
try {
const models = ctx.fs.dc.models;
const { id } = ctx.params;
let list = await models.Department.findAll({});
let deptIds = list.map(l => l.id);
const allUsers = await models.User.findAll({
where: {
departmentId: { $in: deptIds },
delete: false
}
})
const childrenDept = await models.Department.findAll({ where: { dependence: id } })
const childrenUser = allUsers.filter(au => au.departmentId == id);
if (childrenUser.length || childrenDept.length) {
errMsg = '请先删除部门下的用户或子部门';
throw errMsg;
}
await models.Department.destroy({ where: { id: id } });
await models.Department.destroy({ where: { dependence: id } });
ctx.status = 204;
ctx.body = { message: '删除部门成功' }
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = { message: error }
}
}
async function getUser(ctx, next) {
try {
const models = ctx.fs.dc.models;
const { depId } = ctx.params;
let userRes = null;
if (depId !== 'undefined' && depId !== 'null') {
userRes = await models.User.findAll({
where: {
departmentId: parseInt(depId),
delete: false
},
attributes: { exclude: ['password'] },
order: [['id', 'asc']],
})
} else {
userRes = await models.User.findAll({
where: {
delete: false
},
attributes: { exclude: ['password'] },
order: [['id', 'asc']],
include: [{
required: true,
model: models.Department,
attributes: ['id', 'name'],
}]
})
}
ctx.status = 200;
ctx.body = userRes
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = {
"message": "获取用户信息失败"
}
}
}
async function creatUser(ctx, next) {
let errMsg = "新建用户失败"
try {
const models = ctx.fs.dc.models;
const data = ctx.request.body;
let repeatUserNameCount = await models.User.count({
where: {
username: data.phone,
delete: false
}
})
if (repeatUserNameCount) {
errMsg = '已有当前用户名'
throw errMsg
}
await models.User.create({
role: data.role,
name: data.name,
username: data.phone,
password: Hex.stringify(MD5(data.password)),
departmentId: data.departmentId,
email: data.email,
enable: data.enable,
delete: false,
phone: data.phone,
post: data.post,
structure: data.structure
})
ctx.status = 204;
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = {
"message": errMsg
}
}
}
async function updateUser(ctx, next) {
let errMsg = "修改用户失败"
try {
const models = ctx.fs.dc.models;
const data = ctx.request.body;
const { id } = ctx.params;
let repeatUserNameCount = await models.User.count({
where: {
username: data.username
}
})
if (repeatUserNameCount) {
errMsg = '已有当前用户名'
throw errMsg
}
await models.User.update({
role: data.role,
name: data.name,
username: data.phone,
departmentId: data.departmentId,
email: data.email,
enable: data.enable,
delete: false,
phone: data.phone,
post: data.post,
structure: data.structure
}, {
where: {
id: id
}
});
ctx.status = 204;
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = {
"message": errMsg
}
}
}
async function deleteUser(ctx, next) {
try {
const models = ctx.fs.dc.models;
const { ids } = ctx.params;
const userIds = ids.split(',');
await models.User.update({
delete: true,
}, {
where: {
id: { $in: userIds },
}
});
ctx.status = 204;
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = {
"message": "删除用户失败"
}
}
}
async function resetPwd(ctx, next) {
try {
const models = ctx.fs.dc.models;
const { id } = ctx.params;
const data = ctx.request.body;
await models.User.update({
password: Hex.stringify(MD5(data.password)),
}, {
where: {
id: id,
}
});
ctx.status = 204;
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = {
"message": "重置用户密码失败"
}
}
}
/**
* 修改用户密码
* @params {userId-用户Id} ctx
* @request.body {password-用户新密码} ctx
*/
async function updateUserPassword(ctx, next) {
try {
const models = ctx.fs.dc.models;
const { userId } = ctx.params;
const { password } = ctx.request.body;
if (!password) {
ctx.status = 400;
ctx.body = { "message": "请输入修改密码" };
return;
}
const userRes = await models.User.findOne({
where: {
id: userId
},
attributes: ['id']
});
if (userRes) {
await models.User.update({ password: Hex.stringify(MD5(password)) }, { where: { id: userId, } });
ctx.status = 204;
} else {
ctx.status = 400;
ctx.body = {
"message": "用户不存在"
}
}
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = {
"message": "修改用户密码失败"
}
}
}
module.exports = {
getDepMessage,
createDept,
updateDept,
delDept,
getUser,
creatUser,
updateUser,
deleteUser,
resetPwd,
updateUserPassword,
}

68
api/app/lib/index.js

@ -0,0 +1,68 @@
'use strict';
const fs = require('fs');
const path = require('path');
const utils = require('./utils')
const routes = require('./routes');
//const redisConnect = require('./service/redis')
const socketConect = require('./service/socket')
//const paasRequest = require('./service/paasRequest');
const authenticator = require('./middlewares/authenticator');
//const clickHouseClient = require('./service/clickHouseClient')
const schedule = require('./schedule')
// const apiLog = require('./middlewares/api-log');
module.exports.entry = function (app, router, opts) {
app.fs.logger.log('info', '[FS-AUTH]', 'Inject auth and api mv into router.');
app.fs.api = app.fs.api || {};
app.fs.opts = opts || {};
app.fs.utils = app.fs.utils || {};
app.fs.api.authAttr = app.fs.api.authAttr || {};
app.fs.api.logAttr = app.fs.api.logAttr || {};
// 顺序固定 ↓
//redisConnect(app, opts)
socketConect(app, opts)
// 实例其他平台请求方法
//paasRequest(app, opts)
// clickHouse 数据库 client
//clickHouseClient(app, opts)
// 工具类函数
utils(app, opts)
// 定时任务
schedule(app, opts)
//鉴权中间件
router.use(authenticator(app, opts));
// 日志记录
// router.use(apiLog(app, opts));
router = routes(app, router, opts);
};
module.exports.models = function (dc) { // dc = { orm: Sequelize对象, ORM: Sequelize, models: {} }
// 模型关系摘出来 初始化之后再定义关系才行
fs.readdirSync(path.join(__dirname, '/models')).forEach((filename) => {
require(`./models/${filename}`)(dc)
});
const { Department, User, UserResource, Resource, } = dc.models;
UserResource.belongsTo(User, { foreignKey: 'userId', targetKey: 'id' });
User.hasMany(UserResource, { foreignKey: 'userId', sourceKey: 'id' });
UserResource.belongsTo(Resource, { foreignKey: 'resourceId', targetKey: 'code' });
Resource.hasMany(UserResource, { foreignKey: 'resourceId', sourceKey: 'code' });
Resource.hasMany(Resource, { foreignKey: 'parentResource', sourceKey: 'code' });
User.belongsTo(Department, { foreignKey: 'departmentId', targetKey: 'id' });
Department.hasMany(User, { foreignKey: 'departmentId', sourceKey: 'id' });
};

83
api/app/lib/middlewares/api-log.js

@ -0,0 +1,83 @@
/**
* Created by PengPeng on 2017/4/26.
*/
'use strict';
const moment = require('moment');
const pathToRegexp = require('path-to-regexp');
function factory(app, opts) {
async function sendToEsAsync(producer, payloads) {
return new Promise((resolve, reject) => {
producer.send(payloads, function (err) {
if (err) {
reject(err);
} else {
resolve();
}
});
})
}
async function logger(ctx, next) {
const { path, method } = ctx;
const start = Date.now();
// 等待路由处理
await next();
try {
let logAttr = null;
for (let prop in app.fs.api.logAttr) {
let keys = [];
let re = pathToRegexp(prop.replace(/\:[A-Za-z_\-]+\b/g, '(\\d+)'), keys);
if (re.test(`${method}${path}`)) {
logAttr = app.fs.api.logAttr[prop];
break;
}
}
let parameter = null, parameterShow = null, user_id, _token, app_key;
if (ctx.fs.api) {
const { actionParameter, actionParameterShow, userId, token, appKey } = ctx.fs.api;
parameter = actionParameter;
parameterShow = actionParameterShow;
user_id = userId;
_token = token;
app_key = appKey;
}
const producer = ctx.fs.kafka.producer;
const message = {
log_time: moment().toISOString(),
method: method,
content: logAttr ? logAttr.content : '',
parameter: JSON.stringify(parameter) || JSON.stringify(ctx.request.body),
parameter_show: parameterShow,
visible: logAttr ? logAttr.visible : true,
cost: Date.now() - start,
status_code: ctx.status,
url: ctx.request.url,
user_agent: ctx.request.headers["user-agent"],
user_id: user_id,
session: _token,
app_key: app_key,
header: JSON.stringify(ctx.request.headers),
ip: ctx.request.headers["x-real-ip"] || ctx.ip
};
const payloads = [{
topic: `${opts.kafka.topicPrefix}`,
messages: [JSON.stringify(message)],
partition: 0
}];
// await sendToEsAsync(producer, payloads);
} catch (e) {
ctx.fs.logger.error(`日志记录失败: ${e}`);
}
}
return logger;
}
module.exports = factory;

23
api/app/lib/middlewares/attachment.js

@ -0,0 +1,23 @@
/**
* Created by PengLing on 2018/1/2.
*/
'use strict';
const Attachment = require('fs-attachment');
module.exports = {
entry: function (app, router, opts) {
const attachment = new Attachment(opts);
app.fs = app.fs || {};
app.fs.attachment = attachment;
app.fs.logger.log('debug', 'init fs.attachment and inject it into app(app.fs.attachment) and runtime ctx(ctx.fs.attachment)');
return async (ctx, next) => {
ctx.fs = ctx.fs || {};
ctx.fs.attachment = attachment;
await next();
};
}
};

149
api/app/lib/middlewares/authenticator.js

@ -0,0 +1,149 @@
/**
* Created by PengLing on 2017/3/27.
*/
'use strict';
const pathToRegexp = require('path-to-regexp');
const util = require('util');
const moment = require('moment');
class ExcludesUrls {
constructor(opts) {
this.allUrls = undefined;
this.reload(opts);
}
sanitizePath (path) {
if (!path) return '/';
const p = '/' + path.replace(/^\/+/i, '').replace(/\/+$/, '').replace(/\/{2,}/, '/');
return p;
}
reload (opts) {
// load all url
if (!this.allUrls) {
this.allUrls = opts;
let that = this;
this.allUrls.forEach(function (url, i, arr) {
if (typeof url === "string") {
url = { p: url, o: '*' };
arr[i] = url;
}
const keys = [];
let eachPath = url.p;
url.p = (!eachPath || eachPath === '(.*)' || util.isRegExp(eachPath)) ? eachPath : that.sanitizePath(eachPath);
url.pregexp = pathToRegexp(eachPath, keys);
});
}
}
isExcluded (path, method) {
return this.allUrls.some(function (url) {
return !url.auth
&& url.pregexp.test(path)
&& (url.o === '*' || url.o.indexOf(method) !== -1);
});
}
}
/**
* 判断Url是否不鉴权
* @param {*} opts {exclude: [*] or []}'*'['*']:跳过所有路由; []:所有路由都要验证
* @param {*} path 当前request的path
* @param {*} method 当前request的method
*/
let isPathExcluded = function (opts, path, method) {
let excludeAll = Boolean(opts.exclude && opts.exclude.length && opts.exclude[0] == '*');
let excludes = null;
if (!excludeAll) {
let excludeOpts = opts.exclude || [];
excludeOpts.push({ p: '/login', o: 'POST' });
excludeOpts.push({ p: '/logout', o: 'PUT' });
excludes = new ExcludesUrls(excludeOpts);
}
let excluded = excludeAll || excludes.isExcluded(path, method);
return excluded;
};
let authorizeToken = async function (ctx, token) {
let rslt = null;
const tokenFormatRegexp = /^(\{{0,1}([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}\}{0,1})$/g;
if (token && tokenFormatRegexp.test(token)) {
try {
const authorizeRes = await ctx.fs.dc.models.UserToken.findOne({
where: {
token: token
}
})
const { userInfo, expired } = authorizeRes;
if (expired && moment().valueOf() <= moment(expired).valueOf()) {
rslt = {
'authorized': userInfo.authorized,
'resources': (userInfo || {}).resources || [],
};
ctx.fs.api.userId = userInfo.id;
ctx.fs.api.userInfo = userInfo;
ctx.fs.api.token = token;
}
} catch (err) {
const { error } = err.response || {};
ctx.fs.logger.log('[anxinyun]', '[AUTH] failed', (error || {}).message || `cannot GET /users/${token}`);
}
}
return rslt;
};
let isResourceAvailable = function (resources, options) {
let authCode = null;
// authorize user by authorization attribute
const { authAttr, method, path } = options;
for (let prop in authAttr) {
let keys = [];
let re = pathToRegexp(prop.replace(/\:[A-Za-z_\-]+\b/g, '(\\d+)'), keys);
if (re.test(`${method}${path}`)) {
authCode = authAttr[prop];
break;
}
}
return !authCode || (resources || []).some(code => code === authCode);
};
function factory (app, opts) {
return async function auth (ctx, next) {
const { path, method, header, query } = ctx;
ctx.fs.logger.log('[AUTH] start', path, method);
ctx.fs.api = ctx.fs.api || {};
ctx.fs.port = opts.port;
ctx.redis = app.redis;
ctx.redisTools = app.redisTools;
let error = null;
if (path) {
if (!isPathExcluded(opts, path, method)) {
const user = await authorizeToken(ctx, header.token || query.token);
if (user && user.authorized) {
// if (!isResourceAvailable(user.resources, { authAttr: app.fs.auth.authAttr, path, method })) {
// error = { status: 403, name: 'Forbidden' }
// } else {
// error = { status: 401, name: 'Unauthorized' }
// }
} else {
error = { status: 401, name: 'Unauthorized' }
}
}
} else {
error = { status: 401, name: 'Unauthorized' };
}
if (error) {
ctx.fs.logger.log('[AUTH] failed', path, method);
ctx.status = error.status;
ctx.body = error.name;
} else {
ctx.fs.logger.log('[AUTH] passed', path, method);
await next();
}
}
}
module.exports = factory;

45
api/app/lib/models/department.js

@ -0,0 +1,45 @@
/* eslint-disable*/
'use strict';
module.exports = dc => {
const DataTypes = dc.ORM;
const sequelize = dc.orm;
const Department = sequelize.define("department", {
id: {
type: DataTypes.INTEGER,
allowNull: false,
defaultValue: null,
comment: null,
primaryKey: true,
field: "id",
autoIncrement: true,
unique: "department_id_uindex"
},
name: {
type: DataTypes.STRING,
allowNull: false,
defaultValue: null,
comment: null,
primaryKey: false,
field: "name",
autoIncrement: false
},
dependence: {
type: DataTypes.INTEGER,
allowNull: true,
defaultValue: null,
comment: "上级部门/从属",
primaryKey: false,
field: "dependence",
autoIncrement: false
},
}, {
tableName: "department",
comment: "",
indexes: []
});
dc.models.Department = Department;
return Department;
};

44
api/app/lib/models/resource.js

@ -0,0 +1,44 @@
/* eslint-disable*/
'use strict';
module.exports = dc => {
const DataTypes = dc.ORM;
const sequelize = dc.orm;
const Resource = sequelize.define("resource", {
code: {
type: DataTypes.STRING,
allowNull: false,
defaultValue: null,
comment: null,
primaryKey: true,
field: "code",
autoIncrement: false,
unique: "resource_code_uindex"
},
name: {
type: DataTypes.STRING,
allowNull: false,
defaultValue: null,
comment: null,
primaryKey: false,
field: "name",
autoIncrement: false,
unique: "resource_name_uindex"
},
parentResource: {
type: DataTypes.STRING,
allowNull: true,
defaultValue: null,
comment: null,
primaryKey: false,
field: "parent_resource",
autoIncrement: false
}
}, {
tableName: "resource",
comment: "",
indexes: []
});
dc.models.Resource = Resource;
return Resource;
};

105
api/app/lib/models/user.js

@ -0,0 +1,105 @@
/* eslint-disable*/
'use strict';
module.exports = dc => {
const DataTypes = dc.ORM;
const sequelize = dc.orm;
const User = sequelize.define("user", {
id: {
type: DataTypes.INTEGER,
allowNull: false,
defaultValue: null,
comment: null,
primaryKey: true,
field: "id",
autoIncrement: true
},
name: {
type: DataTypes.STRING,
allowNull: false,
defaultValue: null,
comment: null,
primaryKey: false,
field: "name",
autoIncrement: false
},
username: {
type: DataTypes.STRING,
allowNull: false,
defaultValue: null,
comment: "用户名 账号",
primaryKey: false,
field: "username",
autoIncrement: false
},
password: {
type: DataTypes.STRING,
allowNull: false,
defaultValue: null,
comment: null,
primaryKey: false,
field: "password",
autoIncrement: false
},
departmentId: {
type: DataTypes.INTEGER,
allowNull: false,
defaultValue: null,
comment: "部门id",
primaryKey: false,
field: "department_id",
autoIncrement: false
},
email: {
type: DataTypes.STRING,
allowNull: true,
defaultValue: null,
comment: null,
primaryKey: false,
field: "email",
autoIncrement: false
},
enable: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: null,
comment: "启用状态",
primaryKey: false,
field: "enable",
autoIncrement: false
},
delete: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: null,
comment: null,
primaryKey: false,
field: "delete",
autoIncrement: false
},
phone: {
type: DataTypes.STRING,
allowNull: false,
defaultValue: null,
comment: "手机号(小程序使用手机号登录)",
primaryKey: false,
field: "phone",
autoIncrement: false
},
post: {
type: DataTypes.STRING,
allowNull: true,
defaultValue: null,
comment: "职位",
primaryKey: false,
field: "post",
autoIncrement: false
},
}, {
tableName: "user",
comment: "",
indexes: []
});
dc.models.User = User;
return User;
};

52
api/app/lib/models/user_resource.js

@ -0,0 +1,52 @@
/* eslint-disable*/
'use strict';
module.exports = dc => {
const DataTypes = dc.ORM;
const sequelize = dc.orm;
const UserResource = sequelize.define("userResource", {
id: {
type: DataTypes.INTEGER,
allowNull: false,
defaultValue: null,
comment: null,
primaryKey: true,
field: "id",
autoIncrement: true,
unique: "post_resource_id_uindex"
},
userId: {
type: DataTypes.INTEGER,
allowNull: false,
defaultValue: null,
comment: null,
primaryKey: false,
field: "user_id",
autoIncrement: false,
references: {
key: "id",
model: "post"
}
},
resourceId: {
type: DataTypes.STRING,
allowNull: false,
defaultValue: null,
comment: null,
primaryKey: false,
field: "resource",
autoIncrement: false,
references: {
key: "code",
model: "resource"
}
}
}, {
tableName: "user_resource",
comment: "",
indexes: []
});
dc.models.UserResource = UserResource;
return UserResource;
};

43
api/app/lib/models/user_token.js

@ -0,0 +1,43 @@
/* eslint-disable*/
'use strict';
module.exports = dc => {
const DataTypes = dc.ORM;
const sequelize = dc.orm;
const UserToken = sequelize.define("userToken", {
token: {
type: DataTypes.UUIDV4,
allowNull: false,
defaultValue: null,
comment: null,
primaryKey: true,
field: "token",
autoIncrement: false,
unique: "user_token_token_uindex"
},
userInfo: {
type: DataTypes.JSONB,
allowNull: false,
defaultValue: null,
comment: null,
primaryKey: false,
field: "user_info",
autoIncrement: false
},
expired: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: null,
comment: null,
primaryKey: false,
field: "expired",
autoIncrement: false
}
}, {
tableName: "user_token",
comment: "",
indexes: []
});
dc.models.UserToken = UserToken;
return UserToken;
};

11
api/app/lib/routes/auth/index.js

@ -0,0 +1,11 @@
'use strict';
const auth = require('../../controllers/auth');
module.exports = function (app, router, opts) {
app.fs.api.logAttr['POST/login'] = { content: '登录', visible: true };
router.post('/login', auth.login);
app.fs.api.logAttr['PUT/logout'] = { content: '登出', visible: false };
router.put('/logout', auth.logout);
};

17
api/app/lib/routes/index.js

@ -0,0 +1,17 @@
'use strict';
const path = require('path');
const fs = require('fs');
module.exports = function (app, router, opts) {
fs.readdirSync(__dirname).forEach((filename) => {
if (filename.indexOf('.') !== 0 && fs.lstatSync(path.join(__dirname, filename)).isDirectory()) {
fs.readdirSync(path.join(__dirname, filename)).forEach((api) => {
if (api.indexOf('.') == 0 || api.indexOf('.js') == -1) return;
require(`./${filename}/${api}`)(app, router, opts);
});
}
});
return router;
};

28
api/app/lib/routes/organization/authority.js

@ -0,0 +1,28 @@
'use strict';
const Authority = require('../../controllers/organization/authority');
module.exports = function (app, router, opts) {
/**
* @api {GET} resource 查询所有权限码.
* @apiVersion 1.0.0
* @apiGroup Org
*/
app.fs.api.logAttr['GET/resource'] = { content: '查询所有权限码', visible: true };
router.get('resource', Authority.getResource);
/**
* @api {GET} user/resource 查询用户权限.
* @apiVersion 1.0.0
* @apiGroup Org
*/
app.fs.api.logAttr['GET/user/resource'] = { content: '查询用户权限', visible: true };
router.get('user/resource', Authority.getUserResource);
/**
* @api {POST} user/resource 更新用户权限.
* @apiVersion 1.0.0
* @apiGroup Org
*/
app.fs.api.logAttr['POST/user/resource'] = { content: '更新用户权限', visible: true };
router.post('user/resource', Authority.updateUserRes);
};

42
api/app/lib/routes/organization/user.js

@ -0,0 +1,42 @@
'use strict';
const user = require('../../controllers/organization/user');
module.exports = function (app, router, opts) {
app.fs.api.logAttr['GET/organization/department'] = { content: '获取部门信息', visible: false };
router.get('/organization/department', user.getDepMessage);
app.fs.api.logAttr['POST/organization/dept/add'] = { content: '新增部门', visible: true };
router.post('/organization/dept/add', user.createDept);
app.fs.api.logAttr['PUT/organization/dept/:id/modify'] = { content: '修改部门', visible: true };
router.put('/organization/dept/:id/modify', user.updateDept);
app.fs.api.logAttr['DELETE/organization/dept/:id'] = { content: '删除部门', visible: true };
router.del('/organization/dept/:id', user.delDept);
app.fs.api.logAttr['GET/organization/department/:depId/user'] = { content: '获取部门下用户信息', visible: false };
router.get('/organization/department/:depId/user', user.getUser);
app.fs.api.logAttr['POST/organization/department/user'] = { content: '创建部门下用户信息', visible: false };
router.post('/organization/department/user', user.creatUser);
app.fs.api.logAttr['PUT/organization/department/user/:id'] = { content: '修改部门下用户信息', visible: false };
router.put('/organization/department/user/:id', user.updateUser);
app.fs.api.logAttr['DEL/organization/department/user/:ids'] = { content: '删除部门下用户信息', visible: false };
router.del('/organization/department/user/:ids', user.deleteUser);
app.fs.api.logAttr['PUT/organization/department/user/resetPwd/:id'] = { content: '重置用户密码', visible: false };
router.put('/organization/department/user/resetPwd/:id', user.resetPwd);
/**
* @api {PUT} user/password/:id 修改用户密码
* @apiVersion 1.0.0
* @apiGroup Organization
*/
app.fs.api.logAttr['PUT/user/password/:userId'] = { content: '修改用户密码', visible: false };
router.put('/user/password/:userId', user.updateUserPassword);
};

49
api/app/lib/schedule/clearExpiredData.js

@ -0,0 +1,49 @@
const moment = require('moment')
const rimraf = require('rimraf');
const fs = require("fs");
const path = require("path")
let TEST = false
// TEST = true
module.exports = function (app, opts) {
const clearExpiredData = app.fs.scheduleInit(
{
interval: '42 24 4 */3 * *',
immediate: TEST,
proRun: !TEST,
},
async () => {
try {
const { models } = app.fs.dc
const now = moment().format('YYYY-MM-DD HH:mm:ss')
await models.UserToken.destroy({
where: {
expired: { $lt: now }
}
})
fs.readdir(path.join(__dirname, `../../downloadFiles`), function (err, files) {
if (err) {
return;
}
files.forEach((file) => {
fs.stat(path.join(__dirname, `../../downloadFiles/${file}`), (err, stats) => {
if (err) {
//return;
} else {
rimraf.sync(path.join(__dirname, `../../downloadFiles/${file}`));
}
});
});
});
} catch (error) {
app.fs.logger.error(`sechedule: clearExpiredToken, error: ${error}`);
}
}
);
return {
clearExpiredData
}
}

36
api/app/lib/schedule/index.js

@ -0,0 +1,36 @@
'use strict';
const fs = require('fs');
const nodeSchedule = require('node-schedule');
// 将定时任务汇集未来可根据需要选取操作
module.exports = async function (app, opts) {
const scheduleInit = ({
interval, immediate, proRun,
}, callback) => {
if (proRun && opts.dev) {
return;
}
const j = nodeSchedule.scheduleJob(interval, callback);
if (immediate && (!proRun || (proRun && !opts.dev))) {
setTimeout(callback, 0)
}
return j;
}
app.fs.scheduleInit = scheduleInit
fs.readdirSync(__dirname).forEach((filename) => {
if (!['index.js'].some(f => filename == f)) {
const scheduleList = require(`./${filename}`)(app, opts)
for (let k of Object.keys(scheduleList)) {
console.info(`定时任务 ${k} 启动`);
}
app.fs.schedule = {
...app.fs.schedule,
...scheduleList,
}
}
});
};

36
api/app/lib/service/clickHouseClient.js

@ -0,0 +1,36 @@
'use strict';
const { ClickHouse } = require('clickhouse');
function factory (app, opts) {
if (opts.clickHouse) {
try {
app.fs.clickHouse = {}
const { url, port, user, password, db = [] } = opts.clickHouse
for (let d of db) {
if (d.name && d.db) {
app.fs.clickHouse[d.name] = new ClickHouse({
url: url,
port: port,
debug: opts.dev,
format: "json",
basicAuth: user && password ? {
username: user,
password: password,
} : null,
config: {
database: d.db,
},
})
console.info(`ClickHouse ${d.name} 初始化完成`);
} else {
throw 'opts.clickHouse 参数错误!'
}
}
} catch (error) {
console.error(error)
process.exit(-1);
}
}
}
module.exports = factory;

67
api/app/lib/service/paasRequest.js

@ -0,0 +1,67 @@
'use strict';
const request = require('superagent')
class paasRequest {
constructor(root, { query = {} } = {}, option) {
this.root = root;
this.query = query
this.option = option
}
#buildUrl = (url) => {
return `${this.root}/${url}`;
}
#resultHandler = (resolve, reject) => {
return (err, res) => {
if (err) {
reject(err);
} else {
resolve(res[this.option.dataWord]);
}
};
}
get = (url, { query = {}, header = {} } = {}) => {
return new Promise((resolve, reject) => {
request.get(this.#buildUrl(url)).set(header).query(Object.assign(query, this.query)).end(this.#resultHandler(resolve, reject));
})
}
post = (url, { data = {}, query = {}, header = {} } = {}) => {
return new Promise((resolve, reject) => {
request.post(this.#buildUrl(url)).set(header).query(Object.assign(query, this.query)).send(data).end(this.#resultHandler(resolve, reject));
})
}
put = (url, { data = {}, header = {}, query = {}, } = {}) => {
return new Promise((resolve, reject) => {
request.put(this.#buildUrl(url)).set(header).query(Object.assign(query, this.query)).send(data).end(this.#resultHandler(resolve, reject));
})
}
delete = (url, { header = {}, query = {} } = {}) => {
return new Promise((resolve, reject) => {
request.delete(this.#buildUrl(url)).set(header).query(Object.assign(query, this.query)).end(this.#resultHandler(resolve, reject));
})
}
}
function factory (app, opts) {
if (opts.pssaRequest) {
try {
for (let r of opts.pssaRequest) {
if (r.name && r.root) {
app.fs[r.name] = new paasRequest(r.root, { ...(r.params || {}) }, { dataWord: r.dataWord || 'body' })
} else {
throw 'opts.pssaRequest 参数错误!'
}
}
} catch (error) {
console.error(error)
process.exit(-1);
}
}
}
module.exports = factory;

41
api/app/lib/service/redis.js

@ -0,0 +1,41 @@
'use strict';
// https://github.com/luin/ioredis
const redis = require("ioredis")
module.exports = async function factory (app, opts) {
let client = opts.redis.pwd ?
new redis.Cluster([
{
host: opts.redis.host,
port: opts.redis.port
}
], {
redisOptions: {
password: opts.redis.pwd,
},
})
: new redis(opts.redis.port, opts.redis.host, {
password: opts.redis.pwd,
});
client.on("error", function (err) {
app.fs.logger.error('info', '[FS-AUTH-REDIS]', `redis connect error. ${opts.redis.host + ':' + opts.redis.port}`);
// console.error("Error :", err);
// process.exit(-1);
});
client.on('connect', function () {
console.info(`redis connect success ${opts.redis.host + ':' + opts.redis.port}`);
})
// 自定义方法
async function hdelall (key) {
const obj = await client.hgetall(key);
await client.hdel(key, Object.keys(obj))
}
app.redis = client
app.redisTools = {
hdelall,
}
}

31
api/app/lib/service/socket.js

@ -0,0 +1,31 @@
'use strict';
const moment = require('moment')
module.exports = async function factory (app, opts) {
app.socket.on('connection', async (socket) => {
console.info('WEB_SOCKET token:' + socket.handshake.query.token + ' 已连接:id ' + socket.id + ' 时间:' + moment(socket.handshake.time).format());
socket.on('disconnecting', async (reason) => {
const connectSeconds = moment().diff(moment(socket.handshake.time), 'seconds')
console.info('WEB_SOCKET token:' + socket.handshake.query.token + ' 已断开连接:' + reason + ' 连接时长:' + connectSeconds + 's');
})
})
// 使用测试 保持链接
// setInterval(async () => {
// const { connected } = app.socket.sockets
// const roomId = 'ROOM_' + Math.random()
// // if (connected) {
// // for (let c in connected) {
// // connected[c].join(roomId)
// // }
// // app.socket.to(roomId).emit('TEST', { someProperty: `【星域 ROOM:${roomId}】呼叫自然选择号!!!`, })
// // }
// app.socket.emit('TEST', { someProperty: '【广播】呼叫青铜时代号!!!', })
// }, 3000)
}

17
api/app/lib/utils/index.js

@ -0,0 +1,17 @@
'use strict';
const path = require('path');
const fs = require('fs');
module.exports = async function (app, opts) {
fs.readdirSync(__dirname).forEach((filename) => {
if (!['index.js'].some(f => filename == f)) {
const utils = require(`./${filename}`)(app, opts)
console.log(`载入 ${filename} 工具集成功`);
app.fs.utils = {
...app.fs.utils,
...utils,
}
}
});
};

62
api/app/lib/utils/push.js

@ -0,0 +1,62 @@
'use strict';
const moment = require('moment')
const Core = require('@alicloud/pop-core');
const nodemailer = require('nodemailer')
module.exports = function (app, opts) {
const pushBySms = async ({ phone = [], templateCode, templateParam } = {}) => {
try {
if (phone.length) {
const client = new Core({
accessKeyId: opts.sms.accessKey,
accessKeySecret: opts.sms.accessSecret,
endpoint: 'http://dysmsapi.aliyuncs.com',//固定
apiVersion: '2017-05-25'//固定
});
const SendSmsRes = await client.request('SendSms', {
"PhoneNumbers": phone.join(','),//接收短信的手机号码。
"SignName": "隧道智慧运维助手",//短信签名名称。必须是已添加、并通过审核的短信签名。
"TemplateCode": templateCode,//短信模板ID。必须是已添加、并通过审核的短信签名;且发送国际/港澳台消息时,请使用国际/港澳台短信模版。
"TemplateParam": JSON.stringify(templateParam)//短信模板变量对应的实际值,JSON格式。
}, {
method: 'POST'
});
return SendSmsRes
}
} catch (error) {
throw error
}
}
const pushByEmail = async ({ email = [], title, text = '', html = '', attachments = undefined } = {}) => {
try {
let transporter = nodemailer.createTransport({
host: opts.email.host,
port: opts.email.port,
secure: true,
auth: {
user: opts.email.sender.address,
pass: opts.email.sender.password,
}
});
// send mail with defined transport object
await transporter.sendMail({
from: `${opts.email.sender.name}<${opts.email.sender.address}>`, // sender address
to: email.join(','), // list of receivers 逗号分隔字符串
subject: title, // Subject line
text: text, // plain text body
html: html, // html body
attachments: attachments
});
} catch (error) {
throw error
}
}
return {
pushByEmail,
pushBySms,
}
}

82
api/app/lib/utils/xlsxDownload.js

@ -0,0 +1,82 @@
'use strict';
const fs = require('fs');
const xlsx = require('better-xlsx');
const path = require('path')
const moment = require('moment')
module.exports = function (app, opts) {
//递归创建目录 同步方法
async function makeDir (dir) {
if (!fs.existsSync(dir)) {
makeDir(path.dirname(dir))
fs.mkdirSync(dir, function (err) {
if (err) {
throw err
}
});
}
}
async function simpleExcelDown ({ data = [], header = [], fileName = moment().format('YYYY-MM-DD HH:mm:ss') } = {}) {
const fileDirPath = path.join(__dirname, `../../downloadFiles`)
makeDir(fileDirPath)
const file = new xlsx.File();
const sheet_1 = file.addSheet('sheet_1');
// header
const headerStyle = new xlsx.Style();
headerStyle.align.h = 'center';
headerStyle.align.v = 'center';
headerStyle.border.right = 'thin';
headerStyle.border.rightColor = '#000000';
headerStyle.border.bottom = 'thin';
headerStyle.border.bottomColor = '#000000';
const headerRow = sheet_1.addRow();
const indexCell = headerRow.addCell();
indexCell.value = '序号'
indexCell.style = headerStyle
for (let h of header) {
const cell = headerRow.addCell();
cell.value = h.title;
cell.style = headerStyle
}
// data
const style = new xlsx.Style();
style.align.h = 'left';
style.align.v = 'center';
style.border.right = 'thin';
style.border.rightColor = '#000000';
style.border.bottom = 'thin';
style.border.bottomColor = '#000000';
for (let i = 0; i < data.length; i++) {
const row = sheet_1.addRow();
const indexCell = row.addCell();
indexCell.value = i + 1
indexCell.style = headerStyle
for (let h of header) {
const cell = row.addCell();
cell.value = data[i][h.key] || h.defaultValue || '-';
cell.style = style
}
}
const savePath = path.join(fileDirPath, fileName)
await new Promise(function (resolve, reject) {
file.saveAs()
.pipe(fs.createWriteStream(savePath))
.on('finish', () => {
resolve()
});
})
return savePath
}
return {
simpleExcelDown,
makeDir
}
}

150
api/config.js

@ -0,0 +1,150 @@
'use strict';
/*jslint node:true*/
const path = require('path');
const os = require('os');
const moment = require('moment');
const args = require('args');
const dev = process.env.NODE_ENV == 'development';
// 启动参数
args.option(['p', 'port'], '启动端口');
args.option(['g', 'pg'], 'postgre 服务 URL');
// 七牛云存储参数
args.option('qnak', 'qiniuAccessKey');
args.option('qnsk', 'qiniuSecretKey');
args.option('qnbkt', 'qiniuBucket');
args.option('qndmn', 'qiniuDomain');
const flags = args.parse(process.argv);
const QRCODE_DB = process.env.QRCODE_DB || flags.pg;
// 七牛云存储参数
const QINIU_DOMAIN_QNDMN_RESOURCE = process.env.ANXINCLOUD_QINIU_DOMAIN_QNDMN_RESOURCE || flags.qndmn;
const QINIU_BUCKET_RESOURCE = process.env.ANXINCLOUD_QINIU_BUCKET_RESOURCE || flags.qnbkt;
const QINIU_AK = process.env.ANXINCLOUD_QINIU_ACCESSKEY || flags.qnak;
const QINIU_SK = process.env.ANXINCLOUD_QINIU_SECRETKEY || flags.qnsk;
if (!QRCODE_DB || !QINIU_DOMAIN_QNDMN_RESOURCE || !QINIU_BUCKET_RESOURCE || !QINIU_AK || !QINIU_SK) {
console.log('缺少启动参数,异常退出');
args.showHelp();
process.exit(-1);
}
const product = {
port: flags.port || 8080,
staticDirs: ['static'],
mws: [
{
entry: require('@fs/attachment').entry,
opts: {
qiniu: {
domain: QINIU_DOMAIN_QNDMN_RESOURCE,
bucket: QINIU_BUCKET_RESOURCE,
accessKey: QINIU_AK,
secretKey: QINIU_SK
},
maxSize: 104857600, // 100M
}
}, {
entry: require('./app/lib/middlewares/attachment').entry,
opts: {
qiniu: {
accessKey: QINIU_AK,
secretKey: QINIU_SK,
bucket: QINIU_BUCKET_RESOURCE,
domain: QINIU_DOMAIN_QNDMN_RESOURCE
},
maxSize: 104857600, // 100M
// uploadPath: 'other'
}
}, {
entry: require('./app').entry,
opts: {
dev,
exclude: [
// "*"
], // 不做认证的路由,也可以使用 exclude: ["*"] 跳过所有路由
qiniu: {
domain: QINIU_DOMAIN_QNDMN_RESOURCE,
bucket: QINIU_BUCKET_RESOURCE,
accessKey: QINIU_AK,
secretKey: QINIU_SK
},
// sms: {
// ///阿里云-安心云
// accessKey: 'LTAI5tAFdjz7j38aNF2C9Qe8',
// accessSecret: '1trYkmiqfBtvZL6BxkNH2uQcQQPs0S'
// },
// email: {
// enabled: true,
// host: 'smtp.exmail.qq.com',
// port: 465,
// sender: {
// name: '运维服务',
// address: 'fsiot@free-sun.com.cn',
// password: 'Fs2689'
// }
// },
}
}
],
dc: {
url: QRCODE_DB,
opts: {
pool: {
max: 80,
min: 10,
idle: 10000
},
define: {
freezeTableName: true, // 固定表名
timestamps: false // 不含列 "createAt"/"updateAt"/"DeleteAt"
},
timezone: '+08:00',
logging: false
},
models: [require('./app').models]
},
logger: {
level: 'info',
json: false,
filename: path.join(__dirname, 'log', 'runtime.log'),
colorize: false,
maxsize: 1024 * 1024 * 5,
rotationFormat: false,
zippedArchive: true,
maxFiles: 10,
prettyPrint: true,
label: '',
timestamp: () => moment().format('YYYY-MM-DD HH:mm:ss.SSS'),
eol: os.EOL,
tailable: true,
depth: null,
showLevel: true,
maxRetries: 1
}
};
const development = {
port: product.port,
staticDirs: product.staticDirs,
mws: product.mws,
dc: product.dc,
logger: product.logger
};
if (dev) {
// mws
for (let mw of development.mws) {
// if (mw.opts.exclude) mw.opts.exclude = ['*']; // 使用 ['*'] 跳过所有路由
}
// logger
development.logger.filename = path.join(__dirname, 'log', 'development.log');
development.logger.level = 'debug';
development.dc.opts.logging = console.log;
}
module.exports = dev ? development : product;

49
api/package.json

@ -0,0 +1,49 @@
{
"name": "smart-emergency",
"version": "1.0.0",
"description": "fs smart emergency api",
"main": "server.js",
"scripts": {
"test": "set DEBUG=true&&\"node_modules/.bin/mocha\" --harmony --reporter spec app/test/*.test.js",
"start": "set NODE_ENV=development&&node server -p 4900 -g postgres://postgres:123456@10.8.16.77:5432/qrcode",
"start:linux": "export NODE_ENV=development&&node server -p 4900 -g postgres://postgres:123456@10.8.16.77:5432/qrcode",
"automate": "sequelize-automate -c sequelize-automate.config.js"
},
"author": "",
"license": "MIT",
"repository": {},
"dependencies": {
"@alicloud/pop-core": "^1.7.12",
"@fs/attachment": "^1.0.0",
"ali-oss": "^6.17.1",
"args": "^3.0.7",
"better-xlsx": "^0.7.6",
"clickhouse": "^2.6.0",
"crypto-js": "^4.0.0",
"file-saver": "^2.0.2",
"fs-attachment": "^1.0.0",
"fs-web-server-scaffold": "^2.0.2",
"ioredis": "^5.0.4",
"kafka-node": "^2.2.3",
"koa-convert": "^1.2.0",
"koa-proxy": "^0.9.0",
"moment": "^2.24.0",
"mqtt": "^4.3.7",
"node-schedule": "^2.1.0",
"nodemailer": "^6.7.7",
"path": "^0.12.7",
"path-to-regexp": "^3.0.0",
"pg": "^7.9.0",
"qrcode": "^1.5.1",
"qs": "^6.11.0",
"redis": "^3.1.2",
"request": "^2.88.2",
"rimraf": "^2.6.3",
"shortid": "^2.2.16",
"superagent": "^3.5.2",
"uuid": "^3.3.2"
},
"devDependencies": {
"mocha": "^6.0.2"
}
}

35
api/sequelize-automate.config.js

@ -0,0 +1,35 @@
module.exports = {
// 数据库配置 与 sequelize 相同
dbOptions: {
database: 'Inspection_20231016',
username: 'FashionAdmin',
password: '123456',
dialect: 'postgres',
host: '10.8.30.39',
port: 5432,
define: {
underscored: false,
freezeTableName: false,
charset: 'utf8mb4',
timezone: '+00: 00',
dialectOptions: {
collate: 'utf8_general_ci',
},
timestamps: false,
},
},
options: {
type: 'freesun', // 指定 models 代码风格
camelCase: true, // Models 文件中代码是否使用驼峰命名
modalNameSuffix: false, // 模型名称是否带 ‘Model’ 后缀
fileNameCamelCase: false, // Model 文件名是否使用驼峰法命名,默认文件名会使用表名,如 `user_post.js`;如果为 true,则文件名为 `userPost.js`
dir: './app/lib/models', // 指定输出 models 文件的目录
typesDir: 'models', // 指定输出 TypeScript 类型定义的文件目录,只有 TypeScript / Midway 等会有类型定义
emptyDir: false, // !!! 谨慎操作 生成 models 之前是否清空 `dir` 以及 `typesDir`
tables: ['user', 'project'], // 指定生成哪些表的 models,如 ['user', 'user_post'];如果为 null,则忽略改属性
skipTables: [], // 指定跳过哪些表的 models,如 ['user'];如果为 null,则忽略改属性
tsNoCheck: false, // 是否添加 `@ts-nocheck` 注释到 models 文件中
ignorePrefix: ['t_',], // 生成的模型名称忽略的前缀,因为 项目中有以下表名是以 t_ 开头的,在实际模型中不需要, 可以添加多个 [ 't_data_', 't_',] ,长度较长的 前缀放前面
attrLength: false, // 在生成模型的字段中 是否生成 如 var(128)这种格式,公司一般使用 String ,则配置为 false
},
}

12
api/server.js

@ -0,0 +1,12 @@
/**
* Created by rain on 2016/1/25.
*/
'use strict';
/*jslint node:true*/
//from koa
const scaffold = require('fs-web-server-scaffold');
const config = require('./config');
module.exports = scaffold(config);

25
jenkinsfile_api

@ -0,0 +1,25 @@
podTemplate {
node('pod-templ-jenkins-slave-common') {
env.IMAGE_NAME = "${IOT_IMAGES_REGISTRY}/${IOT}/${JOB_NAME}"
env.IMAGE_NAME_SHORT = "${IOT}/${JOB_NAME}"
env.CODE_ADDR = "${GIT_ADDRESS}/free-sun/Inspection.git"
stage('Run shell') {
git branch: 'master', credentialsId: 'gitea-builder', url: "${CODE_ADDR}"
container('image-builder') {
sh'''
pwd
ls -al
/kaniko/executor --context=${BUILD_WORKSPACE} --dockerfile=./api/Dockerfile --destination=${IMAGE_NAME}:${IMAGE_VERSION} --cache=false --cleanup
'''
}
buildName "${IMAGE_NAME_SHORT}:${IMAGE_VERSION}"
buildDescription "${IMAGE_NAME}:${IMAGE_VERSION}"
}
}
}

25
jenkinsfile_web

@ -0,0 +1,25 @@
podTemplate {
node('pod-templ-jenkins-slave-common') {
env.IMAGE_NAME = "${IOT_IMAGES_REGISTRY}/${IOT}/${JOB_NAME}"
env.IMAGE_NAME_SHORT = "${IOT}/${JOB_NAME}"
env.CODE_ADDR = "${GIT_ADDRESS}/free-sun/Inspection.git"
stage('Run shell') {
git branch: 'master', credentialsId: 'gitea-builder', url: "${CODE_ADDR}"
container('image-builder') {
sh'''
pwd
ls -al
/kaniko/executor --context=${BUILD_WORKSPACE} --dockerfile=./web/Dockerfile --destination=${IMAGE_NAME}:${IMAGE_VERSION} --cache=false --cleanup
'''
}
buildName "${IMAGE_NAME_SHORT}:${IMAGE_VERSION}"
buildDescription "${IMAGE_NAME}:${IMAGE_VERSION}"
}
}
}

3
script/1.0.0/data/1.admin_user.sql

@ -0,0 +1,3 @@
INSERT INTO "public"."department" VALUES (default, '默认部门', NULL);
INSERT INTO "public"."user" VALUES (default, '管理员', 'SuperAdmin', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL, 't', 'f', '123456789', NULL);

73
script/1.0.0/schema/1.init_org_manage.sql

@ -0,0 +1,73 @@
DROP SEQUENCE if EXISTS "public"."user_id_seq";
CREATE SEQUENCE "public"."user_id_seq"
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
DROP TABLE IF EXISTS "public"."user";
CREATE TABLE "public"."user" (
"id" int4 NOT NULL PRIMARY KEY DEFAULT nextval('user_id_seq'::regclass),
"name" varchar(64) COLLATE "pg_catalog"."default" NOT NULL,
"username" varchar(64) COLLATE "pg_catalog"."default" NOT NULL,
"password" varchar(512) COLLATE "pg_catalog"."default" NOT NULL,
"department_id" int4 NOT NULL,
"email" varchar(128) COLLATE "pg_catalog"."default",
"enable" bool NOT NULL DEFAULT true,
"delete" bool NOT NULL DEFAULT false,
"phone" varchar(20) COLLATE "pg_catalog"."default" NOT NULL,
"post" varchar(64) COLLATE "pg_catalog"."default"
);
COMMENT ON COLUMN "public"."user"."username" IS '用户名 账号';
COMMENT ON COLUMN "public"."user"."department_id" IS '部门id';
COMMENT ON COLUMN "public"."user"."enable" IS '启用状态';
COMMENT ON COLUMN "public"."user"."phone" IS '手机号';
COMMENT ON COLUMN "public"."user"."post" IS '职位';
DROP TABLE IF EXISTS "public"."resource";
CREATE TABLE "public"."resource" (
"code" varchar(128) COLLATE "pg_catalog"."default" NOT NULL,
"name" varchar(128) COLLATE "pg_catalog"."default" NOT NULL,
"parent_resource" varchar(128) COLLATE "pg_catalog"."default"
);
COMMENT ON TABLE "public"."resource" IS '权限字典';
DROP SEQUENCE if EXISTS "public"."user_resource_id_seq";
CREATE SEQUENCE "public"."user_resource_id_seq"
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
DROP TABLE IF EXISTS "public"."user_resource";
CREATE TABLE "public"."user_resource" (
"id" int4 NOT NULL DEFAULT nextval('user_resource_id_seq'::regclass),
"user_id" int4 NOT NULL,
"resource" varchar(128) COLLATE "pg_catalog"."default" NOT NULL
);
DROP TABLE IF EXISTS "public"."user_token";
CREATE TABLE "public"."user_token" (
"token" uuid NOT NULL,
"user_info" jsonb NOT NULL,
"expired" timestamptz(6) NOT NULL
);
DROP SEQUENCE if EXISTS "public"."department_id_seq";
CREATE SEQUENCE "public"."department_id_seq"
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
DROP TABLE IF EXISTS "public"."department";
CREATE TABLE "public"."department" (
"id" int4 NOT NULL DEFAULT nextval('department_id_seq'::regclass),
"name" varchar(128) COLLATE "pg_catalog"."default" NOT NULL,
"dependence" int4
);
COMMENT ON COLUMN "public"."department"."dependence" IS '上级部门/从属';

43
script/1.0.0/schema/2.init_qrcode.sql

@ -0,0 +1,43 @@
DROP TABLE IF EXISTS "public"."qrcode";
CREATE TABLE "public"."qrcode" (
"id" serial,
"url" varchar(255) NOT NULL,
"name" varchar(128) NOT NULL,
"type" varchar(32) NOT NULL,
PRIMARY KEY ("id")
);
COMMENT ON COLUMN "public"."qrcode"."name" IS '二维码名称';
COMMENT ON COLUMN "public"."qrcode"."type" IS '类型(文件|链接)';
COMMENT ON COLUMN "public"."qrcode"."url" IS '二维码图片存储链接';
DROP TABLE IF EXISTS "public"."publicity_info";
CREATE TABLE "public"."publicity_info" (
"id" serial,
"name" varchar(128) NOT NULL,
"type" varchar(32) NOT NULL,
"time" timestamptz NOT NULL,
"qrcode_id" int4 NOT NULL,
PRIMARY KEY ("id"),
CONSTRAINT "publicity_info_qrcode_id_fk" FOREIGN KEY ("qrcode_id") REFERENCES "public"."qrcode" ("id")
);
COMMENT ON COLUMN "public"."publicity_info"."name" IS '宣传标题';
COMMENT ON COLUMN "public"."publicity_info"."type" IS '类型';
COMMENT ON COLUMN "public"."publicity_info"."time" IS '创建/更新时间';
COMMENT ON COLUMN "public"."publicity_info"."qrcode_id" IS '关联二维码ID';
DROP TABLE IF EXISTS "public"."qrcode_files";
CREATE TABLE "public"."qrcode_files" (
"id" serial,
"qrcode_id" int4 NOT NULL,
"file_name" varchar(128) NOT NULL,
"file_size" int4 NOT NULL,
"file_url" varchar(255) NOT NULL,
PRIMARY KEY ("id"),
CONSTRAINT "qrcode_files_qrcode_id_fk" FOREIGN KEY ("qrcode_id") REFERENCES "public"."qrcode" ("id")
);
COMMENT ON COLUMN "public"."qrcode_files"."qrcode_id" IS '关联二维码ID';
COMMENT ON COLUMN "public"."qrcode_files"."file_name" IS '文件名';
COMMENT ON COLUMN "public"."qrcode_files"."file_size" IS '文件大小(byte)';
COMMENT ON COLUMN "public"."qrcode_files"."file_url" IS '文件存储链接';

19
web/.babelrc

@ -0,0 +1,19 @@
{
"presets": [
"@babel/preset-react",
"@babel/preset-env"
],
"plugins": [
"@babel/plugin-proposal-class-properties",
"@babel/plugin-proposal-object-rest-spread",
["import", {
"libraryName": "antd",
"libraryDirectory": "es"
}]
],
"env": {
"development": {}
}
}

23
web/.vscode/launch.json

@ -0,0 +1,23 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "Server",
"type": "node",
"request": "launch",
"program": "${workspaceRoot}/server.js",
"args": [
"-u http://127.0.0.1:4900",
//OSS
"--aliOssAccessKey LTAI5tNDfn7UhStYQcn3JBtw",
"--aliOssSecretKey rnoXtDWQA1djJ5Xqcdn1OSEol0lVyv",
"--aliOssBucket test-c371",
"--aliOssRegion oss-cn-hangzhou",
],
"outputCapture": "std",
"env": {
"NODE_ENV": "development"
}
}
]
}

4
web/.vscode/settings.json

@ -0,0 +1,4 @@
//
{
// "editor.fontSize": 16,
}

56
web/Dockerfile

@ -0,0 +1,56 @@
#FROM repository.anxinyun.cn/base-images/nodejs12:20.10.12.2
FROM repository.anxinyun.cn/base-images/nodejs12:20.10.12.2
COPY ./web/ /var/app
WORKDIR /var/app
EXPOSE 8080
RUN apk update && apk add --no-cache \
sudo \
curl \
build-base \
g++ \
libpng \
libpng-dev \
jpeg-dev \
pango-dev \
cairo-dev \
giflib-dev \
python \
;
RUN npm config set registry=https://nexus.ngaiot.com/repository/fs-npm/
RUN npm cache clean -f
#RUN npm install -g node-gyp
RUN rm -rf package-lock.json
RUN npm install --registry https://nexus.ngaiot.com/repository/fs-npm/
RUN npm run build
RUN rm -rf client/src
RUN rm -rf node_modules
RUN npm install --production --registry https://nexus.ngaiot.com/repository/fs-npm/
#RUN npm cache clean -f && npm install --production --force --registry http://10.8.30.22:7000
CMD ["-u", "http://localhost:8088"]
ENTRYPOINT [ "node", "server.js" ]
# FROM registry.cn-hangzhou.aliyuncs.com/fs-devops/node:12-dev as builder
# COPY . /var/app
# WORKDIR /var/app
# EXPOSE 8080
# RUN npm config set registry=http://10.8.30.22:7000
# RUN echo "{\"time\":\"$BUILD_TIMESTAMP\",\"build\": \"$BUILD_NUMBER\",\"revision\": \"$SVN_REVISION_1\",\"URL\":\"$SVN_URL_1\"}" > version.json
# RUN npm cache clean -f
# RUN rm -rf package-lock.json
# RUN npm install --registry http://10.8.30.22:7000
# RUN npm run build
# RUN rm -rf client/src
# RUN rm -rf node_modules
# RUN npm install --production --force --registry http://10.8.30.22:7000
# FROM registry.cn-hangzhou.aliyuncs.com/fs-devops/node:12
# COPY --from=builder --chown=node /var/app /home/node/app
# WORKDIR /home/node/app
# CMD ["node", "server.js"]

BIN
web/client/assets/font_sc/D-DINExp-Italic.otf

Binary file not shown.

BIN
web/client/assets/font_sc/PingFang SC Medium.ttf

Binary file not shown.

BIN
web/client/assets/font_sc/PingFang SC Regular.ttf

Binary file not shown.

BIN
web/client/assets/font_sc/YouSheBiaoTiHei-2.ttf

Binary file not shown.

370
web/client/assets/font_sc/demo.css

@ -0,0 +1,370 @@
*{margin: 0;padding: 0;list-style: none;}
/*
KISSY CSS Reset
理念1. reset 的目的不是清除浏览器的默认样式这仅是部分工作清除和重置是紧密不可分的
2. reset 的目的不是让默认样式在所有浏览器下一致而是减少默认样式有可能带来的问题
3. reset 期望提供一套普适通用的基础样式但没有银弹推荐根据具体需求裁剪和修改后再使用
特色1. 适应中文2. 基于最新主流浏览器
维护玉伯<lifesinger@gmail.com>, 正淳<ragecarrier@gmail.com>
*/
/** 清除内外边距 **/
body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, /* structural elements 结构元素 */
dl, dt, dd, ul, ol, li, /* list elements 列表元素 */
pre, /* text formatting elements 文本格式元素 */
form, fieldset, legend, button, input, textarea, /* form elements 表单元素 */
th, td /* table elements 表格元素 */ {
margin: 0;
padding: 0;
}
/** 设置默认字体 **/
body,
button, input, select, textarea /* for ie */ {
font: 12px/1.5 tahoma, arial, \5b8b\4f53, sans-serif;
}
h1, h2, h3, h4, h5, h6 { font-size: 100%; }
address, cite, dfn, em, var { font-style: normal; } /* 将斜体扶正 */
code, kbd, pre, samp { font-family: courier new, courier, monospace; } /* 统一等宽字体 */
small { font-size: 12px; } /* 小于 12px 的中文很难阅读,让 small 正常化 */
/** 重置列表元素 **/
ul, ol { list-style: none; }
/** 重置文本格式元素 **/
a { text-decoration: none; }
a:hover { text-decoration: underline; }
/** 重置表单元素 **/
legend { color: #000; } /* for ie6 */
fieldset, img { border: 0; } /* img 搭车:让链接里的 img 无边框 */
button, input, select, textarea { font-size: 100%; } /* 使得表单元素在 ie 下能继承字体大小 */
/* 注:optgroup 无法扶正 */
/** 重置表格元素 **/
table { border-collapse: collapse; border-spacing: 0; }
/* 清除浮动 */
.ks-clear:after, .clear:after {
content: '\20';
display: block;
height: 0;
clear: both;
}
.ks-clear, .clear {
*zoom: 1;
}
.main {
padding: 30px 100px;
width: 960px;
margin: 0 auto;
}
.main h1{font-size:36px; color:#333; text-align:left;margin-bottom:30px; border-bottom: 1px solid #eee;}
.helps{margin-top:40px;}
.helps pre{
padding:20px;
margin:10px 0;
border:solid 1px #e7e1cd;
background-color: #fffdef;
overflow: auto;
}
.icon_lists{
width: 100% !important;
}
.icon_lists li{
float:left;
width: 100px;
height:180px;
text-align: center;
list-style: none !important;
}
.icon_lists .icon{
font-size: 42px;
line-height: 100px;
margin: 10px 0;
color:#333;
-webkit-transition: font-size 0.25s ease-out 0s;
-moz-transition: font-size 0.25s ease-out 0s;
transition: font-size 0.25s ease-out 0s;
}
.icon_lists .icon:hover{
font-size: 100px;
}
.markdown {
color: #666;
font-size: 14px;
line-height: 1.8;
}
.highlight {
line-height: 1.5;
}
.markdown img {
vertical-align: middle;
max-width: 100%;
}
.markdown h1 {
color: #404040;
font-weight: 500;
line-height: 40px;
margin-bottom: 24px;
}
.markdown h2,
.markdown h3,
.markdown h4,
.markdown h5,
.markdown h6 {
color: #404040;
margin: 1.6em 0 0.6em 0;
font-weight: 500;
clear: both;
}
.markdown h1 {
font-size: 28px;
}
.markdown h2 {
font-size: 22px;
}
.markdown h3 {
font-size: 16px;
}
.markdown h4 {
font-size: 14px;
}
.markdown h5 {
font-size: 12px;
}
.markdown h6 {
font-size: 12px;
}
.markdown hr {
height: 1px;
border: 0;
background: #e9e9e9;
margin: 16px 0;
clear: both;
}
.markdown p,
.markdown pre {
margin: 1em 0;
}
.markdown > p,
.markdown > blockquote,
.markdown > .highlight,
.markdown > ol,
.markdown > ul {
width: 80%;
}
.markdown ul > li {
list-style: circle;
}
.markdown > ul li,
.markdown blockquote ul > li {
margin-left: 20px;
padding-left: 4px;
}
.markdown > ul li p,
.markdown > ol li p {
margin: 0.6em 0;
}
.markdown ol > li {
list-style: decimal;
}
.markdown > ol li,
.markdown blockquote ol > li {
margin-left: 20px;
padding-left: 4px;
}
.markdown code {
margin: 0 3px;
padding: 0 5px;
background: #eee;
border-radius: 3px;
}
.markdown pre {
border-radius: 6px;
background: #f7f7f7;
padding: 20px;
}
.markdown pre code {
border: none;
background: #f7f7f7;
margin: 0;
}
.markdown strong,
.markdown b {
font-weight: 600;
}
.markdown > table {
border-collapse: collapse;
border-spacing: 0px;
empty-cells: show;
border: 1px solid #e9e9e9;
width: 95%;
margin-bottom: 24px;
}
.markdown > table th {
white-space: nowrap;
color: #333;
font-weight: 600;
}
.markdown > table th,
.markdown > table td {
border: 1px solid #e9e9e9;
padding: 8px 16px;
text-align: left;
}
.markdown > table th {
background: #F7F7F7;
}
.markdown blockquote {
font-size: 90%;
color: #999;
border-left: 4px solid #e9e9e9;
padding-left: 0.8em;
margin: 1em 0;
font-style: italic;
}
.markdown blockquote p {
margin: 0;
}
.markdown .anchor {
opacity: 0;
transition: opacity 0.3s ease;
margin-left: 8px;
}
.markdown .waiting {
color: #ccc;
}
.markdown h1:hover .anchor,
.markdown h2:hover .anchor,
.markdown h3:hover .anchor,
.markdown h4:hover .anchor,
.markdown h5:hover .anchor,
.markdown h6:hover .anchor {
opacity: 1;
display: inline-block;
}
.markdown > br,
.markdown > p > br {
clear: both;
}
.hljs {
display: block;
background: white;
padding: 0.5em;
color: #333333;
overflow-x: auto;
}
.hljs-comment,
.hljs-meta {
color: #969896;
}
.hljs-string,
.hljs-variable,
.hljs-template-variable,
.hljs-strong,
.hljs-emphasis,
.hljs-quote {
color: #df5000;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-type {
color: #a71d5d;
}
.hljs-literal,
.hljs-symbol,
.hljs-bullet,
.hljs-attribute {
color: #0086b3;
}
.hljs-section,
.hljs-name {
color: #63a35c;
}
.hljs-tag {
color: #333333;
}
.hljs-title,
.hljs-attr,
.hljs-selector-id,
.hljs-selector-class,
.hljs-selector-attr,
.hljs-selector-pseudo {
color: #795da3;
}
.hljs-addition {
color: #55a532;
background-color: #eaffea;
}
.hljs-deletion {
color: #bd2c00;
background-color: #ffecec;
}
.hljs-link {
text-decoration: underline;
}
pre{
background: #fff;
}

514
web/client/assets/font_sc/demo_fontclass.html

@ -0,0 +1,514 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>IconFont</title>
<link rel="stylesheet" href="demo.css">
<link rel="stylesheet" href="iconfont.css">
</head>
<body>
<div class="main markdown">
<h1>IconFont 图标</h1>
<ul class="icon_lists clear">
<li>
<i class="icon sc icon-liuliang"></i>
<div class="name">流量</div>
<div class="fontclass">.icon-liuliang</div>
</li>
<li>
<i class="icon sc icon-iconfontditie"></i>
<div class="name">轻轨</div>
<div class="fontclass">.icon-iconfontditie</div>
</li>
<li>
<i class="icon sc icon-fengsu3"></i>
<div class="name">风速3</div>
<div class="fontclass">.icon-fengsu3</div>
</li>
<li>
<i class="icon sc icon-calendar"></i>
<div class="name">calendar</div>
<div class="fontclass">.icon-calendar</div>
</li>
<li>
<i class="icon sc icon-box"></i>
<div class="name">box</div>
<div class="fontclass">.icon-box</div>
</li>
<li>
<i class="icon sc icon-shenheshibai"></i>
<div class="name">审核失败</div>
<div class="fontclass">.icon-shenheshibai</div>
</li>
<li>
<i class="icon sc icon-slope"></i>
<div class="name">边坡</div>
<div class="fontclass">.icon-slope</div>
</li>
<li>
<i class="icon sc icon-icon2"></i>
<div class="name">公路</div>
<div class="fontclass">.icon-icon2</div>
</li>
<li>
<i class="icon sc icon-gnsscaidian"></i>
<div class="name">GNSS采点</div>
<div class="fontclass">.icon-gnsscaidian</div>
</li>
<li>
<i class="icon sc icon-chuanganqishebei"></i>
<div class="name">传感器设备</div>
<div class="fontclass">.icon-chuanganqishebei</div>
</li>
<li>
<i class="icon sc icon-dianliuchuanganqi"></i>
<div class="name">电流传感器</div>
<div class="fontclass">.icon-dianliuchuanganqi</div>
</li>
<li>
<i class="icon sc icon-dianyachuanganqi"></i>
<div class="name">电压传感器</div>
<div class="fontclass">.icon-dianyachuanganqi</div>
</li>
<li>
<i class="icon sc icon-wenduchuanganqi"></i>
<div class="name">温度传感器</div>
<div class="fontclass">.icon-wenduchuanganqi</div>
</li>
<li>
<i class="icon sc icon-xinjian"></i>
<div class="name">新建</div>
<div class="fontclass">.icon-xinjian</div>
</li>
<li>
<i class="icon sc icon-handong"></i>
<div class="name">涵洞</div>
<div class="fontclass">.icon-handong</div>
</li>
<li>
<i class="icon sc icon-guanwanggongcheng"></i>
<div class="name">管网工程</div>
<div class="fontclass">.icon-guanwanggongcheng</div>
</li>
<li>
<i class="icon sc icon-shenhe"></i>
<div class="name">审核</div>
<div class="fontclass">.icon-shenhe</div>
</li>
<li>
<i class="icon sc icon-zhihuishequ"></i>
<div class="name">智慧城市</div>
<div class="fontclass">.icon-zhihuishequ</div>
</li>
<li>
<i class="icon sc icon-bianpoweiyi"></i>
<div class="name">边坡位移</div>
<div class="fontclass">.icon-bianpoweiyi</div>
</li>
<li>
<i class="icon sc icon-jianzhu"></i>
<div class="name">建筑</div>
<div class="fontclass">.icon-jianzhu</div>
</li>
<li>
<i class="icon sc icon-chuguan"></i>
<div class="name">储罐</div>
<div class="fontclass">.icon-chuguan</div>
</li>
<li>
<i class="icon sc icon-suidao"></i>
<div class="name">隧道</div>
<div class="fontclass">.icon-suidao</div>
</li>
<li>
<i class="icon sc icon-data"></i>
<div class="name">data</div>
<div class="fontclass">.icon-data</div>
</li>
<li>
<i class="icon sc icon-kuangshankaicai"></i>
<div class="name">矿山开采</div>
<div class="fontclass">.icon-kuangshankaicai</div>
</li>
<li>
<i class="icon sc icon-wangluo"></i>
<div class="name">网络</div>
<div class="fontclass">.icon-wangluo</div>
</li>
<li>
<i class="icon sc icon-jiankong"></i>
<div class="name">监控</div>
<div class="fontclass">.icon-jiankong</div>
</li>
<li>
<i class="icon sc icon-dashuju"></i>
<div class="name">大数据</div>
<div class="fontclass">.icon-dashuju</div>
</li>
<li>
<i class="icon sc icon-shuju"></i>
<div class="name">数据库</div>
<div class="fontclass">.icon-shuju</div>
</li>
<li>
<i class="icon sc icon-shenhechenggong"></i>
<div class="name">审核成功</div>
<div class="fontclass">.icon-shenhechenggong</div>
</li>
<li>
<i class="icon sc icon-jiankong1"></i>
<div class="name">监控</div>
<div class="fontclass">.icon-jiankong1</div>
</li>
<li>
<i class="icon sc icon-wangluoxitong"></i>
<div class="name">网络系统</div>
<div class="fontclass">.icon-wangluoxitong</div>
</li>
<li>
<i class="icon sc icon-dingwei"></i>
<div class="name">定位</div>
<div class="fontclass">.icon-dingwei</div>
</li>
<li>
<i class="icon sc icon-xitongyunzhuanqingkuang"></i>
<div class="name">系统运转情况</div>
<div class="fontclass">.icon-xitongyunzhuanqingkuang</div>
</li>
<li>
<i class="icon sc icon-chakan"></i>
<div class="name">查看</div>
<div class="fontclass">.icon-chakan</div>
</li>
<li>
<i class="icon sc icon-lianjie"></i>
<div class="name">链接</div>
<div class="fontclass">.icon-lianjie</div>
</li>
<li>
<i class="icon sc icon-shujudaochu-01"></i>
<div class="name">数据导出-01</div>
<div class="fontclass">.icon-shujudaochu-01</div>
</li>
<li>
<i class="icon sc icon-xitongzhuangtai"></i>
<div class="name">系统状态</div>
<div class="fontclass">.icon-xitongzhuangtai</div>
</li>
<li>
<i class="icon sc icon-xiaofeimingxidan"></i>
<div class="name">消费明细单</div>
<div class="fontclass">.icon-xiaofeimingxidan</div>
</li>
<li>
<i class="icon sc icon-SQLshenhe"></i>
<div class="name">SQL审核</div>
<div class="fontclass">.icon-SQLshenhe</div>
</li>
<li>
<i class="icon sc icon-aislogo"></i>
<div class="name">aislogo</div>
<div class="fontclass">.icon-aislogo</div>
</li>
<li>
<i class="icon sc icon-qiao"></i>
<div class="name"></div>
<div class="fontclass">.icon-qiao</div>
</li>
<li>
<i class="icon sc icon-tashiqizhongji"></i>
<div class="name">塔式起重机</div>
<div class="fontclass">.icon-tashiqizhongji</div>
</li>
<li>
<i class="icon sc icon-dwggeshi"></i>
<div class="name">dwg格式</div>
<div class="fontclass">.icon-dwggeshi</div>
</li>
<li>
<i class="icon sc icon-luyouqi"></i>
<div class="name">路由器</div>
<div class="fontclass">.icon-luyouqi</div>
</li>
<li>
<i class="icon sc icon-anzhuangshigong-xianxing"></i>
<div class="name">244安装、施工-线性</div>
<div class="fontclass">.icon-anzhuangshigong-xianxing</div>
</li>
<li>
<i class="icon sc icon-shaixuanguolv"></i>
<div class="name">245筛选过滤</div>
<div class="fontclass">.icon-shaixuanguolv</div>
</li>
<li>
<i class="icon sc icon-anzhuangshigong"></i>
<div class="name">244安装、施工</div>
<div class="fontclass">.icon-anzhuangshigong</div>
</li>
<li>
<i class="icon sc icon-tiaoxingtu-xianxing"></i>
<div class="name">408条形图-线性</div>
<div class="fontclass">.icon-tiaoxingtu-xianxing</div>
</li>
<li>
<i class="icon sc icon-zhexiantu-xianxing"></i>
<div class="name">409折线图-线性</div>
<div class="fontclass">.icon-zhexiantu-xianxing</div>
</li>
<li>
<i class="icon sc icon-tieta"></i>
<div class="name">铁塔</div>
<div class="fontclass">.icon-tieta</div>
</li>
<li>
<i class="icon sc icon-geshi_wendangtxt"></i>
<div class="name">800格式_文档txt</div>
<div class="fontclass">.icon-geshi_wendangtxt</div>
</li>
<li>
<i class="icon sc icon-geshi_wendangdoc"></i>
<div class="name">801格式_文档doc</div>
<div class="fontclass">.icon-geshi_wendangdoc</div>
</li>
<li>
<i class="icon sc icon-geshi_wendangpdf"></i>
<div class="name">807格式_文档pdf</div>
<div class="fontclass">.icon-geshi_wendangpdf</div>
</li>
<li>
<i class="icon sc icon-geshi_wendangxls"></i>
<div class="name">803格式_文档xls</div>
<div class="fontclass">.icon-geshi_wendangxls</div>
</li>
<li>
<i class="icon sc icon-geshi_tongyongwendang"></i>
<div class="name">819格式_通用文档</div>
<div class="fontclass">.icon-geshi_tongyongwendang</div>
</li>
<li>
<i class="icon sc icon-geshi_shipinmp"></i>
<div class="name">840格式_视频mp4</div>
<div class="fontclass">.icon-geshi_shipinmp</div>
</li>
<li>
<i class="icon sc icon-geshi_tupianjpg"></i>
<div class="name">860格式_图片jpg</div>
<div class="fontclass">.icon-geshi_tupianjpg</div>
</li>
<li>
<i class="icon sc icon-geshi_tupianpng"></i>
<div class="name">865格式_图片png</div>
<div class="fontclass">.icon-geshi_tupianpng</div>
</li>
<li>
<i class="icon sc icon-guangzhaochuanganqi"></i>
<div class="name">光照传感器</div>
<div class="fontclass">.icon-guangzhaochuanganqi</div>
</li>
<li>
<i class="icon sc icon-building"></i>
<div class="name">建筑</div>
<div class="fontclass">.icon-building</div>
</li>
<li>
<i class="icon sc icon-yanwuchuanganqi"></i>
<div class="name">烟雾传感器</div>
<div class="fontclass">.icon-yanwuchuanganqi</div>
</li>
<li>
<i class="icon sc icon-shizheng"></i>
<div class="name">市政</div>
<div class="fontclass">.icon-shizheng</div>
</li>
<li>
<i class="icon sc icon-chuanganqi"></i>
<div class="name">传感器</div>
<div class="fontclass">.icon-chuanganqi</div>
</li>
<li>
<i class="icon sc icon-WSD"></i>
<div class="name">温湿度传感器</div>
<div class="fontclass">.icon-WSD</div>
</li>
<li>
<i class="icon sc icon-yalichuanganqi"></i>
<div class="name">压力传感器</div>
<div class="fontclass">.icon-yalichuanganqi</div>
</li>
<li>
<i class="icon sc icon-yinglichuanganqi"></i>
<div class="name">应力传感器</div>
<div class="fontclass">.icon-yinglichuanganqi</div>
</li>
<li>
<i class="icon sc icon-chenjiangchuanganqi"></i>
<div class="name">沉降传感器</div>
<div class="fontclass">.icon-chenjiangchuanganqi</div>
</li>
<li>
<i class="icon sc icon-yalichuanganqi1"></i>
<div class="name">压力传感器</div>
<div class="fontclass">.icon-yalichuanganqi1</div>
</li>
<li>
<i class="icon sc icon-YWC"></i>
<div class="name">液位传感器</div>
<div class="fontclass">.icon-YWC</div>
</li>
<li>
<i class="icon sc icon-computer"></i>
<div class="name">computer</div>
<div class="fontclass">.icon-computer</div>
</li>
<li>
<i class="icon sc icon-empty"></i>
<div class="name">empty</div>
<div class="fontclass">.icon-empty</div>
</li>
<li>
<i class="icon sc icon-offline"></i>
<div class="name">offline</div>
<div class="fontclass">.icon-offline</div>
</li>
<li>
<i class="icon sc icon-daba"></i>
<div class="name">大坝</div>
<div class="fontclass">.icon-daba</div>
</li>
<li>
<i class="icon sc icon-shenbuweiyi"></i>
<div class="name">深部位移</div>
<div class="fontclass">.icon-shenbuweiyi</div>
</li>
<li>
<i class="icon sc icon-maosuochuanganqi"></i>
<div class="name">锚索传感器</div>
<div class="fontclass">.icon-maosuochuanganqi</div>
</li>
<li>
<i class="icon sc icon-yuliangchuanganqi"></i>
<div class="name">雨量传感器</div>
<div class="fontclass">.icon-yuliangchuanganqi</div>
</li>
<li>
<i class="icon sc icon-weiyiji"></i>
<div class="name">位移计</div>
<div class="fontclass">.icon-weiyiji</div>
</li>
<li>
<i class="icon sc icon-qixiangzhan_"></i>
<div class="name">气象站_1</div>
<div class="fontclass">.icon-qixiangzhan_</div>
</li>
<li>
<i class="icon sc icon-shenjikeng"></i>
<div class="name">深基坑</div>
<div class="fontclass">.icon-shenjikeng</div>
</li>
</ul>
<h2 id="font-class-">font-class引用</h2>
<hr>
<p>font-class是unicode使用方式的一种变种,主要是解决unicode书写不直观,语意不明确的问题。</p>
<p>与unicode使用方式相比,具有如下特点:</p>
<ul>
<li>兼容性良好,支持ie8+,及所有现代浏览器。</li>
<li>相比于unicode语意明确,书写更直观。可以很容易分辨这个icon是什么。</li>
<li>因为使用class来定义图标,所以当要替换图标时,只需要修改class里面的unicode引用。</li>
<li>不过因为本质上还是使用的字体,所以多色图标还是不支持的。</li>
</ul>
<p>使用步骤如下:</p>
<h3 id="-fontclass-">第一步:引入项目下面生成的fontclass代码:</h3>
<pre><code class="lang-js hljs javascript"><span class="hljs-comment">&lt;link rel="stylesheet" type="text/css" href="./iconfont.css"&gt;</span></code></pre>
<h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
<pre><code class="lang-css hljs">&lt;<span class="hljs-selector-tag">i</span> <span class="hljs-selector-tag">class</span>="<span class="hljs-selector-tag">sc</span> <span class="hljs-selector-tag">icon-xxx</span>"&gt;&lt;/<span class="hljs-selector-tag">i</span>&gt;</code></pre>
<blockquote>
<p>"sc"是你项目下的font-family。可以通过编辑项目查看,默认是"iconfont"。</p>
</blockquote>
</div>
</body>
</html>

695
web/client/assets/font_sc/demo_symbol.html

@ -0,0 +1,695 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>IconFont</title>
<link rel="stylesheet" href="demo.css">
<script src="iconfont.js"></script>
<style type="text/css">
.icon {
/* 通过设置 font-size 来改变图标大小 */
width: 1em; height: 1em;
/* 图标和文字相邻时,垂直对齐 */
vertical-align: -0.15em;
/* 通过设置 color 来改变 SVG 的颜色/fill */
fill: currentColor;
/* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
normalize.css 中也包含这行 */
overflow: hidden;
}
</style>
</head>
<body>
<div class="main markdown">
<h1>IconFont 图标</h1>
<ul class="icon_lists clear">
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-liuliang"></use>
</svg>
<div class="name">流量</div>
<div class="fontclass">#icon-liuliang</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-iconfontditie"></use>
</svg>
<div class="name">轻轨</div>
<div class="fontclass">#icon-iconfontditie</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-fengsu3"></use>
</svg>
<div class="name">风速3</div>
<div class="fontclass">#icon-fengsu3</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-calendar"></use>
</svg>
<div class="name">calendar</div>
<div class="fontclass">#icon-calendar</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-box"></use>
</svg>
<div class="name">box</div>
<div class="fontclass">#icon-box</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-shenheshibai"></use>
</svg>
<div class="name">审核失败</div>
<div class="fontclass">#icon-shenheshibai</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-slope"></use>
</svg>
<div class="name">边坡</div>
<div class="fontclass">#icon-slope</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-icon2"></use>
</svg>
<div class="name">公路</div>
<div class="fontclass">#icon-icon2</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-gnsscaidian"></use>
</svg>
<div class="name">GNSS采点</div>
<div class="fontclass">#icon-gnsscaidian</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-chuanganqishebei"></use>
</svg>
<div class="name">传感器设备</div>
<div class="fontclass">#icon-chuanganqishebei</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-dianliuchuanganqi"></use>
</svg>
<div class="name">电流传感器</div>
<div class="fontclass">#icon-dianliuchuanganqi</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-dianyachuanganqi"></use>
</svg>
<div class="name">电压传感器</div>
<div class="fontclass">#icon-dianyachuanganqi</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-wenduchuanganqi"></use>
</svg>
<div class="name">温度传感器</div>
<div class="fontclass">#icon-wenduchuanganqi</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-xinjian"></use>
</svg>
<div class="name">新建</div>
<div class="fontclass">#icon-xinjian</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-handong"></use>
</svg>
<div class="name">涵洞</div>
<div class="fontclass">#icon-handong</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-guanwanggongcheng"></use>
</svg>
<div class="name">管网工程</div>
<div class="fontclass">#icon-guanwanggongcheng</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-shenhe"></use>
</svg>
<div class="name">审核</div>
<div class="fontclass">#icon-shenhe</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-zhihuishequ"></use>
</svg>
<div class="name">智慧城市</div>
<div class="fontclass">#icon-zhihuishequ</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-bianpoweiyi"></use>
</svg>
<div class="name">边坡位移</div>
<div class="fontclass">#icon-bianpoweiyi</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-jianzhu"></use>
</svg>
<div class="name">建筑</div>
<div class="fontclass">#icon-jianzhu</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-chuguan"></use>
</svg>
<div class="name">储罐</div>
<div class="fontclass">#icon-chuguan</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-suidao"></use>
</svg>
<div class="name">隧道</div>
<div class="fontclass">#icon-suidao</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-data"></use>
</svg>
<div class="name">data</div>
<div class="fontclass">#icon-data</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-kuangshankaicai"></use>
</svg>
<div class="name">矿山开采</div>
<div class="fontclass">#icon-kuangshankaicai</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-wangluo"></use>
</svg>
<div class="name">网络</div>
<div class="fontclass">#icon-wangluo</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-jiankong"></use>
</svg>
<div class="name">监控</div>
<div class="fontclass">#icon-jiankong</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-dashuju"></use>
</svg>
<div class="name">大数据</div>
<div class="fontclass">#icon-dashuju</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-shuju"></use>
</svg>
<div class="name">数据库</div>
<div class="fontclass">#icon-shuju</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-shenhechenggong"></use>
</svg>
<div class="name">审核成功</div>
<div class="fontclass">#icon-shenhechenggong</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-jiankong1"></use>
</svg>
<div class="name">监控</div>
<div class="fontclass">#icon-jiankong1</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-wangluoxitong"></use>
</svg>
<div class="name">网络系统</div>
<div class="fontclass">#icon-wangluoxitong</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-dingwei"></use>
</svg>
<div class="name">定位</div>
<div class="fontclass">#icon-dingwei</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-xitongyunzhuanqingkuang"></use>
</svg>
<div class="name">系统运转情况</div>
<div class="fontclass">#icon-xitongyunzhuanqingkuang</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-chakan"></use>
</svg>
<div class="name">查看</div>
<div class="fontclass">#icon-chakan</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-lianjie"></use>
</svg>
<div class="name">链接</div>
<div class="fontclass">#icon-lianjie</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-shujudaochu-01"></use>
</svg>
<div class="name">数据导出-01</div>
<div class="fontclass">#icon-shujudaochu-01</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-xitongzhuangtai"></use>
</svg>
<div class="name">系统状态</div>
<div class="fontclass">#icon-xitongzhuangtai</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-xiaofeimingxidan"></use>
</svg>
<div class="name">消费明细单</div>
<div class="fontclass">#icon-xiaofeimingxidan</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-SQLshenhe"></use>
</svg>
<div class="name">SQL审核</div>
<div class="fontclass">#icon-SQLshenhe</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-aislogo"></use>
</svg>
<div class="name">aislogo</div>
<div class="fontclass">#icon-aislogo</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-qiao"></use>
</svg>
<div class="name"></div>
<div class="fontclass">#icon-qiao</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-tashiqizhongji"></use>
</svg>
<div class="name">塔式起重机</div>
<div class="fontclass">#icon-tashiqizhongji</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-dwggeshi"></use>
</svg>
<div class="name">dwg格式</div>
<div class="fontclass">#icon-dwggeshi</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-luyouqi"></use>
</svg>
<div class="name">路由器</div>
<div class="fontclass">#icon-luyouqi</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-anzhuangshigong-xianxing"></use>
</svg>
<div class="name">244安装、施工-线性</div>
<div class="fontclass">#icon-anzhuangshigong-xianxing</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-shaixuanguolv"></use>
</svg>
<div class="name">245筛选过滤</div>
<div class="fontclass">#icon-shaixuanguolv</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-anzhuangshigong"></use>
</svg>
<div class="name">244安装、施工</div>
<div class="fontclass">#icon-anzhuangshigong</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-tiaoxingtu-xianxing"></use>
</svg>
<div class="name">408条形图-线性</div>
<div class="fontclass">#icon-tiaoxingtu-xianxing</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-zhexiantu-xianxing"></use>
</svg>
<div class="name">409折线图-线性</div>
<div class="fontclass">#icon-zhexiantu-xianxing</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-tieta"></use>
</svg>
<div class="name">铁塔</div>
<div class="fontclass">#icon-tieta</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-geshi_wendangtxt"></use>
</svg>
<div class="name">800格式_文档txt</div>
<div class="fontclass">#icon-geshi_wendangtxt</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-geshi_wendangdoc"></use>
</svg>
<div class="name">801格式_文档doc</div>
<div class="fontclass">#icon-geshi_wendangdoc</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-geshi_wendangpdf"></use>
</svg>
<div class="name">807格式_文档pdf</div>
<div class="fontclass">#icon-geshi_wendangpdf</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-geshi_wendangxls"></use>
</svg>
<div class="name">803格式_文档xls</div>
<div class="fontclass">#icon-geshi_wendangxls</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-geshi_tongyongwendang"></use>
</svg>
<div class="name">819格式_通用文档</div>
<div class="fontclass">#icon-geshi_tongyongwendang</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-geshi_shipinmp"></use>
</svg>
<div class="name">840格式_视频mp4</div>
<div class="fontclass">#icon-geshi_shipinmp</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-geshi_tupianjpg"></use>
</svg>
<div class="name">860格式_图片jpg</div>
<div class="fontclass">#icon-geshi_tupianjpg</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-geshi_tupianpng"></use>
</svg>
<div class="name">865格式_图片png</div>
<div class="fontclass">#icon-geshi_tupianpng</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-guangzhaochuanganqi"></use>
</svg>
<div class="name">光照传感器</div>
<div class="fontclass">#icon-guangzhaochuanganqi</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-building"></use>
</svg>
<div class="name">建筑</div>
<div class="fontclass">#icon-building</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-yanwuchuanganqi"></use>
</svg>
<div class="name">烟雾传感器</div>
<div class="fontclass">#icon-yanwuchuanganqi</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-shizheng"></use>
</svg>
<div class="name">市政</div>
<div class="fontclass">#icon-shizheng</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-chuanganqi"></use>
</svg>
<div class="name">传感器</div>
<div class="fontclass">#icon-chuanganqi</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-WSD"></use>
</svg>
<div class="name">温湿度传感器</div>
<div class="fontclass">#icon-WSD</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-yalichuanganqi"></use>
</svg>
<div class="name">压力传感器</div>
<div class="fontclass">#icon-yalichuanganqi</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-yinglichuanganqi"></use>
</svg>
<div class="name">应力传感器</div>
<div class="fontclass">#icon-yinglichuanganqi</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-chenjiangchuanganqi"></use>
</svg>
<div class="name">沉降传感器</div>
<div class="fontclass">#icon-chenjiangchuanganqi</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-yalichuanganqi1"></use>
</svg>
<div class="name">压力传感器</div>
<div class="fontclass">#icon-yalichuanganqi1</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-YWC"></use>
</svg>
<div class="name">液位传感器</div>
<div class="fontclass">#icon-YWC</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-computer"></use>
</svg>
<div class="name">computer</div>
<div class="fontclass">#icon-computer</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-empty"></use>
</svg>
<div class="name">empty</div>
<div class="fontclass">#icon-empty</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-offline"></use>
</svg>
<div class="name">offline</div>
<div class="fontclass">#icon-offline</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-daba"></use>
</svg>
<div class="name">大坝</div>
<div class="fontclass">#icon-daba</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-shenbuweiyi"></use>
</svg>
<div class="name">深部位移</div>
<div class="fontclass">#icon-shenbuweiyi</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-maosuochuanganqi"></use>
</svg>
<div class="name">锚索传感器</div>
<div class="fontclass">#icon-maosuochuanganqi</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-yuliangchuanganqi"></use>
</svg>
<div class="name">雨量传感器</div>
<div class="fontclass">#icon-yuliangchuanganqi</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-weiyiji"></use>
</svg>
<div class="name">位移计</div>
<div class="fontclass">#icon-weiyiji</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-qixiangzhan_"></use>
</svg>
<div class="name">气象站_1</div>
<div class="fontclass">#icon-qixiangzhan_</div>
</li>
<li>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-shenjikeng"></use>
</svg>
<div class="name">深基坑</div>
<div class="fontclass">#icon-shenjikeng</div>
</li>
</ul>
<h2 id="symbol-">symbol引用</h2>
<hr>
<p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
这种用法其实是做了一个svg的集合,与另外两种相比具有如下特点:</p>
<ul>
<li>支持多色图标了,不再受单色限制。</li>
<li>通过一些技巧,支持像字体那样,通过<code>font-size</code>,<code>color</code>来调整样式。</li>
<li>兼容性较差,支持 ie9+,及现代浏览器。</li>
<li>浏览器渲染svg的性能一般,还不如png。</li>
</ul>
<p>使用步骤如下:</p>
<h3 id="-symbol-">第一步:引入项目下面生成的symbol代码:</h3>
<pre><code class="lang-js hljs javascript"><span class="hljs-comment">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;</span></code></pre>
<h3 id="-css-">第二步:加入通用css代码(引入一次就行):</h3>
<pre><code class="lang-js hljs javascript">&lt;style type=<span class="hljs-string">"text/css"</span>&gt;
.icon {
width: <span class="hljs-number">1</span>em; height: <span class="hljs-number">1</span>em;
vertical-align: <span class="hljs-number">-0.15</span>em;
fill: currentColor;
overflow: hidden;
}
&lt;<span class="hljs-regexp">/style&gt;</span></code></pre>
<h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
<pre><code class="lang-js hljs javascript">&lt;svg <span class="hljs-class"><span class="hljs-keyword">class</span></span>=<span class="hljs-string">"icon"</span> aria-hidden=<span class="hljs-string">"true"</span>&gt;<span class="xml"><span class="hljs-tag">
&lt;<span class="hljs-name">use</span> <span class="hljs-attr">xlink:href</span>=<span class="hljs-string">"#icon-xxx"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">use</span>&gt;</span>
</span>&lt;<span class="hljs-regexp">/svg&gt;
</span></code></pre>
</div>
</body>
</html>

552
web/client/assets/font_sc/demo_unicode.html

@ -0,0 +1,552 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>IconFont</title>
<link rel="stylesheet" href="demo.css">
<style type="text/css">
@font-face {font-family: "sc";
src: url('iconfont.eot'); /* IE9*/
src: url('iconfont.eot#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('iconfont.woff') format('woff'), /* chrome, firefox */
url('iconfont.ttf') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
url('iconfont.svg#sc') format('svg'); /* iOS 4.1- */
}
.sc {
font-family:"sc" !important;
font-size:16px;
font-style:normal;
-webkit-font-smoothing: antialiased;
-webkit-text-stroke-width: 0.2px;
-moz-osx-font-smoothing: grayscale;
}
</style>
</head>
<body>
<div class="main markdown">
<h1>IconFont 图标</h1>
<ul class="icon_lists clear">
<li>
<i class="icon sc">&#xe602;</i>
<div class="name">流量</div>
<div class="code">&amp;#xe602;</div>
</li>
<li>
<i class="icon sc">&#xe66f;</i>
<div class="name">轻轨</div>
<div class="code">&amp;#xe66f;</div>
</li>
<li>
<i class="icon sc">&#xe635;</i>
<div class="name">风速3</div>
<div class="code">&amp;#xe635;</div>
</li>
<li>
<i class="icon sc">&#xe74a;</i>
<div class="name">calendar</div>
<div class="code">&amp;#xe74a;</div>
</li>
<li>
<i class="icon sc">&#xe6cb;</i>
<div class="name">box</div>
<div class="code">&amp;#xe6cb;</div>
</li>
<li>
<i class="icon sc">&#xe61d;</i>
<div class="name">审核失败</div>
<div class="code">&amp;#xe61d;</div>
</li>
<li>
<i class="icon sc">&#xe676;</i>
<div class="name">边坡</div>
<div class="code">&amp;#xe676;</div>
</li>
<li>
<i class="icon sc">&#xe607;</i>
<div class="name">公路</div>
<div class="code">&amp;#xe607;</div>
</li>
<li>
<i class="icon sc">&#xe825;</i>
<div class="name">GNSS采点</div>
<div class="code">&amp;#xe825;</div>
</li>
<li>
<i class="icon sc">&#xe612;</i>
<div class="name">传感器设备</div>
<div class="code">&amp;#xe612;</div>
</li>
<li>
<i class="icon sc">&#xe62c;</i>
<div class="name">电流传感器</div>
<div class="code">&amp;#xe62c;</div>
</li>
<li>
<i class="icon sc">&#xe62f;</i>
<div class="name">电压传感器</div>
<div class="code">&amp;#xe62f;</div>
</li>
<li>
<i class="icon sc">&#xe637;</i>
<div class="name">温度传感器</div>
<div class="code">&amp;#xe637;</div>
</li>
<li>
<i class="icon sc">&#xe61f;</i>
<div class="name">新建</div>
<div class="code">&amp;#xe61f;</div>
</li>
<li>
<i class="icon sc">&#xe89b;</i>
<div class="name">涵洞</div>
<div class="code">&amp;#xe89b;</div>
</li>
<li>
<i class="icon sc">&#xe646;</i>
<div class="name">管网工程</div>
<div class="code">&amp;#xe646;</div>
</li>
<li>
<i class="icon sc">&#xe639;</i>
<div class="name">审核</div>
<div class="code">&amp;#xe639;</div>
</li>
<li>
<i class="icon sc">&#xe600;</i>
<div class="name">智慧城市</div>
<div class="code">&amp;#xe600;</div>
</li>
<li>
<i class="icon sc">&#xe60a;</i>
<div class="name">边坡位移</div>
<div class="code">&amp;#xe60a;</div>
</li>
<li>
<i class="icon sc">&#xe65f;</i>
<div class="name">建筑</div>
<div class="code">&amp;#xe65f;</div>
</li>
<li>
<i class="icon sc">&#xe636;</i>
<div class="name">储罐</div>
<div class="code">&amp;#xe636;</div>
</li>
<li>
<i class="icon sc">&#xe61e;</i>
<div class="name">隧道</div>
<div class="code">&amp;#xe61e;</div>
</li>
<li>
<i class="icon sc">&#xe757;</i>
<div class="name">data</div>
<div class="code">&amp;#xe757;</div>
</li>
<li>
<i class="icon sc">&#xe608;</i>
<div class="name">矿山开采</div>
<div class="code">&amp;#xe608;</div>
</li>
<li>
<i class="icon sc">&#xe617;</i>
<div class="name">网络</div>
<div class="code">&amp;#xe617;</div>
</li>
<li>
<i class="icon sc">&#xe619;</i>
<div class="name">监控</div>
<div class="code">&amp;#xe619;</div>
</li>
<li>
<i class="icon sc">&#xe61a;</i>
<div class="name">大数据</div>
<div class="code">&amp;#xe61a;</div>
</li>
<li>
<i class="icon sc">&#xe61b;</i>
<div class="name">数据库</div>
<div class="code">&amp;#xe61b;</div>
</li>
<li>
<i class="icon sc">&#xe627;</i>
<div class="name">审核成功</div>
<div class="code">&amp;#xe627;</div>
</li>
<li>
<i class="icon sc">&#xe620;</i>
<div class="name">监控</div>
<div class="code">&amp;#xe620;</div>
</li>
<li>
<i class="icon sc">&#xe62e;</i>
<div class="name">网络系统</div>
<div class="code">&amp;#xe62e;</div>
</li>
<li>
<i class="icon sc">&#xe630;</i>
<div class="name">定位</div>
<div class="code">&amp;#xe630;</div>
</li>
<li>
<i class="icon sc">&#xe631;</i>
<div class="name">系统运转情况</div>
<div class="code">&amp;#xe631;</div>
</li>
<li>
<i class="icon sc">&#xe63e;</i>
<div class="name">查看</div>
<div class="code">&amp;#xe63e;</div>
</li>
<li>
<i class="icon sc">&#xe63f;</i>
<div class="name">链接</div>
<div class="code">&amp;#xe63f;</div>
</li>
<li>
<i class="icon sc">&#xe640;</i>
<div class="name">数据导出-01</div>
<div class="code">&amp;#xe640;</div>
</li>
<li>
<i class="icon sc">&#xe642;</i>
<div class="name">系统状态</div>
<div class="code">&amp;#xe642;</div>
</li>
<li>
<i class="icon sc">&#xe643;</i>
<div class="name">消费明细单</div>
<div class="code">&amp;#xe643;</div>
</li>
<li>
<i class="icon sc">&#xe645;</i>
<div class="name">SQL审核</div>
<div class="code">&amp;#xe645;</div>
</li>
<li>
<i class="icon sc">&#xe648;</i>
<div class="name">aislogo</div>
<div class="code">&amp;#xe648;</div>
</li>
<li>
<i class="icon sc">&#xe715;</i>
<div class="name"></div>
<div class="code">&amp;#xe715;</div>
</li>
<li>
<i class="icon sc">&#xe615;</i>
<div class="name">塔式起重机</div>
<div class="code">&amp;#xe615;</div>
</li>
<li>
<i class="icon sc">&#xe82b;</i>
<div class="name">dwg格式</div>
<div class="code">&amp;#xe82b;</div>
</li>
<li>
<i class="icon sc">&#xe603;</i>
<div class="name">路由器</div>
<div class="code">&amp;#xe603;</div>
</li>
<li>
<i class="icon sc">&#xe8d6;</i>
<div class="name">244安装、施工-线性</div>
<div class="code">&amp;#xe8d6;</div>
</li>
<li>
<i class="icon sc">&#xe8d7;</i>
<div class="name">245筛选过滤</div>
<div class="code">&amp;#xe8d7;</div>
</li>
<li>
<i class="icon sc">&#xe8d8;</i>
<div class="name">244安装、施工</div>
<div class="code">&amp;#xe8d8;</div>
</li>
<li>
<i class="icon sc">&#xe904;</i>
<div class="name">408条形图-线性</div>
<div class="code">&amp;#xe904;</div>
</li>
<li>
<i class="icon sc">&#xe906;</i>
<div class="name">409折线图-线性</div>
<div class="code">&amp;#xe906;</div>
</li>
<li>
<i class="icon sc">&#xe605;</i>
<div class="name">铁塔</div>
<div class="code">&amp;#xe605;</div>
</li>
<li>
<i class="icon sc">&#xe6b8;</i>
<div class="name">800格式_文档txt</div>
<div class="code">&amp;#xe6b8;</div>
</li>
<li>
<i class="icon sc">&#xe6b9;</i>
<div class="name">801格式_文档doc</div>
<div class="code">&amp;#xe6b9;</div>
</li>
<li>
<i class="icon sc">&#xe6bc;</i>
<div class="name">807格式_文档pdf</div>
<div class="code">&amp;#xe6bc;</div>
</li>
<li>
<i class="icon sc">&#xe6be;</i>
<div class="name">803格式_文档xls</div>
<div class="code">&amp;#xe6be;</div>
</li>
<li>
<i class="icon sc">&#xe6c0;</i>
<div class="name">819格式_通用文档</div>
<div class="code">&amp;#xe6c0;</div>
</li>
<li>
<i class="icon sc">&#xe6c8;</i>
<div class="name">840格式_视频mp4</div>
<div class="code">&amp;#xe6c8;</div>
</li>
<li>
<i class="icon sc">&#xe6cc;</i>
<div class="name">860格式_图片jpg</div>
<div class="code">&amp;#xe6cc;</div>
</li>
<li>
<i class="icon sc">&#xe6ce;</i>
<div class="name">865格式_图片png</div>
<div class="code">&amp;#xe6ce;</div>
</li>
<li>
<i class="icon sc">&#xe638;</i>
<div class="name">光照传感器</div>
<div class="code">&amp;#xe638;</div>
</li>
<li>
<i class="icon sc">&#xe61c;</i>
<div class="name">建筑</div>
<div class="code">&amp;#xe61c;</div>
</li>
<li>
<i class="icon sc">&#xe610;</i>
<div class="name">烟雾传感器</div>
<div class="code">&amp;#xe610;</div>
</li>
<li>
<i class="icon sc">&#xe6ca;</i>
<div class="name">市政</div>
<div class="code">&amp;#xe6ca;</div>
</li>
<li>
<i class="icon sc">&#xe60f;</i>
<div class="name">传感器</div>
<div class="code">&amp;#xe60f;</div>
</li>
<li>
<i class="icon sc">&#xe697;</i>
<div class="name">温湿度传感器</div>
<div class="code">&amp;#xe697;</div>
</li>
<li>
<i class="icon sc">&#xe60e;</i>
<div class="name">压力传感器</div>
<div class="code">&amp;#xe60e;</div>
</li>
<li>
<i class="icon sc">&#xe611;</i>
<div class="name">应力传感器</div>
<div class="code">&amp;#xe611;</div>
</li>
<li>
<i class="icon sc">&#xe601;</i>
<div class="name">沉降传感器</div>
<div class="code">&amp;#xe601;</div>
</li>
<li>
<i class="icon sc">&#xe606;</i>
<div class="name">压力传感器</div>
<div class="code">&amp;#xe606;</div>
</li>
<li>
<i class="icon sc">&#xe699;</i>
<div class="name">液位传感器</div>
<div class="code">&amp;#xe699;</div>
</li>
<li>
<i class="icon sc">&#xe6eb;</i>
<div class="name">computer</div>
<div class="code">&amp;#xe6eb;</div>
</li>
<li>
<i class="icon sc">&#xe6f7;</i>
<div class="name">empty</div>
<div class="code">&amp;#xe6f7;</div>
</li>
<li>
<i class="icon sc">&#xe712;</i>
<div class="name">offline</div>
<div class="code">&amp;#xe712;</div>
</li>
<li>
<i class="icon sc">&#xe632;</i>
<div class="name">大坝</div>
<div class="code">&amp;#xe632;</div>
</li>
<li>
<i class="icon sc">&#xe613;</i>
<div class="name">深部位移</div>
<div class="code">&amp;#xe613;</div>
</li>
<li>
<i class="icon sc">&#xe614;</i>
<div class="name">锚索传感器</div>
<div class="code">&amp;#xe614;</div>
</li>
<li>
<i class="icon sc">&#xe616;</i>
<div class="name">雨量传感器</div>
<div class="code">&amp;#xe616;</div>
</li>
<li>
<i class="icon sc">&#xe618;</i>
<div class="name">位移计</div>
<div class="code">&amp;#xe618;</div>
</li>
<li>
<i class="icon sc">&#xe60d;</i>
<div class="name">气象站_1</div>
<div class="code">&amp;#xe60d;</div>
</li>
<li>
<i class="icon sc">&#xe62a;</i>
<div class="name">深基坑</div>
<div class="code">&amp;#xe62a;</div>
</li>
</ul>
<h2 id="unicode-">unicode引用</h2>
<hr>
<p>unicode是字体在网页端最原始的应用方式,特点是:</p>
<ul>
<li>兼容性最好,支持ie6+,及所有现代浏览器。</li>
<li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
<li>但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。</li>
</ul>
<blockquote>
<p>注意:新版iconfont支持多色图标,这些多色图标在unicode模式下将不能使用,如果有需求建议使用symbol的引用方式</p>
</blockquote>
<p>unicode使用步骤如下:</p>
<h3 id="-font-face">第一步:拷贝项目下面生成的font-face</h3>
<pre><code class="lang-js hljs javascript">@font-face {
font-family: <span class="hljs-string">'sc'</span>;
src: url(<span class="hljs-string">'iconfont.eot'</span>);
src: url(<span class="hljs-string">'iconfont.eot?#iefix'</span>) format(<span class="hljs-string">'embedded-opentype'</span>),
url(<span class="hljs-string">'iconfont.woff'</span>) format(<span class="hljs-string">'woff'</span>),
url(<span class="hljs-string">'iconfont.ttf'</span>) format(<span class="hljs-string">'truetype'</span>),
url(<span class="hljs-string">'iconfont.svg#sc'</span>) format(<span class="hljs-string">'svg'</span>);
}
</code></pre>
<h3 id="-iconfont-">第二步:定义使用iconfont的样式</h3>
<pre><code class="lang-js hljs javascript">.sc{
font-family:<span class="hljs-string">"sc"</span> !important;
font-size:<span class="hljs-number">16</span>px;font-style:normal;
-webkit-font-smoothing: antialiased;
-webkit-text-stroke-width: <span class="hljs-number">0.2</span>px;
-moz-osx-font-smoothing: grayscale;
}
</code></pre>
<h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
<pre><code class="lang-js hljs javascript">&lt;i <span class="hljs-class"><span class="hljs-keyword">class</span></span>=<span class="hljs-string">"sc"</span>&gt;&amp;#x33;<span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">i</span>&gt;</span></span></code></pre>
<blockquote>
<p>"sc"是你项目下的font-family。可以通过编辑项目查看,默认是"iconfont"。</p>
</blockquote>
</div>
</body>
</html>

175
web/client/assets/font_sc/iconfont.css

File diff suppressed because one or more lines are too long

BIN
web/client/assets/font_sc/iconfont.eot

Binary file not shown.

1
web/client/assets/font_sc/iconfont.js

File diff suppressed because one or more lines are too long

270
web/client/assets/font_sc/iconfont.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 148 KiB

BIN
web/client/assets/font_sc/iconfont.ttf

Binary file not shown.

BIN
web/client/assets/font_sc/iconfont.woff

Binary file not shown.

1
web/client/assets/fonticon/YaHei_Regular.typeface.json

File diff suppressed because one or more lines are too long

521
web/client/assets/fonticon/iconfont.css

@ -0,0 +1,521 @@
@font-face {font-family: "anticon";
src: url('iconfont.eot?t=1494480257283'); /* IE9*/
src: url('iconfont.eot?t=1494480257283#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('iconfont.woff?t=1494480257283') format('woff'), /* chrome, firefox */
url('iconfont.ttf?t=1494480257283') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
url('iconfont.svg?t=1494480257283#anticon') format('svg'); /* iOS 4.1- */
}
.anticon {
font-family:"anticon" !important;
font-size:16px;
font-style:normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-stepforward:before { content: "\e600"; }
.icon-stepbackward:before { content: "\e601"; }
.icon-forward:before { content: "\e602"; }
.icon-banckward:before { content: "\e603"; }
.icon-caretright:before { content: "\e604"; }
.icon-caretleft:before { content: "\e605"; }
.icon-caretdown:before { content: "\e606"; }
.icon-caretup:before { content: "\e607"; }
.icon-rightcircle:before { content: "\e608"; }
.icon-leftcircle:before { content: "\e609"; }
.icon-upcircle:before { content: "\e60a"; }
.icon-downcircle:before { content: "\e60b"; }
.icon-rightcircleo:before { content: "\e60c"; }
.icon-leftcircleo:before { content: "\e60d"; }
.icon-upcircleo:before { content: "\e60e"; }
.icon-downcircleo:before { content: "\e60f"; }
.icon-verticleleft:before { content: "\e610"; }
.icon-verticleright:before { content: "\e611"; }
.icon-rollback:before { content: "\e612"; }
.icon-retweet:before { content: "\e613"; }
.icon-shrink:before { content: "\e614"; }
.icon-arrowsalt:before { content: "\e615"; }
.icon-doubleright:before { content: "\e617"; }
.icon-doubleleft:before { content: "\e618"; }
.icon-arrowdown:before { content: "\e619"; }
.icon-arrowup:before { content: "\e61a"; }
.icon-arrowright:before { content: "\e61b"; }
.icon-arrowleft:before { content: "\e61c"; }
.icon-down:before { content: "\e61d"; }
.icon-up:before { content: "\e61e"; }
.icon-right:before { content: "\e61f"; }
.icon-left:before { content: "\e620"; }
.icon-minussquareo:before { content: "\e621"; }
.icon-minuscircle:before { content: "\e622"; }
.icon-minuscircleo:before { content: "\e623"; }
.icon-minus:before { content: "\e624"; }
.icon-pluscircleo:before { content: "\e625"; }
.icon-pluscircle:before { content: "\e626"; }
.icon-plus:before { content: "\e627"; }
.icon-infocirlce:before { content: "\e628"; }
.icon-infocirlceo:before { content: "\e629"; }
.icon-info:before { content: "\e62a"; }
.icon-exclamation:before { content: "\e62b"; }
.icon-exclamationcircle:before { content: "\e62c"; }
.icon-exclamationcircleo:before { content: "\e62d"; }
.icon-closecircle:before { content: "\e62e"; }
.icon-closecircleo:before { content: "\e62f"; }
.icon-checkcircle:before { content: "\e630"; }
.icon-checkcircleo:before { content: "\e631"; }
.icon-check:before { content: "\e632"; }
.icon-close:before { content: "\e633"; }
.icon-customerservice:before { content: "\e634"; }
.icon-creditcard:before { content: "\e635"; }
.icon-codesquareo:before { content: "\e636"; }
.icon-book:before { content: "\e637"; }
.icon-barschart:before { content: "\e638"; }
.icon-bars:before { content: "\e639"; }
.icon-question:before { content: "\e63a"; }
.icon-questioncircle:before { content: "\e63b"; }
.icon-questioncircleo:before { content: "\e63c"; }
.icon-pause:before { content: "\e63d"; }
.icon-pausecircle:before { content: "\e63e"; }
.icon-pausecircleo:before { content: "\e63f"; }
.icon-clockcircle:before { content: "\e640"; }
.icon-clockcircleo:before { content: "\e641"; }
.icon-swap:before { content: "\e642"; }
.icon-swapleft:before { content: "\e643"; }
.icon-swapright:before { content: "\e644"; }
.icon-plussquareo:before { content: "\e645"; }
.icon-frown:before { content: "\e646"; }
.icon-menufold:before { content: "\e658"; }
.icon-mail:before { content: "\e659"; }
.icon-link:before { content: "\e65b"; }
.icon-areachart:before { content: "\e65c"; }
.icon-linechart:before { content: "\e65d"; }
.icon-home:before { content: "\e65e"; }
.icon-laptop:before { content: "\e65f"; }
.icon-star:before { content: "\e660"; }
.icon-staro:before { content: "\e661"; }
.icon-filter:before { content: "\e663"; }
.icon-meho:before { content: "\e666"; }
.icon-meh:before { content: "\e667"; }
.icon-shoppingcart:before { content: "\e668"; }
.icon-save:before { content: "\e669"; }
.icon-user:before { content: "\e66a"; }
.icon-videocamera:before { content: "\e66b"; }
.icon-totop:before { content: "\e66c"; }
.icon-team:before { content: "\e66d"; }
.icon-sharealt:before { content: "\e671"; }
.icon-setting:before { content: "\e672"; }
.icon-picture:before { content: "\e674"; }
.icon-phone:before { content: "\e675"; }
.icon-paperclip:before { content: "\e676"; }
.icon-notification:before { content: "\e677"; }
.icon-menuunfold:before { content: "\e679"; }
.icon-inbox:before { content: "\e67a"; }
.icon-lock:before { content: "\e67b"; }
.icon-qrcode:before { content: "\e67c"; }
.icon-tags:before { content: "\e67d"; }
.icon-tagso:before { content: "\e67e"; }
.icon-cloudo:before { content: "\e67f"; }
.icon-cloud:before { content: "\e680"; }
.icon-cloudupload:before { content: "\e681"; }
.icon-clouddownload:before { content: "\e682"; }
.icon-clouddownloado:before { content: "\e683"; }
.icon-clouduploado:before { content: "\e684"; }
.icon-enviroment:before { content: "\e685"; }
.icon-enviromento:before { content: "\e686"; }
.icon-eye:before { content: "\e687"; }
.icon-eyeo:before { content: "\e688"; }
.icon-camera:before { content: "\e689"; }
.icon-camerao:before { content: "\e68a"; }
.icon-windows:before { content: "\e68b"; }
.icon-export2:before { content: "\e690"; }
.icon-export:before { content: "\e691"; }
.icon-circledowno:before { content: "\e693"; }
.icon-circledown:before { content: "\e694"; }
.icon-hdd:before { content: "\e69a"; }
.icon-ie:before { content: "\e69b"; }
.icon-delete:before { content: "\e69f"; }
.icon-enter:before { content: "\e6a0"; }
.icon-pushpino:before { content: "\e6a1"; }
.icon-pushpin:before { content: "\e6a2"; }
.icon-heart:before { content: "\e6a3"; }
.icon-hearto:before { content: "\e6a4"; }
.icon-smile-circle:before { content: "\e6a7"; }
.icon-smileo:before { content: "\e6a8"; }
.icon-frowno:before { content: "\e6a9"; }
.icon-calculator:before { content: "\e6aa"; }
.icon-chrome:before { content: "\e6ac"; }
.icon-github:before { content: "\e6ad"; }
.icon-iconfontdesktop:before { content: "\e6b4"; }
.icon-caretcircleoup:before { content: "\e6b5"; }
.icon-upload:before { content: "\e6b6"; }
.icon-download:before { content: "\e6b7"; }
.icon-piechart:before { content: "\e6b8"; }
.icon-lock1:before { content: "\e6b9"; }
.icon-unlock:before { content: "\e6ba"; }
.icon-windowso:before { content: "\e6bc"; }
.icon-dotchart:before { content: "\e6bd"; }
.icon-barchart:before { content: "\e6be"; }
.icon-codesquare:before { content: "\e6bf"; }
.icon-plussquare:before { content: "\e6c0"; }
.icon-minussquare:before { content: "\e6c1"; }
.icon-closesquare:before { content: "\e6c2"; }
.icon-closesquareo:before { content: "\e6c3"; }
.icon-checksquare:before { content: "\e6c4"; }
.icon-checksquareo:before { content: "\e6c5"; }
.icon-fastbackward:before { content: "\e6c6"; }
.icon-fastforward:before { content: "\e6c7"; }
.icon-upsquare:before { content: "\e6c8"; }
.icon-downsquare:before { content: "\e6c9"; }
.icon-leftsquare:before { content: "\e6ca"; }
.icon-rightsquare:before { content: "\e6cb"; }
.icon-rightsquareo:before { content: "\e6cc"; }
.icon-leftsquareo:before { content: "\e6cd"; }
.icon-down-square-o:before { content: "\e6ce"; }
.icon-up-square-o:before { content: "\e6cf"; }
.icon-play:before { content: "\e6d0"; }
.icon-playcircleo:before { content: "\e6d1"; }
.icon-tag:before { content: "\e6d2"; }
.icon-tago:before { content: "\e6d3"; }
.icon-addfile:before { content: "\e910"; }
.icon-folder1:before { content: "\e662"; }
.icon-file1:before { content: "\e664"; }
.icon-switcher:before { content: "\e913"; }
.icon-addfolder:before { content: "\e914"; }
.icon-folderopen:before { content: "\e699"; }
.icon-search1:before { content: "\e670"; }
.icon-ellipsis1:before { content: "\e647"; }
.icon-calendar:before { content: "\e6bb"; }
.icon-filetext1:before { content: "\e698"; }
.icon-copy1:before { content: "\e648"; }
.icon-jpgfile1:before { content: "\e69c"; }
.icon-pdffile1:before { content: "\e6b3"; }
.icon-exclefile1:before { content: "\e6b0"; }
.icon-pptfile1:before { content: "\e6b1"; }
.icon-unknowfile1:before { content: "\e6af"; }
.icon-wordfile1:before { content: "\e6b2"; }
.icon-dingding:before { content: "\e923"; }
.icon-dingding-o:before { content: "\e925"; }
.icon-mobile1:before { content: "\e678"; }
.icon-tablet1:before { content: "\e66e"; }
.icon-bells:before { content: "\e64e"; }
.icon-disconnect:before { content: "\e64f"; }
.icon-database:before { content: "\e650"; }
.icon-barcode:before { content: "\e652"; }
.icon-hourglass:before { content: "\e653"; }
.icon-key:before { content: "\e654"; }
.icon-flag:before { content: "\e655"; }
.icon-layout:before { content: "\e656"; }
.icon-printer:before { content: "\e673"; }
.icon-USB:before { content: "\e6d7"; }
.icon-skin:before { content: "\e6d8"; }
.icon-tool:before { content: "\e6d9"; }
.icon-car:before { content: "\e6dc"; }
.icon-addusergroup:before { content: "\e6dd"; }
.icon-carryout:before { content: "\e6df"; }
.icon-deleteuser:before { content: "\e6e0"; }
.icon-deleteusergroup:before { content: "\e6e1"; }
.icon-man:before { content: "\e6e2"; }
.icon-isv:before { content: "\e6e3"; }
.icon-gift:before { content: "\e6e4"; }
.icon-idcard:before { content: "\e6e5"; }
.icon-medicinebox:before { content: "\e6e6"; }
.icon-redenvelopes:before { content: "\e6e7"; }
.icon-rest:before { content: "\e6e8"; }
.icon-Safety:before { content: "\e6ea"; }
.icon-wallet:before { content: "\e6eb"; }
.icon-woman:before { content: "\e6ec"; }
.icon-adduser:before { content: "\e6ed"; }
.icon-bank:before { content: "\e6ee"; }
.icon-Trophy:before { content: "\e6ef"; }
.icon-loading1:before { content: "\e6ae"; }
.icon-loading2:before { content: "\e64d"; }
.icon-like2:before { content: "\e69d"; }
.icon-dislike2:before { content: "\e69e"; }
.icon-like1:before { content: "\e64c"; }
.icon-dislike1:before { content: "\e64b"; }
.icon-bulb1:before { content: "\e649"; }
.icon-rocket1:before { content: "\e90f"; }
.icon-select1:before { content: "\e64a"; }
.icon-apple1:before { content: "\e68c"; }
.icon-apple-o:before { content: "\e6d4"; }
.icon-android1:before { content: "\e938"; }
.icon-android:before { content: "\e68d"; }
.icon-aliwangwang-o1:before { content: "\e68f"; }
.icon-aliwangwang:before { content: "\e68e"; }
.icon-pay-circle1:before { content: "\e6a5"; }
.icon-pay-circle-o1:before { content: "\e6a6"; }
.icon-poweroff:before { content: "\e6d5"; }
.icon-trademark:before { content: "\e651"; }
.icon-find:before { content: "\e6db"; }
.icon-copyright:before { content: "\e6de"; }
.icon-sound:before { content: "\e6e9"; }
.icon-earth:before { content: "\e6f1"; }
.icon-wifi:before { content: "\e6d6"; }
.icon-sync:before { content: "\e6da"; }
.icon-login:before { content: "\e657"; }
.icon-logout:before { content: "\e65a"; }
.icon-reload1:before { content: "\e616"; }
.icon-message1:before { content: "\e6ab"; }
.icon-shake:before { content: "\e94f"; }
.icon-API:before { content: "\e951"; }
.icon-appstore-o:before { content: "\e695"; }
.icon-appstore1:before { content: "\e696"; }
.icon-scan1:before { content: "\e697"; }
.icon-exception1:before { content: "\e665"; }
.icon-contacts:before { content: "\e6f0"; }
.icon-solution1:before { content: "\e66f"; }
.icon-fork:before { content: "\e6f2"; }
.icon-edit1:before { content: "\e692"; }

BIN
web/client/assets/fonticon/iconfont.eot

Binary file not shown.

1
web/client/assets/fonticon/iconfont.js

File diff suppressed because one or more lines are too long

927
web/client/assets/fonticon/iconfont.svg

@ -0,0 +1,927 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>
Created by FontForge 20120731 at Thu May 11 13:24:17 2017
By admin
</metadata>
<defs>
<font id="anticon" horiz-adv-x="1024" >
<font-face
font-family="anticon"
font-weight="500"
font-stretch="normal"
units-per-em="1024"
panose-1="2 0 6 3 0 0 0 0 0 0"
ascent="896"
descent="-128"
x-height="792"
bbox="-0.142858 -128.087 1024.37 896.923"
underline-thickness="0"
underline-position="0"
unicode-range="U+0078-E951"
/>
<missing-glyph
/>
<glyph glyph-name=".notdef"
/>
<glyph glyph-name=".notdef"
/>
<glyph glyph-name=".null" horiz-adv-x="0"
/>
<glyph glyph-name="nonmarkingreturn" horiz-adv-x="341"
/>
<glyph glyph-name="x" unicode="x" horiz-adv-x="1001"
d="M281 543q-27 -1 -53 -1h-83q-18 0 -36.5 -6t-32.5 -18.5t-23 -32t-9 -45.5v-76h912v41q0 16 -0.5 30t-0.5 18q0 13 -5 29t-17 29.5t-31.5 22.5t-49.5 9h-133v-97h-438v97zM955 310v-52q0 -23 0.5 -52t0.5 -58t-10.5 -47.5t-26 -30t-33 -16t-31.5 -4.5q-14 -1 -29.5 -0.5
t-29.5 0.5h-32l-45 128h-439l-44 -128h-29h-34q-20 0 -45 1q-25 0 -41 9.5t-25.5 23t-13.5 29.5t-4 30v167h911zM163 247q-12 0 -21 -8.5t-9 -21.5t9 -21.5t21 -8.5q13 0 22 8.5t9 21.5t-9 21.5t-22 8.5zM316 123q-8 -26 -14 -48q-5 -19 -10.5 -37t-7.5 -25t-3 -15t1 -14.5
t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q-5 19 -11 39h-368zM336 498v228q0 11 2.5 23t10 21.5t20.5 15.5t34 6h188q31 0 51.5 -14.5t20.5 -52.5v-227h-327z" />
<glyph glyph-name="stepforward" unicode="&#xe600;"
d="M327 820l431 -356v300q0 15 10.5 25.5t25.5 10.5v0q15 0 25.5 -10.5t10.5 -25.5v-760q0 -15 -10.5 -25.5t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v301l-431 -357q-21 -18 -46 -7t-25 39v808q0 28 25 39t46 -7z" />
<glyph glyph-name="stepbackward" unicode="&#xe601;"
d="M759 820l-431 -356v300q0 15 -10.5 25.5t-25.5 10.5v0q-15 0 -25.5 -10.5t-10.5 -25.5v-760q0 -15 10.5 -25.5t25.5 -10.5v0q15 0 25.5 10.5t10.5 25.5v301l431 -357q21 -18 46 -7t25 39v808q0 28 -25 39t-46 -7z" />
<glyph glyph-name="forward" unicode="&#xe602;"
d="M575 790l436 -375q13 -12 13 -30t-13 -29l-436 -378q-18 -17 -40.5 -6.5t-22.5 36.5v377v375q0 26 22.5 36.5t40.5 -6.5zM63 790l436 -375q13 -12 13 -30t-13 -29l-436 -378q-18 -17 -40.5 -6.5t-22.5 36.5v752q0 26 22.5 36.5t40.5 -6.5z" />
<glyph glyph-name="banckward" unicode="&#xe603;" horiz-adv-x="1025"
d="M449 790l-436 -376q-13 -11 -13 -29t13 -30l436 -377q18 -17 40.5 -6.5t22.5 36.5v377v375q0 26 -22.5 36.5t-40.5 -6.5zM961 790l-436 -376q-13 -11 -13 -29t13 -30l436 -377q18 -17 40.5 -6.5t22.5 36.5v752q0 26 -22.5 36.5t-40.5 -6.5z" />
<glyph glyph-name="caretright" unicode="&#xe604;"
d="M393 820l489 -403q14 -13 14 -32t-14 -32l-489 -405q-21 -18 -46 -7t-25 39v808q0 28 25 39t46 -7z" />
<glyph glyph-name="caretleft" unicode="&#xe605;"
d="M631 820l-489 -403q-14 -13 -14 -32t14 -32l489 -405q21 -18 46 -7t25 39v808q0 28 -25 39t-46 -7z" />
<glyph glyph-name="caretdown" unicode="&#xe606;"
d="M76 504l403 -489q13 -15 32 -15t32 15l405 489q18 20 7 45t-39 25h-808q-28 0 -39 -25t7 -45z" />
<glyph glyph-name="caretup" unicode="&#xe607;"
d="M76 263l405 489q13 14 32 14t32 -14l403 -489q18 -20 7 -45.5t-39 -25.5h-808q-28 0 -39 25.5t7 45.5z" />
<glyph glyph-name="rightcircle" unicode="&#xe608;"
d="M512 895q-104 0 -199 -40.5t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5zM681 358l-235 -220q-11 -11 -26 -10.5t-25 11.5t-9.5 26t11.5 25l207 194l-207 195
q-11 10 -11.5 25t9.5 26t25 11.5t26 -9.5l235 -221q12 -11 12 -26.5t-12 -26.5z" />
<glyph glyph-name="leftcircle" unicode="&#xe609;"
d="M512 895q-104 0 -199 -40.5t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5zM629 139q-10 -11 -25 -11.5t-26 9.5l-235 221q-12 11 -12 26.5t11 26.5l236 220q11 11 26 10.5
t25 -11.5t9.5 -26t-11.5 -25l-207 -195l207 -194q11 -10 11.5 -25t-9.5 -26z" />
<glyph glyph-name="upcircle" unicode="&#xe60a;"
d="M512 895q-104 0 -199 -40.5t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5zM757 278.5q-11 -10.5 -25.5 -10t-24.5 11.5l-195 208l-195 -208q-10 -11 -25 -11.5t-25.5 10
t-11 25t9.5 25.5l221 236q10 11 26 11t26 -11l221 -236q10 -11 9.5 -25.5t-11.5 -25z" />
<glyph glyph-name="downcircle" unicode="&#xe60b;"
d="M512 895q-104 0 -199 -40.5t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5zM759 430l-221 -236q-10 -11 -26 -11t-26 11l-221 236q-10 11 -9.5 25.5t11 25t25.5 10t25 -11.5
l195 -208l195 208q10 11 24.5 11.5t25.5 -10t11.5 -25t-9.5 -25.5z" />
<glyph glyph-name="rightcircleo" unicode="&#xe60c;"
d="M511.5 823q89.5 0 171.5 -34q79 -34 140 -95t94 -139q35 -82 35 -171.5t-35 -171.5q-33 -78 -94 -139t-140 -95q-81 -34 -170.5 -34t-171.5 34q-79 34 -140 95t-94 139q-35 82 -35 171.5t35 171.5q33 78 94 139t140 95q81 34 170.5 34zM512 895q-104 0 -199 -40.5
t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5v0zM681 411l-235 220q-11 11 -26 10.5t-25 -11.5t-9.5 -26t11.5 -25l207 -195l-207 -194q-11 -10 -11.5 -25t9.5 -26t25 -11.5
t26 9.5l235 221q12 11 12 26.5t-12 26.5z" />
<glyph glyph-name="leftcircleo" unicode="&#xe60d;"
d="M511.5 823q89.5 0 171.5 -34q79 -34 140 -95t94 -139q35 -82 35 -171.5t-35 -171.5q-33 -78 -94 -139t-140 -95q-81 -34 -170.5 -34t-171.5 34q-79 34 -140 95t-94 139q-35 82 -35 171.5t35 171.5q33 78 94 139t140 95q81 34 170.5 34zM512 895q-104 0 -199 -40.5
t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5v0zM331 384.5q0 -15.5 12 -26.5l235 -221q11 -10 26 -9.5t25 11.5t9.5 26t-11.5 25l-207 194l207 195q11 10 11.5 25t-9.5 26
t-25 11.5t-26 -10.5l-236 -220q-11 -11 -11 -26.5z" />
<glyph glyph-name="upcircleo" unicode="&#xe60e;"
d="M511.5 823q89.5 0 171.5 -34q79 -34 140 -95t94 -139q35 -82 35 -171.5t-35 -171.5q-33 -78 -94 -139t-140 -95q-81 -34 -170.5 -34t-171.5 34q-79 34 -140 95t-94 139q-35 82 -35 171.5t35 171.5q33 78 94 139t140 95q81 34 170.5 34zM512 895q-104 0 -199 -40.5
t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5v0zM512 576q-16 0 -26 -11l-221 -236q-10 -11 -9.5 -25.5t11 -25t25.5 -10t25 11.5l195 208l195 -208q10 -11 24.5 -11.5t25.5 10
t11.5 25t-9.5 25.5l-221 236q-10 11 -26 11z" />
<glyph glyph-name="downcircleo" unicode="&#xe60f;"
d="M511.5 823q89.5 0 171.5 -34q79 -34 140 -95t94 -139q35 -82 35 -171.5t-35 -171.5q-33 -78 -94 -139t-140 -95q-81 -34 -170.5 -34t-171.5 34q-79 34 -140 95t-94 139q-35 82 -35 171.5t35 171.5q33 78 94 139t140 95q81 34 170.5 34zM512 895q-104 0 -199 -40.5
t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5v0zM512 183q-16 0 -26 11l-221 236q-10 11 -9.5 25.5t11 25t25.5 10t25 -11.5l195 -208l195 208q10 11 24.5 11.5t25.5 -10
t11.5 -25t-9.5 -25.5l-221 -236q-10 -11 -26 -11z" />
<glyph glyph-name="verticleleft" unicode="&#xe610;"
d="M273 78l382 307l-380 305q-14 11 -16 29t9.5 32t29.5 16t32 -9l358 -288v262q0 15 10.5 25.5t25.5 10.5h8q15 0 25.5 -10.5t10.5 -25.5v-696q0 -15 -10.5 -25.5t-25.5 -10.5h-8q-15 0 -25.5 10.5t-10.5 25.5v264l-360 -290q-12 -10 -27 -10q-21 0 -35 17q-11 14 -9 32
t16 29z" />
<glyph glyph-name="verticleright" unicode="&#xe611;"
d="M752 78l-382 307l380 305q14 11 16 29t-9.5 32t-29.5 16t-32 -9l-358 -288v262q0 15 -10.5 25.5t-25.5 10.5h-8q-15 0 -25.5 -10.5t-10.5 -25.5v-696q0 -15 10.5 -25.5t25.5 -10.5h8q15 0 25.5 10.5t10.5 25.5v264l360 -290q12 -10 27 -10q21 0 34 17q12 14 10 32t-16 29
z" />
<glyph glyph-name="rollback" unicode="&#xe612;"
d="M811.5 471.5q-88.5 88.5 -213.5 88.5h-336l114 114q12 12 12 28.5t-12 28t-28.5 11.5t-28.5 -12l-183 -183q-12 -12 -12 -28.5t12 -28.5l178 -178q12 -12 28.5 -12t28 11.5t11.5 28t-11 28.5l-113 112h340q92 0 157 -65t65 -157v-192q0 -17 12 -28.5t28.5 -11.5t28 11.5
t11.5 28.5v192q0 125 -88.5 213.5z" />
<glyph glyph-name="retweet" unicode="&#xe613;"
d="M366 579h349l-119 -119q-11 -11 -11 -26t10.5 -25.5t25.5 -10.5t25 11l179 178q11 11 11 25.5t-11 25.5l-184 184q-10 10 -25 10t-25.5 -10.5t-10.5 -25.5t10 -25l120 -120h-344q-124 0 -211.5 -87.5t-87.5 -211.5q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5
q0 94 66.5 160.5t160.5 66.5zM923 455q-15 0 -25.5 -10.5t-10.5 -25.5q0 -94 -66.5 -160.5t-160.5 -66.5h-349l120 120q10 10 10 25t-10.5 25.5t-25.5 10.5t-25 -11l-179 -178q-10 -11 -10 -25.5t10 -25.5l184 -184q10 -10 25 -10t25.5 10.5t10.5 25.5t-10 25l-120 120h344
q124 0 211.5 87.5t87.5 211.5q0 15 -10.5 25.5t-25.5 10.5z" />
<glyph glyph-name="shrink" unicode="&#xe614;"
d="M109 247h211l-232 -232q-13 -13 -13 -31t13 -31t31 -13t31 13l236 236v-210q0 -18 13 -31t31 -13t31 13t13 31v312q0 19 -13 31.5t-31 12.5h-321q-18 0 -31 -12.5t-13 -31t13 -31.5t31 -13zM595 431h321q18 0 31 13t13 31t-13 31t-31 13h-211l232 232q13 13 13 31.5
t-13 31t-31 12.5t-31 -12l-236 -236v209q0 18 -13 31t-31 13t-31 -13t-13 -31v-312q0 -18 13 -31t31 -13z" />
<glyph glyph-name="arrowsalt" unicode="&#xe615;"
d="M430 23h-211l232 232q13 13 13 31.5t-13 31t-31 12.5t-31 -12l-236 -236v209q0 18 -13 31t-31 13t-31 -13t-13 -31v-312q0 -18 13 -31t31 -13h321q18 0 31 13t13 31t-13 31t-31 13zM916 831h-321q-18 0 -31 -13t-13 -31t13 -31t31 -13h211l-232 -232q-13 -13 -13 -31
t13 -31t31 -13t31 13l236 236v-210q0 -18 13 -31t31 -13t31 13t13 31v312q0 18 -13 31t-31 13z" />
<glyph glyph-name="doubleright" unicode="&#xe617;"
d="M431 17q-11 14 -9 32t16 29l381 307l-379 305q-14 11 -16 29t9 32t29 16t32 -9l422 -339q17 -13 17 -34t-17 -34l-424 -341q-12 -10 -27 -10q-21 0 -34 17zM101 17q-11 14 -9 32t16 29l381 307l-379 305q-14 11 -16 29t9 32t29 16t32 -9l422 -339q17 -13 17 -34t-17 -34
l-424 -341q-12 -10 -27 -10q-21 0 -34 17z" />
<glyph glyph-name="doubleleft" unicode="&#xe618;"
d="M559 0q-15 0 -27 10l-424 341q-17 13 -17 34t17 34l422 339q14 11 32 9t29 -16t9 -32t-16 -29l-379 -305l381 -307q14 -11 16 -29t-9 -32q-13 -17 -34 -17zM889 0q-15 0 -27 10l-424 341q-17 13 -17 34t17 34l422 339q14 11 32 9t29 -16t9 -32t-16 -29l-379 -305
l381 -307q14 -11 16 -29t-9 -32q-13 -17 -34 -17z" />
<glyph glyph-name="arrowdown" unicode="&#xe619;"
d="M558 725v-574v0l208 216q13 14 31 14t31.5 -12.5t13.5 -30.5t-12 -32l-284 -294q-13 -14 -31.5 -14t-31.5 14l-285 296q-12 13 -12 30q0 19 14 32q13 13 31 12.5t31 -13.5l208 -216v0v573q0 17 12 30t29 14q19 1 33 -12.5t14 -32.5z" />
<glyph glyph-name="arrowup" unicode="&#xe61a;"
d="M470 43v574v0l-208 -216q-13 -14 -31 -14t-31.5 12.5t-13.5 30.5t12 32l284 294q13 14 31.5 14t31.5 -14l285 -296q12 -13 12 -30q0 -19 -14 -32q-13 -13 -31 -12.5t-31 13.5l-208 216v0v-573q0 -17 -12 -30t-29 -14q-19 -1 -33 12.5t-14 32.5z" />
<glyph glyph-name="arrowright" unicode="&#xe61b;"
d="M173 428h574v0l-216 208q-14 13 -14 31t12.5 31.5t30.5 13.5t32 -12l294 -284q14 -13 14 -31.5t-14 -31.5l-296 -285q-13 -12 -30 -12q-19 0 -32 14q-13 13 -12.5 31t13.5 31l216 208v0h-573q-17 0 -30 12t-14 29q-1 19 12.5 33t32.5 14z" />
<glyph glyph-name="arrowleft" unicode="&#xe61c;"
d="M855 428h-574v0l216 208q14 13 14 31t-12.5 31.5t-30.5 13.5t-32 -12l-294 -284q-14 -13 -14 -31.5t14 -31.5l296 -285q13 -12 30 -12q19 0 32 14q13 13 12.5 31t-13.5 31l-216 208v0h573q17 0 30 12t14 29q1 19 -12.5 33t-32.5 14z" />
<glyph glyph-name="down" unicode="&#xe61d;"
d="M896 596q0 -15 -10 -28l-341 -423q-13 -17 -34 -17t-34 17l-339 422q-11 14 -9 32t16 29t32 9t29 -16l305 -379l307 381q11 14 29 16t32 -9q17 -13 17 -34z" />
<glyph glyph-name="up" unicode="&#xe61e;"
d="M896 236q0 15 -10 28l-341 423q-13 17 -34 17t-34 -17l-339 -422q-11 -14 -9 -32t16 -29t32 -9t29 16l305 379l307 -381q11 -14 29 -16t32 9q17 13 17 34z" />
<glyph glyph-name="right" unicode="&#xe61f;"
d="M301 0q15 0 27 10l424 341q16 13 16 34t-16 34l-422 339q-14 11 -32 9t-29.5 -16t-9.5 -32t16 -29l380 -305l-382 -307q-14 -11 -16 -29t9 -32q14 -17 35 -17z" />
<glyph glyph-name="left" unicode="&#xe620;"
d="M724 0q-15 0 -27 10l-424 341q-16 13 -16 34t16 34l422 339q14 11 32 9t29.5 -16t9.5 -32t-16 -29l-380 -305l382 -307q14 -11 16 -29t-10 -32q-13 -17 -34 -17z" />
<glyph glyph-name="minussquareo" unicode="&#xe621;"
d="M888 760v0v0v-753v0h-752v0v753v0h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0zM732 347h-442q-14 0 -25 10.5t-11 25.5v0q0 15 11 25.5t25 10.5h442q14 0 25 -10.5t11 -25.5v0
q0 -15 -11 -25.5t-25 -10.5z" />
<glyph glyph-name="minuscircle" unicode="&#xe622;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM832 384q0 -15 -10.5 -25.5t-25.5 -10.5h-568q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h568
q15 0 25.5 -10.5t10.5 -25.5v0z" />
<glyph glyph-name="minuscircleo" unicode="&#xe623;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171
q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM796 348h-568q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h568q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5z" />
<glyph glyph-name="minus" unicode="&#xe624;"
d="M796 348h-568q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h568q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5z" />
<glyph glyph-name="pluscircleo" unicode="&#xe625;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171
q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM732 420h-184v183q0 15 -10.5 25.5t-25.5 10.5v0q-14 0 -25 -10.5t-11 -25.5v-183h-184q-15 0 -25.5 -11t-10.5 -25v0q0 -15 10.5 -25.5t25.5 -10.5h184v-183
q0 -15 11 -25.5t25 -10.5v0q15 0 25.5 10.5t10.5 25.5v183h184q15 0 25.5 10.5t10.5 25.5v0q0 14 -10.5 25t-25.5 11z" />
<glyph glyph-name="pluscircle" unicode="&#xe626;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM768 384q0 -15 -10.5 -25.5t-25.5 -10.5h-184v-183q0 -15 -10.5 -25.5t-25.5 -10.5v0q-14 0 -25 10.5
t-11 25.5v183h-184q-15 0 -25.5 10.5t-10.5 25.5v0q0 14 10.5 25t25.5 11h184v183q0 15 11 25.5t25 10.5v0q15 0 25.5 -10.5t10.5 -25.5v-183h184q15 0 25.5 -11t10.5 -25v0z" />
<glyph glyph-name="plus" unicode="&#xe627;"
d="M866 420h-318v310q0 15 -10.5 25.5t-25.5 10.5v0q-15 0 -25.5 -10.5t-10.5 -25.5v-310h-312q-14 0 -25 -10.5t-11 -25.5v0q0 -15 11 -25.5t25 -10.5h312v-312q0 -14 10.5 -25t25.5 -11v0q15 0 25.5 11t10.5 25v312h318q15 0 25.5 10.5t10.5 25.5v0q0 15 -10.5 25.5
t-25.5 10.5z" />
<glyph glyph-name="infocirlce" unicode="&#xe628;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM509 712q15 0 25.5 -11t10.5 -25.5t-10.5 -25t-25.5 -10.5t-25.5 10.5t-10.5 25t10.5 25.5t25.5 11zM666 154
q0 -15 -10.5 -25.5t-25.5 -10.5h-85h-72h-85q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h85v314h-60q-15 0 -25.5 11t-10.5 25v0q0 15 10.5 25.5t25.5 10.5h60h36v0q15 0 25.5 -10.5t10.5 -25.5v-350h85q15 0 25.5 -10.5t10.5 -25.5v0z" />
<glyph glyph-name="infocirlceo" unicode="&#xe629;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171
q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM630 190h-85v350q0 15 -10.5 25.5t-25.5 10.5v0h-36h-60q-15 0 -25.5 -10.5t-10.5 -25.5v0q0 -14 10.5 -25t25.5 -11h60v-314h-85q-15 0 -25.5 -10.5
t-10.5 -25.5v0q0 -15 10.5 -25.5t25.5 -10.5h85h72h85q15 0 25.5 10.5t10.5 25.5v0q0 15 -10.5 25.5t-25.5 10.5zM509 676zM473 675.5q0 14.5 10.5 25.5t25.5 11t25.5 -11t10.5 -25.5t-10.5 -25t-25.5 -10.5t-25.5 10.5t-10.5 25z" />
<glyph glyph-name="info" unicode="&#xe62a;"
d="M660 136h-85v404q0 15 -10.5 25.5t-25.5 10.5v0h-36h-60q-15 0 -25.5 -10.5t-10.5 -25.5v0q0 -14 10.5 -25t25.5 -11h60v-368h-85q-15 0 -25.5 -10.5t-10.5 -25.5v0q0 -15 10.5 -25.5t25.5 -10.5h85h72h85q15 0 25.5 10.5t10.5 25.5v0q0 15 -10.5 25.5t-25.5 10.5z
M539 676zM503 675.5q0 14.5 10.5 25.5t25.5 11t25.5 -11t10.5 -25.5t-10.5 -25t-25.5 -10.5t-25.5 10.5t-10.5 25z" />
<glyph glyph-name="exclamation" unicode="&#xe62b;"
d="M512 193q-17 0 -28.5 11.5t-11.5 28.5v495q0 17 11.5 28.5t28.5 11.5t28.5 -11.5t11.5 -28.5v-495q0 -17 -11.5 -28.5t-28.5 -11.5zM512 83zM467 83q0 19 13 32t32 13t32 -13t13 -32t-13 -32t-32 -13t-32 13t-13 32z" />
<glyph glyph-name="exclamationcircle" unicode="&#xe62c;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM472 665q0 17 11.5 28.5t28.5 11.5t28.5 -11.5t11.5 -28.5v-369q0 -17 -11.5 -28.5t-28.5 -11.5t-28.5 11.5
t-11.5 28.5v369zM512 102q-19 0 -32 13t-13 32t13 32t32 13t32 -13t13 -32t-13 -32t-32 -13z" />
<glyph glyph-name="exclamationcircleo" unicode="&#xe62d;"
d="M512 824q90 0 171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140t-140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171q34 79 95 140t140 94q81 35 171 35zM512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257
t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5v0zM512 256q-17 0 -28.5 11.5t-11.5 28.5v369q0 17 11.5 28.5t28.5 11.5t28.5 -11.5t11.5 -28.5v-369q0 -17 -11.5 -28.5t-28.5 -11.5zM512 147zM467 147q0 19 13 32
t32 13t32 -13t13 -32t-13 -32t-32 -13t-32 13t-13 32z" />
<glyph glyph-name="closecircle" unicode="&#xe62e;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM717 229q11 -10 11 -25t-10.5 -25.5t-25.5 -10.5t-26 10l-154 155l-154 -155q-11 -10 -26 -10t-25.5 10.5
t-10.5 25.5t11 25l154 155l-154 155q-11 10 -11 25t10.5 25.5t25.5 10.5t26 -10l154 -155l154 155q11 10 26 10t25.5 -10.5t10.5 -25t-11 -25.5l-154 -155z" />
<glyph glyph-name="closecircleo" unicode="&#xe62f;"
d="M717.5 589.5q-10.5 10.5 -25.5 10.5t-26 -10l-154 -155l-154 155q-11 10 -26 10t-25.5 -10.5t-10.5 -25.5t11 -25l154 -155l-154 -155q-11 -10 -11 -25t10.5 -25.5t25.5 -10.5t26 10l154 155l154 -155q11 -10 26 -10t25.5 10.5t10.5 25t-11 25.5l-154 155l154 155
q11 10 11 25t-10.5 25.5zM512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140
q-35 81 -35 171t34 171q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140z" />
<glyph glyph-name="checkcircle" unicode="&#xe630;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM772 540l-359 -361v0l-1 -1q-3 -3 -8 -6q-8 -5 -18 -5q-21 0 -31 18l-109 191q-8 13 -4 27t17 21.5t27.5 3.5
t21.5 -17l86 -149l327 328q11 11 26 11t25.5 -10.5t10.5 -25.5t-11 -25z" />
<glyph glyph-name="checkcircleo" unicode="&#xe631;"
d="M721 590l-327 -328l-86 149q-7 13 -21.5 17t-27.5 -3.5t-17 -21.5t4 -27l109 -191q10 -18 31 -18q10 0 18 5q5 3 8 6l1 1l359 360q11 11 11 26t-10.5 25.5t-25.5 10.5t-26 -11zM512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5
t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171
q-34 -79 -95 -140z" />
<glyph glyph-name="check" unicode="&#xe632;"
d="M328 96q-3 0 -5 1q-20 2 -30 20l-159 278q-8 15 -4 31t18.5 24t30.5 3.5t25 -18.5l133 -233l491 492q11 12 28 12t28.5 -11.5t11.5 -28.5t-12 -28l-526 -528l-2 -2q-11 -12 -28 -12z" />
<glyph glyph-name="close" unicode="&#xe633;"
d="M568 381l254 255q12 11 12 27.5t-11.5 28t-28 11.5t-27.5 -12l-255 -254l-255 254q-11 12 -27.5 12t-28 -11.5t-11.5 -28t12 -27.5l254 -255l-254 -255q-12 -11 -12 -27.5t11.5 -28t28 -11.5t27.5 12l255 255l255 -255q11 -12 27.5 -12t28 11.5t11.5 28t-12 27.5z" />
<glyph glyph-name="customerservice" unicode="&#xe634;"
d="M838 579q-6 26 -18 52q-25 59 -72 105q-46 45 -107 70q-63 26 -131 26t-131 -26q-60 -25 -107 -70.5t-72 -104.5q-11 -25 -18 -53q-24 -8 -45 -23q-22 -16 -38 -38q-35 -47 -35 -106q0 -72 51 -123q37 -37 87 -48q4 -1 8 -1q15 0 25 11q10 10 10 25l-1 227q0 107 77 183
q78 76 188.5 76t188.5 -76t78 -183v-236q0 -107 -78 -183q-31 -31 -71 -50q1 11 1 22q-1 46 -34 79t-79 35h-3q-48 0 -82 -34.5t-34 -82.5q0 -47 33.5 -81t80.5 -35v0h2v0h2h1v0v0q66 1 126 26t107 70.5t73 104.5q22 53 26 111q35 13 62 40q51 51 51 123q0 58 -34 104.5
t-88 63.5zM82 355q1 -3 3 -7q-2 5 -3 7zM92 333q2 -4 5 -9q-4 6 -5 9zM160 332l-3 3l3 -3l2 -2zM173 332q-4 3 -7 6q-31 31 -31 73q0 29 14 53q9 17 24 29v-161zM181 316q-1 0 -2 0.5t-1 1.5q1 -1 3 -2v0zM188 571v0q1 5 4 13q-2 -7 -4 -13zM204 248l-10 2q9 -2 10 -2h2h-2z
M210 248h-1h1v0zM237 274v1l-1 227l1 -227v-1zM307 756q7 5 10 7q-6 -4 -10 -7zM382 799q-30 -13 -58 -31q28 18 58 31q1 0 2.5 0.5t2.5 0.5q-3 0 -5 -1zM442 761l2 0.5t3 0.5h2zM742 730q-45 44 -104 69q-1 0 -2.5 0.5t-2.5 0.5q1 0 2.5 -0.5t2.5 -0.5q59 -25 104 -69l6 -6
zM754 718q4 -4 9 -10q-5 6 -9 10zM765 706q2 -3 8 -10q-4 4 -8 10zM404 52v0v3v-3zM512 161h3h-3v0zM544.5 21q-12.5 -13 -30.5 -14h-2q-19 0 -32 13.5t-13 31.5q0 19 13 32.5t32 13.5t32 -13.5t13 -32t-12.5 -31.5zM565 44v8v3v-1v-2v-8zM615 19l1 3l-1 -3q1 1 2.5 1.5
t2.5 0.5q-2 -1 -5 -2zM742 38l-6 -6q1 1 3.5 3t2.5 3l6 6q-3 -4 -6 -6zM784 266v-14v14v236v6v-3v-3v-236zM813 140q-3 -7 -7 -14q4 7 7 14q0 1 1 2.5t1 2.5q-1 -3 -2 -5zM813 628q-3 7 -7 14q4 -7 7 -14q1 -2 3 -7q-1 3 -3 7zM831 572q0 3 -1 7q0 -1 0.5 -3t0.5 -4v0z
M839 510q7 -3 12 -7q-5 4 -12 7v0zM864 332q-11 -11 -25 -18v0q14 7 25 18q0 1 1 1q0 1 1 1q-1 0 -1 -1q-1 0 -1 -1zM858 338q-5 -5 -11 -10v168q17 -13 27 -30q15 -25 15 -55q0 -42 -31 -73zM945 460l-2 6q1 -2 2 -6zM935 485q1 -1 3 -6q-1 1 -1.5 3.5t-1.5 2.5zM943 356
q0 2 2 7q-1 -2 -2 -7z" />
<glyph glyph-name="creditcard" unicode="&#xe635;"
d="M952 766h-880q-30 0 -51 -21t-21 -51v-120v-96v-405q0 -29 21 -50.5t51 -21.5h880q30 0 51 21.5t21 50.5v405v96v120q0 30 -21 51t-51 21zM952 73h-880v405h880v-405zM72 574v120h880v-120h-880zM237 192v0q18 0 31 13t13 31v0q0 18 -13 31t-31 13v0q-18 0 -31 -13
t-13 -31v0q0 -18 13 -31t31 -13zM404 192v0q18 0 31 13t13 31v0q0 18 -13 31t-31 13v0q-19 0 -31.5 -13t-12.5 -31v0q0 -18 12.5 -31t31.5 -13z" />
<glyph glyph-name="codesquareo" unicode="&#xe636;"
d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM888 7h-752v753h752v-753zM203.5 357.5q10.5 -10.5 25.5 -10.5t25 11l140 141q11 10 11 25t-10 26l-141 142q-10 10 -25 10t-25.5 -10.5
t-10.5 -25t10 -25.5l115 -117l-115 -115q-10 -11 -10 -26t10.5 -25.5zM383 384q0 -15 10.5 -25.5t24.5 -10.5l199 -1h1q14 0 25 10.5t11 25.5t-11 25.5t-25 10.5l-199 1v0q-15 0 -25.5 -10.5t-10.5 -25.5z" />
<glyph glyph-name="book" unicode="&#xe637;"
d="M822 832h-259h-72h-121h-72h-94q-29 0 -50.5 -21t-21.5 -51v-753q0 -29 21.5 -50.5t50.5 -21.5h619q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM491 760v-209l-9 8l-33 34q-8 7 -18 7t-17 -7l-44 -44v211h121zM298 760v-277q0 -15 10 -25t25 -10v0
q37 0 63 25l35 35l35 -34q25 -25 60 -26h1q15 0 25.5 10t10.5 25v277h260v-624h-618v624h93zM204 7v57h618v-57h-618z" />
<glyph glyph-name="barschart" unicode="&#xe638;"
d="M203 730v-696q0 -15 -10.5 -25.5t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v696q0 15 10.5 25.5t25.5 10.5v0q15 0 25.5 -10.5t10.5 -25.5zM167 70h694q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5h-694q-15 0 -25.5 10.5t-10.5 25.5v0
q0 15 10.5 25.5t25.5 10.5zM394 537v-371q0 -15 -10.5 -25.5t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v371q0 15 10.5 25.5t25.5 10.5v0q15 0 25.5 -10.5t10.5 -25.5zM777 667v-501q0 -15 -10.5 -25.5t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v501q0 15 10.5 25.5
t25.5 10.5v0q15 0 25.5 -10.5t10.5 -25.5zM585 411v-245q0 -15 -10.5 -25.5t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v245q0 15 10.5 25.5t25.5 10.5v0q14 0 25 -10.5t11 -25.5z" />
<glyph glyph-name="bars" unicode="&#xe639;"
d="M187 639zM124 639q0 26 18.5 44.5t44.5 18.5t44.5 -18.5t18.5 -44.5t-18.5 -44.5t-44.5 -18.5t-44.5 18.5t-18.5 44.5zM856 610h-498q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h498q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5zM187 384
zM124 384q0 26 18.5 44.5t44.5 18.5t44.5 -18.5t18.5 -44.5t-18.5 -44.5t-44.5 -18.5t-44.5 18.5t-18.5 44.5zM856 355h-498q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h498q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5zM187 129zM124 129
q0 26 18.5 44.5t44.5 18.5t44.5 -18.5t18.5 -44.5t-18.5 -44.5t-44.5 -18.5t-44.5 18.5t-18.5 44.5zM856 100h-498q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h498q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5z" />
<glyph glyph-name="question" unicode="&#xe63a;"
d="M644 633q-61 64 -152 64q-84 0 -143.5 -59.5t-59.5 -143.5q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5q0 54 38.5 92.5t92.5 38.5h1q59 0 99 -42q35 -37 32 -85q-1 -18 -4 -29t-21 -37.5t-54 -62.5q-43 -43 -66.5 -77t-27.5 -72q-2 -15 7.5 -26.5t24.5 -12.5h4
q14 0 24 9t12 23q3 35 73 105q61 61 79.5 98t20.5 78q5 79 -52 139zM486 80zM443 80q0 18 12.5 30.5t30.5 12.5t30.5 -12.5t12.5 -30.5t-12.5 -30.5t-30.5 -12.5t-30.5 12.5t-12.5 30.5z" />
<glyph glyph-name="questioncircle" unicode="&#xe63b;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM505.5 83q-17.5 0 -30.5 13t-13 31t13 30.5t30.5 12.5t30.5 -12.5t13 -30.5t-13 -31t-30.5 -13zM691 505
q-2 -38 -19.5 -70.5t-67.5 -83.5q-59 -58 -61 -87q-2 -13 -12 -22.5t-24 -9.5h-4q-15 2 -24.5 13.5t-7.5 26.5q3 33 23.5 63t58.5 67q30 30 45.5 52t18 31t2.5 24q2 39 -26 69q-33 34 -81 34v0q-45 0 -76.5 -31.5t-31.5 -75.5q0 -15 -10.5 -25.5t-25.5 -10.5t-25.5 10.5
t-10.5 25.5q0 74 52.5 126.5t126.5 52.5q80 1 134 -56q50 -53 46 -123z" />
<glyph glyph-name="questioncircleo" unicode="&#xe63c;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171
q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM546 372zM507 232h-4q-15 2 -24.5 13.5t-7.5 26.5q3 33 23.5 63t58.5 67q30 30 45.5 52t18 31.5t2.5 23.5q2 39 -26 69q-33 35 -81 35v0q-45 0 -76.5 -32
t-31.5 -76q0 -15 -10.5 -25.5t-25.5 -10.5t-25.5 10.5t-10.5 25.5q0 74 52.5 126.5t126.5 53.5q80 0 134 -57q50 -53 46 -123q-2 -37 -19.5 -70t-67.5 -84q-59 -58 -61 -86q-2 -14 -12 -23.5t-24 -9.5zM506 127zM462 127q0 18 13 30.5t30.5 12.5t30.5 -12.5t13 -30.5
t-13 -30.5t-30.5 -12.5t-30.5 12.5t-13 30.5z" />
<glyph glyph-name="pause" unicode="&#xe63d;"
d="M326 704v0q-15 0 -25.5 -11t-10.5 -25v-568q0 -14 10.5 -25t25.5 -11v0q15 0 25 11t9 25v568q1 14 -9 25t-25 11zM698 704v0q-14 0 -25 -11t-11 -25v-568q0 -14 11 -25t25 -11v0q15 0 25.5 11t10.5 25v568q0 14 -10.5 25t-25.5 11z" />
<glyph glyph-name="pausecircle" unicode="&#xe63e;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM393 228q0 -15 -10.5 -25.5t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v312q0 15 10.5 25.5t25.5 10.5v0
q15 0 25.5 -10.5t10.5 -25.5v-312zM703 228q0 -15 -10.5 -25.5t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v312q0 15 10.5 25.5t25.5 10.5v0q15 0 25.5 -10.5t10.5 -25.5v-312z" />
<glyph glyph-name="pausecircleo" unicode="&#xe63f;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171
q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM357 576v0q-15 0 -25.5 -10.5t-10.5 -25.5v-312q0 -15 10.5 -25.5t25.5 -10.5v0q15 0 25.5 10.5t10.5 25.5v312q0 15 -10.5 25.5t-25.5 10.5zM667 576v0
q-15 0 -25.5 -10.5t-10.5 -25.5v-312q0 -15 10.5 -25.5t25.5 -10.5v0q15 0 25.5 10.5t10.5 25.5v312q0 15 -10.5 25.5t-25.5 10.5z" />
<glyph glyph-name="clockcircle" unicode="&#xe640;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM769 356q0 -15 -10.5 -25.5t-25.5 -10.5h-185v0q-30 0 -51 21t-21 51v0v240q0 15 10.5 25.5t25.5 10.5v0
q15 0 25.5 -10.5t10.5 -25.5v-240h185q15 0 25.5 -10.5t10.5 -25.5v0z" />
<glyph glyph-name="clockcircleo" unicode="&#xe641;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171
q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM733 392h-185v240q0 15 -10.5 25.5t-25.5 10.5v0q-15 0 -25.5 -10.5t-10.5 -25.5v-240v0q0 -30 21 -51t51 -21v0h185q15 0 25.5 10.5t10.5 25.5v0
q0 15 -10.5 25.5t-25.5 10.5z" />
<glyph glyph-name="swap" unicode="&#xe642;"
d="M194 481q-1 0 -1 0.5t-0.5 0.5h-0.5h-0.5h-0.5h-0.5h-0.5v0h-1h-0.5h-0.5v0l-0.5 0.5l-0.5 0.5h-0.5h-0.5h-0.5h-0.5h-1l-1 1v0v0h-0.5h-0.5l-0.5 0.5l-0.5 0.5h-0.5h-0.5h-1v1h-0.5h-0.5l-0.5 0.5l-0.5 0.5h-0.5h-0.5v0.5v0.5h-1l-1 1v0l-0.5 0.5l-0.5 0.5h-1q-1 2 -2 3
q-1 0 -1 0.5v0.5v0l-1 1v1h-1v1v0l-0.5 0.5l-0.5 0.5v0v0.5t-0.5 0.5h-0.5v1l-0.5 0.5l-0.5 0.5v1v0v0.5t-0.5 0.5h-0.5v0.5v0.5q0 1 -0.5 1t-0.5 0.5v1v0.5v0v0v0.5v0.5v0.5v0.5l-1 1v0.5v0.5v0.5v0.5v0v0.5v0.5v1v0v1v4v1v0.5v0.5v0.5v0.5v0.5v0.5v0.5v0.5v0l1 1v0.5v0.5
v0.5v0.5v0v0.5v0.5v0q1 1 1 1.5v0.5v0.5v0.5l0.5 0.5l0.5 0.5v0v0.5v0.5l0.5 0.5l0.5 0.5v0.5t0.5 1l0.5 0.5v0v0v0.5t0.5 0.5t0.5 0.5v0.5l0.5 0.5l0.5 0.5q0 1 1 1v0v1h1l0.5 0.5l0.5 0.5l178 178q10 11 25 11t25 -11v0q11 -11 11 -25.5t-11 -25.5l-116 -116h545
q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5h-631v0h-2h-0.5h-0.5zM830 287q1 0 1 -0.5t0.5 -0.5h0.5h0.5h0.5h0.5h0.5v0v0h2v0v0l0.5 -0.5l0.5 -0.5h0.5h0.5h0.5h0.5h1v-1h1v0h0.5h0.5l0.5 -0.5l0.5 -0.5h0.5h0.5h1v-1h0.5h0.5l0.5 -0.5l0.5 -0.5h0.5h0.5
v-0.5v-0.5h1l1 -1l0.5 -0.5l0.5 -0.5v0h1q1 -2 2 -3q1 0 1 -0.5v-0.5v0l1 -1v-1h1v-1h0.5t0.5 -0.5v-0.5v0v-0.5t0.5 -0.5t0.5 -0.5v-0.5l0.5 -0.5l0.5 -0.5v-0.5v-0.5v-0.5t0.5 -0.5h0.5v-0.5v-0.5v-1l0.5 -0.5t0.5 -1v-0.5v0v-0.5v-0.5v0v-0.5v-0.5l1 -1v-0.5v-0.5v-0.5
v-0.5v0v-0.5v-0.5v-1v0v-1v-4v-1v-0.5v-1v-0.5v0v-0.5v-0.5v-0.5v-0.5v0l-1 -1v-0.5v-0.5v-0.5v-0.5v0v-0.5v-0.5l-1 -1v-0.5v-0.5v-0.5v-0.5l-0.5 -0.5l-0.5 -0.5v0v-0.5v-0.5l-0.5 -0.5l-0.5 -0.5v-0.5t-0.5 -1l-0.5 -0.5v0v0v-0.5t-0.5 -0.5t-0.5 -0.5v-0.5l-1 -1v0
q0 -1 -0.5 -1h-0.5v-1h-1l-0.5 -0.5t-0.5 -1.5l-177 -177q-11 -11 -26 -11t-25 11v0q-11 10 -11 25t11 26l116 116h-545q-14 0 -25 10.5t-11 25.5v0q0 15 11 25.5t25 10.5h632v0h1h1z" />
<glyph glyph-name="swapleft" unicode="&#xe643;"
d="M164 320h-1l-0.5 0.5l-0.5 0.5h-0.5h-0.5h-0.5h-0.5v0h-1h-1v0v0l-0.5 0.5l-0.5 0.5h-0.5h-0.5h-0.5h-0.5h-1l-1 1v0v0h-0.5h-0.5l-0.5 0.5l-0.5 0.5h-0.5h-0.5h-1v1h-0.5h-0.5l-0.5 0.5l-0.5 0.5h-0.5h-0.5v0.5v0.5h-1l-1 1v0l-0.5 0.5l-0.5 0.5h-1q-1 2 -2 3
q-1 0 -1 0.5v0.5v0l-1 1v1h-1v1v0l-0.5 0.5l-0.5 0.5v0v0.5t-0.5 0.5h-0.5v1l-0.5 0.5l-0.5 0.5v1v0v0.5t-0.5 0.5h-0.5v0.5v0.5q0 1 -0.5 1t-0.5 0.5v1v0.5v0v0.5v0.5v0v0.5v0.5l-1 1v0.5v0.5v0.5v0.5v0v0.5v0.5v1v1v0v4v1v0.5v0.5v0.5v0.5v0.5v0.5v0.5v0.5v0l1 1v0.5v0.5
v0.5v0.5v0v0.5v0.5v1q1 0 1 0.5v0.5v0.5v0.5l0.5 0.5l0.5 0.5v0v1v0l0.5 0.5l0.5 0.5v1l0.5 0.5l0.5 0.5v0v0v0.5t0.5 0.5t0.5 0.5v0.5l0.5 0.5l0.5 0.5q0 1 0.5 1h0.5v1h1l0.5 0.5t0.5 1.5l178 177q10 11 25 11t25 -11v0q11 -11 11 -25.5t-11 -25.5l-116 -116h545
q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5h-631v0h-2h-1z" />
<glyph glyph-name="swapright" unicode="&#xe644;"
d="M830 320h1l0.5 0.5l0.5 0.5h0.5h0.5h0.5h0.5v0v0h2v0v0l0.5 0.5l0.5 0.5h0.5h0.5h0.5h0.5h1v1h1v0h0.5h0.5l0.5 0.5l0.5 0.5h0.5h0.5h1v1h0.5h0.5l0.5 0.5l0.5 0.5h0.5h0.5v0.5v0.5h1l1 1v0.5t0.5 0.5h0.5h1q1 2 2 3q1 0 1 0.5v0.5v0l1 1v1h1v1h0.5t0.5 0.5v0.5v0v0.5
t0.5 0.5t0.5 0.5v0.5l0.5 0.5l0.5 0.5v0.5v0.5v0.5t0.5 0.5h0.5v0.5v0.5v1l0.5 0.5t0.5 1v0.5v0v0v0.5v0.5v0.5v0.5l1 1v0.5v0.5v0.5v0.5v0v0.5v0.5v1v1v0v4v1v0.5v0.5v0.5v0.5v0.5v0.5v0.5v0.5v0l-1 1v0.5v0.5v0.5v0.5v0v0.5v0.5l-1 1v0.5v0.5v0.5v0.5l-0.5 0.5l-0.5 0.5v0
v0.5v0.5l-0.5 0.5l-0.5 0.5v0.5t-0.5 1l-0.5 0.5v0v0l-0.5 0.5l-0.5 0.5v0.5v0.5l-0.5 0.5l-0.5 0.5q0 1 -1 1v0l-0.5 0.5l-0.5 0.5l-0.5 0.5t-0.5 1.5l-177 177q-11 11 -26 11t-25 -11v0q-11 -10 -11 -25t11 -26l116 -116h-545q-14 0 -25 -10.5t-11 -25.5v0q0 -15 11 -25.5
t25 -10.5h632v0h1h0.5h0.5z" />
<glyph glyph-name="plussquareo" unicode="&#xe645;"
d="M888 760v0v0v-753v0h-752v0v753v0h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0zM732 420h-184v183q0 15 -10.5 25.5t-25.5 10.5v0q-14 0 -25 -10.5t-11 -25.5v-183h-184
q-15 0 -25.5 -11t-10.5 -25v0q0 -15 10.5 -25.5t25.5 -10.5h184v-183q0 -15 11 -25.5t25 -10.5v0q15 0 25.5 10.5t10.5 25.5v183h184q15 0 25.5 10.5t10.5 25.5v0q0 14 -10.5 25t-25.5 11z" />
<glyph glyph-name="frown" unicode="&#xe646;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM254 454q-25 0 -42.5 17.5t-17.5 42t17.5 42.5t42.5 18t42.5 -18t17.5 -42.5t-17.5 -42t-42.5 -17.5zM640 130
q-15 0 -25.5 11t-10.5 25q0 39 -27 66t-65 27t-65 -27t-27 -66q0 -14 -10.5 -25t-25.5 -11t-25.5 11t-10.5 25q0 68 48 116.5t116 48.5t116 -48.5t48 -116.5q0 -14 -10.5 -25t-25.5 -11zM769.5 454q-24.5 0 -42 17.5t-17.5 42t17.5 42.5t42 18t42.5 -18t18 -42.5t-18 -42
t-42.5 -17.5z" />
<glyph glyph-name="menufold" unicode="&#xe658;"
d="M97 695h828q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-828q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5zM923 450h-565q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h565q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM925 72h-825
q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h825q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM195 281q11 -10 25 -10q15 0 26 11q10 10 10 25t-10 25l-96 94l94 88q11 11 11.5 26t-10 25.5t-25.5 11t-25 -9.5l-121 -114q-12 -11 -12 -26t11 -26z" />
<glyph glyph-name="mail" unicode="&#xe659;"
d="M886 768h-753q-30 0 -51 -21t-21 -51v-626q0 -30 21 -51t51 -21h753q30 0 51 21t21 51v626q0 30 -21 51t-51 21zM809 696l-268 -224l-2 -1l-1 -2q-11 -11 -26 -11h-1q-15 0 -25 11l-2 1l-274 226h599zM886 70h-753v0v597l303 -250q31 -31 76 -31v0q45 0 76 32l298 249
v-597v0z" />
<glyph glyph-name="link" unicode="&#xe65b;"
d="M542 230l-179 -179q-39 -38 -93 -38t-92 38q-39 39 -39 93t39 93l178 179q11 10 11 25t-10.5 25.5t-25.5 10.5t-25 -11l-179 -178q-60 -60 -60 -144t59.5 -143.5t143.5 -59.5t144 59l179 179q10 11 10 26t-10.5 25.5t-25.5 10.5t-25 -11zM899.5 773.5
q-59.5 59.5 -143.5 59.5t-144 -60l-179 -179q-10 -10 -10 -25t10.5 -25.5t25.5 -10.5t25 10l179 179q39 39 93 39t92.5 -38.5t38.5 -93t-39 -92.5l-178 -179q-11 -10 -11 -25t10.5 -25.5t25.5 -10.5t26 10l179 179q59 60 59 144t-59.5 143.5zM486 308l102 102q11 10 11 25
t-10.5 25.5t-25.5 10.5t-25 -11l-102 -102q-11 -10 -11 -25t10.5 -25.5t25.5 -10.5t25 11z" />
<glyph glyph-name="areachart" unicode="&#xe65c;"
d="M923 -64h-824q-15 0 -25.5 10.5t-10.5 25.5v825q0 15 10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5v-789h788q15 0 25.5 -10.5t10.5 -25.5t-10.5 -25.5t-25.5 -10.5zM192 96l117 209q4 7 12 9.5t16 -0.5l111 -52l118 171q11 15 27 7l110 -56l160 251q7 11 19.5 7.5
t12.5 -16.5v-520q0 -16 -11.5 -27.5t-27.5 -11.5h-646q-11 0 -17 9.5t-1 19.5z" />
<glyph glyph-name="linechart" unicode="&#xe65d;"
d="M923 -64h-824q-15 0 -25.5 10.5t-10.5 25.5v825q0 15 10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5v-789h788q15 0 25.5 -10.5t10.5 -25.5t-10.5 -25.5t-25.5 -10.5zM385 153q-19 0 -30 16l-157 250q-8 13 -5 27.5t15.5 22.5t27 5t22.5 -15l112 -182l46 177q4 16 19 23
l182 88q13 6 26 2.5t21 -15.5l91 -148l134 403q5 14 18 21t27 2t21 -18t2 -27l-158 -477q-7 -22 -30 -24.5t-35 16.5l-115 186l-137 -66l-62 -240q-6 -23 -29 -26q-3 -1 -6 -1z" />
<glyph glyph-name="home" unicode="&#xe65e;"
d="M932 454l-372 358q-20 18 -48 18t-48 -18l-372 -358q-11 -10 -12 -25t9 -26v0q10 -11 25 -12t26 9l372 358l372 -358q11 -10 26 -9t25 12v0q10 11 9 26t-12 25zM833 321v0q-15 0 -25.5 -10.5t-10.5 -25.5v-277h-143v240q0 30 -21 51t-51 21h-140q-30 0 -51 -21t-21 -51
v-240h-143v277q0 15 -10.5 25.5t-25.5 10.5v0q-15 0 -25.5 -10.5t-10.5 -25.5v-277q0 -30 21 -51t51 -21h570q30 0 51 21t21 51v277q0 15 -10.5 25.5t-25.5 10.5zM442 248h140v-240h-140v240z" />
<glyph glyph-name="laptop" unicode="&#xe65f;"
d="M887 760v0v0v-559v0l-752 -1v0v560v0h752zM887 832h-752q-30 0 -51 -21t-21 -51v-559q0 -30 21 -51t51 -21h752q30 0 51 21t21 51v559q0 30 -21 51t-51 21v0zM923 -16h-824q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h824q15 0 25.5 -10.5t10.5 -25.5v0
q0 -15 -10.5 -25.5t-25.5 -10.5z" />
<glyph glyph-name="star" unicode="&#xe660;"
d="M956 497.5q-8 23.5 -26.5 39t-42.5 19.5l-205 31l-92 195q-11 24 -33 37q-21 13 -45 13t-45 -13q-22 -13 -33 -37l-92 -195l-205 -31q-24 -4 -42.5 -19.5t-26.5 -39t-2.5 -47t22.5 -41.5l151 -154l-36 -218q-6 -40 20 -70.5t66 -30.5q22 0 42 11l181 100l181 -100
q20 -11 42 -11q40 0 66 30.5t20 70.5l-36 218l151 154q17 18 22.5 41.5t-2.5 47z" />
<glyph glyph-name="staro" unicode="&#xe661;"
d="M512 760q9 0 13 -9l105 -222q3 -7 11 -9l235 -35q9 -2 12 -10.5t-4 -14.5l-171 -176q-5 -5 -4 -12l41 -247q1 -7 -3.5 -12t-11.5 -5q-4 0 -7 2l-209 115q-3 2 -7 2t-7 -2l-209 -115q-3 -2 -7 -2q-7 0 -11.5 5t-3.5 12l41 247q1 7 -4 12l-171 176q-7 6 -4 14.5t12 9.5
l235 36q8 1 11 9l105 222q4 9 13 9zM512 832q-24 0 -45 -13q-22 -13 -33 -37l-92 -195l-205 -31q-24 -4 -42.5 -19.5t-26.5 -39t-2.5 -47t22.5 -41.5l151 -154l-36 -218q-6 -40 20 -70.5t66 -30.5q22 0 42 11l181 100l181 -100q20 -11 42 -11q40 0 66 30.5t20 70.5l-36 218
l151 154q17 18 22.5 41.5t-2.5 47t-26.5 39t-42.5 19.5l-205 31l-92 195q-11 24 -33 37q-21 13 -45 13v0z" />
<glyph glyph-name="filter" unicode="&#xe663;"
d="M890.5 719.5q-9.5 23.5 -30.5 37t-46 13.5h-602q-25 0 -46 -13.5t-30.5 -37t-4.5 -48t22 -42.5l273 -263v-262q0 -15 11 -25l125 -129q10 -11 26 -11q6 0 13 2q23 9 23 34v393l248 261q18 18 23 42.5t-4.5 48zM821 680l-259 -272q-10 -10 -10 -25v-322l-54 58v262
q0 15 -10 25l-284 274q-5 5 -2 11.5t10 6.5h602q7 0 9.5 -6.5t-2.5 -11.5z" />
<glyph glyph-name="meho" unicode="&#xe666;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM254 454q-25 0 -42.5 17.5t-17.5 42t17.5 42.5t42.5 18t42.5 -18t17.5 -42.5t-17.5 -42t-42.5 -17.5zM643 118
h-264q-15 0 -25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5h264q15 0 25.5 -10.5t10.5 -25.5t-10.5 -25.5t-25.5 -10.5zM769.5 454q-24.5 0 -42 17.5t-17.5 42t17.5 42.5t42 18t42.5 -18t18 -42.5t-18 -42t-42.5 -17.5z" />
<glyph glyph-name="meh" unicode="&#xe667;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171
q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM254 514zM194 513.5q0 24.5 17.5 42.5t42.5 18t42.5 -18t17.5 -42.5t-17.5 -42t-42.5 -17.5t-42.5 17.5t-17.5 42zM770 514zM710 513.5q0 24.5 17.5 42.5
t42 18t42.5 -18t18 -42.5t-18 -42t-42.5 -17.5t-42 17.5t-17.5 42zM643 190h-264q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h264q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5z" />
<glyph glyph-name="shoppingcart" unicode="&#xe668;"
d="M923 194h-596l30 61l497 1q13 0 22.5 8t11.5 20l69 386q3 16 -7.5 28t-26.5 12l-632 3l-5 25q-3 12 -13 20t-22 8h-155q-14 0 -24.5 -10.5t-10.5 -25t10.5 -25t24.5 -10.5h126l24 -112l58 -281l-75 -122q-13 -18 -3 -37t32 -19h63q-21 -28 -21 -62q0 -43 30 -73t72.5 -30
t72.5 30t30 73q0 34 -20 62h161q-21 -28 -21 -62q0 -43 30 -73t72.5 -30t72.5 30t30 73q0 34 -20 62h113q15 0 25 10t10 24.5t-10 25t-25 10.5zM306 643l576 -2l-57 -316l-452 -1zM403 30q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5t22 -9.5t9 -22.5t-9 -22.5t-22 -9.5z
M728 30q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5t22 -9.5t9 -22.5t-9 -22.5t-22 -9.5z" />
<glyph glyph-name="save" unicode="&#xe669;"
d="M650 768h-450q-30 0 -51 -21t-21 -51v-623q0 -30 21 -51t51 -21h623q30 0 51 21t21 51v450zM329 696h217v-206q0 -15 -10.5 -25.5t-25.5 -10.5h-145q-15 0 -25.5 10.5t-10.5 25.5v206zM823 73h-623v623h57v-206q0 -45 31.5 -76.5t76.5 -31.5h145q44 0 76 32t32 76v206h2
l203 -203v-420v0zM469 526q15 0 25.5 10.5t10.5 25.5v43q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-43q0 -15 10.5 -25.5t25.5 -10.5z" />
<glyph glyph-name="user" unicode="&#xe66a;"
d="M819 103q-25 60 -71 106t-106 71q-20 9 -42 15q61 20 107 66q81 81 81 195t-81 194.5t-195 80.5t-194.5 -80.5t-80.5 -194.5t80 -195q46 -46 107 -66q-23 -6 -42 -15q-60 -25 -106 -71t-71 -106q-26 -62 -26 -130q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5
q0 108 76.5 185t185 77t185 -76.5t76.5 -185.5q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5q-1 68 -27 130zM309 556q0 84 59.5 143.5t143.5 59.5t143.5 -59.5t59.5 -143.5t-59.5 -144t-143.5 -60t-143.5 60t-59.5 144z" />
<glyph glyph-name="videocamera" unicode="&#xe66b;"
d="M1010 573q-11 10 -26 10q-9 0 -18 -5l-126 -67v188q0 29 -20.5 50t-50.5 21h-698q-29 0 -50 -21t-21 -50v-630q0 -29 21 -50t50 -21h698q30 0 50.5 21t20.5 50v203l123 -79q10 -6 22 -6q13 0 25 9q14 12 14 31v316q0 18 -14 30zM945 477v-178l-103 66v57zM761 667v-566
q0 -10 -6.5 -17t-16.5 -7h-636q-9 0 -16 7t-7 17v566q0 10 7 17t16 7h636q10 0 16.5 -7t6.5 -17z" />
<glyph glyph-name="totop" unicode="&#xe66c;"
d="M920 74h-816q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h816q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM365.5 576q14.5 0 25.5 10l85 85v-449q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v449l85 -85q10 -10 25 -10t25.5 10.5t10.5 25.5
t-10 25l-146 146q-11 11 -26 11t-25 -11l-147 -146q-10 -11 -10 -25.5t10.5 -25t25 -10.5z" />
<glyph glyph-name="team" unicode="&#xe66d;"
d="M839 409q-30 30 -67 47q44 23 72 64q35 51 35 113q0 84 -59 142.5t-142 58.5q-65 0 -117 -36q-45 -33 -67 -83q-60 64 -147 64q-84 0 -143 -59t-59 -142q0 -62 35 -113q28 -41 73 -65q-38 -17 -68 -47q-67 -67 -67 -161v-165q0 -37 26.5 -64t64.5 -27h276q27 0 49.5 15.5
t33.5 40.5h248q37 0 64 26.5t27 63.5v165q-1 95 -68 162zM586 725q38 38 92 38t92 -38t38 -91.5t-38 -92t-92 -38.5t-92 38t-38 92t38 92zM216 578q0 54 38 92t92 38t92 -38t38 -92t-38 -92t-92 -38t-92 38t-38 92zM504 27q0 -8 -6 -13.5t-14 -5.5h-276q-8 0 -13.5 5.5
t-5.5 13.5v165q0 65 46 111t111 46t112 -46l1 -1v-1q45 -46 45 -109v-165zM486 372q-21 17 -46 28q62 33 90 96q24 -25 54 -40q-38 -17 -68 -47q-17 -17 -30 -37zM835 82q0 -8 -5.5 -13.5t-13.5 -5.5h-241v129q0 69 -38 126q12 23 29 40q47 47 112 47t111 -46.5t46 -111.5
v-165z" />
<glyph glyph-name="sharealt" unicode="&#xe671;"
d="M814 233q-38 0 -70.5 -18t-53.5 -49l-236 168q6 24 6 48q0 39 -15 75l257 130q45 -51 112 -51q61 0 104.5 43.5t43.5 104.5t-43.5 104.5t-104.5 43.5t-104.5 -43.5t-43.5 -104.5q0 -17 4 -33l-264 -133q-59 62 -144 62q-82 0 -140 -58t-58 -140t58 -140t140 -58
q49 0 91.5 22.5t69.5 60.5l243 -172v-10q0 -61 43.5 -104.5t104.5 -43.5t104.5 43.5t43.5 104.5t-43.5 104.5t-104.5 43.5zM814 760q31 0 53.5 -22.5t22.5 -54t-22.5 -53.5t-53.5 -22t-53.5 22t-22.5 53.5t22.5 54t53.5 22.5zM262 256q-52 0 -89 37t-37 89t37 89t89 37
t89 -37t37 -89t-37 -89t-89 -37zM814 9q-31 0 -53.5 22t-22.5 53.5t22.5 54t53.5 22.5t53.5 -22.5t22.5 -54t-22.5 -53.5t-53.5 -22z" />
<glyph glyph-name="setting" unicode="&#xe672;"
d="M962 456l-4 24l-73 25q-10 30 -24 58l34 69l-14 19q-43 60 -102 103l-20 14l-69 -35q-28 14 -58 24l-24 73l-24 4q-39 6 -72 6t-72 -6l-24 -4l-25 -73q-30 -10 -57 -24l-69 35l-20 -15q-59 -43 -102 -102l-14 -20l34 -69q-14 -28 -24 -57l-73 -25l-4 -24q-6 -39 -6 -72
t6 -72l4 -24l73 -25q10 -30 24 -57l-34 -69l14 -20q22 -30 47 -55q23 -23 55 -47l20 -14l69 34q28 -14 57 -24l25 -73l24 -4q39 -6 72 -6t72 6l24 4l25 73q29 10 57 24l69 -35l20 15q32 23 55 47q24 23 47 55l14 20l-34 69q14 28 24 58l73 24l4 24q6 39 6 72t-6 72zM896 385
v-1q0 -19 -2 -42l-36 -11l-31 -11l-10 -32q-8 -27 -21 -52l-16 -29l32 -63q-14 -17 -28 -31v-1q-14 -14 -32 -27l-62 31l-29 -15q-26 -13 -54 -22l-31 -10l-10 -31l-12 -35q-21 -3 -42 -3q-19 0 -42 3l-11 35l-11 31l-31 10q-28 9 -53 22l-29 15l-30 -15l-33 -16
q-17 13 -31 28q-15 14 -28 31l31 62l-15 29q-14 27 -22 53l-10 32l-66 22q-3 21 -3 42q0 19 3 42l66 22l10 31q8 27 22 53l15 30l-15 29l-16 33q26 33 59 59l62 -31l30 15q25 14 53 22l31 10l10 31l12 36q23 2 42 2q20 0 42 -2l22 -67l31 -9q28 -9 54 -22l29 -16l62 32
q33 -27 60 -60l-32 -62l15 -29q14 -26 23 -53l9 -32l31 -10l36 -12q3 -22 2 -41zM512 558q-72 0 -123 -51t-51 -123t51 -123t123 -51t123 51t51 123t-51 123t-123 51zM584 312q-30 -30 -72 -30t-72 30t-30 72t30 72t72.5 30t72 -30t29.5 -72t-30 -72z" />
<glyph glyph-name="picture" unicode="&#xe674;"
d="M886 768h-752q-30 0 -51 -21.5t-21 -50.5v-626q0 -29 21 -50.5t51 -21.5h752q30 0 51 21.5t21 50.5v626q0 30 -21 51t-51 21zM886 70v0h-752v0v213l186 190l217 -270q9 -10 22.5 -11.5t24.5 5.5l161 109l141 -67v-169zM886 330l-118 48q-21 16 -42 2l-156 -105l-222 275
q-10 12 -26 12t-27 -11l-161 -165v310v0h752v0v-366zM696 622q-42 0 -71.5 -29.5t-29.5 -71.5t29.5 -71.5t71.5 -29.5t71.5 29.5t29.5 71.5t-29.5 71.5t-71.5 29.5zM696 492q-12 0 -20.5 8.5t-8.5 20.5t8.5 20.5t20.5 8.5t20.5 -8.5t8.5 -20.5t-8.5 -20.5t-20.5 -8.5z" />
<glyph glyph-name="phone" unicode="&#xe675;"
d="M914 733q-66 101 -128 101q-36 0 -64 -28q-48 -48 -77 -93q-44 -68 -29 -115q4 -15 17.5 -31t44.5 -47v0q32 -32 38 -41q10 -14 -19 -60q-27 -43 -99 -118q-61 -58 -99 -85q-48 -35 -71 -35q-5 0 -8 2q-9 7 -41 38q-32 32 -47.5 45t-30.5 17q-12 4 -25 4q-43 0 -100 -40
q-40 -27 -82 -70q-33 -32 -28 -73q6 -57 100 -119q78 -50 176 -50q101 0 210.5 53.5t206.5 151.5q68 68 117 144q48 76 70 153q49 170 -32 296zM878 457q-20 -67 -63 -135q-43 -69 -106 -132q-44 -44 -92 -80q-47 -34 -95 -58q-47 -22 -93 -34q-45 -12 -87 -12
q-77 0 -137 39q-35 23 -52 40q-16 16 -17 27q-1 7 8 15q39 39 72 62q39 27 60 27q2 0 3 -1q5 -2 12 -9q11 -9 38 -35q35 -36 49 -46l2 -1q21 -14 48 -14q24 0 52 12q27 11 61 36q41 30 106 91l1 1l2 2q76 80 107 129q16 25 24 47q7 20 8 37q2 31 -15 55q-10 14 -44 48l-2 2
q-26 26 -35 37q-7 9 -9 13q-4 16 21 55q24 37 67 80v0q8 8 14 8q10 0 26 -15q18 -17 42 -54q31 -48 38 -106q6 -62 -14 -131z" />
<glyph glyph-name="paperclip" unicode="&#xe676;"
d="M885 629q-73 72 -177 72v0q-49 0 -94 -18q-46 -18 -82 -53l-233 -231q-42 -41 -41.5 -99.5t42 -100t100.5 -41.5h1q59 0 100 41l205 202q10 10 10 25t-10 25q-11 10 -25.5 10t-25.5 -10l-204 -202q-21 -21 -50 -21h-1q-30 1 -50 21q-21 21 -21 50.5t20 49.5l233 231
q52 50 126 50v0q74 0 126.5 -51.5t52.5 -124.5t-52 -124l-247 -245q-76 -75 -186 -75v0q-110 0 -187 76.5t-77.5 184.5t76.5 184l319 316q10 10 10 24.5t-10 25.5q-11 10 -25.5 10t-25.5 -10l-319 -316q-47 -47 -73 -109q-24 -60 -24 -125t25 -125q25 -62 73 -110
q48 -47 111 -72q60 -25 127 -25v0q66 0 126 24q63 25 110 72l248 245q35 35 54 81q18 45 18 93q0 103 -73 175z" />
<glyph glyph-name="notification" unicode="&#xe677;"
d="M922 518h-57v18q0 20 -14 34.5t-34 14.5h-172q-12 24 -33 24q-70 0 -145 22.5t-132 54.5t-103 63.5t-72 54t-25 22.5q-10 6 -22 6q-19 0 -33 -13.5t-14 -33.5v-801q0 -20 14 -34t33 -14q13 0 24 7q4 6 12.5 15t35 36t55.5 52t73.5 55t89 51.5t101 36.5t111.5 15
q19 0 30 22h4q2 -74 -25 -171q-6 -20 1.5 -39.5t24.5 -31.5q16 -10 35 -10q22 0 40 15q84 69 105 169q7 34 6 68q4 5 10 14q19 29 19 45v23h57q15 0 25.5 10.5t10.5 25.5v138q0 15 -10.5 25.5t-25.5 10.5zM584 275q-92 -6 -186 -46q-84 -36 -167 -98q-48 -37 -93 -81v679
q50 -39 104 -73q83 -51 165 -81q91 -33 177 -37v-2v-7v-253v-1zM793 291q-6 -10 -14 -21q-5 -3 -8 -7q-11 -13 -8 -30v0q4 -27 -3 -60q-13 -62 -59 -109q29 116 18 202q-2 14 -12 23t-24 9h-25v30q0 4 -2 9v176h137v-222zM886 380h-21v66h21v-66z" />
<glyph glyph-name="menuunfold" unicode="&#xe679;"
d="M925 695h-828q-15 0 -25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5h828q15 0 25.5 -10.5t10.5 -25.5t-10.5 -25.5t-25.5 -10.5zM99 450h565q15 0 25.5 -10.5t10.5 -25.5t-10.5 -25.5t-25.5 -10.5h-565q-15 0 -25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5zM97 72h825
q15 0 25.5 -10.5t10.5 -25.5t-10.5 -25.5t-25.5 -10.5h-825q-15 0 -25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5zM827 281q-11 -10 -26 -10t-25 11q-11 10 -11 25t11 25l96 94l-94 88q-11 11 -11.5 26t9.5 25.5t25 11t26 -9.5l121 -114q11 -11 11 -26t-11 -26z" />
<glyph glyph-name="inbox" unicode="&#xe67a;"
d="M885 450v0l-112 286q-4 12 -14 19.5t-23 7.5h-455q-13 0 -23 -8t-14 -20l-105 -282v-1v0q-2 -8 -1 -15v-5v-366q0 -25 17.5 -43t42.5 -18h628q25 0 43 18t18 43v366q0 3 -1 4q1 7 -1 14zM589 493v-16q0 -34 -21.5 -54.5t-55.5 -20.5t-55 20.5t-21 54.5l-1 16h-205l79 193
h399l82 -193h-201zM214 416h158q18 -43 55 -67t85 -24q52 0 90 27q34 24 51 64h157v-334h-596v334z" />
<glyph glyph-name="lock" unicode="&#xe67b;"
d="M801 596q-24 60 -67 106q-43 45 -100 71q-58 26 -122 26t-122 -26q-56 -26 -99.5 -71.5t-67.5 -105.5q-25 -61 -25 -128v-436q0 -26 18 -45t43 -19h505q26 0 44 19t18 45v385v17v34q0 67 -25 128zM414 714h1l1 1q45 21 96 21q50 0 96 -21q45 -20 80 -57t54 -85
q21 -50 21 -105v-27h-502v0v27q0 55 20 105q20 48 55 85t78 56zM763 377v-345v-1h-502v1v345h502zM483 235v-83q0 -12 8.5 -20.5t20.5 -8.5t21 8.5t9 20.5v83q24 16 24 46q0 22 -15.5 38t-38 16t-38.5 -16t-16 -38q0 -30 25 -46z" />
<glyph glyph-name="qrcode" unicode="&#xe67c;"
d="M876 492h-63v-103h-91v103h-153v102h-51v39h51v52h51v63h-51v51h-166v-63h103v-39h-52v-115h52v-90h-52v-52h-90v52h-63v-52h-39v52h-115v-52h-51v-63h63v51h91v-51h51v-102h63v102h102v52h193v-40h-153v-63h51v-102h114v63h-51v39h205v51h39v-51h63v63h-51v103zM466 287
h-63v-166h51v-39h-51v-63h103v-51h63v51h51v63h-63v-51h-39v90h102v64h-154v102zM96 338h63v-63h-63v63zM153 531h154q23 0 40 17t17 40v154q0 23 -17 40t-40 17h-154q-23 0 -40 -17t-17 -40v-154q0 -23 17 -40t40 -17zM159 594v142h142v-142h-142zM198 697h64v-64h-64v64z
M870 799h-154q-23 0 -40 -17t-17 -40v-154q0 -23 17 -40t40 -17h154q24 0 40.5 17t16.5 40v154q0 23 -16.5 40t-40.5 17zM864 736v-142h-142v142h142zM762 697h63v-64h-63v64zM870 236h-154q-23 0 -40 -17t-17 -40v-154q0 -24 17 -40.5t40 -16.5h154q24 0 40.5 16.5
t16.5 40.5v154q0 23 -16.5 40t-40.5 17zM864 173v-142h-142v142h142zM762 133h63v-63h-63v63zM307 236h-154q-23 0 -40 -17t-17 -40v-154q0 -24 17 -40.5t40 -16.5h154q23 0 40 16.5t17 40.5v154q0 23 -17 40t-40 17zM301 173v-142h-142v142h142zM198 133h64v-63h-64v63z
" />
<glyph glyph-name="tags" unicode="&#xe67d;"
d="M910 352l-360 362q-12 13 -30 13h-362q-26 0 -44 -18t-18 -43v-224q0 -17 12 -30l359 -354q18 -18 43.5 -18t44.5 18l28 28l28 -28q19 -18 44 -18t44 18l210 208q18 17 18 42.5t-17 43.5zM280 457q-32 0 -54.5 22.5t-22.5 54.5t22.5 54.5t54.5 22.5t54.5 -22.5
t22.5 -54.5t-22.5 -54.5t-54.5 -22.5v0zM869 306l-210 -207q-2 -2 -4 -2t-4 2l-32 31l142 140q16 16 16 39t-16 39l-319 322h72l355 -358q1 -1 1 -3t-1 -3v0zM869 306zM280 560q-11 0 -18.5 -7.5t-7.5 -18.5t7.5 -18.5t18.5 -7.5t18.5 7.5t7.5 18.5t-7.5 18.5t-18.5 7.5v0z
" />
<glyph glyph-name="tagso" unicode="&#xe67e;"
d="M280 617q-34 0 -58.5 -24t-24.5 -58.5t24.5 -59t58.5 -24.5t58.5 24.5t24.5 59t-24.5 58.5t-58.5 24zM280 514q-8 0 -14 6t-6 14t6 14t14 6t14 -6t6 -14t-6 -14t-14 -6zM910 352l-360 362q-12 13 -30 13h-362q-26 0 -44 -18t-18 -43v-224q0 -17 12 -30l359 -354
q18 -18 43.5 -18t44.5 18l28 28l28 -28q19 -18 44 -18t44 18l210 208q18 17 18 42.5t-17 43.5zM765 266q18 17 18 42.5t-18 43.5l-309 312h56l351 -355l-208 -205l-27 26zM159 451v213h209l351 -355l-140 -138l-37 -36l-31 -31z" />
<glyph glyph-name="cloudo" unicode="&#xe67f;"
d="M702 35h-404q-48 0 -90.5 17t-76.5 50q-34 34 -52 76t-18 90q0 83 53 147q19 23 42 40q0 38 15 71q14 33 41 60l1 1q27 26 61 39.5t72 13.5q12 0 24 -1q24 26 54 46q72 48 159 48q58 0 109 -20q51 -21 92 -61q42 -41 63 -90q14 -34 19 -71q32 -25 55 -60l7 -11v-1
q35 -59 35 -128q0 -52 -19 -99q-20 -46 -58 -83t-84 -56q-47 -18 -100 -18zM263 535q-18 -17 -26 -37v0q-9 -21 -9 -44q0 -7 1 -13l2 -23l-19 -12q-24 -14 -43 -37v0q-36 -44 -36 -101q0 -33 12 -62t36.5 -52.5t53.5 -35.5q29 -11 63 -11h404q39 0 72.5 13.5t61 40
t41.5 59.5t14 71q0 54 -29 98l-2 4q-20 29 -49 49l-14 10l-2 17q-2 34 -15 64q-15 37 -47 67q-31 31 -68 46q-38 15 -82 15q-66 0 -119 -35q-30 -21 -51 -48l-15 -19l-23 6q-14 4 -30 3q-24 0 -44.5 -8t-37.5 -25z" />
<glyph glyph-name="cloud" unicode="&#xe680;"
d="M926 411v1l-1 2q-26 39 -65 66q-3 43 -20 82q-20 48 -59 86t-88 58q-48 19 -103 19q-84 0 -152 -45q-38 -26 -65 -61q-21 5 -42 5q-34 0 -64 -12t-54 -35q-25 -24 -37 -53q-13 -30 -13 -64q0 -10 1 -18q-31 -19 -56 -49q-48 -59 -48 -135q0 -44 16 -83t48 -70t71 -46.5
t84 -15.5h440q50 0 94 17q44 18 79 53q36 35 54 78t18 92q0 70 -38 128z" />
<glyph glyph-name="cloudupload" unicode="&#xe681;"
d="M926 411v1l-1 2q-26 39 -65 66q-3 43 -20 82q-20 48 -59 86t-88 58q-48 19 -103 19q-84 0 -152 -45q-38 -26 -65 -61q-21 5 -42 5q-34 0 -64 -12t-54 -35q-25 -24 -37 -53q-13 -30 -13 -64q0 -10 1 -18q-31 -19 -56 -49q-48 -59 -48 -135q0 -44 16 -83t48 -70t71 -46.5
t84 -15.5h440q50 0 94 17q44 18 79 53q36 35 54 78t18 92q0 70 -38 128zM751.5 367.5q-10.5 -10.5 -25.5 -10.5t-26 11l-68 68v-246q0 -15 -10.5 -25.5t-25.5 -10.5t-25.5 10.5t-10.5 25.5v246l-68 -69q-11 -10 -25.5 -10t-25 10.5t-10.5 25.5t10 25l130 130q10 10 25 10
t25 -10l130 -130q11 -10 11 -25t-10.5 -25.5z" />
<glyph glyph-name="clouddownload" unicode="&#xe682;"
d="M926 411v1l-1 2q-26 39 -65 66q-3 43 -20 82q-20 48 -59 86t-88 58q-48 19 -103 19q-84 0 -152 -45q-38 -26 -65 -61q-21 5 -42 5q-34 0 -64 -12t-54 -35q-25 -24 -37 -53q-13 -30 -13 -64q0 -10 1 -18q-31 -19 -56 -49q-48 -59 -48 -135q0 -44 16 -83t48 -70t71 -46.5
t84 -15.5h440q50 0 94 17q44 18 79 53q36 35 54 78t18 92q0 70 -38 128zM751 294l-129 -130q-11 -10 -26 -10t-25 10l-130 130q-10 10 -10 25t10.5 25.5t25 10.5t25.5 -11l68 -68v246q0 15 10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5v-246l69 68q10 11 25 11t25.5 -10.5
t10.5 -25.5t-11 -25z" />
<glyph glyph-name="clouddownloado" unicode="&#xe683;"
d="M926 411v1l-1 2q-26 39 -65 66q-3 43 -20 82q-20 48 -59 86t-88 58q-48 19 -103 19q-84 0 -152 -45q-38 -26 -65 -61q-21 5 -42 5q-34 0 -64 -12t-54 -35q-25 -24 -37 -53q-13 -30 -13 -64q0 -10 1 -18q-31 -19 -56 -49q-48 -59 -48 -135q0 -44 16 -83t48 -70t71 -46.5
t84 -15.5h440q50 0 94 17q44 18 79 53q36 35 54 78t18 92q0 70 -38 128zM142 203q-11 25 -11 55q0 25 8 47t24 42h1q17 22 40 35l38 22l-6 43q-1 5 -1 13q0 19 7 36v1q7 16 21 29t31 20t36 7q15 0 28 -4l43 -12l26 36q21 27 51 48q50 33 111 33q42 0 77 -15q36 -14 65 -42
q29 -29 43 -63q13 -29 15 -63l1 -31l27 -18q27 -18 46 -45l2 -3q14 -21 21 -43.5t7 -47.5q0 -35 -13 -65t-38.5 -54.5t-55.5 -36.5q-31 -13 -67 -13h-440q-31 0 -57 11q-25 10 -48 31q-21 21 -31 45v0zM466.5 355q14.5 0 25.5 -11l68 -68v246q0 15 10.5 25.5t25.5 10.5
t25.5 -10.5t10.5 -25.5v-246l69 68q10 11 25 11t25.5 -10.5t10.5 -25.5t-11 -25l-129 -130q-11 -10 -26 -10t-25 10l-130 130q-10 10 -10 25t10.5 25.5t25 10.5z" />
<glyph glyph-name="clouduploado" unicode="&#xe684;"
d="M926 411v1l-1 2q-26 39 -65 66q-3 43 -20 82q-20 48 -59 86t-88 58q-48 19 -103 19q-84 0 -152 -45q-38 -26 -65 -61q-21 5 -42 5q-34 0 -64 -12t-54 -35q-25 -24 -37 -53q-13 -30 -13 -64q0 -10 1 -18q-31 -19 -56 -49q-48 -59 -48 -135q0 -44 16 -83t48 -70t71 -46.5
t84 -15.5h440q50 0 94 17q44 18 79 53q36 35 54 78t18 92q0 70 -38 128zM142 203q-11 25 -11 55q0 25 8 47t24 42h1q17 22 40 35l38 22l-6 43q-1 5 -1 13q0 19 7 36v1q7 16 21 29t31 20t36 7q15 0 28 -4l43 -12l26 36q21 27 51 48q50 33 111 33q42 0 77 -15q36 -14 65 -42
q29 -29 43 -63q13 -29 15 -63l1 -31l27 -18q27 -18 46 -45l2 -3q14 -21 21 -43.5t7 -47.5q0 -35 -13 -65t-38.5 -54.5t-55.5 -36.5q-31 -13 -67 -13h-440q-31 0 -57 11q-25 10 -48 31q-21 21 -31 45v0zM466.5 357q14.5 0 25.5 11l68 68v-246q0 -15 10.5 -25.5t25.5 -10.5
t25.5 10.5t10.5 25.5v246l69 -68q10 -11 25 -11t25.5 10.5t10.5 25.5t-11 25l-129 130q-11 10 -26 10t-25 -10l-130 -130q-10 -10 -10 -25t10.5 -25.5t25 -10.5z" />
<glyph glyph-name="enviroment" unicode="&#xe685;"
d="M512 592q-54 0 -92 -38.5t-38 -92.5t38 -92t92 -38t92 38t38 92t-38 92.5t-92 38.5zM871 621q-31 62 -86 109t-125 74q-71 26 -148 26v0q-77 0 -149 -26q-69 -27 -124 -74t-86 -109q-32 -64 -32 -133q0 -97 47 -197q39 -83 109 -164q92 -108 212 -192q10 -7 22.5 -7
t23.5 7q120 85 212 192q70 82 109 164q47 100 47 197q0 69 -32 133zM655 319q-59 -59 -143 -59t-143 59t-59 142.5t59 142.5t143 59t143 -59t59 -142.5t-59 -142.5z" />
<glyph glyph-name="enviromento" unicode="&#xe686;"
d="M512 663q-84 0 -143 -59t-59 -142.5t59 -142.5t143 -59t143 59t59 142.5t-59 142.5t-143 59zM512 331q-54 0 -92 38t-38 92t38 92.5t92 38.5t92 -38.5t38 -92.5t-38 -92t-92 -38zM871 621q-31 62 -86 109t-125 74q-71 26 -148 26v0q-77 0 -149 -26q-69 -27 -124 -74
t-86 -109q-32 -64 -32 -133q0 -97 47 -197q39 -83 109 -164q92 -108 212 -192q10 -7 22.5 -7t23.5 7q120 85 212 192q70 82 109 164q47 100 47 197q0 69 -32 133zM831 487q0 -81 -40 -166q-34 -73 -98 -148q-77 -90 -181 -166q-104 76 -181 166q-63 75 -98 148
q-40 85 -40 167q0 53 24 102q25 48 69 86q45 39 102 61q60 22 124 22v0q64 0 124 -22q57 -22 102 -61q45 -38 69 -86q24 -50 24 -103z" />
<glyph glyph-name="eye" unicode="&#xe687;"
d="M512 487q-42 0 -72 -30t-30 -72t30 -72t72 -30t72 30t30 72t-30 72t-72 30zM963 384q0 14 -21 62q-26 65 -61 109q-57 71 -139 112q-99 50 -230 50t-231 -50q-80 -41 -138 -112q-34 -43 -61 -109q-21 -48 -21 -62v0v0v0v0q0 -14 21 -62q27 -66 61 -109q57 -71 139 -112
q100 -50 230 -50t230 50q81 41 139 112q35 44 62 109q20 48 20 62v0v0v0v0zM512 212q-72 0 -122.5 50.5t-50.5 122t50.5 122.5t122.5 51t122.5 -51t50.5 -122.5t-50.5 -122t-122.5 -50.5z" />
<glyph glyph-name="eyeo" unicode="&#xe688;"
d="M963 384q0 14 -21 62q-26 65 -61 109q-57 71 -139 112q-99 50 -230 50t-231 -50q-80 -41 -138 -112q-34 -43 -61 -109q-21 -48 -21 -62v0v0v0v0q0 -14 21 -62q27 -66 61 -109q57 -71 139 -112q100 -50 230 -50t230 50q81 41 139 112q35 44 62 109q20 48 20 62v0v0v0v0z
M889 384q-25 -77 -64 -126h-1q-46 -59 -114 -93q-85 -42 -198.5 -42t-198.5 42q-67 34 -114 93q-40 49 -65 126q25 77 65 126q47 59 114 93q85 43 199 43t198 -43q67 -33 114 -93q40 -49 65 -126zM512 558q-72 0 -122.5 -50.5t-50.5 -122.5t50.5 -122.5t122.5 -50.5
t122.5 50.5t50.5 122.5t-50.5 122.5t-122.5 50.5zM614 385q0 -42 -30 -72t-72 -30t-72 30t-30 72t30 72t72 30t72 -30t30 -72z" />
<glyph glyph-name="camera" unicode="&#xe689;"
d="M899 659h-168l-94 100h-1q-10 10 -26 10h-196q-16 0 -27 -10v0l-94 -100h-168q-26 0 -44.5 -18.5t-18.5 -44.5v-532q0 -26 18.5 -44.5t44.5 -18.5l774 -1q26 0 44.5 19t18.5 45v532q0 26 -18.5 44.5t-44.5 18.5zM428 696h168l35 -37h-238zM511 164q-72 0 -123 51t-51 123
t51 123t123 51t123 -51t51 -123t-51 -123t-123 -51zM511 440q-42 0 -72 -30t-30 -72.5t30 -72.5t72.5 -30t72.5 30t30 72.5t-30 72.5t-73 30z" />
<glyph glyph-name="camerao" unicode="&#xe68a;"
d="M511 164q72 0 123 51t51 123t-51 123t-123 51t-123 -51t-51 -123t51 -123t123 -51zM439 410q30 30 72.5 30t72.5 -30t30 -72.5t-30 -72.5t-72.5 -30t-72.5 30t-30 72.5t30 72.5zM899 659h-168l-94 100h-1q-10 10 -26 10h-196q-16 0 -27 -10v0l-94 -100h-168
q-26 0 -44.5 -18.5t-18.5 -44.5v-532q0 -26 18.5 -44.5t44.5 -18.5l774 -1q26 0 44.5 19t18.5 45v532q0 26 -18.5 44.5t-44.5 18.5zM428 696h168l35 -37h-238zM881 81h-739v497h739v-497z" />
<glyph glyph-name="windows" unicode="&#xe68b;"
d="M527 27l434 -71v401h-434v-330zM527 758v-329h434v401zM68 429h367v317l-367 -61v-256zM68 99l367 -60v318h-367v-258z" />
<glyph glyph-name="export2" unicode="&#xe690;"
d="M248.5 473q14.5 0 25 10.5t10.5 25.5v203q0 8 5.5 13.5t13.5 5.5h567q8 0 13 -5.5t5 -13.5v-587q0 -7 -5 -12.5t-13 -5.5h-255q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h255q37 0 63.5 26.5t26.5 63.5v587q0 38 -26.5 64t-63.5 26h-567q-38 0 -64 -26
t-26 -64v-203q0 -15 10.5 -25.5t25 -10.5zM622 263q44 66 55 136q2 14 -7 26t-23 14q-3 1 -5 1q-14 0 -24 -9t-12 -22l-3.5 -17.5t-14 -40t-26.5 -50.5q-70 -104 -206 -104h-4q-14 0 -25 -10.5t-11 -25.5v-42l-100 96l101 84v-35q0 -14 10.5 -24.5t25 -10.5t25 10.5
t10.5 24.5v111q0 23 -20 33q-7 3 -16 3q-12 0 -22 -8l-190 -159q-13 -10 -13 -26q-1 -16 11 -27l190 -181q17 -16 38.5 -7t21.5 33v91q152 13 234 136z" />
<glyph glyph-name="export" unicode="&#xe691;"
d="M838 330q-15 0 -25.5 -10.5t-10.5 -25.5v-204q0 -8 -5.5 -13t-12.5 -5h-567q-8 0 -13.5 5t-5.5 13v587q0 8 5.5 13.5t13.5 5.5h254q15 0 25.5 10.5t10.5 25t-10.5 25t-25.5 10.5h-254q-37 0 -63.5 -26t-26.5 -64v-587q0 -37 26.5 -63.5t63.5 -26.5h567q37 0 63.5 26.5
t26.5 63.5v204q0 15 -10.5 25.5t-25.5 10.5zM464 540q-45 -68 -54 -136q-2 -15 7 -26.5t23 -13.5q2 -1 5 -1q13 0 23.5 9t12.5 22q0 5 3 17.5t14 40t27 50.5q70 103 206 104l3 -1q15 0 25.5 10.5t10.5 25.5v42l101 -95l-101 -84v34q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5
t-10.5 -25.5v-111q0 -22 21 -32q7 -3 15 -3q13 0 23 8l190 158q12 11 13 26q0 17 -11 28l-190 181q-17 16 -39 6.5t-22 -32.5v-91q-152 -13 -234 -136z" />
<glyph glyph-name="circledowno" unicode="&#xe693;"
d="M512 895q-104 0 -199 -40.5t-163.5 -109t-109 -163t-40.5 -199t40.5 -199t109 -163t163.5 -109t199 -40.5t198.5 40.5t163 109t109 163t40.5 199t-40.5 199t-109 163t-163 109t-198.5 40.5zM822 73q-61 -61 -139 -94q-82 -35 -171.5 -35t-171.5 35q-79 33 -139.5 94
t-94.5 140q-34 81 -34 170.5t35 171.5q33 79 94 139.5t140 94.5q81 34 170.5 34t171.5 -34q79 -34 139.5 -95t94.5 -139q34 -82 34 -171.5t-34 -171.5q-34 -78 -95 -139zM768 520q-16 0 -28 -12l-229 -229l-228 228q-12 12 -28.5 12t-28 -11.5t-11.5 -28t12 -28.5l256 -255
q11 -12 27.5 -12t28.5 12l257 256q12 12 12 28.5t-12 27.5q-12 12 -28 12z" />
<glyph glyph-name="circledown" unicode="&#xe694;"
d="M512 895q-104 0 -199 -40.5t-163.5 -109t-109 -163t-40.5 -199t40.5 -199t109 -163t163.5 -109t199 -40.5t198.5 40.5t163 109t109 163t40.5 199t-40.5 199t-109 163t-163 109t-198.5 40.5zM796 452l-258 -256q-11 -12 -27 -12q-17 0 -28 12l-256 255q-12 12 -12 28.5
t11.5 28t28 11.5t28.5 -12l227 -228l230 229q12 12 28.5 12t28 -11.5t11.5 -28.5q0 -16 -12 -28z" />
<glyph glyph-name="hdd" unicode="&#xe69a;"
d="M786 765v0q-4 15 -17 24.5t-29 9.5h-462q-16 0 -29 -9.5t-17 -24.5v0q-3 -8 -68 -243q-68 -245 -68 -248v-257q0 -20 14.5 -34.5t34.5 -14.5h733q20 0 34.5 14.5t14.5 34.5l1 265zM864 224v-193h-705v193h705zM861 287h-699l127 449h440zM588 70q13 0 22.5 9.5t9.5 22.5
v51q0 13 -9.5 22.5t-22.5 9.5t-22 -9.5t-9 -22.5v-51q0 -13 9 -22.5t22 -9.5zM691 70q13 0 22.5 9.5t9.5 22.5v51q0 13 -9.5 22.5t-22.5 9.5t-22 -9.5t-9 -22.5v-51q0 -13 9 -22.5t22 -9.5zM794 70q13 0 22 9.5t9 22.5v51q0 13 -9 22.5t-22 9.5t-22.5 -9.5t-9.5 -22.5v-51
q0 -13 9.5 -22.5t22.5 -9.5z" />
<glyph glyph-name="ie" unicode="&#xe69b;"
d="M878 548q24 66 22 118q-3 57 -37 91q-33 33 -111.5 27.5t-173.5 -47.5q-13 1 -27 1q-65 0 -126 -21q-58 -21 -107 -60q-101 -80 -132 -203l-7 -28l17 22q69 89 150 136q-22 -21 -25 -25q-73 -73 -126 -159q-49 -80 -75 -160q-25 -75 -24 -135t28 -88q37 -36 99 -36
q69 0 160 44q78 -39 168 -39q121 0 219 70t137 184l3 8h-213l-1 -3q-21 -38 -58 -60t-80.5 -22t-80.5 22t-57 60q-18 32 -19 69h319h204l1 5q2 20 2 43q0 100 -49 186zM201 222q45 -111 146 -177q-54 -23 -95 -26q-45 -3 -67 20q-23 23 -19 71t35 112zM859 578
q-30 42 -70 75q-39 32 -85 53q108 42 149 1q37 -38 6 -129zM402 423q5 57 48 96t101 39t100.5 -39t48.5 -96h-298z" />
<glyph glyph-name="delete" unicode="&#xe69f;"
d="M178 -50q-1 0 -3 1l1 -0.5t2 -0.5zM170 -46q-3 2 -5 3q2 -1 5 -3zM950.5 692.5q-10.5 10.5 -26.5 10.5h-184v58q0 29 -21 49.5t-50 20.5h-314q-30 0 -50.5 -20.5t-20.5 -49.5v-58h-185q-15 0 -25.5 -10.5t-10.5 -25t10.5 -25t25.5 -10.5h31v-623q0 -29 21 -49.5t50 -20.5
h632q29 0 50 20.5t21 49.5v623h20q15 0 26 10.5t11 25t-10.5 25zM354 760h315v-57h-315v57zM833 9h-632v623h91h541v-623v0zM511.5 512q-14.5 0 -25 -10.5t-10.5 -25.5v-334q0 -15 10.5 -25.5t25 -10.5t25 10.5t10.5 25.5v334q0 15 -10.5 25.5t-25 10.5zM317 512
q-15 0 -25.5 -10.5t-10.5 -25.5v-334q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v334q0 15 -10.5 25.5t-25.5 10.5zM704 512q-15 0 -25.5 -10.5t-10.5 -25.5v-334q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v334q0 15 -10.5 25.5t-25.5 10.5z" />
<glyph glyph-name="enter" unicode="&#xe6a0;"
d="M900 510v192q0 17 -11.5 28.5t-28 11.5t-28.5 -11.5t-12 -28.5v-192q0 -92 -65 -157t-157 -65h-340l113 112q11 12 11 28.5t-11.5 28t-28 11.5t-28.5 -12l-178 -178q-12 -12 -12 -28.5t12 -28.5l183 -183q12 -12 28.5 -12t28.5 11.5t12 28t-12 28.5l-114 114h336
q125 0 213.5 88.5t88.5 213.5z" />
<glyph glyph-name="pushpino" unicode="&#xe6a1;"
d="M303 728q2 -10 1 -20l-1 -36l29 -23l214 -170l30 -24l37 12q44 15 90 15q49 0 95 -16q26 -10 51 -24l-169 -170l-43 -43l-13 -13v0l-169 -170q-27 45 -36 96q-13 72 10 141l12 37l-24 30l-170 214l-23 29l-36 -1h-1.5h-2.5q-8 0 -16 1zM318 831q-14 0 -24 -10l-219 -219
q-11 -11 -9.5 -27t14.5 -24q48 -31 104 -31h6l170 -215q-28 -84 -11.5 -175.5t74.5 -163.5q11 -13 27 -13q14 0 24 10l206 207l223 -223q10 -10 23.5 -10t23 9.5t9.5 23t-10 23.5l-223 223l206 207q11 11 10 26t-13 25q-98 80 -226 80q-57 0 -112 -18l-215 170q2 60 -30 110
q-10 15 -28 15v0z" />
<glyph glyph-name="pushpin" unicode="&#xe6a2;"
d="M949 -7l-223 223l206 207q11 11 10 26t-13 25q-72 58 -163 74t-175 -12l-215 170q2 60 -30 110q-9 13 -25 14.5t-27 -9.5l-219 -219q-11 -11 -9.5 -27t14.5 -24q50 -33 110 -31l170 -215q-28 -84 -11.5 -175.5t74.5 -163.5q10 -12 25 -13t26 10l206 207l223 -223
q10 -10 23.5 -10t23 9.5t9.5 23t-10 23.5z" />
<glyph glyph-name="heart" unicode="&#xe6a3;" horiz-adv-x="1025"
d="M1000 648q-23 56 -66 99q-84 85 -201 85q-64 0 -121.5 -28t-99.5 -79q-42 51 -99.5 79t-121.5 28q-117 0 -201 -86q-43 -43 -66 -99q-25 -59 -24 -122q1 -69 29 -130.5t79 -104.5q5 -4 9 -8q14 -12 113 -102q208 -191 257 -235q11 -9 25 -9t25 9q33 30 181 165
q158 144 196 179q52 43 81 105t29 132q0 64 -24 122z" />
<glyph glyph-name="hearto" unicode="&#xe6a4;" horiz-adv-x="1025"
d="M1000 648q-23 56 -66 99q-84 85 -201 85q-64 0 -121.5 -28t-99.5 -79q-42 51 -99.5 79t-121.5 28q-117 0 -201 -86q-43 -43 -66 -99q-25 -59 -24 -122q1 -69 29 -130.5t79 -104.5q5 -4 9 -8q14 -12 113 -102q208 -191 257 -235q11 -9 25 -9t25 9q33 30 181 165
q158 144 196 179q52 43 81 105t29 132q0 64 -24 122zM568 672q30 40 73.5 61.5t91.5 21.5q85 0 147 -62q32 -32 49 -74q18 -44 18 -93q0 -53 -22 -101q-22 -46 -60 -77l-2 -2q-62 -55 -197 -180q-108 -98 -154 -140q-58 53 -202 184l-48 44q-76 69 -94 85q-1 2 -2 3
q-6 4 -8 7q-39 32 -60 78.5t-21 97.5q-1 49 18 93q17 42 49 74q62 63 147 63q48 0 91.5 -22t73.5 -61q21 -28 56 -28t56 28z" />
<glyph glyph-name="smile-circle" unicode="&#xe6a7;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM254 454q-25 0 -42.5 17.5t-17.5 42t17.5 42.5t42.5 18t42.5 -18t17.5 -42.5t-17.5 -42t-42.5 -17.5zM512 130
q-68 0 -116 48.5t-48 116.5q0 15 10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5q0 -38 27 -65.5t65 -27.5t65 27.5t27 65.5q0 15 10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5q0 -68 -48 -116.5t-116 -48.5zM769.5 454q-24.5 0 -42 17.5t-17.5 42t17.5 42.5t42 18t42.5 -18
t18 -42.5t-18 -42t-42.5 -17.5z" />
<glyph glyph-name="smileo" unicode="&#xe6a8;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171
q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM640 331q-15 0 -25.5 -10.5t-10.5 -25.5q0 -38 -27 -65.5t-65 -27.5t-65 27.5t-27 65.5q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5
q0 -68 48 -116.5t116 -48.5t116 48.5t48 116.5q0 15 -10.5 25.5t-25.5 10.5zM254 514zM194 513.5q0 24.5 17.5 42.5t42.5 18t42.5 -18t17.5 -42.5t-17.5 -42t-42.5 -17.5t-42.5 17.5t-17.5 42zM770 514zM710 513.5q0 24.5 17.5 42.5t42 18t42.5 -18t18 -42.5t-18 -42
t-42.5 -17.5t-42 17.5t-17.5 42z" />
<glyph glyph-name="frowno" unicode="&#xe6a9;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171
q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM640 130q-15 0 -25.5 11t-10.5 25q0 39 -27 66t-65 27t-65 -27t-27 -66q0 -14 -10.5 -25t-25.5 -11t-25.5 11t-10.5 25q0 68 48 116.5t116 48.5t116 -48.5
t48 -116.5q0 -14 -10.5 -25t-25.5 -11zM254 514zM194 513.5q0 24.5 17.5 42.5t42.5 18t42.5 -18t17.5 -42.5t-17.5 -42t-42.5 -17.5t-42.5 17.5t-17.5 42zM770 514zM710 513.5q0 24.5 17.5 42.5t42 18t42.5 -18t18 -42.5t-18 -42t-42.5 -17.5t-42 17.5t-17.5 42z" />
<glyph glyph-name="calculator" unicode="&#xe6aa;"
d="M857 832h-689q-16 0 -27.5 -11.5t-11.5 -27.5v-818q0 -16 11.5 -27.5t27.5 -11.5h689q16 0 27 11.5t11 27.5v818q0 16 -11 27.5t-27 11.5zM818 14h-612v740h612v-740v0zM324 410h377q16 0 27.5 11.5t11.5 27.5v185q0 16 -11.5 27.5t-27.5 11.5h-377q-16 0 -27.5 -11.5
t-11.5 -27.5v-185q0 -16 11.5 -27.5t27.5 -11.5zM362 595h300v-108h-300v108zM293 189h23v-23q0 -16 11.5 -27.5t27.5 -11.5t27.5 11.5t11.5 27.5v23h23q16 0 27.5 11.5t11.5 27.5t-11.5 27t-27.5 11h-23v24q0 16 -11.5 27t-27.5 11t-27.5 -11t-11.5 -27v-24h-23
q-16 0 -27.5 -11t-11.5 -27t11.5 -27.5t27.5 -11.5zM607 328q-16 0 -27.5 -11t-11.5 -27t11.5 -27.5t27.5 -11.5h124q16 0 27.5 11.5t11.5 27.5t-11.5 27t-27.5 11h-124zM731 162h-124q-16 0 -27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5h124q16 0 27.5 11.5t11.5 27.5
t-11.5 27.5t-27.5 11.5z" />
<glyph glyph-name="chrome" unicode="&#xe6ac;" horiz-adv-x="1025"
d="M258 449l-146 254q71 90 176 141.5t224 51.5q138 0 255.5 -68t185.5 -183h-418q-11 1 -23 1q-90 0 -161 -55.5t-93 -141.5v0zM695 571h294q35 -90 35 -187q0 -103 -40 -197.5t-107.5 -163t-161.5 -109.5t-197 -42l209 363q47 67 47 149q0 110 -79 187v0v0zM326 384
q0 77 54.5 131.5t131.5 54.5t131.5 -54.5t54.5 -131.5t-54.5 -131.5t-131.5 -54.5t-131.5 54.5t-54.5 131.5zM582 131l-146 -253q-122 18 -222 89t-157 181t-57 236q0 135 66 251l209 -362q32 -68 96 -109.5t141 -41.5q36 0 70 9z" />
<glyph glyph-name="github" unicode="&#xe6ad;" horiz-adv-x="1025"
d="M0 371q0 -166 95.5 -298.5t247.5 -185.5q6 -1 10 -1t6.5 1.5t4 3t2 5t0.5 5v6v6.5v88q-37 -4 -66 0.5t-45.5 14t-29 23.5t-17 25.5t-9 24t-5.5 14.5q-9 15 -27 27.5t-27 20t-2 14.5q50 26 113 -66q34 -51 119 -30q10 41 40 70q-116 21 -172 86t-56 158q0 87 55 151
q-22 65 6 137q29 2 65 -11.5t50.5 -23t25.5 -17.5q57 16 128.5 16t129.5 -16q13 9 29 19t49 21.5t61 9.5q27 -71 7 -135q56 -64 56 -151q0 -93 -57 -158.5t-172 -85.5q43 -43 43 -104v-129q0 -1 1 -3q0 -6 0.5 -9t4.5 -6t12 -3q153 52 250.5 185.5t97.5 300.5
q0 104 -40.5 199t-109 163.5t-163.5 109t-199 40.5t-199 -40.5t-163.5 -109t-109 -163.5t-40.5 -199v0z" />
<glyph glyph-name="iconfontdesktop" unicode="&#xe6b4;"
d="M902 766h-779q-23 0 -40 -17t-17 -40v-480q0 -24 17 -40.5t40 -16.5h357v-108h-147q-13 0 -22.5 -9.5t-9.5 -22.5t9.5 -22t22.5 -9h358q13 0 22.5 9t9.5 22t-9.5 22.5t-22.5 9.5h-148v108h359q24 0 40.5 16.5t16.5 40.5v480q0 23 -16.5 40t-40.5 17zM896 703v-468h-767
v468h767z" />
<glyph glyph-name="caretcircleoup" unicode="&#xe6b5;"
d="M512 895q-104 0 -199 -40.5t-163.5 -109t-109 -163.5t-40.5 -199t40.5 -198.5t109 -163t163.5 -109t199 -40.5t198.5 40.5t163 109t109 163t40.5 198.5t-40.5 199t-109 163.5t-163 109t-198.5 40.5zM828 67q-62 -62 -142 -96q-83 -35 -174 -35t-174 35q-81 34 -143 96
t-96 142q-35 83 -35 174t35 175q34 80 96 142t142 96q83 35 174.5 35t174.5 -35q80 -34 142 -96t96 -142q35 -83 35 -174.5t-35 -174.5q-34 -80 -96 -142zM528 559q-7 7 -16 7h-1q-10 0 -16 -7l-229 -244q-10 -11 -4.5 -25t21.5 -14h457q16 0 22 14t-5 25z" />
<glyph glyph-name="upload" unicode="&#xe6b6;"
d="M488 822q10 10 24 10t24 -10l156 -156q10 -10 10 -24.5t-10 -24.5t-24 -10t-25 10l-96 97v-578q0 -14 -10.5 -24t-24.5 -10t-24.5 10t-10.5 24v578l-97 -97q-10 -10 -24 -10t-24 10t-10 24.5t10 24.5zM924.5 256q-14.5 0 -24.5 -10.5t-10 -24.5v-195q0 -9 -6 -15t-15 -6
h-716q-9 0 -15 6t-6 15v195q0 14 -10 24.5t-24.5 10.5t-24.5 -10.5t-10 -24.5v-223q0 -26 18 -44t44 -18h772q26 0 44 18.5t18 43.5v223q0 14 -10 24.5t-24.5 10.5z" />
<glyph glyph-name="download" unicode="&#xe6b7;"
d="M488 112q10 -10 24 -10t24 10l156 156q11 10 11 24t-10.5 24.5t-24.5 10.5t-24 -11l-97 -96v577q0 15 -10.5 25t-24.5 10t-24 -10t-10 -25v-577l-97 97q-11 10 -25 10t-24 -10.5t-10 -24.5t10 -24zM924.5 256q-14.5 0 -24.5 -10.5t-10 -24.5v-195q0 -9 -6 -15t-15 -6
h-716q-9 0 -15 6t-6 15v195q0 14 -10 24.5t-24.5 10.5t-24.5 -10.5t-10 -24.5v-223q0 -26 18 -44t44 -18h772q26 0 44 18.5t18 43.5v223q0 14 -10 24.5t-24.5 10.5z" />
<glyph glyph-name="piechart" unicode="&#xe6b8;"
d="M467 -128q95 0 180 36t150 101l-330 328v465q-95 0 -181.5 -36.5t-149 -99t-99.5 -148.5t-37 -180.5t37 -181t99.5 -148.5t149 -99t181.5 -37v0v0zM531 404h493q0 100 -39 191t-105 157t-157.5 105t-191.5 39v-492v0zM557 339l332 -327q64 64 99.5 148.5t35.5 178.5h-467
v0z" />
<glyph glyph-name="lock1" unicode="&#xe6b9;"
d="M824 614q-26 64 -73 113q-46 50 -107 77q-63 28 -132 28t-132 -28q-61 -27 -108 -76.5t-72 -113.5q-27 -66 -27 -139v-470q0 -29 19.5 -49t46.5 -20h545q28 0 47.5 20t18.5 49v415l1 19v36q0 72 -27 139zM407 741v0l1 1q49 22 104 22q54 0 104 -22q48 -22 86 -62
q38 -39 59 -92t21 -113v-29h-541v0v29q0 59 22 113q21 53 59 92.5t85 60.5zM783 378v-373q0 -1 -1 -1h-540q-1 0 -1 1v373h542zM480 224v-90q0 -13 9.5 -22t22.5 -9t22.5 9t9.5 22v90q27 17 27 49q0 25 -17.5 42t-41.5 17t-41.5 -17t-17.5 -42q0 -32 27 -49z" />
<glyph glyph-name="unlock" unicode="&#xe6ba;"
d="M241 446v30q0 58 22 113q21 52 59 91q38 40 85 61v0l1 1q49 22 104 22q54 0 104 -22q48 -22 86 -61q21 -23 53 -83q10 -20 31 -20h14q14 0 21.5 11.5t2.5 24.5v0q-26 64 -73 113q-46 50 -107 77q-63 28 -132 28t-132 -28q-61 -27 -108 -76.5t-72 -113.5q-27 -66 -27 -139
v-470q0 -29 19.5 -49t46.5 -20h545q28 0 47 20t19 49l1 377q0 26 -19 45t-45 19h-546v0zM783 5q0 -1 -1 -1h-540q-1 0 -1 1v373h542v-373zM480 224v-90q0 -13 9.5 -22t22.5 -9t22.5 9t9.5 22v90q27 17 27 49q0 25 -17.5 42t-41.5 17t-41.5 -17t-17.5 -42q0 -32 27 -49z" />
<glyph glyph-name="windowso" unicode="&#xe6bc;"
d="M527 27l434 -71v401h-434v-330zM599 285h290v-244l-290 47v197zM527 758v-329h434v401zM889 501h-290v196l290 48v-244zM68 429h367v317l-367 -61v-256zM140 624l223 37v-160h-223v123zM68 99l367 -60v318h-367v-258zM140 285h223v-161l-223 36v125z" />
<glyph glyph-name="dotchart" unicode="&#xe6bd;"
d="M923 8h-788v789q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-825q0 -15 10.5 -25.5t25.5 -10.5h824q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM319 259zM253 259.5q0 27.5 19 46.5t46.5 19t47 -19t19.5 -46.5t-19.5 -47t-47 -19.5t-46.5 19.5t-19 47z
M598 299zM512 299q0 35 25 60t60.5 25t60.5 -25t25 -60t-25 -60t-60.5 -25t-60.5 25t-25 60zM623 514zM563 514q0 25 17.5 42.5t42.5 17.5t42.5 -17.5t17.5 -42.5t-17.5 -42.5t-42.5 -17.5t-42.5 17.5t-17.5 42.5zM850 657zM805 657.5q0 18.5 13 32t32 13.5t32.5 -13.5
t13.5 -32t-13.5 -32t-32.5 -13.5t-32 13.5t-13 32zM863 466zM830 466q0 14 9.5 23.5t23.5 9.5t23.5 -9.5t9.5 -23.5t-9.5 -23.5t-23.5 -9.5t-23.5 9.5t-9.5 23.5z" />
<glyph glyph-name="barchart" unicode="&#xe6be;"
d="M923 -64h-824q-15 0 -25.5 10.5t-10.5 25.5v824q0 15 10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5v-788h788q15 0 25.5 -10.5t10.5 -25.5t-10.5 -25.5t-25.5 -10.5zM264 523q-29 -1 -50 -22t-22 -50q0 -23 11.5 -41t30.5 -28v-285q0 -13 9.5 -22.5t22.5 -9.5v0
q13 0 22.5 9.5t9.5 22.5v285q19 9 30.5 27t11.5 40q0 31 -22.5 53t-53.5 21zM542 641q-30 -1 -51 -22t-21 -50q-1 -23 10.5 -41t31.5 -28v-403q0 -13 9 -22.5t23 -9.5v0q13 0 22.5 9.5t9.5 22.5v403q18 9 30 27t12 40q0 31 -22.5 53t-53.5 21zM895 438q0 31 -22.5 53
t-53.5 21q-29 -1 -50 -22t-22 -50q0 -23 11.5 -41t30.5 -28v-274q0 -13 9.5 -22.5t22.5 -9.5v0q13 0 22.5 9.5t9.5 22.5v274q19 9 30.5 27t11.5 40z" />
<glyph glyph-name="codesquare" unicode="&#xe6bf;"
d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM229 347q-15 0 -25.5 10.5t-10.5 25.5t10 26l115 115l-115 117q-10 11 -10 25.5t10.5 25t25.5 10.5t25 -10l141 -142q10 -11 10 -26
t-11 -25l-140 -141q-10 -11 -25 -11zM618 347v0l-199 1q-15 0 -25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5v0l199 -1q15 0 25.5 -10.5t10.5 -25.5t-11 -25.5t-25 -10.5z" />
<glyph glyph-name="plussquare" unicode="&#xe6c0;"
d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM732 348h-184v-183q0 -15 -10.5 -25.5t-25 -10.5t-25.5 10.5t-11 25.5v183h-184q-15 0 -25.5 10.5t-10.5 25t10.5 25.5t25.5 11h184v183
q0 15 11 25.5t25.5 10.5t25 -10.5t10.5 -25.5v-183h184q15 0 25.5 -11t10.5 -25.5t-10.5 -25t-25.5 -10.5z" />
<glyph glyph-name="minussquare" unicode="&#xe6c1;"
d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM768 383q0 -15 -11 -25.5t-25 -10.5h-442q-14 0 -25 10.5t-11 25.5v0q0 15 11 25.5t25 10.5h442q14 0 25 -10.5t11 -25.5v0z" />
<glyph glyph-name="closesquare" unicode="&#xe6c2;"
d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM717.5 178.5q-10.5 -10.5 -25.5 -10.5t-26 10l-154 155l-154 -155q-11 -10 -26 -10t-25.5 10.5t-10.5 25.5t11 25l154 155l-154 155
q-11 10 -11 25t10.5 25.5t25.5 10.5t26 -10l154 -155l154 155q11 10 26 10t25.5 -10.5t10.5 -25.5t-11 -25l-154 -155l154 -155q11 -11 11 -25.5t-10.5 -25z" />
<glyph glyph-name="closesquareo" unicode="&#xe6c3;"
d="M717.5 589.5q-10.5 10.5 -25.5 10.5t-26 -10l-154 -155l-154 155q-11 10 -26 10t-25.5 -10.5t-10.5 -25.5t11 -25l154 -155l-154 -155q-11 -10 -11 -25t10.5 -25.5t25.5 -10.5t26 10l154 155l154 -155q11 -10 26 -10t25.5 10.5t10.5 25t-11 25.5l-154 155l154 155
q11 10 11 25t-10.5 25.5zM888 760v0v0v-753v0h-752v0v753v0h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0z" />
<glyph glyph-name="checksquare" unicode="&#xe6c4;"
d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM772 539l-359 -360l-1 -1q-3 -3 -8 -6q-8 -5 -18 -5q-21 0 -31 18l-109 191q-8 13 -4 27t17 21.5t27.5 3.5t21.5 -17l86 -149l327 328
q11 11 26 11t25.5 -10.5t10.5 -25.5t-11 -26z" />
<glyph glyph-name="checksquareo" unicode="&#xe6c5;"
d="M721 590l-327 -328l-86 149q-7 13 -21.5 17t-27.5 -3.5t-17 -21.5t4 -27l109 -191q10 -18 31 -18q10 0 18 5q5 3 8 6l1 1l359 360q11 11 11 26t-10.5 25.5t-25.5 10.5t-26 -11zM888 760v0v0v-753v0h-752v0v753v0h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753
q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0z" />
<glyph glyph-name="fastbackward" unicode="&#xe6c6;"
d="M525 414l436 376q18 17 40.5 6.5t22.5 -36.5v-752q0 -26 -22.5 -36.5t-40.5 6.5l-436 377q-13 12 -13 30t13 29zM36 800v0q15 0 25.5 -10.5t10.5 -25.5v-298l377 324q18 17 40.5 6.5t22.5 -36.5v-375v-377q0 -26 -22.5 -36.5t-40.5 6.5l-377 326v-300q0 -15 -10.5 -25.5
t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v760q0 15 10.5 25.5t25.5 10.5z" />
<glyph glyph-name="fastforward" unicode="&#xe6c7;"
d="M499 414l-436 376q-18 17 -40.5 6.5t-22.5 -36.5v-752q0 -26 22.5 -36.5t40.5 6.5l436 378q13 11 13 29t-13 29zM988 800v0q-15 0 -25.5 -10.5t-10.5 -25.5v-298l-377 324q-18 17 -40.5 6.5t-22.5 -36.5v-375v-377q0 -26 22.5 -36.5t40.5 6.5l377 326v-300
q0 -15 10.5 -25.5t25.5 -10.5v0q15 0 25.5 10.5t10.5 25.5v760q0 15 -10.5 25.5t-25.5 10.5z" />
<glyph glyph-name="upsquare" unicode="&#xe6c8;"
d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM757.5 277q-10.5 -10 -25.5 -9.5t-25 10.5l-195 208l-195 -208q-10 -10 -25 -10.5t-26 9.5t-11.5 25t10.5 26l221 236q10 11 26 11t26 -11
l221 -236q10 -11 9.5 -26t-11 -25z" />
<glyph glyph-name="downsquare" unicode="&#xe6c9;"
d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM759 451l-221 -236q-10 -11 -26 -11t-26 11l-221 236q-11 11 -10.5 26t11.5 25t26 9.5t25 -11.5l195 -207l195 207q10 11 25 11.5
t25.5 -9.5t11 -25t-9.5 -26z" />
<glyph glyph-name="leftsquare" unicode="&#xe6ca;"
d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM616 189q11 -10 11.5 -25t-9.5 -25.5t-25 -11t-26 9.5l-236 221q-11 10 -11 26t11 26l236 221q11 11 26 10.5t25 -11.5t9.5 -26t-10.5 -25
l-208 -195z" />
<glyph glyph-name="rightsquare" unicode="&#xe6cb;"
d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM694 358l-236 -221q-11 -10 -26 -9.5t-25 11t-9.5 25.5t10.5 25l208 195l-208 195q-10 10 -10.5 25t9.5 26t25 11.5t26 -10.5l236 -221
q11 -10 11 -26t-11 -26z" />
<glyph glyph-name="rightsquareo" unicode="&#xe6cc;"
d="M888 760v0v0v-753v0h-752v0v753v0h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0zM705 384q0 16 -11 26l-236 221q-11 11 -26 10.5t-25 -11.5t-9.5 -26t10.5 -25l208 -195
l-208 -195q-10 -10 -10.5 -25t9.5 -26t25 -11.5t26 10.5l236 221q11 10 11 26z" />
<glyph glyph-name="leftsquareo" unicode="&#xe6cd;"
d="M888 760v0v0v-753v0h-752v0v753v0h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0zM331 358l236 -221q11 -10 26 -9.5t25 11t9.5 25.5t-11.5 25l-207 195l207 195q11 10 11.5 25
t-9.5 26t-25 11.5t-26 -10.5l-236 -221q-11 -10 -11 -26t11 -26z" />
<glyph glyph-name="down-square-o" unicode="&#xe6ce;"
d="M888 760v0v0v-753h-752v753h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0zM538 215l221 236q10 11 9.5 26t-11 25t-25.5 9.5t-25 -11.5l-195 -207l-195 207q-10 11 -25 11.5
t-26 -9.5t-11.5 -25t10.5 -26l221 -236q10 -11 26 -11t26 11z" />
<glyph glyph-name="up-square-o" unicode="&#xe6cf;"
d="M888 760v0v0v-753v0h-752v0v753v0h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0zM512 575q-16 0 -26 -11l-221 -236q-11 -11 -10.5 -26t11.5 -25t26 -9.5t25 10.5l195 208
l195 -208q10 -10 25 -10.5t25.5 9.5t11 25t-9.5 26l-221 236q-10 11 -26 11z" />
<glyph glyph-name="play" unicode="&#xe6d0;"
d="M512 894q-139 0 -256.5 -68.5t-186 -186t-68.5 -256.5t68.5 -256.5t186 -186t256.5 -68.5t256.5 68.5t186 186t68.5 256.5t-68.5 256.5t-186 186t-256.5 68.5zM712 369l-291 -247q-6 -6 -15 -6q-8 0 -14.5 5.5t-6.5 14.5v495q0 8 6.5 13.5t15 5.5t14.5 -6l291 -247
q6 -6 6 -14t-6 -14z" />
<glyph glyph-name="playcircleo" unicode="&#xe6d1;"
d="M512 894q-139 0 -256.5 -68.5t-186 -186t-68.5 -256.5t68.5 -256.5t186 -186t256.5 -68.5t256.5 68.5t186 186t68.5 256.5t-68.5 256.5t-186 186t-256.5 68.5zM822 73q-60 -61 -139 -95q-82 -34 -171 -34t-171 34q-78 34 -139 95q-61 60 -95 139q-34 82 -34 171t35 171
q33 78 94 140q60 60 139 94q82 34 171 34t171 -34q78 -34 139 -95q61 -60 95 -139q34 -82 34 -171t-35 -171q-33 -79 -94 -139zM712 397l-291 247q-6 6 -15 6q-8 0 -14.5 -5.5t-6.5 -13.5v-495q0 -9 6.5 -14t15 -5t14.5 5l291 247q6 6 6 14t-6 14z" />
<glyph glyph-name="tag" unicode="&#xe6d2;"
d="M963 291v3q-1 9 -4 18q-4 10 -10 19q-4 5 -7 8l-479 483q-4 5 -9 8q-12 7 -25 7h-291q-31 0 -53 -22t-22 -52v-298q0 -5 1 -10l0.5 -1l0.5 -1q1 -4 2 -7q1 -1 1 -2q4 -7 10 -13l477 -472q9 -8 18 -13q17 -9 35 -9q15 0 28 6q14 5 25 16l280 277q3 2 5 5q3 3 5 7q2 3 3 5
q2 3 3 5q0 2 1 3q5 14 5 30zM264.5 560q-29.5 0 -50.5 21t-21 50.5t21 50.5t50.5 21t50.5 -21t21 -50.5t-21 -50.5t-50.5 -21z" />
<glyph glyph-name="tago" unicode="&#xe6d3;"
d="M963 291v3q-1 9 -4 18q-4 10 -10 19q-4 5 -7 8l-479 483q-4 5 -9 8q-12 7 -25 7h-291q-31 0 -52.5 -22t-21.5 -52v-298v-10l0.5 -1l0.5 -1q1 -4 2 -7q1 -1 1 -2q4 -7 10 -13l238 -236l239 -236q9 -8 19 -13q16 -9 34 -9q15 0 28 6q14 5 25 16l280 277q3 2 5 5q3 3 5 7
q2 3 3 5q2 3 3 5q0 2 1 3q5 14 5 30zM891 287v0v0v0v0v0h-1v0l-280 -277v0q-1 -1 -2 -1t-1 1h-0.5h-0.5l-239 236l-231 229v288q0 2 2 2h281l471 -476h1v-1v0v0v-1zM264 632zM193 631.5q0 29.5 21 50.5t50.5 21t50.5 -21t21 -50.5t-21 -50.5t-50.5 -21t-50.5 21t-21 50.5z
" />
<glyph glyph-name="addfile" unicode="&#xe910;"
d="M860 128h-156v156q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-156h-148q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h148v-148q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v148h156q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM875 594
l-278 281q-6 6 -15 11q-2 2 -4 2q-1 1 -3 2q-14 6 -29 6h-346q-30 0 -51 -21t-21 -51v-880q0 -30 21 -51t51 -21h212q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-212v880h312v-240q0 -30 21 -51t51 -21h240v-156q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5
v188q0 29 -21 50zM584 584v202l200 -202h-200z" />
<glyph glyph-name="folder1" unicode="&#xe662;"
d="M952 704h-463l-25 78q-7 22 -26 36t-43 14h-323q-30 0 -51 -21t-21 -51v-688q0 -30 21 -51t51 -21h880q30 0 51 21t21 51v560q0 30 -21 51t-51 21zM72 760h323l18 -56h-341v56zM952 72h-880v560h880v-560z" />
<glyph glyph-name="file1" unicode="&#xe664;"
d="M875 594l-278 281q-6 6 -15 11q-2 2 -4 2q-1 1 -3 2q-14 6 -29 6h-346q-30 0 -51 -21t-21 -51v-880q0 -30 21 -51t51 -21h624q30 0 51 21t21 51v600q0 29 -21 50zM784 584h-200v202zM824 -56h-624v880h312v-240q0 -30 21 -51t51 -21h240v-568z" />
<glyph glyph-name="switcher" unicode="&#xe913;"
d="M572 292h-376q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h376q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM696 568v-624h-624v624h624zM696 640h-624q-30 0 -51 -21t-21 -51v-624q0 -30 21 -51t51 -21h624q30 0 51 21t21 51v624q0 30 -21 51t-51 21z
M952 896h-592q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h592v-596q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v596q0 30 -21 51t-51 21zM824 768h-660q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h660v-660q0 -15 10.5 -25.5t25.5 -10.5
t25.5 10.5t10.5 25.5v660q0 30 -21 51t-51 21z" />
<glyph glyph-name="addfolder" unicode="&#xe914;"
d="M988 256h-156v156q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-156h-148q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h148v-148q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v148h156q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM952 704
h-463l-25 78q-7 22 -26 36t-43 14h-323q-30 0 -51 -21t-21 -51v-688q0 -30 21 -51t51 -21h468q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-468v560h880v-148q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v148q0 30 -21 51t-51 21zM72 704v56h323l18 -56h-341z
" />
<glyph glyph-name="folderopen" unicode="&#xe699;"
d="M960 512v120q0 30 -21 51t-51 21h-399l-25 78q-7 22 -26 36t-43 14h-323q-30 0 -51 -21t-21 -51v-688q0 -5 1 -11v0v-2v-1l0.5 -0.5l0.5 -0.5v-1v-1.5t0.5 -1l0.5 -0.5v-1q0 -2 1 -3v0q5 -17 18 -29v0q1 0 1.5 -0.5l1 -1t0.5 -1.5q1 0 1 -0.5t0.5 -0.5t1 -0.5t1.5 -0.5
v-0.5v-0.5q1 0 1.5 -0.5l1.5 -1.5v0q15 -10 32 -11l1 -1h3h1h1h2h788q25 0 44.5 15.5t25.5 39.5l92 368q8 31 -11 58t-51 31zM72 760h323l41 -128h452v-120h-724q-25 0 -44.5 -15t-25.5 -39l-22 -89v391zM860 72h-788l92 368h788z" />
<glyph glyph-name="search1" unicode="&#xe670;"
d="M950 -2l-206 205q88 107 88 245q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5q138 0 245 88l206 -206q10 -10 25 -10t26 10q10 11 10 26t-10 26zM569 160q-57 -24 -121 -24t-121 24q-56 24 -99.5 67.5t-66.5 99.5
q-25 57 -25 121t25 121q23 56 66.5 99.5t99.5 67.5q57 24 121 24t121 -24q56 -24 99.5 -67.5t67.5 -99.5q24 -57 24 -121t-24 -121q-24 -56 -67.5 -99.5t-99.5 -67.5z" />
<glyph glyph-name="ellipsis1" unicode="&#xe647;"
d="M128 384q0 -27 18.5 -45.5t45.5 -18.5t45.5 18.5t18.5 45.5t-18.5 45.5t-45.5 18.5t-45.5 -18.5t-18.5 -45.5zM448 384q0 -27 18.5 -45.5t45.5 -18.5t45.5 18.5t18.5 45.5t-18.5 45.5t-45.5 18.5t-45.5 -18.5t-18.5 -45.5zM768 384q0 -27 18.5 -45.5t45.5 -18.5
t45.5 18.5t18.5 45.5t-18.5 45.5t-45.5 18.5t-45.5 -18.5t-18.5 -45.5z" />
<glyph glyph-name="calendar" unicode="&#xe6bb;"
d="M888 768h-120v28q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-28h-368v28q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-28h-120q-30 0 -51 -21t-21 -51v-688q0 -30 21 -51t51 -21h752q30 0 51 21t21 51v688q0 30 -21 51t-51 21zM136 696h120v-20
q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v20h368v-20q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v20h120v-112h-752v112zM888 8h-752v504h752v-504zM288 384h64q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5
t22.5 9.5zM480 384h64q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5zM672 384h64q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5zM288 190h64q13 0 22.5 -9.5
t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5zM480 190h64q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5z" />
<glyph glyph-name="filetext1" unicode="&#xe698;"
d="M875 594l-278 281q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-345q-30 0 -51.5 -21t-21.5 -51v-880q0 -30 21.5 -51t51.5 -21h623q30 0 50.5 21t20.5 51v600q0 30 -20 50zM583 786l201 -202h-201v202zM823 -56h-623v880h311v-240q0 -30 21.5 -51t51.5 -21h239v-568z
M584 412q0 15 -10.5 25.5t-25.5 10.5h-256q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h256q15 0 25.5 10.5t10.5 25.5zM776 252q0 15 -10.5 25.5t-25.5 10.5h-448q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h448q15 0 25.5 10.5t10.5 25.5zM648 92
q0 15 -10.5 25.5t-25.5 10.5h-320q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h320q15 0 25.5 10.5t10.5 25.5z" />
<glyph glyph-name="copy1" unicode="&#xe648;"
d="M875 658l-214 217q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-281q-30 0 -51.5 -21t-21.5 -51v-56h-56q-29 0 -50.5 -21.5t-21.5 -50.5v-752q0 -30 21.5 -51t50.5 -21h496q29 0 50 21t21 51v56h57q30 0 50.5 21t20.5 51v536q0 30 -20 50zM647 786l137 -138h-137v138z
M695 -56h-495v752h56v-624q0 -30 21.5 -51t51.5 -21h366v-56zM823 72h-495v752h247v-176q0 -30 21.5 -51t51.5 -21h175v-504zM640 476q0 15 -10.5 25.5t-25.5 10.5h-184q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h184q15 0 25.5 10.5t10.5 25.5zM768 348
q0 15 -10.5 25.5t-25.5 10.5h-312q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h312q15 0 25.5 10.5t10.5 25.5zM704 220q0 15 -10.5 25.5t-25.5 10.5h-248q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h248q15 0 25.5 10.5t10.5 25.5z" />
<glyph glyph-name="jpgfile1" unicode="&#xe69c;"
d="M875 594l-278 281q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-345q-30 0 -51.5 -21t-21.5 -51v-880q0 -30 21.5 -51t51.5 -21h623q30 0 50.5 21t20.5 51v600q0 30 -20 50zM583 786l201 -202h-201v202zM823 -56h-623v880h311v-240q0 -30 21.5 -51t51.5 -21h239v-568z
M350 200q0 -18 -5.5 -25t-16.5 -7q-15 0 -25 19l-30 -23q20 -34 61 -34q30 0 45.5 18.5t15.5 47.5v123h-45v-119zM501 319h-64v-186h44v62h22q31 0 52 16t21 48q0 60 -75 60zM500 230h-19v53h18q34 0 34 -25q0 -28 -33 -28zM683 239v-36h30v-30q-6 -5 -18 -5q-50 0 -50 58
q0 27 13 42.5t34 15.5q18 0 34 -15l23 29q-24 24 -59 24q-39 0 -65 -26t-26 -71q0 -46 25.5 -70.5t66.5 -24.5q39 0 61 22v87h-69z" />
<glyph glyph-name="pdffile1" unicode="&#xe6b3;"
d="M875 594l-278 281q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-345q-30 0 -51.5 -21t-21.5 -51v-880q0 -30 21.5 -51t51.5 -21h623q30 0 50.5 21t20.5 51v600q0 30 -20 50zM583 786l201 -202h-201v202zM823 -56h-623v880h311v-240q0 -30 21.5 -51t51.5 -21h239v-568z
M333 320h-67v-192h46v64h22q33 0 54.5 16.5t21.5 49.5q0 62 -77 62zM332 228h-20v56h18q35 0 35 -26q0 -30 -33 -30zM498 320h-56v-192h58q44 0 69 24.5t25 72.5t-25.5 71.5t-70.5 23.5zM495 165h-6v118h6q25 0 38.5 -13t13.5 -45q0 -60 -52 -60zM752 282v38h-122v-192h46
v73h65v38h-65v43h76z" />
<glyph glyph-name="exclefile1" unicode="&#xe6b0;"
d="M875 594l-278 281q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-345q-30 0 -51.5 -21t-21.5 -51v-880q0 -30 21.5 -51t51.5 -21h623q30 0 50.5 21t20.5 51v600q0 30 -20 50zM583 786l201 -202h-201v202zM823 -56h-623v880h311v-240q0 -30 21.5 -51t51.5 -21h239v-568z
M460 229l-56 155h86l16 -57q5 -18 14 -53h2q15 29 30 53l33 57h82l-111 -159l60 -162h-86l-19 63q-4 14 -14 54h-2q-14 -25 -31 -54l-39 -63h-82z" />
<glyph glyph-name="pptfile1" unicode="&#xe6b1;"
d="M875 594l-278 281q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-345q-30 0 -51.5 -21t-21.5 -51v-880q0 -30 21.5 -51t51.5 -21h623q30 0 50.5 21t20.5 51v600q0 30 -20 50zM583 786l201 -202h-201v202zM823 -56h-623v880h311v-240q0 -30 21.5 -51t51.5 -21h239v-568z
M538 390h-112l-57 -334h77l19 119h37q55 0 96 28t51 82q10 56 -21 80.5t-90 24.5zM574 285q-9 -49 -65 -49h-33l16 93h32q29 0 41.5 -10t8.5 -34z" />
<glyph glyph-name="unknowfile1" unicode="&#xe6af;"
d="M875 594l-278 281q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-345q-30 0 -51.5 -21t-21.5 -51v-880q0 -30 21.5 -51t51.5 -21h623q30 0 50.5 21t20.5 51v600q0 30 -20 50zM583 786l201 -202h-201v202zM823 -56h-623v880h311v-240q0 -30 21.5 -51t51.5 -21h239v-568z
M510 329q0 18 -11 28t-29 10q-28 0 -58 -29l-55 51q52 59 125 59q56 0 90.5 -28t34.5 -84q0 -21 -10 -40.5t-24 -34t-27.5 -29t-22 -33t-5.5 -39.5h-88q-5 30 6.5 57t28.5 43.5t31 35.5t14 33zM432 62q0 19 12 31t29.5 12t29.5 -12.5t12 -30.5t-12 -30.5t-29.5 -12.5
t-29.5 12.5t-12 30.5z" />
<glyph glyph-name="wordfile1" unicode="&#xe6b2;"
d="M875 594l-278 281q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-345q-30 0 -51.5 -21t-21.5 -51v-880q0 -30 21.5 -51t51.5 -21h623q30 0 50.5 21t20.5 51v600q0 30 -20 50zM583 786l201 -202h-201v202zM823 -56h-623v880h311v-240q0 -30 21.5 -51t51.5 -21h239v-568z
M559 142q-1 14 -1 46v48l-7 136h-60l-55 -136q-21 -57 -34 -94h-2l5 94l5 136h-73l2 -298h88l49 130q3 8 24 70h2q-2 -35 -1 -70l4 -130h90l104 298h-68l-43 -136q-3 -11 -12.5 -43t-15.5 -51h-1z" />
<glyph glyph-name="dingding" unicode="&#xe923;"
d="M913 513q-3 -11 -12 -31v0l-1 -2q-16 -34 -48.5 -90.5t-56.5 -96.5l-24 -40q0 1 -1 1l-27 -47h131l-251 -335l57 228h-103l36 150q-46 -11 -104 -30q-3 -1 -7 -2.5t-19 -2t-32 4t-44.5 20.5t-56.5 42l-5 5l-11.5 11.5t-13.5 17t-9.5 17.5t-2 16t12.5 11q14 5 136 22
l114 14q-218 -3 -270 5q-38 6 -79 59.5t-52 110.5l-3 15q2 21 49 7q31 -8 118 -27.5t160 -34.5l72 -14q-5 1 -13 3.5t-33 10.5l-50 16t-58.5 19t-63 21t-60.5 21t-53.5 20t-39 16.5t-20.5 11.5q-21 24 -45 99t-20 126q0 2 1 5t6.5 7t14.5 2q271 -124 456 -192
q30 -11 76 -26.5t73.5 -25t62 -23t53.5 -25t36.5 -25.5t22.5 -30t1 -35z" />
<glyph glyph-name="dingding-o" unicode="&#xe925;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM749 415q-1 -6 -7 -19v0v0q-6 -13 -16.5 -32t-20.5 -36.5t-19.5 -33t-15.5 -25.5l-6 -10v1l-17 -28h79
l-151 -201l35 136h-62l21 90q-28 -6 -63 -17q-3 -3 -10.5 -4.5t-32 7.5t-52.5 34l-3 3l-7 7t-8 9.5t-5.5 10t-1 10t7.5 6.5q8 3 81 13l69 9q-131 -2 -162 3q-23 4 -47.5 36t-31.5 66l-2 10q3 11 30 3q18 -5 70.5 -16.5t96 -20.5l43.5 -9q-220 68 -235 84q-12 15 -26.5 59.5
t-12.5 75.5q0 1 0.5 3t4 4.5t8.5 0.5q163 -74 274 -115q19 -7 46.5 -16t43.5 -15t37 -14t32.5 -15t21.5 -15.5t13.5 -18t0.5 -20.5z" />
<glyph glyph-name="mobile1" unicode="&#xe678;"
d="M760 896h-496q-30 0 -51 -21t-21 -51v-880q0 -30 21 -51t51 -21h496q30 0 51 21t21 51v880q0 30 -21 51t-51 21zM542 -64h-60q-15 0 -24.5 9.5t-9.5 22.5t9.5 22.5t24.5 9.5h60q15 0 24.5 -9.5t9.5 -22.5t-9.5 -22.5t-24.5 -9.5zM760 65h-496v704h496v-704z" />
<glyph glyph-name="tablet1" unicode="&#xe66e;"
d="M824 896h-624q-30 0 -51 -21t-21 -51v-880q0 -30 21 -51t51 -21h624q30 0 51 21t21 51v880q0 30 -21 51t-51 21zM542 -64h-60q-15 0 -24.5 9.5t-9.5 22.5t9.5 22.5t24.5 9.5h60q15 0 24.5 -9.5t9.5 -22.5t-9.5 -22.5t-24.5 -9.5zM824 65h-624v759h624v-759z" />
<glyph glyph-name="bells" unicode="&#xe64e;"
d="M860 64h-28v448q0 123 -82 214t-202 104v30q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-30q-120 -13 -202 -104t-82 -214v-448h-28q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h276v-48q0 -30 21 -51t51 -21t51 21t21 51v48h276q15 0 25.5 10.5
t10.5 25.5t-10.5 25.5t-25.5 10.5zM760 64h-496v448q0 103 72.5 175.5t175.5 72.5t175.5 -72.5t72.5 -175.5v-448z" />
<glyph glyph-name="disconnect" unicode="&#xe64f;"
d="M900 772q-60 60 -144.5 60t-143.5 -60l-180 -180q-11 -10 -11 -25t11 -26t26 -11t25 11l180 180q38 38 92.5 38t93 -38.5t38.5 -93t-38 -92.5l-180 -180q-10 -11 -10 -25.5t10.5 -25t25.5 -10.5t25 10l180 180q60 59 60 143.5t-60 144.5zM377 615q15 0 25.5 10.5
t10.5 25.5v145q0 15 -10.5 25.5t-25.5 10.5t-26 -10.5t-11 -25.5v-145q1 -15 11 -26q11 -10 26 -10zM809 139q-11 11 -25 10q-16 0 -26.5 -10.5t-10.5 -25.5t11 -25l102 -103q11 -10 26 -10t25.5 10.5t10.5 25.5t-10 25zM924 285h-145q-16 0 -26 -11q-11 -11 -11 -25.5
t11 -25t26 -10.5h144q15 0 26 10.5t11 25.5t-10.5 25.5t-25.5 10.5zM648 153q-15 0 -25.5 -10.5t-10.5 -25.5v-145q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v145q0 15 -11 25q-10 11 -25 11zM541 227l-180 -180q-38 -39 -92.5 -39t-93.5 39q-38 39 -38 93t38 93
l180 180q10 10 10 25t-10.5 25.5t-25.5 10.5t-25 -10l-180 -180q-60 -60 -60 -144q0 -85 60 -144q60 -60 144 -60q85 0 144 60l180 180q11 10 11 25t-11 25.5t-26 10.5t-25 -10zM215 629q11 -11 26 -11t25.5 10.5t10.5 25.5t-11 26l-102 102q-11 11 -26 11t-25.5 -10.5
t-10.5 -25.5t11 -26zM101 483h145q15 0 25 11q11 10 11 25t-10.5 25.5t-25.5 10.5h-145q-15 0 -25.5 -10.5t-10.5 -25.5q-1 -15 10 -25.5t26 -10.5z" />
<glyph glyph-name="database" unicode="&#xe650;"
d="M824 896h-624q-30 0 -51 -21t-21 -51v-880q0 -30 21 -51t51 -21h624q30 0 51 21t21 51v880q0 30 -21 51t-51 21zM824 -47h-624v244q0 -1 1 -1h622q1 0 1 1v-244zM824 267q0 1 -1 1h-622q-1 0 -1 -1v244q0 -1 1 -1h622q1 0 1 1v-244zM824 581q0 1 -1 1h-622q-1 0 -1 -1
v243h624v-243zM321 75zM285 75q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5zM321 389zM285 389q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5zM321 703zM285 703
q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5z" />
<glyph glyph-name="barcode" unicode="&#xe652;"
d="M706 128h70q1 0 1 1v638q0 1 -1 1h-70q-1 0 -1 -1v-638q0 -1 1 -1zM534 72h-70q-1 0 -1 -1v-70q0 -1 1 -1h70q1 0 1 1v70q0 1 -1 1zM640 72h-70q-1 0 -1 -1v-70q0 -1 1 -1h70q1 0 1 1v70q0 1 -1 1zM428 72h-214q-1 0 -1 -1v-70q0 -1 1 -1h214q1 0 1 1v70q0 1 -1 1z
M670 768h-34q-1 0 -1 -1v-638q0 -1 1 -1h34q1 0 1 1v638q0 1 -1 1zM213 767q0 1 -1 1h-34q-1 0 -1 -1v-638q0 -1 1 -1h34q1 0 1 1v638zM1023 768h-70q-1 0 -1 -1v-766q0 -1 1 -1h70q1 0 1 1v766q0 1 -1 1zM916 72h-240q-1 0 -1 -1v-70q0 -1 1 -1h240q1 0 1 1v70q0 1 -1 1z
M916 768h-34q-1 0 -1 -1v-638q0 -1 1 -1h34q1 0 1 1v638q0 1 -1 1zM108 128h34q1 0 1 1v638q0 1 -1 1h-34q-1 0 -1 -1v-638q0 -1 1 -1zM354 128h34q1 0 1 1v638q0 1 -1 1h-34q-1 0 -1 -1v-638q0 -1 1 -1zM424 128h70q1 0 1 1v638q0 1 -1 1h-70q-1 0 -1 -1v-638q0 -1 1 -1z
M530 128h70q1 0 1 1v638q0 1 -1 1h-70q-1 0 -1 -1v-638q0 -1 1 -1zM812 128h34q1 0 1 1v638q0 1 -1 1h-34q-1 0 -1 -1v-638q0 -1 1 -1zM71 768h-70q-1 0 -1 -1v-766q0 -1 1 -1h70q1 0 1 1v766q0 1 -1 1zM178 72h-70q-1 0 -1 -1v-70q0 -1 1 -1h70q1 0 1 1v70q0 1 -1 1z
M248 128h70q1 0 1 1v638q0 1 -1 1h-70q-1 0 -1 -1v-638q0 -1 1 -1z" />
<glyph glyph-name="hourglass" unicode="&#xe653;"
d="M860 8h-92v219l-192 157l192 157v219h92q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-696q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h92v-219l192 -157l-192 -157v-219h-92q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h696q15 0 25.5 10.5
t10.5 25.5t-10.5 25.5t-25.5 10.5zM328 581v179h368v-179l-182 -147l-2 2l-2 -2zM696 8h-368v179l184 149l184 -149v-179z" />
<glyph glyph-name="key" unicode="&#xe654;"
d="M876 427q-77 78 -186.5 84t-193.5 -60l-369 369q-11 11 -26 11t-25.5 -10.5t-10.5 -25.5t11 -25l369 -370q-66 -84 -60 -193.5t84 -186.5q84 -84 203.5 -84t204 84t84 203.5t-84.5 203.5zM825 71q-63 -63 -152.5 -63t-153 63t-63.5 152.5t63.5 153t153 63.5t152.5 -63.5
t63 -153t-63 -152.5zM353 596l76 76q11 10 11 25t-10.5 25.5t-25.5 10.5t-26 -10l-76 -77zM333 768q11 11 11 25.5t-10.5 25t-25.5 10.5t-26 -10l-76 -77l51 -50z" />
<glyph glyph-name="flag" unicode="&#xe655;"
d="M888 640h-176v56q0 30 -21 51t-51 21h-360q-3 27 -23.5 45.5t-48.5 18.5h-72q-30 0 -51 -21t-21 -51v-752q0 -30 21 -51t51 -21h72q30 0 51 21t21 51v256h360v-56q0 -30 21 -51t51 -21h176q30 0 51 21t21 51v360q0 30 -21 51t-51 21zM208 8h-72v752h72v-752zM640 336
h-360v360h360v-360zM888 208h-176v360h176v-360z" />
<glyph glyph-name="layout" unicode="&#xe656;"
d="M136 624zM100 624q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5zM952 768h-880q-30 0 -51 -21t-21 -51v-624q0 -30 21 -51t51 -21h880q30 0 51 21t21 51v624q0 30 -21 51t-51 21zM256 72h-184v408h184v-408zM952 72
h-624v169q0 -1 1 -1h622q1 0 1 1v-169zM952 311q0 1 -1 1h-622q-1 0 -1 -1v169h624v-169zM952 552h-880v144h880v-144zM240 624zM204 624q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5zM344 624zM308 624
q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5z" />
<glyph glyph-name="printer" unicode="&#xe673;"
d="M392 144h240v-72h-240v72zM392 312h240v-72h-240v72zM888 648h-120v112q0 30 -21 51t-51 21h-368q-30 0 -51 -21t-21 -51v-112h-120q-30 0 -51 -21t-21 -51v-304q0 -30 21 -51t51 -21h120v-192q0 -30 21 -51t51 -21h368q30 0 51 21t21 51v192h120q30 0 51 21t21 51v304
q0 30 -21 51t-51 21zM328 759q0 1 1 1h366q1 0 1 -1v-110q0 -1 -1 -1h-366q-1 0 -1 1v110zM696 8h-368v368h368v-368zM888 272h-120v104q0 30 -21 51t-51 21h-368q-30 0 -51 -21t-21 -51v-104h-120v304h752v-304zM820 508zM784 508q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5
t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5z" />
<glyph glyph-name="USB" unicode="&#xe6d7;"
d="M768 704v-192h56v-138h-276v330h60l-96 128l-96 -128h60v-440h-276v129q37 17 50 55q6 16 6 32q0 40 -28 68t-68 28t-68 -28t-28 -68q0 -31 18 -56t46 -34v-126q0 -30 21 -51t51 -21h276v-71q-27 -11 -43.5 -35t-16.5 -54q0 -40 28 -68t68 -28t68 28t28 68q0 30 -16.5 54
t-43.5 35v181h276q30 0 51 21t21 51v138h64v192h-192zM160 456q-10 0 -17 7t-7 17t7 17t17 7t17 -7t7 -17t-7 -17t-17 -7zM888 584h-48v48h48v-48z" />
<glyph glyph-name="skin" unicode="&#xe6d8;"
d="M888 832h-259q-2 -5 -3 -11q-13 -36 -44 -58.5t-70 -22.5t-70 22.5t-44 58.5q-1 6 -3 11h-259q-30 0 -51 -21t-21 -51v-368q0 -30 21 -51t51 -21h56v-312q0 -30 21 -51t51 -21h496q30 0 51 21t21 51v312h56q30 0 51 21t21 51v368q0 30 -21 51t-51 21zM888 392h-129
q1 0 1 -1v-382q0 -1 -1 -1h-494q-1 0 -1 1v382q0 1 1 1h-129v368h210q26 -43 70 -69t96 -26t96 26t70 69h210v-368z" />
<glyph glyph-name="tool" unicode="&#xe6d9;"
d="M925 731l-167 -166l-68 67l166 166q-63 40 -139.5 32t-130.5 -63q-43 -42 -57.5 -99.5t0.5 -111.5l-189 -189q-54 15 -111.5 0.5t-99.5 -57.5q-55 -54 -63 -130.5t32 -139.5l166 166l67 -68l-166 -166q63 -42 140.5 -34t132.5 63q43 42 57.5 99.5t-0.5 111.5l189 189
q54 -16 111.5 -1t99.5 57q56 56 63.5 133.5t-33.5 140.5zM395 44q-47 -47 -114 -45l95 95q18 18 18 43t-18 43l-68 68q-18 18 -43.5 18t-43.5 -18l-95 -95q-1 67 46 114q37 37 88 44.5t96 -15.5q21 -12 39 -29q17 -17 28 -39q24 -44 16.5 -95.5t-44.5 -88.5zM468 273
q-13 21 -30 37q-17 18 -37 30l155 155q13 -21 30 -37q17 -18 37 -30zM852 501q-37 -37 -88 -44.5t-96 15.5q-21 12 -39 29q-17 17 -28 39q-24 44 -16.5 95.5t44.5 87.5q47 47 114 46l-95 -95q-18 -18 -18 -43.5t18 -43.5l68 -67q18 -18 43.5 -18t43.5 18l95 95
q1 -67 -46 -114z" />
<glyph glyph-name="car" unicode="&#xe6dc;"
d="M952 448h8l-50 242q-5 29 -30.5 49.5t-55.5 20.5h-624q-30 0 -55 -20.5t-31 -49.5l-50 -242h8q-30 0 -51 -21t-21 -51v-176q0 -28 18.5 -48.5t45.5 -23.5v0q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5h384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v0
q27 3 45.5 23.5t18.5 48.5v176q0 30 -21 51t-51 21zM182 688h656l50 -240h-752zM952 200h-64v-72q0 -23 -16.5 -39.5t-39.5 -16.5t-39.5 16.5t-16.5 39.5v72h-528v-72q0 -23 -16.5 -39.5t-39.5 -16.5t-39.5 16.5t-16.5 39.5v72h-64v176h880v-176zM192 288zM156 288
q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5zM832 288zM796 288q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5z" />
<glyph glyph-name="addusergroup" unicode="&#xe6dd;"
d="M420 470q-5 24 -5 48q0 13 1 25q-38 5 -63.5 34.5t-25.5 68.5q0 43 30.5 73.5t73.5 30.5q28 0 52 -14t37 -37q33 18 69 24q-22 45 -64.5 72t-93.5 27q-73 0 -124.5 -51.5t-51.5 -124.5q0 -70 48 -121t117 -55zM777 307q-73 35 -154 35q-146 0 -249 -103t-103 -249
q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5q0 116 82 198t198 82q28 0 56 -6q44 33 98 43zM909 142h-88v88q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-88h-88q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h88v-88q0 -15 10.5 -25.5t25.5 -10.5
t25.5 10.5t10.5 25.5v88h88q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM799 518q0 73 -51.5 124.5t-124.5 51.5t-124.5 -51.5t-51.5 -124.5t51.5 -124.5t124.5 -51.5t124.5 51.5t51.5 124.5zM623 414q-43 0 -73.5 30.5t-30.5 73.5t30.5 73.5t73.5 30.5t73.5 -30.5
t30.5 -73.5t-30.5 -73.5t-73.5 -30.5zM454 397q-24 33 -33 73q-94 -3 -172.5 -50.5t-124 -127.5t-45.5 -174q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5q0 116 82 198t198 82q11 0 23 -1z" />
<glyph glyph-name="carryout" unicode="&#xe6df;"
d="M162 312h380q14 0 24 10t10 24v4q0 14 -10 24t-24 10h-380q-14 0 -24 -10t-10 -24v-4q0 -14 10 -24t24 -10zM537.5 265.5q-10.5 -10.5 -10.5 -25.5t11 -25l84 -85l1 -1l1 -1l4 -3q10 -10 23.5 -10t23.5 10l224 224q10 10 10 24t-10 23l-3 4q-10 10 -24 10t-24 -10
l-197 -197l-63 63q-10 10 -25 10t-25.5 -10.5zM952 704h-84v28q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-28h-248v28q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-28h-248v28q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-28h-84
q-30 0 -51 -21t-21 -51v-560q0 -30 21 -51t51 -21h880q30 0 51 21t21 51v560q0 30 -21 51t-51 21zM952 72h-880v376h880v-376zM952 520h-880v112h84v-20q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v20h248v-20q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v20
h248v-20q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v20h84v-112zM162 188h252q14 0 24 10t10 24v4q0 14 -10 24t-24 10h-252q-14 0 -24 -10t-10 -24v-4q0 -14 10 -24t24 -10z" />
<glyph glyph-name="deleteuser" unicode="&#xe6e0;"
d="M722 320q-95 63 -210 63q-104 0 -192.5 -51.5t-140 -140t-51.5 -193.5v0v-1v-1q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v2v0q0 130 91.5 221.5t220.5 91.5q58 0 111 -21q46 27 99 30zM787 96l62 62q11 11 11 26t-10.5 25.5t-25.5 10.5t-26 -10l-62 -63l-62 63
q-11 10 -26 10t-25.5 -10.5t-10.5 -25.5t11 -26l62 -62l-62 -62q-11 -10 -11 -25t10.5 -25.5t25.5 -10.5t26 10l62 62l62 -62q11 -10 26 -10t25.5 10.5t10.5 25.5t-11 25zM736 607.5q0 92.5 -65.5 158.5t-158.5 66t-158.5 -66t-65.5 -158.5t65.5 -158.5t158.5 -66t158.5 66
t65.5 158.5zM512 455q-63 0 -107.5 44.5t-44.5 108t44.5 108t107.5 44.5t107.5 -44.5t44.5 -108t-44.5 -108t-107.5 -44.5z" />
<glyph glyph-name="deleteusergroup" unicode="&#xe6e1;"
d="M420 470q-5 24 -5 48q0 13 1 25q-38 5 -63.5 34.5t-25.5 68.5q0 43 30.5 73.5t73.5 30.5q28 0 52 -14t37 -37q33 18 69 24q-22 45 -64.5 72t-93.5 27q-73 0 -124.5 -51.5t-51.5 -124.5q0 -70 48 -121t117 -55zM898 44l-62 62l62 62q11 11 11 26t-10.5 25.5t-25.5 10.5
t-26 -11l-62 -62l-62 62q-11 11 -26 11t-25.5 -10.5t-10.5 -25.5t11 -26l62 -62l-62 -62q-11 -11 -11 -26t10.5 -25.5t25.5 -10.5t26 11l62 62l62 -62q11 -11 26 -11t25.5 10.5t10.5 25.5t-11 26zM777 307q-73 35 -154 35q73 0 124.5 51.5t51.5 124.5t-51.5 124.5
t-124.5 51.5t-124.5 -51.5t-51.5 -124.5t51.5 -124.5t124.5 -51.5q-146 0 -249 -103t-103 -249q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5q0 116 82 198t198 82q28 0 56 -6q44 33 98 43zM519 518q0 43 30.5 73.5t73.5 30.5t73.5 -30.5t30.5 -73.5t-30.5 -73.5
t-73.5 -30.5t-73.5 30.5t-30.5 73.5zM454 397q-24 33 -33 73q-94 -3 -172.5 -50.5t-124 -127.5t-45.5 -174q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5q0 116 82 198t198 82q11 0 23 -1z" />
<glyph glyph-name="man" unicode="&#xe6e2;"
d="M384 576q-133 0 -226.5 -93.5t-93.5 -226.5t93.5 -226.5t226.5 -93.5t226.5 93.5t93.5 226.5t-93.5 226.5t-226.5 93.5zM384 8q-103 0 -175.5 72.5t-72.5 175.5t72.5 175.5t175.5 72.5t175.5 -72.5t72.5 -175.5t-72.5 -175.5t-175.5 -72.5zM949.5 821.5
q-10.5 10.5 -25.5 10.5h-376q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h340v-340q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v376q0 15 -10.5 25.5z" />
<glyph glyph-name="isv" unicode="&#xe6e3;"
d="M860 292q-15 0 -25.5 -10.5t-10.5 -25.5v-248h-624v248q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-248q0 -30 21 -51t51 -21h624q30 0 51 21t21 51v248q0 15 -10.5 25.5t-25.5 10.5zM888 832h-752q-30 0 -51 -21t-21 -51v-204q0 -71 51 -122t123 -51
q41 0 77 18t60 50q24 -32 60 -50t77 -18q42 0 77.5 18t60.5 49q24 -31 59.5 -49t76.5 -18q72 0 123 51t51 122v204q0 30 -21 51t-51 21zM339 658v-102q0 -42 -29.5 -71.5t-72 -29.5t-72 29.5t-29.5 71.5v204h203v-102zM512 455q-42 0 -71.5 29.5t-29.5 71.5v204h202v-204
v-11q-4 -38 -33 -64t-68 -26zM888 556q0 -42 -29.5 -71.5t-72 -29.5t-72 29.5t-29.5 71.5v204h203v-204z" />
<glyph glyph-name="gift" unicode="&#xe6e4;"
d="M888 576h-248q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5h-248q-30 0 -51 -21t-21 -51v-112q0 -30 21 -51t51 -21h-8v-312q0 -30 21 -51t51 -21h624
q30 0 51 21t21 51v312h-8q30 0 51 21t21 51v112q0 30 -21 51t-51 21zM384 648q-23 0 -39.5 16.5t-16.5 39.5t16.5 39.5t39.5 16.5t39.5 -16.5t16.5 -39.5v-56h-56zM476 8h-276v312h276v-312zM476 392h-340v112h340v-112zM584 704q0 23 16.5 39.5t39.5 16.5t39.5 -16.5
t16.5 -39.5t-16.5 -39.5t-39.5 -16.5h-56v56zM824 8h-276v312h276v-312zM888 392h-340v112h340v-112z" />
<glyph glyph-name="idcard" unicode="&#xe6e5;"
d="M200 128h176q30 0 51 21t21 51v88q0 41 -19 76t-51 57q38 37 38 91q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5q0 -54 38 -91q-32 -22 -51 -57t-19 -76v-88q0 -30 21 -51t51 -21zM288 568q23 0 39.5 -16.5t16.5 -39.5t-16.5 -39.5t-39.5 -16.5t-39.5 16.5
t-16.5 39.5t16.5 39.5t39.5 16.5zM200 283v1v4q0 36 26 62t62 26t62 -26t26 -62v-4v-1v-78q0 -5 -5 -5h-166q-5 0 -5 5v78zM952 768h-880q-30 0 -51 -21t-21 -51v-624q0 -30 21 -51t51 -21h880q30 0 51 21t21 51v624q0 30 -21 51t-51 21zM952 72h-880v624h880v-624zM548 348
h248q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-248q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5zM548 184h184q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-184q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5zM548 512h312q15 0 25.5 10.5
t10.5 25.5t-10.5 25.5t-25.5 10.5h-312q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5z" />
<glyph glyph-name="medicinebox" unicode="&#xe6e6;"
d="M952 584h-120v112q0 30 -21 51t-51 21h-496q-30 0 -51 -21t-21 -51v-112h-120q-30 0 -51 -21t-21 -51v-440q0 -30 21 -51t51 -21h880q30 0 51 21t21 51v440q0 30 -21 51t-51 21zM264 696h496v-112h-496v112zM952 72h-880v440h880v-440zM388 256h88v-88q0 -15 10.5 -25.5
t25.5 -10.5t25.5 10.5t10.5 25.5v88h88q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-88v88q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-88h-88q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5z" />
<glyph glyph-name="redenvelopes" unicode="&#xe6e7;"
d="M512 457l-59 59q-11 10 -25.5 10t-25 -10.5t-10.5 -25t10 -25.5l67 -67h-115q-14 0 -24 -10t-10 -24v-4q0 -14 10 -24t24 -10h122v-64h-90q-14 0 -24 -10t-10 -24v-4q0 -14 10 -24t24 -10h90v-84q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v84h90q14 0 24 10
t10 24v4q0 14 -10 24t-24 10h-90v64h122q14 0 24 10t10 24v4q0 14 -10 24t-24 10h-114l67 68q11 10 11 25t-10.5 25.5t-25.5 10.5t-26 -10zM896 770h-1q-3 26 -23.5 44t-47.5 18h-624q-27 0 -47.5 -18t-23.5 -44h-1h1q-1 -5 -1 -10v-752q0 -30 21 -51t51 -21h624q30 0 51 21
t21 51v752q0 5 -1 10h1zM715 760l-158 -78q-19 -10 -45 -10t-45 10l-157 78h405zM824 8h-624v725l248 -126q26 -14 64 -14t64 14l248 126v-725z" />
<glyph glyph-name="rest" unicode="&#xe6e8;"
d="M275 615q15 0 25.5 10.5t10.5 25.5v209q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-209q0 -15 10.5 -25.5t25.5 -10.5zM888 471h-120q0 30 -21 51t-51 21h-496q-30 0 -51 -21t-21 -51v-248q0 -5 1 -10q-1 -10 -1 -21q0 -133 93.5 -226.5t226.5 -93.5
q119 0 208.5 77.5t107.5 193.5h124q30 0 51 21t21 51v184q0 30 -21 51t-51 21zM696 215h-1q1 -12 1 -23q0 -103 -72.5 -175.5t-175.5 -72.5t-175.5 72.5t-72.5 175.5q0 11 1 23h-1v256h496v-256zM888 223h-112v176h112v-176zM613 615q15 0 25.5 10.5t10.5 25.5v209
q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-209q0 -15 10.5 -25.5t25.5 -10.5zM443 615q15 0 25.5 10.5t10.5 25.5v209q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-209q0 -15 10.5 -25.5t25.5 -10.5z" />
<glyph glyph-name="Safety" unicode="&#xe6ea;"
d="M512 832l-384 -128v-384q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5v384zM824 320q0 -129 -91.5 -220.5t-220.5 -91.5t-220.5 91.5t-91.5 220.5v330l312 110l312 -110v-330zM378 421q-10 10 -25 10t-25.5 -10.5t-10.5 -25.5t11 -25l129 -129l2 -3
q10 -9 24 -9t24 9l224 224q10 10 10 24t-10 24l-3 3q-10 10 -24 10t-24 -10l-197 -197z" />
<glyph glyph-name="wallet" unicode="&#xe6eb;"
d="M620 384zM584 384q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5zM952 768h-880q-30 0 -51 -21t-21 -51v-624q0 -30 21 -51t51 -21h880q30 0 51 21t21 51v624q0 30 -21 51t-51 21zM952 328h-432v112h432v-112z
M952 512h-432q-30 0 -51 -21t-21 -51v-112q0 -30 21 -51t51 -21h432v-184h-880v624h880v-184z" />
<glyph glyph-name="woman" unicode="&#xe6ec;"
d="M512 320q119 0 203.5 84.5t84.5 203.5t-84.5 203.5t-203.5 84.5t-203.5 -84.5t-84.5 -203.5t84.5 -203.5t203.5 -84.5zM512 824q89 0 152.5 -63.5t63.5 -152.5t-63.5 -152.5t-152.5 -63.5t-152.5 63.5t-63.5 152.5t63.5 152.5t152.5 63.5zM860 256h-696
q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h312v-276q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v276h312q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5z" />
<glyph glyph-name="adduser" unicode="&#xe6ed;"
d="M860 132h-88v88q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-88h-88q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h88v-88q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v88h88q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM736 607.5
q0 92.5 -65.5 158.5t-158.5 66t-158.5 -66t-65.5 -158.5t65.5 -158.5t158.5 -66t158.5 66t65.5 158.5zM512 455q-63 0 -107.5 44.5t-44.5 108t44.5 108t107.5 44.5t107.5 -44.5t44.5 -108t-44.5 -108t-107.5 -44.5zM722 320q-95 63 -210 63q-104 0 -192.5 -51.5t-140 -140
t-51.5 -193.5v0v-1v-1q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v2v0q0 130 91.5 221.5t220.5 91.5q58 0 111 -21q46 27 99 30z" />
<glyph glyph-name="bank" unicode="&#xe6ee;"
d="M940 419l-402 401q-10 11 -25 11t-26 -11l-401 -401q-11 -11 -11 -26t10.5 -25.5t25.5 -10.5t25 11l377 376l376 -376q10 -11 25 -11t25.5 11t10.5 25.5t-10 25.5zM828 292q-15 0 -25.5 -10.5t-10.5 -25.5v-248h-560v248q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5
t-10.5 -25.5v-248q0 -30 21 -51t51 -21h560q30 0 51 21t21 51v248q0 15 -10.5 25.5t-25.5 10.5zM320 358v-4q0 -14 10 -24t24 -10h122v-64h-90q-14 0 -24 -10t-10 -24v-4q0 -14 10 -24t24 -10h90v-84q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v84h90q14 0 24 10
t10 24v4q0 14 -10 24t-24 10h-90v64h122q14 0 24 10t10 24v4q0 14 -10 24t-24 10h-135q2 1 2 2l85 85q11 10 11 25t-10.5 25.5t-25.5 10.5t-26 -10l-59 -60l-60 60q-10 10 -25 10t-25.5 -10.5t-10.5 -25.5t10 -25l85 -85l2 -2h-134q-14 0 -24 -10t-10 -24z" />
<glyph glyph-name="Trophy" unicode="&#xe6ef;"
d="M760 384h8q53 0 90.5 37.5t37.5 90.5v256h-128q-4 27 -24 45.5t-48 18.5h-368q-28 0 -48.5 -18.5t-23.5 -45.5h-128v-256q0 -53 37.5 -90.5t90.5 -37.5h8q19 -75 77 -127t135 -63v-186h-312q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h696q15 0 25.5 10.5
t10.5 25.5t-10.5 25.5t-25.5 10.5h-312v186q77 11 135 63t77 127zM768 696h56v-184q0 -23 -16.5 -39.5t-39.5 -16.5v240zM256 456q-23 0 -39.5 16.5t-16.5 39.5v184h56v-240zM512 264q-76 0 -130 54t-54 130v312h368v-312q0 -76 -54 -130t-130 -54z" />
<glyph glyph-name="loading1" unicode="&#xe6ae;"
d="M512 -128q-104 0 -199 40q-92 39 -163 110t-110 163q-40 95 -40 199q0 15 10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5q0 -90 35 -171q33 -79 94 -140t140 -95q81 -34 171 -34t171 35q79 33 140 94t95 140q34 81 34 171t-35 171q-33 79 -94 140t-140 95q-81 34 -171 34
q-15 0 -25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5q104 0 199 -40q92 -39 163 -110t110 -163q40 -95 40 -199t-40 -199q-39 -92 -110 -163t-163 -110q-95 -40 -199 -40z" />
<glyph glyph-name="loading2" unicode="&#xe64d;"
d="M988 348q-15 0 -25.5 10.5t-10.5 25.5q0 90 -35 171q-33 79 -94 140t-140 95q-81 34 -171 34q-15 0 -25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5q104 0 199 -40q92 -39 163 -110t110 -163q40 -95 40 -199q0 -15 -10.5 -25.5t-25.5 -10.5z" />
<glyph glyph-name="like2" unicode="&#xe69d;"
d="M958 421v3q-2 3 -2 4q-15 58 -66 77q-24 8 -50 8h-1h-87h-32.5h-32.5h-21q4 27 7 41q13 67 -5 119q-7 20 -24 66l-9 24q-16 40 -54 56q-29 13 -59 13q-34 0 -66 -17q-51 -26 -50 -83q1 -23 1 -36q1 -41 2 -62q0 -5 -2 -9q-3 -6 -10.5 -19t-11.5 -20q-35 -61 -53 -90
q-12 -18 -32.5 -30t-35.5 -15l-15 -3h-113q-30 0 -51 -21t-21 -51v-368q0 -30 21 -51t51 -21h248h80h80h50h50h94q42 0 72 10q40 13 64.5 44t28.5 73q2 23 -3 45q25 40 23 84q-1 12 -5 24q24 36 23 76q0 15 -5 30q14 21 20 45l4 5v44zM248 8h-112v368h112v-368zM888 391
l-2 -8q-3 -11 -9 -21l-19 -28l9 -32q2 -6 2 -13q1 -17 -11 -33l-18 -28l9 -32q1 -5 2 -9q1 -20 -12 -40l-16 -25l6 -25v0v-3q3 -13 2 -25v0v-1q-2 -20 -13 -33q-11 -14 -30 -21q-19 -6 -50 -6h-94h-24.5h-25h-25.5h-25h-77h-83h-64l1 388q46 22 72 62v1q19 30 53 91l1 1v0
q2 3 14 24q1 1 4 6t4 7q14 24 12 51q-1 22 -2 57v2v16v20q-1 6 2 10q2 4 9 8q16 8 32 8q15 0 31 -7q10 -4 15 -15q7 -21 9 -24q15 -41 23 -64q12 -35 2 -82q-3 -17 -7 -43l-14 -84h106h32h32h88h1v0q13 0 26 -4q15 -6 20 -27q1 0 1.5 -2t0.5 -3v-14z" />
<glyph glyph-name="dislike2" unicode="&#xe69e;"
d="M960 352v44l-4 6q-6 24 -20 44q5 14 5 30q2 40 -23 76q4 12 5 25q2 43 -23 83q5 22 2 46q-3 41 -27.5 72t-64.5 44q-30 10 -72 10h-94h-50h-51h-79h-80h-248q-30 0 -51 -21t-21 -51v-368q0 -30 21 -51t51 -21h113q6 -1 16 -3t32.5 -14.5t34.5 -30.5q18 -29 53 -90
q4 -7 11.5 -20t10.5 -18q2 -5 2 -10q-1 -20 -2 -62q0 -13 -1 -36q-1 -56 50 -83q32 -17 66 -17q30 0 59 12q38 17 54 57l9 24q15 41 24 65q18 53 5 120q-4 19 -7 41h21h32.5h32.5h87h1q26 0 50 8q52 19 66 77l2 4v3zM248 392h-112v368h112v-368zM888 363q0 -1 -1 -3
q0 -2 -1 -2q-5 -21 -20 -27q-13 -4 -26 -4v0h-1h-88h-32h-15.5h-16.5h-106l14 -84q4 -26 7 -43q10 -48 -2 -82q-8 -23 -24 -63q-1 -5 -4.5 -14t-4.5 -10q-4 -12 -14 -16q-16 -7 -31 -7q-16 0 -32 8q-7 4 -10 8q-2 3 -2 10q1 23 1 37v1q1 39 2 57q2 27 -12 51q-1 2 -4 6.5
t-4 6.5q-13 23 -14 24v0l-1 2q-34 60 -53 91h-1q-25 40 -71 62l-1 388h64h83h77h25h25.5h25h24.5h94q31 0 50 -6t30 -21q11 -13 13 -33v-1v0q1 -12 -2 -24v-4v0l-6 -25l16 -25q13 -20 12 -39q0 -5 -2 -9l-9 -33l18 -28q12 -16 11 -33q0 -7 -2 -13l-9 -32l19 -28q6 -10 9 -21
l2 -8v-14z" />
<glyph glyph-name="like1" unicode="&#xe64c;"
d="M184 448h-48q-30 0 -51 -21t-21 -51v-368q0 -30 21 -51t51 -21h48q30 0 51 21t21 51v368q0 30 -21 51t-51 21zM957 422q-11 43 -47 56q-21 6 -42 6h-226q-7 0 -8 1.5t0 8.5q2 10 4.5 26.5t5 30.5t4.5 26q12 62 -4 109q-6 17 -36 97q-10 28 -36 39q-53 22 -102 -3
q-34 -18 -33 -54q0 -10 1 -48t2 -58q1 -18 -8 -33q-73 -125 -76 -130q-4 -6 -28 -32q-17 -18 -24 -30t-7 -29q0 -284 -1 -397q0 -30 21.5 -51t51.5 -21h390q40 0 66 9q32 10 51 34t22 58q2 29 -6 50q-1 4 2 9q28 37 26 76q-1 10 -7 29q-3 7 2 13q26 33 25 69q0 7 -3.5 21
t-3.5 16q-2 6 0 9q19 21 26 53q0 1 1 2v29z" />
<glyph glyph-name="dislike1" unicode="&#xe64b;"
d="M256 392q0 -30 -21 -51t-51 -21h-48q-30 0 -51 21t-21 51v368q0 30 21 51t51 21h48q30 0 51 -21t21 -51v-368zM957 346q-11 -43 -47 -56q-21 -6 -42 -6h-226q-7 0 -8 -1.5t0 -8.5q2 -10 4.5 -26.5t5 -30.5t4.5 -26q12 -62 -4 -109q-6 -17 -36 -97q-10 -28 -36 -39
q-53 -22 -102 3q-34 18 -33 54q0 10 1 48t2 58q1 18 -8 33q-73 125 -76 130q-4 6 -28 32q-17 18 -24 30t-7 29q0 284 -1 397q0 30 21.5 51t51.5 21h390q40 0 66 -9q32 -10 51 -34t22 -58q2 -29 -6 -50q-1 -4 2 -9q28 -37 26 -76q-1 -10 -7 -29q-3 -7 2 -13q26 -33 25 -69
q0 -7 -3.5 -21t-3.5 -15q-2 -7 0 -9q19 -22 26 -54q0 -1 1 -2v-28q-2 -7 -3 -10z" />
<glyph glyph-name="bulb1" unicode="&#xe649;"
d="M640 -56h-256q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h256q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM896 522q0 155 -112.5 264.5t-271.5 109.5t-271.5 -109.5t-112.5 -264.5q0 -102 52 -188.5t140 -135.5v-62q0 -30 21 -51t51 -21h240
q30 0 51 21t21 51v62q88 49 140 135.5t52 188.5zM733 309q-43 -42 -99 -65l-1 -0.5l-1 -0.5v-107h-240v107l-1 0.5l-1 0.5q-56 23 -99 65t-67 96q-24 56 -24 117t24 117q24 54 67 96t99 65q58 24 122 24t122 -24q56 -23 99 -65t67 -96q24 -56 24 -117t-24 -117
q-24 -54 -67 -96z" />
<glyph glyph-name="rocket1" unicode="&#xe90f;"
d="M954 799l-6 21l-21 5q-27 7 -72 7q-111 0 -235 -34q-63 -18 -112 -41q-50 -25 -78 -53q-25 -25 -65 -97q-9 -17 -19 -36q-60 -18 -143 -70q-97 -61 -132 -107q-11 -14 -6 -31.5t22 -23.5q3 -1 10.5 -4t11.5 -4q79 -30 111 -46v0l192 -193q16 -33 46 -112q4 -10 9 -21
q6 -17 23 -22q5 -1 10 -1q12 0 22 7q46 34 106 132q53 84 70 143q21 11 37 19q73 40 98 65q35 35 64.5 106.5t46.5 163.5q16 83 16 152q0 47 -6 75zM293 457q-21 -47 -46 -105q-29 14 -82 34q33 27 76 54q31 19 59 34q-4 -10 -7 -17zM568 113q-27 -43 -54 -76q-20 51 -34 82
q55 23 106 46q1 0 15 7q-14 -28 -33 -59zM888 725q0 -64 -14 -140q-16 -81 -42 -145q-24 -61 -50 -87v0q-17 -17 -82 -52q-58 -32 -144 -71q-56 -25 -126 -54l-126 126q27 65 54 126q39 86 71 144q35 64 52 82q19 19 59 38q43 21 100 36q113 32 216 32q17 0 31 -1
q1 -16 1 -34zM185 144q-29 0 -51.5 -17t-31.5 -44l-37 -125q-1 -2 -1 -5q0 -7 5 -12t12 -5q3 0 5 1l124 37q27 9 44.5 32t17.5 52q0 35 -25.5 60.5t-61.5 25.5zM594.5 466.5q18.5 -18.5 45.5 -18.5t45.5 18.5t18.5 45.5t-18.5 45.5t-45.5 18.5t-45.5 -18.5t-18.5 -45.5
t18.5 -45.5z" />
<glyph glyph-name="select1" unicode="&#xe64a;"
d="M888 832h-752q-30 0 -51 -21t-21 -51v-752q0 -30 21 -51t51 -21h504q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-504v752h752v-504q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v504q0 30 -21 51t-51 21zM634 314l103 103q9 9 4.5 20t-16.5 11h-241
q-15 0 -25.5 -10.5t-10.5 -25.5v-240q0 -13 11 -17.5t20 4.5l103 104l188 -188q11 -11 26 -11t25.5 10.5t10.5 25.5t-10 26z" />
<glyph glyph-name="apple1" unicode="&#xe68c;"
d="M902 547q-21 31 -49 52.5t-55.5 31t-46.5 13.5t-36 4q-35 4 -75 -7.5t-73 -25t-48 -13.5q-17 0 -75 22.5t-94 21.5q-65 -1 -121.5 -35.5t-90.5 -92.5q-32 -56 -40 -128t5.5 -142t39.5 -133.5t60 -112.5q20 -30 34.5 -48t36 -40t44.5 -32.5t47 -9.5q29 1 77.5 21.5
t89.5 20.5q40 0 88 -20.5t81 -20.5q25 1 47 11t42.5 30.5t34 37.5t33.5 47q44 64 71 146v0q-8 3 -17.5 8t-33 22.5t-40.5 38.5t-31.5 58t-14.5 80q-1 36 11 70t24.5 53.5t34 39t26.5 23t14 9.5zM716 896q-39 -2 -81 -23.5t-70 -54.5q-27 -30 -41.5 -73t-9.5 -85
q41 -3 80.5 17.5t68.5 55.5q28 34 43 77t10 86z" />
<glyph glyph-name="apple-o" unicode="&#xe6d4;"
d="M698 577h10h2l2 -1q30 -1 59 -13q13 -5 25 -12q-4 -5 -10 -11q-30 -37 -46 -79q-21 -52 -21 -110q1 -125 88 -210q16 -15 33 -27q-18 -40 -42 -74q-37 -55 -58 -74q-21 -20 -40 -21h-2q-17 0 -47 14q-64 27 -119 27q-56 0 -122 -28q-31 -13 -48 -14h-1q-15 0 -38 22
t-61 77q-66 95 -88 218q-11 65 -5 120q7 57 31 101q25 42 65 67q41 24 86 25h1q23 0 77 -21q58 -24 90 -24q29 0 87 23q63 25 92 25zM698 649q-41 0 -103 -24t-76 -24q-17 0 -74 22.5t-93 22.5h-2q-65 -1 -121.5 -35.5t-90.5 -92.5q-32 -57 -40 -128.5t5.5 -141.5
t39.5 -133.5t60 -112.5q20 -29 34 -47.5t35 -40t43.5 -32t45.5 -10.5h3q30 1 78.5 21.5t89.5 20.5q40 0 87 -20.5t79 -20.5h3q25 1 47 11t42.5 30.5t33.5 37.5t34 47q44 64 71 146v0q-8 3 -17.5 8t-33 22.5t-40.5 38.5t-31.5 58t-15.5 80q0 36 12 70t24.5 53.5t34 39t26 23
t14.5 9.5q-21 31 -49 52.5t-55.5 31t-46.5 13.5t-36 4q-9 1 -17 1zM716 896q-39 -2 -81 -23.5t-70 -54.5q-27 -30 -41.5 -73t-9.5 -85q41 -3 80.5 17.5t68.5 55.5q28 34 43 77t10 86z" />
<glyph glyph-name="android1" unicode="&#xe938;"
d="M888 575q-26 0 -44.5 -18.5t-18.5 -44.5v-247q0 -27 18.5 -45.5t44 -18.5t44 18.5t18.5 45.5v247q0 26 -18 44.5t-44 18.5zM136.5 575q-25.5 0 -44 -18.5t-18.5 -44.5v-247q0 -27 18.5 -45.5t44 -18.5t44 18.5t18.5 45.5v247q0 26 -18.5 44.5t-44 18.5zM236 573v-452
q0 -20 14.5 -34t34.5 -14h55v-138q0 -26 18.5 -44.5t44 -18.5t44 18.5t18.5 44.5v138h97v-138q0 -26 18 -44.5t44 -18.5t44 18.5t18 44.5v138h56q20 0 34 14t14 35v451h-554zM643 807l52 75q5 8 -2 13t-13 -3l-53 -78q-55 22 -115 22t-115 -22l-53 77q-6 9 -13 3
q-7 -4 -2 -13l52 -74q-62 -29 -101.5 -80t-44.5 -114h554q-5 63 -44.5 114t-101.5 80zM395 690q-13 0 -22 9t-9 22t9 22t22 9t22 -9t9 -22t-9 -22t-22 -9zM632.5 690q-12.5 0 -21.5 9t-9 22t9 22t21.5 9t21.5 -9t9 -22t-9 -22t-21.5 -9z" />
<glyph glyph-name="android" unicode="&#xe68d;"
d="M888.5 601.5q-24.5 24.5 -60.5 24.5q-6 0 -13 -1v1h-4q-9 53 -43 100q-32 44 -81 74l29 41v4v2l1 2q1 7 1 10q0 16 -10 26.5t-26 10.5q-18 0 -30 -18l-33 -48q-53 18 -107 18t-107 -18l-33 48q-12 18 -30 18q-16 0 -26 -10.5t-10 -26.5q0 -11 7 -19l26 -37
q-50 -30 -82 -75q-34 -47 -42 -100h-6v-1q-6 1 -12 1q-37 0 -61 -24t-24 -60v-269q0 -36 24 -60.5t60 -24.5q6 0 13 1v-107q0 -25 17.5 -42.5t42.5 -17.5h37v-67q0 -36 24 -60q24 -25 60.5 -25t60.5 24q24 25 24 61v66h73v-66q0 -36 25 -60q24 -25 60 -25t61 25q24 24 24 60
v67h36q25 0 43 17.5t18 42.5v105q6 -1 12 -1q36 0 61 24q24 25 24 61v268q1 36 -23.5 60.5zM209 272q0 -12 -12 -12t-12 12v269q0 12 12 12t12 -12v-269zM358 726q66 48 154 48t154 -48q56 -42 71 -100h-450q15 58 71 100zM403 -45q-1 -10 -12 -10q-12 0 -12 12v67h24v-69z
M646 -45q-2 -10 -12 -10q-13 0 -13 12v67h25v-69zM743 96h-461v457h461v-457zM840 272q0 -12 -12.5 -12t-12.5 12v269q0 12 12.5 12t12.5 -12v-269zM585 712q-16 0 -26 -10.5t-10 -26.5t10 -26t26 -10t26.5 10t10 26t-10.5 26.5t-26 10.5zM439.5 712q-15.5 0 -26 -10.5
t-10.5 -26.5t10.5 -26t26 -10t26 10t10.5 26t-10.5 26.5t-26 10.5z" />
<glyph glyph-name="aliwangwang-o1" unicode="&#xe68f;"
d="M985 560q-37 88 -106 157q-68 69 -158 106q-92 39 -192 39q-83 0 -160 -26q-54 25 -122 40t-105 17.5t-69 2.5h-12q-25 -1 -38.5 -21.5t-4.5 -43.5l84 -211q-69 -117 -69 -253q0 -101 39 -193q38 -88 106 -157q69 -68 158 -106q92 -39 193 -39q100 0 193 39
q88 37 157 106q68 68 106 157q39 92 39 193.5t-39 192.5zM919 202q-32 -75 -91 -134t-134 -91h-1q-78 -33 -164.5 -33t-164.5 33q-76 32 -135 91t-90 134v1q-34 78 -34 164q0 117 59 216l18 30l-83 210q40 -1 82 -7q91 -14 158 -45l26 -12l28 9q65 22 136 22q86 0 164 -33
q76 -32 135 -91t91 -134v0q33 -78 33 -165q0 -86 -33 -165zM511.5 577q-20.5 0 -34.5 -14t-14 -34v-72q0 -20 14 -34.5t34.5 -14.5t34.5 14.5t14 34.5v72q0 20 -14 34t-34.5 14zM740.5 577q-20.5 0 -34.5 -14t-14 -34v-72q0 -20 14 -34.5t34.5 -14.5t34.5 14.5t14 34.5v72
q0 20 -14 34t-34.5 14z" />
<glyph glyph-name="aliwangwang" unicode="&#xe68e;"
d="M985 560q-37 88 -106 157q-68 69 -158 106q-91 39 -192 39q-83 0 -160 -26q-54 25 -122 40t-105 17.5t-69 2.5h-12q-25 -1 -38.5 -21.5t-4.5 -43.5l84 -211q-69 -117 -69 -253q0 -101 39 -193q38 -88 106 -157q69 -68 158 -106q92 -39 193 -39t193 39q88 37 157 106
q68 68 106 157q39 92 39 193.5t-39 192.5zM560 457q0 -20 -14 -34.5t-34.5 -14.5t-34.5 14.5t-14 34.5v72q0 20 14 34t34.5 14t34.5 -14t14 -34v-72zM789 457q0 -20 -14 -34.5t-34.5 -14.5t-34.5 14.5t-14 34.5v72q0 20 14 34t34.5 14t34.5 -14t14 -34v-72z" />
<glyph glyph-name="pay-circle1" unicode="&#xe6a5;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM737 419q0 -14 -10.5 -23.5t-24.5 -9.5h-154v-64h122q14 0 24.5 -10.5t10.5 -24.5v-4q0 -14 -10.5 -23.5
t-24.5 -9.5h-122v-149q0 -15 -10.5 -25.5t-25.5 -10.5t-25.5 10.5t-10.5 25.5v149h-122q-15 0 -24.5 9.5t-9.5 23.5v4q0 14 10 24.5t24 10.5h122v64h-154q-15 0 -25 10t-10 24v3q0 14 10 24.5t25 10.5h166l-2 1l-118 118q-11 11 -11 26t10.5 25.5t25.5 10.5t26 -10l93 -93
l92 92q11 11 25.5 11t25.5 -10.5t10.5 -25.5t-10.5 -25l-118 -118q-1 -1 -2 -1h167q14 0 24.5 -11t10.5 -25v-4z" />
<glyph glyph-name="pay-circle-o1" unicode="&#xe6a6;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 35q-79 33 -140 94t-94 140q-35 81 -35 171t35 171
q33 79 94 140t140 94q81 35 171 35t171 -35q79 -33 140 -94t94 -140q35 -81 35 -171t-35 -171q-33 -79 -94 -140zM702 459h-167q1 0 2 1l118 118q11 10 11 25t-10.5 25.5t-25.5 10.5t-26 -11l-92 -92l-93 93q-11 10 -26 10t-25.5 -10.5t-10.5 -25.5t11 -26l118 -118l2 -1
h-166q-14 0 -24.5 -10.5t-10.5 -24.5v-3q0 -14 10 -24t25 -10h154v-64h-123q-13 0 -23 -10.5t-10 -24.5v-4q0 -14 9.5 -23.5t23.5 -9.5h123v-149q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v149h122q14 0 24.5 9.5t10.5 23.5v4q0 14 -10.5 24.5t-24.5 10.5h-122v64
h154q14 0 24.5 9.5t10.5 23.5v4q0 14 -10.5 25t-24.5 11z" />
<glyph glyph-name="poweroff" unicode="&#xe6d5;"
d="M512 512q15 0 25.5 10.5t10.5 25.5v312q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-312q0 -15 10.5 -25.5t25.5 -10.5zM512 -128q-104 0 -199 40q-92 39 -163 110t-110 163q-40 95 -40 199q0 123 55 231q53 105 147 177q12 9 27 7t24 -14t7 -27t-14 -24
q-81 -61 -127 -151q-47 -94 -47 -199q0 -90 35 -171q33 -79 94 -140t140 -95q81 -34 171 -34t171 35q79 33 140 94t95 140q34 81 34 171q0 105 -47 199q-46 90 -127 151q-12 9 -14 24t7 27t24 14t27 -7q94 -72 147 -177q55 -109 55 -231q0 -104 -40 -200q-39 -91 -110 -162
t-163 -110q-95 -40 -199 -40z" />
<glyph glyph-name="trademark" unicode="&#xe651;"
d="M666.5 397q46.5 43 46.5 115q0 37 -14 69q-14 30 -39 51q-25 19 -59 27.5t-125 8.5h-113v-578h65v264h23l194 -264h82l-196 264q89 0 135.5 43zM516 420h-88v182h91q66 0 96 -22q31 -22 31 -69.5t-32 -69.5q-31 -22 -98 -21zM512 896q-139 0 -257 -68.5t-186.5 -186.5
t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM512 -56q-182 0 -311 129t-129 311t129 311t311 129t311 -129t129 -311t-129 -311t-311 -129z" />
<glyph glyph-name="find" unicode="&#xe6db;"
d="M521 512q-58 4 -99.5 -37.5t-37.5 -99.5l-98 -217l217 98q58 -4 99.5 37.5t37.5 99.5l98 217zM551.5 344.5q-16.5 -16.5 -39.5 -16.5t-39.5 16.5t-16.5 39.5t16.5 39.5t39.5 16.5t39.5 -16.5t16.5 -39.5t-16.5 -39.5zM512 896q-139 0 -257 -68.5t-186.5 -186.5
t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM512 -56q-182 0 -311 129t-129 311t129 311t311 129t311 -129t129 -311t-129 -311t-311 -129z" />
<glyph glyph-name="copyright" unicode="&#xe6de;"
d="M518 176q-79 0 -121 56q-42 53 -42 150q0 96 43 152q44 58 121 58q63 0 101 -29q38 -31 49 -91h80q-14 96 -74 142q-59 46 -156 46q-119 0 -185 -83q-62 -75 -62 -195q0 -121 62 -195q65 -79 184 -79q96 0 156 51q59 50 78 153h-81q-19 -136 -153 -136zM512 896
q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM512 -56q-182 0 -311 129t-129 311t129 311t311 129t311 -129t129 -311t-129 -311t-311 -129z" />
<glyph glyph-name="sound" unicode="&#xe6e9;"
d="M464 731l-233 -155h-166q-27 0 -46 -21t-19 -51v-240q0 -30 19 -51t46 -21h166l233 -155q23 -15 39.5 -5t16.5 40v624q0 30 -16.5 40t-39.5 -5zM448 134l-191 130h-185v240h185l191 127v-497zM640 232q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5
q93 0 158.5 65.5t65.5 158.5t-65.5 158.5t-158.5 65.5q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5q63 0 107.5 -44.5t44.5 -107.5t-44.5 -107.5t-107.5 -44.5zM640 768q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5q129 0 220.5 -91.5t91.5 -220.5
t-91.5 -220.5t-220.5 -91.5q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5z" />
<glyph glyph-name="earth" unicode="&#xe6f1;"
d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM394 808q-46 -39 -80 -104q-31 16 -59 36h-2q65 47 141 68zM198 692q40 -31 87 -54q-35 -94 -41 -204h-169
q17 150 123 258zM72 362h170q4 -126 43 -232q-46 -23 -87 -54q-56 56 -88.5 130t-37.5 156zM253 28h2q28 20 59 36q35 -65 80 -104q-76 21 -141 68zM481 -10q-59 19 -103 100q50 16 103 20v-120zM481 182q-67 -4 -132 -25q-32 92 -35 205h167v-180zM481 434h-165
q6 97 33 177q64 -21 132 -25v-152v0zM481 658q-53 4 -103 20q44 82 103 100v-120zM949 434h-169q-6 110 -41 204q46 23 87 54q106 -108 123 -258zM771 740h-2q-28 -20 -59 -36q-35 65 -81 104q77 -21 142 -68zM553 774q53 -22 93 -96q-45 -15 -93 -19v115zM553 587
q62 4 122 24q27 -80 33 -177h-155v153zM553 362h157q-3 -113 -35 -205q-59 19 -122 24v181zM553 -6v115q48 -4 93 -19q-40 -74 -93 -96zM630 -40q46 39 80 104q31 -16 59 -36h2q-65 -47 -141 -68zM826 76q-40 31 -87 54q39 106 43 232h169q-4 -82 -36.5 -156t-88.5 -130z
" />
<glyph glyph-name="wifi" unicode="&#xe6d6;"
d="M964 576q-92 93 -212 140.5t-241 47.5t-240.5 -47.5t-212.5 -140.5q-10 -10 -10 -25t10.5 -25.5t25.5 -10.5t25 11q82 81 188 123.5t214 42.5t214 -42.5t188 -123.5q10 -11 25 -11t25.5 10.5t10.5 25.5t-10 25zM194 422q-10 -11 -10 -26t10.5 -25.5t25.5 -10.5t25 11
q54 54 124.5 82t141.5 28t141.5 -28t124.5 -82q10 -11 25 -11t25.5 10.5t10.5 25.5t-10 26q-86 86 -201.5 116.5t-231 0t-201.5 -116.5zM693 258v0q-75 75 -181 75t-181 -75q-11 -11 -11 -26t10.5 -25.5t25.5 -10.5t26 11q54 54 130 54t130 -54v0l3 -3q10 -11 25 -11
t25.5 11t10.5 25.5t-10 25.5q-3 2 -3 3zM512 54zM458 54q0 -22 16 -38t38 -16t38 16t16 38t-16 38t-38 16t-38 -16t-16 -38z" />
<glyph glyph-name="sync" unicode="&#xe6da;"
d="M989 384q-15 1 -26 -8.5t-12 -24.5q-7 -83 -42.5 -157.5t-96.5 -131.5t-138.5 -87.5t-161.5 -30.5q-133 0 -243 73q-97 64 -149 167h100q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-184q-15 0 -25.5 -10.5t-10.5 -25.5v-184q0 -15 10.5 -25.5t25.5 -10.5
t25.5 10.5t10.5 25.5v86q59 -100 157 -165q128 -85 283 -85q98 0 188 35.5t161 101.5t112.5 153t48.5 183q2 15 -8 26.5t-25 12.5zM988 768q-15 0 -25.5 -10.5t-10.5 -25.5v-86q-59 100 -157 165q-128 85 -283 85q-98 0 -188 -35.5t-161 -101.5t-112.5 -153t-49.5 -183
q-1 -15 9 -26.5t25 -12.5h2q14 0 24.5 9.5t11.5 23.5q6 83 42 157.5t97 131.5t138.5 87.5t161.5 30.5q133 0 243 -73q97 -64 149 -167h-100q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h184q15 0 25.5 10.5t10.5 25.5v184q0 15 -10.5 25.5t-25.5 10.5z" />
<glyph glyph-name="login" unicode="&#xe657;"
d="M443 274q-11 -11 -11 -26t10.5 -25.5t25.5 -10.5t26 11l136 135q10 11 10 26t-10 26l-136 135q-11 11 -26 11t-25.5 -10.5t-10.5 -25.5t11 -26l74 -74h-481q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h481zM984 583q-39 92 -110 163t-163 110q-95 40 -199 40
q-123 0 -231 -55q-105 -53 -177 -147q-9 -12 -7 -27t14 -24t27 -7t24 14q61 81 151 127q94 47 199 47q90 0 171 -35q79 -33 140 -94t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140t-140 -94q-81 -35 -171 -35q-105 0 -199 47q-90 46 -151 127q-9 12 -24 14t-27 -7
t-14 -24t7 -27q72 -94 177 -147q108 -55 231 -55q104 0 199 40q92 39 163 110t110 163q40 95 40 199t-40 199z" />
<glyph glyph-name="logout" unicode="&#xe65a;"
d="M772 29q-116 -85 -260 -85q-90 0 -171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171q34 79 95 140t140 94q81 35 171 35q144 0 260 -85q12 -9 26.5 -6.5t23.5 14.5t7 26.5t-14 23.5q-135 99 -303 99q-104 0 -199 -40q-92 -39 -163 -110t-110 -163q-40 -95 -40 -199
t40 -199q39 -92 110 -163t163 -110q95 -40 199 -40q168 0 303 99q12 9 14 23.5t-6.5 26.5t-23.5 14.5t-27 -6.5zM1014 410l-136 135q-11 11 -26 11t-25.5 -10.5t-10.5 -25.5t11 -26l74 -74h-481q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h481l-74 -74
q-11 -11 -11 -26t10.5 -25.5t25.5 -10.5t26 11l136 135q10 11 10 26t-10 26z" />
<glyph glyph-name="reload1" unicode="&#xe616;"
d="M954 392q-2 15 -14.5 23.5t-27 6t-23 -14.5t-6.5 -27q5 -28 5 -60q0 -76 -28.5 -144.5t-81.5 -121.5t-122 -81.5t-144 -28.5t-144 28.5t-122 81.5t-81.5 122t-28.5 144t28.5 144t81.5 122t122 81.5t144 28.5h13l-82 -82q-11 -11 -11 -25.5t10.5 -25.5t25.5 -11t26 11
l135 136q11 10 11 25t-11 26l-135 135q-11 11 -26 11t-25.5 -10.5t-10.5 -25.5t11 -25l66 -67q-89 -1 -171 -35q-81 -34 -143 -96t-96 -143q-35 -83 -35 -174t35 -174q34 -81 96 -143t143 -96q83 -35 174 -35t174 35q81 34 143 96t96 142q35 83 35 175q0 37 -6 72z" />
<glyph glyph-name="message1" unicode="&#xe6ab;"
d="M292 471q-23 0 -39 -16t-16 -39t16 -39t39 -16t39 16t16 39t-16 39t-39 16zM732 471q-23 0 -39 -16t-16 -39t16 -39t39 -16t39 16t16 39t-16 39t-39 16zM512 471q-23 0 -39 -16t-16 -39t16 -39t39 -16t39 16t16 39t-16 39t-39 16zM983 604q-39 86 -110 153
q-71 66 -163 102q-94 37 -198 37t-198 -37q-92 -36 -163 -102q-71 -67 -110 -153q-41 -90 -41 -187q0 -88 33 -169.5t94 -147.5l23 -196q3 -19 20 -28q7 -4 16 -4t18 5l148 84q78 -24 160 -24q103 0 198 37q92 37 163 103t110 152q41 89 41 188q0 97 -41 187zM918 259
q-33 -73 -94 -130q-61 -56 -140 -87q-82 -33 -172 -33q-79 0 -152 25q-16 5 -30 -3l-115 -65l-18 155q-1 12 -10 21q-56 56 -85.5 127t-29.5 148q0 82 34 157q33 73 94 130t140 88q82 32 172 32t172 -32q79 -32 140 -88.5t94 -129.5q34 -75 34 -157.5t-34 -157.5z" />
<glyph glyph-name="shake" unicode="&#xe94f;"
d="M760 896h-496q-30 0 -51 -21t-21 -51v-880q0 -30 21 -51t51 -21h464q33 0 68.5 22t35.5 50v880q0 30 -21 51t-51 21zM542 -64h-60q-15 0 -24.5 9.5t-9.5 22.5t9.5 22.5t24.5 9.5h60q15 0 24.5 -9.5t9.5 -22.5t-9.5 -22.5t-24.5 -9.5zM760 65h-496v704h496v-704zM80 870
l-44 -10q-19 -12 -29 -33t-6 -44l127 -832l-75 853q-3 39 27 66zM130 886q-20 -11 -31.5 -31t-10.5 -44l54 -839v856q0 39 32 63zM988 860l-44 10q30 -26 27 -66l-75 -853l127 832q4 23 -6 44t-29 33zM936 812q1 23 -10.5 43t-31.5 31l-44 6q32 -25 32 -64v-856z" />
<glyph glyph-name="API" unicode="&#xe951;"
d="M952 722l-183 106q-8 4 -16.5 4t-15.5 -4l-183 -106q-16 -9 -16 -27v-9l-10 6q-7 4 -15.5 4t-16.5 -4l-10 -6v9q0 18 -16 27l-183 106q-8 4 -16 4t-16 -4l-183 -106q-16 -9 -16 -27v-212q0 -18 16 -27l183 -106q8 -4 16 -4t16 4l10 6v-9q0 -18 16 -27l6 -4l-6 -4
q-16 -9 -16 -27v-212q0 -18 16 -27l183 -106q8 -4 16 -4t16 4l183 106q16 9 16 27v212q0 18 -16 27l-6 4l6 4q16 9 16 27v9l10 -6q7 -4 15.5 -4t16.5 4l183 106q16 9 16 27v212q0 18 -16 27zM271 424l-143 82v166l143 82l143 -82v-28l-101 -58q-16 -9 -16 -27v-120zM414 591
v-85l-71 -40v84zM655 261v-165l-143 -82l-143 82v165l23 13l104 -60q8 -4 16 -4t16 4l104 60zM438 301l74 43l74 -43l-74 -43zM681 355l-23 -13l-130 76q-8 4 -16 4t-16 -4l-130 -76l-23 13v28l127 73q16 9 16 27v150l26 15l26 -15v-150q0 -18 16 -27l127 -74v-27zM681 466
l-71 40v86l71 -41v-85zM896 506l-143 -82l-26 15v120q0 18 -16 27l-101 58v28l143 82l143 -82v-166z" />
<glyph glyph-name="appstore-o" unicode="&#xe695;"
d="M398 760v-262h-262v262h262zM398 832h-262q-30 0 -51 -21t-21 -51v-262q0 -30 21 -51t51 -21h262q30 0 51 21t21 51v262q0 30 -21 51t-51 21zM888 760v-262h-262v262h262zM888 832h-262q-30 0 -51 -21t-21 -51v-262q0 -30 21 -51t51 -21h262q30 0 51 21t21 51v262
q0 30 -21 51t-51 21zM398 270v-262h-262v262h262zM398 342h-262q-30 0 -51 -21t-21 -51v-262q0 -30 21 -51t51 -21h262q30 0 51 21t21 51v262q0 30 -21 51t-51 21zM888 270v-262h-262v262h262zM888 342h-262q-30 0 -51 -21t-21 -51v-262q0 -30 21 -51t51 -21h262q30 0 51 21
t21 51v262q0 30 -21 51t-51 21z" />
<glyph glyph-name="appstore1" unicode="&#xe696;"
d="M398 832h-262q-30 0 -51 -21t-21 -51v-262q0 -30 21 -51t51 -21h262q30 0 51 21t21 51v262q0 30 -21 51t-51 21zM888 832h-262q-30 0 -51 -21t-21 -51v-262q0 -30 21 -51t51 -21h262q30 0 51 21t21 51v262q0 30 -21 51t-51 21zM398 342h-262q-30 0 -51 -21t-21 -51v-262
q0 -30 21 -51t51 -21h262q30 0 51 21t21 51v262q0 30 -21 51t-51 21zM888 342h-262q-30 0 -51 -21t-21 -51v-262q0 -30 21 -51t51 -21h262q30 0 51 21t21 51v262q0 30 -21 51t-51 21z" />
<glyph glyph-name="scan1" unicode="&#xe697;"
d="M768 200v368q0 30 -21 51t-51 21h-368q-30 0 -51 -21t-21 -51v-368q0 -30 21 -51t51 -21h368q30 0 51 21t21 51zM696 200h-368v368h368v-368zM100 572q15 0 25.5 10.5t10.5 25.5v152h152q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-152q-30 0 -51 -21t-21 -51
v-152q0 -15 10.5 -25.5t25.5 -10.5zM288 8h-152v152q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-152q0 -30 21 -51t51 -21h152q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM888 832h-152q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h152v-152
q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v152q0 30 -21 51t-51 21zM924 196q-15 0 -25.5 -10.5t-10.5 -25.5v-152h-152q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h152q30 0 51 21t21 51v152q0 15 -10.5 25.5t-25.5 10.5z" />
<glyph glyph-name="exception1" unicode="&#xe665;"
d="M888 832h-753q-30 0 -51 -21t-21 -51v-752q0 -30 21 -51t51 -21h277q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-277v752h753v-752h-84q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h84q30 0 51 21t21 51v752q0 30 -21 51t-51 21zM640 -28
q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5zM676 512q-15 0 -25.5 -10.5t-10.5 -25.5v-376q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v376q0 15 -10.5 25.5t-25.5 10.5zM540 640h-312q-15 0 -25.5 -10.5
t-10.5 -25.5t10.5 -25.5t25.5 -10.5h312q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM412 448h-184q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h184q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM412 256h-184q-15 0 -25.5 -10.5t-10.5 -25.5
t10.5 -25.5t25.5 -10.5h184q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5z" />
<glyph glyph-name="contacts" unicode="&#xe6f0;"
d="M256 204q0 15 -10.5 25.5t-25.5 10.5h-120q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h120q15 0 25.5 10.5t10.5 25.5zM100 526h120q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-120q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5zM888 832
h-688q-30 0 -51 -21t-21 -51v-56q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v56h688v-752h-688v54v0v1v1q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-2v0v-54q0 -30 21 -51t51 -21h688q30 0 51 21t21 51v752q0 30 -21 51t-51 21zM100 347h120
q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-120q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5zM575.5 312q-67.5 0 -115.5 48t-48 116t48 116t115.5 48t116 -48t48.5 -116t-48.5 -116t-116 -48zM576 568q-38 0 -65 -27t-27 -65t27 -65t65 -27t65 27t27 65
t-27 65t-65 27zM764 128q-13 0 -23 8t-12 21q-11 55 -54 91t-99.5 36t-99.5 -36t-54 -91q-2 -13 -12 -21t-23 -8q-3 0 -7 1q-14 2 -22.5 14.5t-5.5 27.5q15 80 78 132.5t145.5 52.5t145.5 -52.5t79 -132.5q2 -15 -6 -27.5t-23 -14.5q-3 -1 -7 -1z" />
<glyph glyph-name="solution1" unicode="&#xe66f;"
d="M959 -21q-10 50 -41.5 88t-77.5 56q28 18 43.5 47t15.5 63q0 55 -38.5 93.5t-93 38.5t-93.5 -38.5t-39 -93.5q0 -33 16 -62.5t44 -47.5q-46 -18 -77.5 -56t-41.5 -88q-3 -14 5.5 -26.5t23.5 -15.5t27 5.5t15 23.5q8 43 42 71t78.5 28t78.5 -28t42 -71q3 -13 13 -21.5
t22 -8.5q4 0 7 1q15 3 23.5 15.5t5.5 26.5zM767.5 293q24.5 0 42.5 -17.5t18 -42.5t-18 -42.5t-42.5 -17.5t-42 17.5t-17.5 42.5t17.5 42.5t42 17.5zM888 832h-752q-30 0 -51 -21t-21 -51v-752q0 -30 21 -51t51 -21h276q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5
h-276v752h752v-340q0 -15 11 -25.5t25.5 -10.5t25 10.5t10.5 25.5v340q0 30 -21 51t-51 21zM228 568h312q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-312q-14 0 -25 -10.5t-11 -25.5t11 -25.5t25 -10.5zM412 448h-184q-14 0 -25 -10.5t-11 -25.5t11 -25.5t25 -10.5
h184q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM412 256h-184q-14 0 -25 -10.5t-11 -25.5t11 -25.5t25 -10.5h184q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5z" />
<glyph glyph-name="fork" unicode="&#xe6f2;"
d="M896 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5q0 -43 26 -77t66 -46v-127l-220 -221l-220 221v127q40 12 66 46t26 77q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5q0 -43 25.5 -77t66.5 -46v-157h-1l257 -257v-108q-40 -12 -66 -46t-26 -77
q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5q0 43 -26 77t-66 46v109l256 256v0v157q40 12 66 46t26 77zM200 768q0 23 16.5 39.5t39.5 16.5t39.5 -16.5t16.5 -39.5t-16.5 -39.5t-39.5 -16.5t-39.5 16.5t-16.5 39.5zM568 0q0 -23 -16.5 -39.5t-39.5 -16.5t-39.5 16.5
t-16.5 39.5t16.5 39.5t39.5 16.5t39.5 -16.5t16.5 -39.5zM768 712q-23 0 -39.5 16.5t-16.5 39.5t16.5 39.5t39.5 16.5t39.5 -16.5t16.5 -39.5t-16.5 -39.5t-39.5 -16.5z" />
<glyph glyph-name="edit1" unicode="&#xe692;"
d="M924 8h-824q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h824q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM296 126l236 100q5 2 10 6l397 398q21 21 21 51t-21 51l-79 79q-21 21 -51 21t-51 -21l-397 -397q-5 -5 -7 -11l-100 -235q-8 -20 7 -35t35 -7z
M809 760v0l79 -79l-62 -62l-79 79zM417 368l279 279l79 -79l-279 -279l-137 -58z" />
</font>
</defs></svg>

After

Width:  |  Height:  |  Size: 140 KiB

BIN
web/client/assets/fonticon/iconfont.ttf

Binary file not shown.

BIN
web/client/assets/fonticon/iconfont.woff

Binary file not shown.

BIN
web/client/assets/images/avatar/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
web/client/assets/images/avatar/10.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
web/client/assets/images/avatar/11.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
web/client/assets/images/avatar/12.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
web/client/assets/images/avatar/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
web/client/assets/images/avatar/3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
web/client/assets/images/avatar/4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
web/client/assets/images/avatar/5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
web/client/assets/images/avatar/6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
web/client/assets/images/avatar/7.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
web/client/assets/images/avatar/8.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
web/client/assets/images/avatar/9.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
web/client/assets/images/avatar/avatar.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

BIN
web/client/assets/images/login/login_a.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

BIN
web/client/assets/images/login/login_b.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

BIN
web/client/assets/images/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

9
web/client/assets/images/logo.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 1.0 MiB

BIN
web/client/assets/images/menu/device.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 577 B

3
web/client/assets/images/menu/home.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="design-iconfont">
<path d="M19.7616274,8.25891126 L17.9386377,6.51787661 L11.9136569,0.763757181 C10.8460502,-0.254585727 9.11652554,-0.254585727 8.04891882,0.763757181 L2.04216785,6.49176109 L0.219178192,8.23279574 C-0.0905265444,8.57818243 -0.0697038513,9.09303584 0.266974106,9.41457797 C0.603652063,9.7361201 1.14274096,9.75600668 1.50438591,9.46022515 L1.77783436,9.20777511 L1.77783436,14.5179307 C1.77783436,16.4410245 3.41019491,18 5.4238137,18 L14.538762,18 C16.5523808,18 18.1847414,16.4410245 18.1847414,14.5179307 L18.1847414,9.20777511 L18.4764197,9.48634067 C18.6445204,9.63664874 18.8659608,9.72062083 19.0962362,9.72138034 C19.3366605,9.71810976 19.5659929,9.62424302 19.7342826,9.46022515 C20.0777075,9.13095892 20.0897452,8.60211993 19.7616274,8.25891126 Z M9.06979301,16.2502602 L9.06979301,13.1163979 C9.06979301,12.9240885 9.23302907,12.7681909 9.43439095,12.7681909 L10.5281848,12.7681909 C10.6248821,12.7681909 10.7176191,12.8048769 10.7859944,12.8701784 C10.8543698,12.9354799 10.8927827,13.0240476 10.8927827,13.1163979 L10.8927827,16.2502602 L9.06979301,16.2502602 Z M16.3617517,14.5092256 C16.3617517,14.9709767 16.1696873,15.4138156 15.8278104,15.740323 C15.4859335,16.0668303 15.0222489,16.2502602 14.538762,16.2502602 L12.7157724,16.2502602 L12.7157724,13.1163979 C12.7107781,11.9645231 11.7342813,11.031926 10.5281848,11.0271563 L9.43439095,11.0271563 C8.22829443,11.031926 7.25179761,11.9645231 7.24680336,13.1163979 L7.24680336,16.2502602 L5.4238137,16.2502602 C4.94032677,16.2502602 4.47664221,16.0668303 4.13476533,15.740323 C3.79288844,15.4138156 3.60082402,14.9709767 3.60082402,14.5092256 L3.60082402,7.45803531 L9.33412653,1.98248141 C9.50527482,1.81768148 9.73824912,1.72498386 9.98128785,1.72498386 C10.2243266,1.72498386 10.4573009,1.81768148 10.6284492,1.98248141 L16.3617517,7.46674049 L16.3617517,14.5092256 Z" transform="translate(2 3)" fill="#006BE3" fill-rule="nonzero"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

6
web/client/assets/images/menu/issue.svg

@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="design-iconfont">
<g stroke="#0F7EFB" fill="#0F7EFB" fill-rule="nonzero">
<path d="M19.6428571,18.3623077 C19.6428571,17.9799567 19.9466639,17.67 20.3214286,17.67 C20.6961932,17.67 21,17.9799567 21,18.3623077 L21,19.9615385 C21,20.5350649 20.5442898,21 19.9821429,21 L3.01785714,21 C2.45571017,21 2,20.5350649 2,19.9615385 L2,4.03846154 C2,3.46493507 2.45571017,3 3.01785714,3 L19.9821429,3 C20.5442898,3 21,3.46493507 21,4.03846154 L21,7.63292308 L3.35714286,7.63292308 L3.35714286,19.6153846 L19.6428571,19.6153846 L19.6428571,18.3623077 Z M19.6428571,6.24830769 L19.6428571,4.38461538 L3.35714286,4.38461538 L3.35714286,6.24830769 L19.6428571,6.24830769 Z" stroke-width=".2"/>
<path d="M14.255,9.68630769 C14.3831695,9.32689779 14.7726498,9.14154369 15.1249286,9.27230772 C15.4772073,9.40307175 15.6588838,9.80043624 15.5307143,10.1598462 L12.8164286,17.7752308 C12.6882591,18.1346407 12.2987788,18.3199948 11.9465,18.1892308 C11.5942212,18.0584667 11.4125448,17.6611022 11.5407143,17.3016923 L14.255,9.68630769 L14.255,9.68630769 Z M17.1022857,11.0785385 C16.9400999,10.8945192 16.8864592,10.6362018 16.9615697,10.4008918 C17.0366801,10.1655819 17.2291306,9.98902866 17.4664268,9.93773799 C17.7037231,9.88644732 17.9498142,9.96821151 18.112,10.1522308 L20.7930357,13.1949231 C21.0249152,13.4581131 21.0249152,13.8573485 20.7930357,14.1205385 L18.112,17.1632308 C17.9499354,17.34725 17.7039563,17.4290802 17.4667207,17.3778966 C17.229485,17.3267131 17.0370345,17.1502918 16.9618635,16.9150889 C16.8866925,16.6798861 16.9402211,16.4216346 17.1022857,16.2376154 L19.3761786,13.6580769 L17.1029643,11.0785385 L17.1022857,11.0785385 Z M9.93589286,11.0785385 C10.0980787,10.8946429 10.151784,10.6364397 10.0767785,10.4011916 C10.0017731,10.1659435 9.80945196,9.98939025 9.57226068,9.93803775 C9.3350694,9.88668525 9.08904296,9.96833517 8.92685714,10.1522308 L6.24514286,13.1949231 C6.01326337,13.4581131 6.01326337,13.8573485 6.24514286,14.1205385 L8.92685714,17.1632308 C9.08760241,17.352278 9.33583894,17.4380958 9.57611462,17.3876855 C9.8163903,17.3372752 10.0112928,17.1584859 10.0858782,16.9200658 C10.1604635,16.6816457 10.1031182,16.4207182 9.93589286,16.2376154 L7.66267857,13.6580769 L9.93589286,11.0785385 L9.93589286,11.0785385 Z" stroke-width=".5"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

3
web/client/assets/images/menu/org.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="design-iconfont">
<path d="M8.19326312,0.205274579 C8.69800611,-0.0684248598 9.30344093,-0.0684248598 9.80818392,0.205274579 L17.0897982,4.15361219 C17.6498111,4.45710382 18,5.05082771 18,5.697589 L18,14.1143251 C18,14.7478271 17.6628346,15.3341846 17.1172924,15.642096 L9.83857222,19.779011 C9.31763001,20.073663 8.68381701,20.073663 8.16287483,19.779011 L0.884154661,15.642096 C0.339558896,15.3340277 0.00129481775,14.7500895 0,14.1157984 L0,5.697589 C0,5.04935447 0.350188913,4.45710382 0.911648846,4.15213894 L8.19326312,0.205274579 Z M9.00072352,1.65643599 L8.95731167,1.66674881 L1.67859152,5.61508642 C1.64833197,5.63106061 1.62939137,5.66288643 1.62939137,5.697589 L1.62939137,14.1143251 C1.62939137,14.1482101 1.64820323,14.1791486 1.67569739,14.1953544 L8.95731167,18.3293228 C8.98335877,18.3440554 9.01808826,18.3440554 9.04413538,18.3293228 L16.3257497,14.1938812 C16.354433,14.1773752 16.3720598,14.1463964 16.3720598,14.1128518 L16.3720598,5.697589 C16.3723772,5.66320564 16.3540018,5.63145864 16.3243026,5.61508642 L9.04268831,1.66674881 C9.01643646,1.6526048 8.98501059,1.6526048 8.95875873,1.66674881 L9.00072352,1.65643599 Z M14.4633813,6.87177746 C14.6629798,7.2188939 14.5521866,7.66484345 14.2144867,7.87359447 L14.2043572,7.8794875 L9.72425436,10.5475619 L9.72570141,15.783529 C9.72776935,16.0467016 9.59177601,16.2910064 9.36894876,16.424416 C9.14612151,16.5578256 8.87031312,16.560072 8.64541793,16.430309 C8.42052274,16.300546 8.28070769,16.0584877 8.27863975,15.7953151 L8.27863975,10.5829202 L3.74933675,7.87801424 C3.41746167,7.66850264 3.30876004,7.22867341 3.50372038,6.88419971 C3.69868072,6.53972602 4.1269526,6.41490941 4.47142052,6.60217082 L4.48154995,6.60806385 L8.9674411,9.2893976 L13.4721441,6.60806385 C13.8170007,6.40265984 14.2601118,6.52071966 14.4619342,6.87177746 L14.4633813,6.87177746 Z" transform="translate(3 2)" fill="#0F7EFB" fill-rule="nonzero" stroke="#0F7EFB" stroke-width=".2"/>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

3
web/client/assets/images/menu/structure.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="design-iconfont">
<path d="M9.2678204,0.0732479433 C11.293719,-0.330786958 13.2663681,0.977516531 13.6705797,2.99047613 C14.0772117,5.00343572 12.7604986,6.96348599 10.7346,7.36511592 L10.7346,7.36511592 L10.7346,8.53633614 L16.2555972,8.53633614 C16.6549679,8.52912123 16.9841462,8.84417225 16.9914075,9.23858728 L16.9914075,9.23858728 L16.9914075,10.8234623 L19.2690306,10.8234623 C19.6659809,10.8162474 19.9927387,11.1312984 20,11.5257134 L20,11.5257134 L20,17.2976406 C19.9927387,17.6920556 19.6659809,18.0047016 19.2690306,17.9999465 L19.2690306,17.9999465 L13.2470047,17.9999465 C12.8500545,18.0047016 12.5257171,17.6920556 12.5184558,17.2976406 L12.5184558,17.2976406 L12.5184558,11.5233084 C12.5257171,11.1288934 12.8524749,10.8162474 13.2494251,10.8234623 L13.2494251,10.8234623 L15.5270483,10.8234623 L15.5270483,9.93843344 L4.47295171,9.93843344 L4.47295171,10.8234623 L6.75299528,10.8234623 C7.14994554,10.8186523 7.47428295,11.1312984 7.48154423,11.5257134 L7.48154423,11.5257134 L7.48154423,17.2976406 C7.47428295,17.6920556 7.14752511,18.0047016 6.75057485,17.9974867 L6.75057485,17.9974867 L0.730969382,17.9974867 C0.334019121,18.0022967 0.00726128525,17.6896506 0,17.2952356 L0,17.2952356 L0,11.5233084 C0.00726128525,11.1288934 0.334019121,10.8162474 0.730969382,10.8210573 L0.730969382,10.8210573 L3.00859252,10.8210573 L3.00859252,9.23618231 C3.01827423,8.84176728 3.3474525,8.52671626 3.74440276,8.53393117 L3.74440276,8.53393117 L9.2678204,8.53393117 L9.2678204,7.36511592 C7.78651821,7.07170962 6.627133,5.91972916 6.33184074,4.44788774 C5.92520876,2.43492814 7.24192182,0.474877875 9.2678204,0.0732479433 Z M6.01960547,12.2255596 L1.46193876,12.2255596 L1.46193876,16.5953894 L6.01960547,16.5953894 L6.01960547,12.2255596 Z M18.5380612,12.2255596 L13.9803945,12.2255596 L13.9803945,16.5953894 L18.5380612,16.5953894 L18.5380612,12.2255596 Z M10.0751383,1.50136969 L9.91891565,1.50179992 C8.66029287,1.54508937 7.67517851,2.59606111 7.72116665,3.84664532 C7.74537093,5.07317984 8.76437129,6.04959752 9.99636936,6.03276273 C10.0254145,6.03276273 10.0520392,6.03035776 10.0810844,6.03035776 C11.3397071,5.98706831 12.3248215,4.93609657 12.2788334,3.68551236 C12.2352656,2.43492814 11.1775384,1.45610549 9.91891565,1.50179992 Z" transform="translate(2 3)" fill="#006BE3" fill-rule="nonzero" stroke="#006BE3" stroke-width=".2"/>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

8
web/client/assets/images/menu/xun.svg

@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="design-iconfont">
<g fill="#006BE3" fill-rule="nonzero">
<path d="M16.5825673,15.8346577 C19.9218849,12.1060589 19.8029068,6.37036341 16.2177012,2.78456208 C14.4379618,0.999222942 12.0200893,-0.0029190478 9.49940669,6.3869485e-06 C7.06828832,6.3869485e-06 4.63716992,0.928195893 2.78111219,2.78456208 C-0.927037395,6.49332785 -0.927037395,12.5106516 2.78111219,16.2194173 C4.63716994,18.0757835 7.06828832,19.0000064 9.49940669,19.0000064 C11.7639558,19.0000064 14.0324708,18.1947813 15.8290396,16.5803774 L17.3797203,18.1313158 C17.4828346,18.2344473 17.6176764,18.286013 17.7564841,18.286013 C17.8952919,18.286013 18.0261678,18.2344473 18.133248,18.1313158 C18.3394766,17.9250529 18.3394766,17.5878924 18.133248,17.3816295 L16.5825673,15.8346577 L16.5825673,15.8346577 Z M12.6800869,17.3221306 C11.6710192,17.7314616 10.5922774,17.9415886 9.50337264,17.9409209 C8.40877448,17.9409209 7.33797193,17.7346564 6.32665841,17.3221306 C5.28081541,16.8989073 4.33117063,16.2688536 3.5346399,15.469731 C2.72955501,14.6645123 2.10690317,13.7244294 1.68254807,12.6772485 C1.27328501,11.6680131 1.06319297,10.5890921 1.06386056,9.5000064 C1.06386056,8.40522634 1.27009079,7.33424585 1.68254807,6.32276428 C2.10690317,5.27558336 2.72955501,4.33550048 3.5346399,3.53028181 C4.33972479,2.72506314 5.27965147,2.10230783 6.32665841,1.67788224 C7.33797193,1.26932302 8.40480855,1.05909351 9.50337264,1.05909351 C10.5979708,1.05909351 11.6687734,1.26535641 12.6800869,1.67788224 C13.7270938,2.10230784 14.6670205,2.72506316 15.4721054,3.53028181 C16.2771903,4.33550048 16.8998421,5.27558336 17.3241972,6.32276428 C17.7326885,7.33424585 17.9428831,8.40125976 17.9428831,9.5000064 C17.9428831,10.5947865 17.7366545,11.6657669 17.3241972,12.6772485 C16.9010443,13.7232653 16.2710952,14.6730679 15.4721054,15.469731 C14.6630546,16.2749497 13.7270938,16.897705 12.6800869,17.3221306 Z" stroke="#006BE3" stroke-width=".8" transform="translate(3 3)"/>
<path d="M10.7486763,11.899796 C10.8636885,12.173491 11.1690655,12.3083552 11.446681,12.213157 C11.7599899,12.1020923 11.9106954,11.7450988 11.7679217,11.4436377 L10.5583114,8.92881681 C10.4195037,8.63528881 10.4195037,8.2981283 10.5662433,8.00856691 L11.8987976,5.34698206 C12.0732988,5.00188834 11.8987976,4.58142934 11.5299656,4.4584649 C11.2047589,4.35136685 10.8557566,4.51796382 10.7328126,4.83529138 L9.59458914,7.84196994 C9.43198579,8.27432873 9.43991766,8.75032006 9.61441883,9.17474567 L10.7486763,11.899796 L10.7486763,11.899796 Z M13.2987728,11.8164975 C13.3771001,12.0042039 13.5519504,12.1339049 13.7542813,12.154386 C13.9566122,12.1748671 14.1539,12.0828361 14.2682426,11.9146329 C14.3825852,11.7464298 14.3956025,11.5290922 14.3021544,11.3484394 L13.1996244,9.17474567 C12.9742733,8.7299571 12.9728023,8.20471572 13.1956585,7.75867146 L14.3259501,5.49771265 C14.4885534,5.17245192 14.3219841,4.77975907 13.9769477,4.66869441 C13.682023,4.57534865 13.3647855,4.7236473 13.2472156,5.00982154 L12.2002087,7.56827493 C11.9779456,8.11591673 11.9822251,8.72942374 12.2121065,9.27391052 L13.2987728,11.8164975 L13.2987728,11.8164975 Z" transform="translate(3 3)"/>
<path d="M8.34928545,11.9791279 C8.45681806,12.259582 8.76782214,12.4036869 9.05125601,12.3043887 C9.36059897,12.1972906 9.51130452,11.8482303 9.3764627,11.5467691 L8.22237551,9.0081487 C8.06770403,8.66305499 8.06770403,8.26639555 8.22237551,7.92526843 L9.40819019,5.3192159 C9.5549298,4.99792175 9.41215612,4.61712869 9.09091536,4.4663981 C8.74587898,4.30773433 8.33738764,4.48226447 8.21444363,4.83925797 L7.23882353,7.67140637 C7.07225425,8.15136429 7.08415205,8.67495475 7.26261914,9.14697949 L8.34928545,11.9791279 L8.34928545,11.9791279 Z M5.38276578,6.53696038 C5.46208449,6.84238815 5.78729119,7.0169183 6.08473634,6.91378685 C6.08870227,6.91378685 6.09266822,6.90982027 6.09663414,6.90982025 C6.37821556,6.81065539 6.52892109,6.50126103 6.42977272,6.21963282 C6.27510124,5.77934084 6.12439569,5.33508227 5.96972423,4.89479029 C5.87454178,4.62109528 5.57313069,4.48226447 5.30344708,4.58936252 L5.29551521,4.59332913 C5.04962721,4.69249398 4.91875134,4.96222241 4.99807005,5.21608444 C5.1487756,5.68017599 5.27568552,6.12046797 5.38276578,6.53696038 Z" transform="translate(3 3)"/>
<path d="M14.0483346,13.6649305 C13.1441013,13.7759952 12.0415713,13.8553271 10.7367785,13.8989596 C9.12264283,13.9544919 7.77422481,13.2920707 6.69945633,12.613783 C6.46535224,12.4640185 6.32341713,12.2055043 6.32269246,11.9275622 C6.32665839,11.2651409 6.33459027,9.99583071 6.35045402,9.07558079 C6.35441995,8.69478773 6.04904294,8.37746017 5.6643472,8.37746019 L5.37483392,8.37746019 C5.11704811,8.37746019 4.76804581,8.36952699 4.33179291,8.34969402 C4.20884706,8.34424174 4.08906956,8.38959716 4.00056109,8.47511955 C3.91205262,8.56064194 3.86260266,8.67880464 3.86379085,8.80188578 L3.86379085,8.81775217 C3.86379085,9.06764762 4.07004118,9.26597734 4.3198951,9.25407754 C4.60544245,9.24217776 4.8473645,9.23424456 5.04962721,9.23027798 C5.20429869,9.22631139 5.32724268,9.34927581 5.32724269,9.50397299 L5.32724269,12.1060589 C5.32724269,12.6256828 5.10118438,13.1175405 4.71252271,13.4586676 C4.57371496,13.581632 4.42300943,13.7164963 4.25644014,13.8672268 C4.03038183,14.0734897 4.05021151,14.4344498 4.29213356,14.6208798 C4.29609949,14.6248464 4.30006544,14.6248464 4.30006542,14.628813 C4.53405561,14.8073097 4.87512604,14.7398776 5.02186566,14.482049 C5.18050307,14.208354 5.4184592,14.0020911 5.60485816,13.768062 C5.90230332,13.3912355 6.19974847,13.307937 6.62410356,13.621298 C7.04845865,13.9346589 7.52833683,14.2123206 8.0637381,14.4463496 C8.59913938,14.6843453 9.48750891,14.8073097 10.7328126,14.8231761 C11.8393086,14.8350759 12.9696002,14.8311093 14.1157555,14.8073097 C14.3576775,14.8033431 14.5678721,14.6407128 14.6392589,14.4106503 C14.6392589,14.4066837 14.6432249,14.4027171 14.6432249,14.3987505 C14.7741008,14.0060577 14.4568259,13.6133648 14.0483346,13.6649305 L14.0483346,13.6649305 Z" transform="translate(3 3)"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.9 KiB

109
web/client/assets/images/no_deploy.svg

@ -0,0 +1,109 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 289 216" class="design-iconfont">
<defs>
<linearGradient x1="50%" y1="100.122481%" x2="50%" y2="-.05772971%" id="s16v3w20r__mzg8p7mona">
<stop stop-color="#FFF" stop-opacity=".1" offset="0%"/>
<stop stop-color="#D9E9FF" offset="100%"/>
</linearGradient>
<linearGradient x1="50.0849649%" y1="100%" x2="50.0849649%" y2=".00636948%" id="s16v3w20r__qrrpjg4d7b">
<stop stop-color="#FFF" stop-opacity=".1" offset="0%"/>
<stop stop-color="#F8FBFF" stop-opacity=".27" offset="14%"/>
<stop stop-color="#EDF5FF" stop-opacity=".52" offset="37%"/>
<stop stop-color="#E4F0FF" stop-opacity=".73" offset="58%"/>
<stop stop-color="#DEECFF" stop-opacity=".88" offset="76%"/>
<stop stop-color="#DAEAFF" stop-opacity=".97" offset="91%"/>
<stop stop-color="#D9E9FF" offset="100%"/>
</linearGradient>
<linearGradient x1="50.0042217%" y1="99.9312952%" x2="50.0042217%" y2="-.08112698%" id="s16v3w20r__1nk3h4qp9c">
<stop stop-color="#FFF" stop-opacity=".1" offset="0%"/>
<stop stop-color="#FEFEFF" stop-opacity=".13" offset="9%"/>
<stop stop-color="#FBFCFF" stop-opacity=".21" offset="23%"/>
<stop stop-color="#F5F9FF" stop-opacity=".33" offset="40%"/>
<stop stop-color="#EEF5FF" stop-opacity=".51" offset="59%"/>
<stop stop-color="#E4EFFF" stop-opacity=".74" offset="79%"/>
<stop stop-color="#D9E9FF" offset="100%"/>
</linearGradient>
<linearGradient x1="50%" y1="100%" x2="50%" y2="0%" id="s16v3w20r__jbmy2wf8vd">
<stop stop-color="#FFF" stop-opacity=".1" offset="0%"/>
<stop stop-color="#FBFDFF" stop-opacity=".19" offset="13%"/>
<stop stop-color="#F1F7FF" stop-opacity=".43" offset="41%"/>
<stop stop-color="#E1EEFF" stop-opacity=".82" offset="81%"/>
<stop stop-color="#D9E9FF" offset="100%"/>
</linearGradient>
<linearGradient x1="38.5297209%" y1="49.9585765%" x2="36.5100164%" y2="46.2313867%" id="s16v3w20r__ct5ouvwmbe">
<stop stop-color="#FFF" stop-opacity="0" offset="0%"/>
<stop stop-color="#C1DDFD" offset="100%"/>
</linearGradient>
<linearGradient x1="34.2171216%" y1="2.86583353%" x2="72.5657568%" y2="101.467095%" id="s16v3w20r__pz2jpaz4zf">
<stop stop-color="#E6F3FF" offset="0%"/>
<stop stop-color="#97CAFE" offset="100%"/>
</linearGradient>
<linearGradient x1="50.0451128%" y1="137.361017%" x2="50.0451128%" y2="0%" id="s16v3w20r__ux4nc3yumg">
<stop stop-color="#3497FC" offset="0%"/>
<stop stop-color="#EEF6FF" offset="100%"/>
</linearGradient>
<linearGradient x1="88.6730138%" y1="81.4044253%" x2="14.6533158%" y2="34.7090975%" id="s16v3w20r__1docp2xuph">
<stop stop-color="#3497FC" offset="0%"/>
<stop stop-color="#C0DDFC" offset="100%"/>
</linearGradient>
<linearGradient x1="68.2776801%" y1="99.8444695%" x2="10.1282953%" y2="8.78589455%" id="s16v3w20r__y5u6bcdmci">
<stop stop-color="#3497FC" offset="0%"/>
<stop stop-color="#C0DDFC" offset="100%"/>
</linearGradient>
<linearGradient x1="82.882554%" y1="50.0725264%" x2="-19.4343222%" y2="50.0725264%" id="s16v3w20r__xhtasecgbj">
<stop stop-color="#EAF0FC" offset="0%"/>
<stop stop-color="#CFDFFA" offset="100%"/>
</linearGradient>
<linearGradient x1="50%" y1="12.9298246%" x2="50%" y2="100%" id="s16v3w20r__rzl26qsajk">
<stop stop-color="#FFCDA5" offset="0%"/>
<stop stop-color="#FFE8D1" offset="100%"/>
</linearGradient>
<linearGradient x1="85.6515158%" y1="32.8374864%" x2="25.3353236%" y2="76.3041431%" id="s16v3w20r__omw8wli05l">
<stop stop-color="#003A8C" offset="0%"/>
<stop stop-color="#5792F0" offset="100%"/>
</linearGradient>
<linearGradient x1="85.6610999%" y1="32.425376%" x2="24.5718541%" y2="76.4464813%" id="s16v3w20r__un6r3l1f0m">
<stop stop-color="#003A8C" offset="0%"/>
<stop stop-color="#5792F0" offset="100%"/>
</linearGradient>
</defs>
<g fill="none" fill-rule="evenodd">
<path fill="#E4EFFF" fill-rule="nonzero" d="M53.9345441 107.956226L55.1746352 120.792797 47.4073559 119.939561z"/>
<path fill="#F3F8FF" fill-rule="nonzero" d="M53.5675623 107.956226L61.602711 118.08885 54.7862353 120.792797z"/>
<path fill="#E4EFFF" fill-rule="nonzero" d="M26.8748438 111.165369L28.390854 127.478033 19.0165019 126.390139z"/>
<path fill="#F3F8FF" fill-rule="nonzero" d="M27.0516506 111.165369L36.9616697 124.057913 28.5702482 127.478033z"/>
<path fill="#E4EFFF" fill-rule="nonzero" d="M39.7685849 99.9340861L42.3184116 126.943415 25.1767802 125.261342z"/>
<path fill="#F3F8FF" fill-rule="nonzero" d="M39.3722072 99.9340861L57.3173032 121.158777 41.9246931 126.943415z"/>
<path d="M44.7905439,40.5744874 C43.7888545,35.2207013 39.106997,31.3779106 33.707419,31.476797 C30.817419,31.4634495 28.0292626,32.5438083 25.8945725,34.5094083 C24.7000487,33.9638109 23.4036814,33.6830827 22.0912865,33.6830827 C17.9344588,33.6162016 14.2945394,36.4829737 13.354373,40.5664501 C10.1591298,41.2778149 7.85568267,44.0910535 7.76727928,47.3883904 C7.89054091,51.4024023 11.200996,54.5632502 15.1810888,54.4696741 L42.9398227,54.4696741 C46.9225747,54.5686322 50.2356891,51.4050575 50.3535603,47.3883904 C50.2678162,44.0990907 47.97515,41.2911624 44.7905439,40.5744874 Z" fill="url(#s16v3w20r__mzg8p7mona)" fill-rule="nonzero"/>
<path d="M218.186735,53.7296767 C216.745688,51.470001 214.305611,50.0686561 211.651353,49.9724249 C210.106091,47.5843691 207.456864,46.1670216 204.63658,46.2151731 C202.37906,46.1937166 200.204193,47.0923053 198.605026,48.7128794 C197.874081,48.477504 197.110793,48.354506 196.344631,48.354506 C192.792683,48.354506 189.860279,50.8415199 189.557695,53.989092 C186.849532,54.641613 184.899627,57.0349791 184.784631,59.8509445 C184.784631,63.2418575 187.854312,66.0042894 191.571567,66.0042894 L217.637627,66.0042894 C221.408786,66.0042894 224.424564,63.2418575 224.424564,59.8509445 C224.483499,56.6285259 221.695558,53.9810548 218.186735,53.7296767 Z" fill="url(#s16v3w20r__qrrpjg4d7b)" fill-rule="nonzero"/>
<path d="M266.658381,13.8367012 C264.114089,8.60325805 258.802698,5.27118894 252.969513,5.25247372 C249.720149,5.26049658 246.559908,6.31146216 243.95668,8.25026669 C240.860405,2.22259651 234.132405,-1.02389785 227.474121,0.289138166 C220.812962,1.60485086 215.833623,7.164533 215.27086,13.9115478 C208.106593,16.1685684 203.66055,23.2953484 204.799013,30.7029285 C205.939632,38.1105086 212.321925,43.5819106 219.834775,43.589972 L262.220244,43.589972 C269.776217,43.6032953 276.201634,38.0864687 277.307754,30.6333923 C278.41675,23.1777325 273.871522,16.0402601 266.636819,13.8661232 L266.658381,13.8367012 Z" fill="url(#s16v3w20r__1nk3h4qp9c)" fill-rule="nonzero"/>
<path d="M274.266103,147.535176 C274.266103,159.026232 259.818978,170.043668 234.100781,178.167708 C208.383303,186.292465 173.502778,190.857169 137.133051,190.857169 C100.763325,190.857169 65.8828003,186.292465 40.1649627,178.167708 C14.447197,170.043668 0,159.026232 0,147.535176 C0,136.044119 14.447197,125.025967 40.1649627,116.901927 C65.8828003,108.777887 100.763325,104.212465 137.133051,104.212465 C173.502778,104.212465 208.383303,108.777887 234.100781,116.901927 C259.818978,125.025967 274.266103,136.044119 274.266103,147.535176 Z" fill="url(#s16v3w20r__jbmy2wf8vd)" fill-rule="nonzero"/>
<path fill="#E4EFFF" fill-rule="nonzero" d="M242.661534 111.165369L241.357046 128.280319 231.680109 125.47806z"/>
<path fill="#F3F8FF" fill-rule="nonzero" d="M242.353201 111.165369L250.428814 126.245183 241.054462 128.280319z"/>
<path fill-opacity=".385356" fill="url(#s16v3w20r__ct5ouvwmbe)" fill-rule="nonzero" d="M70.1477244 127.949501L154.968254 216 289 164.188704 173.356876 127.949501z"/>
<rect fill-opacity=".7" fill="url(#s16v3w20r__pz2jpaz4zf)" fill-rule="nonzero" x="65.7634917" y="23.5375411" width="115.858742" height="104.41196" rx="24"/>
<rect fill="url(#s16v3w20r__ux4nc3yumg)" fill-rule="nonzero" x="111.258891" y="24.3986707" width="9.55906491" height="21.1694353" rx="4.77953245"/>
<rect fill="url(#s16v3w20r__ux4nc3yumg)" fill-rule="nonzero" x="170.553842" y="24.3986707" width="9.55906491" height="21.1694353" rx="4.77953245"/>
<path d="M108.81522,36.3109631 C108.81522,35.5182933 108.17196,34.8757471 107.377767,34.8757471 L97.8905745,34.8757471 C92.611527,34.8757471 88.3315096,39.1488873 88.3315096,44.4199332 L88.3315096,129.671761 C88.3315096,134.942591 92.611527,139.215947 97.8905745,139.215947 L163.514633,139.215947 C164.622191,139.215947 165.325106,138.009648 164.867996,137.002126 C163.442042,133.859003 162.647849,130.369276 162.647849,126.693688 C162.647849,112.881887 173.862141,101.68505 187.695474,101.68505 C190.509289,101.68505 193.214576,102.147907 195.739463,103.002578 C196.722681,103.335548 197.793584,102.63588 197.793584,101.598937 L197.793584,44.4199332 C197.793584,39.1488873 193.513566,34.8757471 188.234519,34.8757471 L183.922159,34.8757471 C183.127966,34.8757471 182.484705,35.5182933 182.484705,36.3109631 L182.484705,40.4013285 C182.484705,44.3644621 179.266966,47.5774083 175.297438,47.5774083 C171.327911,47.5774083 168.110172,44.3644621 168.110172,40.4013285 L168.110172,36.3109631 C168.110172,35.5182933 167.466911,34.8757471 166.672718,34.8757471 L124.627207,34.8757471 C123.833014,34.8757471 123.189754,35.5182933 123.189754,36.3109631 L123.189754,40.4013285 C123.189754,44.3644621 119.972014,47.5774083 116.002487,47.5774083 C112.032959,47.5774083 108.81522,44.3644621 108.81522,40.4013285 L108.81522,36.3109631 Z" fill="url(#s16v3w20r__1docp2xuph)" fill-rule="nonzero"/>
<rect fill="#FFF" fill-rule="nonzero" x="103.856006" y="65.8764117" width="12.7214623" height="7.53488374" rx="3.76744187"/>
<rect fill="#FFF" fill-rule="nonzero" x="103.784133" y="81.5202655" width="56.5637901" height="7.53488374" rx="3.76744187"/>
<rect fill="#FFF" fill-rule="nonzero" x="103.784133" y="97.8817273" width="56.5637901" height="7.53488374" rx="3.76744187"/>
<rect fill="#FFF" fill-rule="nonzero" x="121.967918" y="65.8764117" width="12.7214623" height="7.53488374" rx="3.76744187"/>
<rect fill="#FFF" fill-rule="nonzero" x="140.079831" y="65.8764117" width="12.7214623" height="7.53488374" rx="3.76744187"/>
<path fill="url(#s16v3w20r__y5u6bcdmci)" fill-rule="nonzero" d="M187.982964 106.70830509999999A20.4477742 20.4159469 0 1 0 187.982964 147.5401989A20.4477742 20.4159469 0 1 0 187.982964 106.70830509999999Z"/>
<path d="M177.811544,116.436917 C176.661582,117.529116 176.615583,119.346099 177.710204,120.49499 L183.955939,127.051774 L177.380308,133.295681 C176.230346,134.38788 176.184347,136.204864 177.278968,137.353754 C178.37287,138.502644 180.192686,138.547854 181.343367,137.455654 L187.918279,131.211747 L194.15467,137.758485 C195.248572,138.907375 197.068388,138.952585 198.21907,137.860385 C199.369751,136.767468 199.415031,134.950485 198.321129,133.801595 L192.084738,127.255575 L198.633775,121.036784 C199.784457,119.943867 199.829736,118.126884 198.735834,116.978711 C197.641214,115.82982 195.821398,115.783893 194.670716,116.87681 L188.122397,123.095601 L181.876663,116.538099 C180.782042,115.389927 178.962226,115.344 177.811544,116.436917 Z" fill="url(#s16v3w20r__xhtasecgbj)" fill-rule="nonzero"/>
<path fill-opacity=".15" fill="#84C1FF" d="M92.4023775 133.625063L92.3283487 134.104425 92.1191992 134.580199 91.7519299 135.062432 91.1913231 135.56404 90.3662248 136.102246 89.2816663 136.631123 87.8923676 137.14493 86.4721636 137.552531 84.8485601 137.9099 82.9935265 138.212013 81.1363367 138.423707 79.139714 138.554312 76.9986272 138.604545 74.8575404 138.554312 72.8609177 138.423707 71.0034404 138.212013 69.1488381 137.9099 67.5253064 137.552531 66.1051025 137.14493 64.71566 136.631123 63.6312452 136.098658 62.805572 135.56404 62.2448933 135.062432 61.8782708 134.580199 61.6688339 134.104425 61.5948769 133.625063 61.6688339 133.145701 61.8782708 132.669209 62.2448933 132.186977 62.805572 131.686086 63.6312452 131.14788 64.71566 130.618286 66.1051025 130.105196 67.5253064 129.697595 69.1488381 129.339508 71.0034404 129.037395 72.8609177 128.825701 74.8575404 128.695096 76.9986272 128.645581 79.139714 128.695096 81.1363367 128.825701 82.9935265 129.037395 84.8485601 129.339508 86.4721636 129.697595 87.8923676 130.105196 89.2816663 130.618286 90.3662248 131.14788 91.1913231 131.686086 91.7519299 132.186977 92.1191992 132.669209 92.3283487 133.145701z"/>
<path fill="url(#s16v3w20r__rzl26qsajk)" d="M81.6473514 72.4066442L79.131808 72.4066442 79.131808 76.4970097 81.6473514 76.4970097z"/>
<path fill="url(#s16v3w20r__omw8wli05l)" fill-rule="nonzero" d="M74.0885029 130.062139L73.8261676 131.734166 72.7775454 131.848266 71.625139 132.144638 70.3461649 132.650551 69.8345752 133.020837 69.6198197 133.261236 69.5124419 133.52388 69.4777274 133.819535 69.5787804 133.915694 70.1819358 134.011136 72.0480378 134.026206 76.3151181 133.819535 76.3151181 129.448585z"/>
<path fill="url(#s16v3w20r__un6r3l1f0m)" fill-rule="nonzero" d="M82.0778687 130.062139L81.8191271 131.734166 80.7827232 131.848266 79.6435414 132.144638 78.3793012 132.650551 77.8740363 133.020837 77.6620119 133.261236 77.5556404 133.52388 77.5211415 133.819535 77.6210445 133.915694 78.2175877 134.011136 80.0618403 134.026206 84.2778911 133.819535 84.2778911 129.448585z"/>
<path fill="#153F82" fill-rule="nonzero" d="M75.1737802 97.886033L72.2931236 130.492704 77.4320194 130.477634 82.4278886 98.2340729z"/>
<path fill="#153F82" fill-rule="nonzero" d="M75.671139 98.1242788L80.2436782 130.73382 85.6053793 130.73382 85.645628 97.9664051z"/>
<path fill="#FECCA9" fill-rule="nonzero" d="M74.230092 88.471734L73.8901343 89.3235346 67.2783519 83.437714 66.9388254 82.8420994 66.4325543 82.3297273 65.8368018 82.0735413 65.7103059 82.1108569 65.6207525 82.1661127 65.5837381 82.2436143 65.7103059 82.5184582 65.8368018 82.6691559 66.0930279 83.0121725 66.157857 83.1384715 66.1454949 83.1693286 66.0930279 83.181528 65.9232646 83.181528 65.861526 83.1104848 65.5837381 82.7559864 65.1577488 82.0735413 65.071286 81.9659001 64.9694424 81.9070562 64.8213129 81.9041858 64.6978356 82.0398137 64.6514777 82.1567838 64.8089508 82.9841858 65.0743765 83.7807306 65.3460552 84.3483585 65.6670385 84.8887173 65.7627729 85.0458735 65.9016309 85.1757605 66.1764001 85.3142589 66.8122576 85.5984316 67.4265533 85.9256609 67.7043412 86.082817 73.1275653 92.2248237 73.2820915 92.3977672 73.6464859 92.7214084 73.8656976 92.8541659 74.0597538 92.9065512 74.3781497 92.8663652 74.67714 92.7429366 75.1464685 92.4070961 75.3319 92.2248237 75.671139 88.9841061z"/>
<path d="M78.4432678,77.3258469 L74.0072867,89.1627904 L68.6268269,84.1825911 C68.4996123,84.0641858 68.297722,84.0849964 68.1971721,84.2263652 L67.0383691,85.8524649 C66.9598122,85.9622589 66.9690119,86.1122389 67.0603621,86.2119864 L73.17572,92.8965047 L73.6256429,93.1935944 L74.0072867,93.3084117 L74.3450883,93.280425 L74.6713902,93.1160928 L74.9969734,92.7824051 L75.3319,92.2133419 L75.8996941,90.8175944 L77.1934021,87.1886509 L79.6931335,79.7205047 L78.4432678,77.3258469 Z" fill="#429CFD"/>
<path d="M78.1356528,76.3908037 C78.1945884,76.1439466 78.3598955,75.9358402 78.5877319,75.8217406 L82.1231485,74.0528369 C82.2323949,73.9982987 82.3653594,74.0449432 82.4156702,74.1554549 L82.8849988,75.1780462 L83.4132629,76.5443718 L84.1168963,78.7251824 L84.5373514,80.2917207 L84.9491818,82.1704183 L85.3387317,84.4036144 L85.6614399,86.9453818 L85.8828078,89.4010363 L86.0265531,91.7856476 L86.097707,93.8272423 L86.1278936,96.9918934 L86.1070505,98.2010629 L85.2618279,98.2075214 L83.1487714,98.2225911 L80.4061104,98.2441194 L77.6605745,98.2663652 L75.5511117,98.281435 L74.7058891,98.2878934 L74.8446033,97.1339798 L75.2284034,94.0432423 L75.8213529,89.5610629 L76.5796095,84.2313884 L77.0927804,81.2296343 L77.6296692,78.592425 L78.0565929,76.7165977 L78.1356528,76.3908037 Z" fill="#429CFD"/>
<path d="M80.7791296,93.4691559 L79.1720567,100.795933 L79.0275926,101.003322 L78.7501641,101.383654 L78.4023004,101.850099 C78.3131783,101.967787 78.3282716,102.133555 78.437518,102.232584 L79.7376946,103.419508 C79.9971549,103.656319 80.4132977,103.561594 80.5441059,103.2358 L81.1176498,101.804173 L83.2321437,94.1422722 L80.7791296,93.4691559 Z" fill="#FECCA9" fill-rule="nonzero"/>
<path d="M79.1943372,78.5307107 L81.0227779,88.4566642 L81.0414648,88.7042389 L81.0637453,89.2933951 L81.0227779,89.9966509 L80.764755,91.2488768 L80.2623651,93.350033 L79.647135,95.819322 L79.0441234,98.1745114 L78.5884506,99.9376742 L78.4727356,100.379721 C78.4332057,100.530418 78.4950162,100.68901 78.6258244,100.77297 L81.1420865,102.384717 C81.3339866,102.508146 81.5920095,102.422751 81.6725068,102.208903 L81.7795971,101.924013 L82.4422631,100.148651 L83.3219846,97.7870031 L84.2297364,95.3234549 L84.9743372,93.247415 L85.3732305,92.0482921 L85.6211912,90.9417406 L85.8066227,89.8229898 L85.8001542,89.3213818 L85.8066227,88.2830031 L85.6556901,86.9130894 L85.2632654,84.6447306 L84.7637503,82.1223386 L84.4022308,80.5450363 L84.1039592,79.4018868 L83.978182,78.958405" fill="#429CFD"/>
<path fill="#0D0D0D" d="M64.1313352 79.8317339L64.3631246 79.8159466 64.5377033 79.9759731 66.8404317 84.0706442 66.9036797 84.2278004 66.873565 84.3906974 66.765181 84.514126 66.6117329 84.554312 66.4611597 84.5019266 66.358813 84.3691692 64.0560846 80.2723452 64.0079299 80.034817z"/>
<path d="M82.4020144,70.0026575 C82.4020144,72.202126 81.8212833,73.9853818 80.1739617,73.9853818 C78.5266401,73.9853818 77.622482,72.202126 77.622482,70.0026575 C77.622482,67.8030455 78.5266401,66.0199332 80.1739617,66.0199332 C81.8212833,66.0199332 82.4020144,67.8030455 82.4020144,70.0026575 Z" fill="#FFE7CA" fill-rule="nonzero"/>
<path fill="#003A8C" fill-rule="nonzero" d="M79.1296518 65.682514L79.0139368 65.5434416 78.8723477 65.4444834 78.6337304 65.3695651 78.3555832 65.3776024 77.9351281 65.5220568 77.5815145 65.7760901 77.4284258 66.0301233 77.3802711 66.3109233 77.4097389 66.5596462 77.5089232 66.9099824 77.5038921 67.0463279 77.4420816 67.139904 77.3378662 67.1800183 77.1581845 67.1479412 76.9382542 67.0837871 76.6601069 67.0918243 76.3977717 67.2121671 76.1189057 67.5517392 76.0412833 67.8913831 76.1081248 68.3566801 76.3064934 68.8166668 76.6169833 69.2150828 76.8793186 69.412999 77.1689654 69.5173392 77.5010172 69.5280316 78.2053693 69.3434628 78.700572 69.0894296 79.1131211 68.7711705 79.4077991 68.4850602 79.8555658 68.1266867 80.1121512 67.9903412 80.3213007 67.9314974 80.4952325 67.9609193 80.5915419 68.1106841 80.6670082 68.6508276 80.7338498 69.1696582 80.7978165 69.3247333 80.8732828 69.3301153 80.9429993 69.22312 80.9990599 68.9958535 81.143524 68.5118269 81.2879881 68.3352954 81.5215742 68.263104 81.7594728 68.324603 81.8960308 68.4877153 81.9499353 68.7123984 81.9283735 68.9904715 81.8320642 69.2632343 81.6739443 69.5065751 81.5452922 69.6750695 81.5805098 69.846219 81.6473514 70.1056343 81.8263143 70.3890894 82.0699627 70.6057353 82.1562099 70.5896608 82.2870182 70.4104741 82.42142 70.1350562 82.5737901 69.6456475 82.6514126 69.0626628 82.6061328 68.1373791 82.5896021 67.8994203 82.6276946 67.7764223 82.8497811 67.5357366 82.9971201 67.359205 83.1228973 67.1265565 83.1573962 66.8671412 83.039525 66.5221871 82.8095325 66.2413871 82.6090077 66.1371186 82.1288983 66.1210442 81.9039368 66.1023146 81.8241582 66.0461977 81.7839095 65.7974748 81.6897563 65.4418283 81.566854 65.2171452 81.3792664 65.0058814 81.1406491 64.8561884 80.8165034 64.7999997 80.3399876 64.8828834 80.0294976 65.0513778 79.7908804 65.2920635 79.6327605 65.5407864 79.4803905 65.7305937 79.3567695 65.7787452 79.2309923 65.7520502z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 19 KiB

BIN
web/client/assets/images/no_qcoder.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

3
web/client/assets/images/search.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" class="design-iconfont">
<path d="M12.0506327,11.0902815 L15.8213146,14.8610273 C16.0670626,15.1290723 16.0582885,15.5430676 15.8014045,15.8004596 C15.5445206,16.0578516 15.1305504,16.0674368 14.862029,15.8222101 L11.0900932,12.0508373 C9.87809017,13.044408 8.3586841,13.5862707 6.79149082,13.5838392 C3.04087246,13.5838392 0,10.5429151 0,6.79160611 C0,3.04092408 3.04087246,0 6.79149082,0 C10.5427362,0 13.5836086,3.04092408 13.5836086,6.79160611 C13.5836086,8.42241921 13.0086643,9.91905545 12.0506327,11.0902815 Z M6.79149082,12.2251418 C9.79229878,12.2251418 12.2249343,9.79246501 12.2249343,6.79160611 C12.2249343,3.79074721 9.79229878,1.35807042 6.79149082,1.35807042 C3.79068287,1.35807042 1.35804737,3.79074721 1.35804737,6.79160611 C1.35804737,9.79246501 3.79068287,12.2251418 6.79149082,12.2251418 Z" fill="#646566" fill-rule="nonzero"/>
</svg>

After

Width:  |  Height:  |  Size: 917 B

6
web/client/assets/images/show_map.svg

@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" class="design-iconfont">
<g fill="none" fill-rule="evenodd">
<path d="M0,2.99610022 C0,1.34139976 1.33425951,0 2.99610022,0 L29.0038998,0 C30.6586002,0 32,1.33425951 32,2.99610022 L32,29.0038998 C32,30.6586002 30.6657405,32 29.0038998,32 L2.99610022,32 C1.34139976,32 0,30.6657405 0,29.0038998 L0,2.99610022 Z" fill="#006BE3"/>
<path d="M7,0 C2.72759022,0 0,3.32739357 0,7.45039491 C0,11.5733963 5.9580908,17.5 7,17.5 C8.0419092,17.5 14,11.57452 14,7.45039491 C14,3.32626983 11.2712456,0 7,0 Z M7,9.70349323 C5.3161069,9.7016319 3.95236417,8.38287457 3.95343444,6.75742446 C3.95450596,5.13197435 5.31998525,3.81489247 7.00387945,3.8150986 C8.68777364,3.81530473 10.0529068,5.13272087 10.0535515,6.75817119 C10.0541707,7.53978891 9.73254562,8.28951637 9.15965864,8.84188738 C8.58677167,9.3942584 7.80971987,9.70386249 7,9.70236949 L7,9.70349323 Z" transform="translate(9 7)" fill="#FFF" fill-rule="nonzero"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 992 B

42
web/client/index.ejs

@ -0,0 +1,42 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="shortcut icon" href="/assets/images/logo.png">
<link rel="stylesheet" type="text/css" href="/assets/font_sc/iconfont.css">
<script type="text/javascript">
window._AMapSecurityConfig = {
securityJsCode: 'e955cd5ddfc3a752aa27d1e1c67d182d',
}
</script>
<!-- <script src="https://webapi.amap.com/maps?v=2.0&key=00f9a29dedcdbd8befec3dfe0cef5003&plugin=AMap.AutoComplete,AMap.PlaceSearch"></script> -->
<!-- <script src="https://webapi.amap.com/loca?v=2.0.0&key=00f9a29dedcdbd8befec3dfe0cef5003"></script> -->
</head>
<style>
@font-face {
font-family: YouSheBiaoTiHei;
src: url("/assets/font_sc/YouSheBiaoTiHei-2.ttf");
}
@font-face {
font-family: PingFangSC-Medium;
src: url("/assets/font_sc/PingFang SC Medium.ttf");
}
@font-face {
font-family: PingFangSC-Regular;
src: url("/assets/font_sc/PingFang SC Regular.ttf");
}
@font-face {
font-family: D-DINExp-Italic;
src: url("/assets/font_sc/D-DINExp-Italic.otf");
}
</style>
<body style="background: transparent">
<div id='App'></div>
</body>
</html>

49
web/client/index.html

@ -0,0 +1,49 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<link rel="shortcut icon" href="/assets/images/logo.svg">
<link rel="stylesheet" type="text/css" href="/assets/font_sc/iconfont.css">
<script type="text/javascript">
window._AMapSecurityConfig = {
securityJsCode: 'e955cd5ddfc3a752aa27d1e1c67d182d',
}
</script>
<!-- <script src="https://webapi.amap.com/maps?v=2.0&key=00f9a29dedcdbd8befec3dfe0cef5003&plugin=AMap.AutoComplete,AMap.PlaceSearch"></script> -->
<!-- <script src="https://webapi.amap.com/loca?v=2.0.0&key=00f9a29dedcdbd8befec3dfe0cef5003"></script> -->
</head>
<style>
@font-face {
font-family: YouSheBiaoTiHei;
src: url("/assets/font_sc/YouSheBiaoTiHei-2.ttf");
}
@font-face {
font-family: PingFangSC-Medium;
src: url("/assets/font_sc/PingFang SC Medium.ttf");
}
@font-face {
font-family: PingFangSC-Regular;
src: url("/assets/font_sc/PingFang SC Regular.ttf");
}
@font-face {
font-family: D-DINExp-Italic;
src: url("/assets/font_sc/D-DINExp-Italic.otf");
}
</style>
<body>
<script>
window.less = {
async: false,
env: 'production'
};
</script>
<div id='App'></div>
<script type="text/javascript" src="http://localhost:5901/client/build/vendor.js"></script>
<script type="text/javascript" src="http://localhost:5901/client/build/app.js"></script>
</body>
</html>

19
web/client/index.js

@ -0,0 +1,19 @@
/**
* User: liuxinyi/liu.xinyi@free-sun.com.cn
* Date: 2016/2/22
* Time: 15:29
*
*/
'use strict';
const views = require('koa-view');
const path = require('path');
module.exports = {
entry: function (app, router, opt) {
app.use(views(__dirname));
router.get('(.*)', async function (ctx){
await ctx.render(path.join(__dirname, './index'));
});
}
};

25
web/client/src/app.js

@ -0,0 +1,25 @@
'use strict';
import React, { useEffect } from 'react';
import Layout from './layout';
import Auth from './sections/auth';
import PublicityInfoConfig from './sections/publicityInfoConfig';
import QrCode from './sections/qrCode';
import Organization from './sections/organization';
const App = props => {
const { projectName } = props
useEffect(() => {
document.title = projectName;
}, [])
return (
<Layout
title={projectName}
sections={[Auth, PublicityInfoConfig, QrCode, Organization,]}
/>
)
}
export default App;

0
web/client/src/components/README.txt

316
web/client/src/components/Upload/index.js

@ -0,0 +1,316 @@
'use strict';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { Spin, Upload, message, Modal, Card, Button } from 'antd';
import moment from 'moment';
import { PlusOutlined, UploadOutlined, CloseOutlined } from '@ant-design/icons';
class Uploads extends Component {
constructor(props) {
super(props);
this.ApiRoot = localStorage.getItem('tyApiRoot')
this.state = {
fileUploading: false,
fileList: [],
curPreviewPic: '',
delPicIng: false,
removeFilesList: []
};
}
dealName = (uploaded) => {
let realName = uploaded.split('/')[2]
let x1 = realName.split('.')
let x2 = x1[0].split('_')
let showName = `${x2[0]}.${x1[1]}`
return showName
}
// setFileList = (value) => {
// let defaultFileList = [];
// defaultFileList = value.map((u, index) => {
// let fileUrl = `${this.ApiRoot}/${u.url}`;
// return {
// uid: -index - 1,
// name: this.dealName(u.url),
// status: 'done',
// storageUrl: u.url,
// url: fileUrl
// };
// });
// onChange(defaultFileList)
// this.setState({
// fileList: defaultFileList
// });
// };
componentDidMount() {
const { value } = this.props;
if (value) {
this.setState(value);
}
}
componentWillReceiveProps(np) {
const { dispatch, value: thisEditData, onChange } = this.props;
const { value: nextEditData } = np;
const setFileList = () => {
let defaultFileList = [];
defaultFileList = nextEditData.map((u, index) => {
let fileUrl = `${this.ApiRoot}/${u.storageUrl}`;
return {
uid: -index - 1,
name: this.dealName(u.storageUrl),
status: 'done',
storageUrl: u.storageUrl,
url: fileUrl,
size: u.size || -1
};
});
this.setState({
fileList: defaultFileList
});
};
if (nextEditData && nextEditData.length) {
if (!thisEditData || !this.state.fileList.length) {
setFileList();
} else if (nextEditData.length != thisEditData.length) {
setFileList();
} else {
let repeat = true;
for (let i = 0; i < thisEditData.length; i++) {
if (thisEditData[i] != nextEditData[i]) {
repeat = false;
break;
}
}
if (!repeat) {
setFileList();
}
}
}
// else{
// this.setState({
// fileList:[],
// })
// }
}
render() {
const UploadPath = {
project: ['txt', 'dwg', 'doc', 'docx', 'xls', 'xlsx', 'pdf', 'png', 'jpg', 'rar', 'zip'],
report: ['doc', 'docx', 'xls', 'xlsx', 'pdf'],
data: ['txt', 'xls', 'xlsx'],
image: ['png', 'jpg', 'svg', 'jpeg'],
three: ['js'],
video: ['mp4']
};
/**
* uploadType string 主要区别文件上传路径 以及类型 web/routes/attachment/index.js UploadPath key 值为准默认 project
* disabled boolean 上传是否可用
* maxFilesNum number 最大上传数量
* fileTypes array[string] 可允许上传的文件类型
* maxFileSize number 单个文件最大大小 M
* listType antd upload 组件的属性
* onChange function 文件数量变化时候回调 返回文件
* value array[obj] 编辑数据 [{url:'xxx', [size:999]}]
* onStateChange function 文件状态改变回调函数 上传中 return { uploading:true/false }
*/
const {
uploadType,
disabled,
maxFilesNum,
fileTypes,
maxFileSize,
listType,
onChange,
value,
showUploadList,
onStateChange
} = this.props;
const { fileList, curPreviewPic, delPicIng, removeFilesList } = this.state;
const that = this;
let uploadType_ = uploadType || 'project';
let maxFilesNum_ = maxFilesNum || 1;
let defaultFileTypes = fileTypes || UploadPath[uploadType_];
const uploadProps = {
name: 'checkFile_',
multiple: false,
showUploadList: showUploadList || true,
action: `${this.ApiRoot}/attachments/${uploadType_}`,
listType: listType || 'text',
disabled: disabled,
beforeUpload: (file) => {
if (fileList.length >= maxFilesNum_) {
message.warning(`最多选择${maxFilesNum_}个文件上传`);
return false;
}
if (file.name.length > 60) {
message.warning(`文件名过长(大于60字符),请修改后上传`);
return false;
}
const extNames = file.name.split('.');
var reg = /^[\.\s\u4e00-\u9fa5a-zA-Z0-9_-]{0,}$/;
if (!reg.exec(file.name)) {
message.warning(`文件名包含除字母、汉字、数字、中划线、下划线之外的字符,请修改后上传`);
return false;
}
let isDAE = false;
if (extNames.length > 0) {
let fileType = extNames[extNames.length - 1].toLowerCase();
isDAE = defaultFileTypes.some((f) => f == fileType);
}
if (!isDAE) {
message.error(`只能上传 ${defaultFileTypes.join()} 格式的文件!`);
return false;
}
const isLt = file.size / 1024 / 1024 < (maxFileSize || 3);
if (!isLt) {
message.error(`文件必须小于${maxFileSize || 3}MB!`);
return false;
}
this.setState({
fileUploading: true
});
if (onStateChange) {
onStateChange({ uploading: true });
}
},
onChange(info) {
const status = info.file.status;
if (status === 'uploading') {
that.setState({
fileList: info.fileList
});
}
if (status === 'done') {
let { uploaded, url } = info.file.response;
let size = info.file.size;
let nextFileList = fileList;
nextFileList[nextFileList.length - 1] = {
uid: -moment().unix(),
name: that.dealName(uploaded),
status: 'done',
storageUrl: uploaded,
url: url,
size: size
};
onChange(nextFileList);
that.setState({
fileUploading: false,
fileList: nextFileList
});
if (onStateChange) {
onStateChange({ uploading: false });
}
} else if (status === 'error') {
that.setState({
fileUploading: false
});
message.error(`${info.file.name} 上传失败,请重试`);
if (onStateChange) {
onStateChange({ uploading: false });
}
}
},
onRemove(file) {
let nextFileList = [];
fileList.map((f, i) => {
if (f.uid != file.uid) {
nextFileList.push(f);
}
});
let nextRemoveFiles = removeFilesList.concat([file.storageUrl]);
if (curPreviewPic == file.url) {
that.setState({
curPreviewPic: ''
});
}
onChange(nextFileList);
that.setState({
fileList: nextFileList,
removeFilesList: nextRemoveFiles
});
},
onPreview(file) {
let filePostfix = file.url.split('.').pop();
filePostfix = filePostfix.toLowerCase();
if (UploadPath.image.some((img) => img == filePostfix)) {
that.setState({
curPreviewPic: file.url
});
} else {
message.warn('仅支持图片预览');
}
}
};
let fileList_ = fileList
// .map(f => {
// if (f.storageUrl) {
// let realName = f.storageUrl.split('/').pop()
// if (f.name != realName) {
// f.name = realName
// }
// }
// return f
// })
return (
<div>
<Spin spinning={delPicIng}>
<Upload {...uploadProps} fileList={fileList_}>
{
disabled ? (
''
) :
listType == 'picture-card' ?
(
fileList.length >= maxFilesNum_ ? null : (
<div style={{}}>
<PlusOutlined />
<div>上传图片</div>
</div>
)
) : (
<Button disabled={fileList.length >= maxFilesNum_} icon={<UploadOutlined />}> 文件上传 </Button>
)
}
</Upload>
{
curPreviewPic ? (
<Card
bodyStyle={{
padding: 8
}}
>
<div style={{ marginBottom: 8 }} >
<span>文件预览</span>
<span
style={{ float: 'right' }}
onClick={() => { this.setState({ curPreviewPic: '' }); }}
>
<CloseOutlined style={{ fontSize: 20 }} />
</span>
</div>
<img style={{ width: '100%' }} src={curPreviewPic}></img>
</Card>
) : ''
}
</Spin>
</div>
);
}
}
function mapStateToProps(state) {
const { auth } = state
return {
user: auth.user
};
}
export default connect(mapStateToProps)(Uploads);

389
web/client/src/components/Uploads/index.js

@ -0,0 +1,389 @@
'use strict';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { Spin, Upload, message, Modal, Card, Button } from 'antd';
import moment from 'moment';
import { PlusOutlined, UploadOutlined, CloseOutlined } from '@ant-design/icons';
class Uploads extends Component {
constructor(props) {
super(props);
this.ApiRoot = localStorage.getItem('tyApiRoot')
this.qnDomain = localStorage.getItem('qnDomain');
this.aliAdmin = localStorage.getItem('aliAdmin');
this.state = {
fileUploading: false,
fileList: [],
curPreviewPic: '',
curPreviewVideo: '',
delPicIng: false,
removeFilesList: []
};
}
dealName = (uploaded) => {
let realName = uploaded.split('/')[2]
// let x1 = realName.split('.')
// let postfix = x1.pop()
// let allName = x1.join('.')
// let x2 = allName.split('_')
// let showName = `${x2[0]}.${postfix}`
return realName
}
// setFileList = (value) => {
// let defaultFileList = [];
// defaultFileList = value.map((u, index) => {
// let fileUrl = `${this.ApiRoot}/${u.url}`;
// return {
// uid: -index - 1,
// name: this.dealName(u.url),
// status: 'done',
// storageUrl: u.url,
// url: fileUrl
// };
// });
// onChange(defaultFileList)
// this.setState({
// fileList: defaultFileList
// });
// };
setFileList = (nextEditData, isQiniu, isAli) => {
let defaultFileList = [];
defaultFileList = nextEditData.map((u, index) => {
let fileUrl =
isQiniu ? `/_file-server/${u.storageUrl}`
: isAli ? `/_file-ali-server/${u.storageUrl}`
: `${this.ApiRoot}/${u.storageUrl}`;
return {
uid: -index - 1,
name: this.dealName(u.storageUrl),
status: 'done',
storageUrl: u.storageUrl,
url: fileUrl,
size: u.size || -1
};
});
this.setState({
fileList: defaultFileList
});
};
componentDidMount() {
const { value, defaultValue, isQiniu, isAli } = this.props;
if (defaultValue) {
this.setFileList(defaultValue, isQiniu, isAli)
}
}
UNSAFE_componentWillReceiveProps(np) {
const { dispatch, value: thisEditData, onChange } = this.props;
const { value: nextEditData, isQiniu, isAli } = np;
// this.setFileList(nextEditData, isQiniu)
// const setFileList = () => {
// let defaultFileList = [];
// defaultFileList = nextEditData.map((u, index) => {
// let fileUrl = isQiniu ? `/_file-server/${u.storageUrl}` : `${this.ApiRoot}/${u.storageUrl}`;
// return {
// uid: -index - 1,
// name: this.dealName(u.storageUrl),
// status: 'done',
// storageUrl: u.storageUrl,
// url: fileUrl,
// size: u.size || -1
// };
// });
// this.setState({
// fileList: defaultFileList
// });
// };
if (nextEditData && nextEditData.length) {
if (!thisEditData || !this.state.fileList.length) {
this.setFileList(nextEditData, isQiniu, isAli);
} else if (nextEditData.length != thisEditData.length) {
this.setFileList(nextEditData, isQiniu, isAli);
} else {
let repeat = true;
for (let i = 0; i < thisEditData.length; i++) {
if (thisEditData[i] != nextEditData[i]) {
repeat = false;
break;
}
}
if (!repeat) {
this.setFileList(nextEditData, isQiniu, isAli);
}
}
}
// else{
// this.setState({
// fileList:[],
// })
// }
}
render() {
const UploadPath = {
project: ['txt', 'dwg', 'doc', 'docx', 'xls', 'xlsx', 'csv', 'pdf', 'pptx', 'png', 'jpg', 'svg', 'jpeg', 'rar', 'zip', 'jpeg', 'mp4'],
report: ['doc', 'docx', 'xls', 'xlsx', 'csv', 'pdf'],
data: ['txt', 'xls', 'xlsx', 'csv'],
image: ['png', 'jpg', 'svg', 'jpeg'],
three: ['js'],
video: ['mp4']
};
/**
* uploadType string 主要区别文件上传路径 以及类型 web/routes/attachment/index.js UploadPath key 值为准默认 project
* disabled boolean 上传是否可用
* maxFilesNum number 最大上传数量
* fileTypes array[string] 可允许上传的文件类型
* maxFileSize number 单个文件最大大小 M
* listType antd upload 组件的属性
* onChange function 文件数量变化时候回调 返回文件
* value array[obj] 编辑数据 [{url:'xxx', [size:999]}]
* onStateChange function 文件状态改变回调函数 上传中 return { uploading:true/false }
*/
const {
uploadType,
disabled,
maxFilesNum,
fileTypes,
maxFileSize,
listType,
onChange = () => { },
value,
showUploadList,
onStateChange,
isQiniu,
isAli,
} = this.props;
const { fileList, curPreviewPic, curPreviewVideo, delPicIng, removeFilesList } = this.state;
const that = this;
let uploadType_ = uploadType || 'project';
let maxFilesNum_ = maxFilesNum || 1;
let defaultFileTypes = fileTypes || UploadPath[uploadType_];
// debugger
const uploadProps = {
name: 'checkFile_',
multiple: false,
showUploadList: showUploadList || true,
action:
isQiniu ? `/_upload/attachments/${uploadType_}`
: isAli ? `/_upload/attachments/ali/${uploadType_}`
: `${this.ApiRoot}/attachments/${uploadType_}`,
listType: listType || 'text',
disabled: disabled,
beforeUpload: (file) => {
if (fileList.length >= maxFilesNum_) {
message.warning(`最多选择${maxFilesNum_}个文件上传`);
return false;
}
if (file.name.length > 60) {
message.warning(`文件名过长(大于60字符),请修改后上传`);
return false;
}
const extNames = file.name.split('.');
// var reg = /^[\.\s\u4e00-\u9fa5a-zA-Z0-9_-]{0,}$/;
// if (!reg.exec(file.name)) {
// message.warning(`文件名包含除字母、汉字、数字、中划线、下划线之外的字符,请修改后上传`);
// return false;
// }
let isDAE = false;
if (extNames.length > 0) {
let fileType = extNames[extNames.length - 1].toLowerCase();
isDAE = defaultFileTypes.some((f) => f == fileType);
}
if (!isDAE) {
message.error(`只能上传 ${defaultFileTypes.join()} 格式的文件!`);
return false;
}
const isLt = file.size / 1024 / 1024 < (maxFileSize || 3);
if (!isLt) {
message.error(`文件必须小于${maxFileSize || 3}MB!`);
return false;
}
this.setState({
fileUploading: true
});
if (onStateChange) {
onStateChange({ uploading: true });
}
},
onChange(info) {
const status = info.file.status;
if (status === 'uploading') {
that.setState({
fileList: info.fileList
});
}
if (status === 'done') {
let { uploaded, url } = info.file.response;
let size = info.file.size;
let nextFileList = fileList;
nextFileList[nextFileList.length - 1] = {
uid: -moment().unix(),
name: that.dealName(uploaded),
status: 'done',
storageUrl: uploaded,
url:
isQiniu ? '/_file-server/' + uploaded :
isAli ? `/_file-ali-server/${uploaded}` :
url,
size: size
};
onChange(nextFileList);
that.setState({
fileUploading: false,
fileList: nextFileList
});
if (onStateChange) {
onStateChange({ uploading: false });
}
} else if (status === 'error') {
that.setState({
fileUploading: false
});
message.error(`${info.file.name} 上传失败,请重试`);
if (onStateChange) {
onStateChange({ uploading: false });
}
}
},
onRemove(file) {
let nextFileList = [];
fileList.map((f, i) => {
if (f.uid != file.uid) {
nextFileList.push(f);
}
});
let nextRemoveFiles = removeFilesList.concat([file.storageUrl]);
if (curPreviewPic == file.url) {
that.setState({
curPreviewPic: ''
});
}
if (curPreviewVideo == file.url) {
that.setState({
curPreviewVideo: ''
});
}
onChange(nextFileList);
that.setState({
fileList: nextFileList,
removeFilesList: nextRemoveFiles
});
},
onPreview(file) {
let filePostfix = file.url.split('.').pop();
filePostfix = filePostfix.toLowerCase();
if (UploadPath.image.some((img) => img == filePostfix)) {
that.setState({
curPreviewPic: file.url
});
} else if (UploadPath.video.some((img) => img == filePostfix)) {
that.setState({
curPreviewVideo: file.url
});
} else {
//message.warn('仅支持图片预览');
preview(file.storageUrl)
}
}
};
const preview = (url) => {
let link = isQiniu ? encodeURI(`${this.qnDomain}/${url}`) :
isAli ? encodeURI(`${this.aliAdmin}/${url}`) : ''
if (link)
if (url.indexOf("pdf") !== -1 || url.indexOf("csv") !== -1) {
window.open(link)
} else {
window.open(`https://view.officeapps.live.com/op/view.aspx?src=${link}`)
}
}
let fileList_ = fileList
// .map(f => {
// if (f.storageUrl) {
// let realName = f.storageUrl.split('/').pop()
// if (f.name != realName) {
// f.name = realName
// }
// }
// return f
// })
//下载文件
const handleDownload = (file) => {
saveAs(file)
};
const saveAs = (file) => {
const link = document.createElement('a');
link.href = file.url;
link.download = file.name;
link.style.display = 'none';
link.click();
}
//自定义下载
return (
<div>
<Spin spinning={delPicIng}>
<Upload {...uploadProps} fileList={fileList_} showUploadList={{ showDownloadIcon: true }} onDownload={handleDownload}>
{
disabled ? (
''
) :
listType == 'picture-card' ?
(
fileList.length >= maxFilesNum_ ? null : (
<div style={{}}>
<PlusOutlined />
<div>添加附件</div>
</div>
)
) : (
<Button disabled={fileList.length >= maxFilesNum_} icon={<UploadOutlined />}> 文件上传 </Button>
)
}
</Upload>
{
curPreviewPic ? (
<Card bodyStyle={{ padding: 8 }}>
<div style={{ marginBottom: 8 }} >
<span>图片预览</span>
<span style={{ float: 'right' }} onClick={() => { this.setState({ curPreviewPic: '' }) }}>
<CloseOutlined style={{ fontSize: 20 }} />
</span>
</div>
<img style={{ width: '100%' }} src={curPreviewPic} />
</Card>
) : ''
}
{
curPreviewVideo ? (<Card bodyStyle={{ padding: 8 }}>
<div style={{ marginBottom: 8 }} >
<span>视频预览</span>
<span style={{ float: 'right' }} onClick={() => { this.setState({ curPreviewVideo: '' }) }}>
<CloseOutlined style={{ fontSize: 20 }} />
</span>
</div>
<video controls style={{ width: '100%' }}>
<source src={curPreviewVideo} type="video/mp4"></source>
</video>
</Card>) : ''
}
</Spin>
</div>
);
}
}
function mapStateToProps(state) {
const { auth } = state
return {
user: auth.user
};
}
export default connect(mapStateToProps)(Uploads);

683
web/client/src/components/export/index.js

@ -0,0 +1,683 @@
/**
* Created by Xumeng 2020/04/22.
*/
import React, { useState, useEffect } from 'react';
import PropTypes from 'prop-types';
import {
Row, Col, Space, Button, message, notification, Form, Input, Tooltip, Menu, Dropdown,
} from 'antd';
import moment from 'moment';
import XLSX from 'xlsx';
import { fromJS } from 'immutable';
import { Request } from '@peace/utils';
import FileSaver from 'file-saver';
import './index.less';
// 通用前端导入导出组件 使用方法查看底部propTypes
function ExportAndImport(props) {
const [form] = Form.useForm();
const [exportLoading, setExportLoading] = useState(false);
const [importLoading, setImportLoading] = useState(false);
const {
importDataCallback, onImportSucess, handelData, importMethod = 'post',
} = props;
useEffect(() => () => {
// 只有unmount 时调用
notification.close('import-notification');
});
const importExcel = (file, type) => {
setImportLoading(true);
// 获取上传的文件对象
const { files } = file.target;
// 判断xls、xlsx格式
if (files[0].type.indexOf('sheet') > -1 || files[0].type.indexOf('ms-excel') > -1) {
// 通过FileReader对象读取文件
const fileReader = new FileReader();
fileReader.onload = (event) => {
try {
const { importRequest = true, importUrl, importQuery } = props;
if (importRequest && !importUrl) {
message.error('获取导入接口失败!');
form.resetFields();
return;
}
const { result } = event.target;
// 以二进制流方式读取得到整份excel表格对象
const workbook = XLSX.read(result, { type: 'binary', cellDates: true });
let data = []; // 存储获取到的数据
// 遍历每张工作表进行读取(这里默认只读取第一张表)
for (const sheet in workbook.Sheets) {
if (workbook.Sheets.hasOwnProperty(sheet)) {
// 利用 sheet_to_json 方法将 excel 转成 json 数据
data = data.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet]));
break; // 如果只取第一张表,就取消注释这行
}
}
if (data.length > 10000) {
message.error('一次最多导入10000条数据,请分批导入!');
form.resetFields();
setImportLoading(false);
return;
}
if (importRequest) {
message.success('获取文件数据成功,开始处理导入...');
const importData = handelData ? handelData(data) : data;
Request[importMethod](importUrl, { data: importData }, importQuery || {}).then((res) => {
message.success('导入数据成功');
form.resetFields();
notification.close('import-notification');
setImportLoading(false);
onImportSucess && onImportSucess();
}, (err) => {
if (err.status === 500) {
message.error('数据导入出错,导入失败');
} else if (err.status === 400) {
message.error(err.body.message || '数据验证出错,请检查数据格式是否正确');
} else {
message.error('导入失败');
}
form.resetFields();
setImportLoading(false);
});
} else {
form.resetFields();
setImportLoading(false);
importDataCallback && importDataCallback(data, type);
notification.close('import-notification');
}
} catch (e) {
console.log(e);
// 这里可以抛出文件类型错误不正确的相关提示
message.error('文件格式不正确!');
setImportLoading(false);
form.resetFields();
}
};
// fileReader.onloadend = (event) => {
// console.log(event)
// }
// 以二进制方式打开文件
fileReader.readAsBinaryString(files[0]);
} else {
message.error('文件格式不正确!');
form.resetFields();
setImportLoading(false);
}
};
const loop = (data, keypath, values) => { // deal with array
const dkey = keypath.slice(0, 1)[0];
console.log(dkey);
if (dkey) {
const dvalue = data[dkey];
const otherKeypath = keypath.slice(1);
if (Array.isArray(dvalue)) {
if (otherKeypath.length) {
const immutableData = fromJS(data);
for (let index = 0; index < dvalue.length; index++) {
const tmp = immutableData.getIn([dkey, index]).toJS();
loop(tmp, otherKeypath, values);
}
}
} else {
values.push(dvalue);
}
}
return values;
};
const getColumnData = (opts) => {
const {
data, keypath, render, spliter, rawdata,
} = opts;
let v = null;
const outer = data[keypath[0]];
if (Array.isArray(outer)) {
const values = loop(data, keypath, []);
v = rawdata ? values : values.join(spliter || ',');
} else {
v = fromJS(data).getIn(keypath);
}
// 处理render
if (render && typeof render === 'function') {
v = render(outer, data);
}
return v;
};
const getDataSource = (attrs, filterData) => {
// let token = JSON.parse(sessionStorage.getItem('user')).token;
const dataSource = filterData.map((item) => {
const record = {};
attrs.forEach((attr) => {
const {
key, dataIndex, render, child,
} = attr;
if (child) {
record[key] = getDataSource(child, item[key]);
} else {
const v = getColumnData({
data: item,
keypath: dataIndex || [key],
render: render || null,
});
record[key] = v;
}
});
return record;
});
return dataSource;
};
// 暂时只处理两层
const getFlatData = (attrs, filterData, dataToAoa, deep = 0) => {
filterData.map((item) => {
let cur = dataToAoa[deep];
if (!cur) {
cur = dataToAoa[deep] = [];
}
attrs.map((attr, index) => {
const { key, child } = attr;
if (child) {
if (Array.isArray(item[key])) {
// getFlatData(child,item[key],dataToAoa,deep)
item[key].map((s, i) => {
if (i == 0) {
child.map((c) => {
cur.push(s[c.key]);
});
} else {
deep++;
const childCur = dataToAoa[deep] = [];
pushNull(childCur, index);
child.map((c) => {
childCur.push(s[c.key]);
});
}
});
}
} else {
cur.push(item[key]);
}
});
deep++;
});
};
const getHeader = (headers, excelHeader, deep, perOffset) => {
let offset = 0;
let cur = excelHeader[deep];
if (!cur) {
cur = excelHeader[deep] = [];
}
pushNull(cur, perOffset - cur.length);
for (let i = 0; i < headers.length; i++) {
const head = headers[i];
cur.push(head.name);
if (head.hasOwnProperty('child') && Array.isArray(head.child) && head.child.length > 0) {
const childOffset = getHeader(head.child, excelHeader, deep + 1, cur.length - 1);
pushNull(cur, childOffset - 1);
offset += childOffset;
} else {
offset++;
}
}
return offset;
};
const pushNull = (arr, count) => {
for (let i = 0; i < count; i++) {
arr.push(null);
}
};
const fillNull = (arr) => {
const max = Math.max(...(arr.map((a) => a.length)));
arr.filter((e) => e.length < max).forEach((e) => pushNull(e, max - e.length));
};
const doMerges = (arr) => {
// 要么横向合并 要么纵向合并
const deep = arr.length;
const merges = [];
for (let y = 0; y < deep; y++) {
// 先处理横向合并
const row = arr[y];
let colSpan = 0;
for (let x = 0; x < row.length; x++) {
if (row[x] === null) {
colSpan++;
if (((x + 1) === row.length) && (colSpan > 0 && x > colSpan)) {
merges.push({ s: { r: y, c: x - colSpan }, e: { r: y, c: x } });
}
} else if (colSpan > 0 && x > colSpan) {
merges.push({ s: { r: y, c: x - colSpan - 1 }, e: { r: y, c: x - 1 } });
colSpan = 0;
} else {
colSpan = 0;
}
}
}
// 再处理纵向合并
const colLength = arr[0].length;
for (let x = 0; x < colLength; x++) {
let rowSpan = 0;
for (let y = 0; y < deep; y++) {
if (arr[y][x] != null) {
rowSpan = 0;
} else {
rowSpan++;
}
}
if (rowSpan > 0) {
merges.push({ s: { r: deep - rowSpan - 1, c: x }, e: { r: deep - 1, c: x } });
}
}
return merges;
};
// 内容暂只出了纵向合并
const doContetMerges = (arr, headerLength) => {
const deep = arr.length;
const merges = [];
// 处理纵向合并
const colLength = arr[0].length;
for (let x = 0; x < colLength; x++) {
let rowSpan = 0;
const mergY = 0;
for (let y = 0; y < deep; y++) {
if (rowSpan > 0) {
// 如果还有null 继续加
if (arr[y][x] === null) {
rowSpan += 1;
} else {
// 不为null 增加merge
merges.push({ s: { r: headerLength + (y - rowSpan - 1), c: x }, e: { r: headerLength + y - 1, c: x } });
rowSpan = 0;
}
} else if (arr[y][x] === null) {
rowSpan += 1;
}
}
if (rowSpan > 0) {
merges.push({ s: { r: headerLength + (deep - rowSpan - 1), c: x }, e: { r: headerLength + deep - 1, c: x } });
rowSpan = 0;
}
}
return merges;
};
const exportMergeExcel = async () => {
setExportLoading(true);
const {
column, data, fileName, exportUrl, exportQuery, exportBody, requestType, header, showYearMouth,
} = props || {};
let resultData = [];
if (exportUrl) {
resultData = requestType == 'post' ? await Request.post(exportUrl, exportBody || {}, exportQuery || {}).then((data) => {
// 数据接口返回的结果 如果是对象 必须把返回数组放入rows
if (typeof data === 'object' && data.rows) {
return data.rows;
}
return data;
}, (err) => {
message.error('获取数据失败,导出失败!');
}) : await Request.get(exportUrl, exportQuery || {}).then((data) => {
if (typeof data === 'object' && data.rows) {
return data.rows;
}
return data;
}, (err) => {
message.error('获取数据失败,导出失败!');
});
if (!resultData) {
return;
}
} else {
resultData = data;
}
const excelHeader = [];
getHeader(column, excelHeader, 0, 0);
fillNull(excelHeader);
// console.log(excelHeader);
const loopData = getDataSource(column, resultData);
// console.log(loopData)
const dataToAoa = [];
getFlatData(column, loopData, dataToAoa, 0);
fillNull(dataToAoa);
// console.log(dataToAoa);
const aoa = [].concat(excelHeader, dataToAoa);
// console.log(aoa)
const headerMerges = doMerges(excelHeader);
const contentMerages = doContetMerges(dataToAoa, excelHeader.length);
const merges = [].concat(headerMerges, contentMerages);
// console.log(contentMerages)
// let opts = {
// defaultCellStyle: {
// font: { name: "宋体", sz: 11, color: { auto: 1 } },
// border: {
// color: { auto: 1 }
// },
// alignment: {
// /// 自动换行
// wrapText: 1,
// // 居中
// horizontal: "center",
// vertical: "center",
// indent: 0
// }
// }
// }
const sheet = XLSX.utils.aoa_to_sheet(aoa);
// let newSheet = {};
// for (let [key, value] of Object.entries(sheet)) {
// if(key == '!ref'){
// newSheet[key] = value
// }else if(typeof value === 'object'){
// newSheet[key] = {
// ...value,
// s: opts.defaultCellStyle
// }
// }
// }
const wpx = column.map((c) => ({
wpx: Number.parseInt(c.wpx) ? Number.parseInt(c.wpx) : 100,
}));
sheet['!cols'] = wpx;
sheet['!merges'] = merges;
// 构建 workbook 对象
const workbook = XLSX.utils.book_new();
const time = moment().format('YYYY-MM-DD');
XLSX.utils.book_append_sheet(workbook, sheet, 'mySheet');
// 导出 Excel
XLSX.writeFile(workbook, fileName ? `${fileName}-${time}.xlsx` : '导出数据.xlsx');
setExportLoading(false);
// message.success(`成功导出了 ${loopData.length || 0} 条数据`);
};
const exportProExcel = async () => {
setExportLoading(true);
const {
column, data, fileName, exportUrl, exportQuery, exportBody, requestType, showYearMouth,
} = props || {};
let resultData = [];
if (exportUrl) {
resultData = requestType == 'post' ? await Request.post(exportUrl, exportBody || {}, exportQuery || {}).then((data) => {
// 数据接口返回的结果 如果是对象 必须把返回数组放入rows
if (typeof data === 'object') {
return data.data ? data.data : data.rows;
}
return data;
}, (err) => {
message.error('获取数据失败,导出失败!');
}) : await Request.get(exportUrl, exportQuery || {}).then((data) => {
if (showYearMouth) {
}
if (typeof data === 'object' && data.rows) {
return data.rows;
}
return data;
}, (err) => {
message.error('获取数据失败,导出失败!');
});
if (!resultData) {
return;
}
} else {
resultData = data;
}
const loopData = getDataSource(column, resultData);
let content = '';
let header = '<tr>';
// header += `<th><div>序号</div></th>`;
column.map((colum) => {
header += `<th><div>${colum.name}</div></th>`;
});
header += '</tr>';
loopData.map((data) => {
content += '<tr>';
column.map((c) => {
if (c.style) {
content += `<th style="${c.style}"><div>${data[c.dataIndex || c.key]}</div></th>`;
} else {
content += `<th><div>${data[c.dataIndex || c.key]}</div></th>`;
}
});
content += '</tr>';
});
const exportTable = `\uFEFF
<table style='text-alagin:center' border="1">
${header}
${content}
</table>
`;
const time = moment().format('YYYY-MM-DD');
const tempStrs = new Blob([exportTable], { type: 'text/xls' });
FileSaver.saveAs(tempStrs, fileName ? `${fileName}-${time}.xls` : '导出数据.xls');
setExportLoading(false);
// message.success(`成功导出了 ${loopData.length || 0} 条数据`);
};
const exportExcel = async () => {
setExportLoading(true);
const {
column, data, fileName, exportUrl, exportQuery, exportBody, requestType,
} = props || {};
const _headers = column
.map((item, i) => ({ key: item.key, title: item.name, position: String.fromCharCode(65 + i) + 1 }))
.reduce((prev, next) => ({ ...prev, [next.position]: { key: next.key, v: next.title } }), {});
let resultData = [];
if (exportUrl) {
resultData = requestType == 'post' ? await Request.post(exportUrl, exportBody || {}, exportQuery || {}).then((data) => {
// 数据接口返回的结果 如果是对象 必须把返回数组放入rows
if (typeof data === 'object' && (data.rows || data.data)) {
return data.data ? data.data : data.rows;
}
return data;
}, (err) => {
message.error('获取数据失败,导出失败!');
}) : await Request.get(exportUrl, exportQuery || {}).then((data) => {
if (typeof data === 'object' && data.rows) {
return data.rows;
}
return data;
}, (err) => {
message.error('获取数据失败,导出失败!');
});
if (!resultData) {
return;
}
} else {
resultData = data;
}
const loopDate = getDataSource(column, resultData);
const wpx = column.map((c) => ({
wpx: Number.parseInt(c.wpx) ? Number.parseInt(c.wpx) : 100,
}));
if (!(loopDate.length > 0)) {
setExportLoading(false);
return;
}
const _data = loopDate
.map((item, i) => column.map((key, j) => ({ content: item[key.key], position: String.fromCharCode(65 + j) + (i + 2) })))
// 对刚才的结果进行降维处理(二维数组变成一维数组)
.reduce((prev, next) => prev.concat(next))
// 转换成 worksheet 需要的结构
.reduce((prev, next) => ({ ...prev, [next.position]: { v: next.content } }), {});
// 合并 column 和 data
const output = { ..._headers, ..._data };
// 获取所有单元格的位置
const outputPos = Object.keys(output);
// 计算出范围 ,["A1",..., "H2"]
const ref = `${outputPos[0]}:${outputPos[outputPos.length - 1]}`;
// 构建 workbook 对象
const workbook = {
SheetNames: ['mySheet'],
Sheets: {
mySheet: {
...output,
'!ref': ref,
'!cols': wpx,
},
},
};
const time = moment().format('YYYY-MM-DD');
// 导出 Excel
XLSX.writeFile(workbook, fileName ? `${fileName}-${time}.xlsx` : '导出数据.xlsx');
setExportLoading(false);
// message.success(`成功导出了 ${loopDate.length || 0} 条数据`);
};
const exportTemplete = async () => {
const { importTemColumn, importTemData, fileName } = props || {};
const _headers = importTemColumn
.map((item, i) => {
let group = 0; // 用于处理Z1的时候,重计算AA1
if (parseInt(i / 26) > group) {
group = parseInt(i / 26);
}
if (group > 0) { // AA1 BA1 CA1
const position = String.fromCharCode(65 + (group - 1));
return { key: item.key, title: item.name, position: position + String.fromCharCode(65 + (i % 26)) + 1 };
} return { key: item.key, title: item.name, position: String.fromCharCode(65 + i) + 1 };
})
.reduce((prev, next) => ({ ...prev, [next.position]: { key: next.key, v: next.title } }), {});
const loopDate = getDataSource(importTemColumn, importTemData);
const wpx = importTemColumn.map((c) => ({
wpx: Number.parseInt(c.wpx) ? Number.parseInt(c.wpx) : 100,
}));
const _data = loopDate.length ? loopDate
.map((item, i) => importTemColumn.map((key, j) => ({ content: item[key.key], position: String.fromCharCode(65 + j) + (i + 2) })))
// 对刚才的结果进行降维处理(二维数组变成一维数组)
.reduce((prev, next) => prev.concat(next))
// 转换成 worksheet 需要的结构
.reduce((prev, next) => ({ ...prev, [next.position]: { v: next.content } }), {}) : [];
// 合并 column 和 data
const output = { ..._headers, ..._data };
// 获取所有单元格的位置
const outputPos = Object.keys(output);
// 计算出范围 ,["A1",..., "H2"]
const ref = `${outputPos[0]}:${outputPos[outputPos.length - 1]}`;
// 构建 workbook 对象
const workbook = {
SheetNames: ['mySheet'],
Sheets: {
mySheet: {
...output,
'!ref': ref,
'!cols': wpx,
},
},
};
// 导出 Excel
XLSX.writeFile(workbook, fileName ? `${fileName}-导入模板.xlsx` : '导入模板.xlsx');
};
const tips = (type) => {
const { tips, templeteBth = true } = props;
const description = (
<div className="export-import">
{tips && tips}
<Row gutter={16}>
<Col span={12}>
<Form form={form} initialValues={{}}>
<Form.Item name="import-file">
<Input className="file-uploader" type="file" accept=".xlsx, .xls" onChange={(e) => importExcel(e, type)} />
<Button style={props.btnStyle} className={props.btnClass} loading={importLoading}>
选择文件
</Button>
</Form.Item>
</Form>
</Col>
{templeteBth && (
<Col span={12}>
<Button style={props.btnStyle} className={props.btnClass} onClick={exportTemplete}>
模板下载
</Button>
</Col>
)}
</Row>
</div>
);
notification.info({
message: '支持 .xlsx、.xls 格式的文件',
description,
key: 'import-notification',
duration: null,
});
};
return (
<Space>
{
props.import && (
<Button style={props.btnStyle} className={props.btnClass} loading={importLoading} onClick={tips}>
{props.importBtnName || '导入'}
</Button>
)
}
{
props.export && (
<Tooltip placement="top" title={props.exportBtnTips || '默认导出所有数据'}>
<Button style={props.btnStyle} className={props.btnClass} loading={exportLoading} onClick={props.exportType === 'pro' ? exportProExcel : exportExcel}>
{props.exportBtnName || '导出'}
</Button>
</Tooltip>
)
}
</Space>
);
}
ExportAndImport.propTypes = {
export: PropTypes.bool, // 是否显示导出按钮
exportBtnName: PropTypes.string, // 导出按钮文字
importBtnName: PropTypes.string, // 导入按钮文字
import: PropTypes.bool, // 是否显示导入按钮
variedImport: PropTypes.bool, // 是否显示多样导入
variedImportDisable: PropTypes.bool, // 多样导入禁用
variedImportBtnName: PropTypes.string, // 多样导入文字
column: PropTypes.array, // 导出显示的header数组 兼容antd column 可直接拿table的column使用 注:column每列的属性wpx设置导出的execl每列的宽度值 默认 100
data: PropTypes.array, // 导出的数据 兼容antd table 数组嵌套处理
exportUrl: PropTypes.string, // 导出数据从接口获取的url地址 返回的数据1、数组必须支持column的设置 ,2、如果是对象,数组需放在rows属性上
exportBody: PropTypes.object, // 导出数据接口body参数
exportQuery: PropTypes.object, // 导出数据从接口获取的url地址上的参数
exportBtnTips: PropTypes.string, // 导出按钮tips文字提示
importUrl: PropTypes.string, // 导入接口url
importQuery: PropTypes.object, // 导入接口url地址上的参数
btnClass: PropTypes.string, // 按钮className
btnStyle: PropTypes.object, // 按钮style
tips: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), // 上传文件提示的信息
onImportSucess: PropTypes.func, // 上传成功后 返回处理函数
importTemColumn: PropTypes.array, // 导入模板设置 头部字段数组
importTemData: PropTypes.array, // 导入模板默认数据
requestType: PropTypes.string, // 请求类型
importDataCallback: PropTypes.func, // 上传后数据返回
templeteBth: PropTypes.bool, // 模板按钮
importRequest: PropTypes.bool, // 请求导入接口,false时搭配importDataCallback,
exportType: PropTypes.string, // 导出执行的函数名
};
export default ExportAndImport;

13
web/client/src/components/export/index.less

@ -0,0 +1,13 @@
.export-import {
.file-uploader {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
outline: none;
opacity: 0;
background-color: transparent;
z-index: 10;
}
}

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

Loading…
Cancel
Save