From 2c37390c11ed1a6549204df700fa3d5279d8dd3e Mon Sep 17 00:00:00 2001 From: victor-liu <victorliu1999@gmail.com> Date: Tue, 5 Jan 2021 11:32:49 +1100 Subject: [PATCH 01/18] configured eslint, pretttier, js, ts and added packages --- .eslintignore | 10 + .eslintrc.js | 8 + .prettierignore | 23 +- .prettierrc | 11 - .prettierrc.js | 5 + .stylelintrc.js | 5 + .umirc.ts | 10 - README.md | 54 +- jsconfig.json | 10 + package.json | 6 + tsconfig.json | 50 +- yarn.lock | 2826 +++++++++++++++++++++++++++++++++++++++++++++-- 12 files changed, 2868 insertions(+), 150 deletions(-) create mode 100644 .eslintignore create mode 100644 .eslintrc.js delete mode 100644 .prettierrc create mode 100644 .prettierrc.js create mode 100644 .stylelintrc.js delete mode 100644 .umirc.ts create mode 100644 jsconfig.json diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..d053230 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,10 @@ +/lambda/ +/scripts +/config +.history +*.test.js +/pages/Demo +/node_modules/ +/dist +/src/* +**/*.less diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..b882c20 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,8 @@ +module.exports = { + extends: [require.resolve('@umijs/fabric/dist/eslint')], + globals: { + ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION: true, + page: true, + REACT_APP_ENV: true, + }, +}; diff --git a/.prettierignore b/.prettierignore index 0d4222f..e367454 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,8 +1,23 @@ -**/*.md **/*.svg -**/*.ejs -**/*.html package.json .umi .umi-production -.umi-test +/dist +.dockerignore +.DS_Store +.eslintignore +*.png +*.toml +docker +.editorconfig +Dockerfile* +.gitignore +.prettierignore +LICENSE +.eslintcache +*.lock +yarn-error.log +.history +CNAME +/build +/public diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 94beb14..0000000 --- a/.prettierrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "singleQuote": true, - "trailingComma": "all", - "printWidth": 80, - "overrides": [ - { - "files": ".prettierrc", - "options": { "parser": "json" } - } - ] -} diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000..7b597d7 --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,5 @@ +const fabric = require('@umijs/fabric'); + +module.exports = { + ...fabric.prettier, +}; diff --git a/.stylelintrc.js b/.stylelintrc.js new file mode 100644 index 0000000..c203078 --- /dev/null +++ b/.stylelintrc.js @@ -0,0 +1,5 @@ +const fabric = require('@umijs/fabric'); + +module.exports = { + ...fabric.stylelint, +}; diff --git a/.umirc.ts b/.umirc.ts deleted file mode 100644 index af5394b..0000000 --- a/.umirc.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { defineConfig } from 'umi'; - -export default defineConfig({ - nodeModulesTransform: { - type: 'none', - }, - routes: [ - { path: '/', component: '@/pages/index' }, - ], -}); diff --git a/README.md b/README.md index 07afeb7..194ca29 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,57 @@ -# umi project +# Ant Design Mobile -## Getting Started +This project is initialized with [Ant Design Mobile](https://mobile.ant.design/). Follow is the quick guide for how to use. -Install dependencies, +## Environment Prepare + +Install `node_modules`: + +```bash +npm install +``` + +or + +```bash +yarn +``` + +## Provided Scripts + +Ant Design Mobile provides some useful script to help you quick start and build with web project, code style check and test. + +Scripts provided in `package.json`. It's safe to modify or add additional script: + +### Start project + +```bash +npm start +``` + +### Build project + +```bash +npm run build +``` + +### Check code style ```bash -$ yarn +npm run lint ``` -Start the dev server, +You can also use script to auto fix some lint error: ```bash -$ yarn start +npm run lint:fix ``` + +### Test code + +```bash +npm test +``` + +## More + +You can view full document on our [official website](https://mobile.ant.design/). And welcome any feedback in our [github](https://github.com/ant-design/ant-design-pro). diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..f87334d --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/package.json b/package.json index 8f003b7..3725b96 100644 --- a/package.json +++ b/package.json @@ -21,18 +21,24 @@ }, "dependencies": { "@ant-design/pro-layout": "^6.5.0", + "@fortawesome/fontawesome-svg-core": "^1.2.32", + "@fortawesome/free-solid-svg-icons": "^5.15.1", + "@fortawesome/react-fontawesome": "^0.1.14", "@umijs/preset-react": "1.x", "antd-mobile": "^2.3.4", "classnames": "2.2.6", "lodash": "^4.17.20", "moment": "^2.29.1", + "react-dev-inspector": "^1.1.4", "umi": "^3.3.3", "umi-request": "1.0.8" }, "devDependencies": { "@types/react": "^16.9.0", "@types/react-dom": "^16.9.0", + "@umijs/fabric": "^2.4.9", "@umijs/test": "^3.3.3", + "eslint": "^7.17.0", "lint-staged": "^10.0.7", "prettier": "^2.2.0", "react": "^16.12.0", diff --git a/tsconfig.json b/tsconfig.json index f0c3b93..6d8ba2b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,36 +1,40 @@ { "compilerOptions": { - "target": "esnext", + "outDir": "build/dist", "module": "esnext", - "moduleResolution": "node", - "importHelpers": true, - "jsx": "react", - "esModuleInterop": true, + "target": "esnext", + "lib": ["esnext", "dom"], "sourceMap": true, - "baseUrl": "./", + "baseUrl": ".", + "jsx": "preserve", + "allowSyntheticDefaultImports": true, + "moduleResolution": "node", + "forceConsistentCasingInFileNames": true, + "noImplicitReturns": true, + "suppressImplicitAnyIndexErrors": true, + "noUnusedLocals": true, + "allowJs": true, + "skipLibCheck": true, + "experimentalDecorators": true, "strict": true, "paths": { - "@/*": ["src/*"], - "@@/*": ["src/.umi/*"] - }, - "allowSyntheticDefaultImports": true + "@/*": ["./src/*"], + "@@/*": ["./src/.umi/*"] + } }, "include": [ "mock/**/*", "src/**/*", + "tests/**/*", + "test/**/*", + "__test__/**/*", + "typings/**/*", "config/**/*", - ".umirc.ts", - "typings.d.ts" + ".eslintrc.js", + ".stylelintrc.js", + ".prettierrc.js", + "jest.config.js", + "mock/*" ], - "exclude": [ - "node_modules", - "lib", - "es", - "dist", - "typings", - "**/__test__", - "test", - "docs", - "tests" - ] + "exclude": ["node_modules", "build", "dist", "scripts", "src/.umi/*", "webpack", "jest"] } diff --git a/yarn.lock b/yarn.lock index 565f4f8..e646e1e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -89,6 +89,13 @@ lodash "^4.17.15" resize-observer-polyfill "^1.5.0" +"@babel/code-frame@7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== + dependencies: + "@babel/highlight" "^7.8.3" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.11", "@babel/code-frame@^7.8.3": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" @@ -123,7 +130,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.1.0", "@babel/core@^7.4.5", "@babel/core@^7.7.5": +"@babel/core@>=7.2.2", "@babel/core@>=7.9.0", "@babel/core@^7.1.0", "@babel/core@^7.11.6", "@babel/core@^7.4.5", "@babel/core@^7.7.5": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== @@ -144,7 +151,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.12.1", "@babel/generator@^7.12.10", "@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.4.0": +"@babel/generator@^7.11.6", "@babel/generator@^7.12.1", "@babel/generator@^7.12.10", "@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.4.0": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.11.tgz#98a7df7b8c358c9a37ab07a24056853016aba3af" integrity sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA== @@ -346,7 +353,7 @@ "@babel/traverse" "^7.12.5" "@babel/types" "^7.12.5" -"@babel/highlight@^7.10.4": +"@babel/highlight@^7.10.4", "@babel/highlight@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== @@ -360,7 +367,7 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.5.tgz#b4af32ddd473c0bfa643bd7ff0728b8e71b81ea0" integrity sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ== -"@babel/parser@^7.1.0", "@babel/parser@^7.12.10", "@babel/parser@^7.12.11", "@babel/parser@^7.12.3", "@babel/parser@^7.12.5", "@babel/parser@^7.12.7", "@babel/parser@^7.4.3": +"@babel/parser@^7.1.0", "@babel/parser@^7.11.5", "@babel/parser@^7.12.10", "@babel/parser@^7.12.11", "@babel/parser@^7.12.3", "@babel/parser@^7.12.5", "@babel/parser@^7.12.7", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.11.tgz#9ce3595bcd74bc5c466905e86c535b8b25011e79" integrity sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg== @@ -1189,6 +1196,14 @@ pirates "^4.0.0" source-map-support "^0.5.16" +"@babel/runtime-corejs3@^7.10.2": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.12.5.tgz#ffee91da0eb4c6dae080774e94ba606368e414f4" + integrity sha512-roGr54CsTmNPPzZoCP1AmDXuBoNao7tnSA83TXTwt+UK5QVyh1DIJnrgYRPWKCF2flqZQXwa7Yr8v7VmLzF0YQ== + dependencies: + core-js-pure "^3.0.0" + regenerator-runtime "^0.13.4" + "@babel/runtime@7.12.5", "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.8.4": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" @@ -1220,7 +1235,7 @@ globals "^11.1.0" lodash "^4.17.19" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.10", "@babel/traverse@^7.12.5", "@babel/traverse@^7.4.3": +"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.10", "@babel/traverse@^7.12.5", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0": version "7.12.12" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.12.tgz#d0cd87892704edd8da002d674bc811ce64743376" integrity sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w== @@ -1244,7 +1259,7 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" -"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.12.1", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.12", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0", "@babel/types@^7.4.4": +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.12.1", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.12", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0": version "7.12.12" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.12.tgz#4608a6ec313abbd87afa55004d373ad04a96c299" integrity sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ== @@ -1276,6 +1291,22 @@ resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.3.1.tgz#fa0efcf813daa43f8a6aef3ddaa80f7e66f1278e" integrity sha512-jUJrjU62MUgHDSu5JfONfgRM2V7GfN5KknsygfIbxwRZXGeayIzxk4O9GiYgEAr9DG5HJThTF5+a5x3wtrOKzQ== +"@eslint/eslintrc@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz#d01fc791e2fc33e88a29d6f3dc7e93d0cd784b76" + integrity sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + lodash "^4.17.19" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + "@formatjs/intl-displaynames@^1.2.0": version "1.2.10" resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-1.2.10.tgz#bb9625cca90b099978cd967c6a98aaf4e23fc878" @@ -1316,6 +1347,32 @@ resolved "https://registry.yarnpkg.com/@formatjs/intl-utils/-/intl-utils-2.3.0.tgz#2dc8c57044de0340eb53a7ba602e59abf80dc799" integrity sha512-KWk80UPIzPmUg+P0rKh6TqspRw0G6eux1PuJr+zz47ftMaZ9QDwbGzHZbtzWkl5hgayM/qrKRutllRC7D/vVXQ== +"@fortawesome/fontawesome-common-types@^0.2.32": + version "0.2.32" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.32.tgz#3436795d5684f22742989bfa08f46f50f516f259" + integrity sha512-ux2EDjKMpcdHBVLi/eWZynnPxs0BtFVXJkgHIxXRl+9ZFaHPvYamAfCzeeQFqHRjuJtX90wVnMRaMQAAlctz3w== + +"@fortawesome/fontawesome-svg-core@^1.2.32": + version "1.2.32" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.32.tgz#da092bfc7266aa274be8604de610d7115f9ba6cf" + integrity sha512-XjqyeLCsR/c/usUpdWcOdVtWFVjPbDFBTQkn2fQRrWhhUoxriQohO2RWDxLyUM8XpD+Zzg5xwJ8gqTYGDLeGaQ== + dependencies: + "@fortawesome/fontawesome-common-types" "^0.2.32" + +"@fortawesome/free-solid-svg-icons@^5.15.1": + version "5.15.1" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.1.tgz#e1432676ddd43108b41197fee9f86d910ad458ef" + integrity sha512-EFMuKtzRMNbvjab/SvJBaOOpaqJfdSap/Nl6hst7CgrJxwfORR1drdTV6q1Ib/JVzq4xObdTDcT6sqTaXMqfdg== + dependencies: + "@fortawesome/fontawesome-common-types" "^0.2.32" + +"@fortawesome/react-fontawesome@^0.1.14": + version "0.1.14" + resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.14.tgz#bf28875c3935b69ce2dc620e1060b217a47f64ca" + integrity sha512-4wqNb0gRLVaBm/h+lGe8UfPPivcbuJ6ecI4hIgW0LjI7kzpYB9FkN0L9apbVzg+lsBdcTf0AlBtODjcSX5mmKA== + dependencies: + prop-types "^15.7.2" + "@hapi/address@^2.1.2": version "2.1.4" resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" @@ -1615,6 +1672,21 @@ "@types/yargs" "^15.0.0" chalk "^3.0.0" +"@mdn/browser-compat-data@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@mdn/browser-compat-data/-/browser-compat-data-2.0.7.tgz#72ec37b9c1e00ce0b4e0309d753be18e2da12ee3" + integrity sha512-GeeM827DlzFFidn1eKkMBiqXFD2oLsnZbaiGhByPl0vcapsRzUL+t9hDoov1swc9rB2jw64R+ihtzC8qOE9wXw== + dependencies: + extend "3.0.2" + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + "@nodelib/fs.scandir@2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" @@ -1628,6 +1700,11 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + "@nodelib/fs.walk@^1.2.3": version "1.2.6" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" @@ -1672,6 +1749,21 @@ dependencies: type-detect "4.0.8" +"@stylelint/postcss-css-in-js@^0.37.2": + version "0.37.2" + resolved "https://registry.yarnpkg.com/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz#7e5a84ad181f4234a2480803422a47b8749af3d2" + integrity sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA== + dependencies: + "@babel/core" ">=7.9.0" + +"@stylelint/postcss-markdown@^0.36.2": + version "0.36.2" + resolved "https://registry.yarnpkg.com/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz#0a540c4692f8dcdfc13c8e352c17e7bfee2bb391" + integrity sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ== + dependencies: + remark "^13.0.0" + unist-util-find-all-after "^3.0.2" + "@svgr/babel-plugin-add-jsx-attribute@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz#dadcb6218503532d6884b210e7f3c502caaa44b1" @@ -1914,7 +2006,7 @@ "@types/qs" "*" "@types/serve-static" "*" -"@types/glob@*", "@types/glob@7.1.3": +"@types/glob@*", "@types/glob@7.1.3", "@types/glob@^7.1.1": version "7.1.3" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== @@ -2008,6 +2100,11 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + "@types/lodash@4.14.161": version "4.14.161" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.161.tgz#a21ca0777dabc6e4f44f3d07f37b765f54188b18" @@ -2026,6 +2123,13 @@ resolved "https://registry.yarnpkg.com/@types/marked/-/marked-1.2.1.tgz#9864ecc10d0edb72e7be4e94acb5fcc607c15eed" integrity sha512-d5adCgRHB+NAme23hkiTkvpfZUDqoNtL2Sr2nZBJqSj3zyHLxsfFWsGQ2sK2z9aX6L1xkJzon2c0jTPcsEjpaQ== +"@types/mdast@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb" + integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw== + dependencies: + "@types/unist" "*" + "@types/memory-fs@*": version "0.3.2" resolved "https://registry.yarnpkg.com/@types/memory-fs/-/memory-fs-0.3.2.tgz#5d4753f9b390cb077c8c8af97bc96463399ceccd" @@ -2045,11 +2149,16 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a" integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q== -"@types/minimatch@*": +"@types/minimatch@*", "@types/minimatch@^3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== +"@types/minimist@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256" + integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg== + "@types/mkdirp@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-1.0.1.tgz#0930b948914a78587de35458b86c907b6e98bbf6" @@ -2304,6 +2413,27 @@ dependencies: source-map "^0.6.1" +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" + integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== + +"@types/vfile-message@*": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/vfile-message/-/vfile-message-2.0.0.tgz#690e46af0fdfc1f9faae00cd049cc888957927d5" + integrity sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw== + dependencies: + vfile-message "*" + +"@types/vfile@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/vfile/-/vfile-3.0.2.tgz#19c18cd232df11ce6fa6ad80259bc86c366b09b9" + integrity sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw== + dependencies: + "@types/node" "*" + "@types/unist" "*" + "@types/vfile-message" "*" + "@types/webpack-bundle-analyzer@3.8.0": version "3.8.0" resolved "https://registry.yarnpkg.com/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz#d1f196f95159254f76a3c2283c4677585bdf354d" @@ -2397,6 +2527,76 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin@^4.10.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.12.0.tgz#00d1b23b40b58031e6d7c04a5bc6c1a30a2e834a" + integrity sha512-wHKj6q8s70sO5i39H2g1gtpCXCvjVszzj6FFygneNFyIAxRvNSVz9GML7XpqrB9t7hNutXw+MHnLN/Ih6uyB8Q== + dependencies: + "@typescript-eslint/experimental-utils" "4.12.0" + "@typescript-eslint/scope-manager" "4.12.0" + debug "^4.1.1" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@4.12.0", "@typescript-eslint/experimental-utils@^4.0.1": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.12.0.tgz#372838e76db76c9a56959217b768a19f7129546b" + integrity sha512-MpXZXUAvHt99c9ScXijx7i061o5HEjXltO+sbYfZAAHxv3XankQkPaNi5myy0Yh0Tyea3Hdq1pi7Vsh0GJb0fA== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/scope-manager" "4.12.0" + "@typescript-eslint/types" "4.12.0" + "@typescript-eslint/typescript-estree" "4.12.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@^4.10.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.12.0.tgz#e1cf30436e4f916c31fcc962158917bd9e9d460a" + integrity sha512-9XxVADAo9vlfjfoxnjboBTxYOiNY93/QuvcPgsiKvHxW6tOZx1W4TvkIQ2jB3k5M0pbFP5FlXihLK49TjZXhuQ== + dependencies: + "@typescript-eslint/scope-manager" "4.12.0" + "@typescript-eslint/types" "4.12.0" + "@typescript-eslint/typescript-estree" "4.12.0" + debug "^4.1.1" + +"@typescript-eslint/scope-manager@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.12.0.tgz#beeb8beca895a07b10c593185a5612f1085ef279" + integrity sha512-QVf9oCSVLte/8jvOsxmgBdOaoe2J0wtEmBr13Yz0rkBNkl5D8bfnf6G4Vhox9qqMIoG7QQoVwd2eG9DM/ge4Qg== + dependencies: + "@typescript-eslint/types" "4.12.0" + "@typescript-eslint/visitor-keys" "4.12.0" + +"@typescript-eslint/types@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.12.0.tgz#fb891fe7ccc9ea8b2bbd2780e36da45d0dc055e5" + integrity sha512-N2RhGeheVLGtyy+CxRmxdsniB7sMSCfsnbh8K/+RUIXYYq3Ub5+sukRCjVE80QerrUBvuEvs4fDhz5AW/pcL6g== + +"@typescript-eslint/typescript-estree@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.12.0.tgz#3963418c850f564bdab3882ae23795d115d6d32e" + integrity sha512-gZkFcmmp/CnzqD2RKMich2/FjBTsYopjiwJCroxqHZIY11IIoN0l5lKqcgoAPKHt33H2mAkSfvzj8i44Jm7F4w== + dependencies: + "@typescript-eslint/types" "4.12.0" + "@typescript-eslint/visitor-keys" "4.12.0" + debug "^4.1.1" + globby "^11.0.1" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/visitor-keys@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.12.0.tgz#a470a79be6958075fa91c725371a83baf428a67a" + integrity sha512-hVpsLARbDh4B9TKYz5cLbcdMIOAoBYgFPCSP9FFS/liSF+b33gVNq8JHY3QGhHNVz85hObvL7BEYLlgx553WCw== + dependencies: + "@typescript-eslint/types" "4.12.0" + eslint-visitor-keys "^2.0.0" + "@umijs/ast@3.3.3": version "3.3.3" resolved "https://registry.yarnpkg.com/@umijs/ast/-/ast-3.3.3.tgz#5c70ce8ce4a2d2020dd7f65ead42dbd5b02b3aee" @@ -2543,6 +2743,39 @@ resolved "https://registry.yarnpkg.com/@umijs/error-code-map/-/error-code-map-1.0.1.tgz#2a2dd7b4bcd11869e968264ff3dabacfabe8b874" integrity sha512-Q0KSpQYKTF2XWOlAxJO/SRbRhIGAp1GK1spWFbzwv3h0WvfX7pPeA05Y3p0hut7Vcjhdocnx5NduuApF4R1lGQ== +"@umijs/fabric@^2.4.9": + version "2.4.9" + resolved "https://registry.yarnpkg.com/@umijs/fabric/-/fabric-2.4.9.tgz#7eed66c36523c3bdc0ac269eea8b9961d643fe1b" + integrity sha512-9qPXp41V4hz7PYcYA7ooj3vb2zFKUmEsYixMhvRigw5vHnTiNvgDwlzNqjmhtwJOZzANz+1ssEWDqwRzg68Z0g== + dependencies: + "@typescript-eslint/eslint-plugin" "^4.10.0" + "@typescript-eslint/parser" "^4.10.0" + eslint "^7.11.0" + eslint-config-airbnb-base "^14.2.0" + eslint-config-prettier "^6.13.0" + eslint-formatter-pretty "^4.0.0" + eslint-plugin-babel "^5.3.0" + eslint-plugin-compat "^3.1.1" + eslint-plugin-eslint-comments "^3.1.1" + eslint-plugin-import "^2.17.3" + eslint-plugin-jest "^24.0.1" + eslint-plugin-jsx-a11y "^6.2.0" + eslint-plugin-markdown "^1.0.0" + eslint-plugin-promise "^4.1.1" + eslint-plugin-react "^7.21.5" + eslint-plugin-react-hooks "^4.1.2" + eslint-plugin-unicorn "^20.0.0" + fast-glob "^3.2.4" + stylelint "^13.7.0" + stylelint-config-css-modules "^2.2.0" + stylelint-config-prettier "^8.0.1" + stylelint-config-rational-order "^0.1.2" + stylelint-config-standard "^20.0.0" + stylelint-declaration-block-no-ignored-properties "^2.1.0" + stylelint-no-unsupported-browser-features "^4.1.4" + stylelint-order "^4.0.0" + typescript "^4.0.2" + "@umijs/plugin-access@2.3.2": version "2.3.2" resolved "https://registry.yarnpkg.com/@umijs/plugin-access/-/plugin-access-2.3.2.tgz#2d736e72bf27c69c7a0d1d1d1ac334a408e069c0" @@ -2992,6 +3225,14 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +JSONStream@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-0.8.4.tgz#91657dfe6ff857483066132b4618b62e8f4887bd" + integrity sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70= + dependencies: + jsonparse "0.0.5" + through ">=2.2.7 <3" + abab@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" @@ -3013,6 +3254,11 @@ acorn-globals@^4.3.0, acorn-globals@^4.3.2: acorn "^6.0.1" acorn-walk "^6.0.1" +acorn-jsx@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + acorn-walk@^6.0.1: version "6.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" @@ -3028,7 +3274,7 @@ acorn@^6.0.1, acorn@^6.0.4, acorn@^6.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^7.1.0, acorn@^7.1.1: +acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== @@ -3040,7 +3286,7 @@ add-dom-event-listener@^1.1.0: dependencies: object-assign "4.x" -address@1.1.2: +address@1.1.2, address@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== @@ -3063,7 +3309,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -3073,6 +3319,16 @@ ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.0.3.tgz#13ae747eff125cafb230ac504b2406cf371eece2" + integrity sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + alphanum-sort@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" @@ -3125,7 +3381,7 @@ ansi-styles@^2.2.1: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -3264,6 +3520,14 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== + dependencies: + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -3279,31 +3543,93 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= +array-differ@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" + integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== + array-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= +array-includes@^3.1.1, array-includes@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.2.tgz#a8db03e0b88c8c6aeddc49cb132f9bcab4ebf9c8" + integrity sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + get-intrinsic "^1.0.1" + is-string "^1.0.5" + array-tree-filter@2.1.x, array-tree-filter@^2.1.0, array-tree-filter@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190" integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw== +array-union@^1.0.1, array-union@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array.prototype.flat@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" + integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +array.prototype.flatmap@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9" + integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + function-bind "^1.1.1" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -3344,6 +3670,16 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +ast-metadata-inferer@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/ast-metadata-inferer/-/ast-metadata-inferer-0.4.0.tgz#6be85ceeffcf267bd79db8e1ae731da44880b45f" + integrity sha512-tKHdBe8N/Vq2nLAm4YPBVREVZjMux6KrqyPfNQgIbDl0t7HaNSmy8w4OyVHYg/cvyn5BW7o7pVwpjPte89Zhcg== + +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" @@ -3396,7 +3732,7 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@^9.6.1: +autoprefixer@^9.0.0, autoprefixer@^9.6.1, autoprefixer@^9.8.6: version "9.8.6" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== @@ -3419,11 +3755,42 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== +axe-core@^4.0.2: + version "4.1.1" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.1.1.tgz#70a7855888e287f7add66002211a423937063eaf" + integrity sha512-5Kgy8Cz6LPC9DJcNb3yjAXTu3XihQgEdnIg50c//zOC/MyLP0Clg+Y8Sh9ZjjnvBrDZU4DgXS9C3T9r4/scGZQ== + +axobject-query@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== + +babel-code-frame@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + babel-core@7.0.0-bridge.0: version "7.0.0-bridge.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== +babel-eslint@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + babel-jest@^25.4.0, babel-jest@^25.5.1: version "25.5.1" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.5.1.tgz#bc2e6101f849d6f6aec09720ffc7bc5332e62853" @@ -3554,6 +3921,11 @@ babel-runtime@6.x, babel-runtime@^6.23.0, babel-runtime@^6.26.0: core-js "^2.4.0" regenerator-runtime "^0.11.0" +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -3761,7 +4133,17 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.0, browserslist@^4.6.4: +browserslist@4.10.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.10.0.tgz#f179737913eaf0d2b98e4926ac1ca6a15cbcc6a9" + integrity sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA== + dependencies: + caniuse-lite "^1.0.30001035" + electron-to-chromium "^1.3.378" + node-releases "^1.1.52" + pkg-up "^3.1.0" + +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.12.2, browserslist@^4.14.5, browserslist@^4.14.7, browserslist@^4.16.0, browserslist@^4.6.4: version "4.16.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.0.tgz#410277627500be3cb28a1bfe037586fbedf9488b" integrity sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ== @@ -3930,6 +4312,29 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camelcase-keys@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" + integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= + dependencies: + camelcase "^4.1.0" + map-obj "^2.0.0" + quick-lru "^1.0.0" + +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -3950,6 +4355,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, can resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001171.tgz#3291e11e02699ad0a29e69b8d407666fc843eba7" integrity sha512-5Alrh8TTYPG9IH4UkRqEBZoEToWRLvPbSQokvzSz0lii8/FOWKG4keO1HoYfPWs8IF/NH/dyNPg1cmJGvV3Zlg== +caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001157, caniuse-lite@^1.0.30001166: + version "1.0.30001173" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001173.tgz#3c47bbe3cd6d7a9eda7f50ac016d158005569f56" + integrity sha512-R3aqmjrICdGCTAnSXtNyvWYMK3YtV5jwudbq0T7nN9k4kmE4CBuwPqyJ+KBzepSTh0huivV2gLbSMEzTTmfeYw== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -3970,6 +4380,20 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +ccount@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" + integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@4.1.0, chalk@^4.0.0, chalk@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" @@ -3989,15 +4413,6 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" @@ -4006,6 +4421,31 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +character-entities-html4@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.4.tgz#0e64b0a3753ddbf1fdc044c5fd01d0199a02e125" + integrity sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g== + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + check-types@^8.0.3: version "8.0.3" resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" @@ -4057,7 +4497,7 @@ chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" -chokidar@^3.4.1, chokidar@^3.4.2: +chokidar@^3.3.0, chokidar@^3.4.1, chokidar@^3.4.2: version "3.4.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== @@ -4122,6 +4562,13 @@ classnames@2.2.6, classnames@2.x, classnames@^2.2.0, classnames@^2.2.1, classnam resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== +clean-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7" + integrity sha1-jffHquUf02h06PjQW5GAvBGj/tc= + dependencies: + escape-string-regexp "^1.0.5" + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -4162,6 +4609,11 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + clipboardy@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-2.3.0.tgz#3c2903650c68e46a91b388985bc2774287dba290" @@ -4180,6 +4632,15 @@ cliui@6.0.0, cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + clone-deep@^0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6" @@ -4191,6 +4652,21 @@ clone-deep@^0.2.4: lazy-cache "^1.0.3" shallow-clone "^0.1.2" +clone-regexp@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-1.0.1.tgz#051805cd33173375d82118fc0918606da39fd60f" + integrity sha512-Fcij9IwRW27XedRIJnSOEupS7RVcXtObJXbcUOX93UCLqqOdRpkvzKywOOSizmEK/Is3S/RHX9dLdfo6R1Q1mw== + dependencies: + is-regexp "^1.0.0" + is-supported-regexp-flag "^1.0.0" + +clone-regexp@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f" + integrity sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q== + dependencies: + is-regexp "^2.0.0" + clone-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" @@ -4217,6 +4693,11 @@ coa@^2.0.2: chalk "^2.4.1" q "^1.1.2" +collapse-white-space@^1.0.2: + version "1.0.6" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" + integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== + collect-v8-coverage@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" @@ -4362,6 +4843,11 @@ concat-stream@^1.5.0, concat-stream@^1.5.2: readable-stream "^2.2.2" typedarray "^0.0.6" +confusing-browser-globals@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59" + integrity sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA== + connected-react-router@6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/connected-react-router/-/connected-react-router-6.5.2.tgz#422af70f86cb276681e20ab4295cf27dd9b6c7e3" @@ -4386,6 +4872,11 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + content-disposition@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" @@ -4464,6 +4955,11 @@ core-js-compat@^3.6.2, core-js-compat@^3.8.0: browserslist "^4.16.0" semver "7.0.0" +core-js-pure@^3.0.0: + version "3.8.2" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.8.2.tgz#286f885c0dac1cdcd6d78397392abc25ddeca225" + integrity sha512-v6zfIQqL/pzTVAbZvYUozsxNfxcFb6Ks3ZfEbuneJl3FW9Jb8F6vLWB6f+qTmAu72msUdyb84V8d/yBFf7FNnw== + core-js@3.6.5: version "3.6.5" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" @@ -4479,6 +4975,11 @@ core-js@^2.4.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== +core-js@^3.6.5: + version "3.8.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.2.tgz#0a1fd6709246da9ca8eff5bb0cbd15fba9ac7044" + integrity sha512-FfApuSRgrR6G5s58casCBd9M2k+4ikuu4wbW6pJyYU7bd9zvFc9qf7vr5xmrZOhT9nn+8uwlH1oRR9jTnFoA3A== + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -4560,7 +5061,16 @@ crequire@1.8.1: resolved "https://registry.yarnpkg.com/crequire/-/crequire-1.8.1.tgz#ac81f204786b5f201194eb1698cf441b10a4b57d" integrity sha1-rIHyBHhrXyARlOsWmM9EGxCktX0= -cross-spawn@7.0.3, cross-spawn@^7.0.0: +cross-spawn@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -4681,6 +5191,16 @@ css-prefers-color-scheme@^3.1.1: dependencies: postcss "^7.0.5" +css-rule-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/css-rule-stream/-/css-rule-stream-1.1.0.tgz#3786e7198983d965a26e31957e09078cbb7705a2" + integrity sha1-N4bnGYmD2WWibjGVfgkHjLt3BaI= + dependencies: + css-tokenize "^1.0.1" + duplexer2 "0.0.2" + ldjson-stream "^1.2.1" + through2 "^0.6.3" + css-select-base-adapter@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" @@ -4706,6 +5226,14 @@ css-select@~1.2.0: domutils "1.5.1" nth-check "~1.0.1" +css-tokenize@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-tokenize/-/css-tokenize-1.0.1.tgz#4625cb1eda21c143858b7f81d6803c1d26fc14be" + integrity sha1-RiXLHtohwUOFi3+B1oA8HSb8FL4= + dependencies: + inherits "^2.0.1" + readable-stream "^1.0.33" + css-tree@1.0.0-alpha.37: version "1.0.0-alpha.37" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" @@ -4851,6 +5379,13 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.5.tgz#7fdec6a28a67ae18647c51668a9ff95bb2fa7bb8" integrity sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ== +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" @@ -4864,6 +5399,11 @@ d@1, d@^1.0.1: es5-ext "^0.10.50" type "^1.0.1" +damerau-levenshtein@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" + integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug== + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -4890,7 +5430,7 @@ dayjs@^1.8.30: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.1.tgz#114f678624842035396667a24eb1436814bc16fd" integrity sha512-2xg7JrHQeLBQFkvTumLoy62x1siyeocc98QwjtURgvRqOPYmAkMUdmSjrOA+MlmL6QMQn5MUhDf6rNZNuPc1LQ== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -4911,14 +5451,22 @@ debug@^3.1.1, debug@^3.2.6: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: +debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: ms "2.1.2" -decamelize@^1.2.0: +decamelize-keys@^1.0.0, decamelize-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -4940,7 +5488,7 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= -deep-is@~0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= @@ -5022,6 +5570,14 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== +detect-port-alt@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + dicer@0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" @@ -5044,6 +5600,21 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dir-glob@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== + dependencies: + arrify "^1.0.1" + path-type "^3.0.0" + +dir-glob@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -5051,6 +5622,45 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +doiuse@^4.3.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/doiuse/-/doiuse-4.4.0.tgz#d02541820a05b60ae69facbe2c1abd00513db7c2" + integrity sha512-+RbL+7ECpBzbX+GMnX3PXzc/t+ufvZV/q/ysES5U8i0VexgGKLezQPCVehKwzLH2pIFC0pISfPaSm69CxuEw6w== + dependencies: + browserslist "^4.14.7" + caniuse-lite "^1.0.30001157" + css-rule-stream "^1.1.0" + duplexer2 "0.0.2" + jsonfilter "^1.1.2" + ldjson-stream "^1.2.1" + multimatch "^5.0.0" + postcss "^8.1.6" + source-map "^0.7.3" + through2 "^4.0.2" + yargs "^16.1.0" + dom-align@1.x, dom-align@^1.7.0: version "1.12.0" resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.0.tgz#56fb7156df0b91099830364d2d48f88963f5a29c" @@ -5134,12 +5744,19 @@ dotenv@8.2.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== +duplexer2@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + integrity sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds= + dependencies: + readable-stream "~1.1.9" + duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= -duplexer@^0.1.1: +duplexer@^0.1.1, duplexer@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== @@ -5226,7 +5843,7 @@ ejs@^2.6.1: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== -electron-to-chromium@^1.3.621: +electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.621: version "1.3.633" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.633.tgz#16dd5aec9de03894e8d14a1db4cda8a369b9b7fe" integrity sha512-bsVCsONiVX1abkWdH7KtpuDAhsQ3N3bjPYhROSAXE78roJKet0Y5wznA14JE9pzbwSZmSMAW6KiKYf1RvbTJkA== @@ -5244,11 +5861,26 @@ elliptic@^6.5.3: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.0.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.0.tgz#a26da8e832b16a9753309f25e35e3c0efb9a066a" + integrity sha512-DNc3KFPK18bPdElMJnf/Pkv5TXhxFU3YFDEuGLDRtPmV4rkmCjBkCSEp22u6rBHdSN9Vlp/GK7k98prmE1Jgug== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + emojis-list@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" @@ -5282,7 +5914,7 @@ enhanced-resolve@^4.3.0: memory-fs "^0.5.0" tapable "^1.0.0" -enquirer@^2.3.6: +enquirer@^2.3.5, enquirer@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -5306,7 +5938,7 @@ errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" -error-ex@^1.3.1: +error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== @@ -5320,7 +5952,7 @@ error-stack-parser@^2.0.0, error-stack-parser@^2.0.6: dependencies: stackframe "^1.1.1" -es-abstract@^1.17.2: +es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: version "1.17.7" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== @@ -5415,16 +6047,16 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= +escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - escodegen@^1.11.0, escodegen@^1.11.1: version "1.14.3" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" @@ -5437,6 +6069,196 @@ escodegen@^1.11.0, escodegen@^1.11.1: optionalDependencies: source-map "~0.6.1" +eslint-ast-utils@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz#3d58ba557801cfb1c941d68131ee9f8c34bd1586" + integrity sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA== + dependencies: + lodash.get "^4.4.2" + lodash.zip "^4.2.0" + +eslint-config-airbnb-base@^14.2.0: + version "14.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz#8a2eb38455dc5a312550193b319cdaeef042cd1e" + integrity sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA== + dependencies: + confusing-browser-globals "^1.0.10" + object.assign "^4.1.2" + object.entries "^1.1.2" + +eslint-config-prettier@^6.13.0: + version "6.15.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" + integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== + dependencies: + get-stdin "^6.0.0" + +eslint-formatter-pretty@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-formatter-pretty/-/eslint-formatter-pretty-4.0.0.tgz#dc15f3bf4fb51b7ba5fbedb77f57ba8841140ce2" + integrity sha512-QgdeZxQwWcN0TcXXNZJiS6BizhAANFhCzkE7Yl9HKB7WjElzwED6+FbbZB2gji8ofgJTGPqKm6VRCNT3OGCeEw== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + eslint-rule-docs "^1.1.5" + log-symbols "^4.0.0" + plur "^4.0.0" + string-width "^4.2.0" + supports-hyperlinks "^2.0.0" + +eslint-import-resolver-node@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== + dependencies: + debug "^2.6.9" + resolve "^1.13.1" + +eslint-module-utils@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" + integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== + dependencies: + debug "^2.6.9" + pkg-dir "^2.0.0" + +eslint-plugin-babel@^5.3.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-babel/-/eslint-plugin-babel-5.3.1.tgz#75a2413ffbf17e7be57458301c60291f2cfbf560" + integrity sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g== + dependencies: + eslint-rule-composer "^0.3.0" + +eslint-plugin-compat@^3.1.1: + version "3.9.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-compat/-/eslint-plugin-compat-3.9.0.tgz#a7a224e09b102b58e7f7dff52c936428ff3e0186" + integrity sha512-lt3l5PHFHVEYSZ5zijcoYvtQJPsBifRiH5N0Et57KwVu7l/yxmHhSG6VJiLMa/lXrg93Qu8049RNQOMn0+yJBg== + dependencies: + "@mdn/browser-compat-data" "^2.0.7" + ast-metadata-inferer "^0.4.0" + browserslist "^4.12.2" + caniuse-lite "^1.0.30001166" + core-js "^3.6.5" + find-up "^4.1.0" + lodash.memoize "4.1.2" + semver "7.3.2" + +eslint-plugin-eslint-comments@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz#9e1cd7b4413526abb313933071d7aba05ca12ffa" + integrity sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ== + dependencies: + escape-string-regexp "^1.0.5" + ignore "^5.0.5" + +eslint-plugin-import@^2.17.3: + version "2.22.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" + integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== + dependencies: + array-includes "^3.1.1" + array.prototype.flat "^1.2.3" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.4" + eslint-module-utils "^2.6.0" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.1" + read-pkg-up "^2.0.0" + resolve "^1.17.0" + tsconfig-paths "^3.9.0" + +eslint-plugin-jest@^24.0.1: + version "24.1.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.1.3.tgz#fa3db864f06c5623ff43485ca6c0e8fc5fe8ba0c" + integrity sha512-dNGGjzuEzCE3d5EPZQ/QGtmlMotqnYWD/QpCZ1UuZlrMAdhG5rldh0N0haCvhGnUkSeuORS5VNROwF9Hrgn3Lg== + dependencies: + "@typescript-eslint/experimental-utils" "^4.0.1" + +eslint-plugin-jsx-a11y@^6.2.0: + version "6.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz#a2d84caa49756942f42f1ffab9002436391718fd" + integrity sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg== + dependencies: + "@babel/runtime" "^7.11.2" + aria-query "^4.2.2" + array-includes "^3.1.1" + ast-types-flow "^0.0.7" + axe-core "^4.0.2" + axobject-query "^2.2.0" + damerau-levenshtein "^1.0.6" + emoji-regex "^9.0.0" + has "^1.0.3" + jsx-ast-utils "^3.1.0" + language-tags "^1.0.5" + +eslint-plugin-markdown@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-markdown/-/eslint-plugin-markdown-1.0.2.tgz#79274bf17ce3ead48e4a55cbcb6d7ce735754280" + integrity sha512-BfvXKsO0K+zvdarNc801jsE/NTLmig4oKhZ1U3aSUgTf2dB/US5+CrfGxMsCK2Ki1vS1R3HPok+uYpufFndhzw== + dependencies: + object-assign "^4.0.1" + remark-parse "^5.0.0" + unified "^6.1.2" + +eslint-plugin-promise@^4.1.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" + integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw== + +eslint-plugin-react-hooks@^4.1.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556" + integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ== + +eslint-plugin-react@^7.21.5: + version "7.22.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.22.0.tgz#3d1c542d1d3169c45421c1215d9470e341707269" + integrity sha512-p30tuX3VS+NWv9nQot9xIGAHBXR0+xJVaZriEsHoJrASGCJZDJ8JLNM0YqKqI0AKm6Uxaa1VUHoNEibxRCMQHA== + dependencies: + array-includes "^3.1.1" + array.prototype.flatmap "^1.2.3" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.4.1 || ^3.0.0" + object.entries "^1.1.2" + object.fromentries "^2.0.2" + object.values "^1.1.1" + prop-types "^15.7.2" + resolve "^1.18.1" + string.prototype.matchall "^4.0.2" + +eslint-plugin-unicorn@^20.0.0: + version "20.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-20.1.0.tgz#a43f60ffc98406d72ec2a5fcc6dad24ba0192bc9" + integrity sha512-XQxLBJT/gnwyRR6cfYsIK1AdekQchAt5tmcsnldevGjgR2xoZsRUa5/i6e0seNHy2RoT57CkTnbVHwHF8No8LA== + dependencies: + ci-info "^2.0.0" + clean-regexp "^1.0.0" + eslint-ast-utils "^1.1.0" + eslint-template-visitor "^2.0.0" + eslint-utils "^2.0.0" + import-modules "^2.0.0" + lodash "^4.17.15" + pluralize "^8.0.0" + read-pkg-up "^7.0.1" + regexp-tree "^0.1.21" + reserved-words "^0.1.2" + safe-regex "^2.1.1" + semver "^7.3.2" + +eslint-rule-composer@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" + integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== + +eslint-rule-docs@^1.1.5: + version "1.1.218" + resolved "https://registry.yarnpkg.com/eslint-rule-docs/-/eslint-rule-docs-1.1.218.tgz#089482e87918995f51f86c5412b30c9cb46a1ea1" + integrity sha512-oGT85qE8VvBEUuW1/9NjCye9+1kY5zjjiJgkzPHPDhwS3k3GwEN9NfflKW+eDM+lYB18EVuXUDiubNcdgabEQA== + eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -5445,12 +6267,106 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-scope@^5.0.0, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-template-visitor@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/eslint-template-visitor/-/eslint-template-visitor-2.2.2.tgz#46cd2b06eca5c1d97369aadd96e131df88fdd59c" + integrity sha512-SkcLjzKw3JjKTWHacRDeLBa2gxb600zbCKTkXj/V97QnZ9yxkknoPL8vc8PFueqbFXP7mYNTQzjCjcMpTRdRaA== + dependencies: + babel-eslint "^10.1.0" + eslint-visitor-keys "^2.0.0" + esquery "^1.3.1" + multimap "^1.1.0" + +eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + +eslint@^7.11.0, eslint@^7.17.0: + version "7.17.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.17.0.tgz#4ccda5bf12572ad3bf760e6f195886f50569adb0" + integrity sha512-zJk08MiBgwuGoxes5sSQhOtibZ75pz0J35XTRlZOk9xMffhpA9BTbQZxoXZzOl5zMbleShbGwtw+1kGferfFwQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^0.2.2" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.2.0" + esutils "^2.0.2" + file-entry-cache "^6.0.0" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash "^4.17.19" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.4" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esrecurse@^4.1.0: +esquery@^1.2.0, esquery@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.1.0, esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== @@ -5462,7 +6378,7 @@ estraverse@^4.1.1, estraverse@^4.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.2.0: +estraverse@^5.1.0, estraverse@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== @@ -5587,6 +6503,20 @@ execa@^4.0.0, execa@^4.1.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execall@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execall/-/execall-1.0.0.tgz#73d0904e395b3cab0658b08d09ec25307f29bb73" + integrity sha1-c9CQTjlbPKsGWLCNCewlMH8pu3M= + dependencies: + clone-regexp "^1.0.0" + +execall@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45" + integrity sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow== + dependencies: + clone-regexp "^2.1.0" + exenv@^1.2.0: version "1.2.2" resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" @@ -5680,11 +6610,20 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@~3.0.2: +extend@3.0.2, extend@^3.0.0, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -5719,6 +6658,18 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-glob@^2.0.2, fast-glob@^2.2.6: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + fast-glob@^3.1.1, fast-glob@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" @@ -5736,11 +6687,16 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + fastq@^1.6.0: version "1.10.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.0.tgz#74dbefccade964932cdf500473ef302719c652bb" @@ -5787,13 +6743,27 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -figures@^3.2.0: +figures@^3.0.0, figures@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: escape-string-regexp "^1.0.5" +file-entry-cache@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-4.0.0.tgz#633567d15364aefe0b299e1e217735e8f3a9f6e8" + integrity sha512-AVSwsnbV8vH/UVbvgEhf3saVQXORNv0ZzSkvkhQIaia5Tia+JhGTaa/ePUSVoPHQyGayQNmYfkzFi3WZV5zcpA== + dependencies: + flat-cache "^2.0.1" + +file-entry-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a" + integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== + dependencies: + flat-cache "^3.0.4" + file-loader@6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.1.0.tgz#65b9fcfb0ea7f65a234a1f10cdd7f1ab9a33f253" @@ -5814,6 +6784,11 @@ filelist@^1.0.1: dependencies: minimatch "^3.0.4" +filesize@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.0.1.tgz#f850b509909c7c86f7e450ea19006c31c2ed3d2f" + integrity sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg== + filesize@^3.6.1: version "3.6.1" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" @@ -5867,7 +6842,15 @@ find-cache-dir@^3.3.1: make-dir "^3.0.2" pkg-dir "^4.1.0" -find-up@^2.0.0: +find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -5881,13 +6864,32 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + +flatted@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067" + integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA== flatten@^1.0.2: version "1.0.3" @@ -5929,6 +6931,20 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +fork-ts-checker-webpack-plugin@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz#a1642c0d3e65f50c2cc1742e9c0a80f441f86b19" + integrity sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ== + dependencies: + babel-code-frame "^6.22.0" + chalk "^2.4.1" + chokidar "^3.3.0" + micromatch "^3.1.10" + minimatch "^3.0.4" + semver "^5.6.0" + tapable "^1.0.0" + worker-rpc "^0.1.0" + fork-ts-checker-webpack-plugin@6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.0.5.tgz#20d8766b644833cc5c600b9b7c6fbba0c8087419" @@ -6073,17 +7089,22 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + gensync@^1.0.0-beta.1: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.0: +get-intrinsic@^1.0.0, get-intrinsic@^1.0.1, get-intrinsic@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.2.tgz#6820da226e50b24894e08859469dc68361545d49" integrity sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg== @@ -6102,6 +7123,16 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== + +get-stdin@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -6141,13 +7172,18 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@~5.1.0: +glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@~5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== dependencies: is-glob "^4.0.1" +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + glob@7.1.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" @@ -6160,6 +7196,22 @@ glob@7.1.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" +global-modules@2.0.0, global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + global@^4.3.2: version "4.4.0" resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" @@ -6173,6 +7225,26 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +globby@8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" + integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== + dependencies: + array-union "^1.0.1" + dir-glob "2.0.0" + fast-glob "^2.0.2" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + globby@^11.0.1: version "11.0.1" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" @@ -6185,6 +7257,32 @@ globby@^11.0.1: merge2 "^1.3.0" slash "^3.0.0" +globby@^9.0.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" + integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.2" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" + +globjoin@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" + integrity sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM= + +gonzales-pe@^4.2.3, gonzales-pe@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3" + integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ== + dependencies: + minimist "^1.2.5" + got@9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -6212,7 +7310,7 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -gzip-size@^5.0.0: +gzip-size@5.1.1, gzip-size@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== @@ -6238,6 +7336,11 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + harmony-reflect@^1.4.6: version "1.6.1" resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.1.tgz#c108d4f2bb451efef7a37861fdbdae72c9bdefa9" @@ -6376,6 +7479,18 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== +hosted-git-info@^3.0.6: + version "3.0.7" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.7.tgz#a30727385ea85acfcee94e0aad9e368c792e036c" + integrity sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ== + dependencies: + lru-cache "^6.0.0" + +hotkeys-js@^3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/hotkeys-js/-/hotkeys-js-3.8.1.tgz#fa7051f73bf1dc92a8b8d580a40b247f91966376" + integrity sha512-YlhVQtyG9f1b7GhtzdhR0Pl+cImD1ZrKI6zYUa7QLd0zuThiL7RzZ+ANJyy7z+kmcCpNYBf5PjBa3CjiQ5PFpw== + hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" @@ -6418,7 +7533,17 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -htmlparser2@^3.9.1: +html-tags@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b" + integrity sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos= + +html-tags@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" + integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== + +htmlparser2@^3.10.0, htmlparser2@^3.9.1: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== @@ -6511,7 +7636,7 @@ hyphenate-style-name@^1.0.0: resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== -iconv-lite@0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -6549,7 +7674,17 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= -ignore@^5.1.4: +ignore@^3.3.5: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + +ignore@^4.0.3, ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.0.4, ignore@^5.0.5, ignore@^5.1.4, ignore@^5.1.8: version "5.1.8" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== @@ -6559,6 +7694,11 @@ image-size@~0.5.0: resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= +immer@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/immer/-/immer-1.10.0.tgz#bad67605ba9c810275d91e1c2a47d4582e98286d" + integrity sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg== + immer@7.0.5: version "7.0.5" resolved "https://registry.yarnpkg.com/immer/-/immer-7.0.5.tgz#8af347db5b60b40af8ae7baf1784ea4d35b5208e" @@ -6589,7 +7729,7 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.1.0, import-fresh@^3.2.1: +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -6604,6 +7744,16 @@ import-from@^2.1.0: dependencies: resolve-from "^3.0.0" +import-lazy@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-3.1.0.tgz#891279202c8a2280fdbd6674dbd8da1a1dfc67cc" + integrity sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ== + +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + import-local@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" @@ -6612,11 +7762,21 @@ import-local@^3.0.2: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" +import-modules@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-modules/-/import-modules-2.1.0.tgz#abe7df297cb6c1f19b57246eb8b8bd9664b6d8c2" + integrity sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A== + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" @@ -6640,7 +7800,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6655,11 +7815,44 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inquirer@7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" + integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.2.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + insert-css@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/insert-css/-/insert-css-2.0.0.tgz#eb5d1097b7542f4c79ea3060d3aee07d053880f4" integrity sha1-610Ql7dUL0x56jBg067gfQU4gPQ= +internal-slot@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" + integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== + dependencies: + es-abstract "^1.17.0-next.1" + has "^1.0.3" + side-channel "^1.0.2" + intl-format-cache@^4.2.21: version "4.3.1" resolved "https://registry.yarnpkg.com/intl-format-cache/-/intl-format-cache-4.3.1.tgz#484d31a9872161e6c02139349b259a6229ade377" @@ -6707,6 +7900,11 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +irregular-plurals@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.2.0.tgz#b19c490a0723798db51b235d7e39add44dab0822" + integrity sha512-YqTdPLfwP7YFN0SsD3QUVCkm9ZG2VzOXv3DOrw5G5mkMbVwptTwVcFv7/C0vOpBmgTxAeTG19XpUs1E522LW9Q== + is-absolute-url@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" @@ -6726,6 +7924,24 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumeric@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz#4a9cef71daf4c001c1d81d63d140cf53fd6889f4" + integrity sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ= + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -6750,11 +7966,16 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-buffer@^1.0.2, is-buffer@^1.1.5: +is-buffer@^1.0.2, is-buffer@^1.1.4, is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + is-callable@^1.1.4, is-callable@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" @@ -6812,6 +8033,11 @@ is-date-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -6886,6 +8112,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + is-negative-zero@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" @@ -6913,11 +8144,16 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== -is-plain-obj@^1.0.0: +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -6942,11 +8178,21 @@ is-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= +is-regexp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d" + integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA== + is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== +is-root@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -6957,6 +8203,16 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + +is-supported-regexp-flag@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz#21ee16518d2c1dd3edd3e9a0d57e50207ac364ca" + integrity sha512-3vcJecUUrpgCqc/ca0aWeNu64UGgxcvO60K/Fkr1N6RSvfGCTU60UKN68JDmKokgba0rFFJs12EnzOQa14ubKQ== + is-svg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" @@ -6976,11 +8232,21 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-whitespace-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" + integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== + is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== +is-word-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" + integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== + is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" @@ -7582,6 +8848,11 @@ joi2types@~1.0.7: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + js-yaml@^3.12.1, js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" @@ -7719,11 +8990,21 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -7771,6 +9052,21 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonfilter@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/jsonfilter/-/jsonfilter-1.1.2.tgz#21ef7cedc75193813c75932e96a98be205ba5a11" + integrity sha1-Ie987cdRk4E8dZMulqmL4gW6WhE= + dependencies: + JSONStream "^0.8.4" + minimist "^1.1.0" + stream-combiner "^0.2.1" + through2 "^0.6.3" + +jsonparse@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-0.0.5.tgz#330542ad3f0a654665b778f3eb2d9a9fa507ac64" + integrity sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ= + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -7781,6 +9077,14 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz#41108d2cec408c3453c1bbe8a4aae9e1e2bd8f82" + integrity sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q== + dependencies: + array-includes "^3.1.2" + object.assign "^4.1.2" + keyv@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" @@ -7814,7 +9118,7 @@ kind-of@^5.0.0: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -7824,6 +9128,28 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +known-css-properties@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.11.0.tgz#0da784f115ea77c76b81536d7052e90ee6c86a8a" + integrity sha512-bEZlJzXo5V/ApNNa5z375mJC6Nrz4vG43UgcSCrg2OHC+yuB6j0iDSrY7RQ/+PRofFB03wNIIt9iXIVLr4wc7w== + +known-css-properties@^0.20.0: + version "0.20.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.20.0.tgz#0570831661b47dd835293218381166090ff60e96" + integrity sha512-URvsjaA9ypfreqJ2/ylDr5MUERhJZ+DhguoWRr2xgS5C7aGCalXo+ewL+GixgKBfhT2vuL02nbIgNGqVWgTOYw== + +language-subtag-registry@~0.3.2: + version "0.3.21" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" + integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== + +language-tags@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo= + dependencies: + language-subtag-registry "~0.3.2" + last-call-webpack-plugin@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" @@ -7849,6 +9175,14 @@ lcid@^3.0.0: dependencies: invert-kv "^3.0.0" +ldjson-stream@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ldjson-stream/-/ldjson-stream-1.2.1.tgz#91beceda5ac4ed2b17e649fb777e7abfa0189c2b" + integrity sha1-kb7O2lrE7SsX5kn7d356v6AYnCs= + dependencies: + split2 "^0.2.1" + through2 "^0.6.1" + less-loader@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-5.0.0.tgz#498dde3a6c6c4f887458ee9ed3f086a12ad1b466" @@ -7878,11 +9212,24 @@ levdist@^1.0.0: resolved "https://registry.yarnpkg.com/levdist/-/levdist-1.0.0.tgz#91d7a3044964f2ccc421a0477cac827fe75c5718" integrity sha1-kdejBElk8szEIaBHfKyCf+dcVxg= +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -7938,6 +9285,16 @@ listr2@^3.2.2: rxjs "^6.6.3" through "^2.3.8" +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -7953,6 +9310,15 @@ loader-runner@^2.4.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" @@ -8004,12 +9370,17 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= -lodash.memoize@^4.1.2: +lodash.memoize@4.1.2, lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= @@ -8049,11 +9420,23 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@4.17.20, "lodash@>=3.5 <5", lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5: +lodash.zip@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020" + integrity sha1-7GZi5IlkCO1KtsVCo5kLcswIACA= + +lodash@4.17.20, "lodash@>=3.5 <5", lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== +log-symbols@^2.0.0, log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + log-symbols@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" @@ -8083,6 +9466,11 @@ lolex@^5.0.0: dependencies: "@sinonjs/commons" "^1.7.0" +longest-streak@^2.0.0, longest-streak@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" + integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -8090,6 +9478,14 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3 dependencies: js-tokens "^3.0.0 || ^4.0.0" +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" @@ -8163,6 +9559,21 @@ map-cache@^0.2.2: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" + integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= + +map-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5" + integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g== + map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -8170,6 +9581,16 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +markdown-escapes@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" + integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== + +markdown-table@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" + integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== + marked-terminal@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-4.1.0.tgz#01087372d3636dc7cb286475a1d6147187f500e0" @@ -8194,6 +9615,11 @@ matchmediaquery@^0.3.0: dependencies: css-mediaquery "^0.1.2" +mathml-tag-names@^2.0.1, mathml-tag-names@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" + integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -8203,6 +9629,41 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +mdast-util-compact@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-1.0.4.tgz#d531bb7667b5123abf20859be086c4d06c894593" + integrity sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg== + dependencies: + unist-util-visit "^1.1.0" + +mdast-util-from-markdown@^0.8.0: + version "0.8.4" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.4.tgz#2882100c1b9fc967d3f83806802f303666682d32" + integrity sha512-jj891B5pV2r63n2kBTFh8cRI2uR9LQHsXG1zSDqfhXkIlDzrTcIlbB5+5aaYEkl8vOPIOPLf8VT7Ere1wWTMdw== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-string "^2.0.0" + micromark "~2.11.0" + parse-entities "^2.0.0" + unist-util-stringify-position "^2.0.0" + +mdast-util-to-markdown@^0.6.0: + version "0.6.2" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.2.tgz#8fe6f42a2683c43c5609dfb40407c095409c85b4" + integrity sha512-iRczns6WMvu0hUw02LXsPDJshBIwtUPbvHBWo19IQeU0YqmzlA8Pd30U8V7uiI0VPkxzS7A/NXBXH6u+HS87Zg== + dependencies: + "@types/unist" "^2.0.0" + longest-streak "^2.0.0" + mdast-util-to-string "^2.0.0" + parse-entities "^2.0.0" + repeat-string "^1.0.0" + zwitch "^1.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + mdn-data@2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" @@ -8269,6 +9730,38 @@ memory-fs@^0.5.0: errno "^0.1.3" readable-stream "^2.0.1" +meow@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" + integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== + dependencies: + camelcase-keys "^4.0.0" + decamelize-keys "^1.0.0" + loud-rejection "^1.0.0" + minimist-options "^3.0.1" + normalize-package-data "^2.3.4" + read-pkg-up "^3.0.0" + redent "^2.0.0" + trim-newlines "^2.0.0" + yargs-parser "^10.0.0" + +meow@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.0.tgz#0fcaa267e35e4d58584b8205923df6021ddcc7ba" + integrity sha512-fNWkgM1UVMey2kf24yLiccxLihc5W+6zVus3/N0b+VfnJgxV99E9u04X6NAiKdg6ED7DAQBX5sy36NM0QJZkWA== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + merge-deep@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.2.tgz#f39fa100a4f1bd34ff29f7d2bf4508fbb8d83ad2" @@ -8288,7 +9781,7 @@ merge-stream@2.0.0, merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0: +merge2@^1.2.3, merge2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -8298,6 +9791,19 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= +microevent.ts@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" + integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== + +micromark@~2.11.0: + version "2.11.2" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.2.tgz#e8b6a05f54697d2d3d27fc89600c6bc40dd05f35" + integrity sha512-IXuP76p2uj8uMg4FQc1cRE7lPCLsfAXuEfdjtdO55VRiFO1asrCSQ5g43NmPqFtRwzEnEhafRVzn2jg0UiKArQ== + dependencies: + debug "^4.0.0" + parse-entities "^2.0.0" + micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -8372,6 +9878,11 @@ min-document@^2.19.0: dependencies: dom-walk "^0.1.0" +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + mini-create-react-context@^0.3.0: version "0.3.3" resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.3.3.tgz#b1b2bc6604d3a6c5d9752bad7692615410ebb38e" @@ -8415,14 +9926,31 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@^3.0.4: +minimatch@3.0.4, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist-options@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" + integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -8558,11 +10086,32 @@ multer@1.4.2: type-is "^1.6.4" xtend "^4.0.0" +multimap@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multimap/-/multimap-1.1.0.tgz#5263febc085a1791c33b59bb3afc6a76a2a10ca8" + integrity sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw== + +multimatch@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" + integrity sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== + dependencies: + "@types/minimatch" "^3.0.3" + array-differ "^3.0.0" + array-union "^2.1.0" + arrify "^2.0.1" + minimatch "^3.0.4" + mustache@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.0.1.tgz#d99beb031701ad433338e7ea65e0489416c854a2" integrity sha512-yL5VE97+OXn4+Er3THSmTdCFCtx5hHWzrolvH+JObZnUYwuaG7XV+Ch4fR2cIrcYI0tFHxS7iyFYl14bW8y2sA== +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + mz@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" @@ -8577,6 +10126,11 @@ nan@^2.12.1: resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== +nanoid@^3.1.20: + version "3.1.20" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -8701,12 +10255,12 @@ node-notifier@^6.0.0: shellwords "^0.1.1" which "^1.3.1" -node-releases@^1.1.67: +node-releases@^1.1.52, node-releases@^1.1.67: version "1.1.67" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.67.tgz#28ebfcccd0baa6aad8e8d4d8fe4cbc49ae239c12" integrity sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg== -normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -8716,6 +10270,16 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +normalize-package-data@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.0.tgz#1f8a7c423b3d2e85eb36985eaf81de381d01301a" + integrity sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw== + dependencies: + hosted-git-info "^3.0.6" + resolve "^1.17.0" + semver "^7.3.2" + validate-npm-package-license "^3.0.1" + normalize-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" @@ -8738,6 +10302,11 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= +normalize-selector@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03" + integrity sha1-0LFF62kRicY6eNIB3E/bEpPvDAM= + normalize-url@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" @@ -8813,7 +10382,7 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.8.0: +object-inspect@^1.8.0, object-inspect@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== @@ -8830,7 +10399,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0, object.assign@^4.1.1: +object.assign@^4.1.0, object.assign@^4.1.1, object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== @@ -8840,7 +10409,7 @@ object.assign@^4.1.0, object.assign@^4.1.1: has-symbols "^1.0.1" object-keys "^1.1.1" -object.entries@^1.1.0: +object.entries@^1.1.0, object.entries@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.3.tgz#c601c7f168b62374541a07ddbd3e2d5e4f7711a6" integrity sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg== @@ -8850,6 +10419,16 @@ object.entries@^1.1.0: es-abstract "^1.18.0-next.1" has "^1.0.3" +object.fromentries@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.3.tgz#13cefcffa702dc67750314a3305e8cb3fad1d072" + integrity sha512-IDUSMXs6LOSJBWE++L0lzIbSqHl9KDCfff2x/JSEIDtEUavUnyMYC2ZGay/04Zq4UT8lvd4xNhU4/YHKibAOlw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + has "^1.0.3" + object.getownpropertydescriptors@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz#0dfda8d108074d9c563e80490c883b6661091544" @@ -8866,7 +10445,7 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0: +object.values@^1.1.0, object.values@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== @@ -8919,6 +10498,14 @@ ono@^4.0.11: dependencies: format-util "^1.0.3" +open@^7.0.2: + version "7.3.0" + resolved "https://registry.yarnpkg.com/open/-/open-7.3.0.tgz#45461fdee46444f3645b6e14eb3ca94b82e1be69" + integrity sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + opener@^1.5.1: version "1.5.2" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" @@ -8944,6 +10531,18 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + original@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" @@ -8965,6 +10564,11 @@ os-locale@5.0.0: lcid "^3.0.0" mem "^5.0.0" +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" @@ -9086,6 +10690,37 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" +parse-entities@^1.0.2, parse-entities@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50" + integrity sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -9183,6 +10818,13 @@ path-to-regexp@2.4.0: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.4.0.tgz#35ce7f333d5616f1c1e1bfe266c3aba2e5b2e704" integrity sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w== +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -9216,12 +10858,17 @@ picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= -pify@^4.0.1: +pify@^4.0.0, pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== @@ -9241,6 +10888,13 @@ pkg-conf@^2.1.0: find-up "^2.0.0" load-json-file "^4.0.0" +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -9255,7 +10909,7 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pkg-up@3.1.0: +pkg-up@3.1.0, pkg-up@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== @@ -9269,6 +10923,18 @@ please-upgrade-node@^3.2.0: dependencies: semver-compare "^1.0.0" +plur@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/plur/-/plur-4.0.0.tgz#729aedb08f452645fe8c58ef115bf16b0a73ef84" + integrity sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg== + dependencies: + irregular-plurals "^3.2.0" + +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" @@ -9485,6 +11151,13 @@ postcss-gap-properties@^2.0.0: dependencies: postcss "^7.0.2" +postcss-html@^0.36.0: + version "0.36.0" + resolved "https://registry.yarnpkg.com/postcss-html/-/postcss-html-0.36.0.tgz#b40913f94eaacc2453fd30a1327ad6ee1f88b204" + integrity sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw== + dependencies: + htmlparser2 "^3.10.0" + postcss-image-set-function@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" @@ -9501,6 +11174,13 @@ postcss-initial@^3.0.0: lodash.template "^4.5.0" postcss "^7.0.2" +postcss-jsx@^0.36.0: + version "0.36.4" + resolved "https://registry.yarnpkg.com/postcss-jsx/-/postcss-jsx-0.36.4.tgz#37a68f300a39e5748d547f19a747b3257240bd50" + integrity sha512-jwO/7qWUvYuWYnpOb0+4bIIgJt7003pgU3P6nETBLaOyBXuTD55ho21xnals5nBrlpTIFodyd3/jBi6UO3dHvA== + dependencies: + "@babel/core" ">=7.2.2" + postcss-lab-function@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" @@ -9510,6 +11190,13 @@ postcss-lab-function@^2.0.1: postcss "^7.0.2" postcss-values-parser "^2.0.0" +postcss-less@^3.1.0, postcss-less@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-3.1.4.tgz#369f58642b5928ef898ffbc1a6e93c958304c5ad" + integrity sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA== + dependencies: + postcss "^7.0.14" + postcss-load-config@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" @@ -9535,6 +11222,14 @@ postcss-logical@^3.0.0: dependencies: postcss "^7.0.2" +postcss-markdown@^0.36.0: + version "0.36.0" + resolved "https://registry.yarnpkg.com/postcss-markdown/-/postcss-markdown-0.36.0.tgz#7f22849ae0e3db18820b7b0d5e7833f13a447560" + integrity sha512-rl7fs1r/LNSB2bWRhyZ+lM/0bwKv9fhl38/06gF6mKMo/NPnp55+K1dSTosSVjFZc0e1ppBlu+WT91ba0PMBfQ== + dependencies: + remark "^10.0.1" + unist-util-find-all-after "^1.0.2" + postcss-media-minmax@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" @@ -9542,6 +11237,11 @@ postcss-media-minmax@^4.0.0: dependencies: postcss "^7.0.2" +postcss-media-query-parser@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" + integrity sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ= + postcss-merge-longhand@^4.0.11: version "4.0.11" resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" @@ -9834,13 +11534,51 @@ postcss-replace-overflow-wrap@^3.0.0: dependencies: postcss "^7.0.2" -postcss-safe-parser@4.0.2: +postcss-reporter@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-6.0.1.tgz#7c055120060a97c8837b4e48215661aafb74245f" + integrity sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw== + dependencies: + chalk "^2.4.1" + lodash "^4.17.11" + log-symbols "^2.2.0" + postcss "^7.0.7" + +postcss-resolve-nested-selector@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" + integrity sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4= + +postcss-safe-parser@4.0.2, postcss-safe-parser@^4.0.0, postcss-safe-parser@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz#a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96" integrity sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g== dependencies: postcss "^7.0.26" +postcss-sass@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/postcss-sass/-/postcss-sass-0.3.5.tgz#6d3e39f101a53d2efa091f953493116d32beb68c" + integrity sha512-B5z2Kob4xBxFjcufFnhQ2HqJQ2y/Zs/ic5EZbCywCkxKd756Q40cIQ/veRDwSrw1BF6+4wUgmpm0sBASqVi65A== + dependencies: + gonzales-pe "^4.2.3" + postcss "^7.0.1" + +postcss-sass@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/postcss-sass/-/postcss-sass-0.4.4.tgz#91f0f3447b45ce373227a98b61f8d8f0785285a3" + integrity sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg== + dependencies: + gonzales-pe "^4.3.0" + postcss "^7.0.21" + +postcss-scss@^2.0.0, postcss-scss@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.1.1.tgz#ec3a75fa29a55e016b90bf3269026c53c1d2b383" + integrity sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA== + dependencies: + postcss "^7.0.6" + postcss-selector-matches@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" @@ -9857,7 +11595,7 @@ postcss-selector-not@^4.0.0: balanced-match "^1.0.0" postcss "^7.0.2" -postcss-selector-parser@^3.0.0: +postcss-selector-parser@^3.0.0, postcss-selector-parser@^3.1.0: version "3.1.2" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== @@ -9875,7 +11613,7 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: version "6.0.4" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== @@ -9885,6 +11623,22 @@ postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: uniq "^1.0.1" util-deprecate "^1.0.2" +postcss-sorting@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-sorting/-/postcss-sorting-4.1.0.tgz#a107f0bf3852977fa64e4442bc340c88d5aacdb3" + integrity sha512-r4T2oQd1giURJdHQ/RMb72dKZCuLOdWx2B/XhXN1Y1ZdnwXsKH896Qz6vD4tFy9xSjpKNYhlZoJmWyhH/7JUQw== + dependencies: + lodash "^4.17.4" + postcss "^7.0.0" + +postcss-sorting@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-sorting/-/postcss-sorting-5.0.1.tgz#10d5d0059eea8334dacc820c0121864035bc3f11" + integrity sha512-Y9fUFkIhfrm6i0Ta3n+89j56EFqaNRdUKqXyRp6kvTcSXnmgEjaVowCXH+JBe9+YKWqd4nc28r2sgwnzJalccA== + dependencies: + lodash "^4.17.14" + postcss "^7.0.17" + postcss-svgo@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" @@ -9895,6 +11649,11 @@ postcss-svgo@^4.0.2: postcss-value-parser "^3.0.0" svgo "^1.0.0" +postcss-syntax@^0.36.2: + version "0.36.2" + resolved "https://registry.yarnpkg.com/postcss-syntax/-/postcss-syntax-0.36.2.tgz#f08578c7d95834574e5593a82dfbfa8afae3b51c" + integrity sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w== + postcss-unique-selectors@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" @@ -9904,7 +11663,7 @@ postcss-unique-selectors@^4.0.1: postcss "^7.0.0" uniqs "^2.0.0" -postcss-value-parser@^3.0.0: +postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.0: version "3.3.1" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== @@ -9932,7 +11691,7 @@ postcss@7.0.32: source-map "^0.6.1" supports-color "^6.1.0" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.13, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.31, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7: version "7.0.35" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== @@ -9941,6 +11700,20 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2 source-map "^0.6.1" supports-color "^6.1.0" +postcss@^8.1.4, postcss@^8.1.6: + version "8.2.2" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.2.tgz#60613b62297005084fd21024a68637798864fe26" + integrity sha512-HM1NDNWLgglJPQQMNwvLxgH2KcrKZklKLi/xXYIOaqQB57p/pDWEJNS83PVICYsn1Dg/9C26TiejNr422/ePaQ== + dependencies: + colorette "^1.2.1" + nanoid "^3.1.20" + source-map "^0.6.1" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -9996,6 +11769,11 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -10128,7 +11906,7 @@ query-string@^4.1.0: object-assign "^4.1.0" strict-uri-encode "^1.0.0" -query-string@^6.0.0, query-string@^6.11.0: +query-string@^6.0.0, query-string@^6.11.0, query-string@^6.13.2: version "6.13.8" resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.8.tgz#8cf231759c85484da3cf05a851810d8e825c1159" integrity sha512-jxJzQI2edQPE/NPUOusNjO/ZOGqr1o2OBa/3M00fU76FsLXDVbJDv/p7ng5OdQyorKrkRz1oqfwmbe5MAMePQg== @@ -10152,6 +11930,16 @@ querystringify@^2.1.1: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== +quick-lru@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" + integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= + +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + raf@^3.1.0, raf@^3.3.2, raf@^3.4.0: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" @@ -10665,6 +12453,50 @@ react-copy-to-clipboard@^5.0.1: copy-to-clipboard "^3" prop-types "^15.5.8" +react-dev-inspector@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/react-dev-inspector/-/react-dev-inspector-1.1.4.tgz#32d5af126bdce93d153930eaabafcc63ac93e4c6" + integrity sha512-co+z6wgOHtbVmvY76/X00pShDXtzxrelkO1n44lpRbeQLIjRZskvDR+4GtXsnlYOABUO2lubGoJVjiqTkcrIkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.11.6" + "@babel/parser" "^7.11.5" + "@babel/traverse" "^7.11.5" + hotkeys-js "^3.8.1" + loader-utils "^2.0.0" + query-string "^6.13.2" + react-dev-utils "^10.2.1" + +react-dev-utils@^10.2.1: + version "10.2.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-10.2.1.tgz#f6de325ae25fa4d546d09df4bb1befdc6dd19c19" + integrity sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ== + dependencies: + "@babel/code-frame" "7.8.3" + address "1.1.2" + browserslist "4.10.0" + chalk "2.4.2" + cross-spawn "7.0.1" + detect-port-alt "1.1.6" + escape-string-regexp "2.0.0" + filesize "6.0.1" + find-up "4.1.0" + fork-ts-checker-webpack-plugin "3.1.1" + global-modules "2.0.0" + globby "8.0.2" + gzip-size "5.1.1" + immer "1.10.0" + inquirer "7.0.4" + is-root "2.1.0" + loader-utils "1.2.3" + open "^7.0.2" + pkg-up "3.1.0" + react-error-overlay "^6.0.7" + recursive-readdir "2.2.2" + shell-quote "1.7.2" + strip-ansi "6.0.0" + text-table "0.2.0" + react-dom@^16.12.0, react-dom@^16.13.1: version "16.14.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" @@ -10680,6 +12512,11 @@ react-error-overlay@6.0.7: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108" integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA== +react-error-overlay@^6.0.7: + version "6.0.8" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.8.tgz#474ed11d04fc6bda3af643447d85e9127ed6b5de" + integrity sha512-HvPuUQnLp5H7TouGq3kzBeioJmXms1wHy9EGjz2OURWBp4qZO6AfGEcnxts1D/CbwPLRAgTMPCEgYhA3sEM4vw== + react-fast-compare@^3.1.1: version "3.2.0" resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" @@ -10845,6 +12682,22 @@ react@^16.12.0, react@^16.13.1: object-assign "^4.1.1" prop-types "^15.6.2" +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + read-pkg-up@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" @@ -10862,6 +12715,15 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" @@ -10894,7 +12756,7 @@ read-pkg@^5.2.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@1.1.x: +readable-stream@1.1.x, readable-stream@^1.0.33, readable-stream@~1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= @@ -10904,7 +12766,7 @@ readable-stream@1.1.x: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: +readable-stream@3, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -10913,6 +12775,16 @@ readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +"readable-stream@>=1.0.33-1 <1.1.0-0": + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" @@ -10948,6 +12820,29 @@ realpath-native@^2.0.0: resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-2.0.0.tgz#7377ac429b6e1fd599dc38d08ed942d0d7beb866" integrity sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q== +recursive-readdir@2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + dependencies: + minimatch "3.0.4" + +redent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" + integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= + dependencies: + indent-string "^3.0.0" + strip-indent "^2.0.0" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + redeyed@~2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" @@ -11010,6 +12905,24 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexp-tree@^0.1.21, regexp-tree@~0.1.1: + version "0.1.21" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.21.tgz#55e2246b7f7d36f1b461490942fa780299c400d7" + integrity sha512-kUUXjX4AnqnR8KRTCrayAo9PzYMRKmVoGgaz2tBuz0MF3g1ZbGebmtW0yFHfFK9CmBjQKeYIgoL22pFLBJY7sw== + +regexp.prototype.flags@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" + integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +regexpp@^3.0.0, regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + regexpu-core@^4.7.1: version "4.7.1" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" @@ -11034,6 +12947,100 @@ regjsparser@^0.6.4: dependencies: jsesc "~0.5.0" +remark-parse@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-5.0.0.tgz#4c077f9e499044d1d5c13f80d7a98cf7b9285d95" + integrity sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA== + dependencies: + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^1.1.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^1.0.0" + vfile-location "^2.0.0" + xtend "^4.0.1" + +remark-parse@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-6.0.3.tgz#c99131052809da482108413f87b0ee7f52180a3a" + integrity sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg== + dependencies: + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^1.1.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^1.0.0" + vfile-location "^2.0.0" + xtend "^4.0.1" + +remark-parse@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" + integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== + dependencies: + mdast-util-from-markdown "^0.8.0" + +remark-stringify@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-6.0.4.tgz#16ac229d4d1593249018663c7bddf28aafc4e088" + integrity sha512-eRWGdEPMVudijE/psbIDNcnJLRVx3xhfuEsTDGgH4GsFF91dVhw5nhmnBppafJ7+NWINW6C7ZwWbi30ImJzqWg== + dependencies: + ccount "^1.0.0" + is-alphanumeric "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + longest-streak "^2.0.1" + markdown-escapes "^1.0.0" + markdown-table "^1.1.0" + mdast-util-compact "^1.0.0" + parse-entities "^1.0.2" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + stringify-entities "^1.0.1" + unherit "^1.0.4" + xtend "^4.0.1" + +remark-stringify@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-9.0.1.tgz#576d06e910548b0a7191a71f27b33f1218862894" + integrity sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg== + dependencies: + mdast-util-to-markdown "^0.6.0" + +remark@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/remark/-/remark-10.0.1.tgz#3058076dc41781bf505d8978c291485fe47667df" + integrity sha512-E6lMuoLIy2TyiokHprMjcWNJ5UxfGQjaMSMhV+f4idM625UjjK4j798+gPs5mfjzDE6vL0oFKVeZM6gZVSVrzQ== + dependencies: + remark-parse "^6.0.0" + remark-stringify "^6.0.0" + unified "^7.0.0" + +remark@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/remark/-/remark-13.0.0.tgz#d15d9bf71a402f40287ebe36067b66d54868e425" + integrity sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA== + dependencies: + remark-parse "^9.0.0" + remark-stringify "^9.0.0" + unified "^9.1.0" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -11044,11 +13051,16 @@ repeat-element@^1.1.2: resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.6.1: +repeat-string@^1.0.0, repeat-string@^1.5.4, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= +replace-ext@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= + request-promise-core@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" @@ -11096,6 +13108,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" @@ -11106,6 +13123,11 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= +reserved-words@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1" + integrity sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE= + resize-observer-polyfill@^1.5.0, resize-observer-polyfill@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" @@ -11155,7 +13177,7 @@ resolve@1.17.0: dependencies: path-parse "^1.0.6" -resolve@^1.10.0, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.8.1: +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.3.2, resolve@^1.8.1: version "1.19.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== @@ -11198,6 +13220,13 @@ rgba-regex@^1.0.0: resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -11377,6 +13406,11 @@ rsvp@^4.8.4: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== +run-async@^2.2.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + run-parallel@^1.1.9: version "1.1.10" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" @@ -11389,7 +13423,7 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^6.6.3: +rxjs@^6.5.3, rxjs@^6.6.3: version "6.6.3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== @@ -11413,6 +13447,13 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" +safe-regex@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" + integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== + dependencies: + regexp-tree "~0.1.1" + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -11531,7 +13572,7 @@ semver@^6.0.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.2: +semver@^7.2.1, semver@^7.3.2: version "7.3.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== @@ -11665,11 +13706,25 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +side-channel@^1.0.2, side-channel@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -11696,6 +13751,11 @@ sisteransi@^1.0.5: resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + slash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" @@ -11706,6 +13766,15 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + slice-ansi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" @@ -11875,6 +13944,11 @@ spdy@4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" +specificity@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019" + integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg== + speed-measure-webpack-plugin@1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.3.tgz#6ff894fc83e8a6310dde3af863a0329cd79da4f5" @@ -11894,6 +13968,13 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" +split2@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/split2/-/split2-0.2.1.tgz#02ddac9adc03ec0bb78c1282ec079ca6e85ae900" + integrity sha1-At2smtwD7Au3jBKC7Aecpuha6QA= + dependencies: + through2 "~0.6.1" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -11945,6 +14026,11 @@ stackframe@^1.1.1: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== +state-toggle@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" + integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -11990,6 +14076,14 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" +stream-combiner@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.2.2.tgz#aec8cbac177b56b6f4fa479ced8c1912cee52858" + integrity sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg= + dependencies: + duplexer "~0.1.1" + through "~2.3.4" + stream-each@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" @@ -12055,6 +14149,15 @@ string-width@^2.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + string-width@^4.1.0, string-width@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" @@ -12064,6 +14167,19 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string.prototype.matchall@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.3.tgz#24243399bc31b0a49d19e2b74171a15653ec996a" + integrity sha512-OBxYDA2ifZQ2e13cP82dWFMaCV9CGF8GzmN4fljBVw5O5wep0lu4gacm1OL6MjROoUnB8VbkWRThqkV2YFLNxw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + has-symbols "^1.0.1" + internal-slot "^1.0.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.3" + string.prototype.trimend@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" @@ -12099,6 +14215,16 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +stringify-entities@^1.0.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-1.3.2.tgz#a98417e5471fd227b3e45d3db1861c11caf668f7" + integrity sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A== + dependencies: + character-entities-html4 "^1.0.0" + character-entities-legacy "^1.0.0" + is-alphanumerical "^1.0.0" + is-hexadecimal "^1.0.0" + stringify-object@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" @@ -12129,7 +14255,7 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.2.0: +strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -12161,6 +14287,18 @@ strip-indent@^2.0.0: resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + style-loader@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-2.0.0.tgz#9669602fd4690740eaaec137799a03addbbc393c" @@ -12169,6 +14307,11 @@ style-loader@2.0.0: loader-utils "^2.0.0" schema-utils "^3.0.0" +style-search@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" + integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI= + stylehacks@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" @@ -12178,6 +14321,184 @@ stylehacks@^4.0.0: postcss "^7.0.0" postcss-selector-parser "^3.0.0" +stylelint-config-css-modules@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/stylelint-config-css-modules/-/stylelint-config-css-modules-2.2.0.tgz#8ed2a54b1bdf637219e37cdeea1950405fd022ff" + integrity sha512-+zjcDbot+zbuxy1UA31k4G2lUG+nHUwnLyii3uT2F09B8kT2YrT9LZYNfMtAWlDidrxr7sFd5HX9EqPHGU3WKA== + +stylelint-config-prettier@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/stylelint-config-prettier/-/stylelint-config-prettier-8.0.2.tgz#da9de33da4c56893cbe7e26df239a7374045e14e" + integrity sha512-TN1l93iVTXpF9NJstlvP7nOu9zY2k+mN0NSFQ/VEGz15ZIP9ohdDZTtCWHs5LjctAhSAzaILULGbgiM0ItId3A== + +stylelint-config-rational-order@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/stylelint-config-rational-order/-/stylelint-config-rational-order-0.1.2.tgz#4e98e390783d437f0ec41fb73bc41992e78d02a0" + integrity sha512-Qo7ZQaihCwTqijfZg4sbdQQHtugOX/B1/fYh018EiDZHW+lkqH9uHOnsDwDPGZrYJuB6CoyI7MZh2ecw2dOkew== + dependencies: + stylelint "^9.10.1" + stylelint-order "^2.2.1" + +stylelint-config-recommended@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz#e0e547434016c5539fe2650afd58049a2fd1d657" + integrity sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ== + +stylelint-config-standard@^20.0.0: + version "20.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-20.0.0.tgz#06135090c9e064befee3d594289f50e295b5e20d" + integrity sha512-IB2iFdzOTA/zS4jSVav6z+wGtin08qfj+YyExHB3LF9lnouQht//YyB0KZq9gGz5HNPkddHOzcY8HsUey6ZUlA== + dependencies: + stylelint-config-recommended "^3.0.0" + +stylelint-declaration-block-no-ignored-properties@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/stylelint-declaration-block-no-ignored-properties/-/stylelint-declaration-block-no-ignored-properties-2.3.0.tgz#98a641a137bf057c97ef3d3c4a848cd339e736da" + integrity sha512-0Ly/mKc3prAhxBSY5TbmMMDAkUHYMOxdmUu/mNcFvB6A53C24x5Rsu1Vtrik9bKPKwgd75sZUhV9ZsWerPbuJQ== + dependencies: + postcss "^7.0.27" + +stylelint-no-unsupported-browser-features@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-4.1.4.tgz#14c58167ba101ab5f1d26b98dd1a0d75c9e0a423" + integrity sha512-GORR+/z4KkWP9SWO4fLmC5WAIjDClShSfwCYTuAB9cT8GE+rtOXeAqw5RyXuN9BLIBAPjeO2W7LFIrWUH8x7FA== + dependencies: + doiuse "^4.3.1" + lodash "^4.17.15" + postcss "^8.1.4" + +stylelint-order@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/stylelint-order/-/stylelint-order-2.2.1.tgz#cd2d4a0d81d91c705f1d275a58487e5ad5aa5828" + integrity sha512-019KBV9j8qp1MfBjJuotse6MgaZqGVtXMc91GU9MsS9Feb+jYUvUU3Z8XiClqPdqJZQ0ryXQJGg3U3PcEjXwfg== + dependencies: + lodash "^4.17.10" + postcss "^7.0.2" + postcss-sorting "^4.1.0" + +stylelint-order@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/stylelint-order/-/stylelint-order-4.1.0.tgz#692d05b7d0c235ac66fcf5ea1d9e5f08a76747f6" + integrity sha512-sVTikaDvMqg2aJjh4r48jsdfmqLT+nqB1MOsaBnvM3OwLx4S+WXcsxsgk5w18h/OZoxZCxuyXMh61iBHcj9Qiw== + dependencies: + lodash "^4.17.15" + postcss "^7.0.31" + postcss-sorting "^5.0.1" + +stylelint@^13.7.0: + version "13.8.0" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.8.0.tgz#446765dbe25e3617f819a0165956faf2563ddc23" + integrity sha512-iHH3dv3UI23SLDrH4zMQDjLT9/dDIz/IpoFeuNxZmEx86KtfpjDOscxLTFioQyv+2vQjPlRZnK0UoJtfxLICXQ== + dependencies: + "@stylelint/postcss-css-in-js" "^0.37.2" + "@stylelint/postcss-markdown" "^0.36.2" + autoprefixer "^9.8.6" + balanced-match "^1.0.0" + chalk "^4.1.0" + cosmiconfig "^7.0.0" + debug "^4.2.0" + execall "^2.0.0" + fast-glob "^3.2.4" + fastest-levenshtein "^1.0.12" + file-entry-cache "^6.0.0" + get-stdin "^8.0.0" + global-modules "^2.0.0" + globby "^11.0.1" + globjoin "^0.1.4" + html-tags "^3.1.0" + ignore "^5.1.8" + import-lazy "^4.0.0" + imurmurhash "^0.1.4" + known-css-properties "^0.20.0" + lodash "^4.17.20" + log-symbols "^4.0.0" + mathml-tag-names "^2.1.3" + meow "^8.0.0" + micromatch "^4.0.2" + normalize-selector "^0.2.0" + postcss "^7.0.35" + postcss-html "^0.36.0" + postcss-less "^3.1.4" + postcss-media-query-parser "^0.2.3" + postcss-resolve-nested-selector "^0.1.1" + postcss-safe-parser "^4.0.2" + postcss-sass "^0.4.4" + postcss-scss "^2.1.1" + postcss-selector-parser "^6.0.4" + postcss-syntax "^0.36.2" + postcss-value-parser "^4.1.0" + resolve-from "^5.0.0" + slash "^3.0.0" + specificity "^0.4.1" + string-width "^4.2.0" + strip-ansi "^6.0.0" + style-search "^0.1.0" + sugarss "^2.0.0" + svg-tags "^1.0.0" + table "^6.0.3" + v8-compile-cache "^2.2.0" + write-file-atomic "^3.0.3" + +stylelint@^9.10.1: + version "9.10.1" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-9.10.1.tgz#5f0ee3701461dff1d68284e1386efe8f0677a75d" + integrity sha512-9UiHxZhOAHEgeQ7oLGwrwoDR8vclBKlSX7r4fH0iuu0SfPwFaLkb1c7Q2j1cqg9P7IDXeAV2TvQML/fRQzGBBQ== + dependencies: + autoprefixer "^9.0.0" + balanced-match "^1.0.0" + chalk "^2.4.1" + cosmiconfig "^5.0.0" + debug "^4.0.0" + execall "^1.0.0" + file-entry-cache "^4.0.0" + get-stdin "^6.0.0" + global-modules "^2.0.0" + globby "^9.0.0" + globjoin "^0.1.4" + html-tags "^2.0.0" + ignore "^5.0.4" + import-lazy "^3.1.0" + imurmurhash "^0.1.4" + known-css-properties "^0.11.0" + leven "^2.1.0" + lodash "^4.17.4" + log-symbols "^2.0.0" + mathml-tag-names "^2.0.1" + meow "^5.0.0" + micromatch "^3.1.10" + normalize-selector "^0.2.0" + pify "^4.0.0" + postcss "^7.0.13" + postcss-html "^0.36.0" + postcss-jsx "^0.36.0" + postcss-less "^3.1.0" + postcss-markdown "^0.36.0" + postcss-media-query-parser "^0.2.3" + postcss-reporter "^6.0.0" + postcss-resolve-nested-selector "^0.1.1" + postcss-safe-parser "^4.0.0" + postcss-sass "^0.3.5" + postcss-scss "^2.0.0" + postcss-selector-parser "^3.1.0" + postcss-syntax "^0.36.2" + postcss-value-parser "^3.3.0" + resolve-from "^4.0.0" + signal-exit "^3.0.2" + slash "^2.0.0" + specificity "^0.4.1" + string-width "^3.0.0" + style-search "^0.1.0" + sugarss "^2.0.0" + svg-tags "^1.0.0" + table "^5.0.0" + +sugarss@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sugarss/-/sugarss-2.0.0.tgz#ddd76e0124b297d40bf3cca31c8b22ecb43bc61d" + integrity sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ== + dependencies: + postcss "^7.0.2" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -12217,6 +14538,11 @@ svg-parser@^2.0.0: resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== +svg-tags@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" + integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q= + svgo@^1.0.0, svgo@^1.2.2: version "1.3.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" @@ -12246,6 +14572,26 @@ symbol-tree@^3.2.2: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== +table@^5.0.0: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +table@^6.0.3, table@^6.0.4: + version "6.0.7" + resolved "https://registry.yarnpkg.com/table/-/table-6.0.7.tgz#e45897ffbcc1bcf9e8a87bf420f2c9e5a7a52a34" + integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== + dependencies: + ajv "^7.0.2" + lodash "^4.17.20" + slice-ansi "^4.0.0" + string-width "^4.2.0" + tapable@1.1.3, tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" @@ -12338,7 +14684,7 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -text-table@^0.2.0: +text-table@0.2.0, text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= @@ -12362,6 +14708,14 @@ throat@^5.0.0: resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== +through2@^0.6.1, through2@^0.6.3, through2@~0.6.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -12370,7 +14724,14 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.8: +through2@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "3" + +"through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -12405,6 +14766,13 @@ tiny-warning@^1.0.0, tiny-warning@^1.0.3: resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -12491,16 +14859,58 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +trim-newlines@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" + integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= + +trim-newlines@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" + integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== + +trim-trailing-lines@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" + integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + tryer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== -tslib@^1.10.0, tslib@^1.9.0: +tsconfig-paths@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" + integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + +tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tsutils@^3.17.1: + version "3.18.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.18.0.tgz#38add50a28ec97e988cb43c5b32e55d1ff4a222a" + integrity sha512-D9Tu8nE3E7D1Bsf/V29oMHceMf+gnVO+pDguk/A5YRo1cLpkiQ48ZnbbS57pvvHeY+OIeNQx1vf4ASPlEtRpcA== + dependencies: + tslib "^1.8.1" + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -12523,6 +14933,13 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -12540,6 +14957,11 @@ type-fest@^0.11.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + type-fest@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" @@ -12580,7 +15002,7 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^4.1.2: +typescript@^4.0.2, typescript@^4.1.2: version "4.1.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== @@ -12639,6 +15061,14 @@ umi@^3.3.3: react "^16.13.1" resolve-cwd "3.0.0" +unherit@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" + integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== + dependencies: + inherits "^2.0.0" + xtend "^4.0.0" + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -12662,6 +15092,44 @@ unicode-property-aliases-ecmascript@^1.0.4: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== +unified@^6.1.2: + version "6.2.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-6.2.0.tgz#7fbd630f719126d67d40c644b7e3f617035f6dba" + integrity sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-plain-obj "^1.1.0" + trough "^1.0.0" + vfile "^2.0.0" + x-is-string "^0.1.0" + +unified@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-7.1.0.tgz#5032f1c1ee3364bd09da12e27fdd4a7553c7be13" + integrity sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw== + dependencies: + "@types/unist" "^2.0.0" + "@types/vfile" "^3.0.0" + bail "^1.0.0" + extend "^3.0.0" + is-plain-obj "^1.1.0" + trough "^1.0.0" + vfile "^3.0.0" + x-is-string "^0.1.0" + +unified@^9.1.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + union-value@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" @@ -12696,6 +15164,63 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" +unist-util-find-all-after@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-1.0.5.tgz#5751a8608834f41d117ad9c577770c5f2f1b2899" + integrity sha512-lWgIc3rrTMTlK1Y0hEuL+k+ApzFk78h+lsaa2gHf63Gp5Ww+mt11huDniuaoq1H+XMK2lIIjjPkncxXcDp3QDw== + dependencies: + unist-util-is "^3.0.0" + +unist-util-find-all-after@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz#fdfecd14c5b7aea5e9ef38d5e0d5f774eeb561f6" + integrity sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ== + dependencies: + unist-util-is "^4.0.0" + +unist-util-is@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" + integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== + +unist-util-is@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.4.tgz#3e9e8de6af2eb0039a59f50c9b3e99698a924f50" + integrity sha512-3dF39j/u423v4BBQrk1AQ2Ve1FxY5W3JKwXxVFzBODQ6WEvccguhgp802qQLKSnxPODE6WuRZtV+ohlUg4meBA== + +unist-util-remove-position@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz#ec037348b6102c897703eee6d0294ca4755a2020" + integrity sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A== + dependencies: + unist-util-visit "^1.1.0" + +unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz#3f37fcf351279dcbca7480ab5889bb8a832ee1c6" + integrity sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ== + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz#25e43e55312166f3348cae6743588781d112c1e9" + integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g== + dependencies: + unist-util-is "^3.0.0" + +unist-util-visit@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" + integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== + dependencies: + unist-util-visit-parents "^2.0.0" + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -12846,6 +15371,11 @@ uuid@^3.3.2, uuid@^3.4.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" + integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== + v8-to-istanbul@^4.1.3: version "4.1.4" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz#b97936f21c0e2d9996d4985e5c5156e9d4e49cd6" @@ -12887,6 +15417,56 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +vfile-location@^2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.6.tgz#8a274f39411b8719ea5728802e10d9e0dff1519e" + integrity sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA== + +vfile-message@*, vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile-message@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-1.1.1.tgz#5833ae078a1dfa2d96e9647886cd32993ab313e1" + integrity sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA== + dependencies: + unist-util-stringify-position "^1.1.1" + +vfile@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-2.3.0.tgz#e62d8e72b20e83c324bc6c67278ee272488bf84a" + integrity sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w== + dependencies: + is-buffer "^1.1.4" + replace-ext "1.0.0" + unist-util-stringify-position "^1.0.0" + vfile-message "^1.0.0" + +vfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-3.0.1.tgz#47331d2abe3282424f4a4bb6acd20a44c4121803" + integrity sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ== + dependencies: + is-buffer "^2.0.0" + replace-ext "1.0.0" + unist-util-stringify-position "^1.0.0" + vfile-message "^1.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + vm-browserify@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" @@ -13111,7 +15691,7 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -word-wrap@~1.2.3: +word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== @@ -13123,6 +15703,13 @@ worker-farm@^1.7.0: dependencies: errno "~0.1.7" +worker-rpc@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" + integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== + dependencies: + microevent.ts "~0.1.1" + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -13155,7 +15742,7 @@ write-file-atomic@2.4.1: imurmurhash "^0.1.4" signal-exit "^3.0.2" -write-file-atomic@^3.0.0: +write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== @@ -13165,6 +15752,13 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + ws@^6.0.0, ws@^6.1.2: version "6.2.1" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" @@ -13177,6 +15771,11 @@ ws@^7.0.0: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.2.tgz#782100048e54eb36fe9843363ab1c68672b261dd" integrity sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA== +x-is-string@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82" + integrity sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI= + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" @@ -13187,7 +15786,7 @@ xmlchars@^2.1.1: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xtend@^4.0.0, xtend@~4.0.1: +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -13197,6 +15796,11 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== +y18n@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -13225,6 +15829,18 @@ yargs-parser@18.1.3, yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== + dependencies: + camelcase "^4.1.0" + +yargs-parser@^20.2.2, yargs-parser@^20.2.3: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + yargs@15.4.1, yargs@^15.3.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" @@ -13242,6 +15858,19 @@ yargs@15.4.1, yargs@^15.3.1: y18n "^4.0.0" yargs-parser "^18.1.2" +yargs@^16.1.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" @@ -13268,3 +15897,8 @@ zscroller@~0.4.0: integrity sha512-G5NiNLKx2+QhhvZi2yV1jjVXY50otktxkseX2hG2N/eixohOUk0AY8ZpbAxNqS9oJS/NxItCsowupy2tsXxAMw== dependencies: babel-runtime "6.x" + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== -- GitLab From 7166cfd90d2e25b5fe7e8121e74c1346578b28c0 Mon Sep 17 00:00:00 2001 From: victor-liu <victorliu1999@gmail.com> Date: Tue, 5 Jan 2021 11:33:15 +1100 Subject: [PATCH 02/18] added config folder and files --- config/config.ts | 53 ++++++++++++++++++++ config/defaultSettings.ts | 46 +++++++++++++++++ config/proxy.ts | 30 +++++++++++ config/routes.ts | 101 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 230 insertions(+) create mode 100644 config/config.ts create mode 100644 config/defaultSettings.ts create mode 100644 config/proxy.ts create mode 100644 config/routes.ts diff --git a/config/config.ts b/config/config.ts new file mode 100644 index 0000000..90d3634 --- /dev/null +++ b/config/config.ts @@ -0,0 +1,53 @@ +// https://umijs.org/config/ +import { defineConfig } from 'umi'; +import defaultSettings from '../config/defaultSettings'; +import proxy from './proxy'; +import routes from './routes'; + +const { REACT_APP_ENV } = process.env; + +export default defineConfig({ + hash: true, + antd: {}, + dva: { + hmr: true, + }, + history: { + type: 'browser', + }, + locale: { + // default zh-CN + default: 'zh-CN', + antd: true, + // default true, when it is true, will use `navigator.language` overwrite default + baseNavigator: true, + }, + dynamicImport: {}, + targets: { + ie: 11, + }, + // umi routes: https://umijs.org/docs/routing + routes, + // Theme for antd: https://ant.design/docs/react/customize-theme-cn + theme: { + 'primary-color': defaultSettings.primaryColor, + 'link-color': defaultSettings.linkColor, + 'success-color': defaultSettings.successColor, + 'warning-color': defaultSettings.warningColor, + 'error-color': defaultSettings.errorColor, + }, + title: false, + ignoreMomentLocale: true, + proxy: proxy[REACT_APP_ENV || 'dev'], + manifest: { + basePath: '/', + }, + // https://github.com/zthxxx/react-dev-inspector + plugins: ['react-dev-inspector/plugins/umi/react-inspector'], + inspectorConfig: { + // loader options type and docs see below + exclude: [], + babelPlugins: [], + babelOptions: {}, + }, +}); diff --git a/config/defaultSettings.ts b/config/defaultSettings.ts new file mode 100644 index 0000000..8e15958 --- /dev/null +++ b/config/defaultSettings.ts @@ -0,0 +1,46 @@ +import { Settings as ProSettings } from '@ant-design/pro-layout'; + +type DefaultSettings = Partial<ProSettings> & { + pwa: boolean; + projectKey: string; + + projectOwnerUrl: string; + termsAndConditionUrl: string; + privacyPolicyUrl: string; + + primaryColor: string; + linkColor: string; // 链接色 + successColor: string; // æˆåŠŸè‰² + warningColor: string; // è¦å‘Šè‰² + errorColor: string; // 错误色 +}; + +const proSettings: DefaultSettings = { + navTheme: 'dark', + // æ‹‚æ™“è“ + layout: 'side', + contentWidth: 'Fluid', + fixedHeader: false, + fixSiderbar: true, + colorWeak: false, + title: 'Ant Mobile', + pwa: false, + iconfontUrl: '', + projectKey: 'sample', + + // Global Footer Urls + projectOwnerUrl: 'https://joidea.com/', + termsAndConditionUrl: 'https://joidea.com/', + privacyPolicyUrl: 'https://joidea.com/', + + // Theme Colors + primaryColor: '#000000', + linkColor: '#60829f', // 链接色 + successColor: '#52c41a', // æˆåŠŸè‰² + warningColor: '#d81920', // è¦å‘Šè‰² + errorColor: '#f5222d', // 错误色 +}; + +export type { DefaultSettings }; + +export default proSettings; diff --git a/config/proxy.ts b/config/proxy.ts new file mode 100644 index 0000000..3fa70dd --- /dev/null +++ b/config/proxy.ts @@ -0,0 +1,30 @@ +/** + * 在生产环境 ä»£ç†æ˜¯æ— 法生效的,所以这里没有生产环境的é…ç½® + * The agent cannot take effect in the production environment + * so there is no configuration of the production environment + * For details, please see + * https://pro.ant.design/docs/deploy + */ +export default { + dev: { + '/api/': { + target: 'https://preview.pro.ant.design', + changeOrigin: true, + pathRewrite: { '^': '' }, + }, + }, + test: { + '/api/': { + target: 'https://preview.pro.ant.design', + changeOrigin: true, + pathRewrite: { '^': '' }, + }, + }, + pre: { + '/api/': { + target: 'your pre url', + changeOrigin: true, + pathRewrite: { '^': '' }, + }, + }, +}; diff --git a/config/routes.ts b/config/routes.ts new file mode 100644 index 0000000..85e494b --- /dev/null +++ b/config/routes.ts @@ -0,0 +1,101 @@ +export default [ + { + path: '/', + component: '../layouts/BlankLayout', + routes: [ + { + name: '403', + path: '/403', + component: './403', + }, + { + name: '404', + path: '/404', + component: './404', + }, + { + name: '500', + path: '/500', + component: './500', + }, + { + path: '/', + component: '../layouts/AuthLayout', + routes: [ + { + path: '/user', + component: '../layouts/UserLayout', + routes: [ + { + name: 'login', + path: '/user/login', + component: './user/login', + }, + { + path: '/user', + redirect: './user/login', + }, + { + path: '/user/**', + redirect: '/404', + }, + ], + }, + { + path: '/od', + component: '../layouts/OdLayout', + authority: ['guest', 'admin', 'superAdmin'], + routes: [ + { + path: '/od/dashboard', + icon: 'home', + name: 'Dashboard', + authority: ['guest', 'admin', 'superAdmin'], + component: './od/dashboard', + }, + { + path: '/od/nnnn', + icon: 'home', + name: 'ADMIN', + authority: ['admin', 'superAdmin'], + component: './od/dashboard', + }, + { + path: '/od/mmmm', + icon: 'home', + name: 'SUPER ADMIN', + authority: ['superAdmin'], + component: './od/dashboard', + }, + { + path: '/od', + redirect: '/od/dashboard', + authority: ['guest', 'admin', 'superAdmin'], + }, + { + path: '/od/**', + redirect: '/404', + }, + ], + }, + { + path: '/', + redirect: '/od', + }, + { + path: '/**', + redirect: '/404', + }, + ], + }, + { + path: '/', + redirect: '/od', + }, + { + path: '/**', + redirect: '/404', + }, + ], + }, +]; -- GitLab From 3dedaa4c04457478de032729a96c913323ffeba1 Mon Sep 17 00:00:00 2001 From: victor-liu <victorliu1999@gmail.com> Date: Tue, 5 Jan 2021 11:33:42 +1100 Subject: [PATCH 03/18] added public resources --- public/CNAME | 1 + public/favicon.ico | Bin 0 -> 4286 bytes public/home_bg.png | Bin 0 -> 203330 bytes public/icons/icon-128x128.png | Bin 0 -> 1329 bytes public/icons/icon-192x192.png | Bin 0 -> 1856 bytes public/icons/icon-512x512.png | Bin 0 -> 5082 bytes public/pro_icon.svg | 5 +++++ 7 files changed, 6 insertions(+) create mode 100644 public/CNAME create mode 100644 public/favicon.ico create mode 100644 public/home_bg.png create mode 100644 public/icons/icon-128x128.png create mode 100644 public/icons/icon-192x192.png create mode 100644 public/icons/icon-512x512.png create mode 100644 public/pro_icon.svg diff --git a/public/CNAME b/public/CNAME new file mode 100644 index 0000000..30c2d4d --- /dev/null +++ b/public/CNAME @@ -0,0 +1 @@ +preview.pro.ant.design \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e2e93252988b5bed120ddeb168eb577bf0caa881 GIT binary patch literal 4286 zcmeHLO(?8k6#ga#Gs=ufvobTd=q@y~nOLdYlqL%nQY4WqC`)z}3y~cqOAAF4VkQd~ z^3$wrC}~D1l%!eMp!|gA&U5sN?~b{2>)yNg-s#Lc-+9k_p7Y<=XqqYcDJs(Vt%dBG z=F~Lpdy<kY?MITxmz6yG=6#_ThNfj_XTu;P21X4SHSoXGfZ1#YDJv`M!`YNhhWFB) zr}NWdvB2eWp`@e)`T6-N@vT-X+-^6Di;Iz$m-kL4Gcyx*yB%d^WhgH%M?pb>*pd!Y zozZT}udJ-#<m3d6jg832$atrpGKGbOSYKa9EEYp`bv1~obOeJztgf!&{QMjj7Z->| zqiAVq0sT@kAMMobbULxOw+F6{j*egO8CQ?TgTuo^+}_@zrlv;l$*-)e#PRVl?(Xgo zi9`?zg>ZFsh0DuJ)Ya9!von<qdi>7LPN@OfP9IfH_4tet&&I~a#O{TK1<3*LO-xJ( zZ*Fc5%v&m4#Z&mZySs8{XJ-fV^Yh@{p`ju8d_J)w6+U%`!(qAC+uJK~qg_o+O|QC` zTVg0Y{jSHqzP^^&G0t4^cwF+$`egj?@9$AtTMLuPB>7!lUKY8&zP?xd=H_PM(U;HS ztNi!(_oJes0<5X6tu4{BxVR{FO<TC8rl!DnI2;a)j*bd%X=zD%hcTI)oD|;7%*=0V zQ2DR$+uPfbd`}UgAJ5Ov;&)Y5mBixV;Q^<or$QqmBk=qEI669#xUh$qyPKOEBoYbn z;ccJjW6x(jep_4HD?WRH>)_x3UauFkv$I%RTSHe@7dAIHF+4mhc?|>t(!XbCXVQZk z8yje7Xh2R*&WCwdw&?N4$H!4$Uyq)i9_;V$3;y)<G;(uuW$tj!@Gj?+npNxro6UyO z(o)G2^Fp4&NVh9|RsW3l)6<jSK0ZETdwW}ar#{M(sPFA>^-LKhmkv{Z#(CP^-7Wn# zI5-H>z`y`nTU%u=f7Tbh-mg5fPT0G8`Wx6^vD1(>-r0;AFlyjWYC!!D@UQlt)%}4^ literal 0 HcmV?d00001 diff --git a/public/home_bg.png b/public/home_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..7c92a4bef248fd9a6cba50e72c5a641ee4cdca2f GIT binary patch literal 203330 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¬4*_ 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	g>MQXTm2T=TNap`^ zBlMdkQR#c&+Dtt^EAKzEMD4mQqDa*@UC9Sl#Lneph3oY$kEp?M!)l&h+h@Zt7NAgL zv?I5H)NDhmE=dG+w_?nwheV`-*$Te5CVTfjg6&=nuH%B|Ko}?whK+z|4icnWjc{w@ z_ewu6Prr750MT@nsg^MjX0h(od3~zt>fim`4^CX51%lAZ(ZcXDwR%)?<ldd%FhqQX zCBtQ@aq$C(Fq{St-QDv^H?lp9(Y?e{$NGJQB`iPoh4dpY8x>)n;u*Tyb$!ANZp#qT z>tzS@rQ>RjeNl!$pYBMlBx^FkK6^XNl&?`Mon<u9{;5&c&AnZreuLI7QY!^(?y!Wr z?%KfE2YKv^P15;GJ+HkwfF=4vMG<(E3M;a9<$G)9+8~8VpxkJd*JhrQd&S3tnrsbw zsVOsET(XiyE^w^kv<=KS=8HU_KPPv-gJp)^=dxmbwPf9t_^0Wi$>8rZiKu<+sJ5#p z0U*z=jo(uiV&^W6!hpr7GWyO>e?YC(nxak_Wg*=i#*K>5YhQ*rL6#giLd6u~1s)%~ z&wrHDBrU?jBp1_NE%R#2=_RQh*PTF<S|JbI*q~nV;C=;!@7~4?lp2yP6u-4fkAN2e zCFD(T-n5P!V>q8#H^Y8!4aj#h`oztgCRdu9jyoV1>*GZuFjnp7NnFux8#js`Y5DNz zY>`+PS}^4o9Hq6PQ+Fb4nq36N<>`Ca@07^&rPD1KO_1T)#1ZfG{q^MKo7Qx%TPNaj zx%6xMWrAMr?Q6?wm0q6y%L?7%Bc1p`H*)QH8Wl#W+2OEHsh6Gyjmr424247t`@7#z z|GqM9E0eCJ{*d9tfy%pqdVx><tapaz2;Q>yqS{OK-*;A%^>m!R0fUE->#bfnE0(Ve zgkZb<Kz5(ngMU(1i}=BF(Y>>lPDAHr``~g2!}5N&SB^hD6YT5-BkNagrE6}K2NR>f zB;H1jx!5dct@H{km|=kVJc~<-5?7MW`o)lkrovVxtt;dZW6p}(ar*lvZcsGv!M~Co zWj{%cSKoz7T*F)he@A?5spSIg)d}1WI(<34`Pj90sc{VLs-L9q^;tW3J6*U2;e+mx zLq<BORCcF8n(#*P0oWVA1()Y7&BakY`|OKis^wt68yz9G9lMx^Z)pm>_~*9sh9b#_ z)%9Y0vzs@`$Z5RgkieG%%QrGK)peDNdqjLENEsMg&jrGyJ<_bouiRX|=`=>u(up`t zLU!zlgIDArvoFYT0_cGen}t`|ei(p^nv&-;1NS?ZF1iCc1d&CDUyM)lY+G&Hz<=*J z2FKttVToXJW%Gz^vC)5q)8+(TS4rK*o_yD3TGfA-*<h|^9pj@f^6uSO@Lu`v&yiV; zGb`*cRd4m|zm94@#tXd~cm`>dct~UQGPAV|kfCgC|7V{8^pb;TkATTwcZy#w{&xZg zY;)&Wfn{WXE%?(4gRR)NE(L*?#{MIlo}WHf_hR#@Kcj!ncS{1i2P?ju71Vpfk=vnb zYne&!XX4W@j+gpL+daFYG`S+H5y;ME8B*oaZ>__{gyk&;fC?x8el3ty&+AS_s??6l zw%?9iM~0cvs8f{7&eiUlwNco1eu==;0MMhLYM`QZ4>uac^5PL)mFfNceBfHwW%C3% z6!(Jp$<GzPlg7=8ihs|MQom;u!q4!}JNG}ZA6lQM5qejw3FKoA0F2y)tF&*#Zt+qd zfw)W&f%oEY%aDihWjWMi;nr|)&QD7niOZ;ctpg}^RJMXA3UbYrFJJ)UM#?b)v-^0= z{E8>Wv#qHFg;k5g24b!oZ_lb8A*xETD<R+k6sx)vX~`v8Gs;d>!hdl@ByC63>Q#LG z0ln|~4*O{tRc^6PO0KEfWT0kc@d`h}QP`$;W0u*m4e%-3?wr?`KYT4x2ek~9)^7Ip z7aX+|M<Q*9Fv`sk()H8ph3fM;{;yNwkota0O!++AI-RI}yu?IT5C&rNOx*B(U{fzF z?*DOg-r;P%ZyWz=t7^AKRTWjW_bMu)Xzf|lj<)u$oe<PkE2zEIs+rnFP?XrSYLA$; zGmON1^LvjRNB+p4cb@0Iuj@QN=XI}@Ykdfc|7G8!sY*rwRFs$l(c*X1!)Q&>GG<OM z*PFrBEnn+;i1N$PyKGB{2lx?$9m}$s>X|;KO7r)I-7XfTb8z;t`7yIQb>rR%nBwe( zB)gE6JX`0`4rccD?u}G_hAOQf>_`Uc-#2w!iGs-HpyG=+sDbjU)uPgj{BmozgHlLo z@wiSLpOpwi9;*dyv){&KJupP5z}kl7gNDa|>tRUE%x{vSSt4E?G#yqPAPeYh``%Y! z!{?UhjGr`{Pok3?tpq*HJ~?WiP}zks)43Dcve2SpDve70jQd0#F`#V$)xv`~pSz@h zA=&NJY@3s`ggL$G9WE^g+sQUiF<UtKV22Lin)L)?a@nTFxCVdD9o!Kgb%~T&)2~jN z&F@1c%kr3^6+gd=QFHjQ|8skanjHX|T)zTniWC~2f?O-7(hwYccH|>9?0Ruf?o_cf z#1V!g+xw;Tn}(}*a|bcaWBusb)z?E@@B?3e2JXMk*Lr)R({-Euw_8?-V(y<F^!l|l zie6W&@^_<iix1+$DG)X#E*tb2K0L#xpk(CI$!aR9dvO|!6lkmI+4D@S{&}qURme9% zNcxHl@Zt^l!B*EpxhyQCyE&xL^ZOXjgImjbjWW<XvLk$i1NjWEmwHNC-@cZY8FDv> zHsv(!kA`@nZqqE?%iM=<n%6P+&mM?&j2wb6CtTMVI71aJ2=B9clt<|E70lPV&u*v9 zP{ZC3HCu{l<t#XT$0&sA*BIeAPWKGJkA0R-=@^#8#H)Dz-_gI0Vtrl2FZ)%T971dP zsYtoIFr_b`bb`cPbyV(uG}C4*l4%4M-ZXZULf*Nq&s}-?elLvW=hB)<&g0)W!g;i6 zX4R(S#QPI)4nw4Mgh^1cE)!rVX*05dFoDR#?vUhD<pc7>QCo03^^h-<+;*3<^6RQk zs35B6O0%S}y{L^Ec#j;7l_a|$ZA5np9EShUegP!*P9W^WWo<^m2^Vcb8zq}n8pLUa z@}W3a>iHzsd8-oD1+-v+4xspPTkVtP1Sx#$#rJF8`D6dyY%|5|0;>({z&@g0?xp+r zO?~b~C{ous4Y}AjboRyW>RcCm+5FkWe|QKP2iQVgD(MBPwXKf9+3khulsG0ozAmeJ z{7t2xd%^I-M8sbPZKv*b`krsa(@$6;e$iX6pm3`#6m#*s?qpw&+$z#6BTA;id31-H z36k4<`%4lF%uEeREd^97gTvV)c^k&y`Ymd|KneEPF`l8B0Jcs|dX7xH>ympvw=2iI zWY=)>;m#ElTPL>)BvBr3MpHy+6xeL=_dp}%X`2Ht!;IC+xY-YTl-Y(6#U*0UIzYNy zd7?*fA5sY-oDa8&VAiH_Jr2&)b(!BxJZ1CwIbXAL{Se->U{~!Iyzo2rk^KAr+Gq!J zc=iR(F`g@3uf6#78h<eh+|wxqJnj?Hy~gZfk*s6DmsiJuK!2l%AT!_TNjwl{J@jDG z#1Lc{mHtL8jGdmRt;#(-P@U<LNW6|VeCH3}3Sq;3vG;g;LcsX||C%WAS6<R1XP)XB zxau018hlXvL1RpIn2SGWrt!(Y+{L14g^fflGY_(mHCm!;ncvTN_8&-Vh>yXQIh^h( z$KRu)c|dyuN0J={E@LNn-=byi`ooj~)?`x8+#Lp&Zxz@8Bx|(@9`$GVV`?A-ihUvc zzzP7WRy+mo=kGNR(*uE<u>7^6OsIyfE`4_FrZr>`HUM)bwkVPfC`^w5nfv6n0A?o? z?v5s7lwK`-Fap4~AJh(og)^1A_7E$sgEs5sV>2kwH0ZL_|B+lh+K)jx@ZDWcEoMvm z(%U3R_9sE79X?&i{8h*o+Ka>GHSJTUzKfL@5PDGfQ4HuVg|;j$#L=I5dEkX=YEmRq z+*ZoSrnZUMg4HD=H6W%8+7W5&HOSs>!nYoB&ZA*#Kpw_#|0OFu{KZ2_=WqPaJp;p_ zly4n_0>Z44kac%e{Ci&CrXQyPpo&n+XM|@k9@QD>BXO2Y%8qT!MzsI)I``<uELD-W zgZlTtE$i8Uyw41Qg5U7R+`*6L4t2IUQ$n(Eq&>4A8=Gy3&Q4Gc++g{;t?yn++v@G$ zgt8yf8W>3a3~4^qQT2n>H%bm`nV4zR2mE><a0%=E=@o!&?LGUOlM=0Y%6*X>31d)Z z)TNqn`%tq3-5=pHGw#pEcG`{F0~@Z|J|m2}v7%kY{`{E=A&KuJZ6ziQpX-_95&f=L zK%_3lD8K1-Yu6DNokWn_h=c?4b7EfOc3hV;j$5nte$@Nvg5|v3d){r)&vXUod(S#0 zFK3~z<e@nyssaXdhC;Q1wU+4`Zyrmmx1!Qb(n1>Zsmt?VxADPagVx%NPbAD?+WMYt z7{UW~Mq&eG-CJ%f1h$!4o9dI6c&5XqJ8#AKB@5d&1RM4(<<d@b&o-dj$8I#v>bqt} zl0*-CJ!-P-3P?Eh@|(#~u!Hgg^J7r4J;*g|)KD2^2U|t5Xx%)yRUn&p^UrVYeyyZF zJUExyXPN1cg_`KZ=g3@D;wHt`*DeK9$M?%se{*$T#2)J3dtRH%nM%$c55BwE`(oz+ zZG_|Bkzcnw(~|s{Ee(#d5ir*7cgJ$Dbga>o{)Ij0iUTArky@tAw2GT9tqvXfgUdcX zg0X+?^hz3*Chpfr11cAu*CxlMU}O3+h<m>>W|s^;&**}i%CpdotK3Qh{K6m|%$KCB zCbE5guc0#q=z14O;LI>eK7}95^gm0<FW>K|>JZx|dylYz()v4v-=4!7^)mjmLa9*_ z>bWEy23Cfa<9I}0+%0~W5H2~-@eIB<aFA5s28H}eM}5%;Sh~Mll>_SHIcQYqZ)6NZ zbs6y-0rsG)f-xM~UhdcB^D0%}MMPIooUmBFVd%P8zAzC)62OdSh2D@`5*;L;KB8~S zQ7#bWf1}e)N$~F>>SJzrVgWpG9AjDiill}ahP4`kJtSS&eTG}tSs^4|y;*UXXq=I< z;<+53K2GjN?~t&E+n-q`)|fMMQG%E{Ol?|qxHsA%L8#V!fkZM7m+b8tEnNrIr7%c* zda-nMuh4p{u;L+juOoK;U9*?ihb6zkcV$kug8O7KN+UC1`@k4!WqH)P^W_JywBHtH zdedhE=ueu6#A#^WAGYbSF2qfk@wJCdvK_;#VUz4t)EPwXC;gpvw`UZdF?rTuY|07f z)_zBS;)jL_X34w=Vw(C{Rmr}RQ)b|RHEczUp1thS?e_AZ0FF&$jhQ0nqM8O^qCds> zYsMaW0s%>BwPY9*Hu4a9V>h8Q>kkSf%8V2VX=Nk~%z$p!2xDl4@5R%6XA3MoggC_K z5vpB794C7ZJ-rDdyZit#XMVk;IOm~!ACrodvx5dkv3Fl*ez)tkdjIe9jx!k>rdA7b zc$>uP&n>Too-zZ8gwKRsiQb|GCZkTz+5p?#`MnIrR`JX;j>?J5f3CK504=}6Im&t) zDeDi{|K;}kwe<VwJ`_pkgRx||6QBe3%~4$<jIllDx>|x+L~HP0V=QUf`?H%z;_^@7 ztk?|bHKYT$UWw`w!%YlDFKd4(dgd7aHE6e?p@{;cnRv?<ty!R>TbUNRH6~EGiD`R4 zkutjt;dCuc5#My_K@7%zD~*^m6`JBP^fkRJOA%X47P8>OD;GTmWMA35?RHN(m&JB? z{V>{0t(cP1B&xRl{G&0BnF%2EJO(*aMpPGGAc`f33D@CWaDV09|MIi}Ybcjz1i3&E zs&W$<5ACCEQ@~X#pfHlc6dzlEFZgnk(qlMuAtf=Hm{txH=EFYMG_*n|`+3|-l{YYs z;wVzu{MH~Z=hJVbxpZcWS3r?oZ8^X>Ify~rdF2ah8?)}+kgn5(?%COPwZ&~c=R08S z_CX$H-c|=7Gjadix_k_g@%6xKrLN=+Y5^oRYeR>JRflHyU=<mX#uJM;pHYLBatOop zFtNC5i<{VX<<+7=x(e^7A#;o?kWt>MHs84PVk5GIovZrcwF$BrT{FgnX|w=(yO)cx zq{dWYt6fYs!s-3nrHq29NKg(NE|Q^{=H<cp$BX?sOI$I=7Pz4avipcV#NN-d32N|F z$y7>Xy62!q`qfd64(&5)JYrAdy+JNAP%d{JZ9B-bedPcQamZ+_HvpEGyooe^$CA#( z<NjN(VbK#S4d#KhSHkcQ9#hd+v7=`>z`4eit7uk!pe1&dcvU3yg)OjsM8Gw-b~Kul zF&Dv<_IP7G&Un2~^a-ow(5L{w%x3N9?Rd8A??H-KxsS7jmQ|dv+<CUts_hrP&LZCL zNFJrHdY_@3FHv9oP96*>10M#8)8!saS(hh{%?JRk$-b=}u=nL#t<$ED>EfNh0u_7- zuDTe>Ov5Juc^l1~JT2a_o5{#n8IvoH>IW|08)R2z?E+MJ?y~ihGYpf`cdD!zKji_$ z(^;Y0+2(Hv`8=L0nYQbuf89Y17vB)ba!FAaac}*^y!7DV95Yax@Gj{oJ2r*Z3zYos z`23TE&Ujz{IGtL=DYgE875f_<w}B72Iy={<=sQ3dWy2!EdJH_v&*rD!<)=TMz$eQ> zZj||GI^H1zpxx-#ZC2sI)uv6_A><mGV<AFun5iu68xfQGvU#<X+qvEqB|evEVTF+y zp#W_4*hBFmkbdbF#9Z4B7W(;K45$Z2TO@b0Lp=qP?Lusz_Tk9%({ZN0#+Te)bmmH0 z<uwpZ$%s-K4MV@zC6=WKjVhaTxG^BVOqVbWJqGWPi0XR0V6Z}|{yf4xvS==4-Xo5= z|Leup3{kzt2z0!JibFpd=l!#PzeADdZ~=&yOjUMGG`d8Z)(JkirQs2Gc*;f&vHdH# zX-PZcPt%pyP-@0@H<2~yi$M@CHZsvJ`!8?7A9JCx<;N&as)hN(d)zf*!QsY#>@?IZ z0xlB({<eBaJS)_{kGz76>C9d3{_;c4jWE*6+NUGcQNw0e!^)5N<s~-*aWR9^hu``G zM!jHN+h3D07Fd2S@CZ-Oko~`OaJx<=+l~TC?Bfp>cpUv$9_D+0Phlc?umxt?G3`24 z`oI7F`~08!YemDjgnLU3plz`qeGi0&G;dp64a6O)Ey;EVzAq5`_KQvK?f)Q~KieX| z$@DiGok|02e=2*q2|axS%DnT|<jJi)z2m%Yli~Zr^vg0%)rQ=--+cxhLFve;L`tA6 zYl5YZqA=dDVS}4-gm`#$5WjRKdJ%D7Sv!<H!?rRkt|q=QyQ?MvtDg6LMP@jyZ{vI6 zb`~8JBFWhibS4^g&FTa?AF1_dCp*CC%D?zKrb2~_p<pXLn{CXbA|wp9O6fL(TQ!Q} zK0X7yhD2!GnJ!FfJL2`IL(Z@eHDGQY2HHNRjjwB!$f+3X>gyuhV;Iu(8}mws(UWC0 zpM325Pc7SDiJe;I7*CJEa}At{D;}{?9ooaL(2tyf)TGT8s@7{u1Hk#LY*W5wR0eK@ zo=t+)8mar&gNA{{&D-el=<ei_FE&ccW8H6FL$<4iC$G6(tUJ-^Di<a7ZjSpEw#fv) zT!I5*S-<H?IV(W~1LhZ6s?!QqFj<}>dp=O^U?Wkn`Ki}<tCnjDZyndj7^NGjt4p{I z=2!eqdP|7D5z_O>Ht4hN%c^30HeMRb?kuP|tl3Ze3~#Ud)+)$%21Ou#3tk%c-><CE z{L}H?+)L0J3Pw}@ku1zSJU_<lA+)GznM7?6)@^&R{<Dl*qy6svuxKz(38lD_t|bdG z3tb#}Ul#tlRERwjHmn-OZb|eVzrXfvpnmYee`9GMVrTExv1SU>^jto@(ORD7Zed4# zC=M>`@fk|r2E=oJ-(gNey#yS#>5E%D`4<q&PW|88Zr%wCX3qSg4|-4LgkSnbRXset z4Im;W#!)=!ZWFFycW4&*tnx7@3HD2rO|O!-H+%@c9VshIy8df9Ur@->!b{}`g)+s) z9b2oB<d`XPl4%LK>Um4@F_S0+7T7QEx<w89b#IeFgGOgm5t3BThUYAt9ihZtJt4Ys zl`$?1n(nvJ@`+UH#cy4$jwC4wII&DmZBW7db+Yz`Tp&&1&<I3doyvDJr8fMu<`W1y z5gDXTYYD5no$BwL-~FIH554`53Ufcs%%9Y&3%*voLnvh&OerOgG$Tt78QO>+qAkgj zdH)lXbd;PkgY8L{?zrF&zUF6w4u>(t)_@}9U$=6`jUU#{C+?xk7tvoJE{v<P&6Zd3 zJp{i?k6z<OEqtUsY_Udp-N|*Ei`@z}K#62O&d1E7_gb!@c})dY*q^+Tb<Y#Azu@TS zl~Mq%`O?cm@Jw<UbxY|Q5t_KQDL+D}w|Et?bb)BRobD^a>R<|;fFlG0HqM>BMwcbD zoSnn-uy$`_w!e2~t;E=5PiK_`l$=Q0?)=)`BMtsZ+{P--3tr;{r>2V9Bn9iN7Bf~h zD#yy?mQNKH{cl+vD2+Pby6g!!{BwVqhU8qc$KY5cu;L%i&EW}zDlJ%04F0w>{M2MH z1>SFLW*tfRj$gytx77E=2{Z5f%rUk(o0{AXzTIa3>+KYH=l3JfUH`|yhyS_9eE6}e zpBZ{V%|Oegv+hMbStv^xA(_)z#LKraI7P%k_~az>g*pX5lk*So4q#ctEA6jOpwUL| zmt}Bp+#4-oR=}HOS=Q;NTzix`8yS!r8qTK~1s}s#5M>0ShaIEf1`#xHpw>HCR&al4 z_&B3@FxsA|$dzdVmoO7?x_t54x27zOr9As%rCuCdUp-^b!w8k$f%0PUdYSh5@JKkD z2+Q3(bT3NvdrX<HPSAmY`1bjp%&BlZo&7;q3D-2&w3Mqu`_S%J`QX3EaNpk+$!mMf z_+qeYvlkJ8(Un-vK8Su&9|O?eU`^Q{{bAX%bz+b{21o0e$ehbnHW@@jZ%)tmM<FIB zdD)b=_@Db=+3joV`mm%@NDA9{0REQCAo8*?!3>Eq|L~_aqw_D-DZ+_<=|J%jvp{<K zDQr{BwWCSz?8inm^ZqYOrTVQHS=T7t-(*GgEPKxbD!EVM{`1vnAfv@c%W-Z)5vxOt zw2mpcCpUc`$+*;tKQ||PV;tUK%%9Fczf})KY2>^tVxb471uV;n&jy+w${}_(tZ>sP zYYsMZ?uliqTA#w_lAC$D!d5F=5GxXM4_D?8&HJt!gZ}57A|$yQ4%eDMY?1=THifuE z5ov&QS}!1C$hwaoT}IikQEe+Xl%9C@w8?7L>_;gzsb7)6d)F2X72}@*zYyIWT`bwv zZS_9@YmVIw7PH{1uw=>R%~Hrz_jde}+c)Ls<njKWB~GNFxz!Ke6T$R#F1VTC7zA=& z`}?x-^l<3qE-jy8nv7Edy#A#7l5X%Lev?E5#u)5$9QqwMn)o8y@!gMuT$5EQf)hk$ zV3(xQ2_c?6>e%C{F$iXn7|G&iKKLbF;vB0bg$#g-UaC2yGvO=WL<(*jNo1@Syw*IY zl_?4_$A*s$?qhSJP{F-ne}Y{|o1rQHPJUjo<aw>?5-K1bi?)r6syNlU(<^ggIlq@< z%%vvRpIA>d@PW0jQf^b#_!o-2$dkk%T~ELQeaJJPP6#z3O`(ib^`iPHxDYsOmFbv3 z1TF`am$Tm<TH7ivKhqk{S<32=Y^w~KYAUX<xSqq|vX*XvQVT{Tzgm*eFMHgi$5N|$ zZZw?9VOEQTy!!-MYhGnyTPgxe=$9>R-}_R&zKW6sr7bIDSSJt4kF4k(gA}~JiwZ11 z8RHXrSiLI=@JZ)dHu|KL`CRN&dEKP>H{z0?-AYUZ1)vLE9+;=hGRhYt5B~e4NJW-1 zMHJ6<`Cq5nJHR)?Qi#K?sGb=UI7D4Z-Ni|rtJv#SWP@ZGtwyr8V1;87@8oQ8$UugW zz>)8Fem$Q0T)@L;8Z5Uj53wG7>Gqf7wNC^mOCn?*F?!%@sW#v54bu|aLu9d0X~cg~ z6`oYO+*axAJ70$F*&_yHe?$F$?NKXc4mWjcO1k_vjZ)?o8j&WL6qku>{nWlKu|C9V z)jtk{(qG1IMr2XY6X6{cv&aX>s=J@rIX<DpG8wxrDJQc$Hst`Lteos~FtU+)GN`<g zw2WE;-|^<Gr;-pTv(a6&zbKmMokHYv!K5V4^V2w|`SBy{+@8_uLuK2fq&DE_z*cQr zK>CqNji&`j{QmCA1T39!nAaY!*%MU`!7dNJR$Hsx{B1DJtn*z8?nZbM;90FpO9}5c znB5J0mXA^#YW%>v^t`4e_wSU67x2T51c<#|yq1+Vmo=#|xVLOlZl^k(uQR->`LCuz zkl8=dOxW*r0kxot8=0sE)%O(@mnqaCFi)PW3_s-S*r+`DpE{<8&UreqHLcuwKR@%| zB^+lk4Z!apl#L-O_s8yhaSe;&PS`Pg1dH$q#5UWo86-**H+%p79<;XM?F<*Eu6FM< zU1NlPrctk#v2wL`P%1o2H;qXDFs$kjuqnE1V>hK6Y!GBoOf|pH$S5w*81PVF29ULq zZ0)r}N}>I+oQ4AIO!4N|pFQh??$#Drt1>`)FnvoFHlw6<8^*kHV-l&!o#Gm8^Zln| zy|~G^p3f~QYCGt^wOGXB@-pf}c9iMzZzM>@^wzspKHc6f7#i6-%GX=@X2lU(Z4>l& zdrud8nBskk5Z74CS>jZ>ZnwZ;Pn5}0LK8l~I95zVk;lD8(ebV;xWv7_vYE@7{*al% zyE=5IH3_UHTfs#}^9~^IU&+SF9kEV*4M;+av5}^Lvv~Q(29~W*G9PV2&UOfZ4QquG zqf0GA03VhY1a-v}|1h)bE+ZqZRCgGQ;RG)+SZ31pPwLeiu{L%cOvy|0k4;yb`ANnC z6laevi+OJIc1W^AChKOxvtW)jN_Q9+T_b)9!YE?=36w7CRm-)MbN4(n*BIf$0TLkO zA8MGVLOSt6VAcFStcD30MZPn!5p)vaYc7w50Y#9|Y!|D?NOfB)+&xEld7gEry;OZM zwXQUsP5L=?KvZ_a?h2xdokqdUM;gJ;Ntckbupo-Q@}Yt?6Fd=pGXg=Nu73(*>1Etx zA~A#R#9q~z6Q_&yA9qU8<GvZYRE4t*{tFIA#A*46sCqY&Skhm52wT+<;G!r_%=XV( zw3Q;R!YRozLv!YivLHf(YH(AT%;qIHVsjz+cY<Xp&nt%o1X<@T*thg$k-}5;T^5I; z2V=)wA13jolhS32SmlnhXc*$imG=~LYSnm}PQ<ppG?N2~p%u81*!0UEZ8M#p!FRzw z%CW;cImZ4LKy?&;`V0)B{M1|D@zC$x-mmnbFmU9$<)`}2trkl~D6g4|ve#n2@x}T6 z=kk=Bw*bJ?pq!u9D{DNE_QzjNX@5kWrRj=bj35Dytq$BxNh_BB?1M=x#O)8Bc>-ny zWdD8~vU3r>=iA;l=QZ|AaX=UQ=@EzG;ZjX%$EM>ka%Cv6ch8N4T}ak7^<w}(@JLHI zT@`v)-fgQTN1#Io??1$zCQbcA722^rEpv)gN>%iYhb%UE;Nd)gN2eWYT<q?6M#`tF z0U|aoxQAivEhj3T<~UE*Zav22g@x~ycz-oI|J~iJ?~t7iH7awcD2F@8$*?b5mrDyV zJG^O4Yt{zfs+GWDKSTI$@mKAH<O2Jm0tT3Tr%XZBra=)%+NplrudN}(Bk*+8`V8SV z1So)kAk^2RJky(<m~)@9{58AhtBp7OWouuf%DE69vFLa1b4X<BjYJshpoop>AN`dG zvv4=K9RK4i)rqTQZdk~k^_VYn-XnEyN_Y(?(Od#;o3E7c)SCO24`FmhwE7q5vY#D6 z6K$LqewM?kT>-;|HLxA&RuDB2`+i>h<JANrkJT3+#FT@*rmDMmNek{E>l|dC<L(=p zzVGoaR#tva>(uEMql{ln_Aa_*G?wwmkauD0U0_r?8N22akenlU)j;e<!#Nx*6SAwg z_l!n<qf>N(RW#!OgNeCm-L!r<H_SZi)(SxH3z-?-ZluJ%9kHRij&b2WwJyzQmP(eJ z-P|-$h1foC$$j6-r3Q8EM#{2#iRe9LzRqD6mdkNNso5y-zZ?%lQr{inff--H$lXg^ z+nhMQPb<+vcy_Mn-1C4Nm_?4AX~1q|^%$S%#~0gkAJ%b5Qn&@4!P|aE^pAajIF30@ zHRNizB(_H@>&%SihQo@vQgqZJWQI@lDvTCFV4QGHhvwaSx736T@`uqj#v7BV@uO~) zMmtkun>JcY-yw5A%yQF(SM?D(!oonCZ6{@wm9>%RI2!r#$Z$F5WQ59S+!zxyFy!o9 zm`0()8L4-Dd%16-J~!Au6>gWBEcQUx>c_tiMTQA5u3~s%T4LwlW5&suEa1#>OM*bY z^SRlSy~9nF-e0vT+Z>V;8tqD<r&rH$omnvB%NhS(k@p+U-?EHAWu3}9zl+7h=-;}o zWs34Y5*zP-)7wn=$ZHX*KM~i>^}<ryV4}E7v+NEvxQKd6TXa#6xk-N2Z%B1ZSN64g zpD28Cm4<e`wPBnrRYLD?in1$d7Uo~xcC|81ehrwF(-@lUzN6Cb=C%PNtnD99P)FW! zP1OWReum)(iQZ6qLD~Mq`nuE@YT#JA!ymDjQGX>Y^r&?;`+fvP3M=iGMBU-aQPn$b z3PGt>##BDK_<B7(sQ<9QbRP7~wqqZa%oL&J+_T}DfoT<Uca#Xt4zDew{!tkj;w>mH zeYb<yO{O=+%mj8t-YGu?t?vyH1<lbIP37+nxt1?3@kQV;W7}{Bdi(|d?zc6}%+*~h z*UY-gZwH~sBc&a!OXQ4cQPqw_G1mrekFK~tU9*2XtiHpP4gI21elV%#ZdwA({ON{_ zV+tn|fY+&Gm9L|}rSW2eN$*dC#^$j68=y{1k$TvQSqL&gQ_cQh(uqNA$5Au>zjD{~ z#w)t}C%(;~<u*eV(xm>E5?Bp-AP5}+ww=WpB3>GHw~;o)%pB6bg?bbGk?AaX?#*7y zjjM+FV>H1gAlc9_#KX8GD<bRF9F8XNA~>C$<yGOE5dVvtXz7PJ%5T^1{kwcImV`dU z2rQe~4{La387NXxes}YAbV2-LTC4Wqj$<_YT}B4r?u#O!t@_wcHW<)zc+2o=%hgr9 zB5;Q>&LLQ=QmfX<r$H=}X6FoV4DtE>ODOYOf{rhJ59F)gIra1=ZFa3E!Eg&9U+Tf* zIVeANK%C~t(Am4q?4Axt*?~;OjU8dONv5`w{jIqJBad4e;8yK#WkXII6+RK*jQG@` zOM&Od`$+=steUy69|E)j)6zMAyg~qs90fNP?06H$1#7GJ|FRfwIKtmExc?Dn0m^8m zVU{c`uc_quY1z0kRBY7qc3(G-!OG;w5JErRK+PoKOlu4)A(WL#d06rnK1K5H20mE= zS%|@pO4QyM?y^mpJ~s)ap{*SJm}X3X_UwT`Sl4!RE;$dp!&*EC{MFb!A3G6<1Q4YK zHd=8T-$7JmPn13MV^F`V#O45FzQch8hPO#EJ$F;=NT`U%AP<MaE=`;gk>YNFuOq>| z`9yg5D9UoN<3SU%8ePE7-t)0uQgoO94DMlTb{&q)W8@4!nNp^h_)Yu8u;#Y);C4ly zPd;WEZK2<Sz_kUW!bNaT{N6%*h$B;uHl~Gw0UO%24tR0`fBpi=l<A$E(j`z4w7UAj zGw909t8F>|v}X9?(pb%^&%FNgvm;80WiyF&^bjenb+<CP4F98~5ir|hy<Np#iJJHE z-A>HqW-or$nS%T|zHPD^&nky$wCguAM5X^eNfAj~ky5abdY`1P12U-^AxYG4v~jqm zgd=%SQgEW{v?pWn1A0!QK({0+l%(#7i-yy<BgB6T6n03BTc9PZ<7@Yyq?H|bSSB&W zC!B_+=e^Ft5)(dIIAxHImzgf45t*>Iw(4JY?~%xhn3JsS!{{O60GW+4JH*?|ctFbh zyk)UD=gqpN;%(ndwy{G{W?{dCHCGd?+wX8qQ0QEkIALZ^eu?**`^`dpf8^K-@sAPU z8|Cb%bLu^ym0y=XiY4;tXRYFJtpEPZPy``F9G`xz-_-6Buyl$zXxVRZYsovS-<q`a zm)-;zpNFOmLok*3(z#wQtn^0i1?wz8Bf5f5=*lo0!4b!#VkPj5bd!!*NYTgHG-I7C zW|+QL)%zb%lCwCvvHLLAti!w=GOfC`SFPgZbuvF0C0*Zanq(FW{!$)g`9&}BSmNxG zP2Y^uXUrP7LH*iyy!Jo#8s1COcKA!)_Iv#Wmt$GFD=2|8A(Ldy(QK;0Omm`{caq06 zk+ZeOY9+bSk*c0q1bzg2M2zKAVh{@dI@boW-})w@K{%2a$0)e<O5#wFkMs!PJvc7c zfYJtg{uacWr*q{->^7UuyA$<fwHWqd*f%xr9*E#2l$Xb_wvNH3t^yF-;>wVb+xFj| zHS^K$hT0_h?QxK+E47ab%u!JdzSmU7^{uX9mF>Q^r}YIu-yv0cz0f}q&e39%S^G5+ z{5SIM8q0vCnJYG0>rPuajU}(8v8>WR?QQ{c2{@1CQ-9!h^BVI(bAEF*dvAw0@@Azw z$Z+!qUptl3^w;3}NKy7Xj{xbcJ$c9vm7&XkjS_gzi>#0B(Dn1#aYMxdX{W~zrVE1X zh{Tnv_34Xm^Wvn7Q}Y7Tl93_-<E_ga+wrbFzJ4cL2U)sIm!dbPkNdF)cLLE#f6w&N z>D&jtPx(N6D3M006|Soo#AEe%4Tcfr@QavcPxIDfzxfJW96R-ARe+o7`VRHqqq;9Q ztM{7c*X+RH3b6OqGTKPaSBMrq@N!;hFC-5)`+haxve2hJm9UG(Zu@q9eH1BS8UtHF zrG7Pbbm3S1wY&zG_^5}}i&mGE_(z}~5vb?k3|<dd7&V=n0sFv)6MD|HK|ZV&ri%iX z9z*t4u*$n0Pn=`@J{3W-HR<w(I7e8JhqUOq^&L_IgSf7W)A2@~&j$EXHR;)wpjDIn z%qcAhpqazpsIxTW`*6s7aN84kDU~I#o<GJolpe=XPQ0ZHxoys`u^4DF^;^tI*)|4g z9q5G(doqAS<(WRSZR!<49ItWzV*DQEpI&kiJhS|{OJEYF4;`MLWtsdtvi3IVb2xYH z@R<;B6fCxK`~>{kp6ZlpP_dfy#cn8{)qXooehkrJ;pt_{hpo4@J@T;xwvVdzGKr%T z_Rn*4jYMd9I-bE(yct;S-&{E(pl6}FiR?lBMJK`z%7-R8K_k}T=IS?9Mq}$RN}xX= z4%%{w!s?&sP@D&FLv8aIA=VAi(!2yBG5ahTL+}sxT<znM)ugEEcV^y42<=>&?Ub5x zuQOGE^s7m?ynGS@1a+x1n!y3XC^Ruga0c+xj#I>wAC&|p6BiY1%(0H$Ey1SvQ6UZ= zz!t1fM(;+Sg}P(0cY*$_Q!yFWC!YmW=T7G@Bpcb)8V5_$r4CXm8k)4D-<%77`u5v0 zGpOND-AdS4jFrDBjybs)?!j<Z2x?OLIZXv;ver;Qk3RTE#`w!4yj8b(d3@4)VVN$n z*)Bye(*lzGm!>R=JL$1WtBl~S!`9_HC)#XWYN1Q+$$uXLM+x9ArXI~<4T@N;X2L|k zqk0<7>gv;H`U7hin-63_{qgnWnfwz1hz6R4MU-8OvBM!w!&<~Q`yi85tVEt~8SLZX z!VKB``@iHq2xC3mg6PQxb-M+SOCxGKKRwG0VA+g8&O1~ENg^016ysg2$=|9_m<`hO zmdV0{|6=bCy@h6>UB}CKYR2xy0TO<6Jxxn{|MCi~S;gUgH6E_eHst|}`&@AAki;r* znP4+kTi&$a1dUP<CJcd;0<#sK1XY;LrQYom;=|HkfBS@LXkk2=e~Fb<xS}n1Sqo3c z)9!S<V&x<q%-aJeHn;m$xv4sDdlyU+4CQk8ePAt-7Jp5ET)owUSw>}Ts^AJ-K0Rmy zY%@S<nyjttNq?_x)!dGM1D+9}f9st*xmZMy*fF(UId727kL&<DWpe7l;}oN#jjldQ z@kc@T2Y=k{>{I??jb}AjyFd9bsNW7eaDa+)W7vg0H)1z5nU+J1jF)VEsGXpueYj-l zxRS!9i`nU1t?W^)>}qUUG+%!GYq9RVpyKPf;S>e6b9<t9<!hc8Cchpib|YmK7?kpq z(7C~JdlT2bN_l@LCNL{wyGYK;F%zN*E*Bz0mxU8$z<ckT4Sgx?{1%RuV=~h09PG6; zJ}I4=w^Pn9Px_8U!-r@ja$DOXFI;ew^cU6E`2nLd(gcf<q`?U8Lm{@J{R9U4L3V>> z7N@*9FdX7{^9t)E)j5ZwxJg>z9j56KQ$3U#A>f}-0L6N(dsNuY;1z>&o^whyii3|u zr{XO9f`7!35z^dCGgAi{)Ex|JSZW)|vV;j!88cbJ$%8ta6GBqj*?Hs}i_YaPFGi}C z@|gO<w#Mmcwf~8?Kj;xwE@Jxa!P5$|EroRZl~cuFpR1KLn~B4zz(1+~8xbyl`K*mR z7|qsYxwkV29tp^^seAOO%YBJBMaO)heJIv<tp3QE=*CY61Xl4l6pqzIJ+A@R7nMCp zo8jR^Ol`Y@8r*rCjY^q^1ej~2P}m_S=9;BXHY<I>zu3L<CbiPol^4?i9WJ~y`G5A# z4u>+^+!`Ot*nKmUNJQqbQlNzvw<`0o`-9p0$}je!Wa?d67)8*dZXw3tVBJKNqwvNB zv>k=x5|Nnq??2Bfqb>+i;hTF?*sCCzjjqq5$FR2?`p9`QYo`P6dmU>{K|C8~4rH7k zZ&0Eqi<1P}qh%?MJ$HRKJkz8$hhO=)YqNEIw|$+HmZ*@<QH>$6eMx@&MpD96#%@HD zx01p=3Oil@FN?OPlLvKB|H;(avU_|u?gNT<FX#EZ<z~5wy%{0dNlj>xSO36nOq0dT z>AYspz_skP@B6I?EZ4C>zp}Y4PdSxE(&Grc64VC7vKRI7M$brd!^7|q?}XXoAs!f# z|Bmz>E(>zQMxL|(<=b`)_*DP<T%7s>w~Qqpu!jx<SH`fS2v@wFQ44Bn5779efShBg z?NgVs!H4jYl6x6AhMFy>ryHzp+ibM!!v{!4t2|5uc$xYTM{?#8HkyF<9GGFkH@c9# z79Y7>*f7#gi3&n+xd)QbyE24U*ygk5YT<YE@3}t}Ga6-u4^aj%gxZ1H9t=nvj)7bE z<owR$jSP$)om6k)Qv8NnhIKCk=t1yX<E*8D&okK2TQ=i@>fi{!$Hr_o90npSseD(? ztQ-e#VbFxpIKE6}9LtOMG!Q{3$$y<bcZ>d7q-FHVPf?`jox5?xhPQIv5st|k4fbJc z6a1FR46CJAmg5`p?18Npqizm34)l?~DInkLsM^^AYzsaybLrGL&+Ku)2NPtx+vOE9 z8>6^AIj}jjF-Nto*m0__)T~B7YOlvN$sGz|Jw-k<reXUS3<tdR@$eof^l{uLAsMik z!d4~HSn8elcBL@0;!frNz+DNTGZ1pwe^%Fdm?y%p^U)`M4dy+dO!g5yXcdJUrG=!T zx`m@pCO)j~hel<E)i1vB(_?_SG7{dMvx$6gnKKqm)7Y}4$okc7wfw-f=}`qENrX@H za?9{PGA%rGta9wI?PQ#HCHJO!E%=|bYw}gM@4Cn%|8&1o)pwkif!T1He4c^rIe6+( z^5n{fy_5CjA#%=2mPIt8G7X2BOCD%{<!G;!4rNc-v1G1#UocpRtcKJ_7^Y_o$cI(P z|CtS^f{B3Z`hPlQk_L8pfj*+D)u)(@g!4??nLXS}N;tme^&g+FkIaXl_;&n_>VIb) z*AT{a6B1$cLHOXPcsuq%=71oQ#!%w)UJm113r$)B&w2vG;O|#$&xRK+`^}dyyjAo; zRdlbvvgQ5w!EYzYUxV*K?bQ%9W3sI|actNnCY-73=FvmG1c(U3NaegOTG=)>prQ<l z_sG)@<Zhp43%fCX_>>ABw<()Iq-PAyz*Lz%m)MXpP5HR?5MFmmh}B!mR-(96r4xKS z&nj>ubiMOs6Q>E?w0=<bZZ`G)QG&v&G>H_^db91cu@3Tal-Q{2=nvoA<~o41EF#(2 zk3Yj0{9V)+zH!bB>>LWVDHlBl9}yaKd*Vc!3?)h)2YKP2O%F4BROqagyQoH#KSp^i z8PqrruVs_yk370&)%`%&jN9HV7ThnZrDeEzb1U1f=z-?)<PgJvwMg<*0`Jrwt$)#* zgv57RZZLlPz03nwLy5o-8kNu05~Ppcea8fL;|6bSoOvS!hyy{AsCHX6>~c0mu3U&x z$0j72_+~>kdwdAqy<hhthJSpTEF>O1<Y08+#K=V;Nax{aT{d0izn>_7k0`D?bBJ~B zI$7YJC-adt8Wr$)F6Uu*e{a%bqP9}cPK`SFuY@sz#g3}7UwG2Xpi=OgIAdYvawRrm zG=ben(<(In&G4*cqN=8yJiXR@Y^OrY*?p^g>|BOpX(p>cWXq1S1%_a`OweZJ3B)}< zY8E&oTz>ZBDf%kV<gwSH3ADoMGJQ<1JkT#czGHA0)?PApnKxI0h$nkPyexh3HB=0c zA}7R88WC%uAW9|m<b}4SL3+lR=bie+1By4_>dJjo3U90Ps=Lwlu;qv~DwU}_6sv~; za@4DdREu6IQvjPB<J{<yc9&&WlqbT_xZfq}lu1?7fsD_=#-F?KvC>AT2~?7qY7mn_ zJFvYFCcE<OEnD!lakTU2QBj7>i#FP3R+SV1VgT5Le*??-KP5JXn176%Im6a&+<OtT zuy=$@nf*4g6LpC~tBkU+p);NuK*tB_!m{rq{>O8+#3l@u$<m);%;zRPzcZR_w^S$4 zh&t=z$<WOE#_BFWb8qg!3;3-!Us{BxUhMj}uI@e9BcVf_GM8Gai!0YxLs*<LO=cF0 z4KA7e)5Dw2P}fGwKy)7V1c0jF6wurNt))_uf!|#pL8q2{SX6MkR1V!U@*}0r(*wEi zz4q<)Th410kl0QQo@w=Wdn7kv$+P^#mw*d)dtp25OSs)&k-2+=y;hWpnM{9vD=MS8 ze&4}MVwLpTLTo2DRT2M{GV5-}!yzWO#_&*;6bY+3oi22ljvd(HZAjs2z0s6T(Jg?? zP}Wvz2*=9d-{*T;Hnh~O`({S^{V%`z=O+E8zkQ3yLKmNA?(?w+FumMrUpT!BKfU&j zwKVQ5m>Eql;ALdPr7U)AtaIsJ_{ZF(JHQab20oxKuJ0Ws8hHB#BBq|!0s?kTTyA58 zK_g)T;WA>NQoz=NC9y0xAze;iGTQ8t)1ruDeGx;PH(K*Zk_ZztAhJb`o$m+}igy{E z@wqrr1oR(GJgQe&VzFbkP!{gpHT(>eDG_&25s*8g+NSVNwC(2V&e2%=GUgf@=_Is> zJ$W#;_nXLjZ@8c7?0wia?|6xL+>(nSW>kjSI{9?^#~!*f`sEYAPh$|banmgc{%@`% z{`@jJaZHG_%z0Vr#2~^*RqjyCHC4kd3Q~p&n-5m&;$)%z2cOjqyN67FK4KgZ#a7o% zwQc78el^ARTmNU=QH?3i1MM(uu4LLONn5{2xA2fy_-neT?;lXvNpETe6VruCs`zDA z=7?T2E|hLd(4ZjOvnPM0k$BX<HB`hS;wehqFGHkmeJcGd7l)>(rfA)ubPHHEh5CJJ z?m<mSS*bIA9iNp$g;l0OVC;dUQMB)bZX>+!ZD@>l%+KKO(99VV{u4WSbt?PFV{@h~ zG72g8jCrlGiCtS1M0FkGo>XZ{BDoF;c-2poi62TaY@*4*`hWg4G-<sOAhrwg&hlAe z&I&G0^Hx8unnZo8Kxf^1Hse2s&7tjU#M$_`NaGBm7gXPBH^?#_FD$o(m;vj}36I!M zHHlqttH1H;np*e;;pWF`Jv>i?AEEs{p@U-$L+>v}OcGpl(z#$>-)<8q0EaJM0d>Kj z_E<mF*mN|O$3~%BT*PKROd9;n1dR)h7jxj)a8@J@os<6L@BjCstcY!liT%@K!+@XV zn+?Vx9C6xWF61s@o~5Z$JBGK9ifrHdPArn@^{dI!z1d&58^p5maRFaV&VGo06>#5? zKeYaN)uE69kVGLtKM#wCm{BV^0d?@N3$s6rc;I)@30X~4Gf(c6*WhiyX$y}}gwP4S zH8P0C?OrEA8J|HM@aYH=N+el8<aWswv|6!TnEvRd(P8lNhhp&K4q;;`uVi#QRPRRY zIE(XxCKbWImn@I72^#vyS5Wn{jL}iYFB<OX5BWEpB6L<72Z#Z=d$S|UPgaB~d$dPC z{~$jf#h=qDD0o4BZO0ZR#*UBNUS7HnJP43qb^XM5F*Vp6%x$b#1|8Vm!xf0jU;1ae z%Vl8iS_`LILf&AtKhbc79JEpv;VHH?o>eCuQMm7AEW>0!`IoMai=l~9mW#9S#)!E} zsCv!4Rq*M{;8V*q?i(R1^nbk)8-LBCnoAYr1@cfMa+Z+2Xd5PS7ZJs#PiJc?bXxMs z@&HNusM6_|EP3jM%y9dJ^Nw5O?|ag?Qo*gO?csl}KeIbAt2Sx6t*|b6kGJF5h<R_L zE1BT?XN2`E-C6zrfR8|#cBRB@^~6gB8ip9o?P)3M#hnG!(@Wws^Zg$@VjC?DWWToc zBloZlLG{p3tHUhh=QGk372ia7GvZRI`c5X6l<vc3vPe#pClS~zWc!v#4zU{Yy_@wr zmB(7rp0&Q=YSvsuS3!hvjV<y#oLXb}n`DP@Frv#|TFHoqQ*d{BFoLkP4LOQ)>>C@+ z0CaTxzG$PdYcB!F_OyOih2uSY?1wH2Mc-|t7DmZZI9jW$&12t5NW5Jf-j?fdC?Rs0 z2`@2!@8$2MX<WrXcIq-YicM`1cDyIAl)gqB6?G}ga>gLw*T(`3wcCND-#tUO0{Gh! z4mHE=w4O7Lh>I^Q@MW6@w1<+r>QB5%ox)ED@;!y|-Iq(QQ7;t`rafmSR5jHqA4Qhg zhJ$nTX{)=}H-kmcP81>S?fy@?zz!R4l8H3o#k*`~tIm-bRltcTRX*A$<`JrfK#V~) z6us{@?lIsG7%Y<u+Ne)CPJ6pZMtxw%RqX+uxD;UX7Hq@*M*Oxuen~8|L}&gHp9v5B zOOGxx?~7BrxEG}PF$jsGJ8v^_`HU5rO^r`oHEXn!q?0D?ninwi(5505C$%OEUpW_2 zgTpq?^Q!Hp?6=&P+WA{jz|Qk?TR$3S;g>HDQKJh`NQ9q{%%M8{&8lkY!y%3Y=7w{P zMh@NDI|I+M%N2ex8PqWdnwG9SW-^%5S;#Z_tQu9SaCK*zP2RHct6hkZwx;B^wn+z= zE~~y^2UYrVFx`+TdHm1A>4&wTzURIxD=EJUXZ&=PQtLmMv9L<?jKx-xzXC|C@2rKV z8=fZqEs)oR>#=prf4F1EL!HVwU)SlpBh-5Gzwybna3T#E1!ETJKH{R!hq8U#rR&6k zKTUEHV~aY3Ur<2<kQt2un=#2B7Em%u0*G-L_qwhkkJNgDDUy{&4GC|OmVAp=SYDl& zj0I4>ufcyVuaQ-t>a>n_>L%icJfI_F!&Hgzjr<Uk<3QC~YWdf^sFhnBz?m<Xe%*WJ z56Z|sQ!r1}*Iq^o7J|1P(57~c_WlL(75Y|>wEq)h5HUXCMC77;2<M+gK=E%AVtw?D zr8HXPth4NYYz`vJJ!PHm$sEd#qs({jubn)M?x`F;m9mOfU=R^rb;~NeclO<JSKr}} z%FCB!uJGg9mBTVquUNVN)lLIVs!&b8bkvCRrl#NUYv&@q{@^#L*apzU@!{wYl}pKQ z`5~Oe)OY-|0jcil|H?H(^takzWqMvzn@d7g8N~eCvz165c<!*kdu=`1N+cr(C~`n= z8L*F2=N2kp!~}x6H{j^;_wU(Ge##`vKE9jD!sZ7B_i6Tgb|?IdOyn_ISwl7z#9$Z0 z#1~?s0uW=wB!dt|Wi9I7+2^S^xGv;kuXON=Zs`A`7)vln_Y6yieYy=*LdPIm*t_4y zsFjW7`pR<hT`}3eVoEQDi0Ry*uzbQ|%F1RaF~PLNo{!rK993~zUK^6=&?1-|62O+B zvorbVT0~zZ&0N$I{?r49>IWtfOH`fh`@fWVhhjO1!~GB+5**PooLU#nNO(X{Y<NJ1 z%j3h$n0fhV$l0|vKVuwZ=j(=~srbUTKVQpUm5xajhO1mBJ+pfv8V}E6m!dF~u=d^( zbY2sk608kJjj*sj=6B9&E&cXZ<gHI#mlD^HjY6z2Gn*h(-XpMw2c|0?SVbFnD!5IW z3H(Qk)Vg|@Zv%Obe*cGyiM=G(orsdT?rUd7Dc>1NXWxwNsc*S4M>rYsvLzqbOy6c( zlxRjwwlP=c-E(XRX+|f9cV~a6<iq|6Eq2aJ|8KvJdjQ+?>#g}59NhnR0^r`V7RKl7 z2C?|%y;bW$Z2%KLA=N5x!RE9vlz5&Fjjg$3z^~V^o9JGN8O^&@QCo5d_?x-1KJ(zb zv(BydwJM7{5kbi?+wPgG9jN5NR#;6OzZ}KS58{s2G>dUpk5~4x#oi%UZTDAzKT2x> zseGKNfdz@B1rcNDlEZR0XMPj79?RV&|K!88&(dhCQZ14ZEs1-ub8bE3Qrhu;)8y!r z3X_wE_``ehQt4W_!8mSeUt7H=g40^xN;QAikOu^qb0q)Na&*+<HL!znuvsZI8UGuJ zq#Bg^$MsK0Asw*)lMVV7kj9`gC=Nzc+ZnDpe;KO0G!b4RBpvwoGmVrr6JxN(?t)-| zR1h25#Ftm3deMP3uhb;N-S`my5^r*<2YKD9ME+JV*aX<oPiC7m0eS+1XCdEYoI!(r zldYPsy*#p?vh}vLvG$!ymwXM;PKxrCgMa+5eIZZUU+|`X>XehEll#(T`ywnJ42d|c z&mP!uQLVW=&(`oG0xVa6%A1FyR`Rh2c6%#6@-MO1_Ryt9ji3DiVIhkcfzz3lKa*iC zu$t}*g|U;>t1?&U%=EAtul(8F`puKyXLj5<P1h{xGb`MLPf2*!!wYw9e`w?BN>2-O zo1q5J1o=eY<CPHB;>-^~7FlXjdvq~*`b!c!LTi#thK>JUa|sovPv+fud&_+evlVA^ z4~^`Mm8=PDANiG)Zl5Af|BG}<Jd)_O<PR&7ARjGM67f(Haj5G*eo?oZORBxkrSqgo zzIK~>FZT(HI{CB4p~R(w;-$TJE78QkUK;_xis-t!4cn=Y9?upVe1A2(I=+%?0UWV| zyDw~C8)f2-uoZb~#Arx^Pb6&xeF048e{_3~1kfl;T)i1?1?ZT(4pCFpe7aPqmX1_* z9!FJ<k>xe@F{e-hKk-ZwEjrk63hUsZQU4iU88iQdM_FRzbU`DhB-iTfHg^^OuCR}K zGMUfV+gGbgG!^%^Xi*r&`T2M~+`{dS-5KOU@s<FNC56?KQv~0DYn)c;w*Rj1RwOWS z42BN_SGKfmp=^n0kM-VaA8pgSDw`^^CNcoX58~I}6RwLs*W1eD_q`Y8j`o%ViXT1G z^F#=Lk%b!Ptx2y%$<q=J5>^iJ)OWg42eT+J0+Lg_9e-T4Hw88%!iY7}YK9~E0pqv% zNG9Yk9Y>iw8^fSWk2iX9YRP5TnWp{W<Xs7E0dFNm>pc9inHr0hgsTev(oK5)%TdAx z;^~)(KE$OZ=(%(^a?oCybhGn^{eKSyPA_ryc(n=QsB+Oz^A2PW(tl0rUA1?D6Y0f^ zEkKaUibvSfW!OnOV*jVZeO7<)iw7r{WTv<qIN>}D;ix$b_BW*`GawOeOnGXB$$)b& z+r?Hy@pbq^uf`zdW_@8zye!;yZ`}uum#G?!&Ux1L->OmCgpr+eZtrnf`IVbNJ7|DD zRZ_Gs9KN}%-_>e{{w{!W1hG^{Py*kL3@xBnU~A1E&eO<5FrRAW3zBUO)>Ua>Figz( z-)4L~9%g~W+?NZcHHwI9Nqf)-#5%;^5B7JUh^nnbc{xfAO05V=v0zpUWoMiGOcvOz z98m{}PPncA<LJBtss8>yo(dTeWrvSsWN*cFg^&>0l6z%lg@k*#cF4T;&d4g{W`$fU z<Jx=geQo!;#=Q~0_xJbT_1ER?-gD0Dd7jV5GuTU`H;r$7v7|@MXbhe(`J7bs>4=Xa zlj*_B{5&s>()$c#D2AwXvsAM*eSPifV(%i9!|DTmSLd6%I?6WG+w=cS_<WV9qaPyG z5p|svEzzRQHxb@M_nrtUdL^V%O1t9|quG&mCB~-Z@ID&Qo;&gQlcuOHylX0rl(+i2 zt6q66^sdwuGcf8`t+=N{e_hn?mX(Mfso+U$^d&-cP=IW`7Tr$SNa)^(9*XeA09z9J zPZ~!+7%?%XJNpuva3$twoA%N&=N_37d6Qwoe?A+&!@4YJ@zYZj@q(g7X-$4zQ<orw z>P;B2OHeEFD5wSQ`%3DFpCimI6yq9J<Rjc%kzZj#kBv4w+AyjYGfUT-S#&nSl@(=< z3>ju!q)us^Q~Dc_@2sw+6SCT;JU*=BSVzHuCd6{U)AdL{Tq=ESrU}8e*1q$i!lGM! z5c%3vLv=Q>_rUbEk)K(p-rV9=BO<KosX#HxDUncoy(z=nuJfhN*w)Fk_t|hw{Hf!2 ztp%j~Gx*#sN93YTm|Jj#&p5N%>~1nA3*yy99Ke};oGo9U&Jy<TvHjam4fVLsXADP8 zS8-EkA69iOKXjI`z>9usK_ruR4&<pciXE-f;N95V<=wK2x6TRA+bXoV!fo5-VcEQL z;&w}gLlM?6+{la#r<+OF%9;&0nT43=Yt-v*826Mp!xea}wwaTQDdzckJtxoSa`N`` z5B}|}iss%A$j&zdPd-95Gd0xl{9y5~kzC7ny$k0_-Z3!a5(mQTHGCrC@<eYR)W_<n z3k`%6ddF$GVeT$ql5`v_aXZS|JSV$*{KV+CBp1*?p~kYbn$op-jy@eQ@~XI5Wz{@Q zo%w#0*Bm$N#E$;<Mz)DoNJ^$4rnOgzmmouf8;~4}ZKVNo5nB8Uk|eLAwyrvBllMLL zlUnq{?g<)(6X`UZq+*VnyEQje%IhAr>6Gu_^ViX@pL=42d15ck{gaoE-ZzF3C7jpO zw+GwwoET=4vbk~pmG2@2oXPqh<eTTNH6noKLb*|EGT<XB4GD;)M;&d<Ax02Z;N&UT zi&9}e+DRFaYAXH8Fv**|gl;f*uSYN5q{6amYD_q3c4X9iKm=}BB2enbqxqzIELEP^ zt;>@B@8e4c9d%X2r;N!M@?MR(5<;=utFkUyS)RqU5{%3ni{(1&2CQCj3bfnJ^a9?* z7c&@5Pdo<H##~zEV)%N;Fz)f&8yDui$Bh9SAy17NU-!`<PKgGx^b92&VBq}L55G6$ zF6*f;>q+gB?xy)twEByAd75&*JKOewha_@>QgqUYxe3A1n+BGtuF-h;WKMcD>lJ+} z@Y89Rj@wWStsHpEHH)zQbL7*?qX>6k`LbN=^UnAp(I?EIizj_XTNW4ehV6ERMtTns z*9n;86GDX#t<sv!=DV6cWWN3JM5%WeCQY%q9<&(g4}J`SdqJ0Xg@FgR?2$wR4ubHl z2eiu}hR2={*XdhEvA`cO6eGMY&~=FA$j#;65Kc*2obT)IyF(H!_In+`uM<&OCo4a6 z_`%!mKf_P~MR@x!Ox!{kdI7gn$m>@6AFSU`Q&pc?2k!rI6<>+&K_0Cp>UFzG9IqX@ zOOhcSB*%9oE?CiFUsrB}rE?{VWmYups-J}RColST1;%)0ry{`bxbIp7*-4%8aV1Xh zhPskIU>w%pzGOqOEbe|Hk6qk)7_PKwxG<?dEEc+h7N0gIX@$LPsfz1AoyutAa$<9w zyT`Ybv};ZFp2yW>C)fg|q)vm&w4>h$zpga1T4O&y+~F1JYZaCFO(F)KMi#?IrNmlf zv!Vrq+{*S5qC29aWaEwe7sEY8h`!i*aG|`6EI~*j_NSs1uI*6aOi5K^Z5?LsC(<~- zGEA?v$A~MI>D~tef~x+9om-HvPR9>Fj_&B^yh)?KA_Gq3UVqvjjVdB!5ld|!<t+8n ze885zwp#b#*w9<*Pxpk&?e2dPj%>mN1|33+(m(sp7Pqk9yS?!=-~v{(8wo&)SD~Cq zqfvVOB_$w%A41Gz;yAYJigz#T*EAbd1N6gcDu?l;ShekO&XuPpF_>0%h)A*7_hjuO zsO?yWdtacHn@zos3YT<v$gav_+7s0EiEiYdFg2aQ8$$Y9rbAB8&GB=~yIsMqG47@* zTg*=eUhOpe%d?`VK*O<Cx|5vj{$aAdRyTjeEx#H#zJ4pV)xVRh&Z#hL%($gMGL(9G z<$6~XrCx})!L_r06fYjy088%Trk7gL0d`5>xAqR*kb#5sR4M&2+C1{j#1q~$`p&i8 z<dQ**k{hkCI*QsiTDgLFB!)^fSy~JAv@@kxmyn!~@qMnLAr|{M%G9j2R<oZn1vK^O z$65$|j@23Brvk%|Cs2RD7+^)(L0?Mr9-9ojcn^gQpUXIS@P0rOR8BXaxX;$)mh8!Z z|18zgQz&C#t=4)cn|6-~qZTymbMJx5@Yd#AI$g^>pK*UN_+-~X8-0=k$%V+1-j>9v zSYZn%njoT)5{;Y#p*Ky75rJjgX2nn8ZJ|xyqS~ZFXl`*#zn_v%a`WxNnvz^iB|r4X zhPt|ObFJuFVoq-P_0KW(2^zlJCd+axgpci}CqX}|BsJWYzVG{E-kc-oq*p<Xi#7s6 z*bXz9|AZ$0Zu(SIn)-{GN|h;JmTsk!$TLQ7!-suMfygB$Zt22+pKtY7_#^zuNs}?+ zD4-bS20o%)TOy0Jj9&@i{zA0|vxBfRsze`w7L8jZxEI&yQ6nMmS!)Tm=5Ca)VCR0O zTyN>c&@_KdKEx1Z4=*Yp%R{eKzGyu<fer)uzC8>+U>LAro-G~PRQLm1VWCoe>~d=A zX##j&%L|&wIwN)(1(_h$T(O>oAMij?fQ>vk#iRRNUUl7A?segvBLvv><Htl{`eYaP zus}m3aR*;@=2T!d(_@$~fnAe^P-HQ>CK(@MVZlppauj5^f8A%>fqZk!UQVnUj5)qT zC`Jn^EsbkO*?c?QM9e(B8{=k0=w)|bKVBM?++nIKC;K7s%jxJ>ZpOYz-gCtF2{E>^ z`<EtuFC28#&gVR5f95iZ$SyF<*Rj=5^M`05%cYx|x94b0dTg+gEcZ2<zYh(_$fn+> z*w1TFi;fvrvTFBhMUld>zo>zA4ePehkiUw<XNrUAe}t4EY;z8mCc`lxfAr<sMOugS zR7M5(F4r;koCEwDt;n~A|4p&#f2)Gk^fov`J76FaDsACF%bkmhw;DYZ*tJYl?xehb z<Eu@*!^O9<1GwbcHp)TQ@Kp9t`>gl5tc{<jQ9)24T^8Gn^EdsXRs6dIEyQsU;z&el zl1Y(HMDQhfdnpQc|CSG|h!W9_Wusq+>(*%GUgu4t$>4YhKWENeZh0HAl&!M&YSR5w z@k7wX+SmQJ^zSR?9<En4Zd4kNHA&saQ8Yh&Ya|i~!qT8j^0qTdH|=je{;=fdzL_q# zI*y{Pgj~!2iIA^)ZLeMlNjQx`_!Q=<PHo*D(@8n)C%zZ@!Nv=XaJ1(j@msz2lKKsh zCajfUTg@C<w{!3$k$1%xKPU1Bm~ER!V7Llc)wkPVtJT?FPe-1S!Po41;o3Bj<CJ(7 z;%77$TLMM@LH+hm2mMIwM<#FQa*@DZO61|;`W)hf^cc!I&Ozn3T)CUnA!IvXc!`#5 zM0dldKpP$s=EX6VV9+MMQH*;NVS5?#=r;LFcn5%n&%nIQ^4^H#7I)PS9M(>4GG^VX zO3I1)c<=eN^2)AFvs*vc2S}e!>_Cj3F&yXp+j;{nCSI*_h<k`tAA*!eDKD;1h}ZE9 zfz#Q5WGw6SDe+^cA|rad08$#_L6YX<q7gcR2|qlH1ifQFGn)QB7`rN;PIvhPth`FU z`ebAw+>83fJ1e)Mqv0R}l#8FxoN0e9Pbf^o@7?SeUt3C7ov)plL$Cg|=to3anUnVe z4uVk0GkYCQYAc4D@>B!EqtDOmwhuDm<z71X+1LN(U&HP9DyH`CnFR_0fA3T|sg|!$ zr&<N6!s^9EaOxhvd(_;MbZcp&EYQ#t4PpJXF1<+Q%><tM$x!I~>|hez)rdc$yx4-H zd#9*|SlXF}7Cu`vJAsp_0QMP#rL|?47pz0{{`Gt`vx{=~UIiV1x|30dc&`4KPI)q> zQxxbLDy4);{xw3F?$74`2p#+&5c*xtk0!{djyGv$a&0A4@yIrgM8)-fNAZQTJ2q(F zd)@WhPCO==7^9blD7A{PVd6?ayR1BFVavH;I0AG2WSYp4`5^OuJwyYAn2QKe^JjmA zO_pMS|B9Q>g+>o=F3Jb=tV;9w4o}My1X;jGJD07<8b8g&(|Bj-oXiX6o#9W%&ik3m z*EqgRig;Uz=2H#A4g2IfL8TdH;aWr4@?Tiej7&DN7+yg_26X?eCJGtxaF__#*pbZ; zh9#>#ygm#?P$9!vzu7NKE1ig1L8ftdHtwjQq)Bov%CcObQ;Q@7X?pGsQ$TLzOL*g0 z-tkCqyTLiO+3#vol8NPRpD=Mt_1LJ6AlymR{vjfM@{#o9z{u{=7T+g~kJ;R1;*LM0 zsr*i!s0H#IviZ4{j6tN8ge827XG4sjEk8G<p4KW2oSQd`_}{(jYo{?4+$G*0@Zh-| z98j1sJHSTE%kJkPa7`Tad$Y%)I+i&^=(>pV`ytZ{k9M^+6{i6<WK?Fe*%Y=YR&uQ| zE_%H|4EYspN;3Kusv7l$Dz|jgW2U4pP^Rbw8R|fTVfQqTg>r~!(}ndFY(kBWe#<Nt z4Dbuq1F$x!Q-Jql{&*>b_5DsxUvr_{>AAMlbcw0`0AtU41*`9l8n8yUFMAqn>EvSZ z9};=8j+l-dx~-GhECjMx>I2jz$yxLVvkRm}d&lj*FuqUxukHoZ<{?MBu0h<MVe?X5 zP+f0^Kf3!)%zOLYl?qM)1Z#d8lk&0}yw$XtEH86~VoLHx#?JByqZlzox!5o=NHo~t zVvCwJ=UCLMH=>T1cPw%D%llT|^eOnB)6D{uI{1<jJvl9bY$#--PdIu4eVQx10;JiI z+<_ncL^dh?daB|AN{{Vd4;9;`{XR9_*BQ+6-lV%tyJfo?v$T0}8nh%vTnnkYtGwL* z?@55?abtTah5^rps<K4Fm~I=kRp^S|(Fb+bT3v3ta`DIiceH<G)*%S#td+QX8GJ%k zD>nVjA}_HXYj?eCqpTh411~rIj7pk1BO2u!%y<ivA7I=u)6C8Ll`axk?c3?hT^gM3 z+&3>}vt_1(o_N6p^Pf1Uz0D)h+7x-yJBEJh5<KzUADxx(FWbMf`=|)wTxm=F3iU1H z)r%&`ZaKUc`ptRz&lD8uUteOW9<he~La@nJ?Uzx1WD#Ra4-uWmeMoX%3gcyZ4qCwH zyQ?}4YV)dy)0<KX%W&a?P>r(dPC$C@EfCI8)<^@aBwK6VFFqpi1-a`t%!#idIs@0# z`}%$dJqhH(zrl~|Z%08^=~vVm)|}lY`r!=cIr|ypv(kO6=RdFs$EMKs<hQG%vbYyP zsdVNbut(^6i00Zpxp)poUzy#YC%~^1{FQ-!+%|iGriV#iRPI`?)}itLgt=mWOM{y_ z+`^X-TqRi}!qUAAMmuoCDJ*;B^3K?MVRNCS%}Tdd4d7On(?$e)0QyFpU!H@Z*9`vi zQVv10G!&D+4C1%{&&C+Z@NxF^&98W8?xTT3%%$vy*+dt1a1-<&^=9Qr&XlT7QwNEb z7f9$Fg+MZLEMEg@_=@M{RK1zHz3hG)E-TqgT~R5NeTd3C=69n{?g5tpn2(>hk)5t% zhqYSZ<TB5@nm#l)#E`(5$vIsASQff{azi$Nu9S)&A!yhP4L&=>?-Mse<X@)+Ar>Tg z?>b!I{?6n61;9Haq&7mQPoMg55LreM@Ih`jLgCnk=-Au-M`Jcc^mH4dTwT98o9P0Y zfV=)c{)#j%Lu#|h<Dx{U<L9G6D{uKNq~n|M$+sYm3GZ-aF*rMeu`or^Ob~j<Sck|^ zX#!OC*utwTZ)H-RfpmW`8w~N}CQD4Mjqxp2NF2IQJ&mL}n!ue1z>50X4^2k9hVAz# zFEHus`Eleku#^Qc4)73h(rHdxxPqI&n!|qamIT5QZh%Mpw%iz1&3FrcoPDAvL3-!J zQwQ>l-I8VB-Uso}Q|(X2kgUsc#uXUXO;XW(6R6=RR`~FT*%CFRtgq;6c<SR<^U_SI zjC-XiQoV5<a_Fyj7YZ}rUy$%AJC#lj!ol1J2gE-vw<4*D^382c<zn(9exv|h`)nEp z6d`1YXlA8~l`P>wCZ@NFb1bdipqNr})U~o$;Dt1ip6J<;<^KHS0Ei~9^!iCm;jc}4 z%pT2H2L3#C^SZ2Gb;hc5+-Qk^k<~Y6hzNYz*f^3{7i6T7IBhVH?Vyw4;P)ez1*0u3 zP>F(rWEwV7-a(C-rT~BLwxsxInlL2R*NiH5Lw;avl4r{yo)7g{G`9RN-$_)2QSz_# z?L_N87%J4B_o#OCoqM_XY2YpFFK-;qf6T({8H8~J2D*2;W!Bj}E2YcDA}$@les=L2 zkFtL3atse8=S*^8v`ABb>|#r1&uO=(5(lqucy`*&;vVNTHqLck<_T1KJYcPQiFGO= zkeMA>JuCj#IX*V)vE=~k3DUV4`jDd2=WBKw$jFfbT?b>H!7~OK(T!FNOZE=WlUFYK zXCa4RsbvS~^x^&kv*xEM`aVk60BPr>emS(^EJ6y~Abre>?lmGv<+azajVF?=7L1Ml zhs}|z?caPZ6ZqzT`y3X5Xhp&678iML4YFHIJd0Zi#k2=9Mr5KCuCj~HA8bUEe*b`< zN9mrNGnEO6kDJOa@^~_xp)=c`E}E}_e%hAZaTur?a+tsSsSXE_Kf<Q?LOve`Ay2}Q zDfbjpxlKQzGLgoF5cO2Ti(ah^#|QUh9&caBahCy7Y^T7cvKhi>dJfLM@VOvcQ`H9~ zcBg*Bt0R+S<PT<AHDu`#1T%F4d+}YcwD{M|ug^kKOt=fHY9W29VSVB?gV{y>qk3Nk z)xJs3jCTe13A}a)CpQ~R_k}4Q-{q?rJQjvl(p5qP8O?VFp@6@?_DX5uMTU&QjPs%z z!R{4PmG_cm|EM7w$jN@aH}f_W0cL*8m;d0JPGb}LR{L{Bm<)E12<uDJM2}3@uQ)}} zdvdXe41fKKK`6hUHoxUe1RM&AV*jXzHs4fy0Ih*D-8D%DvTg^Hnb2xLl}FJNnaU+l zM=XZ|$(o33mAY0DD9l*03?BDiYl>`L&hD(7X3m#%p5D8tezqRSXt+{LA-ZNVU6Uq; z7CDtNea4mxS4o^ctsn-B%P!_XTF}mG0VgoJ*hWM^C@Sq@lQ43-(vAO(E_!W@KpMc> zc#+<Q<==tvy+W1h^3M5Lf|+xX8^k-@me#d8M|<8q#I4UuHCI#ksiscsz;5OnJci~% zj<{Ib7L>Azv_4g^GpqWt+q@a#DZRgYUC&YDu{P{nx-h@bq8dM(jnPv_NDB<lO5}@d zi$Dbn{h4L<ebWX+zI(k(UAc0tbS2U3?j@HSxUS>x`HB8)?>w?iGmo&;AQVvS=xH8y z+*jJNzRtpbbyJ*dbJ<nxVcBg$y(&p}k%*Up-i9gxY)h4*`C4$G>27gK9K8Z{{02M{ zHOqnxbpC@fyoBLT{{5HYM5yNkc=<~J6eQ<pyrYy03SFN2CXO5R-<I67bjmy!m}4<B zcLx{q1(p)?JnxwNJ*qqMc4s^f*PA%1Q6*93mVnBwo7Zi;h-Us^(;qdF?i?o6f!Ws0 z%brSm<DODnncWB)tEFZz=8tR(gI<_A&#QrM?JJpF5O`v(;Dl$hMBPDKE$Z58o$#f| zt)Jomgo2*9ho8aCIN8%Gr_%)31f;vfWr#dZ`7t5(ZYT*8UGOy_daL&?Z*D4iU+CDa z?5^!mQ<kkC?R2ynR^MKmh&k6p@tYhizg17P7_uMu_LYt7o2(y#4Z$IK3S-zR@;HAr zYWD7B-cux8VyV6BL2YL|TyqZUb5XveoxM=88GL(`j+>jXl2{UX+jDP~@W!}%6v(iz zHgh47KIrf2?<C`O3{Wp#wIhg*;CLdDfg8bfaz)2o|44QB`ZwiqW~u*{ST{ra&V0Oj zxLGb9Vbt2){De+)7t_qrz<i$IL5|!UBgn3y_dB`PO6@NI{c%*Y$NOV)jU-IuC<!#L zPst4j-^gO_*4)UMnH~$oj5%t<I{>KER=U03|DeiIGFWxCi)>1J5EmAy2gm($$<(VA z7kjrrj(%Hk9w_~Kafk4sB=Ad#_w%>Spyj(pT!M+)8T+9D7i>@v*qC{uW@&HuCe}CE zx9}i`R7;n^^_&pSPfVMB_vZ<JHp`u%8YljHg71470c+D>Nqq{{ec;0@q_J!^Srb-s zdq9Vae%<+<#<J&~dboA?GhxC}aHVFQg~KOtn8%j?A#pMXzscjBIM3mBNX{)j%XFgO zcnt-s8o~8muWQOD{=Kdzz@q-diTem+2>EW$3CWH56zMFG97_KY0TFd--VDV6vxA47 zFq#T&v8>x{P4kI`X915-bQ9k?GBLV=KzxC!9L`~^!yPs3-=)?7p4-01R<AT)B?|0E zRhB#0=A7L$WOz7a2QHwW@+4d-W2F^V(GMF4f4kk%X{S~*Xu!srprmGu08&$!Q^D~K zxKe3o!#FYfnH0yjcS4l)zl1N<E*h{OZ&7>p@oz4vH5{$~-jrYUG7Tje1&doU+K_Y! zM-MtoH$9vvNiV#YdB(~N4*m;t@9n{^1X0=g&Ovq<JX6r4*i6a%e>B|3yU=~~_pD>H z1bMFG-EUu2)EC(n?K5(^?W5{#pCv?GS9t_An=xHN4zY7IIIf>sZqG*oYh2LD=6 z^C6E)>5bW!{uZE_gQ!ZSoH-cIhE0i+LJ_q)hK;|$*p#zWZ;Jf;NRqKAlhj4~6y{8g z?St39EcC-_{dAg0QDcKU$f{*3@xRPHR?f}yc)LG+Cv4DS(Cp6mNx%s1#2?HKPA%xc z_Yz}9yx<mFQ?C+yz|T1r3Y&`5jaDU47{#Ae!6)74-7=O(8Kmm5;XQFFtmHw*0^E=; z?QoX$`AZVeB#bmA-BhP7{a0Dvu$k27c0~ql#r7REc1J-HNQ*~3Yn-MzD}Jk-_u#!n zS!FG)-M_?cT>~3O=uNN?1EK*W2XD2KL|=&lRvu=K2(t*Vq1WYp_`>drmgMPLm0_Pp zl{|krVKdh<SyALTCf%?d<i~hkon_yuV_4X`{bXM#ct2r2P7Orx;;$L{LH-XV)NC-< zN$};W$`HKG^seY}*sUWwD5rK#yY@W<dGKv<p`)DH2@nv)#Ce^?O0^nFA?(W&90%m# zT~?H`M-oOd61P%sK;2;8y-lq)R#6~7A3%``#bbtWVZ2-S-#BnrutUHuryL}A42CA) zSe;I%$b%+={gprq^8ktwx?|i&?WRWb8WdkXwe)qf-}cWeqQ43#I!M{BmNGATzC2A{ zEb9X@W4le;C6bFGc{Kmj%;E4)(L?9X9NBZM2J<{pQVD7A<QJ}hJ+X!VDS48+vkRj9 z5sY<nRc_a|+A-!Dkgr_CaTn+d+IA|T3SWfJzpW|r|1Ntp+^QcI($Ub;qaCHFl|8qX zMD@uTGFZY70>Ki}8m!)p7LFAPWU?WGoNF}eD0t`FuN0|)FFfK`st(JR`q7n~7esns zT$*BH96lYMV6Vevr^|g@=3M%FS;7u8{oR=+Q)X7~nUwM#qJQjknU*G|s=8NG;m*7+ zo8+A|ZtgQtXoLc4;h_}bOi~%r;sod(IcLRTDpLs9AC|s4>01s=uh@87gS%p^x{W#= zxNr!WP=9iycw_A$ubbM`+Aw7u3mhRR54wL0S~VREI7g@hQ_tzck6mlHqvwuF%RHeA z&0_A;A1CFl&n^8}8*AkYAIFDNk~}xo?J%ej<4z;SjRk^6SP3lgdSI4m;?k$|bXR$W z=(dACS)h_Nk~A_0>tCa|*2WK<(LXmY#Pa8j@p11eiBB^@OD-r=9yz45#YOafV}gD2 z?&VI^L!4t+9@V;52Bcu9c~1iG2PpP#xiaS7&V9}EpsDvs%Sm+W++W}p6MGWBYwrDg zSN)VLUQ&FW(Ae@if2<I`b-}rzt^I_lEmQpQNmsv_ojX|Rhx7?3Th$Men?CdIhf4LJ zi*|XAlAb7ckdEQ(d*VwWu2H@CGcm<T1C87Hluz={S8-%tgzFF!7wI$=^suS}1I7Fn ztPk<=28r;`0)gnK+~hrbo=lF}Q0uJKZ6=QZ`u&6(_WBbCdEfC4Dz*Hf<Bf7n<H`xS zS=*=WVzKvoX^mc%B(nj4(FDQA1rvPqJ*aO1X#pF;38wa1S&(Yl+w>D(aZ^&#D5*!j zs()mRWLg?75+EyvZ<}0Ne88*n?O7CEF(u4lWvfl=HYfkQUZ<SL4D|zuIz$?B*2%_5 z!KJHlL-{F}8cpPIQ&~>x3-)x|hhE{zkhRWB18#f<TzCLDo!!0Ec_~W|gyMp@6DrtR zPHrrW61{OozX%_<r$(Q__f>*Q_O0DUk1=Y=4rq98yuCv3kZjV0d@xPD<)?freDCKA z`2w1Hf7gM;PmqjeM4muOkcu%a{@yeNaG<+0-Tkcl<@?_{M{h1Vl+oV*n>ce^ObPMF z_A~Fp_13>&Hv-KBRz6et61>rvyL!3Z8JLxrCrei(vYhq5=+<tLYqOGf=v<L3L?$Av zjo$bmSsu=p%i_5pi<F*n_9p1Za-%l!yYKkeAukiEcuNz|zc<S^(`sUmia6|sQv_b4 zt3N;CUcSyd(Uo_ge#OiQcacYfAK+n<18)fJ73b7QsW+=d!ID_5Me(ofjq%?Yxyv@U zbClN9(@f*0h^4w8^*tq)<dOiQlZTC!qL69MCa}o9YD*TrEa(gQY0bKDYooqz_@W*w z-%jtvrPB_((4RONq@=cota#;aHePJvlvq1^!R={D;&Y5NkL`i&C{T3m=eG1ZRO&w+ zu1v{&;Xg~&#iV<FTovPSd8t%(W<fTtr|5vN>=wt4>LFo=02MAZRlh^FJ^ycn7tl(J zZa(SXvUWIwv14vLDgG>8&XI{Ve;?Oz^W#=iM;ZtCUM{`N7Va~$Gh;{}frB+`ao4}o zn!1BJN}+$T!|*(UaQ$%dKFdWf!U%L&9GAC3zdjECg5rWEDANX_J5ZDN=6gAp%L4uh zAchxhzYu%}>*`O4t^Zv~pQ4si%n83bT(z=p!K=Sa=zmXD^%-V!^JUHS*#tqbNeu-h z5r~Bn%iBYqo<O_1+>`SGrnD9qxy9YWKGWfguBEWgu>XYsxP|rZF5!D{RN)!8FS$@< z_vUBp^xwBU;;$=FWV5_NII9BfGqNp8t0SXj3J=x^UvSuTnj>CEufAM6YM{HyA?;8q z>n2@R{0^4dAY&|Fz`CiZsH!o$*i^dY9?@w1ht$s8ed*lx>+_tx&W3|EP8#Fz{Jda$ zEjtDh>hsY<K=;q(qx-%;T$rY!nj|k`4m)p4KKu$=odUt`4DA2ctcL05O3pna(<^=) zp<Dq^m}#x=BAN(d)PP&f9O0ZtNX$)BP(NdjZl8jEJg|LP)~iyptutJ^tlu=<EZ7kf z+}_WoA2wVWc;>fNY5Q@NhntrB0QUJa6d-JSM)T40#nc?Uf!verFm3P4m4gN74d|TD zs>2<w`E5tfr5YxfdT&wVc7k*dIYz-yKEV3<+pw&4W0z}zkj&Gx&@lTS*c7vkIrj&g zdf=hNdCOWE>j__l+@+enr5{fWly8|JDjsHPyKH-r7|crxOU~)U$$b|QkeueWKwE|- z*SLQsstOOvop*0V&C30!z&wzvV)vcuUak^YJJKCPf5J0)C;ZTUw@rH>A0f>f`tP&y zn*flVvTjI>&v!qOImcu+KJDi%lk*^%lIxGND~l;)Zp0>wNCt)<u{~2Bdnj{V=7uil zjP)Mic6~6G#IGxeE!TNR@b}U(el4Xkn(ko3Pd}jJataY8SW0s}ybX>iQNl&4()6*c z@(xMFdBlI6WIK>qd`En$lK*5V(xjv<s5*mOYGUhys4x3kI0`UtcOc)@CGLOq3O@tw z#?-BrwOfel3eutY4VE_5G6;7?btPt((un%+W#mdXiF8P|51m<UJ8ho2(l87>^hP(1 zMvIeIl+EB8)?aIYFh`iqnhn;G`u!qIJA8NK{k2xP9zGQEr7!Cow(dy_1Mplz?;PF+ z0trtZs0dqzCw3NBN~m4NBU2;9ZsF(FPwG69rPnrs+udHnOEl6Xj&!q{S}=jb|FR;K zyS`XtOV(&Dx0*at4deU`fdK2a8#q_!>hntVCVgibO*0+Pw-GL`M^wP>PO`8({Iy=m z0CTm|H5~jj-kbKer|;XiVxtr`*a+$|tUCLz+fndj7IGlnq9n&r6Ys73VFx<*(S0B8 z@?H7Y<H>tL{Vez3Ws~PGUaW?5JGx7)9290w>{9eRV;Ps@Znx0pl9j7ckl_hPcU)X8 zSdFcv?|Sq&*x1PVCNT>1tnL7IzeVE3k{stAhhH$#aPc1V6v97=o{i#nSq4i$7=0Sz z=|3^T%A-I*20Ff9!#}Y25iI@c3{Jb?xj({81TGA-(|D*j!RHEHK-L{gc!zIOH>9my zd;)){0t`0gnaGnIpvKt*&H~rsdA)Z}d0yf!aBb~ET)g!*;9Lu`s+y{oRe@`6SBwD9 z1;<vH`P&@c1vg>bMpINKIF1>Ah7F@|T|v~^*9vtKTt?vJa1oVtxvSe?Hu9gzA_f{( zzZLO{MgSrNxI;mq1FmvAR_ZPVOzb`u4-GsuCzNrE%5n@)$Mg@>7@gv-({t#u#+V)X z$~F20^X=YqrgzMR?@=S|Op1-A_b_v&mFtlo?8_fbcZ!9AQbk%rjqGn$2T$4csx(qa zr;rcw{{i&*?bRP4r2G;a;P4J!o1)^T9`b%eaM%1u3a~R(yv0j6N@(J)93UwW6Sl<8 zoz$lKBhE<eD`glP)j8ZOGeHQ-g<naGsIuv$R5&!evHT#PZG!N+g2<F9lURRng*;<& z{O{tQQ(ITHti@E#3AGhwAn-+1qWTh_Pu^vH3a8y4H!ioygBpnHlg~>PM1o;2d9FBo zWXn9@{?ePHZMIw^?X^U`ej8Vxwj{?il2Jw-Guyn7e*fAbU<@+@OJ0q5c8=FPE=w(} zK?@exL|c~D%stn##<eXA|9Z*=v|zIAF39HYBo8fN{cw%3%*K1HDpZ1Q7JEqzmpigi zwrR75!#4vXl~8sKeiV(yq8oRe(oj5O!b*LXEyLHdf6M625Ps9qTpc-K)~R+lhF|5K z#K}nON5?#rdswry#@SfmkXvAakp}p78K!54ng~0xmV{L+f6ulvyY5tFGaN9@NB!D; zpm!-BKj~h$YnMY0rbRul@&pSu6EC)U`$=ZE4t~%KE%sdyRR*}l@y>6XodU?SB$7oi zy;4dwJ3l0DG>?kQ$l3IbjE<_qjaIWoGjcj0W5uWE%SW~&YeKG^zcgwrO=obpj*g8V zx7`ZxqYN>B>FABG=Tvu;x}fRwEMs?O{K_O}U5AMK79h@lPiY>`!W{<P45|J|s~ySw z*^*584<ubk8d$4KBOyIPq!WkSO{9K3-*c)9dj3znL>QUE#j??`b~#|5>2{<=;bo`V zpnxbfMFgY`%_R@{plMAoRsIzP5S~|DTR{;Jl=i#Sx0#P<z7e|GlF}U~(Lv<(oE)7A zW2wFN+X3j>zQ7^jeC>CCJ&YA2*y9uze!P9P2<K1fj;s@E77VCE&;NAnlJnE1`t+z5 z)QI|IiNh?HWy|i_izDTRUI+YhBTB%P5q+jD1Dpb)Vz7^w;j}ljy0V>@DD1ln425G# zHzZLpo{gEZuh8eMFXNxFoVRRDS$k@nmoA+eat%oK$`lagsHHzl{U~P`(@}JJF=txt zph94BzWF_H^&3t3)JzfeE5znWl)>G{fQlC>*}0ZYnZCPup@Ckn;9akj^nB^~J=S_I zN{^n@1K}BP1LAxV6oH^M0KM+pj@iMPML+YBI8N95q8IiBcK1@P%T%-H>+4(7pS~&L zIWhw^;rXd9YDOHy0j!~aq=2L)8EWB~b^&SK*(EMDVyE@<V>ZzNMc|#kyA0&i9f#O! zeb|tGF1?AEO|RBq7>F?v{W|EpvOk?EGk}cPh<@YfpE>I%F((D!fDz_?sVn7<s$A;f zHD=-V6sV7Q&Lasg*ighnJugy-##Lp!ppBdtjzR9`0?rF&*Cl%D#TD3qb6pIt^SB_{ z<(S4naV`lfA8h|%EC3tr30%iM<JLs{es9Xekul-1<PW0kIXZ^&yTs{jppB#iX}Wmc zbTs}8!%a_`SWA<;T^-5hhS)cbgV{~a&q}|D;b=tPEW2s96__SKb|nwrlY9&^=J{*8 z-m+>uk_R6`Qp%sCkrY;9r{aLBG0?IhepVv6zshsw42U!;|2$MZ3)t&j_R!*Nu9rFX zwNbHIt-3)&e)88$=V9vPGTH54l8}vRU>7=fE4h=Ku*84S1t_K<?8Nn(>qAhy=eXF9 zlLtJm$5(Mplm(dy0Xq3ilm*2-?c^fG8Pi{NY&um+p|4EXWHw^%$xE@%`^aq%zHlz1 z?VHqSO06V>jRWK)$z3rTI{5OdFsQJR!X}Xn5^4K>2?-T`j3!Nr2Ess=wt-&`*wRz3 z8-fSn(q)x|u1&SCeOryub$}&8R*{o^BdwhU(Q8A$R|3ONSrSg-4r`-1#u)+n%gsNU z9QFyVR&1TR&T~P6hx2XsROky79@NvC+l3RlQvW#z6l68+81&z4lU`)Le_1D|_tOvm zBLXpD8Eb3vru-{@$Rh_o0?Eb6t?geII{C-m($tf57fD}gREmb%ee2dAxba5fraW<_ zXQT9ic@kvC(hhfi!B2}HzXk7h8{9V5*4BcXw&G|mh)s<kjS8XIYsjjeHAAHjGtH|F zF^`a`I=SiFQcd<`m$h+Ul5-8(%KdY_`z?#7Vp;{HZKVtN#sF(h$0KO|(~0X<877k- zcXi60D=g22jl1L9j`^crjntzVws`b{_p4?^!&N@EejBK*?Os-goF!9!sesU2s~zO! z((!Mci+IY_z8)nXKJP=~5rOxj6q-(Q316+)Vv|<;T<$5eGl7*$V<*;3-+w6Y;KuVn zGf+02Yt*%w?Ni*FMSm02_((cc%Ue3LsxvLtold~)S!(&N<-hyowqRzD3z#0!wRcxt zHR&}^$SN~jas4gHF!=5+6Owwt(9!d9SvEJ9klhu<6l(NuycoPuVE9>w)Q=YZ&nTJJ z6=q^Xpb$47w7BFo9<SUhn9(1$?^}qYM67tL&j@ZWJQH7^@b6gTVQ~&q;%a|Z6}c@* z-|~iq!o?75JbB3&*iXEPC=J!KyP{ST<>l)W#{=k*Tj-jS5+#%-s#DVNw_ovRnM3Jh z)U{Of$6u~Bj++Q{?~=83PahMfblwdvKZ?IvcSs1!Cbz9ekx6OupH|yh)gR(@&<fOS zT6;Vgziv~eeK`RBQJ|pkef*ogCYN{LGGE{u!pO$%3SUztn*_G3z3ezX75f0H%W_kW ztpSikE?CJ_7-$qNC%={ieqH%tDi6V(#GO5p{mJ53vM{yrh`avKn!~6&0)x0FxjdUR zt$lT6x-Z6hweG6Lv2OM631iE@pSJ^PO(+h6!&dKp3U)x)R>t;W03aF-LN28(+rgvn z(~xvPfz$&()kUM)e{!YpMK|0F4J<vo8sjB-fM0L4se%dPoZzJzqR|F*Q<kc0pmrg& zrLC_fs;PpwXg7j>Q^M$UHx$?X>5Tnr%gaMJEnD8o*t<Depcv?~Mp^$t4)BocrI6$- znnb_HS*!a>Xq)zxTlZ`G3qDq>l=79R!sl@iZho_=R@o!h&ARn|N|Su7FYWZdlMspu zpQ-MyQ4oB`@{B0461p;nc#kr=emigvl-E0j1&KY`v0voPTw(l~%7EODrGe~8S&eW~ z@&VZ{A;NH7o~Uv-6a^5l@UG2_EdilWztz_bM?f5aYlkiHzbJ11Xckfs$P0V`2zt4} z{OezKGnK7KEHN;{wf$Qg?-G~tlk)MkV;7Ad)rvvalxX|#PdTI;F4=QS0MeuRWS!FL zgzkdqdwX>%HvM&Snv*Bvx>L+z1z+^Lw~!PT1{=+t$ipKd-P<cHz}%e`BkhMPiwEQ_ zy1p~gh+^d(s7h<aaVV^&pUpQSJf0=%I@^N6phj^p$mWQen%1@{jB($kD(CVMloqMw zM%9&z=-w!kw`yJ&aU5td@g}2u68j=r#>!Wvx~Bisoh*<p0%C5sFRP2Pd2P>;IJYk@ zh41}1LklCUKlo_U;X5Tgx7=o79>S7CuzMFWWF;5l>h!iH@lV^S%@ljdZLug!QnYY$ zKs5cVzK+|CESaD02$li%!><rZE)NzqcpVca{+959*8%#s)(7F~uyc9%e(wqmylwkP z7i`qDBZv#F6~Cju<e!oYPRH#YGkNdziX>5v#+Vz>NH(a^Kh9#q7urZY%s(d0C~nuU z%3s+&<fvV^-O|)<qkN5VP<cprrUK$9gI)MMjKpmx=5AIjbdR2X=4KE=BL4+#$5+|7 znE#>Z3NQQY-3j;^nZSKa%a7EJ>wCx$0bLfdgA!Y}pe5+XdA951g>XNWW+%XJjpSQs z30N>(P^)nG`&*!fV3xVi9OvRa=Qpew+Gtda&GJnuwm2F5TYQ|_Ka;|S-+MJ5^T+Nk z!R@g3SZ2&IbK4oKK@>zryN1iVwyPz{8RogXy(bo$hT<C9jjLW{E2I$b;?J{KEN9Nd z@7y?(<qk%gd~x_icviE(VI0$Lii}XZziu<L|2Doa;)oe~k})!ecGd1D>K7yGH{SBv zq!XO3`__zEJ!e}A%K0gWJ}B6V+><96H|cGf{#_n<*i!Fjt1{>2)^D4--W#j@Xiof# zlG5siZN86U&QVpt+)*VFB*)}ZvExAMaJv6$H%=oAQ{n^vjc0kRd<6KW4E>WZdp@7i z&qTSOFkdoW1#?`>8^O#j>AnbFlMK|4xB>h9IL@deL%WguUhXFP*Q`s`{&PYOITi<} z(+KvmuW^sMpC<=Mu}wJkgi0x9#PWRQrdmaAlLl$xwbXVRD`7CYuUkG+=`hAZ+q}9X zpCWbo)O36h+Az%_=iqOsejYst9oahhP(sPg=q4bjpQ+zat&DBdF(Jt1MH`CfbL)%S zc7?huV%PitoGKmjejZHHlP3)=I~#`9MEd-AGW{Q3%B0|`%_8`-0NcUc%fBamT$_k* zJDdKUNzbR&+WXLP;qdULHWWYmFNMG0$b=<a?}M>U9~rDOoc;D@sKm%>tn2iHtR6o> zzo{M>^+nU!aaHaZr8V$>O*b-NHf7Qv_MJE2jD~T)0A8-Ti}chUdYt2!-~FXE!wEER z*9p-?2ef%oag8gpVPoV$L6Tv&8&``iX&vt*w0lG0PL0*A3z*1|XhBHugt}+5lpe$T z)s<}?e&}jl?uxX@b5EeQwsEZvi&!FyR(`xPWS$!@MDa7QQvR^q=9xO7VH2utK(<HN zHg5xTjUwoi=&b5YhK(4ID~pYzv37@x_kKtQ{@%0JpYR~NW`nBog-Gz4<h|LP2hhJX z_7E@#y{E_u!%*j3lX~-8X}xI<H+=8x`cSn95+>7ztKUtA9>SD}J?Qx(COr;-1nwjq z4@!eLp$U(;(=l3cTgR+)1G~pbD}Cn|uLELOs%a?3EpvSB-?S>N^Ps>Wm~>8;pC7qe z1-hbBu}BIV+5u@y;JWTf+w1OtxS&Alz18u;u#jE0(hVdpA;4^0x*p11X^SL5m#@4H z`%2uml?R;_xOZ<XiWvQI1*)B4Y=5*7<^LbbM@w-yzGP(P`}cw(P%JzA>Ft|8$Rn0M z4;7r(IpBtGL203zAfb~AU|OdIZ4TMxw!TZfSG7k3rT@Dp&Y|`mIFHXg`Y_W$Q1q4P zmEq00Jvlz5wW+t)COD?EXCuQS?pT=d?8}sMru|ToP4Q+*!lR6l>hA`D%aVqKj(hio z=551$iYBzdfKc`y54jRO<G99bR&`eSiF<FS(+%FZSDSVLw8n1;9~t~u#ZY3+{b}55 zC)*SqEnm7cBwsEj&}0$n4Sz2WmbV|UW)i%0k0sY87#OL&9Y6sr<c%mi6U#%##b>EC zrkf$$ryxKeF2J$)Nz+Wq|Fb$1mQ&B!sak%fE)|{h(}BR4E7!EA5E8M;#}(neaFKih zVE!j9Lb3n74{{zXse|n#yS(PQE3li&bu_Y868XN}!Ywwl@Y4KJZR-A_(6tSBjyOfW z=Fr4HJ|t}_0~x@bk!Snpw{1e4x^-a1Dmm<r19Hd*kwYl>BaJwpyc>{I>+09-+Mtp) zaNJ&8G;rlTqr;I&sy+UZgfF*$om+fj|C=19Lnhy*lQe+nS=^I&ai7ZOELA7^vFI!Q zz+FaR4!ft9b4*gA56H@BKhb*zl!FB`SsH%4{(ILsX`mHG+3VgD=>V_Yefp(Era4_# z&3-9<Xm{s@B7XI;O5;j9CyG|=F`MhUSSfm%G_FH<4`+}dCO!IoaKw7Su)SY~UXL-N z-Zlm|_f831ylu2|7zmbPjWnidxx6zpz>#ouP+tpROW%>br_>qF3ZA+5p<-FJ<691R zZU57=`OkW#MQ;U!1P^aqoU$VuX+(0D&2GQG6%G)pj5Iqw?|rSk#<BRL6|y;iQd|?i z>C;Q&0+(7?A&nO|iX0N=@cErSa|y0Is#(-@_doIlxab>P1fRL2ald9yix6XQa(N+N z-!0nGqV(5zaUCN_|Eyj<2I>e_TC;ohnjm2#vu3kcXuG}2W?rCMAZ?wu%@>_+ZyWnd z#{L=ee2kPolI)57Zv!`r*>7%~zapQ<Wi0+m=z+3LEv$U^?q>}M96U>fU3Fx*wg;Wm zldKJn+&LS40O;hwBQ5lDlOgRJjUTp+_M#(i1t9RBn^Dk1;uc<p)kxAHU^?=C1PaV8 zkkpV$-?ie`hH*gaiY7>(c`Z)#2+AWT`um9)T@<^&IBx54_6=EZ)IPo|?T|u{mCI;d zy*{QIR21q&ML76%KVI)d06u0vy><hLrAY_I^bH}TM>d+|Zd_@2TfFTkGf=Bbc(eGj zl?dAMVFGl@A!6)}IccucXHEfGN8CoqR?cK`pgj4!)0cs1dR~9r)P%;G`??_CQi~A* z$faV00Wk926fTnruYqpVX<wGx_j-q?2Si@6Y_zPnj0RbV7ygR;eja%KS%=>Z;sSUj z`)iJ=?GrpQ4u(Ue`4cyTVH)gm%eA~khs7dr{oR<GV`0WX=UxJK;F@ivT9{>F_$P(c zw*XkjxySEMmI=mea-Z<<zgHA<^8YiZj+9UWK49&h5cFtm*y17#Y5Fw{i&jvTvVN0Y z=bz#e^Ly179*H@P95N;RJ&^?i@PY(P_^D2xWAwiK*>mqjM*ribBreJskJ_rz=lAre z3bet#b!MU`OI^LbB}!JmE<R75h9CokSL3EA<>e9Hq}VT#_TlWkVU!oeq>J>D`}G)s z4Xl6kRI~teMR~k|zTTEjN3>`Wl#Y*|A3>DLBPi5uxSIh)xrn0s+{P`~4f>u(%klt= zzmRyLfOOoMR1B6<C(HqgzIG<A!Owrt3BU(H4JJPh=m>xOt#Bw^2<iB2WdF|oC6z8= zGg1M?B)OX2#;;4|ureAlv;W4C^KZsTI-4T@c@F<0!|O#)D{b-cZ<fV~aV-DA>c)yD z6&t-Fh)Y(~od2_|n-B9Zzb<(g!5msAGq`kl28TZFzi=W>xMUw(aecofVI%B@OTWK( zvIbPE=i*MHptrdN(5H=WS^_ThU_=5)q~#-1j?THY-PpcV7VTBQZS|b7G6~MloS|a? zLtw0_fA>y(2F-WHTx%V8Q<Mrm%LaewSxc8|3?otvF|)01#6gNL9$P)Q1lF*1d3Kwq zd1MCuI|N^F-KOOyE$c}9;U`S+L)LS?wuOTkKTTE(JR8hOHC{=NP#}^=Vj4)QRew() zXECsT$M)l6xWL{|=0*!H{-};ozr3!gwI*5ee&K<lcGJH$4B+(vOJ`iqDf;pR<R_GC zOLkBoU9+@|0N4!g|Mwaj`cTW|I5?5Kp8Qw!3zNfMUrJ5&IW>reYu62Zw4gTEmi`l7 zL!?E(mm^K9CRAc?|AcF!LqliY9WH7e_}Qn`t3)7oRrc5NundFZza0ni&T*gbK(h^? zTK(KE&HTuVT^gjp@0zbvy?g{dtGO;2pwkWxj63@-R`8hHQ16TVZ#xkp@Sjxy+g>rx zf%-fQXLO{Iy~67i{2XxS7i&__n5hWSe%F7;<Kv6_u5$#^ej}Q_C3cwXYoc`)ZgdBh za0U&OUTf{&WsY8zf8W$knvN*{u4njhb^8VjTO3)OZkB_V?HTk)AN0!blblzX&7)1n zpA-Y~1~%V|$mn5vOgzx|DGKxrX{?McVgQMl^ccXr(WE$k^X5*Ww^n=3REysrO&#rN z1169BS5a}#(bH7caw_V~W~K9T$IO?-{weNv@5z(|P<T$=fxb?X!u&MaR1eUCy_fBy zEeoYpuvpQn{0q6{Le452C_EM=+qkgH*gF{b0@|3EgQe8@g@nwwKRj&!G`xtq8{DPo zp4e9+hspOgEYKPEeKVlZ?Wh=hPufc36MN3gMool1$UCv7XY;8j*M;(gA3)}0o;XZ& zD%68su6M9b1yT0E>@ls6`cJJ*yYQpnO}OMroPp!KAPI^q6<x_NeNWuVc>UGfS0eD= ztJ-H{U3rPuC32UFLG-%x6xw$pfLBGm@&<$Y;qwp2!MNf<dx((uGl2rqKHL8gtTZVn zzWqqk_O~m8EP_(*)x5ZfzO)EXVev*|STD_ELh0Rr##PPr(j!`_qpbFbH++e)#(k)w zp{tzQ!BNUjmIFGuG+d#r&c%QD;_dCXJ=@gMSo~J3%cWm`(NtpkNQ^tOV+|I#SjFql z#H7g7{4CxQifErx9x9lfSSb@KxxW_RE+S=m@i!gQD6ZEc1$85KKfU00TY@Z*eun3Q zfygBHgT|7JUc%Gj?qN4QGUqaZ)1Hg^p<OOon4c#6)0$!`3XH__T_|fi+S~4(34d{Z zbM{I2!?aD-^q#6ZMW(xGOXcE^s-Cpcs5N5<+uswRLknO7m{}_rO5zrun46M!o5mt7 zax%5T`hXdmxP&W3v~@II{Y@d#d)8DAoswm|V$H>@uyzVtC?9i(!LW{tKqnd$V|Y3| ztcd7#Xt$yKjDCDUC);9<95f4i(URTHojO!&ENz{cfMR{OW146ro$ESYXT^9vX6EoS zGhwxuTf%D$Xlc~<2wlynbh?J{fxVg%drjOW2)@yT3{6-|<`;Cbj?T=Cf6xcdI1*q0 zxB21w6~Bhx-4|~U|Cw#ks`PQ95I*0c@FXd0wBMiAzgzRSrac6v|Gf<mJp<Jl>yw5! z>;GPF`Ab&G0#p^3UEdISV<Pygf2&d^suejEVc!+C2N@Pz5m#{FrNs(mMc+a&9nPOO zJoR8^WRiYP^WD)Qe>B_l_uCVb0)h2fNt^S(zMi%#zdrr-XnqUDXKk*{U2Jyz;+5^X zzi1v|`x2h$%A4|CfPYY3YH39|+a^wz<vzS3O6wt}5o=!TW47CGq;AL=8@o~YLa;wg z5$uPKIkH;&1mF2CxY&HvZ#S&eVu{D*u4D>LNNUeb-t1*_A1aT0BUMRreErl>s-wD3 z9~)a$T$JJK(x?h*{OVVH=2F@XA7WeN8`*qb{(Sx0E#`YVB=GO&AodRfAwBpR&bU`W zsNPQ15JmI91%H{vklG<8b>82>hZD?=Oa}{u4Oxh5!n4pHt0|`8bF?qlo{0;wH-3_7 zc?mQ22<L#%kKN>AUa8LENxlL9vSL2@6~>`xfcEPzw0@yH2&C?rkMmW-O`iXX7HyNU zx3hMQrs>T=yNh#mbgy+M6m^hy%%KGxW^ZsEwem;wHKI_TV8?$?#diOXq;rpF`hWj_ zB{~S@7{Xf;az3ZnDn-s`LQLc=ayDj5<xmdGA?HX!IW1>p%y~JEoR4$da^4|q%=X*o z_x<a+-L~6qx4mA^!}YqZ>v4Y&qAxxq&WF6q+mYS2UPlg~vm%_&d_KD7^O%)d;f9Fp zn=)!c_7q<axY;tc@OqR}>*cFeEyVMXOCw{nGccF5dC{3CL;lNa)FiPZC*!ojy{heb zvoF1UN%7G(2qJQK^Kl%=EynZ`C#~PW3gr9pz&rBlv8qSlpi7%U+FaR=K-ct+VMbY( z<k%yyuC@dnYccd$IL<UB4liK38x1wkC^s?tC;$tkp&a}xBHSQ>^Qv1FkU-omg^1v; zw)CC0fjI@%)-wo)OZzg2hbl!!NIuN8_avW&46|dp1BCdnmQ=rDLzyRqWi{-xB9sJ8 zqHDFd&RJ$bLeu7$P304Nw?5HSeic-mme9)yRBp;l5;`t<t><63bf!ijbBdB2kw4LH zmBd6I6C5rT5Ac4vR7jpUIcXbW)&VHoAUq_n_tlpvR_c8KuV+PLSH&825_VZYV5y8| zahXsC8(-Sox>j$CJo}p2J4IRL00=wJD>X4yCU>}QU3-^H-tG^Mkj8PUUOX|OKXwOM z?kr>#{T8NUO9aU-*?O}|?$#RI(*U#2XR1{`1m;-G{O%Z&cIEyJD{0<H&aq8&x$;H@ z^wU%oW!-%?%d^QD8}&J0+4c8C_0LU3E2defn2-7@D==^?v~9LJ4wLsKrrOaaNkNG6 zOXlZ)kG5~d6%cnKzT_@vL!FXQNc7w?m$5$=)1<Br_u}0u(~_-@Y6pFj84o&a#&2cB zAA+9%eCW+fd1twNv(yZ8V#Ad_aq&-lR9=-(lkJ+qBRO3_Np-hr9^hO4|9-^YtvWMh z^X_u17a!5Nuw8jKfc^<EtFBx3`jl<|-Toy5_u|I?dNvsvR_bH&nTo)EJ2<nd5!M6y zrpqz+Uy&By!YvAFNq@_=1;10z!PXcb@6ocd-`;OTOGpsQS30C7F{8p~pJVRaR6W%- zK9@!^$3MH@b>YQNX+gj5Za;J-@a7BB5?tlu%7m)r{?+u-7f-!e)TZw*KX`c8gZFcd z@1n1k@vS)aN};y4UbGQ3KX3ehp7cy7o@K{<t52F5c&>q{s?vpvFrrAVZO0AeuUl2C zx1ihOp8vBbuEG>y*;o^L4NRhQ(46mQ?V~Y9*b<>OrfK8aMofhJMJjRroY8Dsq)0H} zv*g2R>hyR$&Xh$muW&@qxyN#4Fm;bu7kF`NI=X*~@d^w1Z;_O@`)n}6_#u{bYjlSo zux>ZXZ0a^s0D2EL2TZI3UoO4Lm7YKKLzC$oEe&v9{Vsl5dCyT)M2orId%`t?TUwte zBULHJ3%OGiYmtc|r4hg2wrv$z=B&mn#>K2k&1LuLGXIr%X6ndfa*oP4*rGqT>O0iR z>CZt=si5-62dz>wj>4M?2*^zIVy?%(KW{j~xmkTvIwaYYL@M#Iid4RciT10pk0$35 zrb|&<cXwsAUogIF<5Vv2Svfu+?!SjOAz!!+GWm;<#%RLmDsfN&umWFlpixKq*PT8N z=rX$pDBOs+*F~!;t9CxGt|&6F$s)$?=#3mn%{j$#_s=G^XdmHQEft%vWJK_y)m&eX zR}z?VJy&s$dC*tHi1(Z`1z|}_8X*x#|1(tD0Vg8Nb&joX4)U)NwES6_ILA&qr~iTT zV0=f;W*hs5O<TP$>f2{?I$MBLBK6T7M8D9*Ya-Si;}(;zN^p<&Y0)C%5*tAON{!o{ zK})+|*BpJEajJybE08{Ptt>u3(U%D&+#h<!Cv=+A^;2Krj<>*R^t0pG%jry^>={Rg zVIE0$49jt1cj~V+Bh!qK1aAf>=2@YRb=28nYa~yb1N{f29<o0PnCjT-Si697CT2?l ztScRkj|+)GFL`vFC$3GqF5l!?fKP$hJxiRYM3}M0L?VOf!OTRbh_*;{2P?jXq9*D( zrA484HJQkZZvvBopZpw-fU|@-F(Zh9p`ho6OHD&!=Fir_0AL4GrmC^dbj-Cryc6?s z%F7P&Za$>@>tIRng#81pMfi#)Laa^;{RG$*pkJ<^eR5o01*2++ZDueM+|5|uzj<KU zGRpm#v!iHAs>lQP8mk733(y9jddfD5`vvF_n`-TH%NK8+fAexVe7$TEX+$nhB1<^H zBi?!S)WXuF&7#P|h@rCZ0}tCY1~iSmd1&aBLn$<t^wFF?=Obj_uJ#nHBAeb+_b)Xc z|ILs4+SL*!)ZEm?T1k;`Ye0wYfN{Vj&T0-c!6^>@iEb#)z3`_ukz;}1;}FHAKUcYW zS|k+T!?_~zLx|L0TS#TI-iJeCQ^-x_W(Z{14)!d4=gB;I{Tzi1_ieCQ*xq*^3(X-{ zj^34Jsv%+|5k?4?OrrSx&Fsl+??m<pzEnA<PWv3d)K4iPGIAMR@c7>_-{0ncyR0Y8 z%Mx5dJSZn}{D75|uKcMloZY4a0%BzEVSQ&d({<Bl@8*-34ID1(J*vzCPdrn517XZ9 zy%CB9#|D%b%SDw($+c`;-!6xLi8tGMP$B@H2w#>-_g%b22}8&hQwRA42Rz-;L~7UB zh5}M7^=p>R0%3-f2L<9C-lV!Xc)??)$!A|J{Ymg_$}RQwFud!rsV67{QYwf(@VHT1 zzh?4Dq0jusHSX9z2Mk*8Te3mWw|d=xIIEesvi{;t>oB0z$N=wz>GjRYCvB!+RbE$C za*JhcuK-xMFicJ{w9`=?YP0u{W5StuWU7S^Z7L4hS$|j!0StS(KV2MK9j2196*Xx` zY#>wzUbm;p=DGK}c!8?FeCjrzB+49n?`o7Isg(cj9F^<Nr<r{5?B}>!5$8k7s^bO% zoabkicnV6@xVaKuzF6CTtPPm`zAONy1+(uyWhbBRg+B;Is(09$Dw3YnCfv;)`yzuf zp$rk`n8{8>^&x$^W2#ws)Gf6A$l9;E>7gBi5086u|4qLu13R$(@YY0a>Pj#Eq8;-l zz6UK3z{9fMLwy20Zi_x+BA<Pk5nLpY8U^_sdTHpbvaCdkV1D_iuIiO9#(EdECsq4K zjD^zGu2W;(N}Y%Pl_BpM>`1@bywNe5hCUR%L~yu_+;26C7<ik>V$%1oOQh-mRtS&o zO9^?S-G}h0X>U?s?rRl<`kD9$p21O?Ln}Xfn1D7QH}lfMI}R?~Q#k(GSQ6KJ#b7|N zQvWhsrceqwmF!p)<bcc^yn{#YH360a4SQFof-r9$;Amn#kD-q;4kwP3i#3Zq@0zo% z{-o|##^nmhG-(g*I5=aiP+bAT(87QDSSA+K#<@Z5we7H%_a2<wQOVg}Z}%#*F9UB? z-fqA3$|?VWr$M*fk}T0PdyB<UrC3)&eW=k_a5rq4I|j{kD`U2;h$3c1S^k=y5lvD@ z&acX&oEi)q9Og3Qe!Wn|tCHq)=`ICfNqAyC!?Z-QPGt4)$wBq-K-KdrtS?{r581Eh zOSHQcKc_y$+|RMnW?9Ic{Hn#3z2qg6WXsX??7yzQbTy>D_ru!w$uqTl5}i7L+kYOg zT>cxwr>o_04_=YQmL~!=EZZWP&Mh(P4;3`!;3gX5lOhk`cs6fhn0ttF#EDuHh7xaP zA)Lk5el7-J3kNyKC6jjAS^s&w?l-0{5^v4QOR}2|{<HJ|4JbSs%>Ed|Q@GYYNqKq! zZc(aj^6NH4Mg1%(45>>j5@Jfoxq1zP`+SdI{Mf@1ikt~(45=>E)c?QvoKY&Xqb3Tt zpMtJ7u14FVAE$fdyJmipg^T!qakFWd(#|G*Mani_ogF=Mr~$;;HF_d|cy!1QG@R{1 zC2vHb=IZ@itbYWRY;Q?zC<Wa<gZv6Qy@nFM-)zA7(Z%8*XT<rqC)<%Fj<;Ru%C*Q^ znK}nOnOES3{j|o0AGb>Vd@Th1R`gFfUQ_L<i1^d%R{rB!ORjvk+U{p6C85dxYAr#_ z;*-6#VF0u-v|Sx${4ZJ*v`Yav*R2UV4+)HIZbWt^K5_3muKe-eNi}zqwOvRe85wyS zCkZfq_)95oML1&r3KtyJO!MJ<^AsAL2wGp@pO0H$ReiY@ax+`ctu)*{B*ztPf{c0U zsof*&#qpGl)pm2a-8+b~Y9q?=^Yl4W%`SNRaLTGsr|*R!NwIRA!W}-RQ>R{?GI)63 z`WeNI%LbEp*30PX;=6mt$i7GMLI2Yj7cW1H-u8uLquR=|-(f$?O6*^xr<VlDMOFVP z6Kv(UJ$3t=aYssm#XrM$_Y~U7qqs7g9N$|b9{B##c3$aMfQy$}Jh=)07nM2E8>X=N z#LoeQIZtU+d)lGwS8>KiaBjn)$D}Rdl96bpI{r=L$Y*Hm1NY>w4H6jiTG6Rpo(}w- zGQ*FC%3R!MtJtl9NwMd&vv@C8C=^$Yw(@i#tY2(b>#e^>DeaJwX)=Xa{FHOXUt9f9 zaBaI5<mYPW+j4lw^TVk>!fd4w_1zp#TKRRL`?coEo~RS80N7-eODBemmJHCHEj_r- z=M0l`H}NqMnsvC`RQ+2x@=kc7IqFTjNbB~6f!D5nYKmlYy$J0vx&PA=`Y>JnUP|%~ z#jg;Gld{PXu~fJI0H#=QwM!NumWqWGDYfBcP$E9n_HmgHeqIDeFa7*OIp?543Q_ZZ zE~i)eEaN213T=>!Q9yZ{!8{67th&X9zrIwK=lD2@+s~Y>maWYx7%>(0On5(brtirU z?WLN_eVB-ke@*3z4DzgiJ+<&o)~_n#X&d_-!;HpUHu-kt0TxaVxDFfWzailZrIpOY z&>5SIvlx4QmzeL?aSpdBuUqO;(E?O5&2R=kcd-gO_1JxJbqm&sSeFUle1)tw`$Srn zEPx6`<?-H6^#4SvFwT5jcAw(22#Gbvut4Rzw=SiwY^lR4>3M~QAX_{azM$#d7W;Q& zX|zCr^tzLgd%r@wA^r`ft@%G||IkZY3Rt+7vhYa3l;P#_cpNihKT6n~?wOR;L~8O? zc&J+{-gjOvrrwujO^G`kn<|H|lkx(V^N0uMif68EkcNRCi+>BS&Z`qFSC4ll2Bm#B zuYO`$nTQUg{-{jle%{5*NJgJ$799t*u|M#%ur3xoWZL=%d(TeK%n^bzzYt>={N(;; z>UJA5{itHFN)oq|0RiH@<ARKX)*cc|UX|u_YQ4y2h;T8bb06il`-NZR0lrljeTW?g zn<HE-zu%?_aI&)O?VL)hyA=I+dHd3JV=+tfDs!E-@;7M<_E<82DRA}$=K($LuW#hX zuWVT@;<6`$wDetVq9_&P!q9!nM2<w!>w81Rm9)7VZK9^^Whv*lsJm+u=NuCaRK**! zFBJ6TIXXnT;Sx0stHF$ZHE>wU0OVlN_?y~g9+Rqj`Zt0yL(sxfdj+M=PP}6~wvESc zo7i7{JA2w>JOlfbes58RxA`Uo3?)-`stu*d=MaPqVMydVPovARH8n3sqjSU7%^$(1 zxZCSKcKKf=P*zb(HXq%rnb!1M9EE`~?fJ|z1SIw^dPc+h{Vn|`4P{YA)sM}$&S9=B zfso$ZK0@Vwdds!tCg~FW|76ex5^ZPoT+~^UgmY{Cyo9(M?!U1pJ#*oOj3GB`7C#)M zLM|bG@jmUQ*poU5{p5I_;|WnoGM(ClO%HR5eWD8lKimbci&)SMmwnu9Hnd^<uox~b zN@yp-y?>56U%1Q!nG}%FNuY(+vHcW;8MS9sARu25%qn*zXN(eKg@lSbH!Ty-lp>=W zEK6PO^!$|X=Y<_VOgQz*9`O6@g@A{akW)q`^)wBBZVqPRO)WXFBOp@SHuqek&uF-P z+cDe0<|1i$$gzsI8K<fLBdX(^nKVr$K*DseqOQmsmd(ii=k!_EYR--?u#?jS(fpI$ zRl+n9)9%mdI$ee*hFq>w-n&t5t+t`Vlo-?vOgSz(JU{RbJV*dmQx(Vi<jh;%R$dg^ z?Ow|5`y<~jXsp^GpfHk`x(u39NdK-`=Smz^EA~s2fn-`INPQYKcWsBh8Q$7SQu}o3 znBx|&=Af=HjNnV8yl4H8RCle^t)}kG^m5l*%@;+VcItgz#(O$>yOp>(gOi&c%&GL9 zonZ3D>=40$!_3QvU^*i29{roMzu6(X+@%U#4v=3wwr{Rlfo?_7VqRpkn&!4es2+gZ z|INgrQoP>!vP-tN;%t^?)>qY07J*E{fJa%qqwMtSH&TyiDUXzo;~EDz^~H5yNaujF z&v3q?y2ApHZ1M(hHGN&PadZF8fS{OlpssUHe^r)YnbGEtjrWKh;_YY4ZUWWfOEt21 z8;Mrc|G6J>&_{sPCsBaHrY1@d2E9VCNOsYUh&saCH)5XXsor$4PX}yde?Rp2?30Qf zX-su14VH30dE3BN810H<&$=4Ya7ixgJA3lhF2VXHxJh!RNH89x0QU0U?$8O7@u*W{ z-?FXxX5q^LO+a)b<o3i6ebKoM+Urw6Xglp2e~_|uF=>f+4JOu!*>8@o@B3+G_vodM zrKdk_zEFc45<p>UK1;<>C-xFAqaO6tn#LuJ>ef9-qGf_=yA+{S8rkH2yF2@Btzk0O zBl(WCz^K>W26NQg56T`cEb(ZF4=N|iqPV_B1yU%l;K6{l?mV?g^#J#dn%u-qHW)g- zyj3wQrai%Hi27=Rd;U0pYR*7_Cql$?_6`yl=JEPtKLx!p(rvqosp*dV5s!MU2aazB z_!D@bcfG!ay{Z1A3iye-yk5rn<j2b{eM5gSrp)m~zT^I)R=c&0hhv)t09Tbf;6nZL zT-6{~t<aY)8HALUG8y^W(Q8~@oZ!vQG0k9?97x-ox_YCMo#OHBP7L?+<r@bNBom1= z71V$5lQer3u!`L>dH=Lo-_DlSr6CMXV^DNkAIV9%>de(Tsn5LW%V{8_!EzS07Gtad z>{PVX?xJmyCYJ5)nz)12Z(0AmEZ8s{@dJRf>%l`sdfI9q)MnjY$Zm@6F}axgWPkCM zm+Z%tp$~v1>LO|^E@lAmRsvlCopbA5{q&?T5Rx@D>K~8&dqeVD$Mcj7DT%CLaNa!h zBb))J5VH5~X5ZR(^7H9y^c+4{qy!3+@z-;IqjE>)jJ5gCmlDgUr6w&9XqnmbopkPA z-g1+^wv9$R`VKgHNbGm~Qv-U-jqiRA@i&vUipA=1psw@txAH(`49!$iy*?P`T%wo9 zk;={d0;<m+?b+`)d?f^s)uqo~fk>(VvW0~$DZ9(;RO@fytl74<Av@2$)S$6vBycM( z`9k>Vp95d&6(XX0vlbRf0*@mVPtB8U$VOolKJcl@yUyh`j!g85r|RgWV;#X(MxCei zm(k~&kV2J%YBS0!CUa5ezogb@QXZ+6r9-qdLRMMGgb?0IT{unipr}P8EPm9g;MN6r z{6YI$E{2qLX@`vgv5=fc#_Mi)iRxV-9CfUAiHKc-7x%}Yi#~Aeky7kR1+JfC`>}AY z2~r#X-?+nPy$AJGtZ*@o>`01~{@k-8!QE5+rU6R@z*6nP?dNz_bigfP02uOXwO9nW zIi@`-{P+RXz|%V|&cefFynJJ<W8veuTERi(ecR--Kl0dbfA6~4fWB9H-Z36m8PxWt zF^J6(364fNA?#**qKDHX^h$-YRMBVmPeW}R#b%~zTOiG=&+beJi-EJahHvAc8`BFz z4zCPu^&iJ(e!q>zrPWXQADM}yE0|Flyr8Z2@6{rm0H9Vs)h2~}?K(69h(`EV9}A*L zTW-_Gud^DaeY6@Q<r3L*?U<qNx8-O2q8pPvy>B=-uXYlOeEx^~u@VLL7fK1#2Y_2v zbSEH7gFk)vXuM*u6e;x|;LEiP#lL8Z$_dxfYk06IN-~i>#94+v%Dqg!G?z$~UMZ%3 zoRDcL5SaOFJhMyvHp~4Un~inG)l|NlAhij3_Uadiz5nHxOA17SZ@^O{@cC05peBsD z1CVW8rSN3?U0WRa$Hui(85Hv@7bwejaSN06I{IfUTul8Em{a`#9@@9#Sf(7X;ikZz zJn-+U*X(2vuDV3fe;k}cxw2`SoU>AI5ZU5d9hBoo7H_*f3ER+nGJ{$Xz;!)}>0#kf zb+)+y0F}kd;Lk<&AlBc5yp7k=5D4P9-M5gG#)x<;0a_#)u^tV`Ze!nk<4N<eRyLeU z?BO77%^`id@<HtC9=SW3M)&JRom}Q`AJR`p+p+L8L9$83OA)`j-u0SK(e#nW#~hFL zZm7_dSGyb`Yi#c<M;~J!5N}nT)In$#1+&^b^sWQDi0IS)qGi%N#MSZdFM#LWhr8AS zy7?1DFN#u2|2959`b^}3CXJBJn^tNf4OM##>tq1ffm{gMbE(+S9z&g`|9$y50X!Ua zSQ|&lZn9{pZ(uv|b_^LQ=(H_8piFuFsV_r4VEb-d!sI;SS!&jzOX|V|9i1ZMOI@$j ztqt9A8wrhR&CH^FwmF$huMoNs^`Go4^w}ryZ^gwgEb8Z09eng$qB?yOlP)~QM9jES z@<HqSU}17O#SqyS;0u+1543H_eI<We0Ev=a(gHPX1D}$@v|g=GX^G)zk$vztUzs4M z0-_N{A$p@Irv|=Z73O-V-ME?ctwbwE^<hW$-<M%GaspWWU2ga*-98<#x8G$(CIXi{ zPvYW{wZqzL?ySX)SDYQ5TkEc0KpX@DR){8m`q|HRH=C~u^4O=9#pu717gNxWI|r9P ztA4R=$0ue~U91A5?+~N5tU2Hdu3jILgrEL$o;}-n9el8!;3IhE#CzKQ`Wn}9SySne zOr6RH7azXCh+OG+CI{LE{sQ*e7rt-bNi!+Z@`zCUG_LmbR4?a6Ug_gMz8Q)y!7`$# zi9&zSQa{fr&5L~;$CXM1m)D*$1te}7Zv7M|MqDH-oS*Fq7nro4f)88`AcjfQ3wj=a zCB5uNyS5(X%b{|oKto$mlCezgd%PAZ(-#_nhsH7I-ay@yzH0Jdf4z2?&vilMb)9ju z?2jF6dS?@pAg6lEHd43@aRZQc!MUKPgk{M#dE2qV{ZuZlh)g^*9q0jB6GP&60L9FP zId8x{r=WofiyK*RQAUTlVS4{pGWI@DBMoQx!;#Z@P4}*ckWGqbmLOivqO6c}H^mG7 zvYs8T0KRzd#dO&-fs}DeKFzjrJ7_;%0KDMp9W7I6#shWDm1#XzaZou4c~@O09gy&9 zd0VEA5dO9HepXYTecDF<(k&K%yd}|3k|xPzvWnV`(AcUFeU~CvHQSBRxtb(55hW^N z#BBX-U8}&^oo6w+kq127tI!O2ow_aD_Q!m<ysNckY)46SZDJ0Ykjq#KmGe7%K&(Jl zh+oaJWAG1N?#lofPe!T-?nVKQAq0xm3F$3palPl=;iKvuaoWy%<YL-8lhm?bLhtYz zKUzNAi#@D^tOZ}p3jg#oOg!~dd-Kxj79?NiV0YavEQb^lb!u_nlg~gcUHZ1#3%qq( zA3V1=KbDFFpD2M(%v0d6WHbK*$(z||krZIk_x8PicwU}q7v3p9z38+=s_}9DC6M|E zk~t+JGB9-ku5TBspeJ;#Z8^Ry9{W<xs^C$q8P&WIqaIyww??1K!?-WsY;N^ghIdL1 zQLR3K=eCEQsvc9!Ta+YfEG%BBGi05GjBa#Kuewtte)ZkWP#MC9XWF=PpW|E}dS=D* zX4fMJ5$o>GY37Q=t+!L7M0Tj0(yV9UumzMQiXTClV5Z#m)fdCwK$)UeXM>=r)ZR_2 zyWz~*{hwAcWi=P{1RDH5TFh%R9jG$$n*1mAA-h@Buomd@dh|iC<dwn4w<QVQv1;O9 zONwkS3{(D+Hbwn%uW2Gr;UwsDkdP?u#@P15?TCRXeF$=ObxXU^Sd@5x2CX!Z(D=YU zExm8s!u)iWWR=sspx5aZvsS*}mhPvutheKfaqelQQ`go%^UbGV-8JnCWC4>GnC+rM zpDZLhJ7|HJfLyq)bJCoFTHz%ovu9EUGiP=Uu(lJt-93zQAvI;)#`nCn%mJKv3MDdI z>kTue3g6$`Q=OCysJ)YSO*I<cVK;m4Q=4MQV*Ol#`jL|DfWVXNtlWC0;DcT{KPReY z>2gy!^iSw8!b8Pcoy%7B9k>Ibm%m5YKhH&Rxv3R#28UW_p8f^Ij@7JpnK%?K3)%9n zeCGK-7#bmpdc8PB|C}MmUYYqc0^Z@t5F@km3*5f@Mc*|H-#4TKCVf=eHM?6Vu{}AO z=JkDfSgb!ByP<+dNGV-{MSZQsJZ<V|1%$5-Q`$G5F*88*%IBwZPpz72LQb9mqVt$^ z@wHbn_hzo-w;B~!aYyi$5<Py{8Rpx8uNDj9C2G6`{lB`8c9+%c1oi7$_Y?Bgxpayy zK|->e*io(Rb^E)cTV3I(9>uaf{~q0vwhkAQLWz-#hw|isoII_8T$*~E+xrMIz<uk6 zaWAA})9-fB9Z9vSqSx{I(n;cvMAcmQ({TH?CV>&tm+q0PlpvpXi!qe<nmD7jSzHGn zDmVH}#rhTp0vF3n$0}l%1j6SZsu=c~G_^;3SOo`DR&}5T&zC||-l~x8$-Ai^R^02u z!q&cm&0tN0D{~l<20S`b{oC)mTp#tAOv&liB=d&z!%+@fPW6!1B{(}2dbSRvJdq*6 z0~nuCLQ7)!_=KQ=o9k(4YJn$GdD9T^JCl`*I%$+gBv|!#hWAVf1D@v&x8X6>#^!iH ztM7Gpj_%x9EbdKNx&&@(sibmQVVI+EQ}p5;yUNmah)lC%3(bRKLasT2{94ldGx*Tr zlz`HD2GOTxky)egv^b@zh~N)>xWx*{tP&BG->7?m@y8pU1S<NvZagy9I*G8J{D=ON zO?_LGgQ+v%>6hA8pmg>af6388<eOv!derZSNVn|$m{g|S!OwYa1wOCK!>p+EoGI+l zw~Xv}n~#jn0&$?Gtu+V(s-pfChcr?K@EQO$xMh2`QrUsQ4%jR8UM81M5KWk=4V&Jl z%@^(4lbZg1XzW4^GHGG6>4u)q-(5m+|JilU8H0!aB7J#L@)GTCEgy2V2K&`|{23ZK zkqS-WS})*YjX<cA^39NgDz2@T&D+wE+JAEe2H4wP6U2cl`hpf-tlXS8T8HA3;^C{F zWe{+GQ*~0yImb}jdit(lKr8s*TK_6I@xezP>4l&lhXJ4?QWCswifR4vqBFo;H1!6~ zyo2;xsP&0R!J94MV0_!i(l#1WO;x>TQin5>^F6Y+G;?Kwz0*olOpRfLnKv`7_BtN! zZM~b@cRalGd@kfI=G7h^)W^C^cg{3em-<B<to3+>&+<PnQ5oi~>OugA6vH9egfBy% z&i_4FN3Ba8I9Dy^5YLfpQ_3j&r%{o#$ew}wNt3$^1g0khh#;q8yM)>D=Z;cu)REfX zp}Uo+fUS*&f&B*qjBW!&4>LD|alhG;{HN#Ix8;vb&|xtFh_pxkf#l-zyi_h5c;wmJ zvZDpieKTk}m;D_1%krwKsML#^uL*3&@QA2_&<>aj@aFB>mLiRd)(r{A!+h&ALM4yd zoB$D#tu6=mER4G33i5x$n2$=U1z4nn)SBi>vCfy-1SU8SobC4C>w0hJewi%zZb03C z#Z*cD?+yU7bz@l&>50<MFehj1*uM%6T1p@GV8Nor`pWtz0n9liY83q>q0Dsd=Wp-6 zFFUigAr*Hejk<VI&ZPdDEyb`>a7G#P)LTyjopKaWpHFFm^hELSMgHm>wvkJJ_rVUV ztq1PT5?flhb)UG^LObFQU@Oo6dA-uX7U6S2K=1BWfgoQWpQ8HM-%~Mtmn$+^8=nuX zB1F6BNmZIW5y{szq~e}57B)4W(jXT_KqeqcrJ0|DW?y~R0U$`v`o%C2I_)tpn2VN) zV?QaxO12RYzA4`0r_H4!O&^Jjy)BQc)iUl*6j!9MlZSXjD|CfeeystU8*dNV&9{tW zc=sYYl4{u4nf?U3vyD^ix#lS~VKtjd!IkB)s@1gfh0Hvae4zr^rh#?|R0@$hzP!GF z9mg|-+5*!uT!x!yLc*6^=;1>{Ndmv56+bBK$@2cQd2H(VwH=fi3iht!&uNUew3D}^ z+2JuUr!qGm+&JsNDJ0!ef5a!|f!q;X8d+C`HmsZ4J|o>_imW615CKHPtuGOP<A`>v zJCW$?_lOl;Q92iVzk}Nm!0x%g4SGvN3|AZ%04BYaw2~$M;VY~0<u3nDEZMDBOY;qT zTD?@$$TKVH8zaFHi_*MLn!`1?conD8mH)~D*6z}2FAEQ!m!B=kBU4q@`~33Y?4qGE zy*?}ppM!ePD)_AyWdA1_Cfl{<i`(lwS$CiB;5^3Pp{uoXto6%*fA4tFUm>~&j95#i zqS~=-(88};dC5N0lVK0_5^^WaSK+E+73ktGY*mrTQ@+&(m#jhr)@+!$Gu}ey<zh7A zXPQ`miC-?WL433?>7(%wHL+B%(uuIutPtE*i$2Ay@!euMSS32Y9`!Fu6wprLF4Vf| z6}27qs4i(G@<sN-fzr$K0=Gm9L3KFy&*IJ6sJ5JvSkSP}loBnwFrr&5Y&<K)Xc`pW z#Wa9vU7adinvlnmHXYSQzg!eTG~1J|Vl8NC@%e|jc0!;PcG9$(r8Wm^Q$Ps|zkKS! zp=?U^U=EsYIOpjVJ@$O=(oD$x42%iUy}u=$=V*fk&^E9tk^u>UQ=cd>4JFY=fJ|9H zdC8;gQeBh8)!d4Lf$Hp${fDDbA64<ZPYC0;i;NN4Yrv;&0ZIi|KaEuLF1D@fQcpX7 z(tDR+*796>?0J7mt#6hwYfds+A9|8NJ4n}N>ol>~y|aWz-sp6-Xc6k2`f!fHH=r2U z_gRgrjeh*`YXWt`G%N1F?xN6lC+L2$B$&qh*n6=3bsu?4OF%nl)`jB4J*80GQ+vNM zWEJw=c;YtlH}Qw<)gXZ<Z|g~&r?a>eNh9On{=<Ti>i@O31$7}Xl+p9vtRuVM{h~lO z@&NDWc!|gS3~_{~-(A$2%>OETeWDnXj7J;csp$7NL=;ei6q*xV)*s}$A3G+QHq`y% zoBM+kV@IVjV7a$4C*VkV$m;{4tvx(qWBor&nG^4s>(2eJoj9H$(P-br$?G1(5B}QU z5<-<p^8(brM51!Qlz_R_*Qe_fp2(xniM9PGntr9F^0mfSk8jyLtSQFRVjz$lpa=5m zc}uPOvO?JlW7W+oV;Ex1-%o}D+Hb$6e9H<#^-00u0tk@lkg?cl=cCPSW;^M7f$a2Y zANc(`d<^5zs&*#&6&r8+leVSu(iaANNdkGi(&d)++)a*0d~l}e{4m!-)m^(Q#+FBs zLjPWa7Jj~mNGI=cm>F!#VCOEtnaky;Wetb0_R-HPbJH4wu<nWkk~;iNZ`%@@^oTsb zVa62KY2Hf=&h(_E9XvueXaleWQ03uAu1j5MS&!t$$^~c8Y7mQ}gU4>v&{Ezh+Flw= zo{CjxIQ&6@m_S#${U0o787oPz>qY^lP^eC9;W7e2n8F_&;*ao%eGF_02(5yh+!0em zF<NMJ3<-}K*keFW4i54E8|a5q|2N?GU@-c@6my8C9~^ozQ?LjuQ#ghK!cOQ@)FmwQ zjXIr5o?_6i!PmEhX%R1nnzCL@sdL#ee}V&1?L}8CWbCAfDc)W-!@+RLCwmAP#+(SS zK*bD5;l^Uy<2Mth6%qmxzyJFE<4xDW{4Jl*p%@_L7M#n$5Gm?e!L~coJd{WK3F#!= zf@!a<O3)+n%orV8@yLc72WhYkmeMx8JQ~VJaIBd=Q5wC0Kq?w*blCr~o6oeKdlb0d zpjvwKjeXMKp{!Q5c8{XB*nO$^bJ6UFQcr|~D;I;l2%>O>%Tt1&T`IGp0PLSj^Xl`u zzPPi`PFG`Uhup<9_sNE{7H$%=+2jsZtmyL|v0O2u#BDY1%@+~GW?<`A=7Wb+v?*1l zjZX~}Er;`ch=^C)lk?B4FJwWj^dB3~dCmj6yit{S#w@5zHF&7dmm2O}I|R#u@GCRq zHn50)7;XmrJwt(rz*wMZ`#<Sa-;=H2ldY*EG-|65HTl0AMQfoGF(iG22lV)O>kx&4 z9^<!~m;>W~0|3T2CLf{zm~*I;1+k@M1_s2i3Vk&XVtf()*@~#xqid`(ka$=g;h-bn zWx6dbfNc0>VZ7v84UqDIvBgNqdQS+)F%Ho>3>5Gh9R{NvogeYNFhc#oFE}C85q!Ne z=+9cr_XtAEivryEFI0OJ0z1dm{LO0~wK~3Iq$RN^?2<MuDkepnR&@_D1Aws0t9O|R zA=CpsyT!*|g_}r8uK0qc?02HC+;CF_T+Eg1WR-<(8`LjNGfkIB-A8wnU&flI92Idt zt5~+%P5gE)W-ISrYm96`tKwU5D}Vf<o^n`&-l-_Q#=SGxh1SW~jh2_4Grq~RQ(`x1 zu9QbRT!t;AfmXDlYFm{^^U9-7;kNRLg1Q!5*A}~8Q~9P=$i8iOyDkK{Gx*7c5|vuD zsKNe!J*=Q;53%d-Lqj~LY?->`dXyyH>3^#SD|u4)kc!_!yrh$-?9utjf>b<q9}W|s z;SXVLv%pqO@*D^S-E+#pGB&GnnM>h#tNKdN=pe;jbf6f8)L^UUA4iaY<Tuvuok*q| z9@q(aM%FUMbw#l}9SZAZFvX)&8I0&o*bSk9kI!_=xiXG=GVktw9biZ@8(#`qpF=v# z!%ne;!Pe%&V#~C%xkSkZX*&q=k8tw&M{~)Jmzkl$YctV*Q(W!=P-NRj1G;NkoC(NX z$<pX#Yr6kz3#Ws+M1M|LO@O=4nd-WPn4{8AuQfSfjI3GP%GlzM)WqUu3y7$;r>-^9 zy(y5dzu;-_v-ubIr)bol430KUK4|XVbJWb9?A(c?*m_C;N`cU^EsD-NT>9vPSsnfF zFj_QEmfh&B0ACtL6UiCs=}*2#3><J%t{>LLMK|k9_T+bs@OTN9)XU3Jb&i!!It07? z#Y^idsn?7qBW3Cis6QL>3&GGTDps=a(IBcyXUs4stoI+Eo*hokYq)n1HNc$qScY=R zAQpr=IiVh7Urvt?2sn<^A0HMn=oqb^l&q9w`k6sIY=|<cMM*s7F~9cj^(wYkdzICS z#-K+O0v&~(NH^2=vXD<7(rGsSRBV*J8#Ts>05hd>O)%P5zuwc=j*mLUJ0Pn1F0$s< zd%FKk$pahataY0)b6Qdt^Gd<zuL(8zEHeFeKyDRz#K2)@XOM=U0vLKCPJ{lQDqIsc zgZg+3vy{rIC;O>h)m61@tE9?iV8~w~<7%-QSCdfmeksnOdLGHmq53yv8thNAj2$y= zt%{Rma+ZfAM0L&HqYv&KI|6oO=K{b^uW$kbW=E2$&?1}ZW1sHkT#P2oHNv1-E;9O1 z!rA^sdvyhAx;rtnG~88>{ULc>YwyX6Obvf+hyQ*RcGzC^{w58Ljs?|qZRN7uO5(FJ z;(@9oYkw#0MPei0#do@^x&4hf50kJbef#`wzd}Uy;}vf|^jK>K)sUeul1*Ld9mL;a zy2bUXndW8!=}vTt=bt>Lf)=1g7S{CcwKfqer4DVGeS0SG-2v)J5BK{<dp7)){)*mF zSPCP=i-w7d3SB~V?NBu#sdiMLB9+dWiq6Hs%4Irfd%?~rZwtt%(?IB`0F_HUNZ7c9 z`&y17>(>A(A&Cpl1mRJ#fvAt>-SL{oo!r_r>zSut&3hASC=g#JnbtW`q_rDv!Y&G< z(6&#E`u;dP<pd@TMxS9YIecZ0*`9(6iyg-#)rw#DSx%aps2&&|jOLt&5tH3YU;OiE zR||Fq>FdVc;wy-ri9oDnFy40~>Rr6D4A{NJ|8aH<uQo}22b&EiYGYYH_TAiweJDF< zgX|R;u+r}!O}Dm#s<U|a2+Pbp5+AoGaz*Y(HFbj5SOLDkZZqPdzxF!oOb<R0gNQ2= z9aP7%XT*Bu@qap;MCQg?4qR+AO*KYQ)FX3_?c0_F$LwYSx>{w=hZ)~t$-CR&_7FO2 z8bb$@o%wI?|DOPmSX35;`SR!@3>K%sh&u3K?)=f!Fxut>b4lzm6ks&+{xQl3hI}bP zmf?aPlbO3d^yDC1_#Az;($7I;jQtY|YS6PvLY>UCITNIcDL^^K6lFIl3-p((t8lN} ziRw#WGBRK~ON^ih>UsiWU^x)y04)mk-?+dy2Jz7M0*GSTk7Ok~i`GJG1TL%j-8FpA zGQhq{Xh_SJV7m8>?110z1$Yz0LB!Nye?5+6b-RaJb-`R+%jlvB7U<wyttA)u&bM-a z*gzAL6;YFP`!Kf&lxC;$eH)}R^RFaQ$+G)xomo1no6P=R`zL8aSXJYryZ})5<cl=V zG@;pXY-KXAYfH6YWxl7}qvTqL^+1YFniK>D+zGpI&jo8B_H+V*0`K{(JPgx>#>Wq) z)?GSH=_1@v*%-TO9Tii%9yew5x>nOCeUEB$9Jb-S+obT<q^(mon#zqD2KPZ_p+9eU z(o|NDd&b06t(m!xBw0{2&zPrIp{BJRjwi?%^rFs>+JJ+hNP<F?vWDk+Zn!;i_J%Bt z%t!y<jfn*Ur+^G62Hnr1v`#j-G>3kBD;t(&JN7sLhd==7)T0x`!9Qfz$!U>Xi!mBU z(<1PD;@IvHh623Ayu@*giqr2IEEFs~&QYCwhPK?=MnJJJj@{^os7uVik{&*Gl4kgt z(pQ+Y;vRM!UJYGb`rq;1l_?kYCha71;9PlxD7hTcr%1A04@VcSn|AhbxBA>OdOC7m zdo`-5i_n^wzPRo-$}O~6{8_@Yvn;Y(o06TA<#V%ZthOu?5=ZkjLA9l=W&bGkp2E16 zh$tD@-Gs%Ge7#py=F?IqW;`FXK;q6w4t(<f)O5ew=k5BucF4|e9G0_pnSQX8mPu1s zQ0@XMXk>_#)SG|WW@mrxp4qdUh*1<pc{!U{Z(nZ>rS_feg$-blg(~YMPhV2^-<M@x z3KjTwMxqtt<t~}D@$53Z;A&4x8Yl~t6l~@kPwgVH?_K{-YEcCBgD1d1J~UP@M^fZE zJ3Y-+QbTpojxlSPPnS>a|E#bVTvb?807AL$u%N1PsfV&BEjZW|&3A~A58h@*QfYL0 zlBZp1e71u+8PANK3bzVRvNtZNoe+IbRtp<!lwh#rw+E<1YbDP@99;PdZT}bug55KE zbLVpQdfXOlnx8e37mFiqXi~2%<Pu@1J_fX-g0zBKhOJu92Eeq`(+6PPqwW9A?1E8t z`oQQATzl@R&WGWUpUYi|5Sm6|Z`ygCJ1iSgp#x>V)7E<?Dk%ThK+yn?@oRT!7qpj; zhb?j9<tH<}hrg-Eh-+H%Rh|+Y*$9mj&CNW;490<KXa)ls_de><4KlUoig|<ng#+&G z|3>C&p8s5aCZ%+!I-OII$vw96TGzyjO+sC~&CA)$m85(*$3X$yj9xt}{b^NuW#H|h zEu%6^yWyG~Xc2EW0DLM(7}MTyR1(Tlz8sC_I@#5vd^UZAr`_g$5jxnIJz?}G`@WHL z9*twa;;sj?JSn7#_sj;J+)wwZrWQ(`+=1t`{lUt2hYSzBMM0~objZxF0Y;U_L>Y9h z5N0*+W~B>r;<NO6eXEUO>k@;&87BdERyG9pK%@mAMO1rvxdle0H7he7aj^AN2>;Bu zojoB$!-mu`b`;A+KiH|qtix6}zIbyGgONv0(?aW#^f&6^^P9i3TL6(eDwMB|5}Mli zx+WA0ac_1kAIP8bK{-G434l}9-`Dh2$zj5^O@DcgwZt&u6(*K1+PAM-NQ#R(HZ7cp zk-}M}TR0P3ixyF?8w~^AxmN-fr~O9IuI~pKhNj0xH(#T_1u!2`s&ea^Q@ydyBi6yw z;|_9u+d5LQ7>K%vxO}UPTXMSsJX70!NrW9<d#5>v;7&LxV}n1!goAJY38IQG4gpZP zfgJH@>be%{c@@^F_6k13cd=60^*c(`6WlGv0EO=Tn!k-v-NDh!_Hzte(=#6a$(-a$ zb#c=*tkpR@t}3_g&qUld_2>#?@ydpnp93D?8^dxUy75=Uj<loHL<wpp$+X4Qd7*d1 zr2Qf!tBQxKQ6JfR!RnQ+U#jX5TxL$Pu%%7LcB>vP2^e8och9sa^ZXggdX=LiyC)@w zf>JNA|5Rzo6?enso$)xpVUPbE0(Png3$X;?Esc*#Iv#!XqPf@IvnQ!talgVx-N+_< z2FLhYd#sAiZy*|w4q&hEB&`r6xnxREVrNsFgXjR!v_kO!dQjxmmcZ8x%iv+*eojl4 z)S-(nrlaoSEcBKt)j5@02kpMs4>6;16AeKKVClY&-#FXcxUQ=y8}48hf`fl)1Lv=M z3n9^6f76GiWVifCL(gidlEA%6yHbt*ZJp@Q2Q6RMOlEYy8GrKbeCQ%HI9%fSA=jh) zd6DwA29{SWs`Y}d>+AQ)MB>aBg0v2zb?O@N(cd3uGi=s|-fBdegciQItojC0CEIt~ zDMxcGTLB{x4O&kZQi-q9B}<B0kt?`r#FFFo&yWE+&|QLf_0?xm)aL%HSJ%={nE9P| zzB+1v`wo|q8P;tE9|RlE{s<B5A?t&d?fr~p0&Ln|q@G>QRw9J&*KF`%8z1l5y6?+X zfHw~Kb4v8q<hfAV9dH@Wtxtd44=RyAnocr9azH8`v<D`t4difo82K>z$Whg!&9TKe z$9r~Su<#Fqy;iTDg+2C}Pl_1YbP_`j`csZ(2$Eot=YHZ~cd<ks=0#`dGeWRzjQ9fb zaW;c&rC6|p@@Tt!s_Ke@{gcRorHX~1_SK}r!5gDD{~TCXCxHdVsHVi=FQl0SxMZ>W zqv*>$LT7Wn3~0E4aAItVa_L#rUmlG;Y>hI9`eO<#(DxW-F+<#5muD8LaK{5>5ubez zYpm^5TC&!Vos)SWEN1OQ`rv(K#ck@E^VbuNoX%1MgW|J8Qd-f5LOq6~JO8{(n<z3e z&NgZfR45++-DBpKCOscpN+<L;%42w)hTJwq@XNx{nel3i63%hm37-=ET+ja@N75kO ztH03gj%BG*i9KswS1`T5;~`PANbuvXy!N8g@5u83+hL`}LRL3StU`=A81h%ZQN5Q; z-Lbl_r?JhBD!?|ds=LNq195w0guuJhx;TE_(??p#UfpK>$+-i#yY?kcO2I<VF8C~i z3FWDG45rk=;%IyEls!A@o;YKGik+e=O0!G^>%_>UW#ih<m{$z{i_q|TQ7tpA>YW0f zXie<XWGTomm;wv6mk#PY_L)igxtm438LsgdKSm3Cht9IFVPEww&mW)jBeqBvO;@zy zc1k0-HYO)kOGpfXNL8NJM@CRC#-|*}_ZfW75Ln@bEDu<<r)XIV^}+0DI~LbB7Y+S0 z5J|WQuNq^v+Z9gH^}65$WC3@TywQC9h-NiOdYFyoN32xTCqsVN9}>?lm*(S?b381M zzvT7224&v>Zaw7h!RXT<DO^$%1K!TF7~$;KmJ|ElMvpG263>8DGc>J2FAclh&2=jm zzBGGnOf*$<ulLe(x@)iTg4+*R^=Z}PTW@kYVKVpj_C!b?{*t<Tm={M_1OsHF>fXPR zwcu~Jv?>Ryi-5K`Q8ARfl>mOlf=$ogjPWgCQUE46h4F^A2Sda7cG7Y$%h>AAdIWBk zCF^ggEC;<;OnW>a()Dx{X)dm+X~&Noj)V@VB0KBsLn?b*e2n;>KvsUmEeO`ADc!E3 zKys)0P|<)Os4YZ$rR<*{$=y(a(2QKD%c(1LQ68%g@2lUER|xRvLuD|wzPrUeAL`t7 zB?Sn&bC*kgIae3A4*os0yc24;#T&T#XZC6GZ(ELUV?vs0&p1s)K=0*<nfOIcYDi3g zghhMZhL^_nP{eJ2yY0J;)b0pBsXxfSwzjme91K6g=CMx?uOHff?1@7I<SnL*BGb29 z=<@yBX~g;hJH&U7b=fi<X0fiOu1k%OmqyTzUj&%$TJ`3VOuE;1`cQyQZkG3_s$YAE zVRnrK1GCt#z=PgatCm=r>C1!uMn?TbuLLNP7<boTOSc7RI|(Qm`k{>|^iHH8<Bh<< zIUS{8#uZvX76XeIVr=N3zTL8=`-cD5Za>3cah)Z7aPALhR9F`6(i_YrFNiIqF+w%I zRG~Y^*XSnvi@o>x#QNU`P=4*(g28cJfGsbV0#H1cy+ij})?kE;|Kd{CJYFoit&PrY z;Eb=S`DI-l|2Xd=?ZzFCw7fd@3;9>yXD+XlHXa>O{;3|R!Gn|mXS{i{yP1!wSHoIl z!C^H3-C+0sl0dyf9kx9-ny+1~cEo`Lk8S_%utEVVGB4c$E6Q;HL5x&Hh`O5CsrC$D zjU5xW4>;e*o?$t6rwgwD4@(hT5*|mSNH%0cM9F$f0YCHyf5^|SHOcIcx%)&VLmxlA zbmy@i6SiLGsB{f}1~ze-$3U=L*<=GZrr;&5fOtOmS##ClEa5PE(R~Os>v1YkiZMU% zL1V}7h&=bj>n+PDBteX6a~IB##B#c<#d5p}Uv8%dM0i-8#@>i+hkh(Mdm{=uT&%c% z2lO<j-gQw#?2N0`W8_G2)3br^C8DUuqS|TQlu~(aQ+Yv1s``7-;+iTxkN3%=0#Vla zN7G3hNB2nb!wPj*q#~i2hJM6>doA_5OD_hSFu#Fv^ih7*kLO)1mBs+`yn8&~GVK*S zNDVJjW=r%2?oAup$cz7(#=pS<Squctm7@N020Q-LUUqe~dYOi{zUp9Pjr?%H7QQ}_ zslm@%O}<*J^6v4+EXvDwWkbyU=w|$ZcLLXZ{rT%ljO!Ru!pA6aeyL|<w1KlvR`>iT zRit1+#mS8xtMDHQ?A$q;B5jMD25>~;I*U_*ch+yphbEoHsX7&_jWdf~9u8+;Iz-?4 zgerMdDx{j?W6ZPjQ7#aC_+i(o4MXK$Nlwa<*-<aW{&FM5AHfz#Jejr1Et&aVr5k%y zeYvPZsu?r3-W@B%j(jzK!N1rrO#cAEGFFp)2Dr3C;?ChP2n+s>%}Wj{$&7XP3{48q zjoyS|v~^>Li6~uqSS-V4q6vFY-u54~$zFt=>(9pnHqz67=b??%WOdrjR>)_9oJqE; z-)#^oYi%Pcho-$mRz^u}FMn(Np}DE=c%_}XV*&`HM08s%4(9VJrg_UPVt%gE9&86B zvT(k8Ejg?4CbDbFX{O+2&DJH)mYTJj_P-143*^)Sz(<x^4mnlaGGYPlMc}{^VcoW~ zg9)1RCYB>N!e$?~v6F^+A72L_Bs2-#eqOK*T($pfYKy#lS;RSH@vlqXX+?oE_0Iwt zr#867h6#~YX;0V*LYSCa62Bmqca7ANGbI4Q08xV6V$;Q=dtK9)HR=Y0;vLx?O4sXX z$FcCJ-_^bJJGuP_kA`SRu_V}`a8Gtj>kJl3Z<}ghbFaMce8@Spv%zF-Y`)wen8iL= zHhAGKLEvU<6b*YC=0>Bh?F=Bup*YA9c4&!l2E_tPMTrp)Ibi{2lye1SIT%wPOl|FC z?3HG{99^4D2&f)Rn=Wd5<t85Rjqe=t$jxKy#IfL^9&aFQBU^u2eaTmk!1mrJZ_J_b zZb`Ye&sC9kudd5je!Tl`H!Nc7SKsR2hF{f`L24yf;T5l#*j#?0q;=_|wTVcppNo^O zdz~du)ayTbA9`=z(BR9yCg)9Jf6-Se+7*rJ;HiBjzO31ZyLyojE82@6cMuu~&A82j z56oFPt1QnXNL<|OtZCKtH*tkzLViRb>HL@`xuUNTSr|J?NH<;q7#a~>OqHGFl)(8Y zEiOLm=8lng-lw#hyuR~5Ko!4Q9+l5HZ6+QO(puisEXechW7$jOuZ~y8${7Vs_2x^r zT)*iQZklji%AR3ZU|CoPGn{5L8x<TOa=_y!R!^Wb($41FM#Y}ez1AokU{5d-t8R?o z48ULysa*N!7b_Pyhk-9o_C5haq7s>VH6x6|Sh&GJ&7qbp{)j8y7%z*kn#sp8p01&u zK%PF3a<h_{Q8_Fj+7ssN+d>3cxa?cC$4yB@?m|TXQ1-EM`!B~%7k=;1gb^*nk~y!O zdjsF^u53`5lv-*f(;JD`L)8)a_%m^!I9s_0hx>mNU3FYj?;Dj6L`tMVK#-8`P{vRJ zl|}&pX(Xh-NNq4mq`@H_vWb+ml+-Bc7*je2j1FO;u*rnqexLjK?C-nx-uu4KbIy6r z$-Z!W^ZN7?;;2n*^R_xPJ7>qf?^8{sUfG-wK{sJ&n4Tmz>s`#?`>}Dze(_EuH4MsF z>!pgiK1V%!4W#%KH!Jl6n6@Q6Ke;|w<vXNv<GnR#;5R+}Q74vsbB|dzWd-3QOQ&>S zZ4S!-WFq?DR_U@V+xX}q0A#D&(Z=|Ck;*^<J6X=#nv|Nba}`JSl+IUV<C2}FW`Df< z^TD*=?2+<9UiOnr<MZUBkXLf%i*91m9}Qm!X6HXb;8u;Y3at)|gWDh41gujwHg=WS zs>;k|We0Ky!6A8S?vb)WbCmM>q1C?=HO!^m#-$aj&l{x+G$lVx;~sLl^^V|GdS1ax z<utDCMa1|T3jh7<qR?M2B@xchn8}kkKHZy-CqEs1!W*-5X<*4LsB!&N_;ghToVMq` zhiZf+uJGR~Jzt-?jLNgF4A@AN*&Z?|Km8;#yS<xA4vB}hRJ!%O(^9)L*Zn6kDu{GX z+y5)qxyiWy86w~8n-b@SQjDTG-o4RVpl^m;Xqyx<>NgoI8^Z7M86d}X!T6X_R_<<R z{qpWEZBuzBrmL?>d~wdVfQdi4b#Ua^0*T@#N!mazc<OT%#=oU%Y!MRSApT+DwQpC2 zg=B$JK-lJBFejm&q_C6O_sRu^*?6{8FtedkCEH5_w1M0oHh(vPR$*6sxx=e)*?M(b z%Uj98H!BI1lbs;Uc>bci(p53*2cjd}6OO!)T^8H)Pt>;d#1rbDWV&C3Os`>nWbsF> zk~dE!C3fa4t}6dqylUL37{yBJ>Ah@6X<e9hMfPgOUIq^H3$35|+xO%UCU-8WFI(|Z z^0+!&lpkT74CfCoqJaS~ImwYfk&YtgLcXll$)X|rHUQf<7KI+u@o)OJ7O$x7j@wyw zOf(&J{-$H)?faE|MZ4mA{}=8g8mUDe<3NjOH$2cuzjQ|^wc@TrH~YEe#m{YF4r@Hn zJ%?ng#`D8IdBj`C=*Kn0lSxrl0t@6*W%GEn5aEi=G+n_+bS1B{sahw84YeSjTCzVw zIO0)X%C!Z}@4pflxVRs*V4}JE6wI0wLaxkWatCc0Kqpw&dmp!#Io+xCfrbvhixi&h zO0mWpm?`V}^nW&rySJ{F%+$=(v{>eZqr_58=*aj(6ZG%)O}9-){sWjUT}`OdnN^v{ zNUD`wNUA)l@+8}p$a@p(*Q|JF%JY{k!Y)It+|`4Yr;aLvQCKl!%W2|s_rH~55^uaO zjyFxtwB+-o%*woZCYSyliME@G#CKAh7<xWl#$GSMM{!<OM9L#uH`jtmpRepaStr*q zIBZ@PAT*J&M-MLQF`-AImsU8UWojs)wXkPrq{(m706wlS1SZyxR#@teHwWd2HU*Vs ztd|%mLo*e@45ch^?IHPOM;7pm3U5=8VnY0}-^ABGegDaM$tvb!hs`@!pI=}&oZk_l zc>PkAWF@99f<741Fd7O}X1y$vM8^3lJN@Jc&SD587;q`r`J4!Nzf9e20A+DAu~#IJ zr5=OYhQA)XwvUC<3F&gw<F9-ziw}+*5bUwvX@B4hEx!X4!fpV1SeHI-WFiwRh(9(e zL~|a^cZ%4WVv`7-%sX&-R+IoixM;iI5b?A-|E9qgRqO|`m5VM@g}Am3DVt;}cKA6b zxA&6#6_sq`K%=_ThW73Ko$^;-=>6cxI_Z4;@$gE;@6Ogq4mb9w(~<njkpeCClkj;( zS$+RS{@0P@$arH>Z-cK6_R(hb9Bx>90mjHS6W3P|Wy5Gf9d6+D#fh*fdej#<dXm$h zSf4tYxxO$+rA4tHl4cm{JR^qZURD!V)jvNe?5?zWsVfNEGhE^l43XH3X4n3H72awB zQNSz7v6_cw>neaowr2VC3dFP`8;Cj5neT}*MC3Z*+t=Br8dtk;R6agET79oN<)E9> zfIyp|B?pJ?OxMvn`?-*W2&2}H)TBpaB+(GVJZ$Z0*1!l&5>LW)_l=kyVjl)?T_rDT zHO0C}{tjBU`#>=uzUm}Hf6a;nnIKf=w7ii1i$akkD{rQ*)O`Y>bw9J4(*Zgdtw=j! z){yi&hDaCBW5a|B4>kPD+f{zOnaj@DuM~;!+*4qwH^NkgEe`}=_*^CjALrcC$#@28 z3rkXAR=e6+MpE?s<O%*uM9do-334f~RvZjJ2txZ?Du;7pBMf>h2eMqIIlM`pB<Ar} zM+E_pe>o|<BIcL-0y)~0kOu#kN><;!ngmh25>GzUN5gkE7?Uo=(eUk*pzzq?d2v#s z+F|g;GS&Khgyv4qSAx#z?%RRNmb^dF>bKs{8WD?Zu&Zv7K&13Nkvm>>_;EH?dyNc7 ze8+lLaMA3|5*^6wm96QI8+u{PyMvh%QudGC_uLBC((-Ln^7TW7B=4Ram#{bV1crzP z+?9hK7?``?clWDRb{N=3vI<p)3V4ckzLYVnzLmW^u3TDi4O)zKM4pc|DdZK*xU>m) z*3OgMKfB^Q*=MB}Af?1+{QCsXCHbwa^wCYbsY1w858^L-L3>&w=h3Rs{;fiAVD|3& z5nFP|$oasN>Y1t-7DwQDDXga|6WGHH8qUPo$-pI_4ap*laUTY^e?0`3`h-ww2`w_d zt+m#Of(7|GL;tN>@p8B|B_PwwNzBGbG7(Qw9}p7KA11%s?iAgZU90m8xIW%$`;?tr z2I|txl|Ks^xad;8LOKCnMig9jw<?GCyeCKgJtg}0bplWL)*PbS&}xtVt6g8>?jBXQ z#{M1RC!4}A0|-|8Ec%}qZbFBRt5ZRXVkXb+yGB|!e))10HfJ6;{9|%-JQ(T>Yh{sF zer43XihKeA?o{8tQ7g5?w^+LWU9eHv)9H7?%Xr7F-8+#6)sBK3f5Hi})Oo;{2>-PF zVrZBZuX2`&Vs^Gs^VZc)kCz8~<WD?IcC7o{&Rt&*p0mp}j29MFAQcj;Jzvo(7L04g z={4FwcQgCx<Tb&n@-Bw)0F!^svt!8#>FQk5cqRF|l*%us&8J6GQvHFZSRk)}a;Cty zb2>OO)qb!#HJ=+K^vk_m8SqVZx}16<kD)S=r`dPO-fz^5_P?%Y<s4_w^Q={T+vepJ zx8jH0&pMgN^SI5;6OO0~P$5Rn?{rza`}Yq>CvTx=a=B;tw?p67PvW=P<2<PsGM&5< z1uv0YGIr~6J4CjEUQB-ce`=TWf54#wvEnz#Xj@~lqX!{smFm*U@?Up*Q8@`7NH*Qi z)|Z}m87ux(gpxREQx^X;{mb|a6f>Bqpf5_=&KqvzsLo1yss(YT5XJqEfw9Emfq2?) z`d35^MJ{8Xj00Zi;8MX&*IEdbsHW!@xo|?07dKjNb5qXm;AzMkQ9ID(NyM0}nE#mH zXt#;N?2e<E!gi5krB-&#ud95HH&svPk`5Q1<E_8@SBnLMf10rUw^u;%+H@}f!et#` zwnz(5+FET^dKko4QQsPVfG^hCbyo@ek7g%*_$$OGh}oqns3njbj*y6=2EiYrP|5PS zl)8Q*(m|*m+m7qQM9ct|E!M%a6HgZ9?vSqC0|f++!w!~3@GI0!i#O=)E-WXB?j_d? z{_YIOPZYMF3{7-rd$JZ*@)!7FUJ3avrR7Ur5aU#kCw>b*n$<?RS;2jN;>PBu!XJ14 zr6<&TSs}KfP`I`3{&TflKf(qz6gCHS?AH3y1-uN;W~DQ&HAx^xegKJ}uoUpx<wF~T z-3_%F8hS8A(ME+5vR8q()KK}~;RWQftw`$6g&J{#UdT3ruNAj{H?6!bkfl1BdKTB5 zH{gntAtnr}N0s4}YdU<2H6kMSv2`^gaymxHLdl2L4I!gh_a^wX&0UdNqKThAxfwMN zeEQ9F{7|Vg(UbG<8=StdV(_P|I)LPVMXuN5$MOJ3t^FUl2VyfWHz>F?{@Oe_BnHI= z&(~ETHY?SCo~>0YIms&<r5t!^AUJwk>q5qhXL&0k3jwtUE+9-wYzmJOeO@naoq3Jx z!8jgsigB&!KKA+BKVBTr?#Dp70`QYvCv#yQvw`1Z@LmQmt8k{<_x%UUGU~{gJ}LR+ z?qMgd=R3e{d*n*RU&U5b>-{+kpy|H4uGc3?A$CYS^i6k1zUS3|q43~U*?Ew>kedhj z-o=?CmWp_r<Tx4CZ^nb~S#YQ&_0IImLl|d-daOuT#S6wUImGOpKOd7qDd$;JABx7| zzR*Y1N7M<n5a~hTx3T6@WgqYPuBu+sFQ0ATFF<*KcbIs|?s)6)0!*f@lI8Rfm9p@! zVkOJYELfhF$7iIcyqHtDjgqMMm!X-9Tp4#Gfr16&f>q<6+ofK!y7{Nxcq-6`Q_XEv zYtHmWQ6*f^%Y~P{a~GD(LHYCht@*XUV;oT5VI}~wq_Nih!>FH73HS{LE|Vh#&ztwT zJl%s;^l{gP{z7>04?}#Rpt)=xeEvS?Ucj@;&|DIdrM8m#{UBz)*%AAS$b8V($`|9o zX9(%-$VkXiGS8p$dmiu2H#Y4p;x4a^lh*zd_EY_})VmO$>HUke7cq`ufTCOvqW`7h z#hH|l&jmfvKV9|rYv|>M<CN&tC|+a)1AL2Znv9nJV}D-Oog)3}kRjWr@CEM@e*&Zi z0vJBr&0QT>&UjDS*4{dsS1V&-W$Hxkbd39EsHW5Q>%1m*kKRjZxFbkIv#8c22)!Ah zAOKVUk)CVbJ^ubzS2)K-IE`^&$wl60rw})D<*2jU1j*J2BMyU~<&90%l-g`;R>inW zplY>?ks~=>IJfLI9~!;)%KRR%t^i&m@SVLnyC!TJAC$AEtDbs%=iXppcy1lu;CW(q zrljI>|9bJepDS#0gEC+tU!bUt2#3S!4M1e>C5%-d(u#=&_|*63&XCQ{i6J@5`nkz^ z*N|I@C}--yQAT}{tJ4HPi+{l{bNO>D66ZR;G>D=_c9|&0C}ti9cF!_(NjV-&sG(WT z7ecb-Z@)fmuYmvk5qYkpt$$G=zV@R;yKg;;8ao|@%nkW`nRCgx>7Kc@%;^|~>INqH zr>-+h1IAu#^(4a*0XQ}MLS9JOq&s}w1DR=-_(ua;mHe)MnW2l<rX@dPtMKbrq7B~8 z`Zf52njk1}!gQa*bYVcEW3crOiMkV@e*ED<hI~qyVtfNXt9=(?nVcmU{9h86TZOIt zL=a=ktMWA0`TX*m0Q0T)@^=i|Ye(wFnE|v`&5K9Yu~VBmtv%6q`$Qe<-sn!GV!+u0 zD>p=+d%On=iS-oTfT{CUPj`)<Q^9R5-N<CnnQylZn*eMyx3@OM4E$a90tT3gVf7$J z3_T$v5k_}(vPyK4>ltaSQ<*m_sNi7$)=tBMgj;|dQfE?D!EHe?t8#sEfmpvq${V*m zgVj8`OMp#-XOzcOe6z>Pw$lf%hAfSn)`+#tDrb_b<xk(nTTJ@V<z_OOOmi9bTaMRu zXe2<!4-2=7>%jLX*EaUe)^@+4ch3$J0Aq1fj=-qIwI@@_bZ_se3Om-}9RvM^*%G4% z|6`NG1-Tn`TeIQwc1_|9-fy58HYJ+%ODS!tjRF(<tu6_~chk`w#Yt;yjY5{Cj-Rs6 z0|>zBSM*>j)sZq;2j67p{naw6Y{I>j!FMFj*?h63S(lab*Yk^}aZF%DHNAJka>3{u z9aa$%alm)sQRln+W@DcTL>(FX$BQ>%n6N>eb>spCu<jqS4rdJ}L3&xKA+g(^M#vr0 z5Kp;p#M?VTVSqx*oFUWk=9ZVSgGUYP{mTG4{O9-^kf*tzIz9BJ#CilD&it3iXBZE+ z{tpT_mnEO!=v2Su5{$A?jV+*%SLKZrkm|SbH(#IfmwGBBxWiZKrcH0&cux&WL`q<9 zVaI~=E}|wbP3&REIsE3*3q>1I^yHu%iQqRQnLMgsANXG{w+~-#hVO@{l(>Zf<OdQP z$D^$Rdd0PqdbLOaG4Pv}*ENGc2HZqmq9jA4W<NjhMz^5#?H}Kn;>Id5o9V+j+*^vZ z6`r}mCz~ZTIWnGBY}zL-agQPok4L5a%*J|mcgC_RO)Bl*X|bDC4pfxc!%FQH9-w41 zDzf<8r9RbukGN(u#fW@&<$Oa5-j4cU97(hG*1o1v%6Br6)4<{n?Q?5Bp*n0Irh(4| z?;`vF%9?cbN5i!oMYufSq24!aGE<(&N7kizHu3Ab5sgF{@TH(Bja}qOr-&mgi*)$1 z&PdTyfoz36x1WPT<JJrAZ|*?kb&R(A<)K<J@mu4yGM-ERq89h8Jv)q_alk@IZ<MQ_ zeXM{kbLcZj!ba~<hmj}kw*5C~$g)Ai{ls0z6wa=-B!W-*#JYbbVu857h9}ZQW`|z- z=Ki=ZHbOAAZ@oe^miYjilJb()isXX40IYqO+1!;$y>au_a;egx)K>;7XZ)Y=G*TKa zpOB9ucsi)uKFKb(F>>*^7Qa!l)O4>s;sczwC!hRreoBZP<1Z=uEKRc5_2&@NpXnoG zW#Y40qxg?&^hgK>D^Y*F;T_LGX@H>wS-nA*x$m%sMJsdaP|!_zRG;?HekXQM%{YT~ z^jei7>9&h2d!WE1cA8B)n8*NEs7D6rzd36eHBHh~{K(zI+^j=~Xg#{l_1Fr`N*;K- zV}iB8PkTC;#tUJ+rk1zPY$OT<?i|LUuS7#Ud6iijJw$u3@ALDYJQ&=KkXsteoqBFO zC2dtu9uVw2Em*UAaILkF;5+$xi2Q8_;5j>ku{gjVM9%|?3eHAv&;~V5-HeYKSo<FA z@Y^_n23DD%PW*Rl6RAX8`?0-$d?FfCZ{Im%Q_9?Yt+}w2nGhvG;boqw99@C!F=~IW zu9};1bd}}4#<LifOEktCCFYgrTicyqF;(XxzRBVUG|tVpWtu3jcih$oaNe$G-#zP$ z9G#7q{H4^>GV!~UU)i#e<Cjv|zp<`wKRG1L{oAU13I_5knOHY^ME!CkP-EebuA$BC z))>iJXdU7StaseS!pY{jri-u#*DEXPt=aFL<jYrr^`?NcZ2?$oKq_%`-K|5Q6Q)U# z0Z0_){<@Qyp`ixvM3|~U8x$#3;6kZGAvXEO^^d3ea%xR!NnIn;S8~_&+bl{NjujJa z8=SeG6O7t^*k4EL2)=oJ@F>>Cb^E7Z`I}APFMFlg;{2-jm2Y=gMBJft=;_yHD=Kd6 z_=rg)_cOVxOPujg7o56SQsl-1H?k`Mbmh|I2*f23x+$^QJ0}sE3%?J59<+Pf>M?v; zQ^3@YDuMs02YqcNg~KnsvN;^sor8s5GN!-Cgg<yM!_)G}Y6`9Ue9|8|F1>PlAOAWS z(TBo3n_(|sPlqm%S9U$76%E|8SawMmiF@w{rei8BI^%^_X$#tY-|I$p4p_Ys$GC_C zhqF%i693WpO`xB&RP&ne<el>SjcpqQyS;`~b}xIYS3QW4Jltvfp%+qus&6UIev96Z z9+up*+-`o}IL?>F>5RjgHKqwQKmI|TKZBEWZ>OZ5?y~g+lO_rtUxmgop>)s+=Gy;N zucx2wQ?pt*?B>S=44hkm*$O25h+kkr@LE*s-wzlZ=P_jbv}`hOM#@+a!P^S3_d)is zJZ|$`6g?elBlSTF)DCCpnhb*+7+{tC%PQL{1R^i+tobnSG=0$Ul@5ob_$zFux1QZb zR6j%HUs3IlpvdeE#V@NLF%?$CH7D$En>~~EnMV<vz`t>gvG1dPuy6gSnQJ%nyS{}L zCypc_zB+dx?w`o=HmHk;HVN6_5g!Mn%*=0UjjPFT|EwS`L02~8?D{7Q?OlyT?#uU; zh&8v4XX2FCJyJqzpOx#5WABOIkTdTvB?&qybjBk&*k}gD)wRjpsh*J*hUJUO8mGKV zK7;Jqga?41)R5llD*9!)nSr!|5a3P=d%BuKrzb*=F6lF?vV;l21%**`WZg8yO|wC( z-&#ELA5gZrLXHHTvjZZ4eg5LCbV+P+34oA0BuFxAlHO0+N&5dBP4MA*v$ECInG0EY ztrC}EsWf%a<DAqjMG_@(w_t}JtUL=F<xr;4bn_0y&I~ZS?O6tYj~lmeL!w=kb#~A} zNvO9y#=WL8)CoBAPDM-w8`MU##^YLd$iQYR2o7IleVev$f+t8L`tJ_1T<ZN(Y!-a8 z(Ivq6u`$at1yD4c*?5Bo#f~js*sZJ}CME!F1|>XWCX(wnSCUa3m3sK5K~pZ%zHXir ziJj54Ek&RB4lhuZf0M1#*h@SlBxxyfdFn3GYTTn}s_EOm@|??MKV{Z(KZVy(#j9D# z?8=$ynTN@%N4YB^(p*x?S_fGJ{Xf5tB=R%3Ca3x@Gk6Inb*jGgIH$TfG+O_#Y|=<p zHnhkD>$~y5!KN@}PgA%kD~;;pK)og`3A*dquJAJ=d6?vdvf_KT6ain8i9Ek{;)wZ! z&Bau|`ml_Pif8>;VZyP2v|A_K12)MCZ4H9BEwg^ud*A#DVO)7?c8gnRQBTM=6}GOm z+pu9pi%Q%O=PFTGH>7h*E3|R_s&VaE`AWIZ?n#pQM?xz*IW2`LGxSk;9(iS3;Iiu5 zf^%4I#inDk)tUz=1A8yh@4hLXkXRuo8CrDtT(<7;<2*y-(dn|eotwgCB<M-zTB5wV zOt%W#9k?ms+pCxootaXfob)!T%onhrCmpngCU4ioyMdWk%tUKWo*0#y{-Boy7uC*h zHf=e}&%W@;ecG4hlxK5#DoC&hE|879WDg*~uCRF)tkY#)4gWGBm|}HVR#s4G)r8+^ zyiphydAQoq{b^uZ%NqFi(U1`X;cCp(E$)rQ_1@Fy-L5+_sg6O(3;e|~^@V;Dak|w! zQi6o9<-5^mKi55hcJdZ3Fx><XsdogI3y7(!GdC0j-%5M|m#5RoMR9`+3LeG;#}9vV z>`PFD|35_IzXH}|f2*6exoPsLOgv8ll#-C{+*jzng--qCG*fGq?yQ|Gzc=vj`g;w_ zhBt6!D}{E?g0i$g_Nc-PGlihz`^BOU0zYo~KT=2|kt_vS&Z$n&oAwDkai5tILzDdr zC!oZl72ZsVn9rosu1SJ#nN_xuxk}(aD{nPWQRb+>R^)R)8{^~oUlw=%$YBBZO|ecs z*cslzR}-miiSv%@Hqp$K8P&)Xc}2C6%=J8iIQ84=!SBfI;rREAVkET-VKC?m&JVou zNW{O~M<LHk6Pwjn=vhD~p7$mNRds1=>F;ie3dgs|Ye4P)f+eX;<<8TT<e;h~FTuBX zakbgT0>;#V`<NHZ#kieu1l#ARq_fe)#Xn{q`?!fTjjg7w&|jbDb<Y7?e@wmbmi%!| zWN~7&A1x}oI5JlmFn42-80NAwoX4sI142565&{vsYmeTIsjS6?xy_W&lj|%*KnmEO zw+g~GS&kV4-43p)m;F>QHXrRATx+`*u-n1_IEq^iC<L7;W&w;sx72zjbJ@e_B7x(Y z>qYCkjAVP<88>JFGC4E50(wzcXp4JFIFlw@Y0ljFh->)ftqVK3x%lE~UKH2OQs8Vj zxs)VI9cZP=%gP&U`;@kjbWJ|PCu6MCQ!Qig(5T=Lalqzq$P;1?_~b5!C6ZN3{A(YA zRpnS`m`1qs#{A|zpB9#luiGyjU~KKsI<NWO*m=qJ+*`J6R4^QBwK0!fi^V_f{*5k5 z`LV2wutG#-&wC(t_G_ldGn)i8NTeNTKqk!z|9WE!2+vD-u#>!Ax#NcK!zezA&x+Z~ z+_8CDx1*z`bjSyPQ5W;FBBfTr>ky@h5b`XVZR+hBG7Qdm`8hSgl1^@{4Zw0Y(wX8d z8_iA=YI)7rmmc<@CEYbYuRt;$IYa!{ba@6?E%U6I2WhY8%AM@6liws)2tj%~+xz7| zI`aJg9fUfHURt6LpAaT;)by3FWb`Ske}=WCU<^~!zKq<3P5KO~J3+rxhIZ!YS2K&r za2BoGcvc4OTFBG>W)E~T!Pem13O}GEh(3hCgf%yM9yJk8y0OQsFZA9Pnf<ALK8|E3 zUo6T)3#9v}-2BSy#a|6E^*sNkiZjcnfA7j4e3ma(eyG9wK}=^~NyPo}%3vNZ8;n2W zLmB_?H#?W_xW`$TQI7`~5WOkM8Qae&mhyGi=fSjjhJ7f|sE!1l5po0aBEQ`$ppOxe zz+D1{d7nK4E+b;a7RLO*&p$J*2Deb_O&j?Yi}O!rKJI&;Z+-vmzLq|JkQen{3{Lr+ zH{Q7~lIp5iLa~ZzLg;4h9oP^H$H~qi`AzS1{x6M_=qGWZBbq7x;#^pt5GJufeuQlS z*FNs}dejL|aA{1pxEl4HCC$0~KOQw2t4&u-jnxe2ARn#*#7=I(#Y~yCh5`H>6|s&X zy?g&T95g9{j|MlCpOoR+`~7Jm4erLWfXwdMqdTasi#H88B&ORmXz1~|84LqF3vLMY zs9MEmxKpT1w{1#CYwCS6mB7f&MrE|TFK9Ucc=st_Tqipn=Gyv0@1~rWPG(=Av-9uW zFzFa>Fx=+yL|6#_lc0k=v=pRk%IECk*610PPI;8$H0Ll{jtgt{8i{42rl$;(7zgq| z4&lEDKz+fTT5C}Oyszkii1x$O6V6C>GMd^40psJj(+|nz<afEtNMt&>ZEVe|k~G3Q zb-zYj_2l#J!?E&qmcVCBp;NSf(}26H!aYG?cUdFj5{}4y{BdHa1W6B<g3RSNwB(6^ z*)g~F%1>ifJufDA4+@D2r1tS?`OJ<I6;rPr!<m3D6anZ~*wvC>Us&l}uj96_d$ao? zuJsPuNN|06L`i5Q0k&p`t_=EPl3}>V`JcgZcSN-V9Y$FOcTMrXOzAhn9(Eq}m}W@2 ze6c04<DlhOCPVRNx%KdreCKC9w*!`Pj+Ttf|3;md$3N!X%b+se^cqgB{w&&D%*3Uv za~!(CzFG$nQJqG_%*E$h&1En=0d7w73L<F|qbvcT92{^Tpp(l#eV{V%ioYf^m%lCd z6q5$Vh8>m67C6WFl^BAq7jEDZ8rr4lPSa5A9(%ixLuUjjy#`LK(p)#(IHAPifZ<Od zY&c|w43#nuG36&%9xK9PJ(uUsRcVE89ytAC1(0?yLSB97fqCzLETIt)^F-oG{WS+b zSbV5Fp=oe4DY76`0H!Lj?_QEiJY5EE?E+D5$rneuO*44ncY?KLVxC(gBXyr?I<<@p zJI3QnbTf@*+>-IAMqUC%bE%FB$3=w8ZwldSP=E8_^;pCjSUF1DwZqKcpMQbw(5)&% z566$T7Ce+QIG~Gd99w^}<OaIuIj^GJt|X=pJ>{HfLxl7X7f731FxD!8(u*;hW9BEY zV3-TDaXoftO|9O7v>^IH@=k%*sD?`OqZ&$-cu?WX{SI*UA>DGZ+_e8-PP7#fk__iK zNy``;6OSp=$W+2m!<ijwgzlp<={Ey75+gRKQ10ap>z1z_dM&g*psT^a#5%D2qiY1U z?X+9m`KN|ODp_)wOVs7nh<s{0R|Ck@*n<7A#*|`<c<@MW#WuqErp4iBfqqvh8E7@Y zg-#oeDcbQU^e_ME^7LJ2Z*(Zv$pv#1{GK-G^@Ps7{mEI@h}n5vT&V1o_^u>)-eVip zo?fbU1X3q1F^<u@TO9c#Ee-i@ya^sDLMlOePAva@;CU6-Tmkadq$*sDzsOTWJ?<)Z z#eQym{Pb2b-B9X!)k`(5#50ZcikXb4LSE&vwHx-9vNtXa8_Stg9{$rfdAsAF9CZ@D zE5Ai<bVCsOhv}C~XzjbU2AY-3eX8P+o`JjNM%9lT6R-c_wvAM4n0<<!W)Spct&Sb& zeM}*rx(35rq}N4H63D+9BBuZ+JAG(ZgMxir_prwh1zs(iWq{@SRF#hCP(0|(p&^@; z^3We48Gh&A!<(h{Hn2MJoqN_cX7SB>Q%sxlay=@-&yDzkyxl=6jcDh-^FTndgrlLo zV7v$`XwPPc*J{XUP7G#$MDV#7hhz|=M$ZL>(ma4$f8<>!qKqLtwzhm%q8C3A<3<^W z<Zmlsf8KF`bjmp<^z&-Z-rz%S7EgBSzgTtr4Bqp*H%`CRv=@306#1VcNGAZEaF~n| z0P-73QyPG%*IqhH06FOKPVgkZ*yg|IW)5lN)fr;Xl+Y1NXZ_h#=FDTS0>J;Zrpi2= zJc*rh3xN+waEOUW?AWMYmn^J6>X<n=Rkl?x%=EiEvggU!_`NPz@=58dcJ?3Y59r1i ze3}Q{p8>z|+jc&El6WP>BS7X6?blNKNHQy^`EC$efW^=e6X25K;uHp%)v<*RhrHZ6 z)V0mz=IRlk1SCM7N`TtXS;oviN<<yS9lgGvM1ENHWm7U}vD-XcEZ2L`Vx3wrBP{=j zWc1-@<{fzgW(*8mqDOqZ#Hh;=1lpbOMgom&%1QZ<{S=HOY8c`QF+&u>AL1NWpX+4> zoUe5Bf*eQXb3r_L84xbSHNQTu_ba9|o1?AifIu@DhsQsyAvvUAV<XpCZb>DtDl(t^ z)axJvq;SvI_KNH>IuB_Bje3An`AYCOO-ZCbyZeOewLJawFUEC7eqCpleP$Gz&$eu@ zHX-H6<(HXf)7%$(-Aw<&p9)}}bglpahtrUn%{DeQ-Tsn^NkS$@A_Z>bz@(iLp|k$L z4)ZS<SZciW(^*n9Z|M<pNXwM|H=+;ib#FoY>s)z-1`Kq>UjWp=K>8EK7yunHV+YH_ zz@C=m4Py_?uTYHS;>kSX;GGZOONVlqa?A2MCo>Gky*;_|QY#N}DI-+4t-Rh~Ee;Af z0|-Hh=v8UTp-#SmBCOa3D7;af-st&i)GrZ{SCdaM`R0Jq16X%g^&V_C*(sNPhwwt3 zWz8dt;3n82n~LB`Z?hP=flZy?(^t!a+iEI5S45n3b1hQAu$q5b#%qX@0)&?_Hr_Wz zn)<pH*QaO7OiJym#HJ67v*ZHh!DfH_7N;$4y4@zX@+t>2+FL3p+bBW&)k0kqe9D3E z^vZ-CC7RtTyk6$V-)@bi-*a~O59$#IU6N!v*|Y+TE6(ZZBGTipk%A+Yzz$mAv|U9t z<Hk>>>^E(ZuL+Bo_9RRo9OaMW*b7ZIO=bODlbJWSk9&xNd9%G(sH#;vVs-1C*N$*J z41Jl>jCC{<Wm%(ps)rxA#a9UZXmv2GS3<j4`%Y`V{ps$uCPKUK+|7bgio~3A(L`R} z%0f94$eoDMgoUB8@51$gAFm2IZf`1HieZAhB|X?Bv}VN<;Zs!p!}B?Dblk)@XQFVU z$U{EP0e*0|{i{tSIId-M3T1J2^q@VV>RAP`ec1LfhqO=8x*nEkNkQ2m;Rj;7!MVg} zHQV4J*tgZUbJ=fe>9<2HUIFMl*7EbD@50UHNPeLIhrMEvMY!8i!5Wp&?K7@SXT=+O zv=eu<B?YtJji$8FC<&>Rh~D2(v{J`{R!niSP4E4u<{qkMV)Ahc>pz=sw4W!rkr=~E zhEsk9z=3@dw;Wzg4pYH>9Qb6p<dNB>;UA$Og}Q_8w-q;T0r?Jd?%rVCeoC@Fk~Q%W z`tB*%bo1k$o6XjN!KzijNJ=IQ=b~D!#GoQ1hj+oRFp4!`s|?`&i?K6z|2^zJwV5^@ z010booHVe7gQ1Q-7uD??|CRR13EyO&h<zqU&2RU8q%%pC@TkBJV;FZEbtbAUb{H0! ztsayC{>Kghj#~{IUKekR%=cfjil6hr#_91ebPrCHV*1vVWNyu(=Sx-|z01pQBu7{& zC?pjf2ik{gmf1cHua;N6JZ>zP^{k3aP0Xi+YTuBUo*T&OlvOL&&jI#a>fA)$ijg2B zf3*8h1D&tOFZk7fzfm)gh$5yZBa|GZdWq5ydmKOhv%QW%9Y*CpV1Qs)5{JKCE-K^$ zE042}{h7Wa_oH2@`oT1@*B1Et^)hQVODV(O7FW&B42F<5<Win1H?xOVh8jmYLmou- zbX|cv?CL4Yt6Dbme-C{KWFZlqfnNl7i&(pM9evR9C%6<$?j`?4ceKKDa)hVp$OYuy zWtp^O$0T*bx0-5;kHhvrDA7HC%bYv_ZWhTR^zFop-}^kv;*)80Pw}J2s@|I}w}dql z?2LrUj(T5{+>Q^9l;@%SVK6sj{eG%F7wqH(QqINcU3jiiYo*&nR#(Oi(ZFHs+5vKg z;<0*v#UhvUh=rL~;XJLQWpZA&)3y1*nV+HLpw#n-sB%!jw27&gooY=Y!sNaMbG-N0 zvof(I$;f$HfBatJ`qCZr>Y~&gaUl+WV2|Jw7eev7@9OL7IN(6|B4guUS1d(4`0M0@ zCbw+2O9uDfO%8Y`gm@cXJI~&U_?s{tq@y6qK1knJ(PEYE)yf@?I@R97RX>NDt_l%E zPc}J$f53Kx${s13H|8{zggZS*%?5aNe<$qTeE5YTmlb@j{<aS*pOtv=l~=QX+O;k9 zLKJ`KlcgLn%KxC<C6TXdH`Ql^xxD!Pd4yUqNcQS2ZDOIg?KUTdkZuan!_6%~HVGbJ z#a}HZ;6lm!@(ub&_CF@T(&1tiM1G8~K`S4g0zdQMJGl$TeAIXqvdn;-Hq%B0A`8`@ zitpBjbeT9Gxs-819~Ft$mS{;!gl6vWa>ys^9tAoCH+YVTjIex@baQ_?f|)6Vywr*+ zvWF!c92|dq71<{CY506HC;Hpn<a1`hZiTN;^SCk&wa4ZIV1W>K$l?)_^kY+bQ_)~p zy8D|J?hAijH6Ow0t{VCbEM(PV;no9KOzJ#R+Lm19+hX6$uXVxxl40T|iC=qXdk0cN zD-p15j~F_i2L%X#xKVf$#!pcE<7cdta6A_O*TC-Y{ErB_0p?go;h!7H!~BPYyo|jJ zo3t;SmKp0b{Z9aC&NMw{W(N87-#}o1a^wyfQUDK!ps|>|dNF>*-a+x+di-tim(vqI zHoD^4@D1DLw5?~;4|0t%<=bjUhllH&{LE{*l)`gUvF^$5+vj7%TlavDMibIugM(q3 zK=N~eg3tCaOjk*Ysp&Jt8*iT+r|bw|K~5?5w6)yDgDbTZdsI+S^e)AZX1U^SY}h&E zfnmQvi!i#v9Fcn-Z(TL!^r3hbQWfuA<$UG;qKAy!c;gin?XF?d*H~-FmC$#ysnPHu zh~LltF&9P9YoW+E5C5p#Zqm={2h8MnX+%my_pa;5P5UE$weLzl$)B1$oYI3p>KaYk zQItaaLgfSs`d3?2cF!*ACGwAhMB#!EF4&&#X+FbSIdM*}`2r_w-DFF@`rmWgsn_p* zsl|#udV$slE<@Ts*kGB`?Ea99ajGF=jiQCUqz8>9gUw&LZ%x@mMuB5cnF-CqTTN1| zdoau9?Kiwt!Bg5B#pi8ue`Hk4gAJs`s84LbonlQ<-Kfg)zsD&{hEq)L+pCY3rm?3~ zM^jhr8pX$tsnykI8`tWx%b$S17~EJ0MGlF*%##P|LLdjY>%b@rZb6(0<A(n0zCJ<Z zrGSvklL3j?UH;M-R2pjp3{~A4_wdWTM;ROKZ@KT-({%GNMF@Joed}>Y+aGU(b1A*{ zJwykMeKr)U`Mui?mmbv05ZN)Z`G9D0EX{IVe&xgVC`&lr{bnoelIF!LG!z6fDQxAS z8(OeNT;7OUv1ncxMvz0~2}KR3G2b<QNPifOJ0lfX1QnUCuGQKyU3hD&>exxzdDCsi z2n6$*VA?*<24uh!$P~$h81m_O!ton4pww}FSDC`bUK=dlUS?-{`-g<w3ecXJNo{8S z>wcd?+IR%~vxGfz`)^<$xLqKf>F4&h!<7=7nQvsvcmN2=lo#6#EzSZY7lE2lwd4O9 zT3cS(`5X2tUuc=H*GD#!4!&PH6)Ua&8qP*lm3}TzZ!c`TnsTOtcHCGlm6K7xL;gDh zXuB;=P62LW0u!J<qRU%x;Q{eyy~-%Mv@~`^f<R6xYL^)FmfPLZoqc|nRBmx|T13Qs zN3{OUyIK9U!>js5UU8I;LF@;j|2z}2mi!+Lud{vo*x7pm8)`LCM?YYqg687E0HQA( zS>X(yW<bwUn<IM@4~-aSUD~aGF$dY1`Oc^x->A}bKKYd{fAb*$Jb+4o2;vA}AjK+{ zcRjeAC2rRp9mdok7gH_d)8e<*j7p%zC+baN{R?oFlXyZpoViF8oIF}==G3~C0aX`M zw^EH|=&{^xYq$Sx*y8G*`WNZ@DBN*~mZFD2iMPgwf#BGOT#P{4?{Q@`+RmbXB+mrI zxfpbW+uLRr&qyLr4%3qhoo`^TL~zm?t!Y7YT;E-o*33o)J78!>$?($|84~kh!PJ8E zs|hh2_CjlO(S*j&6U2MZ{C6Kc5wJz+lJwCr9r%Di&xs}m-^F*uP@%y0qcwL*{nqMI zB7m@MQz?eb(D8;cVX!5x0Y&UaJb>BJJ3m`*Vg{}4{_{jTV&eEKK-{J{7$I^*6Mg!- z#Y*ve_l0_9_7wHJBp~!rEY&3FT7TR{UYpDJF+&6s%I%*zm$u_Ztq~ud=UYy0;CogE z*hgbf5hix5)cJF1zbU@(`yr}2xJdBV|5unEGAQU;s&y8U?>I(U)r3g+jZVlAa<3bG z72$jpCEO71&Ta(zm7^@Z2YL9Aok$On{@}``e$xU_*QV$Rgo4;SL_&c&P6b;8Hu-LU z`0yVsdm!N!LXc8FBT_}~JDK1`qAvmRe4z@Q@q=?oh|3Wl1)1r0EGKgK&D~I!W&>Qe z(%Um}xEcy>j&!w50-tVzuL76L0<zV!2E>3i9%RZ7<n2v;O!Dv%kqWIB8)~50J(>a( z9_nWdVI!9Q1>Fo{?&+Q1E|D{UWiLxzw)D)`3-*4qRWf(z2NpDFZk2I#HHM-+U(LlC z(V~CUDUiS;C>o#uAWGRugEfpAy47+z5Y0NXvA@XU?@HUhXga09O!C3m7(ERpRiaWX zx)=e#>s`G*Gvve`({`1y=3lg8yREdN%_-+TYHp)|)Q@X#&i8Z6J;&bobhH5$e*cks zV$IxLYfUXNw63$=5I9GOxT^6(baO^yjoQ8u**eOd_qTn-{{(+G+G3OeTz_?u6I}?& zK|FEr4f(z3L%#vAsC3wjT_=fCjY^!7x8Ak|^>zkjtfdb#{Ff_w^3n=_poxfe+!uBP z@^9x=ymnOZ<(wDP>N|X5-imvK?I^++qiv8vb&lw;{IgerEN|5A27Net1q=Y{M>bcu zJagGo1@cCLc~Hwu-3QA^PBF%8(zx%<`vFB$e0#K<4soe5i(mc=%rT`yxzU&XehE3i zvlpf<Iq7|SKm7||-2ci-{_#33PX}<TLKLiq5gi&+f&0RqtTTZX^Oz-p1#nrx$hx8P z?SMiI(5*{TMO8cAPu)g`62({y;e8$UBmMNadq%<dxiYI4m0Y9vi)Y_2l7L+c(OrQ2 z8XFJ`v#pd(pvLWG<L+$kN{N9|b<l^7oZ0XIY;Xr<k<>|`e2-W134j)<LIhqA5Gu3q zf_~lpfUtj6(ByYp!M>7QFmYy=a1||auX=lW=ku2RRvM5~nSv+F!Pc8Fft$>6RIe8N zVqC_kSI_jb;d@=cO{-U5_}7q*TM-GNxL~y2Xe&E6XqdjR9*=ytj!2m&1?8V5KpMdn z;W?TB^QTFauTgG^Y{f2Dd60)_>?{p_9XfHrWo~`v@t2~zZ)*+|=7d4?h;5@pdBCv8 zRqJ9U_*U(W0xHv+!a?vTWiZ#@Vb`%aLsI7X^+c3Tw`JwGb`)i`>ODb?A63+q=|oK| zl^KICFlh*Xn<|ruSic9J3@J}kt;);)e&fGSXMp|Uzx9bZ`{fH(9d)FxzS6G4*3ejx zJq3SgepbHrcV?q$a90&EY$*K*{}?9I`rKiAI?;bl?`5^_-d?d4IF|`6R!DgrLctjv zYW2^FW^ea?BT!gUw1@eM<>J?i)Q3WQE(4#^GN#eH(^MyzC#0F}qW!45*|$OeTrL<L z_A*4l5`Moai=4>=4*zgjg-jK7yt^DUxbnQ0NB-5y)`y8ke0d6aWz&XhTq@`0Z=#LX zFU#%@gS%$G4<*sFrJ43OHSsh!rJy`bb<4KbKqm0{JPZmluOC^?B?eo`s$0m;kThe< z^8=-2WmOMa<rF`CHxG1iv4z`KGzxv~e4rbwHF$Zu^jXJGhu*_(_AYMy=J-95!wS|z zbgsH$kk?64a*FC?Fr6dk>DPVBd+Z~c0W=+X_Dew-Y3Ayb9ce}gg?I8{Qv!9-JN2Hc zgK`q25&0Szd*<@M7SE-J3&&t|V5|Fxe=Z0GmM49~^zO8GdkV~@{QCy8;n;z+To2b8 zKfJc|TM*9VAV}gmsd>*nzt89_C9EIkj7SB_!%n5@E#IfmonWHIrT@LN>Za~KM_Jgv zbas8Us>LI9>5T?n*ap&ZGw0a79+kVz_mWmN!g7l;Kio{D_?Y4TbS?v$|K%JC<9YbU ziXRF_e!Nnt9PcfXY+zjSadX<uVeHBH%HJ!F=jkitXrQCGi=P6rx%!s1&6WNI^KL8E z{*DOm*Mg$R^&8Vt{BAjXS*>5&5U*esj~v=xM|YO>$I>jmWO#S4mYRp4Pk4-#+nIvx z8gpW{9*L01uh2;!zOa~zd>Yn7AJae%FFY&oY$q5SG?WwuQa}8@rR<|2l1eDAQUF^B zccToooGWh(?Y@GIW&u%tqC5yMa!7B=^t^?zd+o*=;eKl_u5#QE98h#t0Huop?6xeZ z-qxHyzI9?u8OvPi4-9)Ou#`hj=3ZFZLw+sg-9cXK9y)9x`8Ldcu?kD9W}|vCn-0a= zz_+(CWGJ|wG3nqds!F&u4!8F{p9RhVKZgJZ6GTDDCpz7nycH~_0)~;`m$8PbXl_A~ zU!Uo7SDrtQK3uXLIrZ)Q@8NK1)uS3-v5H+8DS5%FljKt5y7HmjPuqVgYvEspI|bos zDRPS_===96_UJ(<-bPOJO@}HE?SMXvE=v?;3&qi9lNAil`0B5YF?2H|ej(N%(pmlw zQmGHn7u<c8f0se!$qTKX2GvV1G;U_S38DrnkBp~iWSx7hGP-YpbA5n!(GP{E2+oT0 zJ?AW@oV|)C2>?|SVbf%CKjcF6L>67~tNLjUMT|JXBW!*EnHJX8+ruVSPr!b9M~gs{ z^`#orLx})P`*1(Wj;^J&>I<8uK%^$7)g18g@9Yy{;k%@RcU16w{pbX)k2Jt}unKQv zQ;RHDzGrSP;mqlpceT7jux<bD4R~|bC)bP5HTmq2a)$Dk76r<@$}QEcVw*p?^p#$% zJXbf6+bMX9=fy+dWMMA)mHUad<F!V_V3%z(FI$=fh~`&L|N0j|q+uu(ct`qfx606v z73e#9Bm04Kx!$_lhff9)1!oeVwauo5uOlEe)~op{H8XFD&PFi=aHNi)1oXQYFc7v= z7(J|$1*#y4+<B28m4GW8^rwSQ;@?Yu4Y?wObHJHsjV7Ajfh7mg!6~CYU=&=J&@C0M z=x9NWy`VLXEcN!?JkoofM2H2v|0#SjeQIgNWl<tF*U4s7F!765#r-cti?Ll%haO_5 zIO?lrAZ)46gRoiB7=A@<z@O1EL6LN&|AoB0o$sU9^B?evkS?{cpw{IKv38hV*rtYw z|7f1!pA-KCX;3$xU;h>xUQ_$nkjv^I*@wsREmYG%(Onm=R6$AOp@)39-M*RP`r%*C zACSiSyop~uQWMB5>Rwez+TlRCKcDM04eLwc<zg*kAGEE`D=}C$jF9NZv><y|Qqai* zGyCM;?y{BbjV#OtNVRo-v-tf9{+^JA&?HWdnfS}i0nx(^kjnmKg6U=b)@%A#kpe!2 zWso^3wdG(FA_^|yO%G`_L}=`z2%iI%E2-2`+3);*zX%LOm{)ZfcTBMIeSHksfv6D= z#$4an928r>aT|$Wyq?p_(i6uQK1OUd7K792(r~5jg}pOdMRbiOs9<7mDE?rcuFGr? zt(z8>t(OK0V4pv5U7o%62zLuFl5&!mdtKbnaaRf|pI6t~^1<@QN)<DqvvqvJ?a!3o z#7Y%?V09AsoLMNvwH*bu@78Er_8aK1s}w(-d-$Wm7AE*jDd|wuMbyzyVk@w>^K`bY zj<VJA1-VdKpl=q5!xOGr_r!8&|A5?Cub~OYLNnL<UOoyMP~N3!W$~27^T|hk%q6OQ zMK0;e0G+x@#{C6gEj>?x{D@d)nh8@(A-$Q%HMA#C^8Y1|vnYTka~SNuRa79H>-Kg8 z!h+0=wZqlTmD<(rF*rnRQ0NC&3W2(7N&t`Sem{350E@Q&-9yjGb(+4o<m92SBM~dz z2HUUYx28oy{G659k8}H05Q^~pPYmsGM`@FrZ7eKr+;4tduK)@W)pVtQ=V(Vsgj-qP zjzO7t*Pv3KI-WD?0M|!LL<H@tX@DuW0ISQ=%bC8E+l4}_US^D(t`6tE6c=1+n-wmn zJfoktHggkfy)+zFf+uM1JHZ~Wi`Pgl{7L2|3=;1L$ktx-_HOns<j&^&aAZ>`c*0qK zAW(gRJ>8SR*)VO6#OW%rtMR`d@c>n;mvymHqMn=Bxd~v(j?)G2o=mx5KsL?2tNF_r zk7)WU3?iO*Q5SGGy{aJn+B&?~-_$|ZgL#M9$6D`e>=05A+;1fVvvb~qRbE=pmMBy2 z%o6{q0&VB?jw65d>@@tn117lHA`GoS7gi$@o4J>R=aA8e7-=xGTUp96<1v14iB0Lt zoDG17r}%VuB$g{gFfIkaq*rbBQY*WJ=!AP?@YDfZwALfPz1m{q-SK_?8ZC%J-5<W8 zm0Cn!f{R=7zWd<XQgkEepU?420)p7`JZA#f{d=6g>0~UaIQe;akm-lT^H<I6H1@rI zt(FFWiKd}cp!e^=%(PHB(<hk=Tqn5_(k1KXk=K0<Pt(8chQ~QzG$k)cd1q2xXQJ}7 z=6i%1c>k7g@?%0DM!<B<Uwt8@l<RwVZ-qLs`CIakWTZ~_3(FT3pI<Wxetw;onyBIJ zPH?c4tFjpZMZr+afdSKyCMqW;V??n>Hp}{;&%I4T^x7n$3v;!}60cbAOLzGYwk(SO z`b6h#s0w_`{{DJVTQNmDLBZ{Z5hu9zKN5dHDl(N`Bt5_6iXn$7p&REZ`8}fE4w%_! zCc;y-+1Ad7i%)T2bDa@;!E;wtq0cjq?J1rH{A5?$v{*N@N<IxrL0XjllY#>jC!BN_ zZADDiK)HXfd^NOwCi1Ms^;BsZea&b?kp$E}p3P`Sk<fVDX@hvxEv-YT*otbjkuA#N zALsD%TQDHd`}V_GxjBeAv$7e$Hty~df3GlI!&}asH^J0`_=TKe@V9-1+6fCMa!8sL z7mM7svoHwp>9(5u0o92dobSZq@kf+brCGv!L~aZ}ojgH~4`AeDL)m#Q5)f>NY7nI* zw83ML$9ZSTXJcmfwz_r*=~i?}$6Y@V7w_$xHURKNh1|)X0sFG(vZ$fmX~b<PNZ(5^ zY%mC_{OwIB34pOb%of(m7~kQOf+RBd%F}&QW<(bL)@}W_o!XjVsFrhem~fb!K*`7X zm4{k+7X2yrMkfNAO0nsIi=Ev0`1?Z(@fIG&>K~4N+|?-qlVq3?QxoE#T)KYFkD0G) zt;!lad%~)WMnWTO`f5SS?Z*R=Bd&<Jx2|v68vsw|zLpuDH@+={p!=hQuN*8QxSkGq zn;3OH%!mU$Eti6<v&*?WyeYn#g#JJ!A7+eLCrGL5*+M|jP;q!cN$=-KRaSz{+fZLl zf+tV_M;T0zc5R*$t8n?7yurqQg1L%Tk5mS8GqOrxlC|>QUn01A79m}StfUo|^D+Md z?%0<!Xj_EoV+mRt>Jeqqn~A3W#$B<eKxts0{Dvsp`OEbv$e%E~j^1-ah#$g`@+`Xl z-9M>etBvpKukc3j1EbmoDt?XI7Q}MKgX&T}XclapVtGUyPGsbh*?bW9_P_kEt}_pW z>ihqHk|bM_Ez4vN+1D7O$Pyw;c0-mZGTCPs6hc{}vQxZe%a*l_E&DpzMP}?{pA9o( zEZ_P3`TOJd*Zu4Kaqm6n-1B<g=i~KEe-i4hAe7-ukb(cn4)*u-DPmQ2_oT>t_<2WI z5VxEKL4U;DfzTzTrGb|v_rG1*XL`F)LRWa0q4LO`AP0J`+EumdI=`67n5{S(_k1?+ zQ6D{x)pmFLsT<Mm2SCbA7nQPn_(va=F^~x_SliLM?EAZsv~lUE$@ddc3HVL-7tbf` z&ns$$VgPG^UPL-G9Qr18ff=!ySS((6x6lPshu`!>@joi>^y;Is)i~zBw^L#h4j-!3 zRB#<z6!RB%hdPQEX};EKXVx;NXhklR{_MfnIQ?Pka)kS_xAl7U1~#vzsY^CQcr<=; z7s_eX&q^L_B^Tm`r~<Tl4tQ4iUoXRgANy|KyP9l8(2tR<kme`*NW!v!PS@wxM+O}Q z2Tv@gl&K;*tgyUr%|XT(G#hkE07_z!7vy-Bcgb_`fc%9l#rF=0nCo}Tmy~cJ6TO-$ zL{w7u>}9jlW%M|dZiv-~D~R(!mOrzQ6>o@H-O0{TvBK*5$xo-hsHiE9MIVTn#2Jq5 zKI(ceiHyOl%{+GSCJ%T*saf)SSH5r21=>`^{_4~U`Ee7tfq4PCfOS1D8dSd(^&SFd z7!5px%71)d5a=1G)cK4P!DFtpqCQ%@eoI8|(yLD-L6g->HQS;aK%@SP<IfS73)!KP zO7M7^o6N*U4ku3I$cyN^4-0hIVM6~T^}Mg=-r*#A%N<dIa?HQ0U%`yO@?F4dXb~Dr zh4j3ALC&kr7zzz32M}C1t3EwXcgxtgO4s6Y`FB)AAt?u$7td3B&a}L#Dg$m{o2(K% zYKd|kDSmn_*^fQ0*T%Arww5iTYroumulEGFF9vC1#L=xdy8e~KaJsO~V}ANitTvZ- zceCO?r>`ilCfZ5ehv|R8Az$9_a+Vl+4VVOF(hjYzFQ|-3B|>wYdhbga*2}f4=WYoU zYMNxaaPYPGK$9{4@@`xuSxf+2*P8x`sb)$Y2PHTFLliDFL}Xe-28gPdcFrU0WG`{n z`nX20&%%7JFiSYtMn#h%B9~w{UPqv(eShQ1>c}K6wbvWYH}SqVoWx6)vtJO-E@91x zUy<=h!q!bJnHV1k-y|*zU{j#JC0BEhyQxna44w;_0IM_Fs8V1f6~$;FO;J}lKNq`G zd>Y1NJ~{wr_g~FQcNPusODDa<zuKJPMGuU8x}{Ek&+etl^>CjsewlqE+6$Q!E`+^f z1n=2{YL?TGd6;*d|NQyze-aj-Eh2FlyyIR<MrV%)n#Wv*x^jmXn>^pWH{LU-=A0ED znf;pZbp-9;9KgY>XC8mVk}UDb;rb<N4*UhM$7N-vdm10>1mww2Agzz`8JI1m&0aM6 z>?=nA4bF<jCTv8cBJT(Vb%ys+IpL5Zsy_Jpv!q45wIvgVa%>jbNTS~)Fw)o%SdZ19 z<q_urtdzv=aaI7v7rAtm3%&F{)97tA(_$bzv#BwfQl<P^b{6>GlUgx>yU`2^7(`+X z4varzMV%|70#O~KnN4U3(e0P$q|X7K^EExwOGHnh<UBngPh%rESVHM9U2}5d{T{0# zmPTOi$$>v8lya|??GC86?&T=N8C1hN$T|03T=W)i`kR?F7I5jRYq-YALn#o%YTj<m z`BAs1ePFJ?{r&8r_C2boFe|bg>SEjMfgb*7^+8HjO`__yy+D>+vP*%+e^nIA_BSn# z&yv?9{Qm&IsOk;a{_V=UkV|t`gs-w8LT)C&;z^n%Ro&Dw1Y_f~gd@lNwFoDB*?V}+ zh1n&d&Qj<po!<P9znoN+t&@G?@>OhlZ}%VQV|sZnXxln18KMYB8j?VY%!&X6CLLo% zWaN@4U!XkG#Y=ilD-p+HSoG5AU9cgQakn1SMK#Brp^2!lsnR`}Kc8Fwsq|D!$9h`! zUm7Fkc46pIiTs}mUwDt+$PT>r;9czZ#M`pTnJ^&P(G;yH|Kl7c0WRbb4%avsdwX#; z_tIcxq{C?QUuq)4oV(CMs7m94{65OZf#sKy=5%w@FfRYY@T4reDRptdJLmhuu#TPj zl2eH(b>!I1IXQ@p9o+fx60}H1&cV_mxY8~zNoidS-E@_=kDfoE>x?D)vDYV{83By{ z1$QTaH&fxs*rVX~K8z@MGfNb;HEttR<c_n)DMgGqQp4nk+tak-c;+gS%5@pRPpIyW zr{O%4yD_shFe0+DpGwn4qM|d0zMNyGsU`#|R9n9?f8R<6yoziMvly#79g6KvV{mkg z!}25SVlau{?6(ZO14{AGZ)U+eoN|1f^co3|vqiyx<)Wr&{S0NG5*=fdLvWu4R<W8# zEV_$2x4r}Dk@mYHM0E}Wo~x=YuOtHkd*U174t$xQ%!8Sq1!5wU!>8o;Mal>zd(OYx zv#BSptyhv1T<UlV_T)N$b29&lskyrK3i6?DAsbK82Se^mByzpI%7<&J;7y2urywI} z2YV}ZAlhMMHx`8bE_%|je8`g%p867$zsi)jkWkYV_Q!)&aPn89$UG}I*gHC^kD5vO zw;u7sFgefIw{?j6)N<?zs&Hvh5~`vcTem#&mj2{@K40-kx;v=tcOu~ajZc?o7Tb^g z&wf45kg^i4lKp_nhj>BJ-+sJAN#@Qz?DG62UDb6vq;}0IspP}GT;J&boO{(TP-w`h zIlf(m5&(+%OT2Er*DYlEBIha{%H7d)(NklZMfm!c98wZmtS}kFK5-oVF9)%guPEl` zr#i^9K3pBJFAm(Wh>mc7NG?G(7FpNa%M+9}D_V0&li#~a_?R@is(&I_Kx#qRU(`eK zBibwmBz=^}(*Q7GZmcGpm#Ew5(bRRp>SdlKQvu`F%5Tw8#td^oP}Tk5Hw}{}_!Nl5 z?<2jDy<ka-2k~n+E#O9^rbhgLAMpVzY1S%)H3VuYn4&s{e1`j7*8bw*apr)f!%KhZ zAf<$pS;V;jWGIuP(11TbPjvyk8c|p}QzD<`W~Z3^{sDdKTnNXFQn95l;4;nelVVQD zmJ(`h5T?1+eDVwtc0~`iq8>@=*QFl|APtN4dhTS?yjei!+UIv@84<q!9qo1c+k28s zQ9(D7<2S(s2gFc+F~o~tHScIyR?^&fY}sc@eC|E->+ndo62hfEnmY~)_3lo{{?-se zyA|VWwYAQm&^G&vx+7WNHwrL%sKY`ue4tz#=~ne_P;2VxV8bSB!QsW>W`7B!jX+1g zPiE0@{3Kih*)NB^3(!RD5YJYKg&5Bhxx-F_;#bf5QI5$y7EtjE7x*|HKDckq23SL? zSY{!rZ|5(cVxUx<&Hbn&d9jM2@rR(l2<*wPo_pDfh-Zt_2*(sya}W$>OT@oEzgqq| zc;0D3I>@w4xb}^Rl|13;fZjmZ>eIY%uB+erSGNJy3LxFKax%B91<A9(kE-U}XrYp_ zR7xKi6YDaDVaI=Qeo#=r$fawNgZTOF9_}aM@5XYoHPne~FdgrjvSmY$-`0%&A$@)J z#-AV28-H<c=_5IO7z=zCEuGlO2RC-IZ`BqK=OEtqJ!EN_Y=3LQh^Y26qVrFI1Zrb( zv@Zr*fy?EgySIyzU`QBGDl9abJpyd)b;5)yH7A@z5MLCW+EUu`|MFo=U!qEQ$fLoi znpDb>gd_9<Env=b<i*F{ovXd#wEbkZJ-Q6=m0uWESs)(Z{Xn?yu;NXk^h^@$^kg^@ zfhD5gXC>z+%!fk_8u488v(uZZbHaI~@?pl$Wx_C8!zOtgh_29t)4vii5Hzo5FW56r zCn0ZF6$@o)RE7a}wNCoLuY1*rQa`{MR&X_CSMtsqU7=H<UvQL)d^fy)lsM--g0PoD zkx)wbdDe!fOGg<WlM!`M_taP-vzV_6#8Qe5l{TCmf&(kd{;U0p_VCDd+Q=AX<c9Zu zOS7gTMj8D(`H{#C)i8uI1@UyCK%H{CJBp#EpVpD|OaO5FmrJ`qe1ecM0@tQ*&s13* z$=9kOE;?U|G45Kv=~V>`YkKq5I?kbV;dQ!)?5Y?<;wUmrl6hGW1vo<pq6$}YZ`slO ztN26pz3a&%+Aq(q2ob~ED<0S_pqy`SF3s?cU>Yg^R-1p(^>0`(S!4-?@E?$ycH_h= zKSwjaW3pD0Maby}C6CtEwlYBnzRR54SU{-9p<~6m;SnBx!{UM3I>;d{sP=vQwIA_~ zciU>CoppvWPm<z-DJwN=++y|js!gqFAP&Yv7%CSH&@;(=P;auBy6E<-sHK{mQ-HA} znL2-T4)@$Xc9~)LUXv)a(1-B>iuF|+Bt7~a+#}I(N)K)dbz0XCwYVmy8y{+j@B*6W zE6!_G6CC5wD%dBsZ@k-rx<is<{N8y7acz<|3zv&WX~Ms}Q+y`0Mw=xuG;!Q_IrfXw zQtd9Wm2gk8bG1i9hrkGLeR_Hpa~8oy+c;0pTriV5Yx=Jt)L9NKBzl<y*fxPg#g1=s z*+^7P+#FQH)(~Y!o{eBQ<fC66WztDCnEq+_9wC%2;|J}{&5Deqc-yGwRR8K@+{p1} z{;y<?!46%e*i~s?p-%hTAL?1(yn|9)Xtuw@{y9wDovk3DH(YZw-QQw;>D^o7iPusW z*MT)v%*t!Y@>Eq?S4vB7l+Q|wyofHw3{Sa<os>bS8%D_h;^f0|Clc6<e2ax}?Ra?T zM+bbL^o9Dbk~h)1=#Yx#t)=x~=;Uks3$gyq_)W>cmMNySz4i2D%E7q^wgz+_FcP1L zNDa|m&q~FR52Vr5h!-7e^>FNLz=v~P`#=9Uu3uF#j8PH^fo;2N;lFm*dxQShqaul2 z8`NCZcA<}{MM`GuAwxn_J>`TQc6@3|F9i7XQhR_V?KVV+h$qB9yA{<#i;Vt<$#z=s zwksc#^ZciKkKUNA^!u_hQ%?9|%NjRW+M$3<Yl6!k5*-RRa*SVC87tm@tkV2)3`d*p zX2fbFRTyiA`~4b^&uVVE<QtDT_d+B#+#Xt+=9)oIE>C(vy-sZGo8N17OO6i5F)2z1 z6hNxj$!$d(7OV1vO#|<kH5U2#J3*cm!~LA_k1ubVsfp#UjN3kr0?!cp&vtZHoPk}X zv#=V9_XsQ*d_D~SZh4vC$p~<TIaXHY*3Wy8ip%h7)pAiGX=9qehQUPibke%;G<Z!c z-TP6?X%vW)<GT_xj`+~zh3CXtamaQXgO_Z+4W9(%kn#$7JNV$~2wRh>I{VUo^XGxX z^<+ifMdmk9KNvKtWhO$oclK|ltK_5`%(&PSW_btonv`d|rz*>BZl^S7y6Uko#DFq% zXKDh*99DPP!p<MI?|3D_1b=y&C-hi75^l@RG(nv0x7U}CoBqVjT>Fz%s(w%)a~aZB z*hJA-bDy1uWwYB{P4rcajPb%^k%+U~9mXGv46rm5aCFyU;XI)Nv&xc+RvF6DDohG_ z4mrF|BglSC;nB@d90?N)3OSD|d)^UzSZ$Zqld;p(DaeMLk*vBS!w&uBgLkZja(jPB zrQF(ZH^=Q>K$!;(48<^*k1S`c{g#@#EepAv$%K1rQzrZifyIG_qEj|vda2Nq%%|-O z|6L}G*TddGIL}&_>wwtdm;kpj-%I-@%*2vKh9pC5td?9$>pc&2+W;~2MC|b&4!prm zQWuXz3i;Rt^+FD~efJtU?7?wld}iwL0SwhEhb^k}vM@!@brg!CDm`cay|!0`nG?<M z0dL0L@DEmkCTJqc?;eq`Sjvt)OF@2lVsHN$-yL#`AkJTFFqha@t?tGNOHF*m5C`;O z5X8NUSoQ?vZ?H$9%w#@sTqRw{B8mP}6}@NI;(<H#^|}-@LYr8w@(Is(4m<tyOU_UI zSl5oi?%sZiOIx7IQ-YF7e}Y6V!YJPlFE<u2pO7h(u<br`3{41~<O0#?eNFcHx2-l4 z8_yA`G9=f6qRt*AIE|cB8&cR|xasuZB5M0PdrRc|_;PM=X+p6L?^?L<&ljzubTz-U z*`UvL9_N?1n`HUL)@9qD)Uf*9&ol?Dw&k#I6ZByxoG85JFvI_hm_h(9w7tikwR0yc zkG<ATo7OKWFUnN@k}Bejx9>#AuhU6^iycFW=!#8;<fDsslpkW3uzDRbA)VBq=+si$ z{0TqTc|cw1hx+^9UD{e@4!QFEnrU;u!!Cj=Fo}(#IqE^Up*y)gsfr3M&`BcirIl_c zrOHfRgYtwwx{+GEstr0}7MjTlBpT2@UC36CT4?iowVMqdeF)46sww(s8}GacLEk~? zcZV?3gvz4@#=leVHfb4=zc;(`mQ8+Nb-1&}-NQ{VAsT{blkVx=X7B!?qLIqVeHhNf z{8b-uMd*xLEBf-*LC9g41EcC6H~ip_Ye&sg6WESCH+Q=D(t}bX4<M0648mZ0M<yx} z-qUYO@y6rR(5RJ+fctKtI%DGC)Qpy~gGnDm$51H}Z<8?GvA)WHIuK_29cWJQA26&O zH6kXStg6w(A7=hb%CM;P_?wkom5DB#!^b^GolkllYAa%|0-a+9F+?Ducpaf&D~G$* zDiS>xvwieh`!fG$*ITJ(`_?OUDu?AF8CN)Oa!JrwpdP(QWzA=9nT4Cr>%yj&|H?cS zRLDJ^UPi@OokZBw8!7vc*XfiG_fLXE_ItP2RQKDFmB0F+ka3+AQt{#i@Cu`-a=`Ny z8fd1zjVFw*yPY8V9KnLc*LAx1AtAQ;go)L1+*<Me>!t$qO8!vRQ|y_(wDWF*)dQa+ z>3NDk+-O=-NJ%|hrLR0_{kP*NUy<$9T12Y3U}RSQB=ItMgRxFqo;cHiKDVXxwx9V6 z^^PvhZhqby?tXvanX~IVMpl+a76K6Kf_d7S+*@x{H*oz8k|<0=jHdVFlZ#@5I;pp> z$IgB}6rl$4>EOrzqXSq+*Cs*Vm69Jm>ub1`_bph2i%tu^^J6|X<?9X5Z87aX1s^oO zg^Ub*0SbdWR+*!W%<m=#jZ8WMo8k6a3A1~m!^c8Ms#oTxl7o<F8wPaJHK6wso)`7t z_lv(rvdjtigm_>3Pjf!<>PMxpg16EOE)6z+q`(jY_)(MqZc87P3v0n|lH76K4|nMx z-1b32e!D#OBQG!1MRg0v15muUn54q443-<|{{CA;w=bruui1?iw7<F%hu_rR`*e%8 z9ExuS?!1*T$R)|+U5ez2=Z$Sru~njt>qpSYRTZo(cn%wnh<e9vs`k?NNLnd-rFfwG ziMmLJly+n^y0n*OG59EzV;fu|yUCkXMh;5B40lFs;~o;^s{J_rw%@kT`S{cPUn!r1 zRAi`MYy!tiMe-XpWEuqW4c}DDo$eGK)LFk_)z>-;9e%&$@N|Uus&?pJ<x&N@rf_An z5oE1FU%;AP#&m0xh(#?=-bHygJ29F>ogtwGy`jn2Q^dGN&?rBaSWKF6kK7_=`OR8f z$kM>X1Hlxrnnz#WN^Z$YlA&)?fzMwl8sI!Ewyt7D*=3!`g^ATEOd#-vzLF5Z#W-p} zj`MqO?LlS$F7Z)#WyKTx<5nd8Oj{_(lysPIE9zM??f?a*b!)Z1apLjcU|j_BnK-CN zv^`8WD}7|*jVe;le+ubCEa;ybh`#YKe%<0`c<DSqd79VdX}1cjs};OaDr>ddhmwS3 z-d)>Co+@9$^*Kt;dlqFohm26mK5H1Ggt(r4y;X-Stw(5e?cku5jc$jwuwz*7outM0 z!cjVw++}uE^q>&8*-vL0E6wNW0C^FG{G{=4v__cwDR)QSs@5r|Hj3BN#Xtwke9{sW z0Nm~nn9c3um)r%MYu3o7nd7S^?KRD&6$?`+HLn|mZs$B^lEU>SA0~%upRM*WCO{v9 z(@ib|#U`Qc!jMjy$&m=WQL!?F;G4PUPSn`%ak?6O6ljXyqV;*w1Kl2x@5Z>S4Qt@T za!8_DuCA{Jy)(Ox$D`FoYS|6mQotKspT>!OZnzfpLw7bI03otda<G*L>i+6Di{?-Q zx9vDMuQaC4RDGvk_eHs^(`-5!em|Pd>kWJ#2f20>@=*2!qW<9gp?2VnOrQ8uAGrD} zN(W~3t?-vh#L*n$lj6X?59hI1IsRs-qfxfJ`vCJu=n7q3-Em^LLaurMw8R)^3zbrW zTGo~as9=kPT}(j&_=4UM+?rdOR@aK&{O=-J)^^c{|JLFBj~rSO>v8j=9N4=q*lGuG z){B_-f0p_h*^QL44kzs>F>`OuWF^!q&zWn@D=8xiUDgYc3kQcMAN@m21nu4KB7zCt zbt~A*@CMp>%kwSerru1gv}H7(c$>l8(*3tAFt74!#Di0w|82*9X8ZOaHu7EqpfRw$ zw_mtpKnFD5d>bog?A|t*TY4xGb4ZJq%~5ZQ#Sbf!%hb4g{T9molVppVTp~1Yu3!a0 z!L(xXrNHrkW7ag$X(`xH&75Hu-?v|}gTM}cP=;Gd8=qX1oeubP?nVjVmF4`z{M*Va zx@^&oh7kSg4Cjz_Z!aKUmIosPKHIV}-f;R)_9-Z60Fs{CkH|bZy2zfse#gc4XF`N> z-@tX1Pnq%vdG=jQRgS^DLhHRZomq|W%kh0N<3$&r&3t<^6<MMg#_A}kg|HoEl*318 zOP4b+jJ^)dF;{~i%C9%Q*Nlk3tR$pHfP@H+g=jW1bT_$hMQf2IAo>{}AHAfP+?mx` z8D3Y3=Cr_^8p2Mw(YaBqMbi!bZ=12-Xz$Odh-(79Y87wZ_i=_1DmcKe1&1i<NZ$_} zVD92b9*l~5XD%9<Sue*&ePHqcoEY#lZfK}MzoEz_D`@E%OQBG-5NdkLfc%*D$FB!_ z-D6#`E1g}U<DhYVtS9+Y?FLdiU2WQzDmP%52+>A(P<-z*9J7*N#bMkZ6-9@1mhQk` zmQCb$wCJYOa>>Q%fh)aw(kwZ0Kp_MCu(WArSf*_zcOn{KZ1cCslkoo4$KU~oBuqxi z<nq6^-+<>Iq6RAOAu@nw;eQRxwh3+1Nv^uzc~iVn5)&`9sgqyQ)))~VywKJ%;<&@J zq8VU#aQwC<;ytO(rAdLN6zO}~n8zU$&BrKU)iqVrxjNju&R!THfh`)+Fq0=V1pmvz zVR5Ln$^Riu5wNHFY?t`_JDF`>$l;z?3gGeLAV0s8u%fjcH9%i;t3_ME@mpd0Bc?+5 z#t^+P`w~eeznxRg{$@x1@}S0jKnZfy$hy!F{g(LHVSdh}Q8UV<GilSRJiRDe<cl@X zI)#ngyOKFA+L5>PRoRx0zH;Ap=`O+<EUOKcb$8zrAKk3)2jHI3_vq8M;o&qF)CRT2 z%Y2h`TJ=!7-OHVKxs+SSJ5}K<s2UejZ>%nqjI7WD7d#n%MV7}idVNio&mnQklMd~= z)N**#-W7b{BbrG{m9o=>_Q=jsTWBlirY5$kWJN9Yyeyn%WURA3x$ZI<Nm(;X$kiU_ z+<RD9iKtkFr-zPjI9rcumdJi1o?yr#K}X%~b6iETalw@ebw#ukiJ`**H`m+nnqkS_ z9c*|$X^u6fPP-22o)ysArTa!Wn}^$Kwg>$9`tI>-5?&8@fwca7-!)){OKlIh#FOY^ z^Rqe|uuWj$PCX(|E&u(rm*$1O?EnY%`ZRYcxEFD?&yKcF#y4m)Z@@}AnfaxT(2b7H z94G<sI#5egrzgD2FeWr#61YK|(KR?XOnsMRFO84D;?6ultT5tZN!wdDM@2@A?KOeJ zn(6UDJ`O9nifpj__)1t*4n+MJaefQ1=O<fgh`MpUzF^w;0`S2i_{qJzHCCTe(t1BI zLrSzjyoY>bX8Yuu84h=ntKdr>o}0RorR0l?d%{%ln_)WjM7M0icf_C44<u_k6jpuK z_XwVQ{YBU|ZueSn3{wus#_wN0e3u~Pl&AHN+cpS0F#h5{pOdmpoDeczX~rZ*8nDdx zTtv|Q`8CaeXfLdkIeufmuM&|@tlZ{U>|Kmt?*o6!FhFE$ku(bp5axZBdXTom(7Iv% znE}@cY7G2Grl2v%dE=C+y-_*z=pG-!A!uF8BH1+azfn`WG>a>Vr<gNyiiJw|#G^km zPcONQ)+PL~h~pRb(P|Q%yN*j!E_SLW__osy7=FC@n4+A3uo%PQUj4z;D4j!QpIRY^ z%(7&Ja^&0%%XprE<x3q*s6g;k(ijdN-*iVU8RncPy-<)#b`44Rs<0vXK9|aM2GYS= zxM|&j9`BNaYl^r39NEouuUt8n%Y@}U+2V3J`tLKHeB66~_9-p+E`G1l6jiu9nPz?& z4YyZZ>L%~KHdn*mh4}ITS3FDTZTJ#O_i(v`q5UsRL4w3FCEmFWI!`t}cvybv<pdt+ z3pTD^)lwNAlT3L@?<mJKW!9LprY}6?4fVXGQ;yXAxAhYjllLYQt=$0_Posm0y?yN7 zKLdN>x(If`6XKmDm!S?bVsfH7%fB}-#8g$Os9{%p;F68vTh%=ImBY{v#+YOQuu0&9 zz_YULclv~V=?(#0N@gB!;m32jobG-aBPa(_HRmDmht_%o0Y)P3N4E70XAHtSgpxbn z7@mZD!UR@T)>nNQ2HxbYRxd1{ks2oD=j*pX@LO3lm-`q2blCdvyAx<IH{ws&>&>e* zhDJ%+YvZ+-l1kzt+VkP#S8sxS!E&ye-8A(<XDt}eHY%A*qjN<;_J|+gUEXf;bwDdk zv6Lh516IWQAXyyUaqM2FQAM+k?ITfJOP^mTXSIpSkbFOsez4fEYhlA8@oe9oG6Ge$ zE7qerE8AZ8Bl7w;YP?2fTPtn2=DV-(HWZVc88=HOPRxGkH%~P{;wx4j6=+*yKil%F zqWyL+UKIS`{P3g9=NLC4^Q59$hY?CD5?%WUITP1FVlWM9|2xF*N$%SMVMke~w*@;+ z7T&(cT*5NY2*Bn19qA{T8&;XK`@_#8IT6i~{L!U6YHRxP2_=T?urLx+B^P*kG7-Mh z_3=akI-YZD!+Gm(A8_M9>#OeP@c{RkISzSZ<VZg=oOoFi*bZE48|?3^?}l!%o=V;4 zZf*TuLlE`9w#WJ<9s%Be3D+`7K=g$Z7qWFrK?mYFx_PFSAHIU+i7&pU-_q%YxTAVS zLBZsPkZ(F+({$~L`~exk!F{rojaNJEI4-dDOM&v1B0i4G)5<XNZC&pa7`uT<qn^i( zDStA!06vy*S49$*6|6))D%;48`0?A=NL7G0xVc9WNoAKKaM)V^*gdDYv9K9!r-p=6 zLdPpB7Mg2r>|e}nGOhAahlWh)|Lh+R{m0=BKe!~HBbHPi@Z?d;NU2#v<)&H7SjNR# zYWK*+E~T*bOlVY3Zsqr+XnimLC+2)viOFL`cUJ!b()e*@WKMHO@x--n9fX?@pN|8} znNVM-boZPYRluf?#aSKZtL<MmoEfY}bNd&HR$Xfz(pepLOd&sb#Lg`*FNE85d!lo> zgBR#Ik=A_wFn`fg*z>}(cU`lC<sg8qqAr6R+rw+45cl>F><ebY5FD8eySi~du;KBd znz`7w_eL*+$Yge?5@cdKz2fR1o3w97nritl{3a1$A~BDkJ>v<{cfU+FRE7E<w#0il zNRYoN6OK}Pm;Sb5dN)Yda)uF_tHSv<xP?-RpB2N4D|gv{%f`Bc9N=p+(Y(s<J~I@h zWGEv5xbe-j+Sa%l8uLO`hWAV1BT%_H-Ty?Y`_`Rq;?GoSRPU#f3=uqpx1m9IL1RZs z=wA_BsppXl=jU|S-yw|*jUB5mT(}?}q;D7G@ifR&(>=hGcDbOWprjzHpd_ns*IH3Q wQ&CY<QA0*SK~q6t>q+qU|7XBUh{yA1u>b#ntSh6}Xag=h)Hi!jt?L^7fAM=cB>(^b literal 0 HcmV?d00001 diff --git a/public/icons/icon-128x128.png b/public/icons/icon-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..48d0e2339a60a637b94319c65e8654289b4f4b6c GIT binary patch literal 1329 zcmV-11<v}3P)<h;3K|Lk000e1NJLTq004jh004jp0{{R3^x%>C0002qP)t-s01zMl z|Nj6D8~_Fu01Fxg6ePmN$p8o!Wo~x>2^n*Hg!uURG(b#MUupdO{0J2!4IC;FATIs> z{@dN(0umtr1r+b_@!;a*CNn?_87S=S?pR`MN>yMYFg?=M*UQe)wYk2qw7Hs~re<$= zUubdX=<2(_!=9w6l9``_ijrw^dn`Fc6(TV7_4V=c^R2SBrmV4+ouiMHoQsl~euj;D zf{I&ZZXPQ+87DQ^+ugv!$3;(CLQPmWL{HY)+rGlaqNuHRe}`^&fKXdyK1x+FK1#;P z&4`be_4fDT<mMDxr)~fM1P)0=K~#9!?U~tDA~6s^t1H0}wr1b=O<83XP;hsg`Trjp zKuJQ|I0&cv%tP*DwVvFrBvl1~Mx)VaG#ZUYqtR$I8jVKt-+>muWjt2mKnbI+d3dfa z_PK3Vs;zn;Ot~u#==o*X;a^nmOa{(_o(tmup<lT;1q-eSNXltz5?mHAQg;>uw*`!> z#lUp|BbBD0;J$!S0To9DO4Z9XkCjq#?=s{WNE{XLCFmLibLLfxLm3nt7Wj-&k{L;X zo_Y$L6(Ax^@lhJo2uNHK09we3_>jt`DV`HX8L^}WDJO|ULbS4T1b_}iycq`oGqNH4 zQJi@^@H`%ly#;k8%FIH(J#9^VH>(ITJX3)9M7)?mVD;pNM){2bV!rABC{yFeZXJ$q ztx`Yw*~<P5a$$yN39uVki^2$`w!5n)HAf-w?3Kd?<blC&V~=9Z<Yx)w_65AVKHV{| z4MB2-+w7Z@r16D^4m)QHY9hYKC<4Y!RejCOMu0}7lS(7c&d9)6#4kLGK=eLjNUmWG zhRcRM$vit%0L_w!KOzVL3-8+nE{#JpI{ZWd5|l6cL=Fmg*N<2|Y8>Rj#FGR_Att-g zD?cO<T~VO(lnlhK+QIs?sq9jX{iGM*7E187s2nu&>lXM^rD8S|s+a(LB7MePP8cKc zywqQW@o0gm8Qu`-)UW-9#K*uQ5WQT5&CGnc%phPyF4p1{wj=@#5xikX3uI#(QrZ2A z66>Nxz+a;r*Km#iEGXxR4BFJu%9#^UG{?XqFlA~7sH!J&2X_C6*P7#50#^tYfm`)p zW2Pupno-5;QoKQ)pCj;SS_MKc4Ai#W7h-YyLi$8b7l@8b3KjwX8wCk}6<4mh7hj6_ z@bnBUa)|InAVBSV)+C{3Cf$?e`b2@nQ<nk!OTcU2N^stn^UTi$qP_cSFw7DDDL~rd zpW1r@k)${q9z0UuVsy1;^ge07q%&09weJOF2A=mbko<WDo)dfnNf0h(JzD|$!D*VX zza5pId@hh2DZuZ<X&*6FVC9#$<AiQ_tblsj%V3|G32{;Y!=e|ZB4{^IMT5*q0l<N* zxlBe)QK9<<N4G$|1{IXimyno=;^1rsW)0CLa=TN^yCr$In6m;vhjO3@BB7LWGAqlm zbdF97bdqv>ysp0$(swOoN^Eg(SO9p-Q1JJAAwzQCMaKm&bGV`U^9&pp0Gf^+nkRf5 zTo3@>xi{<xO%YuY04|QbN~11&+W7)C8vzORv}4xoABZoSoy&j(S+{-LlgUpFS4iO) z;>%p{gIpTF5iJBic@aIws^IC=-v{M~W@Y%aj8G0o!r2b|HdROb8D$LP+n;<mf<~j! nXfzs)Mx)VaG#ZUYqdCZ5-SbtG{yBcd00000NkvXXu0mjfakXIe literal 0 HcmV?d00001 diff --git a/public/icons/icon-192x192.png b/public/icons/icon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..938e9b53f6850d97c693b3e3107968fbced5050c GIT binary patch literal 1856 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 literal 0 HcmV?d00001 diff --git a/public/icons/icon-512x512.png b/public/icons/icon-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..21fc108f00294d66855a6c10af022b9d6d0f23b9 GIT binary patch literal 5082 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 literal 0 HcmV?d00001 diff --git a/public/pro_icon.svg b/public/pro_icon.svg new file mode 100644 index 0000000..e075b78 --- /dev/null +++ b/public/pro_icon.svg @@ -0,0 +1,5 @@ +<svg width="42" height="42" xmlns="http://www.w3.org/2000/svg"> + <g> + <path fill="#070707" d="m6.717392,13.773912l5.6,0c2.8,0 4.7,1.9 4.7,4.7c0,2.8 -2,4.7 -4.9,4.7l-2.5,0l0,4.3l-2.9,0l0,-13.7zm2.9,2.2l0,4.9l1.9,0c1.6,0 2.6,-0.9 2.6,-2.4c0,-1.6 -0.9,-2.4 -2.6,-2.4l-1.9,0l0,-0.1zm8.9,11.5l2.7,0l0,-5.7c0,-1.4 0.8,-2.3 2.2,-2.3c0.4,0 0.8,0.1 1,0.2l0,-2.4c-0.2,-0.1 -0.5,-0.1 -0.8,-0.1c-1.2,0 -2.1,0.7 -2.4,2l-0.1,0l0,-1.9l-2.7,0l0,10.2l0.1,0zm11.7,0.1c-3.1,0 -5,-2 -5,-5.3c0,-3.3 2,-5.3 5,-5.3s5,2 5,5.3c0,3.4 -1.9,5.3 -5,5.3zm0,-2.1c1.4,0 2.2,-1.1 2.2,-3.2c0,-2 -0.8,-3.2 -2.2,-3.2c-1.4,0 -2.2,1.2 -2.2,3.2c0,2.1 0.8,3.2 2.2,3.2z" class="st0" id="Ant-Design-Pro"/> + </g> +</svg> \ No newline at end of file -- GitLab From 7f7e2ac18c17d454d0aee44704cb0536694081a1 Mon Sep 17 00:00:00 2001 From: victor-liu <victorliu1999@gmail.com> Date: Tue, 5 Jan 2021 11:34:06 +1100 Subject: [PATCH 04/18] add global files --- src/global.less | 54 +++++++++++++++++++++++++++ src/global.tsx | 85 +++++++++++++++++++++++++++++++++++++++++++ src/manifest.json | 22 +++++++++++ src/service-worker.js | 70 +++++++++++++++++++++++++++++++++++ src/typings.d.ts | 38 +++++++++++++++++++ 5 files changed, 269 insertions(+) create mode 100644 src/global.less create mode 100644 src/global.tsx create mode 100644 src/manifest.json create mode 100644 src/service-worker.js create mode 100644 src/typings.d.ts diff --git a/src/global.less b/src/global.less new file mode 100644 index 0000000..1b51401 --- /dev/null +++ b/src/global.less @@ -0,0 +1,54 @@ +@import '~antd/es/style/themes/default.less'; + +html, +body, +#root { + height: 100%; +} + +.colorWeak { + filter: invert(80%); +} + +.ant-layout { + min-height: 100vh; +} + +canvas { + display: block; +} + +body { + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +ul, +ol { + list-style: none; +} + +@media (max-width: @screen-xs) { + .ant-table { + width: 100%; + overflow-x: auto; + &-thead > tr, + &-tbody > tr { + > th, + > td { + white-space: pre; + > span { + display: block; + } + } + } + } +} + +// 兼容IE11 +@media screen and(-ms-high-contrast: active), (-ms-high-contrast: none) { + body .ant-design-pro > .ant-layout { + min-height: 100vh; + } +} diff --git a/src/global.tsx b/src/global.tsx new file mode 100644 index 0000000..5e35503 --- /dev/null +++ b/src/global.tsx @@ -0,0 +1,85 @@ +import { Button, message, notification } from 'antd'; + +import React from 'react'; +import { useIntl } from 'umi'; +import defaultSettings from '../config/defaultSettings'; + +const { pwa } = defaultSettings; +const isHttps = document.location.protocol === 'https:'; + +// if pwa is true +if (pwa) { + // Notify user if offline now + window.addEventListener('sw.offline', () => { + message.warning(useIntl().formatMessage({ id: 'app.pwa.offline' })); + }); + + // Pop up a prompt on the page asking the user if they want to use the latest version + window.addEventListener('sw.updated', (event: Event) => { + const e = event as CustomEvent; + const reloadSW = async () => { + // Check if there is sw whose state is waiting in ServiceWorkerRegistration + // https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration + const worker = e.detail && e.detail.waiting; + if (!worker) { + return true; + } + // Send skip-waiting event to waiting SW with MessageChannel + await new Promise((resolve, reject) => { + const channel = new MessageChannel(); + channel.port1.onmessage = (msgEvent) => { + if (msgEvent.data.error) { + reject(msgEvent.data.error); + } else { + resolve(msgEvent.data); + } + }; + worker.postMessage({ type: 'skip-waiting' }, [channel.port2]); + }); + // Refresh current page to use the updated HTML and other assets after SW has skiped waiting + window.location.reload(true); + return true; + }; + const key = `open${Date.now()}`; + const btn = ( + <Button + type="primary" + onClick={() => { + notification.close(key); + reloadSW(); + }} + > + {useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated.ok' })} + </Button> + ); + notification.open({ + message: useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated' }), + description: useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated.hint' }), + btn, + key, + onClose: async () => {}, + }); + }); +} else if ('serviceWorker' in navigator && isHttps) { + // unregister service worker + const { serviceWorker } = navigator; + if (serviceWorker.getRegistrations) { + serviceWorker.getRegistrations().then((sws) => { + sws.forEach((sw) => { + sw.unregister(); + }); + }); + } + serviceWorker.getRegistration().then((sw) => { + if (sw) sw.unregister(); + }); + + // remove all caches + if (window.caches && window.caches.keys) { + caches.keys().then((keys) => { + keys.forEach((key) => { + caches.delete(key); + }); + }); + } +} diff --git a/src/manifest.json b/src/manifest.json new file mode 100644 index 0000000..9e30e7d --- /dev/null +++ b/src/manifest.json @@ -0,0 +1,22 @@ +{ + "name": "Ant Mobile", + "short_name": "Ant Mobile", + "display": "standalone", + "start_url": "./?utm_source=homescreen", + "theme_color": "#002140", + "background_color": "#001529", + "icons": [ + { + "src": "icons/icon-192x192.png", + "sizes": "192x192" + }, + { + "src": "icons/icon-128x128.png", + "sizes": "128x128" + }, + { + "src": "icons/icon-512x512.png", + "sizes": "512x512" + } + ] +} diff --git a/src/service-worker.js b/src/service-worker.js new file mode 100644 index 0000000..03b3d51 --- /dev/null +++ b/src/service-worker.js @@ -0,0 +1,70 @@ +/* eslint-disable eslint-comments/disable-enable-pair */ +/* eslint-disable no-restricted-globals */ +/* eslint-disable no-underscore-dangle */ +/* globals workbox */ +workbox.core.setCacheNameDetails({ + prefix: 'antd-pro', + suffix: 'v1', +}); +// Control all opened tabs ASAP +workbox.clientsClaim(); + +/** + * Use precaching list generated by workbox in build process. + * https://developers.google.com/web/tools/workbox/reference-docs/latest/workbox.precaching + */ +workbox.precaching.precacheAndRoute(self.__precacheManifest || []); + +/** + * Register a navigation route. + * https://developers.google.com/web/tools/workbox/modules/workbox-routing#how_to_register_a_navigation_route + */ +workbox.routing.registerNavigationRoute('/index.html'); + +/** + * Use runtime cache: + * https://developers.google.com/web/tools/workbox/reference-docs/latest/workbox.routing#.registerRoute + * + * Workbox provides all common caching strategies including CacheFirst, NetworkFirst etc. + * https://developers.google.com/web/tools/workbox/reference-docs/latest/workbox.strategies + */ + +/** + * Handle API requests + */ +workbox.routing.registerRoute(/\/api\//, workbox.strategies.networkFirst()); + +/** + * Handle third party requests + */ +workbox.routing.registerRoute( + /^https:\/\/gw\.alipayobjects\.com\//, + workbox.strategies.networkFirst(), +); +workbox.routing.registerRoute( + /^https:\/\/cdnjs\.cloudflare\.com\//, + workbox.strategies.networkFirst(), +); +workbox.routing.registerRoute(/\/color.less/, workbox.strategies.networkFirst()); + +/** + * Response to client after skipping waiting with MessageChannel + */ +addEventListener('message', (event) => { + const replyPort = event.ports[0]; + const message = event.data; + if (replyPort && message && message.type === 'skip-waiting') { + event.waitUntil( + self.skipWaiting().then( + () => + replyPort.postMessage({ + error: null, + }), + (error) => + replyPort.postMessage({ + error, + }), + ), + ); + } +}); diff --git a/src/typings.d.ts b/src/typings.d.ts new file mode 100644 index 0000000..eb1d955 --- /dev/null +++ b/src/typings.d.ts @@ -0,0 +1,38 @@ +declare module 'slash2'; +declare module '*.css'; +declare module '*.less'; +declare module '*.scss'; +declare module '*.sass'; +declare module '*.svg'; +declare module '*.png'; +declare module '*.jpg'; +declare module '*.jpeg'; +declare module '*.gif'; +declare module '*.bmp'; +declare module '*.tiff'; +declare module 'omit.js'; + +// google analytics interface +interface GAFieldsObject { + eventCategory: string; + eventAction: string; + eventLabel?: string; + eventValue?: number; + nonInteraction?: boolean; +} +interface Window { + ga: ( + command: 'send', + hitType: 'event' | 'pageview', + fieldsObject: GAFieldsObject | string, + ) => void; + reloadAuthorized: () => void; +} + +declare let ga: Function; + +// preview.pro.ant.design only do not use in your production ; +// preview.pro.ant.design 专用环境å˜é‡ï¼Œè¯·ä¸è¦åœ¨ä½ 的项目ä¸ä½¿ç”¨å®ƒã€‚ +declare let ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION: 'site' | undefined; + +declare const REACT_APP_ENV: 'test' | 'dev' | 'pre' | false; -- GitLab From 0efd4445bb63323d5714c54343447781a3dde3db Mon Sep 17 00:00:00 2001 From: victor-liu <victorliu1999@gmail.com> Date: Tue, 5 Jan 2021 11:34:24 +1100 Subject: [PATCH 05/18] added assets file --- src/assets/joideaGroupLogo.svg | 1 + src/assets/logo.svg | 1 + src/assets/longLogo.svg | 36 ++++++++++++++++ src/assets/user/maskBackground.svg | 69 ++++++++++++++++++++++++++++++ 4 files changed, 107 insertions(+) create mode 100644 src/assets/joideaGroupLogo.svg create mode 100644 src/assets/logo.svg create mode 100644 src/assets/longLogo.svg create mode 100644 src/assets/user/maskBackground.svg diff --git a/src/assets/joideaGroupLogo.svg b/src/assets/joideaGroupLogo.svg new file mode 100644 index 0000000..b7e3ead --- /dev/null +++ b/src/assets/joideaGroupLogo.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 63.91 28.24"><defs><style>.cls-1{fill:#8fc640;}.cls-2{fill:#2799a1;}.cls-3{fill:#edc82a;}.cls-4{fill:#d45f5f;}.cls-5{fill:#73a942;}.cls-6{fill:#a24d8e;}.cls-7{fill:#8c8c8c;}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M59.18,3.14h-.93v3a.62.62,0,0,1-.11.39.41.41,0,0,1-.31.12.41.41,0,0,1-.3-.12.57.57,0,0,1-.12-.39v-3h-.92a.47.47,0,0,1-.32-.09.34.34,0,0,1-.11-.25.33.33,0,0,1,.11-.26.49.49,0,0,1,.32-.09h2.69a.49.49,0,0,1,.32.09.35.35,0,0,1,.11.26.34.34,0,0,1-.11.25A.49.49,0,0,1,59.18,3.14Z"/><path class="cls-1" d="M61.33,6l-.67-2.66V6.21a.53.53,0,0,1-.1.36.38.38,0,0,1-.29.12A.39.39,0,0,1,60,6.58a.54.54,0,0,1-.11-.37V2.91A.41.41,0,0,1,60,2.54a.69.69,0,0,1,.38-.09h.26a1,1,0,0,1,.35,0,.33.33,0,0,1,.16.15,3.34,3.34,0,0,1,.11.36l.61,2.29L62.51,3a3.34,3.34,0,0,1,.11-.36.33.33,0,0,1,.16-.15,1,1,0,0,1,.34,0h.27a.69.69,0,0,1,.38.09c.1.06.14.19.14.37v3.3a.53.53,0,0,1-.1.36.37.37,0,0,1-.29.12.38.38,0,0,1-.28-.12.53.53,0,0,1-.1-.36V3.33L62.47,6c0,.18-.08.3-.11.38a.54.54,0,0,1-.15.22.45.45,0,0,1-.31.1.45.45,0,0,1-.41-.22.92.92,0,0,1-.09-.23c0-.08,0-.16-.07-.25"/><path class="cls-2" d="M32.07,5.75a.65.65,0,0,1-.18.44.62.62,0,0,1-.44.18A.6.6,0,0,1,31,6.19a.65.65,0,0,1-.18-.44A.67.67,0,0,1,31,5.31a.65.65,0,0,1,.44-.18.62.62,0,0,1,.43.18.63.63,0,0,1,.19.44"/><path class="cls-3" d="M30.11,6a.59.59,0,0,1-.05.23.58.58,0,0,1-.13.2.66.66,0,0,1-.2.14.69.69,0,0,1-.24.05.66.66,0,0,1-.35-.11.56.56,0,0,1-.22-.28.6.6,0,0,1,0-.35.62.62,0,0,1,.49-.49.69.69,0,0,1,.35,0,.63.63,0,0,1,.28.23A.61.61,0,0,1,30.11,6Z"/><path class="cls-4" d="M28.19,7a.6.6,0,0,1-.18.42.63.63,0,0,1-.43.17.61.61,0,0,1-.43-.17A.57.57,0,0,1,27,7a.61.61,0,0,1,0-.24.56.56,0,0,1,.14-.2.6.6,0,0,1,.2-.14.61.61,0,0,1,.24,0,.59.59,0,0,1,.23,0,.6.6,0,0,1,.2.14.56.56,0,0,1,.14.2A.61.61,0,0,1,28.19,7Z"/><path class="cls-5" d="M32.79,6a.62.62,0,0,0,.18.43.61.61,0,0,0,.44.19.63.63,0,0,0,.44-.19A.62.62,0,0,0,34,6a.65.65,0,0,0-.18-.44.62.62,0,0,0-.44-.18.61.61,0,0,0-.62.62"/><path class="cls-6" d="M34.7,7a.67.67,0,0,0,0,.24.6.6,0,0,0,.14.21.48.48,0,0,0,.2.14.69.69,0,0,0,.24,0,.64.64,0,0,0,.24,0,.6.6,0,0,0,.21-.14.57.57,0,0,0,.13-.21.67.67,0,0,0,0-.24.63.63,0,0,0-.18-.44.6.6,0,0,0-.44-.18.59.59,0,0,0-.23,0,.6.6,0,0,0-.2.14.56.56,0,0,0-.14.2.6.6,0,0,0,0,.24"/><path class="cls-1" d="M32,14.83h-.91l-.19-6.16h1.29Z"/><path class="cls-1" d="M25.53,9.49a2.1,2.1,0,0,0-1.21.36,2.22,2.22,0,0,0-.81,1,2.16,2.16,0,0,0-.13,1.26A2.22,2.22,0,0,0,24,13.21a2.31,2.31,0,0,0,1.12.6,2.18,2.18,0,0,0,2.24-.92,2.18,2.18,0,0,0-1.8-3.4Zm0,5.26a3.07,3.07,0,0,1-2.85-1.9,3,3,0,0,1-.18-1.78,3.09,3.09,0,0,1,.84-1.58,3,3,0,0,1,1.58-.84,3.08,3.08,0,1,1,.61,6.1Z"/><path class="cls-1" d="M37.51,9.5a2.25,2.25,0,0,0-1.21.36,2.13,2.13,0,0,0-.8,1,2.18,2.18,0,0,0-.12,1.26A2.15,2.15,0,0,0,36,13.21a2.27,2.27,0,0,0,1.12.6,2.2,2.2,0,0,0,2.23-.93,2.17,2.17,0,0,0,.36-1.21A2.15,2.15,0,0,0,37.51,9.5Zm0,5.25a3.1,3.1,0,0,1-1.43-.37,2.91,2.91,0,0,1-1.1-1A3,3,0,0,1,34.47,12a3,3,0,0,1,.2-1.47,3,3,0,0,1,.85-1.2,3.1,3.1,0,0,1,2.8-.63,3.07,3.07,0,0,1,1.3.71V4.24h.91V14.65h-.91v-.73a3.13,3.13,0,0,1-2.11.83"/><path class="cls-1" d="M43.46,10.84h4.08a2.22,2.22,0,0,0-4.08,0Zm2,3.92a3,3,0,0,1-3.08-3.09A3,3,0,0,1,45.5,8.59a2.92,2.92,0,0,1,3.08,3v.18H43.32a2.08,2.08,0,0,0,2.18,2.13,2.06,2.06,0,0,0,1.93-1.09l.08-.14.82.37-.09.17a2.89,2.89,0,0,1-2.74,1.59"/><path class="cls-1" d="M53.19,9.5A2.25,2.25,0,0,0,52,9.86a2.13,2.13,0,0,0-.8,1,2.1,2.1,0,0,0-.12,1.26,2.15,2.15,0,0,0,.59,1.11,2.28,2.28,0,0,0,1.11.6A2.17,2.17,0,0,0,54,13.68a2.13,2.13,0,0,0,1-.8,2.17,2.17,0,0,0,.36-1.21A2.15,2.15,0,0,0,53.19,9.5Zm0,5.25a3.09,3.09,0,0,1-1.43-.36A3.08,3.08,0,0,1,50.14,12a3,3,0,0,1,.19-1.46,3.11,3.11,0,0,1,.84-1.21,3.17,3.17,0,0,1,1.31-.68A3.09,3.09,0,0,1,54,8.7a3.05,3.05,0,0,1,1.29.69V8.68h.92v6h-.92V14A3,3,0,0,1,53.19,14.75Z"/><path class="cls-1" d="M19.89,7.51a.32.32,0,0,1-.14,0c-.33-.07-.5-.23-.5-.48a1.14,1.14,0,0,1,.44-.75,1.5,1.5,0,0,1,.72-.51h.09a.89.89,0,0,1,.29.08A.56.56,0,0,1,21,6a.42.42,0,0,1,.08.18.44.44,0,0,1,0,.2,1.42,1.42,0,0,1-.5.74,1.09,1.09,0,0,1-.69.36Zm-2.48,6.57C10.74,15.5,2.57,18.49,1.05,22.37a3,3,0,0,0,.42,2.79,5.86,5.86,0,0,0,4.77,2.35h.25c2.57-.1,5.07-2.07,7.42-5.85a39.13,39.13,0,0,0,3.51-7.58ZM6.19,28.24A6.77,6.77,0,0,1,.73,25.33a3.7,3.7,0,0,1-.46-3.57c.86-2,3.55-3.91,8-5.66a57.22,57.22,0,0,1,9.39-2.74A26.71,26.71,0,0,0,18.92,9l0,0V8.87c0-.35.51-.67.75-.76l.21,0a.63.63,0,0,1,.19,0,.57.57,0,0,1,.16.11.51.51,0,0,1,.09.16.37.37,0,0,1,0,.18,1.09,1.09,0,0,1-.21.48c-.14.39-.39,1.16-.64,1.91s-.5,1.56-.74,2.23a30,30,0,0,1,4.44-.39,8,8,0,0,1,1.29.08,1.78,1.78,0,0,1,1.13.94,1,1,0,0,1,.12.48,1,1,0,0,1-.12.48,2.88,2.88,0,0,1-.91,1l-.21.17a.68.68,0,0,1-.37.18.28.28,0,0,1-.13,0,.43.43,0,0,1-.09-.1c-.07-.18.06-.34.19-.47A3.27,3.27,0,0,0,25,14.25a.52.52,0,0,0,0-.45.71.71,0,0,0-.55-.23c-.29,0-.7-.05-1.2-.05a26,26,0,0,0-4.71.4,39.51,39.51,0,0,1-4.17,8.79C12,26.18,9.36,28,6.55,28.22H6.19"/><path class="cls-7" d="M38.58,19.33a1.78,1.78,0,0,1,.12-.65,1.74,1.74,0,0,1,.34-.55,1.52,1.52,0,0,1,.52-.38,1.49,1.49,0,0,1,.67-.14,2,2,0,0,1,.62.09,2.3,2.3,0,0,1,.52.26.23.23,0,0,1,.09.19.21.21,0,0,1-.07.16.2.2,0,0,1-.15.06.23.23,0,0,1-.14,0,1.34,1.34,0,0,0-.4-.19,1.44,1.44,0,0,0-.46-.08,1.09,1.09,0,0,0-.48.11,1.19,1.19,0,0,0-.39.27,1.29,1.29,0,0,0-.34.88,1.21,1.21,0,0,0,.15.6,1.08,1.08,0,0,0,.41.41,1.28,1.28,0,0,0,.63.15,1.58,1.58,0,0,0,.38,0l.36-.08v-.78h-.69a.22.22,0,0,1-.17-.07.21.21,0,0,1-.06-.16.25.25,0,0,1,.06-.16.25.25,0,0,1,.17-.06h.92a.21.21,0,0,1,.22.22v1.16h0a.19.19,0,0,1,0,.12.25.25,0,0,1-.1.08,3.37,3.37,0,0,1-.48.15,2,2,0,0,1-.56.07,1.7,1.7,0,0,1-.85-.21,1.47,1.47,0,0,1-.59-.57A1.63,1.63,0,0,1,38.58,19.33Z"/><path class="cls-7" d="M45,20.75a.25.25,0,0,1-.06.16.22.22,0,0,1-.14.06.14.14,0,0,1-.11,0,.23.23,0,0,1-.07-.06,1.91,1.91,0,0,1-.36-.33,2.19,2.19,0,0,1-.26-.41,1,1,0,0,0-.19-.3.51.51,0,0,0-.23-.15.89.89,0,0,0-.35-.05H43v1.11h0a.21.21,0,0,1-.07.16.22.22,0,0,1-.16.07.23.23,0,0,1-.16-.08.24.24,0,0,1-.06-.17V17.88a.2.2,0,0,1,.07-.16.21.21,0,0,1,.15-.07h.66a1.94,1.94,0,0,1,.7.12,1,1,0,0,1,.48.34.88.88,0,0,1,.18.57.79.79,0,0,1-.09.38,1,1,0,0,1-.23.29,1.5,1.5,0,0,1-.32.19,1.24,1.24,0,0,1,.16.24,4.54,4.54,0,0,0,.25.45,1.52,1.52,0,0,0,.33.34.19.19,0,0,1,.07.08A.17.17,0,0,1,45,20.75Zm-1.55-2.64H43v1.08h.44a1.58,1.58,0,0,0,.65-.13.41.41,0,0,0,.24-.39.44.44,0,0,0-.25-.42A1.25,1.25,0,0,0,43.44,18.11Z"/><path class="cls-7" d="M47.57,17.62a1.53,1.53,0,0,1,.64.13,1.61,1.61,0,0,1,.84.91,1.78,1.78,0,0,1,.12.65,1.75,1.75,0,0,1-.12.65,1.69,1.69,0,0,1-.33.53,1.57,1.57,0,0,1-.51.36,1.67,1.67,0,0,1-1.29,0,1.57,1.57,0,0,1-.51-.36,1.64,1.64,0,0,1-.32-.54A1.75,1.75,0,0,1,46,19.3a1.72,1.72,0,0,1,.46-1.18,1.47,1.47,0,0,1,1.14-.5Zm0,.46a1.08,1.08,0,0,0-.6.17,1.15,1.15,0,0,0-.4.47,1.32,1.32,0,0,0-.15.62,1.13,1.13,0,0,0,.09.45,1.52,1.52,0,0,0,.24.38,1.34,1.34,0,0,0,.37.25.92.92,0,0,0,.44.1,1,1,0,0,0,.44-.1,1.37,1.37,0,0,0,.37-.26,1.39,1.39,0,0,0,.25-.38,1.06,1.06,0,0,0,.09-.42,1.31,1.31,0,0,0-.16-.65,1.21,1.21,0,0,0-.41-.46A1,1,0,0,0,47.58,18.08Z"/><path class="cls-7" d="M50.2,17.88a.25.25,0,0,1,.06-.16.22.22,0,0,1,.15-.06.23.23,0,0,1,.17.05.21.21,0,0,1,.07.17l0,1.64a1.36,1.36,0,0,0,.2.78.7.7,0,0,0,.64.28.93.93,0,0,0,.53-.13.74.74,0,0,0,.29-.36,1.44,1.44,0,0,0,.09-.53V17.88h0a.18.18,0,0,1,.07-.15.19.19,0,0,1,.16-.07.24.24,0,0,1,.23.22h0v1.68a1.61,1.61,0,0,1-.34,1.08,1.3,1.3,0,0,1-2.17-.33,2.12,2.12,0,0,1-.15-.78V17.88Z"/><path class="cls-7" d="M54.19,21a.23.23,0,0,1-.16-.06.21.21,0,0,1-.07-.16h0V17.88a.3.3,0,0,1,0-.14.21.21,0,0,1,.17-.08h.72a1.64,1.64,0,0,1,.6.11.89.89,0,0,1,.43.33.88.88,0,0,1,.16.55,1.06,1.06,0,0,1-.16.62,1,1,0,0,1-.47.34,1.69,1.69,0,0,1-.66.12h-.39v1h0a.24.24,0,0,1-.07.16A.25.25,0,0,1,54.19,21Zm1.45-2.31a.46.46,0,0,0-.2-.41,1.11,1.11,0,0,0-.56-.12h-.47v1.16h.38a1.35,1.35,0,0,0,.63-.13A.52.52,0,0,0,55.64,18.64Z"/><path class="cls-7" d="M.69,4.15h.36V3a1,1,0,0,0,.6.25c.5,0,.94-.43.94-1.17S2.29,1,1.73,1a1.16,1.16,0,0,0-.7.3H1l0-.25H.69ZM1.59,3a.89.89,0,0,1-.54-.22V1.62a.9.9,0,0,1,.59-.3c.41,0,.57.32.57.8S2,3,1.59,3Zm2,.31A1.17,1.17,0,0,0,4.33,3h0l0,.26h.3V1.9c0-.54-.22-.89-.75-.89a1.62,1.62,0,0,0-.86.28l.15.25a1.24,1.24,0,0,1,.65-.23c.36,0,.45.27.45.55C3.38,2,3,2.2,3,2.67A.59.59,0,0,0,3.61,3.29ZM3.71,3a.33.33,0,0,1-.38-.35c0-.28.25-.46,1-.55v.61A.89.89,0,0,1,3.71,3Zm1.66.24h.36V1.84c.14-.37.37-.5.55-.5a.46.46,0,0,1,.21,0l.07-.32A.43.43,0,0,0,6.33,1a.74.74,0,0,0-.62.45h0l0-.4h-.3Zm2.23,0A1.35,1.35,0,0,0,8,3.21l-.07-.27A1,1,0,0,1,7.68,3c-.25,0-.34-.15-.34-.42V1.36h.59v-.3H7.34V.45H7l0,.61-.34,0v.28H7v1.2C7,3,7.14,3.29,7.6,3.29Zm2.56,0a1,1,0,0,0,1-1.14,1,1,0,1,0-2,0A1,1,0,0,0,10.16,3.29Zm0-.31c-.37,0-.62-.33-.62-.83s.25-.84.62-.84.64.34.64.84S10.54,3,10.16,3Zm1.65.26h.36V1.36h.46v-.3h-.46V.72c0-.28.1-.43.31-.43a.57.57,0,0,1,.24.06L12.8.07A1,1,0,0,0,12.44,0c-.43,0-.63.28-.63.72v.34l-.3,0v.28h.3Z"/></g></g></svg> \ No newline at end of file diff --git a/src/assets/logo.svg b/src/assets/logo.svg new file mode 100644 index 0000000..239bf69 --- /dev/null +++ b/src/assets/logo.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200" version="1.1" viewBox="0 0 200 200"><title>Group 28 Copy 5</title><desc>Created with Sketch.</desc><defs><linearGradient id="linearGradient-1" x1="62.102%" x2="108.197%" y1="0%" y2="37.864%"><stop offset="0%" stop-color="#4285EB"/><stop offset="100%" stop-color="#2EC7FF"/></linearGradient><linearGradient id="linearGradient-2" x1="69.644%" x2="54.043%" y1="0%" y2="108.457%"><stop offset="0%" stop-color="#29CDFF"/><stop offset="37.86%" stop-color="#148EFF"/><stop offset="100%" stop-color="#0A60FF"/></linearGradient><linearGradient id="linearGradient-3" x1="69.691%" x2="16.723%" y1="-12.974%" y2="117.391%"><stop offset="0%" stop-color="#FA816E"/><stop offset="41.473%" stop-color="#F74A5C"/><stop offset="100%" stop-color="#F51D2C"/></linearGradient><linearGradient id="linearGradient-4" x1="68.128%" x2="30.44%" y1="-35.691%" y2="114.943%"><stop offset="0%" stop-color="#FA8E7D"/><stop offset="51.264%" stop-color="#F74A5C"/><stop offset="100%" stop-color="#F51D2C"/></linearGradient></defs><g id="Page-1" fill="none" fill-rule="evenodd" stroke="none" stroke-width="1"><g id="logo" transform="translate(-20.000000, -20.000000)"><g id="Group-28-Copy-5" transform="translate(20.000000, 20.000000)"><g id="Group-27-Copy-3"><g id="Group-25" fill-rule="nonzero"><g id="2"><path id="Shape" fill="url(#linearGradient-1)" d="M91.5880863,4.17652823 L4.17996544,91.5127728 C-0.519240605,96.2081146 -0.519240605,103.791885 4.17996544,108.487227 L91.5880863,195.823472 C96.2872923,200.518814 103.877304,200.518814 108.57651,195.823472 L145.225487,159.204632 C149.433969,154.999611 149.433969,148.181924 145.225487,143.976903 C141.017005,139.771881 134.193707,139.771881 129.985225,143.976903 L102.20193,171.737352 C101.032305,172.906015 99.2571609,172.906015 98.0875359,171.737352 L28.285908,101.993122 C27.1162831,100.824459 27.1162831,99.050775 28.285908,97.8821118 L98.0875359,28.1378823 C99.2571609,26.9692191 101.032305,26.9692191 102.20193,28.1378823 L129.985225,55.8983314 C134.193707,60.1033528 141.017005,60.1033528 145.225487,55.8983314 C149.433969,51.69331 149.433969,44.8756232 145.225487,40.6706018 L108.58055,4.05574592 C103.862049,-0.537986846 96.2692618,-0.500797906 91.5880863,4.17652823 Z"/><path id="Shape" fill="url(#linearGradient-2)" d="M91.5880863,4.17652823 L4.17996544,91.5127728 C-0.519240605,96.2081146 -0.519240605,103.791885 4.17996544,108.487227 L91.5880863,195.823472 C96.2872923,200.518814 103.877304,200.518814 108.57651,195.823472 L145.225487,159.204632 C149.433969,154.999611 149.433969,148.181924 145.225487,143.976903 C141.017005,139.771881 134.193707,139.771881 129.985225,143.976903 L102.20193,171.737352 C101.032305,172.906015 99.2571609,172.906015 98.0875359,171.737352 L28.285908,101.993122 C27.1162831,100.824459 27.1162831,99.050775 28.285908,97.8821118 L98.0875359,28.1378823 C100.999864,25.6271836 105.751642,20.541824 112.729652,19.3524487 C117.915585,18.4685261 123.585219,20.4140239 129.738554,25.1889424 C125.624663,21.0784292 118.571995,14.0340304 108.58055,4.05574592 C103.862049,-0.537986846 96.2692618,-0.500797906 91.5880863,4.17652823 Z"/></g><path id="Shape" fill="url(#linearGradient-3)" d="M153.685633,135.854579 C157.894115,140.0596 164.717412,140.0596 168.925894,135.854579 L195.959977,108.842726 C200.659183,104.147384 200.659183,96.5636133 195.960527,91.8688194 L168.690777,64.7181159 C164.472332,60.5180858 157.646868,60.5241425 153.435895,64.7316526 C149.227413,68.936674 149.227413,75.7543607 153.435895,79.9593821 L171.854035,98.3623765 C173.02366,99.5310396 173.02366,101.304724 171.854035,102.473387 L153.685633,120.626849 C149.47715,124.83187 149.47715,131.649557 153.685633,135.854579 Z"/></g><ellipse id="Combined-Shape" cx="100.519" cy="100.437" fill="url(#linearGradient-4)" rx="23.6" ry="23.581"/></g></g></g></g></svg> \ No newline at end of file diff --git a/src/assets/longLogo.svg b/src/assets/longLogo.svg new file mode 100644 index 0000000..ad67806 --- /dev/null +++ b/src/assets/longLogo.svg @@ -0,0 +1,36 @@ +<svg width="245" height="70" viewBox="0 0 245 70" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M32.4764 6.25299L6.25401 32.4539C4.84425 33.8625 4.84425 36.1376 6.25401 37.5462L32.4764 63.7471C33.8862 65.1557 36.1632 65.1557 37.573 63.7471L48.5677 52.7614C49.8302 51.4999 49.8302 49.4546 48.5677 48.1931C47.3051 46.9316 45.2581 46.9316 43.9956 48.1931L35.6606 56.5212C35.3097 56.8718 34.7772 56.8718 34.4263 56.5212L13.4858 35.598C13.1349 35.2474 13.1349 34.7153 13.4858 34.3647L34.4263 13.4414C34.7772 13.0908 35.3097 13.0908 35.6606 13.4414L43.9956 21.7695C45.2581 23.031 47.3051 23.031 48.5677 21.7695C49.8302 20.508 49.8302 18.4627 48.5677 17.2012L37.5742 6.21676C36.1586 4.83864 33.8808 4.84979 32.4764 6.25299Z" fill="url(#paint0_linear)"/> +<path d="M32.4764 6.25299L6.25401 32.4539C4.84425 33.8625 4.84425 36.1376 6.25401 37.5462L32.4764 63.7471C33.8862 65.1557 36.1632 65.1557 37.573 63.7471L48.5677 52.7614C49.8302 51.4999 49.8302 49.4546 48.5677 48.1931C47.3051 46.9316 45.2581 46.9316 43.9956 48.1931L35.6606 56.5212C35.3097 56.8718 34.7772 56.8718 34.4263 56.5212L13.4858 35.598C13.1349 35.2474 13.1349 34.7153 13.4858 34.3647L34.4263 13.4414C35.3 12.6882 36.7255 11.1626 38.8189 10.8058C40.3747 10.5406 42.0756 11.1242 43.9216 12.5567C42.6874 11.3236 40.5716 9.21024 37.5742 6.21676C36.1586 4.83864 33.8808 4.84979 32.4764 6.25299Z" fill="url(#paint1_linear)"/> +<path d="M51.1057 45.7564C52.3682 47.0179 54.4152 47.0179 55.6778 45.7564L63.788 37.6529C65.1978 36.2443 65.1978 33.9692 63.7882 32.5607L55.6072 24.4155C54.3417 23.1555 52.2941 23.1573 51.0308 24.4196C49.7682 25.6811 49.7682 27.7264 51.0308 28.9879L56.5562 34.5088C56.9071 34.8594 56.9071 35.3915 56.5562 35.7421L51.1057 41.1881C49.8431 42.4496 49.8431 44.4949 51.1057 45.7564Z" fill="url(#paint2_linear)"/> +<path d="M35.1558 42.2053C39.066 42.2053 42.2359 39.038 42.2359 35.131C42.2359 31.224 39.066 28.0568 35.1558 28.0568C31.2456 28.0568 28.0758 31.224 28.0758 35.131C28.0758 39.038 31.2456 42.2053 35.1558 42.2053Z" fill="url(#paint3_linear)"/> +<path d="M93.19 21.32L85 42.74H88.75L90.7 37.37H99.67L101.62 42.74H105.37L97.18 21.32H93.19ZM91.75 34.49L95.14 25.1H95.26L98.62 34.49H91.75Z" fill="#262626"/> +<path d="M115.171 26.81C114.241 26.81 113.401 26.99 112.621 27.38C111.871 27.74 111.181 28.31 110.581 29.03V27.23H107.161V42.74H110.581V33.41C110.701 32.18 111.121 31.22 111.841 30.56C112.471 29.96 113.221 29.66 114.061 29.66C116.401 29.66 117.571 30.92 117.571 33.47V42.74H120.991V33.17C120.991 28.91 119.041 26.81 115.171 26.81Z" fill="#262626"/> +<path d="M129.453 22.22L126.033 23.63V27.23H123.243V30.05H126.033V38.81C126.033 40.07 126.333 41 126.933 41.66C127.563 42.38 128.553 42.74 129.903 42.74H132.513V39.92H130.473C130.113 39.92 129.873 39.83 129.693 39.65C129.513 39.44 129.453 39.17 129.453 38.81V30.05H132.903V27.23H129.453V22.22Z" fill="#262626"/> +<path d="M145.752 21.32V42.74H153.582C157.062 42.74 159.672 41.78 161.472 39.86C163.182 38.03 164.052 35.42 164.052 32.03C164.052 28.61 163.182 26 161.472 24.2C159.672 22.28 157.062 21.32 153.582 21.32H145.752ZM149.262 24.32H152.922C155.592 24.32 157.542 24.92 158.772 26.15C159.972 27.35 160.572 29.33 160.572 32.03C160.572 34.67 159.972 36.62 158.772 37.88C157.542 39.11 155.592 39.74 152.922 39.74H149.262V24.32Z" fill="#262626"/> +<path d="M173.644 26.81C171.334 26.81 169.504 27.59 168.184 29.18C166.804 30.74 166.144 32.66 166.144 34.97C166.144 37.55 166.864 39.56 168.304 41.03C169.654 42.44 171.484 43.16 173.794 43.16C175.864 43.16 177.574 42.56 178.954 41.39C180.034 40.43 180.754 39.2 181.114 37.76H177.694C177.274 38.63 176.824 39.26 176.314 39.65C175.654 40.13 174.814 40.37 173.764 40.37C172.534 40.37 171.574 39.98 170.914 39.23C170.254 38.48 169.864 37.37 169.744 35.93H181.354C181.354 33.14 180.724 30.95 179.494 29.39C178.144 27.65 176.194 26.81 173.644 26.81ZM173.734 29.6C176.134 29.6 177.484 30.83 177.784 33.35H169.804C170.014 32.12 170.434 31.19 171.064 30.56C171.724 29.9 172.594 29.6 173.734 29.6Z" fill="#262626"/> +<path d="M189.916 26.81C187.996 26.81 186.466 27.2 185.296 28.04C184.096 28.82 183.526 29.93 183.526 31.37C183.526 32.72 184.126 33.77 185.326 34.52C186.076 35 187.366 35.45 189.196 35.87C190.756 36.23 191.776 36.5 192.256 36.74C193.156 37.16 193.606 37.73 193.606 38.45C193.606 39.71 192.406 40.37 190.006 40.37C188.866 40.37 188.056 40.16 187.546 39.8C187.036 39.38 186.676 38.69 186.496 37.7H183.166C183.496 41.33 185.806 43.16 190.126 43.16C194.776 43.16 197.116 41.51 197.116 38.21C197.116 36.83 196.486 35.72 195.256 34.94C194.416 34.37 193.096 33.89 191.356 33.47C189.796 33.08 188.776 32.78 188.266 32.57C187.426 32.21 187.036 31.76 187.036 31.28C187.036 30.68 187.276 30.26 187.816 29.99C188.266 29.72 188.956 29.6 189.856 29.6C190.906 29.6 191.686 29.75 192.196 30.08C192.676 30.38 193.036 30.95 193.276 31.73H196.606C196.246 28.43 193.996 26.81 189.916 26.81Z" fill="#262626"/> +<path d="M202.137 20.9C201.477 20.9 200.937 21.11 200.487 21.53C200.037 21.95 199.827 22.49 199.827 23.15C199.827 23.81 200.037 24.35 200.487 24.8C200.937 25.22 201.477 25.43 202.137 25.43C202.797 25.43 203.337 25.22 203.787 24.8C204.237 24.38 204.477 23.81 204.477 23.15C204.477 22.49 204.237 21.95 203.817 21.53C203.367 21.11 202.797 20.9 202.137 20.9ZM200.427 27.23V42.74H203.847V27.23H200.427Z" fill="#262626"/> +<path d="M214.539 26.81C212.439 26.81 210.729 27.53 209.439 28.97C208.119 30.41 207.489 32.3 207.489 34.64C207.489 36.98 208.119 38.87 209.439 40.28C210.729 41.66 212.439 42.38 214.539 42.38C216.459 42.38 217.989 41.57 219.129 39.98V42.26C219.129 45.02 217.839 46.4 215.259 46.4C214.059 46.4 213.189 46.22 212.649 45.89C212.079 45.53 211.719 44.93 211.539 44.06H208.119C208.419 45.8 209.139 47.06 210.279 47.9C211.419 48.68 213.069 49.1 215.259 49.1C220.119 49.1 222.549 46.64 222.549 41.75V27.23H219.129V29.12C217.989 27.56 216.459 26.81 214.539 26.81ZM215.079 29.57C216.369 29.57 217.389 30.02 218.109 30.92C218.799 31.82 219.159 33.05 219.159 34.64C219.159 36.2 218.799 37.4 218.109 38.3C217.389 39.14 216.369 39.59 215.049 39.59C213.549 39.59 212.499 39.08 211.839 38.09C211.269 37.25 210.999 36.11 210.999 34.64C210.999 33.02 211.359 31.79 212.079 30.92C212.799 30.02 213.789 29.57 215.079 29.57Z" fill="#262626"/> +<path d="M234.146 26.81C233.216 26.81 232.376 26.99 231.596 27.38C230.846 27.74 230.156 28.31 229.556 29.03V27.23H226.136V42.74H229.556V33.41C229.676 32.18 230.096 31.22 230.816 30.56C231.446 29.96 232.196 29.66 233.036 29.66C235.376 29.66 236.546 30.92 236.546 33.47V42.74H239.966V33.17C239.966 28.91 238.016 26.81 234.146 26.81Z" fill="#262626"/> +<defs> +<linearGradient id="paint0_linear" x1="32.7191" y1="5.1918" x2="57.6381" y2="20.4094" gradientUnits="userSpaceOnUse"> +<stop stop-color="#4285EB"/> +<stop offset="1" stop-color="#2EC7FF"/> +</linearGradient> +<linearGradient id="paint1_linear" x1="36.0615" y1="5.1918" x2="23.7538" y2="68.8011" gradientUnits="userSpaceOnUse"> +<stop stop-color="#29CDFF"/> +<stop offset="0.378601" stop-color="#148EFF"/> +<stop offset="1" stop-color="#0A60FF"/> +</linearGradient> +<linearGradient id="paint2_linear" x1="60.3713" y1="20.4576" x2="44.3571" y2="45.5025" gradientUnits="userSpaceOnUse"> +<stop stop-color="#FA816E"/> +<stop offset="0.414726" stop-color="#F74A5C"/> +<stop offset="1" stop-color="#F51D2C"/> +</linearGradient> +<linearGradient id="paint3_linear" x1="37.7228" y1="23.0071" x2="32.3944" y2="44.3215" gradientUnits="userSpaceOnUse"> +<stop stop-color="#FA8E7D"/> +<stop offset="0.512635" stop-color="#F74A5C"/> +<stop offset="1" stop-color="#F51D2C"/> +</linearGradient> +</defs> +</svg> diff --git a/src/assets/user/maskBackground.svg b/src/assets/user/maskBackground.svg new file mode 100644 index 0000000..89c2597 --- /dev/null +++ b/src/assets/user/maskBackground.svg @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="1361px" height="609px" viewBox="0 0 1361 609" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch --> + <title>Group 21</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="账户密ç 登录-æ ¡éªŒ" transform="translate(-79.000000, -82.000000)"> + <g id="Group-21" transform="translate(77.000000, 73.000000)"> + <g id="Group-18" opacity="0.8" transform="translate(74.901416, 569.699158) rotate(-7.000000) translate(-74.901416, -569.699158) translate(4.901416, 525.199158)"> + <ellipse id="Oval-11" fill="#CFDAE6" opacity="0.25" cx="63.5748792" cy="32.468367" rx="21.7830479" ry="21.766008"></ellipse> + <ellipse id="Oval-3" fill="#CFDAE6" opacity="0.599999964" cx="5.98746479" cy="13.8668601" rx="5.2173913" ry="5.21330997"></ellipse> + <path d="M38.1354514,88.3520215 C43.8984227,88.3520215 48.570234,83.6838647 48.570234,77.9254015 C48.570234,72.1669383 43.8984227,67.4987816 38.1354514,67.4987816 C32.3724801,67.4987816 27.7006688,72.1669383 27.7006688,77.9254015 C27.7006688,83.6838647 32.3724801,88.3520215 38.1354514,88.3520215 Z" id="Oval-3-Copy" fill="#CFDAE6" opacity="0.45"></path> + <path d="M64.2775582,33.1704963 L119.185836,16.5654915" id="Path-12" stroke="#CFDAE6" stroke-width="1.73913043" stroke-linecap="round" stroke-linejoin="round"></path> + <path d="M42.1431708,26.5002681 L7.71190162,14.5640702" id="Path-16" stroke="#E0B4B7" stroke-width="0.702678964" opacity="0.7" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"></path> + <path d="M63.9262187,33.521561 L43.6721326,69.3250951" id="Path-15" stroke="#BACAD9" stroke-width="0.702678964" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"></path> + <g id="Group-17" transform="translate(126.850922, 13.543654) rotate(30.000000) translate(-126.850922, -13.543654) translate(117.285705, 4.381889)" fill="#CFDAE6"> + <ellipse id="Oval-4" opacity="0.45" cx="9.13482653" cy="9.12768076" rx="9.13482653" ry="9.12768076"></ellipse> + <path d="M18.2696531,18.2553615 C18.2696531,13.2142826 14.1798519,9.12768076 9.13482653,9.12768076 C4.08980114,9.12768076 0,13.2142826 0,18.2553615 L18.2696531,18.2553615 Z" id="Oval-4" transform="translate(9.134827, 13.691521) scale(-1, -1) translate(-9.134827, -13.691521) "></path> + </g> + </g> + <g id="Group-14" transform="translate(216.294700, 123.725600) rotate(-5.000000) translate(-216.294700, -123.725600) translate(106.294700, 35.225600)"> + <ellipse id="Oval-2" fill="#CFDAE6" opacity="0.25" cx="29.1176471" cy="29.1402439" rx="29.1176471" ry="29.1402439"></ellipse> + <ellipse id="Oval-2" fill="#CFDAE6" opacity="0.3" cx="29.1176471" cy="29.1402439" rx="21.5686275" ry="21.5853659"></ellipse> + <ellipse id="Oval-2-Copy" stroke="#CFDAE6" opacity="0.4" cx="179.019608" cy="138.146341" rx="23.7254902" ry="23.7439024"></ellipse> + <ellipse id="Oval-2" fill="#BACAD9" opacity="0.5" cx="29.1176471" cy="29.1402439" rx="10.7843137" ry="10.7926829"></ellipse> + <path d="M29.1176471,39.9329268 L29.1176471,18.347561 C23.1616351,18.347561 18.3333333,23.1796097 18.3333333,29.1402439 C18.3333333,35.1008781 23.1616351,39.9329268 29.1176471,39.9329268 Z" id="Oval-2" fill="#BACAD9"></path> + <g id="Group-9" opacity="0.45" transform="translate(172.000000, 131.000000)" fill="#E6A1A6"> + <ellipse id="Oval-2-Copy-2" cx="7.01960784" cy="7.14634146" rx="6.47058824" ry="6.47560976"></ellipse> + <path d="M0.549019608,13.6219512 C4.12262681,13.6219512 7.01960784,10.722722 7.01960784,7.14634146 C7.01960784,3.56996095 4.12262681,0.670731707 0.549019608,0.670731707 L0.549019608,13.6219512 Z" id="Oval-2-Copy-2" transform="translate(3.784314, 7.146341) scale(-1, 1) translate(-3.784314, -7.146341) "></path> + </g> + <ellipse id="Oval-10" fill="#CFDAE6" cx="218.382353" cy="138.685976" rx="1.61764706" ry="1.61890244"></ellipse> + <ellipse id="Oval-10-Copy-2" fill="#E0B4B7" opacity="0.35" cx="179.558824" cy="175.381098" rx="1.61764706" ry="1.61890244"></ellipse> + <ellipse id="Oval-10-Copy" fill="#E0B4B7" opacity="0.35" cx="180.098039" cy="102.530488" rx="2.15686275" ry="2.15853659"></ellipse> + <path d="M28.9985381,29.9671598 L171.151018,132.876024" id="Path-11" stroke="#CFDAE6" opacity="0.8"></path> + </g> + <g id="Group-10" opacity="0.799999952" transform="translate(1054.100635, 36.659317) rotate(-11.000000) translate(-1054.100635, -36.659317) translate(1026.600635, 4.659317)"> + <ellipse id="Oval-7" stroke="#CFDAE6" stroke-width="0.941176471" cx="43.8135593" cy="32" rx="11.1864407" ry="11.2941176"></ellipse> + <g id="Group-12" transform="translate(34.596774, 23.111111)" fill="#BACAD9"> + <ellipse id="Oval-7" opacity="0.45" cx="9.18534718" cy="8.88888889" rx="8.47457627" ry="8.55614973"></ellipse> + <path d="M9.18534718,17.4450386 C13.8657264,17.4450386 17.6599235,13.6143199 17.6599235,8.88888889 C17.6599235,4.16345787 13.8657264,0.332739156 9.18534718,0.332739156 L9.18534718,17.4450386 Z" id="Oval-7"></path> + </g> + <path d="M34.6597385,24.809694 L5.71666084,4.76878945" id="Path-2" stroke="#CFDAE6" stroke-width="0.941176471"></path> + <ellipse id="Oval" stroke="#CFDAE6" stroke-width="0.941176471" cx="3.26271186" cy="3.29411765" rx="3.26271186" ry="3.29411765"></ellipse> + <ellipse id="Oval-Copy" fill="#F7E1AD" cx="2.79661017" cy="61.1764706" rx="2.79661017" ry="2.82352941"></ellipse> + <path d="M34.6312443,39.2922712 L5.06366663,59.785082" id="Path-10" stroke="#CFDAE6" stroke-width="0.941176471"></path> + </g> + <g id="Group-19" opacity="0.33" transform="translate(1282.537219, 446.502867) rotate(-10.000000) translate(-1282.537219, -446.502867) translate(1142.537219, 327.502867)"> + <g id="Group-17" transform="translate(141.333539, 104.502742) rotate(275.000000) translate(-141.333539, -104.502742) translate(129.333539, 92.502742)" fill="#BACAD9"> + <circle id="Oval-4" opacity="0.45" cx="11.6666667" cy="11.6666667" r="11.6666667"></circle> + <path d="M23.3333333,23.3333333 C23.3333333,16.8900113 18.1099887,11.6666667 11.6666667,11.6666667 C5.22334459,11.6666667 0,16.8900113 0,23.3333333 L23.3333333,23.3333333 Z" id="Oval-4" transform="translate(11.666667, 17.500000) scale(-1, -1) translate(-11.666667, -17.500000) "></path> + </g> + <circle id="Oval-5-Copy-6" fill="#CFDAE6" cx="201.833333" cy="87.5" r="5.83333333"></circle> + <path d="M143.5,88.8126685 L155.070501,17.6038544" id="Path-17" stroke="#BACAD9" stroke-width="1.16666667"></path> + <path d="M17.5,37.3333333 L127.466252,97.6449735" id="Path-18" stroke="#BACAD9" stroke-width="1.16666667"></path> + <polyline id="Path-19" stroke="#CFDAE6" stroke-width="1.16666667" points="143.902597 120.302281 174.935455 231.571342 38.5 147.510847 126.366941 110.833333"></polyline> + <path d="M159.833333,99.7453842 L195.416667,89.25" id="Path-20" stroke="#E0B4B7" stroke-width="1.16666667" opacity="0.6"></path> + <path d="M205.333333,82.1372105 L238.719406,36.1666667" id="Path-24" stroke="#BACAD9" stroke-width="1.16666667"></path> + <path d="M266.723424,132.231988 L207.083333,90.4166667" id="Path-25" stroke="#CFDAE6" stroke-width="1.16666667"></path> + <circle id="Oval-5" fill="#C1D1E0" cx="156.916667" cy="8.75" r="8.75"></circle> + <circle id="Oval-5-Copy-3" fill="#C1D1E0" cx="39.0833333" cy="148.75" r="5.25"></circle> + <circle id="Oval-5-Copy-2" fill-opacity="0.6" fill="#D1DEED" cx="8.75" cy="33.25" r="8.75"></circle> + <circle id="Oval-5-Copy-4" fill-opacity="0.6" fill="#D1DEED" cx="243.833333" cy="30.3333333" r="5.83333333"></circle> + <circle id="Oval-5-Copy-5" fill="#E0B4B7" cx="175.583333" cy="232.75" r="5.25"></circle> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file -- GitLab From 68848f5899d98e6f7326089edc75872754ae4080 Mon Sep 17 00:00:00 2001 From: victor-liu <victorliu1999@gmail.com> Date: Tue, 5 Jan 2021 11:35:03 +1100 Subject: [PATCH 06/18] added authorized components --- src/components/Authorized/Authorized.tsx | 35 +++++++ src/components/Authorized/AuthorizedRoute.tsx | 33 +++++++ .../Authorized/CheckPermissions.tsx | 79 ++++++++++++++++ src/components/Authorized/PromiseRender.tsx | 93 +++++++++++++++++++ src/components/Authorized/Secured.tsx | 66 +++++++++++++ src/components/Authorized/index.tsx | 11 +++ src/components/Authorized/renderAuthorize.ts | 30 ++++++ 7 files changed, 347 insertions(+) create mode 100644 src/components/Authorized/Authorized.tsx create mode 100644 src/components/Authorized/AuthorizedRoute.tsx create mode 100644 src/components/Authorized/CheckPermissions.tsx create mode 100644 src/components/Authorized/PromiseRender.tsx create mode 100644 src/components/Authorized/Secured.tsx create mode 100644 src/components/Authorized/index.tsx create mode 100644 src/components/Authorized/renderAuthorize.ts diff --git a/src/components/Authorized/Authorized.tsx b/src/components/Authorized/Authorized.tsx new file mode 100644 index 0000000..d91b7b5 --- /dev/null +++ b/src/components/Authorized/Authorized.tsx @@ -0,0 +1,35 @@ +import React from 'react'; +import { Result } from 'antd'; +import check, { IAuthorityType } from './CheckPermissions'; + +import AuthorizedRoute from './AuthorizedRoute'; +import Secured from './Secured'; + +interface AuthorizedProps { + authority: IAuthorityType; + noMatch?: React.ReactNode; +} + +type IAuthorizedType = React.FunctionComponent<AuthorizedProps> & { + Secured: typeof Secured; + check: typeof check; + AuthorizedRoute: typeof AuthorizedRoute; +}; + +const Authorized: React.FunctionComponent<AuthorizedProps> = ({ + children, + authority, + noMatch = ( + <Result + status="403" + title="403" + subTitle="Sorry, you are not authorized to access this page." + /> + ), +}) => { + const childrenRender: React.ReactNode = typeof children === 'undefined' ? null : children; + const dom = check(authority, childrenRender, noMatch); + return <>{dom}</>; +}; + +export default Authorized as IAuthorizedType; diff --git a/src/components/Authorized/AuthorizedRoute.tsx b/src/components/Authorized/AuthorizedRoute.tsx new file mode 100644 index 0000000..c2eb08e --- /dev/null +++ b/src/components/Authorized/AuthorizedRoute.tsx @@ -0,0 +1,33 @@ +import { Redirect, Route } from 'umi'; + +import React from 'react'; +import Authorized from './Authorized'; +import { IAuthorityType } from './CheckPermissions'; + +interface AuthorizedRouteProps { + currentAuthority: string; + component: React.ComponentClass<any, any>; + render: (props: any) => React.ReactNode; + redirectPath: string; + authority: IAuthorityType; +} + +const AuthorizedRoute: React.SFC<AuthorizedRouteProps> = ({ + component: Component, + render, + authority, + redirectPath, + ...rest +}) => ( + <Authorized + authority={authority} + noMatch={<Route {...rest} render={() => <Redirect to={{ pathname: redirectPath }} />} />} + > + <Route + {...rest} + render={(props: any) => (Component ? <Component {...props} /> : render(props))} + /> + </Authorized> +); + +export default AuthorizedRoute; diff --git a/src/components/Authorized/CheckPermissions.tsx b/src/components/Authorized/CheckPermissions.tsx new file mode 100644 index 0000000..887bcc1 --- /dev/null +++ b/src/components/Authorized/CheckPermissions.tsx @@ -0,0 +1,79 @@ +import React from 'react'; +import { CURRENT } from './renderAuthorize'; +// eslint-disable-next-line import/no-cycle +import PromiseRender from './PromiseRender'; + +export type IAuthorityType = + | undefined + | string + | string[] + | Promise<boolean> + | ((currentAuthority: string | string[]) => IAuthorityType); + +/** + * 通用æƒé™æ£€æŸ¥æ–¹æ³• + * Common check permissions method + * @param { æƒé™åˆ¤å®š | Permission judgment } authority + * @param { ä½ çš„æƒé™ | Your permission description } currentAuthority + * @param { 通过的组件 | Passing components } target + * @param { 未通过的组件 | no pass components } Exception + */ +const checkPermissions = <T, K>( + authority: IAuthorityType, + currentAuthority: string | string[], + target: T, + Exception: K, +): T | K | React.ReactNode => { + // 没有判定æƒé™.默认查看所有 + // Retirement authority, return target; + if (!authority) { + return target; + } + // æ•°ç»„å¤„ç† + if (Array.isArray(authority)) { + if (Array.isArray(currentAuthority)) { + if (currentAuthority.some((item) => authority.includes(item))) { + return target; + } + } else if (authority.includes(currentAuthority)) { + return target; + } + return Exception; + } + // string å¤„ç† + if (typeof authority === 'string') { + if (Array.isArray(currentAuthority)) { + if (currentAuthority.some((item) => authority === item)) { + return target; + } + } else if (authority === currentAuthority) { + return target; + } + return Exception; + } + // Promise å¤„ç† + if (authority instanceof Promise) { + return <PromiseRender<T, K> ok={target} error={Exception} promise={authority} />; + } + // Function å¤„ç† + if (typeof authority === 'function') { + const bool = authority(currentAuthority); + // 函数执行åŽè¿”回值是 Promise + if (bool instanceof Promise) { + return <PromiseRender<T, K> ok={target} error={Exception} promise={bool} />; + } + if (bool) { + return target; + } + return Exception; + } + throw new Error('unsupported parameters'); +}; + +export { checkPermissions }; + +function check<T, K>(authority: IAuthorityType, target: T, Exception: K): T | K | React.ReactNode { + return checkPermissions<T, K>(authority, CURRENT, target, Exception); +} + +export default check; diff --git a/src/components/Authorized/PromiseRender.tsx b/src/components/Authorized/PromiseRender.tsx new file mode 100644 index 0000000..25f2597 --- /dev/null +++ b/src/components/Authorized/PromiseRender.tsx @@ -0,0 +1,93 @@ +import React from 'react'; +import { Spin } from 'antd'; +import isEqual from 'lodash/isEqual'; +import { isComponentClass } from './Secured'; +// eslint-disable-next-line import/no-cycle + +interface PromiseRenderProps<T, K> { + ok: T; + error: K; + promise: Promise<boolean>; +} + +interface PromiseRenderState { + component: React.ComponentClass | React.FunctionComponent; +} + +export default class PromiseRender<T, K> extends React.Component< + PromiseRenderProps<T, K>, + PromiseRenderState +> { + state: PromiseRenderState = { + component: () => null, + }; + + componentDidMount() { + this.setRenderComponent(this.props); + } + + shouldComponentUpdate = (nextProps: PromiseRenderProps<T, K>, nextState: PromiseRenderState) => { + const { component } = this.state; + if (!isEqual(nextProps, this.props)) { + this.setRenderComponent(nextProps); + } + if (nextState.component !== component) return true; + return false; + }; + + // set render Component : ok or error + setRenderComponent(props: PromiseRenderProps<T, K>) { + const ok = this.checkIsInstantiation(props.ok); + const error = this.checkIsInstantiation(props.error); + props.promise + .then(() => { + this.setState({ + component: ok, + }); + return true; + }) + .catch(() => { + this.setState({ + component: error, + }); + }); + } + + // Determine whether the incoming component has been instantiated + // AuthorizedRoute is already instantiated + // Authorized render is already instantiated, children is no instantiated + // Secured is not instantiated + checkIsInstantiation = ( + target: React.ReactNode | React.ComponentClass, + ): React.FunctionComponent => { + if (isComponentClass(target)) { + const Target = target as React.ComponentClass; + return (props: any) => <Target {...props} />; + } + if (React.isValidElement(target)) { + return (props: any) => React.cloneElement(target, props); + } + return () => target as React.ReactNode & null; + }; + + render() { + const { component: Component } = this.state; + const { ok, error, promise, ...rest } = this.props; + + return Component ? ( + <Component {...rest} /> + ) : ( + <div + style={{ + width: '100%', + height: '100%', + margin: 'auto', + paddingTop: 50, + textAlign: 'center', + }} + > + <Spin size="large" /> + </div> + ); + } +} diff --git a/src/components/Authorized/Secured.tsx b/src/components/Authorized/Secured.tsx new file mode 100644 index 0000000..0bdbbe4 --- /dev/null +++ b/src/components/Authorized/Secured.tsx @@ -0,0 +1,66 @@ +import React from 'react'; +import CheckPermissions from './CheckPermissions'; + +/** + * 默认ä¸èƒ½è®¿é—®ä»»ä½•é¡µé¢ + * default is "NULL" + */ +const Exception403 = () => 403; + +export const isComponentClass = (component: React.ComponentClass | React.ReactNode): boolean => { + if (!component) return false; + const proto = Object.getPrototypeOf(component); + if (proto === React.Component || proto === Function.prototype) return true; + return isComponentClass(proto); +}; + +// Determine whether the incoming component has been instantiated +// AuthorizedRoute is already instantiated +// Authorized render is already instantiated, children is no instantiated +// Secured is not instantiated +const checkIsInstantiation = (target: React.ComponentClass | React.ReactNode) => { + if (isComponentClass(target)) { + const Target = target as React.ComponentClass; + return (props: any) => <Target {...props} />; + } + if (React.isValidElement(target)) { + return (props: any) => React.cloneElement(target, props); + } + return () => target; +}; + +/** + * ç”¨äºŽåˆ¤æ–æ˜¯å¦æ‹¥æœ‰æƒé™è®¿é—®æ¤ view æƒé™ + * authority 支æŒä¼ å…¥ string, () => boolean | Promise + * e.g. 'user' åªæœ‰ user 用户能访问 + * e.g. 'user,admin' user å’Œ admin 都能访问 + * e.g. ()=>boolean 返回true能访问,返回falseä¸èƒ½è®¿é—® + * e.g. Promise then 能访问 catchä¸èƒ½è®¿é—® + * e.g. authority support incoming string, () => boolean | Promise + * e.g. 'user' only user user can access + * e.g. 'user, admin' user and admin can access + * e.g. () => boolean true to be able to visit, return false can not be accessed + * e.g. Promise then can not access the visit to catch + * @param {string | function | Promise} authority + * @param {ReactNode} error éžå¿…éœ€å‚æ•° + */ +const authorize = (authority: string, error?: React.ReactNode) => { + /** + * conversion into a class + * 防æ¢ä¼ å…¥å—符串时找ä¸åˆ°staticContexté€ æˆæŠ¥é”™ + * String parameters can cause staticContext not found error + */ + let classError: boolean | React.FunctionComponent = false; + if (error) { + classError = (() => error) as React.FunctionComponent; + } + if (!authority) { + throw new Error('authority is required'); + } + return function decideAuthority(target: React.ComponentClass | React.ReactNode) { + const component = CheckPermissions(authority, target, classError || Exception403); + return checkIsInstantiation(component); + }; +}; + +export default authorize; diff --git a/src/components/Authorized/index.tsx b/src/components/Authorized/index.tsx new file mode 100644 index 0000000..6703a46 --- /dev/null +++ b/src/components/Authorized/index.tsx @@ -0,0 +1,11 @@ +import Authorized from './Authorized'; +import Secured from './Secured'; +import check from './CheckPermissions'; +import renderAuthorize from './renderAuthorize'; + +Authorized.Secured = Secured; +Authorized.check = check; + +const RenderAuthorize = renderAuthorize(Authorized); + +export default RenderAuthorize; diff --git a/src/components/Authorized/renderAuthorize.ts b/src/components/Authorized/renderAuthorize.ts new file mode 100644 index 0000000..df00875 --- /dev/null +++ b/src/components/Authorized/renderAuthorize.ts @@ -0,0 +1,30 @@ +/* eslint-disable eslint-comments/disable-enable-pair */ +/* eslint-disable import/no-mutable-exports */ +let CURRENT: string | string[] = 'NULL'; + +type CurrentAuthorityType = string | string[] | (() => typeof CURRENT); +/** + * use authority or getAuthority + * @param {string|()=>String} currentAuthority + */ +const renderAuthorize = <T>(Authorized: T): ((currentAuthority: CurrentAuthorityType) => T) => ( + currentAuthority: CurrentAuthorityType, +): T => { + if (currentAuthority) { + if (typeof currentAuthority === 'function') { + CURRENT = currentAuthority(); + } + if ( + Object.prototype.toString.call(currentAuthority) === '[object String]' || + Array.isArray(currentAuthority) + ) { + CURRENT = currentAuthority as string[]; + } + } else { + CURRENT = 'NULL'; + } + return Authorized; +}; + +export { CURRENT }; +export default <T>(Authorized: T) => renderAuthorize<T>(Authorized); -- GitLab From c44145629764374e9941f0aad5b3004b5b065639 Mon Sep 17 00:00:00 2001 From: victor-liu <victorliu1999@gmail.com> Date: Tue, 5 Jan 2021 11:36:33 +1100 Subject: [PATCH 07/18] added global components --- src/components/GlobalFooter/index.tsx | 66 +++++++ src/components/GlobalFooter/style.less | 39 ++++ .../GlobalHeader/AvatarDropdown.tsx | 92 ++++++++++ .../GlobalHeader/NoticeIconView.tsx | 171 ++++++++++++++++++ src/components/GlobalHeader/RightContent.tsx | 47 +++++ src/components/GlobalHeader/index.less | 82 +++++++++ src/components/HeaderAvatar/index.less | 28 +++ src/components/HeaderAvatar/index.tsx | 82 +++++++++ src/components/HeaderDropdown/index.less | 16 ++ src/components/HeaderDropdown/index.tsx | 19 ++ src/components/HeaderSearch/index.less | 30 +++ src/components/HeaderSearch/index.tsx | 105 +++++++++++ src/components/NoticeIcon/NoticeList.less | 103 +++++++++++ src/components/NoticeIcon/NoticeList.tsx | 114 ++++++++++++ src/components/NoticeIcon/index.less | 35 ++++ src/components/NoticeIcon/index.tsx | 135 ++++++++++++++ src/components/PageLoading/index.tsx | 5 + .../PageLoadingWithMargin/index.tsx | 12 ++ .../PageLoadingWithMargin/styles.less | 7 + src/components/SelectLang/index.less | 22 +++ src/components/SelectLang/index.tsx | 79 ++++++++ 21 files changed, 1289 insertions(+) create mode 100644 src/components/GlobalFooter/index.tsx create mode 100644 src/components/GlobalFooter/style.less create mode 100644 src/components/GlobalHeader/AvatarDropdown.tsx create mode 100644 src/components/GlobalHeader/NoticeIconView.tsx create mode 100644 src/components/GlobalHeader/RightContent.tsx create mode 100644 src/components/GlobalHeader/index.less create mode 100644 src/components/HeaderAvatar/index.less create mode 100644 src/components/HeaderAvatar/index.tsx create mode 100644 src/components/HeaderDropdown/index.less create mode 100644 src/components/HeaderDropdown/index.tsx create mode 100644 src/components/HeaderSearch/index.less create mode 100644 src/components/HeaderSearch/index.tsx create mode 100755 src/components/NoticeIcon/NoticeList.less create mode 100644 src/components/NoticeIcon/NoticeList.tsx create mode 100644 src/components/NoticeIcon/index.less create mode 100644 src/components/NoticeIcon/index.tsx create mode 100644 src/components/PageLoading/index.tsx create mode 100644 src/components/PageLoadingWithMargin/index.tsx create mode 100644 src/components/PageLoadingWithMargin/styles.less create mode 100644 src/components/SelectLang/index.less create mode 100644 src/components/SelectLang/index.tsx diff --git a/src/components/GlobalFooter/index.tsx b/src/components/GlobalFooter/index.tsx new file mode 100644 index 0000000..84ed279 --- /dev/null +++ b/src/components/GlobalFooter/index.tsx @@ -0,0 +1,66 @@ +import { DefaultFooter } from '@ant-design/pro-layout'; +import styles from './style.less'; +import React, { useState } from 'react'; +import longLogo from '@/assets/longLogo.svg'; +import { getMapStateToProps } from '@/utils/utils'; +import joideaLogo from '@/assets/joideaGroupLogo.svg'; +import { Button, Modal } from 'antd'; +import { connect } from 'dva'; +import defaultSettings from '../../../config/defaultSettings'; + +const Footer: React.FC<any> = (props: any) => { + const { + helper: { tx }, + } = props; + + const [showModal, setShowModal]: [boolean, any] = useState(false); + const [title, setTitle]: [string, any] = useState(''); + const { projectOwnerUrl, termsAndConditionUrl, privacyPolicyUrl } = defaultSettings; + + const routeToUrl = (url: string) => { + window.location.href = url; + }; + + return ( + <div className={styles.customerizedFooterContainer}> + <DefaultFooter + className={styles.CustomerizedFooter} + links={[ + { + key: 'ANT-DESIGN', + title: <img alt="logo" className={styles.footerPopsupLogo} src={longLogo} />, + href: '/od', + }, + { key: '', title: '|', href: '' }, + { + key: 'JOIDEA', + title: <img alt="logo" className={styles.footerJoideaLogo} src={joideaLogo} />, + href: 'https://joidea.com', + blankTarget: true, + }, + ]} + copyright="Joidea - All Rights Reserved" + /> + + <span className={styles.CustomerizedFooterLinks}> + <Button type="link" onClick={() => routeToUrl(projectOwnerUrl)}> + {'Joidea'} + </Button> + + <Button type="link" onClick={() => routeToUrl(termsAndConditionUrl)}> + {tx('Global.terms_and_condition')} + </Button> + <Button type="link" onClick={() => routeToUrl(privacyPolicyUrl)}> + {tx('Global.privacy_policy')} + </Button> + </span> + + <Modal title={title} visible={showModal} footer={null} onCancel={() => setShowModal(false)}> + {title === 'terms' && <p> {tx('Global.terms_and_condition')}</p>} + {title === 'privacy' && <p> {tx('Global.privacy')}</p>} + </Modal> + </div> + ); +}; + +export default connect(getMapStateToProps([]))(Footer); diff --git a/src/components/GlobalFooter/style.less b/src/components/GlobalFooter/style.less new file mode 100644 index 0000000..45f397c --- /dev/null +++ b/src/components/GlobalFooter/style.less @@ -0,0 +1,39 @@ +@import '~antd/es/style/themes/default.less'; + +.customerizedFooterContainer { + display: flex; + flex-direction: column; + align-items: center; + + .CustomerizedFooter { + background: unset !important; + } + + .CustomerizedFooterLinks { + display: flex; + justify-content: space-between; + button { + color: @primary-color; + } + } + :global { + footer .ant-pro-global-footer-links a { + margin-right: 15px; + } + + .ant-pro-global-footer { + margin-bottom: 0; + } + } +} + +.footerPopsupLogo { + height: 20px; +} +.footerJoideaLogo { + height: 40px; +} + +.registerLayout { + min-width: 368px; +} diff --git a/src/components/GlobalHeader/AvatarDropdown.tsx b/src/components/GlobalHeader/AvatarDropdown.tsx new file mode 100644 index 0000000..f9e4468 --- /dev/null +++ b/src/components/GlobalHeader/AvatarDropdown.tsx @@ -0,0 +1,92 @@ +import { LogoutOutlined, SettingOutlined, UserOutlined } from '@ant-design/icons'; +import { Avatar, Menu, Spin } from 'antd'; +import React from 'react'; +import { history, ConnectProps, connect } from 'umi'; +import { ConnectState } from '@/models/connect'; +import { CurrentUser } from '@/models/user'; +import HeaderDropdown from '../HeaderDropdown'; +import styles from './index.less'; + +export interface GlobalHeaderRightProps extends Partial<ConnectProps> { + currentUser?: CurrentUser; + menu?: boolean; +} + +class AvatarDropdown extends React.Component<GlobalHeaderRightProps> { + onMenuClick = (event: { + key: React.Key; + keyPath: React.Key[]; + item: React.ReactInstance; + domEvent: React.MouseEvent<HTMLElement>; + }) => { + const { key } = event; + + if (key === 'logout') { + const { dispatch } = this.props; + + if (dispatch) { + dispatch({ + type: 'user/clearCurrentUser', + }); + } + + return; + } + + history.push(`/account/${key}`); + }; + + render(): React.ReactNode { + const { + currentUser = { + avatar: '', + name: '', + }, + menu, + } = this.props; + const menuHeaderDropdown = ( + <Menu className={styles.menu} selectedKeys={[]} onClick={this.onMenuClick}> + {menu && ( + <Menu.Item key="center"> + <UserOutlined /> + 个人ä¸å¿ƒ + </Menu.Item> + )} + {menu && ( + <Menu.Item key="settings"> + <SettingOutlined /> + 个人设置 + </Menu.Item> + )} + {menu && <Menu.Divider />} + + <Menu.Item key="logout"> + <LogoutOutlined /> + 退出登录 + </Menu.Item> + </Menu> + ); + return currentUser && currentUser.name ? ( + <HeaderDropdown overlay={menuHeaderDropdown}> + <span className={`${styles.action} ${styles.account}`}> + <Avatar size="small" className={styles.avatar} src={currentUser.avatar} alt="avatar" /> + <span className={`${styles.name} anticon`}>{currentUser.name}</span> + </span> + </HeaderDropdown> + ) : ( + <span className={`${styles.action} ${styles.account}`}> + <Spin + size="small" + style={{ + marginLeft: 8, + marginRight: 8, + }} + /> + </span> + ); + } +} + +export default connect(({ user }: ConnectState) => ({ + currentUser: user.currentUser, +}))(AvatarDropdown); diff --git a/src/components/GlobalHeader/NoticeIconView.tsx b/src/components/GlobalHeader/NoticeIconView.tsx new file mode 100644 index 0000000..825d308 --- /dev/null +++ b/src/components/GlobalHeader/NoticeIconView.tsx @@ -0,0 +1,171 @@ +import React, { Component } from 'react'; +import { connect, ConnectProps } from 'umi'; +import { Tag, message } from 'antd'; +import groupBy from 'lodash/groupBy'; +import moment from 'moment'; +import { NoticeItem } from '@/models/global'; +import { CurrentUser } from '@/models/user'; +import { ConnectState } from '@/models/connect'; +import NoticeIcon from '../NoticeIcon'; +import styles from './index.less'; + +export interface GlobalHeaderRightProps extends Partial<ConnectProps> { + notices?: NoticeItem[]; + currentUser?: CurrentUser; + fetchingNotices?: boolean; + onNoticeVisibleChange?: (visible: boolean) => void; + onNoticeClear?: (tabName?: string) => void; +} + +class GlobalHeaderRight extends Component<GlobalHeaderRightProps> { + componentDidMount() { + const { dispatch } = this.props; + + if (dispatch) { + dispatch({ + type: 'global/fetchNotices', + }); + } + } + + changeReadState = (clickedItem: NoticeItem): void => { + const { id } = clickedItem; + const { dispatch } = this.props; + + if (dispatch) { + dispatch({ + type: 'global/changeNoticeReadState', + payload: id, + }); + } + }; + + handleNoticeClear = (title: string, key: string) => { + const { dispatch } = this.props; + message.success(`${'清空了'} ${title}`); + + if (dispatch) { + dispatch({ + type: 'global/clearNotices', + payload: key, + }); + } + }; + + getNoticeData = (): { + [key: string]: NoticeItem[]; + } => { + const { notices = [] } = this.props; + + if (!notices || notices.length === 0 || !Array.isArray(notices)) { + return {}; + } + + const newNotices = notices.map((notice) => { + const newNotice = { ...notice }; + + if (newNotice.datetime) { + newNotice.datetime = moment(notice.datetime as string).fromNow(); + } + + if (newNotice.id) { + newNotice.key = newNotice.id; + } + + if (newNotice.extra && newNotice.status) { + const color = { + todo: '', + processing: 'blue', + urgent: 'red', + doing: 'gold', + }[newNotice.status]; + newNotice.extra = ( + <Tag + color={color} + style={{ + marginRight: 0, + }} + > + {newNotice.extra} + </Tag> + ); + } + + return newNotice; + }); + return groupBy(newNotices, 'type'); + }; + + getUnreadData = (noticeData: { [key: string]: NoticeItem[] }) => { + const unreadMsg: { + [key: string]: number; + } = {}; + Object.keys(noticeData).forEach((key) => { + const value = noticeData[key]; + + if (!unreadMsg[key]) { + unreadMsg[key] = 0; + } + + if (Array.isArray(value)) { + unreadMsg[key] = value.filter((item) => !item.read).length; + } + }); + return unreadMsg; + }; + + render() { + const { currentUser, fetchingNotices, onNoticeVisibleChange } = this.props; + const noticeData = this.getNoticeData(); + const unreadMsg = this.getUnreadData(noticeData); + return ( + <NoticeIcon + className={styles.action} + count={currentUser && currentUser.unreadCount} + onItemClick={(item) => { + this.changeReadState(item as NoticeItem); + }} + loading={fetchingNotices} + clearText="清空" + viewMoreText="查看更多" + onClear={this.handleNoticeClear} + onPopupVisibleChange={onNoticeVisibleChange} + onViewMore={() => message.info('Click on view more')} + clearClose + > + <NoticeIcon.Tab + tabKey="notification" + count={unreadMsg.notification} + list={noticeData.notification} + title="通知" + emptyText="ä½ å·²æŸ¥çœ‹æ‰€æœ‰é€šçŸ¥" + showViewMore + /> + <NoticeIcon.Tab + tabKey="message" + count={unreadMsg.message} + list={noticeData.message} + title="消æ¯" + emptyText="您已读完所有消æ¯" + showViewMore + /> + <NoticeIcon.Tab + tabKey="event" + title="待办" + emptyText="ä½ å·²å®Œæˆæ‰€æœ‰å¾…办" + count={unreadMsg.event} + list={noticeData.event} + showViewMore + /> + </NoticeIcon> + ); + } +} + +export default connect(({ user, global, loading }: ConnectState) => ({ + currentUser: user.currentUser, + collapsed: global.collapsed, + fetchingMoreNotices: loading.effects['global/fetchMoreNotices'], + fetchingNotices: loading.effects['global/fetchNotices'], + notices: global.notices, +}))(GlobalHeaderRight); diff --git a/src/components/GlobalHeader/RightContent.tsx b/src/components/GlobalHeader/RightContent.tsx new file mode 100644 index 0000000..2d1bfd5 --- /dev/null +++ b/src/components/GlobalHeader/RightContent.tsx @@ -0,0 +1,47 @@ +import { Tooltip, Button, Menu, Dropdown } from 'antd'; +import React, { useState } from 'react'; +import { connect } from 'dva'; +import { formatMessage } from 'umi-plugin-react/locale'; +import { ConnectState } from '@/models/connect'; +import HeaderSearch from '../HeaderSearch'; +import SelectLang from '../SelectLang'; +import styles from './index.less'; +import { getMapStateToProps } from '@/utils/utils'; +import HeaderAvatar from '@/components/HeaderAvatar'; + +const GlobalHeaderRight: React.FC<any> = (props) => { + const { + helper: { tx }, + meta, + od, + dispatch, + } = props; + + // const menu = ( + // <Menu defaultSelectedKeys={[`${editingBusiness.bId}`]} onClick={changeOdBusinessId}> + // {ownedBusiness.map((item: any) => ( + // <Menu.Item key={item.bId}>{item.businessName}</Menu.Item> + // ))} + // </Menu> + // ); + + return ( + <div className={styles.right}> + {/* <Dropdown overlay={menu} placement="bottomRight"> + <Button type="link" className={styles.business}> + {editingBusiness.businessName} + <Icon style={{ marginLeft: '2px' }} type="down" /> + </Button> + </Dropdown> */} + + {/* <Avatar /> */} + <HeaderAvatar modelKey="od" /> + + <span className={styles.action}> + <SelectLang modelKey="od" /> + </span> + </div> + ); +}; + +export default connect(getMapStateToProps(['meta', 'od', 'user']))(GlobalHeaderRight); diff --git a/src/components/GlobalHeader/index.less b/src/components/GlobalHeader/index.less new file mode 100644 index 0000000..a7fa9bf --- /dev/null +++ b/src/components/GlobalHeader/index.less @@ -0,0 +1,82 @@ +@import '~antd/es/style/themes/default.less'; + +@pro-header-hover-bg: rgba(0, 0, 0, 0.025); + +.menu { + :global(.anticon) { + margin-right: 8px; + } + :global(.ant-dropdown-menu-item) { + min-width: 160px; + } +} + +.right { + display: flex; + float: right; + height: 48px; + margin-left: auto; + overflow: hidden; + .action { + display: flex; + align-items: center; + height: 100%; + padding: 0 12px; + cursor: pointer; + transition: all 0.3s; + > span { + vertical-align: middle; + } + &:hover { + background: @pro-header-hover-bg; + } + &:global(.opened) { + background: @pro-header-hover-bg; + } + } + .search { + padding: 0 12px; + &:hover { + background: transparent; + } + } + .account { + .avatar { + margin: ~'calc((@{layout-header-height} - 24px) / 2)' 0; + margin-right: 8px; + color: @primary-color; + vertical-align: top; + background: rgba(255, 255, 255, 0.85); + } + } +} + +.dark { + .action { + color: rgba(255, 255, 255, 0.85); + > span { + color: rgba(255, 255, 255, 0.85); + } + &:hover, + &:global(.opened) { + background: @primary-color; + } + } +} + +:global(.ant-pro-global-header) { + .dark { + .action { + color: @text-color; + > span { + color: @text-color; + } + &:hover { + color: rgba(255, 255, 255, 0.85); + > span { + color: rgba(255, 255, 255, 0.85); + } + } + } + } +} diff --git a/src/components/HeaderAvatar/index.less b/src/components/HeaderAvatar/index.less new file mode 100644 index 0000000..774e987 --- /dev/null +++ b/src/components/HeaderAvatar/index.less @@ -0,0 +1,28 @@ +.removeBorder { + padding: 0; + border-width: 0; +} + +.loginedBtns { + display: flex; + align-items: center; + justify-content: space-between; + min-width: 50px; + height: 100%; + color: @primary-color; +} + +.loginBtns { + display: flex; + align-items: center; + justify-content: space-between; + min-width: 85px; + height: 100%; + color: #737373; +} + +.menuItem { + display: flex; + flex-direction: row-reverse; + font-size: 15px; +} diff --git a/src/components/HeaderAvatar/index.tsx b/src/components/HeaderAvatar/index.tsx new file mode 100644 index 0000000..f7ae0c8 --- /dev/null +++ b/src/components/HeaderAvatar/index.tsx @@ -0,0 +1,82 @@ +import React from 'react'; +import { connect } from 'dva'; +import { getMapStateToProps } from '@/utils/utils'; +import { Menu, Button, Avatar, message } from 'antd'; +import HeaderDropdown from '../HeaderDropdown'; +import styles from './index.less'; +import classNames from 'classnames'; +import { history } from 'umi'; +import { DownOutlined, UserOutlined } from '@ant-design/icons'; + +interface HeaderAvatarProps { + modelKey: any; +} + +const HeaderAvatar: React.FC<HeaderAvatarProps> = (props: any) => { + const { + meta: { + isMobile, + currentUserDetails: { avatar = false }, + }, + user: { currentUser }, + dispatch, + helper: { tx }, + modelKey, + } = props; + + const isLogin = currentUser && currentUser.id ? true : false; + + const isWeb = isMobile ? false : true; + + const loginedClass = classNames(styles.removeBorder, styles.loginedBtns); + + const unLoginClass = classNames(styles.removeBorder, styles.loginBtns); + + const onClickUserProfile = () => { + history.push('/od/dashboard'); + }; + + const toggleSignOut = () => { + if (dispatch) { + dispatch({ + type: 'user/clearCurrentUser', + }); + message.success(tx('Login.already_logged_out')); + } + }; + + const loginMenuDropdown = ( + <Menu> + <Menu.Item key="email" className={styles.menuItem} onClick={onClickUserProfile}> + {currentUser.email} + </Menu.Item> + <Menu.Item key="signOut" className={styles.menuItem} onClick={toggleSignOut}> + {tx('Login.sign_out')} + </Menu.Item> + </Menu> + ); + + if (isLogin) { + return ( + <HeaderDropdown overlay={loginMenuDropdown} placement="bottomRight"> + <Button className={loginedClass}> + <Avatar + src={avatar && avatar.url} + icon={<UserOutlined />} + style={{ backgroundColor: '@primary-color' }} + /> + <DownOutlined /> + </Button> + </HeaderDropdown> + ); + } + + return ( + <Button className={unLoginClass} onClick={() => history.push('/user/login')}> + <Avatar size={32} icon="user" /> + {isWeb && tx('Login.login')} + </Button> + ); +}; + +export default connect(getMapStateToProps(['meta', 'user']))(HeaderAvatar); diff --git a/src/components/HeaderDropdown/index.less b/src/components/HeaderDropdown/index.less new file mode 100644 index 0000000..004b53e --- /dev/null +++ b/src/components/HeaderDropdown/index.less @@ -0,0 +1,16 @@ +@import '~antd/es/style/themes/default.less'; + +.container > * { + background-color: @popover-bg; + border-radius: 4px; + box-shadow: @shadow-1-down; +} + +@media screen and (max-width: @screen-xs) { + .container { + width: 100% !important; + } + .container > * { + border-radius: 0 !important; + } +} diff --git a/src/components/HeaderDropdown/index.tsx b/src/components/HeaderDropdown/index.tsx new file mode 100644 index 0000000..cc60727 --- /dev/null +++ b/src/components/HeaderDropdown/index.tsx @@ -0,0 +1,19 @@ +import { DropDownProps } from 'antd/es/dropdown'; +import { Dropdown } from 'antd'; +import React from 'react'; +import classNames from 'classnames'; +import styles from './index.less'; + +declare type OverlayFunc = () => React.ReactNode; + +export interface HeaderDropdownProps extends Omit<DropDownProps, 'overlay'> { + overlayClassName?: string; + overlay: React.ReactNode | OverlayFunc | any; + placement?: 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topCenter' | 'topRight' | 'bottomCenter'; +} + +const HeaderDropdown: React.FC<HeaderDropdownProps> = ({ overlayClassName: cls, ...restProps }) => ( + <Dropdown overlayClassName={classNames(styles.container, cls)} {...restProps} /> +); + +export default HeaderDropdown; diff --git a/src/components/HeaderSearch/index.less b/src/components/HeaderSearch/index.less new file mode 100644 index 0000000..9af69d5 --- /dev/null +++ b/src/components/HeaderSearch/index.less @@ -0,0 +1,30 @@ +@import '~antd/es/style/themes/default.less'; + +.headerSearch { + .input { + width: 0; + min-width: 0; + overflow: hidden; + background: transparent; + border-radius: 0; + transition: width 0.3s, margin-left 0.3s; + :global(.ant-select-selection) { + background: transparent; + } + input { + padding-right: 0; + padding-left: 0; + border: 0; + box-shadow: none !important; + } + &, + &:hover, + &:focus { + border-bottom: 1px solid @border-color-base; + } + &.show { + width: 210px; + margin-left: 8px; + } + } +} diff --git a/src/components/HeaderSearch/index.tsx b/src/components/HeaderSearch/index.tsx new file mode 100644 index 0000000..290d431 --- /dev/null +++ b/src/components/HeaderSearch/index.tsx @@ -0,0 +1,105 @@ +import { SearchOutlined } from '@ant-design/icons'; +import { AutoComplete, Input } from 'antd'; +import useMergeValue from 'use-merge-value'; +import { AutoCompleteProps } from 'antd/es/auto-complete'; +import React, { useRef } from 'react'; + +import classNames from 'classnames'; +import styles from './index.less'; + +export interface HeaderSearchProps { + onSearch?: (value?: string) => void; + onChange?: (value?: string) => void; + onVisibleChange?: (b: boolean) => void; + className?: string; + placeholder?: string; + options: AutoCompleteProps['options']; + defaultOpen?: boolean; + open?: boolean; + defaultValue?: string; + value?: string; +} + +const HeaderSearch: React.FC<HeaderSearchProps> = (props) => { + const { + className, + defaultValue, + onVisibleChange, + placeholder, + open, + defaultOpen, + ...restProps + } = props; + + const inputRef = useRef<Input | null>(null); + + const [value, setValue] = useMergeValue<string | undefined>(defaultValue, { + value: props.value, + onChange: props.onChange, + }); + + const [searchMode, setSearchMode] = useMergeValue(defaultOpen || false, { + value: props.open, + onChange: onVisibleChange, + }); + + const inputClass = classNames(styles.input, { + [styles.show]: searchMode, + }); + + return ( + <div + className={classNames(className, styles.headerSearch)} + onClick={() => { + setSearchMode(true); + if (searchMode && inputRef.current) { + inputRef.current.focus(); + } + }} + onTransitionEnd={({ propertyName }) => { + if (propertyName === 'width' && !searchMode) { + if (onVisibleChange) { + onVisibleChange(searchMode); + } + } + }} + > + <SearchOutlined + key="Icon" + style={{ + cursor: 'pointer', + }} + /> + <AutoComplete + key="AutoComplete" + className={inputClass} + value={value} + style={{ + height: 28, + marginTop: -6, + }} + options={restProps.options} + onChange={setValue} + > + <Input + ref={inputRef} + defaultValue={defaultValue} + aria-label={placeholder} + placeholder={placeholder} + onKeyDown={(e) => { + if (e.key === 'Enter') { + if (restProps.onSearch) { + restProps.onSearch(value); + } + } + }} + onBlur={() => { + setSearchMode(false); + }} + /> + </AutoComplete> + </div> + ); +}; + +export default HeaderSearch; diff --git a/src/components/NoticeIcon/NoticeList.less b/src/components/NoticeIcon/NoticeList.less new file mode 100755 index 0000000..65e0c40 --- /dev/null +++ b/src/components/NoticeIcon/NoticeList.less @@ -0,0 +1,103 @@ +@import '~antd/es/style/themes/default.less'; + +.list { + max-height: 400px; + overflow: auto; + &::-webkit-scrollbar { + display: none; + } + .item { + padding-right: 24px; + padding-left: 24px; + overflow: hidden; + cursor: pointer; + transition: all 0.3s; + + .meta { + width: 100%; + } + + .avatar { + margin-top: 4px; + background: @component-background; + } + .iconElement { + font-size: 32px; + } + + &.read { + opacity: 0.4; + } + &:last-child { + border-bottom: 0; + } + &:hover { + background: @primary-1; + } + .title { + margin-bottom: 8px; + font-weight: normal; + } + .description { + font-size: 12px; + line-height: @line-height-base; + } + .datetime { + margin-top: 4px; + font-size: 12px; + line-height: @line-height-base; + } + .extra { + float: right; + margin-top: -1.5px; + margin-right: 0; + color: @text-color-secondary; + font-weight: normal; + } + } + .loadMore { + padding: 8px 0; + color: @primary-6; + text-align: center; + cursor: pointer; + &.loadedAll { + color: rgba(0, 0, 0, 0.25); + cursor: unset; + } + } +} + +.notFound { + padding: 73px 0 88px; + color: @text-color-secondary; + text-align: center; + img { + display: inline-block; + height: 76px; + margin-bottom: 16px; + } +} + +.bottomBar { + height: 46px; + color: @text-color; + line-height: 46px; + text-align: center; + border-top: 1px solid @border-color-split; + border-radius: 0 0 @border-radius-base @border-radius-base; + transition: all 0.3s; + div { + display: inline-block; + width: 50%; + cursor: pointer; + transition: all 0.3s; + user-select: none; + + &:only-child { + width: 100%; + } + &:not(:only-child):last-child { + border-left: 1px solid @border-color-split; + } + } +} diff --git a/src/components/NoticeIcon/NoticeList.tsx b/src/components/NoticeIcon/NoticeList.tsx new file mode 100644 index 0000000..7c1b6ab --- /dev/null +++ b/src/components/NoticeIcon/NoticeList.tsx @@ -0,0 +1,114 @@ +import { Avatar, List } from 'antd'; + +import React from 'react'; +import classNames from 'classnames'; +import { NoticeIconData } from './index'; +import styles from './NoticeList.less'; + +export interface NoticeIconTabProps { + count?: number; + name?: string; + showClear?: boolean; + showViewMore?: boolean; + style?: React.CSSProperties; + title: string; + tabKey: string; + data?: NoticeIconData[]; + onClick?: (item: NoticeIconData) => void; + onClear?: () => void; + emptyText?: string; + clearText?: string; + viewMoreText?: string; + list: NoticeIconData[]; + onViewMore?: (e: any) => void; +} +const NoticeList: React.SFC<NoticeIconTabProps> = ({ + data = [], + onClick, + onClear, + title, + onViewMore, + emptyText, + showClear = true, + clearText, + viewMoreText, + showViewMore = false, +}) => { + if (!data || data.length === 0) { + return ( + <div className={styles.notFound}> + <img + src="https://gw.alipayobjects.com/zos/rmsportal/sAuJeJzSKbUmHfBQRzmZ.svg" + alt="not found" + /> + <div>{emptyText}</div> + </div> + ); + } + return ( + <div> + <List<NoticeIconData> + className={styles.list} + dataSource={data} + renderItem={(item, i) => { + const itemCls = classNames(styles.item, { + [styles.read]: item.read, + }); + // eslint-disable-next-line no-nested-ternary + const leftIcon = item.avatar ? ( + typeof item.avatar === 'string' ? ( + <Avatar className={styles.avatar} src={item.avatar} /> + ) : ( + <span className={styles.iconElement}>{item.avatar}</span> + ) + ) : null; + + return ( + <List.Item + className={itemCls} + key={item.key || i} + onClick={() => onClick && onClick(item)} + > + <List.Item.Meta + className={styles.meta} + avatar={leftIcon} + title={ + <div className={styles.title}> + {item.title} + <div className={styles.extra}>{item.extra}</div> + </div> + } + description={ + <div> + <div className={styles.description}>{item.description}</div> + <div className={styles.datetime}>{item.datetime}</div> + </div> + } + /> + </List.Item> + ); + }} + /> + <div className={styles.bottomBar}> + {showClear ? ( + <div onClick={onClear}> + {clearText} {title} + </div> + ) : null} + {showViewMore ? ( + <div + onClick={(e) => { + if (onViewMore) { + onViewMore(e); + } + }} + > + {viewMoreText} + </div> + ) : null} + </div> + </div> + ); +}; + +export default NoticeList; diff --git a/src/components/NoticeIcon/index.less b/src/components/NoticeIcon/index.less new file mode 100644 index 0000000..45251cd --- /dev/null +++ b/src/components/NoticeIcon/index.less @@ -0,0 +1,35 @@ +@import '~antd/es/style/themes/default.less'; + +.popover { + position: relative; + width: 336px; +} + +.noticeButton { + display: inline-block; + cursor: pointer; + transition: all 0.3s; +} +.icon { + padding: 4px; + vertical-align: middle; +} + +.badge { + font-size: 16px; +} + +.tabs { + :global { + .ant-tabs-nav-list { + margin: auto; + } + + .ant-tabs-nav-scroll { + text-align: center; + } + .ant-tabs-bar { + margin-bottom: 0; + } + } +} diff --git a/src/components/NoticeIcon/index.tsx b/src/components/NoticeIcon/index.tsx new file mode 100644 index 0000000..f91740e --- /dev/null +++ b/src/components/NoticeIcon/index.tsx @@ -0,0 +1,135 @@ +import { BellOutlined } from '@ant-design/icons'; +import { Badge, Spin, Tabs } from 'antd'; +import useMergeValue from 'use-merge-value'; +import React from 'react'; +import classNames from 'classnames'; +import NoticeList, { NoticeIconTabProps } from './NoticeList'; + +import HeaderDropdown from '../HeaderDropdown'; +import styles from './index.less'; + +const { TabPane } = Tabs; + +export interface NoticeIconData { + avatar?: string | React.ReactNode; + title?: React.ReactNode; + description?: React.ReactNode; + datetime?: React.ReactNode; + extra?: React.ReactNode; + style?: React.CSSProperties; + key?: string | number; + read?: boolean; +} + +export interface NoticeIconProps { + count?: number; + bell?: React.ReactNode; + className?: string; + loading?: boolean; + onClear?: (tabName: string, tabKey: string) => void; + onItemClick?: (item: NoticeIconData, tabProps: NoticeIconTabProps) => void; + onViewMore?: (tabProps: NoticeIconTabProps, e: MouseEvent) => void; + onTabChange?: (tabTile: string) => void; + style?: React.CSSProperties; + onPopupVisibleChange?: (visible: boolean) => void; + popupVisible?: boolean; + clearText?: string; + viewMoreText?: string; + clearClose?: boolean; + emptyImage?: string; + children: React.ReactElement<NoticeIconTabProps>[]; +} + +const NoticeIcon: React.FC<NoticeIconProps> & { + Tab: typeof NoticeList; +} = (props) => { + const getNotificationBox = (): React.ReactNode => { + const { + children, + loading, + onClear, + onTabChange, + onItemClick, + onViewMore, + clearText, + viewMoreText, + } = props; + if (!children) { + return null; + } + const panes: React.ReactNode[] = []; + React.Children.forEach(children, (child: React.ReactElement<NoticeIconTabProps>): void => { + if (!child) { + return; + } + const { list, title, count, tabKey, showClear, showViewMore } = child.props; + const len = list && list.length ? list.length : 0; + const msgCount = count || count === 0 ? count : len; + const tabTitle: string = msgCount > 0 ? `${title} (${msgCount})` : title; + panes.push( + <TabPane tab={tabTitle} key={tabKey}> + <NoticeList + {...child.props} + clearText={clearText} + viewMoreText={viewMoreText} + data={list} + onClear={(): void => onClear && onClear(title, tabKey)} + onClick={(item): void => onItemClick && onItemClick(item, child.props)} + onViewMore={(event): void => onViewMore && onViewMore(child.props, event)} + showClear={showClear} + showViewMore={showViewMore} + title={title} + /> + </TabPane>, + ); + }); + return ( + <Spin spinning={loading} delay={300}> + <Tabs className={styles.tabs} onChange={onTabChange}> + {panes} + </Tabs> + </Spin> + ); + }; + + const { className, count, bell } = props; + + const [visible, setVisible] = useMergeValue<boolean>(false, { + value: props.popupVisible, + onChange: props.onPopupVisibleChange, + }); + const noticeButtonClass = classNames(className, styles.noticeButton); + const notificationBox = getNotificationBox(); + const NoticeBellIcon = bell || <BellOutlined className={styles.icon} />; + const trigger = ( + <span className={classNames(noticeButtonClass, { opened: visible })}> + <Badge count={count} style={{ boxShadow: 'none' }} className={styles.badge}> + {NoticeBellIcon} + </Badge> + </span> + ); + if (!notificationBox) { + return trigger; + } + + return ( + <HeaderDropdown + placement="bottomRight" + overlay={notificationBox} + overlayClassName={styles.popover} + trigger={['click']} + visible={visible} + onVisibleChange={setVisible} + > + {trigger} + </HeaderDropdown> + ); +}; + +NoticeIcon.defaultProps = { + emptyImage: 'https://gw.alipayobjects.com/zos/rmsportal/wAhyIChODzsoKIOBHcBk.svg', +}; + +NoticeIcon.Tab = NoticeList; + +export default NoticeIcon; diff --git a/src/components/PageLoading/index.tsx b/src/components/PageLoading/index.tsx new file mode 100644 index 0000000..096c58f --- /dev/null +++ b/src/components/PageLoading/index.tsx @@ -0,0 +1,5 @@ +import { PageLoading } from '@ant-design/pro-layout'; + +// loading components from code split +// https://umijs.org/plugin/umi-plugin-react.html#dynamicimport +export default PageLoading; diff --git a/src/components/PageLoadingWithMargin/index.tsx b/src/components/PageLoadingWithMargin/index.tsx new file mode 100644 index 0000000..8ec4d3e --- /dev/null +++ b/src/components/PageLoadingWithMargin/index.tsx @@ -0,0 +1,12 @@ +import { PageLoading as Loading } from '@ant-design/pro-layout'; +import React from 'react'; +import styles from './styles.less'; +// loading components from code split +// https://umijs.org/plugin/umi-plugin-react.html#dynamicimport + +const PageLoadingWithMargin = () => ( + <div className={styles.loadingStyle}> + <Loading /> + </div> +); +export default PageLoadingWithMargin; diff --git a/src/components/PageLoadingWithMargin/styles.less b/src/components/PageLoadingWithMargin/styles.less new file mode 100644 index 0000000..79859d6 --- /dev/null +++ b/src/components/PageLoadingWithMargin/styles.less @@ -0,0 +1,7 @@ +@import '~antd/lib/style/themes/default.less'; + +.loadingStyle { + div { + margin-top: 10vh; + } +} diff --git a/src/components/SelectLang/index.less b/src/components/SelectLang/index.less new file mode 100644 index 0000000..b960b71 --- /dev/null +++ b/src/components/SelectLang/index.less @@ -0,0 +1,22 @@ +@import '~antd/es/style/themes/default.less'; + +.menu { + :global(.anticon) { + margin-right: 8px; + } + :global(.ant-dropdown-menu-item) { + min-width: 160px; + } +} + +.langButton { + display: flex; + align-items: center; + color: white; + background: @primary-color; +} + +.langIcon { + margin-left: 5px; + font-size: 28px; +} diff --git a/src/components/SelectLang/index.tsx b/src/components/SelectLang/index.tsx new file mode 100644 index 0000000..e324327 --- /dev/null +++ b/src/components/SelectLang/index.tsx @@ -0,0 +1,79 @@ +import { Menu, Button, Dropdown } from 'antd'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faLanguage } from '@fortawesome/free-solid-svg-icons'; +import React from 'react'; +import classNames from 'classnames'; +import HeaderDropdown from '../HeaderDropdown'; +import styles from './index.less'; + +import { withRouter } from 'react-router'; +import { getMapStateToProps } from '@/utils/utils'; +import { languageLabels, languageLabel, languageToLocal } from '@/constants/languages'; +import { connect } from 'dva'; +import _ from 'lodash'; + +interface SelectLangProps { + modelKey: any; +} + +const SelectLang: React.FC<SelectLangProps> = (props: any) => { + const { + meta: { + translations: { lang }, + }, + ca: { caConfigs = {} }, + modelKey, + dispatch, + } = props; + + const renderLanguageLabel = + modelKey === 'ca' + ? languageLabel.filter((x: any) => caConfigs.displayLang.includes(x)) + : languageLabel; + + const updateTranslations = (language: string) => { + if (lang === language) { + return; + } + + dispatch({ + type: 'meta/setViewingLang', + viewingLang: language, + }); + + if (modelKey) { + dispatch({ + type: `${modelKey}/fetchMeta`, + reload: 'trans', + }); + } + + //如果是od || caçš„è¯éœ€è¦é‡ç½® + if (modelKey === 'od' || modelKey === 'ca') { + dispatch({ + type: `${modelKey}/setLoadedModule`, + reload: 'view-trans', + }); + } + }; + + const changeLang = ({ key }: any): void => updateTranslations(key); + const langMenu = ( + <Menu className={styles.menu} selectedKeys={[lang]} onClick={changeLang}> + {renderLanguageLabel.map((locale) => ( + <Menu.Item key={locale}>{languageLabels[locale]}</Menu.Item> + ))} + </Menu> + ); + + return ( + <Dropdown overlay={langMenu} placement="bottomRight" trigger={['click']}> + <Button type="link" className={styles.langButton}> + <div>{languageLabels[lang]}</div> + <FontAwesomeIcon icon={faLanguage} className={styles.langIcon} /> + </Button> + </Dropdown> + ); +}; + +export default connect(getMapStateToProps(['meta', 'ca']))(SelectLang); -- GitLab From cbefb6789d2497430395e4991ddeb79c9ba96257 Mon Sep 17 00:00:00 2001 From: victor-liu <victorliu1999@gmail.com> Date: Tue, 5 Jan 2021 11:36:58 +1100 Subject: [PATCH 08/18] added global modal configs --- src/configs/caSettings.ts | 21 ++++++++++++++ src/configs/metaSettings.ts | 55 +++++++++++++++++++++++++++++++++++++ src/configs/odSettings.ts | 37 +++++++++++++++++++++++++ src/configs/userSettings.ts | 22 +++++++++++++++ 4 files changed, 135 insertions(+) create mode 100644 src/configs/caSettings.ts create mode 100644 src/configs/metaSettings.ts create mode 100644 src/configs/odSettings.ts create mode 100644 src/configs/userSettings.ts diff --git a/src/configs/caSettings.ts b/src/configs/caSettings.ts new file mode 100644 index 0000000..6e34616 --- /dev/null +++ b/src/configs/caSettings.ts @@ -0,0 +1,21 @@ +export interface CaSettings { + caId: string; + + loadedModule: { + api: { + caHome: { self: boolean }; + }; + + caHome: boolean; + }; +} + +export default { + loadedModule: { + api: { + caHome: { self: false }, + }, + + caHome: false, + }, +} as CaSettings; diff --git a/src/configs/metaSettings.ts b/src/configs/metaSettings.ts new file mode 100644 index 0000000..31e8772 --- /dev/null +++ b/src/configs/metaSettings.ts @@ -0,0 +1,55 @@ +export interface MetaSettings { + translations: { + [key: string]: any; + }; + + loadedModule: { + api: { + currentUserDetails: boolean; + caConfigs: boolean; + transPkg: { + ca: boolean; + od: boolean; + user: boolean; + }; + }; + ca: boolean; + od: boolean; + user: boolean; + }; + viewingLang: string; + + currentUserDetails: { + firstName: string; + lastName: string; + contactLang: string; + ownedBusiness: any[]; + }; + + loginRedirect: string | false; + isMobile: boolean; + isXs: boolean; +} + +export default { + translations: {}, + loadedModule: { + api: { + currentUserDetails: false, + caConfigs: false, + transPkg: { + ca: false, + od: false, + user: false, + }, + }, + ca: false, + od: false, + user: false, + }, + viewingLang: 'en_AU', + loginRedirect: false, + currentUserDetails: {}, + isMobile: false, + isXs: false, +} as MetaSettings; diff --git a/src/configs/odSettings.ts b/src/configs/odSettings.ts new file mode 100644 index 0000000..5d3adbb --- /dev/null +++ b/src/configs/odSettings.ts @@ -0,0 +1,37 @@ +export interface OdSettings { + layoutCollapsed: boolean; + + reloadAction: { + showActioningMessage: 'unset' | boolean; + spaceName: string; + redirectUrl?: string; + reloadType?: string; + pageModelKey?: string; + }; + + loadedModule: { + api: { + odDashboard: { + self: boolean; + }; + }; + + odDashboard: boolean; + }; +} + +export default { + layoutCollapsed: false, + + reloadAction: { + showActioningMessage: 'unset', + }, + + loadedModule: { + api: { + odDashboard: { + self: false, + }, + }, + }, +} as OdSettings; diff --git a/src/configs/userSettings.ts b/src/configs/userSettings.ts new file mode 100644 index 0000000..256b982 --- /dev/null +++ b/src/configs/userSettings.ts @@ -0,0 +1,22 @@ +export interface UserSettings { + currentUser: + | { + id: number; + email: string; + auth: string; + status: string; + token: any; + tokenReceivedAt: number; + } + | false; + refreshInfo?: + | { + userId: number; + refreshToken: string; + } + | false; +} + +export default { + currentUser: {}, +} as UserSettings; -- GitLab From f0d42330827c7f433a40b1c855f50586354cc37a Mon Sep 17 00:00:00 2001 From: victor-liu <victorliu1999@gmail.com> Date: Tue, 5 Jan 2021 11:37:15 +1100 Subject: [PATCH 09/18] added constants --- src/constants/languages.ts | 94 ++++++++++++++++++++++++++++++ src/constants/routesParams.ts | 1 + src/constants/translationGroups.ts | 75 ++++++++++++++++++++++++ src/constants/validNumberFormat.ts | 3 + 4 files changed, 173 insertions(+) create mode 100644 src/constants/languages.ts create mode 100644 src/constants/routesParams.ts create mode 100644 src/constants/translationGroups.ts create mode 100644 src/constants/validNumberFormat.ts diff --git a/src/constants/languages.ts b/src/constants/languages.ts new file mode 100644 index 0000000..ed5c1e2 --- /dev/null +++ b/src/constants/languages.ts @@ -0,0 +1,94 @@ +export const languageType = [ + { + type: 'en_AU', + text: 'English', + }, + { + type: 'zh_CN', + text: 'ç®€ä½“ä¸æ–‡', + }, + { + type: 'zh_HK', + text: 'ç¹é«”䏿–‡', + }, + { + type: 'ru_RU', + text: 'РуÑÑкий', + }, + { + type: 'ja_JP', + text: '日本語', + }, + { + type: 'fr_FR', + text: 'Français', + }, + { + type: 'de_DE', + text: 'Deutsch', + }, + { + type: 'it_IT', + text: 'Italiano', + }, + { + type: 'es_ES', + text: 'Español', + }, + { + type: 'ko_KR', + text: '한국어', + }, +]; + +export const languageLabel = [ + 'en_AU', + 'zh_CN', + 'zh_HK', + 'ru_RU', + 'ja_JP', + 'fr_FR', + 'de_DE', + 'it_IT', + 'es_ES', + 'ko_KR', +]; + +export const languageToLocal = { + en_AU: 'en-US', + zh_CN: 'zh-CN', + zh_HK: 'zh-TW', + ru_RU: 'ru-RU', + ja_JP: 'ja-JP', + fr_FR: 'fr-FR', + de_DE: 'de-DE', + it_IT: 'it-IT', + es_ES: 'es-ES', + ko_KR: 'ko-KR', +}; + +export const languageLabels = { + en_AU: 'English', + zh_CN: 'ç®€ä½“ä¸æ–‡', + zh_HK: 'ç¹é«”䏿–‡', + ru_RU: 'РуÑÑкий', + ja_JP: '日本語', + fr_FR: 'Français', + de_DE: 'Deutsch', + it_IT: 'Italiano', + es_ES: 'Español', + ko_KR: '한국어', +}; + +// export const languageIcons = { +// 'en-AU': '🇦🇺', +// 'zh-CN': '🇨🇳', +// 'zh-HK': 'ðŸ‡ðŸ‡°', +// 'ru-RU': '🇷🇺', +// 'ja-JP': '🇯🇵', +// 'fr-FR': '🇫🇷', +// 'de-DE': '🇩🇪', +// 'it-IT': '🇮🇹', +// 'es-ES': '🇪🇸', +// 'ko-KR': '🇰🇷', +// } diff --git a/src/constants/routesParams.ts b/src/constants/routesParams.ts new file mode 100644 index 0000000..c1d4530 --- /dev/null +++ b/src/constants/routesParams.ts @@ -0,0 +1 @@ +export const ValidLoginRedirectParams = ['package']; diff --git a/src/constants/translationGroups.ts b/src/constants/translationGroups.ts new file mode 100644 index 0000000..3f47e0f --- /dev/null +++ b/src/constants/translationGroups.ts @@ -0,0 +1,75 @@ +export const metaTranslationOfOdGroups = [ + 'Global', + 'Dashboard', + 'Package', + 'Management_Dish_Grid_View', + 'Management_Dish_Detail', + 'Management_Menu_Grid_View', + 'Management_Menu_Detail', + 'Management_Menu_List_View', + 'Login', + 'Management_Event', + 'Management_Deal', + 'Premium_Service', + 'Settings_Business', + 'Orders_Payments', + 'CA_Cart', + 'CA_Deals', + 'CA_Menus', + 'Contact_POPSUP', + 'Register', + 'Claim_Business', + 'Orders_Payments', + 'Settings_Business_Profile_Setting', +]; + +export const odTranslationGroups = [ + 'Login', + 'Global', + 'Management_Dish_Detail', + 'Management_Menu_Detail', + 'Management_Event', + 'Management_Deal', + 'Settings_Business_Profile_Setting', + 'Package', +]; + +export const metaTranslationOfCaGroups = [ + 'Global', + 'CA_Cart', + 'Orders_Payments', + 'Login', + 'CA_Deals', + 'CA_Menus', + 'CA_Events', + 'Management_Event', + 'CA_Group', + 'CA_Home', + 'CA_Info', + 'CA_Welcome', + 'Management_Event', + 'header', + 'Dashboard', + 'Register', + 'Claim_Business', +]; + +export const metaTranslationOfLandingGroups = [ + 'Global', + 'Orders_Payments', + 'Login', + 'Dashboard', + 'Register', + 'Claim_Business', +]; + +export const metaTranslationOfUserGroups = [ + 'Global', + 'Orders_Payments', + 'Login', + 'Contact_POPSUP', + 'Dashboard', + 'Settings_Business_Profile_Setting', + 'Register', + 'Claim_Business', +]; diff --git a/src/constants/validNumberFormat.ts b/src/constants/validNumberFormat.ts new file mode 100644 index 0000000..b8a821a --- /dev/null +++ b/src/constants/validNumberFormat.ts @@ -0,0 +1,3 @@ +export const validItemIdFormat = /^[0-9]*$/; + +export const validBusinessIdFormat = /^[0-9]{8}$/; -- GitLab From c5d0735fb5feeb6f2c56783f7d2131c04f39ad5b Mon Sep 17 00:00:00 2001 From: victor-liu <victorliu1999@gmail.com> Date: Tue, 5 Jan 2021 11:37:40 +1100 Subject: [PATCH 10/18] added layouts --- src/layouts/AuthLayout.tsx | 79 +++++++++++++++ src/layouts/BlankLayout.tsx | 74 ++++++++++++++ src/layouts/OdLayout.tsx | 190 ++++++++++++++++++++++++++++++++++++ src/layouts/UserLayout.tsx | 53 ++++++++++ src/layouts/od/Header.tsx | 22 +++++ src/layouts/od/style.less | 11 +++ src/layouts/user/Header.tsx | 16 +++ src/layouts/user/Lable.tsx | 24 +++++ src/layouts/user/style.less | 62 ++++++++++++ 9 files changed, 531 insertions(+) create mode 100644 src/layouts/AuthLayout.tsx create mode 100644 src/layouts/BlankLayout.tsx create mode 100644 src/layouts/OdLayout.tsx create mode 100644 src/layouts/UserLayout.tsx create mode 100644 src/layouts/od/Header.tsx create mode 100644 src/layouts/od/style.less create mode 100644 src/layouts/user/Header.tsx create mode 100644 src/layouts/user/Lable.tsx create mode 100755 src/layouts/user/style.less diff --git a/src/layouts/AuthLayout.tsx b/src/layouts/AuthLayout.tsx new file mode 100644 index 0000000..abc9246 --- /dev/null +++ b/src/layouts/AuthLayout.tsx @@ -0,0 +1,79 @@ +import React, { useEffect, useState } from 'react'; +import { connect } from 'dva'; +import PageLoading from '@/components/PageLoading'; +import { history } from 'umi'; +import { getMapStateToProps } from '@/utils/utils'; +import { message } from 'antd'; +import { Redirect } from 'umi'; +/* +这里åªåštokençš„æ ¡éªŒ +*/ +const AuthLayout: React.FC<any> = (props: any) => { + const { + dispatch, + user: { currentUser }, + helper: { tx }, + children, + loading, + } = props; + + const processing = loading.effects['user/refreshCurrentUserToken']; + + //需è¦åˆ¤æ–æ˜¯ä¸æ˜¯è¦refresh + useEffect(() => { + let needRefresh = false; + let refreshPayload = props.user.refreshInfo; + + //这个地方给refreshPayload留出一个ä½å + //e.g. 处ç†é‚£ç§ä¸é—´è¿‡ç¨‹è¢«æ‰“æ– éœ€è¦åŽç«¯ä»‹å…¥ä¸é—´æµç¨‹çš„æƒ…况 + if (refreshPayload && !currentUser) { + //有refreshPayload && currentUserä¸å˜åœ¨ + needRefresh = true; + } else if (currentUser && currentUser.id && currentUser.token) { + // redux里有currentUser, 检查token是å¦è¿‡æœŸ + const tokenReceivedAt = currentUser.tokenReceivedAt; + const tokenValidPeriod = Number(currentUser.token.expires_in); + const currentTime = new Date().getTime(); //当剿—¶é—´ + if (tokenReceivedAt + tokenValidPeriod * 1000 <= currentTime) { + console.log('å·²ç»è¿‡æœŸï¼'); + //有currentUser å·²ç»è¿‡æœŸ, ä¸éœ€è¦refresh 但需è¦é‡æ–°ç™»å½• + dispatch({ + type: 'user/clearCurrentUserToken', + }); + message.error(tx('Global.please_login_again')); + history.replace('/user/login'); + } else if (tokenReceivedAt + tokenValidPeriod * 1000 - currentTime < 3600 * 24 * 5 * 1000) { + console.log('ä¸è¶³äº”天ï¼ï¼'); + //3600s * 24å°æ—¶/天 * 5 = 5天 + //有currentUser æ—¶é—´ä¸è¶³5天, 需è¦refresh + needRefresh = true; + refreshPayload = { + userId: currentUser.id, + refreshToken: currentUser.token.refresh_token, + }; + } + //有currentUser 时间超过5天, ä¸éœ€è¦refresh + } + + if (needRefresh && refreshPayload) { + dispatch({ + type: 'user/refreshCurrentUserToken', + refreshPayload, + }); + } + }, []); + + if (processing) { + // processing 时显示loading + return <PageLoading />; + } + + if (currentUser && currentUser.status && currentUser.status !== 'ok') { + //user状æ€ä¸å¯¹çš„è¯ åŽ»contact + return <Redirect to="/user/contact" />; + } + + return children; +}; + +export default connect(getMapStateToProps(['loading', 'user']))(AuthLayout); diff --git a/src/layouts/BlankLayout.tsx b/src/layouts/BlankLayout.tsx new file mode 100644 index 0000000..96ee9e8 --- /dev/null +++ b/src/layouts/BlankLayout.tsx @@ -0,0 +1,74 @@ +import React, { useState, useEffect } from 'react'; +import { getMapStateToProps } from '@/utils/utils'; +import { connect } from 'dva'; +import { ConfigProvider } from 'antd'; +import en_US from 'antd/es/locale/en_US'; +import zh_CN from 'antd/es/locale/zh_CN'; +import zh_TW from 'antd/es/locale/zh_TW'; +import ru_RU from 'antd/es/locale/ru_RU'; +import ja_JP from 'antd/es/locale/ja_JP'; +import fr_FR from 'antd/es/locale/fr_FR'; +import de_DE from 'antd/es/locale/de_DE'; +import it_IT from 'antd/es/locale/it_IT'; +import es_ES from 'antd/es/locale/es_ES'; +import ko_KR from 'antd/es/locale/ko_KR'; + +const antdLanSelect = { + en_AU: en_US, + zh_CN, + zh_HK: zh_TW, + ru_RU, + ja_JP, + fr_FR, + de_DE, + it_IT, + es_ES, + ko_KR, +}; + +const useWindowSize = () => { + const isClient = typeof window === 'object'; + + const getSize = () => { + return { + width: isClient ? window.innerWidth : undefined, + height: isClient ? window.innerHeight : undefined, + }; + }; + + const [windowSize, setWindowSize] = useState(getSize); + + useEffect((): any => { + if (!isClient) { + return false; + } + + function handleResize() { + setWindowSize(getSize()); + } + + window.addEventListener('resize', handleResize); + return () => window.removeEventListener('resize', handleResize); + }, []); // Empty array ensures that effect is only run on mount and unmount + + return windowSize; +}; + +const Layout: React.FC<any> = (props) => { + const { dispatch, meta, children } = props; + + const size = useWindowSize(); + + const isMobile = (size.width as number) <= 767 ? true : false; + const isXs = (size.width as number) <= 576 ? true : false; + + if (isMobile !== meta.isMobile || isXs !== meta.isXs) { + dispatch({ + type: 'meta/setMobileType', + width: size.width as number, + }); + } + return <ConfigProvider locale={antdLanSelect[meta.viewingLang]}>{children}</ConfigProvider>; +}; + +export default connect(getMapStateToProps(['meta', 'od', 'user']))(Layout); diff --git a/src/layouts/OdLayout.tsx b/src/layouts/OdLayout.tsx new file mode 100644 index 0000000..512339b --- /dev/null +++ b/src/layouts/OdLayout.tsx @@ -0,0 +1,190 @@ +/** + * Ant Design Pro v4 use `@ant-design/pro-layout` to handle Layout. + * You can view component api by: + * https://github.com/ant-design/ant-design-pro-layout + */ +import ProLayout, { + MenuDataItem, + BasicLayoutProps as ProLayoutProps, + Settings, + DefaultFooter, +} from '@ant-design/pro-layout'; +import React, { useState, useEffect, useRef, useMemo } from 'react'; +import { history, Link, useIntl, Redirect } from 'umi'; +import { connect } from 'dva'; +import { message, Button, Result } from 'antd'; + +import Authorized from '@/utils/Authorized'; +import { getMapStateToProps } from '@/utils/utils'; + +import logo from '@/assets/logo.svg'; +import styles from './od/style.less'; +import Footer from '@/components/GlobalFooter'; +import Header from './od/Header'; + +import PageLoading from '@/components/PageLoading'; +import defaultSettings from '../../config/defaultSettings'; +import { getMatchMenu } from '@umijs/route-utils'; + +const newFooterRender: any = () => { + return <Footer />; +}; + +/** + * use Authorized check all menu item + */ +const menuDataRender = (menuList: any[]): any[] => { + return menuList.map((item) => { + const localItem = { + ...item, + children: item.children ? menuDataRender(item.children) : [], + }; + return Authorized.check(item.authority, localItem, null) as any; + }); +}; + +const newBreadcrumbRender: any = (routers = []) => { + const { formatMessage } = useIntl(); + return [ + { + path: '/', + breadcrumbName: formatMessage({ + id: 'menu.home', + defaultMessage: 'Home', + }), + }, + ...routers, + ]; +}; + +const newItemRender: any = (route: any, params: any, routes: any, paths: any) => { + const first = routes.indexOf(route) === 0; + return first ? ( + <Link to={paths.join('/')}>{route.breadcrumbName}</Link> + ) : ( + <span>{route.breadcrumbName}</span> + ); +}; + +const OdLayout: React.FC<any> = (props: any) => { + const { + dispatch, + children, + od, + meta: { loadedModule, isMobile, isXs }, + user: { currentUser }, + helper: { tx }, + } = props; + + const menuDataRef = useRef<MenuDataItem[]>([]); + + const isLogin = currentUser && currentUser.id ? true : false; + const { showActioningMessage } = od.reloadAction; + + const handleMenuCollapse = (collapsed: boolean): void => { + if (dispatch) { + dispatch({ + type: 'od/setLayoutCollapsed', + layoutCollapsed: collapsed, + }); + } + }; + + const menuItemRender = (menuItemProps: any, defaultDom: any) => { + if (menuItemProps.isUrl || menuItemProps.children || !menuItemProps.path) { + return defaultDom; + } + return <Link to={menuItemProps.path}>{defaultDom}</Link>; + }; + + const postMenuDataRender = (menuData: any) => { + menuDataRef.current = menuData || []; + return menuData || []; + }; + + // get children authority + const authorized = useMemo(() => { + return ( + getMatchMenu(location.pathname || '/', menuDataRef.current).pop() || { + authority: undefined, + } + ); + }, [location.pathname]); + + // useEffect(() => { + // if (!loadedModule.od) { + // dispatch({ + // type: 'od/fetchMeta', + // }); + // } + // }, [metaModuleLoaded.od]); + + // useEffect(() => { + // //上æ¥å°±æ˜¯unset 则直接过就行了 + // const noNeedReload = showActioningMessage === 'unset' ? true : false; + + // if (noNeedReload) { + // return; + // } + + // const { spaceName, reloadType = false, redirectUrl = false } = od.reloadAction; + + // if (showActioningMessage) { + // const hide = message.loading(tx('Global.action_in_progress...'), 0); + // setTimeout(hide, 1500); + // } else { + // /**这里è¦å†³å®šæ”¶åˆ°è¿”回值以åŽçš„动作 ç›®å‰æœ‰ä¸¤ç§ + // 1. update action -> åˆ·æ–°æœ¬é¡µé¢ + // 2. create action -> è·³è½¬å…¶ä»–é¡µé¢ + // 这里用redirectUrlæ¥åˆ¤æ–æ˜¯æ€Žä¹ˆåš + // **/ + // if (redirectUrl) { + // //æš‚æ—¶åªæœ‰create会触å‘é‡å®šå‘ + // router.push(redirectUrl); + // } + // if (spaceName && reloadType) { + // dispatch({ + // type: `${spaceName}/fetchMeta`, + // reload: `${spaceName}-${reloadType}`, + // }); + // } + // } + // }, [showActioningMessage]); + + // if (!metaModuleLoaded.od) { + // return <PageLoading />; + // } + + //MOCK: 关闿¤å¤„å³å¯çœ‹od里é¢çš„内容3 + // if (!isLogin) { + // return <Redirect to="/user/login" />; + // } + + return ( + <span className={styles.odContainer}> + <ProLayout + {...props} + {...defaultSettings} + className={styles.odLayout} + logo={logo} + collapsed={od.layoutCollapsed} + onCollapse={handleMenuCollapse} + onMenuHeaderClick={() => history.push('/')} + menuItemRender={menuItemRender} + breadcrumbRender={newBreadcrumbRender} + itemRender={newItemRender} + footerRender={newFooterRender} + menuDataRender={menuDataRender} + postMenuData={postMenuDataRender} + rightContentRender={() => <Header />} + title={defaultSettings.title} + > + <Authorized authority={authorized!.authority} noMatch={<Redirect to="/403" />}> + {children} + </Authorized> + </ProLayout> + </span> + ); +}; + +export default connect(getMapStateToProps(['meta', 'od', 'user']))(OdLayout); diff --git a/src/layouts/UserLayout.tsx b/src/layouts/UserLayout.tsx new file mode 100644 index 0000000..2ed0ab7 --- /dev/null +++ b/src/layouts/UserLayout.tsx @@ -0,0 +1,53 @@ +import React, { useState, useEffect } from 'react'; +import { connect } from 'dva'; +import { Helmet } from 'react-helmet'; +import styles from './user/style.less'; +import { getMapStateToProps } from '@/utils/utils'; +import PageLoading from '@/components/PageLoading'; +import Header from './user/Header'; +import Footer from '@/components/GlobalFooter'; +import Lable from './user/Lable'; + +const UserLayout: React.FC<any> = (props) => { + const { + dispatch, + meta: { loadedModule }, + helper: { tx }, + children, + } = props; + const title = `${tx('Login.login')}`; + + // useEffect(() => { + // if (!loadedModule.user) { + // dispatch({ + // type: 'user/fetchMeta', + // }); + // } + // }, [loadedModule.user]); + + // if (!loadedModule.user) { + // return <PageLoading />; + // } + + return ( + <div> + <Helmet> + <title>{title}</title> + <meta name="description" content={title} /> + </Helmet> + + <div className={styles.container}> + <Header /> + + <div className={styles.content}> + <Lable /> + {children} + </div> + + <Footer /> + </div> + </div> + ); +}; + +export default connect(getMapStateToProps(['loading', 'meta']))(UserLayout); diff --git a/src/layouts/od/Header.tsx b/src/layouts/od/Header.tsx new file mode 100644 index 0000000..0cdbfe1 --- /dev/null +++ b/src/layouts/od/Header.tsx @@ -0,0 +1,22 @@ +import styles from './style.less'; +import React, { useState } from 'react'; +import RightContent from '@/components/GlobalHeader/RightContent'; +import { getMapStateToProps } from '@/utils/utils'; +import { Result, Button, Breadcrumb } from 'antd'; +import { connect, useIntl } from 'umi'; +import { getMenuData } from '@ant-design/pro-layout'; +import { MenuFoldOutlined, MenuUnfoldOutlined } from '@ant-design/icons'; + +const Header: React.FC<any> = (props: any) => { + const { + dispatch, + helper: { tx }, + od: { collapsed }, + routes, + pathname, + } = props; + + return <RightContent />; +}; + +export default connect(getMapStateToProps(['meta', 'od', 'user']))(Header); diff --git a/src/layouts/od/style.less b/src/layouts/od/style.less new file mode 100644 index 0000000..4fea5c9 --- /dev/null +++ b/src/layouts/od/style.less @@ -0,0 +1,11 @@ +.odContainer { + display: flex; + flex-direction: column; + height: 100vh; + + :global { + .ant-pro-sider-menu-logo h1 { + display: none !important; + } + } +} diff --git a/src/layouts/user/Header.tsx b/src/layouts/user/Header.tsx new file mode 100644 index 0000000..3ab1e16 --- /dev/null +++ b/src/layouts/user/Header.tsx @@ -0,0 +1,16 @@ +import React, { Component } from 'react'; +import { getMapStateToProps } from '@/utils/utils'; +import { connect, useIntl } from 'umi'; + +import SelectLang from '@/components/SelectLang'; +import styles from './style.less'; + +const Header: React.FC<any> = (props: any) => { + return ( + <div className={styles.lang}> + <SelectLang modelKey="user" /> + </div> + ); +}; + +export default connect(getMapStateToProps(['meta', 'loading']))(Header); diff --git a/src/layouts/user/Lable.tsx b/src/layouts/user/Lable.tsx new file mode 100644 index 0000000..46510bd --- /dev/null +++ b/src/layouts/user/Lable.tsx @@ -0,0 +1,24 @@ +import styles from './style.less'; +import logo from '@/assets/longLogo.svg'; +import { Link } from 'umi'; +import React from 'react'; +import { connect } from 'dva'; +import { getMapStateToProps } from '@/utils/utils'; + +const Lable: React.FC<any> = (props: any) => { + const { + helper: { tx }, + } = props; + + return ( + <div className={styles.top}> + <div className={styles.header}> + <Link to="/od"> + <img alt="logo" className={styles.logo} src={logo} /> + </Link> + </div> + <div className={styles.desc}>{tx('t_welcome to joidea')}</div> + </div> + ); +}; +export default connect(getMapStateToProps(['user']))(Lable); diff --git a/src/layouts/user/style.less b/src/layouts/user/style.less new file mode 100755 index 0000000..8da810d --- /dev/null +++ b/src/layouts/user/style.less @@ -0,0 +1,62 @@ +@import '~antd/es/style/themes/default.less'; + +.container { + display: flex; + flex-direction: column; + height: 100vh; + overflow: auto; + background: @layout-body-background; + background-image: url('~@/assets/user/maskBackground.svg'); + background-repeat: no-repeat; + background-position: center; + background-size: cover; + + .content { + flex: 1; + padding: 30px 0; + } + .lang { + display: flex; + justify-content: flex-end; + width: 100%; + height: 40px; + padding-top: 15px; + line-height: 45px; + text-align: right; + :global(.ant-dropdown-trigger) { + margin-right: 25px; + } + } +} + +.top { + text-align: center; + .header { + height: 45px; + line-height: 45px; + a { + text-decoration: none; + } + .logo { + height: 55px; + } + } + + .desc { + margin-top: 15px; + margin-bottom: 20px; + color: @primary-color; + font-weight: bold; + font-size: 20px; + line-height: 20px; + } +} + +.title { + position: relative; + top: 2px; + color: @heading-color; + font-weight: 600; + font-size: 35px; + font-family: Avenir, 'Helvetica Neue', Arial, Helvetica, sans-serif; +} -- GitLab From 413bf6a5c7e5158dfb0c3cea0070fc26ff5c2bbf Mon Sep 17 00:00:00 2001 From: victor-liu <victorliu1999@gmail.com> Date: Tue, 5 Jan 2021 11:38:18 +1100 Subject: [PATCH 11/18] added locales files --- src/locales/en-US.ts | 24 +++++++++++ src/locales/en-US/component.ts | 5 +++ src/locales/en-US/globalHeader.ts | 17 ++++++++ src/locales/en-US/menu.ts | 52 +++++++++++++++++++++++ src/locales/en-US/pages.ts | 68 ++++++++++++++++++++++++++++++ src/locales/en-US/pwa.ts | 6 +++ src/locales/en-US/settingDrawer.ts | 31 ++++++++++++++ src/locales/en-US/settings.ts | 60 ++++++++++++++++++++++++++ src/locales/id-ID.ts | 23 ++++++++++ src/locales/id-ID/component.ts | 5 +++ src/locales/id-ID/globalHeader.ts | 17 ++++++++ src/locales/id-ID/menu.ts | 52 +++++++++++++++++++++++ src/locales/id-ID/pwa.ts | 7 +++ src/locales/id-ID/settingDrawer.ts | 32 ++++++++++++++ src/locales/id-ID/settings.ts | 60 ++++++++++++++++++++++++++ src/locales/pt-BR.ts | 20 +++++++++ src/locales/pt-BR/component.ts | 5 +++ src/locales/pt-BR/globalHeader.ts | 18 ++++++++ src/locales/pt-BR/menu.ts | 52 +++++++++++++++++++++++ src/locales/pt-BR/pwa.ts | 7 +++ src/locales/pt-BR/settingDrawer.ts | 32 ++++++++++++++ src/locales/pt-BR/settings.ts | 60 ++++++++++++++++++++++++++ src/locales/zh-CN.ts | 24 +++++++++++ src/locales/zh-CN/component.ts | 5 +++ src/locales/zh-CN/globalHeader.ts | 17 ++++++++ src/locales/zh-CN/menu.ts | 52 +++++++++++++++++++++++ src/locales/zh-CN/pages.ts | 65 ++++++++++++++++++++++++++++ src/locales/zh-CN/pwa.ts | 6 +++ src/locales/zh-CN/settingDrawer.ts | 31 ++++++++++++++ src/locales/zh-CN/settings.ts | 55 ++++++++++++++++++++++++ src/locales/zh-TW.ts | 20 +++++++++ src/locales/zh-TW/component.ts | 5 +++ src/locales/zh-TW/globalHeader.ts | 17 ++++++++ src/locales/zh-TW/menu.ts | 52 +++++++++++++++++++++++ src/locales/zh-TW/pwa.ts | 6 +++ src/locales/zh-TW/settingDrawer.ts | 31 ++++++++++++++ src/locales/zh-TW/settings.ts | 55 ++++++++++++++++++++++++ 37 files changed, 1094 insertions(+) create mode 100644 src/locales/en-US.ts create mode 100644 src/locales/en-US/component.ts create mode 100644 src/locales/en-US/globalHeader.ts create mode 100644 src/locales/en-US/menu.ts create mode 100644 src/locales/en-US/pages.ts create mode 100644 src/locales/en-US/pwa.ts create mode 100644 src/locales/en-US/settingDrawer.ts create mode 100644 src/locales/en-US/settings.ts create mode 100644 src/locales/id-ID.ts create mode 100644 src/locales/id-ID/component.ts create mode 100644 src/locales/id-ID/globalHeader.ts create mode 100644 src/locales/id-ID/menu.ts create mode 100644 src/locales/id-ID/pwa.ts create mode 100644 src/locales/id-ID/settingDrawer.ts create mode 100644 src/locales/id-ID/settings.ts create mode 100644 src/locales/pt-BR.ts create mode 100644 src/locales/pt-BR/component.ts create mode 100644 src/locales/pt-BR/globalHeader.ts create mode 100644 src/locales/pt-BR/menu.ts create mode 100644 src/locales/pt-BR/pwa.ts create mode 100644 src/locales/pt-BR/settingDrawer.ts create mode 100644 src/locales/pt-BR/settings.ts create mode 100644 src/locales/zh-CN.ts create mode 100644 src/locales/zh-CN/component.ts create mode 100644 src/locales/zh-CN/globalHeader.ts create mode 100644 src/locales/zh-CN/menu.ts create mode 100644 src/locales/zh-CN/pages.ts create mode 100644 src/locales/zh-CN/pwa.ts create mode 100644 src/locales/zh-CN/settingDrawer.ts create mode 100644 src/locales/zh-CN/settings.ts create mode 100644 src/locales/zh-TW.ts create mode 100644 src/locales/zh-TW/component.ts create mode 100644 src/locales/zh-TW/globalHeader.ts create mode 100644 src/locales/zh-TW/menu.ts create mode 100644 src/locales/zh-TW/pwa.ts create mode 100644 src/locales/zh-TW/settingDrawer.ts create mode 100644 src/locales/zh-TW/settings.ts diff --git a/src/locales/en-US.ts b/src/locales/en-US.ts new file mode 100644 index 0000000..24c25fa --- /dev/null +++ b/src/locales/en-US.ts @@ -0,0 +1,24 @@ +import component from './en-US/component'; +import globalHeader from './en-US/globalHeader'; +import menu from './en-US/menu'; +import pwa from './en-US/pwa'; +import settingDrawer from './en-US/settingDrawer'; +import settings from './en-US/settings'; +import pages from './en-US/pages'; + +export default { + 'navBar.lang': 'Languages', + 'layout.user.link.help': 'Help', + 'layout.user.link.privacy': 'Privacy', + 'layout.user.link.terms': 'Terms', + 'app.preview.down.block': 'Download this page to your local project', + 'app.welcome.link.fetch-blocks': 'Get all block', + 'app.welcome.link.block-list': 'Quickly build standard, pages based on `block` development', + ...globalHeader, + ...menu, + ...settingDrawer, + ...settings, + ...pwa, + ...component, + ...pages, +}; diff --git a/src/locales/en-US/component.ts b/src/locales/en-US/component.ts new file mode 100644 index 0000000..3ba7eed --- /dev/null +++ b/src/locales/en-US/component.ts @@ -0,0 +1,5 @@ +export default { + 'component.tagSelect.expand': 'Expand', + 'component.tagSelect.collapse': 'Collapse', + 'component.tagSelect.all': 'All', +}; diff --git a/src/locales/en-US/globalHeader.ts b/src/locales/en-US/globalHeader.ts new file mode 100644 index 0000000..60b6d4e --- /dev/null +++ b/src/locales/en-US/globalHeader.ts @@ -0,0 +1,17 @@ +export default { + 'component.globalHeader.search': 'Search', + 'component.globalHeader.search.example1': 'Search example 1', + 'component.globalHeader.search.example2': 'Search example 2', + 'component.globalHeader.search.example3': 'Search example 3', + 'component.globalHeader.help': 'Help', + 'component.globalHeader.notification': 'Notification', + 'component.globalHeader.notification.empty': 'You have viewed all notifications.', + 'component.globalHeader.message': 'Message', + 'component.globalHeader.message.empty': 'You have viewed all messsages.', + 'component.globalHeader.event': 'Event', + 'component.globalHeader.event.empty': 'You have viewed all events.', + 'component.noticeIcon.clear': 'Clear', + 'component.noticeIcon.cleared': 'Cleared', + 'component.noticeIcon.empty': 'No notifications', + 'component.noticeIcon.view-more': 'View more', +}; diff --git a/src/locales/en-US/menu.ts b/src/locales/en-US/menu.ts new file mode 100644 index 0000000..a737e69 --- /dev/null +++ b/src/locales/en-US/menu.ts @@ -0,0 +1,52 @@ +export default { + 'menu.welcome': 'Welcome', + 'menu.more-blocks': 'More Blocks', + 'menu.home': 'Home', + 'menu.admin': 'Admin', + 'menu.admin.sub-page': 'Sub-Page', + 'menu.login': 'Login', + 'menu.register': 'Register', + 'menu.register.result': 'Register Result', + 'menu.dashboard': 'Dashboard', + 'menu.dashboard.analysis': 'Analysis', + 'menu.dashboard.monitor': 'Monitor', + 'menu.dashboard.workplace': 'Workplace', + 'menu.exception.403': '403', + 'menu.exception.404': '404', + 'menu.exception.500': '500', + 'menu.form': 'Form', + 'menu.form.basic-form': 'Basic Form', + 'menu.form.step-form': 'Step Form', + 'menu.form.step-form.info': 'Step Form(write transfer information)', + 'menu.form.step-form.confirm': 'Step Form(confirm transfer information)', + 'menu.form.step-form.result': 'Step Form(finished)', + 'menu.form.advanced-form': 'Advanced Form', + 'menu.list': 'List', + 'menu.list.table-list': 'Search Table', + 'menu.list.basic-list': 'Basic List', + 'menu.list.card-list': 'Card List', + 'menu.list.search-list': 'Search List', + 'menu.list.search-list.articles': 'Search List(articles)', + 'menu.list.search-list.projects': 'Search List(projects)', + 'menu.list.search-list.applications': 'Search List(applications)', + 'menu.profile': 'Profile', + 'menu.profile.basic': 'Basic Profile', + 'menu.profile.advanced': 'Advanced Profile', + 'menu.result': 'Result', + 'menu.result.success': 'Success', + 'menu.result.fail': 'Fail', + 'menu.exception': 'Exception', + 'menu.exception.not-permission': '403', + 'menu.exception.not-find': '404', + 'menu.exception.server-error': '500', + 'menu.exception.trigger': 'Trigger', + 'menu.account': 'Account', + 'menu.account.center': 'Account Center', + 'menu.account.settings': 'Account Settings', + 'menu.account.trigger': 'Trigger Error', + 'menu.account.logout': 'Logout', + 'menu.editor': 'Graphic Editor', + 'menu.editor.flow': 'Flow Editor', + 'menu.editor.mind': 'Mind Editor', + 'menu.editor.koni': 'Koni Editor', +}; diff --git a/src/locales/en-US/pages.ts b/src/locales/en-US/pages.ts new file mode 100644 index 0000000..43dbdbc --- /dev/null +++ b/src/locales/en-US/pages.ts @@ -0,0 +1,68 @@ +export default { + 'pages.layouts.userLayout.title': + 'Ant Design is the most influential web design specification in Xihu district', + 'pages.login.accountLogin.tab': 'Account Login', + 'pages.login.accountLogin.errorMessage': 'Incorrect username/password(admin/ant.design)', + 'pages.login.username.placeholder': 'Username: admin or user', + 'pages.login.username.required': 'Please input your username!', + 'pages.login.password.placeholder': 'Password: ant.design', + 'pages.login.password.required': 'Please input your password!', + 'pages.login.phoneLogin.tab': 'Phone Login', + 'pages.login.phoneLogin.errorMessage': 'Verification Code Error', + 'pages.login.phoneNumber.placeholder': 'Phone Number', + 'pages.login.phoneNumber.required': 'Please input your phone number!', + 'pages.login.phoneNumber.invalid': 'Phone number is invalid!', + 'pages.login.captcha.placeholder': 'Verification Code', + 'pages.login.captcha.required': 'Please input verification code!', + 'pages.login.phoneLogin.getVerificationCode': 'Get Code', + 'pages.getCaptchaSecondText': 'sec(s)', + 'pages.login.rememberMe': 'Remember me', + 'pages.login.forgotPassword': 'Forgot Password ?', + 'pages.login.submit': 'Submit', + 'pages.login.loginWith': 'Login with :', + 'pages.login.registerAccount': 'Register Account', + 'pages.welcome.advancedComponent': 'Advanced Component', + 'pages.welcome.link': 'Welcome', + 'pages.welcome.advancedLayout': 'Advanced Layout', + 'pages.welcome.alertMessage': 'Faster and stronger heavy-duty components have been released.', + 'pages.admin.subPage.title': 'This page can only be viewed by Admin', + 'pages.admin.subPage.alertMessage': + 'Umi ui is now released, welcome to use npm run ui to start the experience.', + 'pages.searchTable.createForm.newRule': 'New Rule', + 'pages.searchTable.updateForm.ruleConfig': 'Rule configuration', + 'pages.searchTable.updateForm.basicConfig': 'Basic Information', + 'pages.searchTable.updateForm.ruleName.nameLabel': 'Rule Name', + 'pages.searchTable.updateForm.ruleName.nameRules': 'Please enter the rule name!', + 'pages.searchTable.updateForm.ruleDesc.descLabel': 'Rule Description', + 'pages.searchTable.updateForm.ruleDesc.descPlaceholder': 'Please enter at least five characters', + 'pages.searchTable.updateForm.ruleDesc.descRules': + 'Please enter a rule description of at least five characters!', + 'pages.searchTable.updateForm.ruleProps.title': 'Configure Properties', + 'pages.searchTable.updateForm.object': 'Monitoring Object', + 'pages.searchTable.updateForm.ruleProps.templateLabel': 'Rule Template', + 'pages.searchTable.updateForm.ruleProps.typeLabel': 'Rule Type', + 'pages.searchTable.updateForm.schedulingPeriod.title': 'Set Scheduling Period', + 'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'Starting Time', + 'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'Please choose a start time!', + 'pages.searchTable.titleDesc': 'Description', + 'pages.searchTable.ruleName': 'Rule name is required', + 'pages.searchTable.titleCallNo': 'Number of Service Calls', + 'pages.searchTable.titleStatus': 'Status', + 'pages.searchTable.nameStatus.default': 'default', + 'pages.searchTable.nameStatus.running': 'running', + 'pages.searchTable.nameStatus.online': 'online', + 'pages.searchTable.nameStatus.abnormal': 'abnormal', + 'pages.searchTable.titleUpdatedAt': 'Last Scheduled at', + 'pages.searchTable.exception': 'Please enter the reason for the exception!', + 'pages.searchTable.titleOption': 'Option', + 'pages.searchTable.config': 'Configuration', + 'pages.searchTable.subscribeAlert': 'Subscribe to alerts', + 'pages.searchTable.title': 'Enquiry Form', + 'pages.searchTable.new': 'New', + 'pages.searchTable.chosen': 'chosen', + 'pages.searchTable.item': 'item', + 'pages.searchTable.totalServiceCalls': 'Total Number of Service Calls', + 'pages.searchTable.tenThousand': '0000', + 'pages.searchTable.batchDeletion': 'bacth deletion', + 'pages.searchTable.batchApproval': 'batch approval', +}; diff --git a/src/locales/en-US/pwa.ts b/src/locales/en-US/pwa.ts new file mode 100644 index 0000000..ed8d199 --- /dev/null +++ b/src/locales/en-US/pwa.ts @@ -0,0 +1,6 @@ +export default { + 'app.pwa.offline': 'You are offline now', + 'app.pwa.serviceworker.updated': 'New content is available', + 'app.pwa.serviceworker.updated.hint': 'Please press the "Refresh" button to reload current page', + 'app.pwa.serviceworker.updated.ok': 'Refresh', +}; diff --git a/src/locales/en-US/settingDrawer.ts b/src/locales/en-US/settingDrawer.ts new file mode 100644 index 0000000..a644905 --- /dev/null +++ b/src/locales/en-US/settingDrawer.ts @@ -0,0 +1,31 @@ +export default { + 'app.setting.pagestyle': 'Page style setting', + 'app.setting.pagestyle.dark': 'Dark style', + 'app.setting.pagestyle.light': 'Light style', + 'app.setting.content-width': 'Content Width', + 'app.setting.content-width.fixed': 'Fixed', + 'app.setting.content-width.fluid': 'Fluid', + 'app.setting.themecolor': 'Theme Color', + 'app.setting.themecolor.dust': 'Dust Red', + 'app.setting.themecolor.volcano': 'Volcano', + 'app.setting.themecolor.sunset': 'Sunset Orange', + 'app.setting.themecolor.cyan': 'Cyan', + 'app.setting.themecolor.green': 'Polar Green', + 'app.setting.themecolor.daybreak': 'Daybreak Blue (default)', + 'app.setting.themecolor.geekblue': 'Geek Glue', + 'app.setting.themecolor.purple': 'Golden Purple', + 'app.setting.navigationmode': 'Navigation Mode', + 'app.setting.sidemenu': 'Side Menu Layout', + 'app.setting.topmenu': 'Top Menu Layout', + 'app.setting.fixedheader': 'Fixed Header', + 'app.setting.fixedsidebar': 'Fixed Sidebar', + 'app.setting.fixedsidebar.hint': 'Works on Side Menu Layout', + 'app.setting.hideheader': 'Hidden Header when scrolling', + 'app.setting.hideheader.hint': 'Works when Hidden Header is enabled', + 'app.setting.othersettings': 'Other Settings', + 'app.setting.weakmode': 'Weak Mode', + 'app.setting.copy': 'Copy Setting', + 'app.setting.copyinfo': 'copy success,please replace defaultSettings in src/models/setting.js', + 'app.setting.production.hint': + 'Setting panel shows in development environment only, please manually modify', +}; diff --git a/src/locales/en-US/settings.ts b/src/locales/en-US/settings.ts new file mode 100644 index 0000000..822dd00 --- /dev/null +++ b/src/locales/en-US/settings.ts @@ -0,0 +1,60 @@ +export default { + 'app.settings.menuMap.basic': 'Basic Settings', + 'app.settings.menuMap.security': 'Security Settings', + 'app.settings.menuMap.binding': 'Account Binding', + 'app.settings.menuMap.notification': 'New Message Notification', + 'app.settings.basic.avatar': 'Avatar', + 'app.settings.basic.change-avatar': 'Change avatar', + 'app.settings.basic.email': 'Email', + 'app.settings.basic.email-message': 'Please input your email!', + 'app.settings.basic.nickname': 'Nickname', + 'app.settings.basic.nickname-message': 'Please input your Nickname!', + 'app.settings.basic.profile': 'Personal profile', + 'app.settings.basic.profile-message': 'Please input your personal profile!', + 'app.settings.basic.profile-placeholder': 'Brief introduction to yourself', + 'app.settings.basic.country': 'Country/Region', + 'app.settings.basic.country-message': 'Please input your country!', + 'app.settings.basic.geographic': 'Province or city', + 'app.settings.basic.geographic-message': 'Please input your geographic info!', + 'app.settings.basic.address': 'Street Address', + 'app.settings.basic.address-message': 'Please input your address!', + 'app.settings.basic.phone': 'Phone Number', + 'app.settings.basic.phone-message': 'Please input your phone!', + 'app.settings.basic.update': 'Update Information', + 'app.settings.security.strong': 'Strong', + 'app.settings.security.medium': 'Medium', + 'app.settings.security.weak': 'Weak', + 'app.settings.security.password': 'Account Password', + 'app.settings.security.password-description': 'Current password strength', + 'app.settings.security.phone': 'Security Phone', + 'app.settings.security.phone-description': 'Bound phone', + 'app.settings.security.question': 'Security Question', + 'app.settings.security.question-description': + 'The security question is not set, and the security policy can effectively protect the account security', + 'app.settings.security.email': 'Backup Email', + 'app.settings.security.email-description': 'Bound Email', + 'app.settings.security.mfa': 'MFA Device', + 'app.settings.security.mfa-description': + 'Unbound MFA device, after binding, can be confirmed twice', + 'app.settings.security.modify': 'Modify', + 'app.settings.security.set': 'Set', + 'app.settings.security.bind': 'Bind', + 'app.settings.binding.taobao': 'Binding Taobao', + 'app.settings.binding.taobao-description': 'Currently unbound Taobao account', + 'app.settings.binding.alipay': 'Binding Alipay', + 'app.settings.binding.alipay-description': 'Currently unbound Alipay account', + 'app.settings.binding.dingding': 'Binding DingTalk', + 'app.settings.binding.dingding-description': 'Currently unbound DingTalk account', + 'app.settings.binding.bind': 'Bind', + 'app.settings.notification.password': 'Account Password', + 'app.settings.notification.password-description': + 'Messages from other users will be notified in the form of a station letter', + 'app.settings.notification.messages': 'System Messages', + 'app.settings.notification.messages-description': + 'System messages will be notified in the form of a station letter', + 'app.settings.notification.todo': 'To-do Notification', + 'app.settings.notification.todo-description': + 'The to-do list will be notified in the form of a letter from the station', + 'app.settings.open': 'Open', + 'app.settings.close': 'Close', +}; diff --git a/src/locales/id-ID.ts b/src/locales/id-ID.ts new file mode 100644 index 0000000..e0bdf5c --- /dev/null +++ b/src/locales/id-ID.ts @@ -0,0 +1,23 @@ +import component from './id-ID/component'; +import globalHeader from './id-ID/globalHeader'; +import menu from './id-ID/menu'; +import pwa from './id-ID/pwa'; +import settingDrawer from './id-ID/settingDrawer'; +import settings from './id-ID/settings'; + +export default { + 'navbar.lang': 'Bahasa', + 'layout.user.link.help': 'Bantuan', + 'layout.user.link.privacy': 'Privasi', + 'layout.user.link.terms': 'Ketentuan', + 'app.preview.down.block': 'Unduh halaman ini dalam projek lokal anda', + 'app.welcome.link.fetch-blocks': 'Dapatkan semua blok', + 'app.welcome.link.block-list': + 'Buat standar dengan cepat, halaman-halaman berdasarkan pengembangan `block`', + ...globalHeader, + ...menu, + ...settingDrawer, + ...settings, + ...pwa, + ...component, +}; diff --git a/src/locales/id-ID/component.ts b/src/locales/id-ID/component.ts new file mode 100644 index 0000000..fe583af --- /dev/null +++ b/src/locales/id-ID/component.ts @@ -0,0 +1,5 @@ +export default { + 'component.tagSelect.expand': 'Perluas', + 'component.tagSelect.collapse': 'Lipat', + 'component.tagSelect.all': 'Semua', +}; diff --git a/src/locales/id-ID/globalHeader.ts b/src/locales/id-ID/globalHeader.ts new file mode 100644 index 0000000..e6283ea --- /dev/null +++ b/src/locales/id-ID/globalHeader.ts @@ -0,0 +1,17 @@ +export default { + 'component.globalHeader.search': 'Pencarian', + 'component.globalHeader.search.example1': 'Contoh 1 Pencarian', + 'component.globalHeader.search.example2': 'Contoh 2 Pencarian', + 'component.globalHeader.search.example3': 'Contoh 3 Pencarian', + 'component.globalHeader.help': 'Bantuan', + 'component.globalHeader.notification': 'Notifikasi', + 'component.globalHeader.notification.empty': 'Anda telah membaca semua notifikasi', + 'component.globalHeader.message': 'Pesan', + 'component.globalHeader.message.empty': 'Anda telah membaca semua pesan.', + 'component.globalHeader.event': 'Acara', + 'component.globalHeader.event.empty': 'Anda telah melihat semua acara.', + 'component.noticeIcon.clear': 'Kosongkan', + 'component.noticeIcon.cleared': 'Berhasil dikosongkan', + 'component.noticeIcon.empty': 'Tidak ada pemberitahuan', + 'component.noticeIcon.view-more': 'Melihat lebih', +}; diff --git a/src/locales/id-ID/menu.ts b/src/locales/id-ID/menu.ts new file mode 100644 index 0000000..862518b --- /dev/null +++ b/src/locales/id-ID/menu.ts @@ -0,0 +1,52 @@ +export default { + 'menu.welcome': 'Selamat Datang', + 'menu.more-blocks': 'Blocks Lainnya', + 'menu.home': 'Halaman Awal', + 'menu.admin': 'Admin', + 'menu.admin.sub-page': 'Sub-Halaman', + 'menu.login': 'Masuk', + 'menu.register': 'Pendaftaran', + 'menu.register.result': 'Hasil Pendaftaran', + 'menu.dashboard': 'Dasbor', + 'menu.dashboard.analysis': 'Analisis', + 'menu.dashboard.monitor': 'Monitor', + 'menu.dashboard.workplace': 'Workplace', + 'menu.exception.403': '403', + 'menu.exception.404': '404', + 'menu.exception.500': '500', + 'menu.form': 'Form', + 'menu.form.basic-form': 'Form Dasar', + 'menu.form.step-form': 'Form Bertahap', + 'menu.form.step-form.info': 'Form Bertahap(menulis informasi yang dibagikan)', + 'menu.form.step-form.confirm': 'Form Bertahap(konfirmasi informasi yang dibagikan)', + 'menu.form.step-form.result': 'Form Bertahap(selesai)', + 'menu.form.advanced-form': 'Form Lanjutan', + 'menu.list': 'Daftar', + 'menu.list.table-list': 'Tabel Pencarian', + 'menu.list.basic-list': 'Daftar Dasar', + 'menu.list.card-list': 'Daftar Kartu', + 'menu.list.search-list': 'Daftar Pencarian', + 'menu.list.search-list.articles': 'Daftar Pencarian(artikel)', + 'menu.list.search-list.projects': 'Daftar Pencarian(projek)', + 'menu.list.search-list.applications': 'Daftar Pencarian(aplikasi)', + 'menu.profile': 'Profil', + 'menu.profile.basic': 'Profil Dasar', + 'menu.profile.advanced': 'Profile Lanjutan', + 'menu.result': 'Hasil', + 'menu.result.success': 'Sukses', + 'menu.result.fail': 'Gagal', + 'menu.exception': 'Pengecualian', + 'menu.exception.not-permission': '403', + 'menu.exception.not-find': '404', + 'menu.exception.server-error': '500', + 'menu.exception.trigger': 'Jalankan', + 'menu.account': 'Akun', + 'menu.account.center': 'Detail Akun', + 'menu.account.settings': 'Pengaturan Akun', + 'menu.account.trigger': 'Mengaktivasi Error', + 'menu.account.logout': 'Keluar', + 'menu.editor': 'Penyusun Grafis', + 'menu.editor.flow': 'Penyusun Alur', + 'menu.editor.mind': 'Penyusun Mind', + 'menu.editor.koni': 'Penyusun Koni', +}; diff --git a/src/locales/id-ID/pwa.ts b/src/locales/id-ID/pwa.ts new file mode 100644 index 0000000..b2cb8a1 --- /dev/null +++ b/src/locales/id-ID/pwa.ts @@ -0,0 +1,7 @@ +export default { + 'app.pwa.offline': 'Koneksi anda terputus', + 'app.pwa.serviceworker.updated': 'Konten baru sudah tersedia', + 'app.pwa.serviceworker.updated.hint': + 'Silahkan klik tombol "Refresh" untuk memuat ulang halaman ini', + 'app.pwa.serviceworker.updated.ok': 'Memuat ulang', +}; diff --git a/src/locales/id-ID/settingDrawer.ts b/src/locales/id-ID/settingDrawer.ts new file mode 100644 index 0000000..3b37703 --- /dev/null +++ b/src/locales/id-ID/settingDrawer.ts @@ -0,0 +1,32 @@ +export default { + 'app.setting.pagestyle': 'Pengaturan style Halaman', + 'app.setting.pagestyle.dark': 'Style Gelap', + 'app.setting.pagestyle.light': 'Style Cerah', + 'app.setting.content-width': 'Lebar Konten', + 'app.setting.content-width.fixed': 'Tetap', + 'app.setting.content-width.fluid': 'Fluid', + 'app.setting.themecolor': 'Theme Color', + 'app.setting.themecolor.dust': 'Dust Red', + 'app.setting.themecolor.volcano': 'Volcano', + 'app.setting.themecolor.sunset': 'Sunset Orange', + 'app.setting.themecolor.cyan': 'Cyan', + 'app.setting.themecolor.green': 'Polar Green', + 'app.setting.themecolor.daybreak': 'Daybreak Blue (bawaan)', + 'app.setting.themecolor.geekblue': 'Geek Glue', + 'app.setting.themecolor.purple': 'Golden Purple', + 'app.setting.navigationmode': 'Mode Navigasi', + 'app.setting.sidemenu': 'Susunan Menu Samping', + 'app.setting.topmenu': 'Susunan Menu Atas', + 'app.setting.fixedheader': 'Header Tetap', + 'app.setting.fixedsidebar': 'Sidebar Tetap', + 'app.setting.fixedsidebar.hint': 'Berjalan pada Susunan Menu Samping', + 'app.setting.hideheader': 'Sembunyikan Header ketika gulir ke bawah', + 'app.setting.hideheader.hint': 'Bekerja ketika Header tersembunyi dimunculkan', // 'app.setting.hideheader.hint': 'Works when Hidden Header is enabled', + 'app.setting.othersettings': 'Pengaturan Lainnya', + 'app.setting.weakmode': 'Mode Lemah', + 'app.setting.copy': 'Salin Pengaturan', + 'app.setting.copyinfo': + 'Berhasil disalin,tolong ubah defaultSettings pada src/models/setting.js', + 'app.setting.production.hint': + 'Panel pengaturan hanya muncul pada lingkungan pengembangan, silahkan modifikasi secara menual', +}; diff --git a/src/locales/id-ID/settings.ts b/src/locales/id-ID/settings.ts new file mode 100644 index 0000000..04b7d12 --- /dev/null +++ b/src/locales/id-ID/settings.ts @@ -0,0 +1,60 @@ +export default { + 'app.settings.menuMap.basic': 'Pengaturan Dasar', + 'app.settings.menuMap.security': 'Pengaturan Keamanan', + 'app.settings.menuMap.binding': 'Pengikatan Akun', + 'app.settings.menuMap.notification': 'Notifikasi Pesan Baru', + 'app.settings.basic.avatar': 'Avatar', + 'app.settings.basic.change-avatar': 'Ubah avatar', + 'app.settings.basic.email': 'Email', + 'app.settings.basic.email-message': 'Tolong masukkan email!', + 'app.settings.basic.nickname': 'Nickname', + 'app.settings.basic.nickname-message': 'Tolong masukkan Nickname!', + 'app.settings.basic.profile': 'Profil Personal', + 'app.settings.basic.profile-message': 'Tolong masukkan profil personal!', + 'app.settings.basic.profile-placeholder': 'Perkenalan Singkat tentang Diri Anda', + 'app.settings.basic.country': 'Negara/Wilayah', + 'app.settings.basic.country-message': 'Tolong masukkan negara anda!', + 'app.settings.basic.geographic': 'Provinsi atau kota', + 'app.settings.basic.geographic-message': 'Tolong masukkan info geografis anda!', + 'app.settings.basic.address': 'Alamat Jalan', + 'app.settings.basic.address-message': 'Tolong masukkan Alamat Jalan anda!', + 'app.settings.basic.phone': 'Nomor Ponsel', + 'app.settings.basic.phone-message': 'Tolong masukkan Nomor Ponsel anda!', + 'app.settings.basic.update': 'Perbarui Informasi', + 'app.settings.security.strong': 'Kuat', + 'app.settings.security.medium': 'Sedang', + 'app.settings.security.weak': 'Lemah', + 'app.settings.security.password': 'Kata Sandi Akun', + 'app.settings.security.password-description': 'Kekuatan Kata Sandi saat ini', + 'app.settings.security.phone': 'Keamanan Ponsel', + 'app.settings.security.phone-description': 'Mengikat Ponsel', + 'app.settings.security.question': 'Pertanyaan Keamanan', + 'app.settings.security.question-description': + 'Pertanyaan Keamanan belum diatur, dan kebijakan keamanan dapat melindungi akun secara efektif', + 'app.settings.security.email': 'Email Cadangan', + 'app.settings.security.email-description': 'Mengikat Email', + 'app.settings.security.mfa': 'Perangka MFA', + 'app.settings.security.mfa-description': + 'Tidak mengikat Perangkat MFA, setelah diikat, dapat dikonfirmasi dua kali', + 'app.settings.security.modify': 'Modifikasi', + 'app.settings.security.set': 'Setel', + 'app.settings.security.bind': 'Ikat', + 'app.settings.binding.taobao': 'Mengikat Taobao', + 'app.settings.binding.taobao-description': 'Tidak mengikat akun Taobao saat ini', + 'app.settings.binding.alipay': 'Mengikat Alipay', + 'app.settings.binding.alipay-description': 'Tidak mengikat akun Alipay saat ini', + 'app.settings.binding.dingding': 'Mengikat DingTalk', + 'app.settings.binding.dingding-description': 'Tidak mengikat akun DingTalk', + 'app.settings.binding.bind': 'Ikat', + 'app.settings.notification.password': 'Kata Sandi Akun', + 'app.settings.notification.password-description': + 'Pesan dari pengguna lain akan diberitahu dalam bentuk surat', + 'app.settings.notification.messages': 'Pesan Sistem', + 'app.settings.notification.messages-description': + 'Pesan sistem akan diberitahu dalam bentuk surat', + 'app.settings.notification.todo': 'Notifikasi daftar To-do', + 'app.settings.notification.todo-description': + 'Daftar to-do akan diberitahukan dalam bentuk surat dari stasiun', + 'app.settings.open': 'Buka', + 'app.settings.close': 'Tutup', +}; diff --git a/src/locales/pt-BR.ts b/src/locales/pt-BR.ts new file mode 100644 index 0000000..ee3733b --- /dev/null +++ b/src/locales/pt-BR.ts @@ -0,0 +1,20 @@ +import component from './pt-BR/component'; +import globalHeader from './pt-BR/globalHeader'; +import menu from './pt-BR/menu'; +import pwa from './pt-BR/pwa'; +import settingDrawer from './pt-BR/settingDrawer'; +import settings from './pt-BR/settings'; + +export default { + 'navBar.lang': 'Idiomas', + 'layout.user.link.help': 'ajuda', + 'layout.user.link.privacy': 'polÃtica de privacidade', + 'layout.user.link.terms': 'termos de serviços', + 'app.preview.down.block': 'Download this page to your local project', + ...globalHeader, + ...menu, + ...settingDrawer, + ...settings, + ...pwa, + ...component, +}; diff --git a/src/locales/pt-BR/component.ts b/src/locales/pt-BR/component.ts new file mode 100644 index 0000000..7cf9999 --- /dev/null +++ b/src/locales/pt-BR/component.ts @@ -0,0 +1,5 @@ +export default { + 'component.tagSelect.expand': 'Expandir', + 'component.tagSelect.collapse': 'Diminuir', + 'component.tagSelect.all': 'Todas', +}; diff --git a/src/locales/pt-BR/globalHeader.ts b/src/locales/pt-BR/globalHeader.ts new file mode 100644 index 0000000..c927399 --- /dev/null +++ b/src/locales/pt-BR/globalHeader.ts @@ -0,0 +1,18 @@ +export default { + 'component.globalHeader.search': 'Busca', + 'component.globalHeader.search.example1': 'Exemplo de busca 1', + 'component.globalHeader.search.example2': 'Exemplo de busca 2', + 'component.globalHeader.search.example3': 'Exemplo de busca 3', + 'component.globalHeader.help': 'Ajuda', + 'component.globalHeader.notification': 'Notificação', + 'component.globalHeader.notification.empty': 'Você visualizou todas as notificações.', + 'component.globalHeader.message': 'Mensagem', + 'component.globalHeader.message.empty': 'Você visualizou todas as mensagens.', + 'component.globalHeader.event': 'Evento', + 'component.globalHeader.event.empty': 'Você visualizou todos os eventos.', + 'component.noticeIcon.clear': 'Limpar', + 'component.noticeIcon.cleared': 'Limpo', + 'component.noticeIcon.empty': 'Sem notificações', + 'component.noticeIcon.loaded': 'Carregado', + 'component.noticeIcon.view-more': 'Veja mais', +}; diff --git a/src/locales/pt-BR/menu.ts b/src/locales/pt-BR/menu.ts new file mode 100644 index 0000000..b87ebbb --- /dev/null +++ b/src/locales/pt-BR/menu.ts @@ -0,0 +1,52 @@ +export default { + 'menu.welcome': 'Welcome', + 'menu.more-blocks': 'More Blocks', + 'menu.home': 'InÃcio', + 'menu.login': 'Login', + 'menu.admin': 'Admin', + 'menu.admin.sub-page': 'Sub-Page', + 'menu.register': 'Registro', + 'menu.register.result': 'Resultado de registro', + 'menu.dashboard': 'Dashboard', + 'menu.dashboard.analysis': 'Análise', + 'menu.dashboard.monitor': 'Monitor', + 'menu.dashboard.workplace': 'Ambiente de Trabalho', + 'menu.exception.403': '403', + 'menu.exception.404': '404', + 'menu.exception.500': '500', + 'menu.form': 'Formulário', + 'menu.form.basic-form': 'Formulário Básico', + 'menu.form.step-form': 'Formulário Assistido', + 'menu.form.step-form.info': 'Formulário Assistido(gravar informações de transferência)', + 'menu.form.step-form.confirm': 'Formulário Assistido(confirmar informações de transferência)', + 'menu.form.step-form.result': 'Formulário Assistido(finalizado)', + 'menu.form.advanced-form': 'Formulário Avançado', + 'menu.list': 'Lista', + 'menu.list.table-list': 'Tabela de Busca', + 'menu.list.basic-list': 'Lista Básica', + 'menu.list.card-list': 'Lista de Card', + 'menu.list.search-list': 'Lista de Busca', + 'menu.list.search-list.articles': 'Lista de Busca(artigos)', + 'menu.list.search-list.projects': 'Lista de Busca(projetos)', + 'menu.list.search-list.applications': 'Lista de Busca(aplicações)', + 'menu.profile': 'Perfil', + 'menu.profile.basic': 'Perfil Básico', + 'menu.profile.advanced': 'Perfil Avançado', + 'menu.result': 'Resultado', + 'menu.result.success': 'Sucesso', + 'menu.result.fail': 'Falha', + 'menu.exception': 'Exceção', + 'menu.exception.not-permission': '403', + 'menu.exception.not-find': '404', + 'menu.exception.server-error': '500', + 'menu.exception.trigger': 'Disparar', + 'menu.account': 'Conta', + 'menu.account.center': 'Central da Conta', + 'menu.account.settings': 'Configurar Conta', + 'menu.account.trigger': 'Disparar Erro', + 'menu.account.logout': 'Sair', + 'menu.editor': 'Graphic Editor', + 'menu.editor.flow': 'Flow Editor', + 'menu.editor.mind': 'Mind Editor', + 'menu.editor.koni': 'Koni Editor', +}; diff --git a/src/locales/pt-BR/pwa.ts b/src/locales/pt-BR/pwa.ts new file mode 100644 index 0000000..05cc797 --- /dev/null +++ b/src/locales/pt-BR/pwa.ts @@ -0,0 +1,7 @@ +export default { + 'app.pwa.offline': 'Você está offline agora', + 'app.pwa.serviceworker.updated': 'Novo conteúdo está disponÃvel', + 'app.pwa.serviceworker.updated.hint': + 'Por favor, pressione o botão "Atualizar" para recarregar a página atual', + 'app.pwa.serviceworker.updated.ok': 'Atualizar', +}; diff --git a/src/locales/pt-BR/settingDrawer.ts b/src/locales/pt-BR/settingDrawer.ts new file mode 100644 index 0000000..8a10b57 --- /dev/null +++ b/src/locales/pt-BR/settingDrawer.ts @@ -0,0 +1,32 @@ +export default { + 'app.setting.pagestyle': 'Configuração de estilo da página', + 'app.setting.pagestyle.dark': 'Dark style', + 'app.setting.pagestyle.light': 'Light style', + 'app.setting.content-width': 'Largura do conteúdo', + 'app.setting.content-width.fixed': 'Fixo', + 'app.setting.content-width.fluid': 'Fluido', + 'app.setting.themecolor': 'Cor do Tema', + 'app.setting.themecolor.dust': 'Dust Red', + 'app.setting.themecolor.volcano': 'Volcano', + 'app.setting.themecolor.sunset': 'Sunset Orange', + 'app.setting.themecolor.cyan': 'Cyan', + 'app.setting.themecolor.green': 'Polar Green', + 'app.setting.themecolor.daybreak': 'Daybreak Blue (default)', + 'app.setting.themecolor.geekblue': 'Geek Glue', + 'app.setting.themecolor.purple': 'Golden Purple', + 'app.setting.navigationmode': 'Modo de Navegação', + 'app.setting.sidemenu': 'Layout do Menu Lateral', + 'app.setting.topmenu': 'Layout do Menu Superior', + 'app.setting.fixedheader': 'Cabeçalho fixo', + 'app.setting.fixedsidebar': 'Barra lateral fixa', + 'app.setting.fixedsidebar.hint': 'Funciona no layout do menu lateral', + 'app.setting.hideheader': 'Esconder o cabeçalho quando rolar', + 'app.setting.hideheader.hint': 'Funciona quando o esconder cabeçalho está abilitado', + 'app.setting.othersettings': 'Outras configurações', + 'app.setting.weakmode': 'Weak Mode', + 'app.setting.copy': 'Copiar Configuração', + 'app.setting.copyinfo': + 'copiado com sucesso,por favor trocar o defaultSettings em src/models/setting.js', + 'app.setting.production.hint': + 'O painel de configuração apenas é exibido no ambiente de desenvolvimento, por favor modifique manualmente o', +}; diff --git a/src/locales/pt-BR/settings.ts b/src/locales/pt-BR/settings.ts new file mode 100644 index 0000000..aad2e38 --- /dev/null +++ b/src/locales/pt-BR/settings.ts @@ -0,0 +1,60 @@ +export default { + 'app.settings.menuMap.basic': 'Configurações Básicas', + 'app.settings.menuMap.security': 'Configurações de Segurança', + 'app.settings.menuMap.binding': 'Vinculação de Conta', + 'app.settings.menuMap.notification': 'Mensagens de Notificação', + 'app.settings.basic.avatar': 'Avatar', + 'app.settings.basic.change-avatar': 'Alterar avatar', + 'app.settings.basic.email': 'Email', + 'app.settings.basic.email-message': 'Por favor insira seu email!', + 'app.settings.basic.nickname': 'Nome de usuário', + 'app.settings.basic.nickname-message': 'Por favor insira seu nome de usuário!', + 'app.settings.basic.profile': 'Perfil pessoal', + 'app.settings.basic.profile-message': 'Por favor insira seu perfil pessoal!', + 'app.settings.basic.profile-placeholder': 'Breve introdução sua', + 'app.settings.basic.country': 'PaÃs/Região', + 'app.settings.basic.country-message': 'Por favor insira paÃs!', + 'app.settings.basic.geographic': 'ProvÃncia, estado ou cidade', + 'app.settings.basic.geographic-message': 'Por favor insira suas informações geográficas!', + 'app.settings.basic.address': 'Endereço', + 'app.settings.basic.address-message': 'Por favor insira seu endereço!', + 'app.settings.basic.phone': 'Número de telefone', + 'app.settings.basic.phone-message': 'Por favor insira seu número de telefone!', + 'app.settings.basic.update': 'Atualizar Informações', + 'app.settings.security.strong': 'Forte', + 'app.settings.security.medium': 'Média', + 'app.settings.security.weak': 'Fraca', + 'app.settings.security.password': 'Senha da Conta', + 'app.settings.security.password-description': 'Força da senha', + 'app.settings.security.phone': 'Telefone de Seguraça', + 'app.settings.security.phone-description': 'Telefone vinculado', + 'app.settings.security.question': 'Pergunta de Segurança', + 'app.settings.security.question-description': + 'A pergunta de segurança não está definida e a polÃtica de segurança pode proteger efetivamente a segurança da conta', + 'app.settings.security.email': 'Email de Backup', + 'app.settings.security.email-description': 'Email vinculado', + 'app.settings.security.mfa': 'Dispositivo MFA', + 'app.settings.security.mfa-description': + 'O dispositivo MFA não vinculado, após a vinculação, pode ser confirmado duas vezes', + 'app.settings.security.modify': 'Modificar', + 'app.settings.security.set': 'Atribuir', + 'app.settings.security.bind': 'Vincular', + 'app.settings.binding.taobao': 'Vincular Taobao', + 'app.settings.binding.taobao-description': 'Atualmente não vinculado à conta Taobao', + 'app.settings.binding.alipay': 'Vincular Alipay', + 'app.settings.binding.alipay-description': 'Atualmente não vinculado à conta Alipay', + 'app.settings.binding.dingding': 'Vincular DingTalk', + 'app.settings.binding.dingding-description': 'Atualmente não vinculado à conta DingTalk', + 'app.settings.binding.bind': 'Vincular', + 'app.settings.notification.password': 'Senha da Conta', + 'app.settings.notification.password-description': + 'Mensagens de outros usuários serão notificadas na forma de uma estação de letra', + 'app.settings.notification.messages': 'Mensagens de Sistema', + 'app.settings.notification.messages-description': + 'Mensagens de sistema serão notificadas na forma de uma estação de letra', + 'app.settings.notification.todo': 'Notificação de To-do', + 'app.settings.notification.todo-description': + 'A lista de to-do será notificada na forma de uma estação de letra', + 'app.settings.open': 'Aberto', + 'app.settings.close': 'Fechado', +}; diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts new file mode 100644 index 0000000..565b2c3 --- /dev/null +++ b/src/locales/zh-CN.ts @@ -0,0 +1,24 @@ +import component from './zh-CN/component'; +import globalHeader from './zh-CN/globalHeader'; +import menu from './zh-CN/menu'; +import pwa from './zh-CN/pwa'; +import settingDrawer from './zh-CN/settingDrawer'; +import settings from './zh-CN/settings'; +import pages from './zh-CN/pages'; + +export default { + 'navBar.lang': 'è¯è¨€', + 'layout.user.link.help': '帮助', + 'layout.user.link.privacy': 'éšç§', + 'layout.user.link.terms': 'æ¡æ¬¾', + 'app.preview.down.block': '下载æ¤é¡µé¢åˆ°æœ¬åœ°é¡¹ç›®', + 'app.welcome.link.fetch-blocks': '获å–全部区å—', + 'app.welcome.link.block-list': '基于 block å¼€å‘ï¼Œå¿«é€Ÿæž„å»ºæ ‡å‡†é¡µé¢', + ...pages, + ...globalHeader, + ...menu, + ...settingDrawer, + ...settings, + ...pwa, + ...component, +}; diff --git a/src/locales/zh-CN/component.ts b/src/locales/zh-CN/component.ts new file mode 100644 index 0000000..1f1fead --- /dev/null +++ b/src/locales/zh-CN/component.ts @@ -0,0 +1,5 @@ +export default { + 'component.tagSelect.expand': '展开', + 'component.tagSelect.collapse': 'æ”¶èµ·', + 'component.tagSelect.all': '全部', +}; diff --git a/src/locales/zh-CN/globalHeader.ts b/src/locales/zh-CN/globalHeader.ts new file mode 100644 index 0000000..9fd66a5 --- /dev/null +++ b/src/locales/zh-CN/globalHeader.ts @@ -0,0 +1,17 @@ +export default { + 'component.globalHeader.search': '站内æœç´¢', + 'component.globalHeader.search.example1': 'æœç´¢æç¤ºä¸€', + 'component.globalHeader.search.example2': 'æœç´¢æç¤ºäºŒ', + 'component.globalHeader.search.example3': 'æœç´¢æç¤ºä¸‰', + 'component.globalHeader.help': '使用文档', + 'component.globalHeader.notification': '通知', + 'component.globalHeader.notification.empty': 'ä½ å·²æŸ¥çœ‹æ‰€æœ‰é€šçŸ¥', + 'component.globalHeader.message': '消æ¯', + 'component.globalHeader.message.empty': '您已读完所有消æ¯', + 'component.globalHeader.event': '待办', + 'component.globalHeader.event.empty': 'ä½ å·²å®Œæˆæ‰€æœ‰å¾…办', + 'component.noticeIcon.clear': '清空', + 'component.noticeIcon.cleared': '清空了', + 'component.noticeIcon.empty': 'æš‚æ— æ•°æ®', + 'component.noticeIcon.view-more': '查看更多', +}; diff --git a/src/locales/zh-CN/menu.ts b/src/locales/zh-CN/menu.ts new file mode 100644 index 0000000..985b516 --- /dev/null +++ b/src/locales/zh-CN/menu.ts @@ -0,0 +1,52 @@ +export default { + 'menu.welcome': '欢迎', + 'menu.more-blocks': '更多区å—', + 'menu.home': '首页', + 'menu.admin': '管ç†é¡µ', + 'menu.admin.sub-page': '二级管ç†é¡µ', + 'menu.login': '登录', + 'menu.register': '注册', + 'menu.register.result': '注册结果', + 'menu.dashboard': 'Dashboard', + 'menu.dashboard.analysis': '分æžé¡µ', + 'menu.dashboard.monitor': '监控页', + 'menu.dashboard.workplace': '工作å°', + 'menu.exception.403': '403', + 'menu.exception.404': '404', + 'menu.exception.500': '500', + 'menu.form': '表å•页', + 'menu.form.basic-form': '基础表å•', + 'menu.form.step-form': '分æ¥è¡¨å•', + 'menu.form.step-form.info': '分æ¥è¡¨å•(填写转账信æ¯ï¼‰', + 'menu.form.step-form.confirm': '分æ¥è¡¨å•(确认转账信æ¯ï¼‰', + 'menu.form.step-form.result': '分æ¥è¡¨å•(完æˆï¼‰', + 'menu.form.advanced-form': '高级表å•', + 'menu.list': '列表页', + 'menu.list.table-list': 'æŸ¥è¯¢è¡¨æ ¼', + 'menu.list.basic-list': 'æ ‡å‡†åˆ—è¡¨', + 'menu.list.card-list': 'å¡ç‰‡åˆ—表', + 'menu.list.search-list': 'æœç´¢åˆ—表', + 'menu.list.search-list.articles': 'æœç´¢åˆ—è¡¨ï¼ˆæ–‡ç« ï¼‰', + 'menu.list.search-list.projects': 'æœç´¢åˆ—表(项目)', + 'menu.list.search-list.applications': 'æœç´¢åˆ—表(应用)', + 'menu.profile': '详情页', + 'menu.profile.basic': '基础详情页', + 'menu.profile.advanced': '高级详情页', + 'menu.result': '结果页', + 'menu.result.success': 'æˆåŠŸé¡µ', + 'menu.result.fail': '失败页', + 'menu.exception': '异常页', + 'menu.exception.not-permission': '403', + 'menu.exception.not-find': '404', + 'menu.exception.server-error': '500', + 'menu.exception.trigger': '触å‘错误', + 'menu.account': '个人页', + 'menu.account.center': '个人ä¸å¿ƒ', + 'menu.account.settings': '个人设置', + 'menu.account.trigger': 'è§¦å‘æŠ¥é”™', + 'menu.account.logout': '退出登录', + 'menu.editor': '图形编辑器', + 'menu.editor.flow': 'æµç¨‹ç¼–辑器', + 'menu.editor.mind': '脑图编辑器', + 'menu.editor.koni': '拓扑编辑器', +}; diff --git a/src/locales/zh-CN/pages.ts b/src/locales/zh-CN/pages.ts new file mode 100644 index 0000000..96298b3 --- /dev/null +++ b/src/locales/zh-CN/pages.ts @@ -0,0 +1,65 @@ +export default { + 'pages.layouts.userLayout.title': 'Ant Design 是西湖区最具影å“力的 Web 设计规范', + 'pages.login.accountLogin.tab': '账户密ç 登录', + 'pages.login.accountLogin.errorMessage': '错误的用户å和密ç (admin/ant.design)', + 'pages.login.username.placeholder': '用户å: admin or user', + 'pages.login.username.required': 'ç”¨æˆ·åæ˜¯å¿…填项ï¼', + 'pages.login.password.placeholder': '密ç : ant.design', + 'pages.login.password.required': 'å¯†ç æ˜¯å¿…填项ï¼', + 'pages.login.phoneLogin.tab': '手机å·ç™»å½•', + 'pages.login.phoneLogin.errorMessage': '验è¯ç 错误', + 'pages.login.phoneNumber.placeholder': '请输入手机å·ï¼', + 'pages.login.phoneNumber.required': 'æ‰‹æœºå·æ˜¯å¿…填项ï¼', + 'pages.login.phoneNumber.invalid': 'ä¸åˆæ³•的手机å·ï¼', + 'pages.login.captcha.placeholder': '请输入验è¯ç ï¼', + 'pages.login.captcha.required': '验è¯ç 是必填项ï¼', + 'pages.login.phoneLogin.getVerificationCode': '获å–验è¯ç ', + 'pages.getCaptchaSecondText': 'ç§’åŽé‡æ–°èŽ·å–', + 'pages.login.rememberMe': '自动登录', + 'pages.login.forgotPassword': '忘记密ç ?', + 'pages.login.submit': 'æäº¤', + 'pages.login.loginWith': 'å…¶ä»–ç™»å½•æ–¹å¼ :', + 'pages.login.registerAccount': '注册账户', + 'pages.welcome.advancedComponent': 'é«˜çº§è¡¨æ ¼', + 'pages.welcome.link': '欢迎使用', + 'pages.welcome.advancedLayout': '高级布局', + 'pages.welcome.alertMessage': '更快更强的é‡åž‹ç»„件,已ç»å‘布。', + 'pages.admin.subPage.title': ' 这个页é¢åªæœ‰ admin æƒé™æ‰èƒ½æŸ¥çœ‹', + 'pages.admin.subPage.alertMessage': 'umi ui 现已å‘布,欢迎使用 npm run ui å¯åŠ¨ä½“éªŒã€‚', + 'pages.searchTable.createForm.newRule': '新建规则', + 'pages.searchTable.updateForm.ruleConfig': '规则é…ç½®', + 'pages.searchTable.updateForm.basicConfig': '基本信æ¯', + 'pages.searchTable.updateForm.ruleName.nameLabel': '规则åç§°', + 'pages.searchTable.updateForm.ruleName.nameRules': '请输入规则åç§°ï¼', + 'pages.searchTable.updateForm.ruleDesc.descLabel': '规则æè¿°', + 'pages.searchTable.updateForm.ruleDesc.descPlaceholder': '请输入至少五个å—符', + 'pages.searchTable.updateForm.ruleDesc.descRules': '请输入至少五个å—符的规则æè¿°ï¼', + 'pages.searchTable.updateForm.ruleProps.title': 'é…置规则属性', + 'pages.searchTable.updateForm.object': '监控对象', + 'pages.searchTable.updateForm.ruleProps.templateLabel': '规则模æ¿', + 'pages.searchTable.updateForm.ruleProps.typeLabel': '规则类型', + 'pages.searchTable.updateForm.schedulingPeriod.title': '设定调度周期', + 'pages.searchTable.updateForm.schedulingPeriod.timeLabel': '开始时间', + 'pages.searchTable.updateForm.schedulingPeriod.timeRules': '请选择开始时间ï¼', + 'pages.searchTable.titleDesc': 'æè¿°', + 'pages.searchTable.ruleName': '规则å称为必填项', + 'pages.searchTable.titleCallNo': 'æœåŠ¡è°ƒç”¨æ¬¡æ•°', + 'pages.searchTable.titleStatus': '状æ€', + 'pages.searchTable.nameStatus.default': 'å…³é—', + 'pages.searchTable.nameStatus.running': 'è¿è¡Œä¸', + 'pages.searchTable.nameStatus.online': '已上线', + 'pages.searchTable.nameStatus.abnormal': '异常', + 'pages.searchTable.titleUpdatedAt': '上次调度时间', + 'pages.searchTable.exception': 'è¯·è¾“å…¥å¼‚å¸¸åŽŸå› ï¼', + 'pages.searchTable.titleOption': 'æ“作', + 'pages.searchTable.config': 'é…ç½®', + 'pages.searchTable.subscribeAlert': 'è®¢é˜…è¦æŠ¥', + 'pages.searchTable.title': 'æŸ¥è¯¢è¡¨æ ¼', + 'pages.searchTable.new': '新建', + 'pages.searchTable.chosen': '已选择', + 'pages.searchTable.item': '项', + 'pages.searchTable.totalServiceCalls': 'æœåŠ¡è°ƒç”¨æ¬¡æ•°æ€»è®¡', + 'pages.searchTable.tenThousand': '万', + 'pages.searchTable.batchDeletion': '批é‡åˆ 除', + 'pages.searchTable.batchApproval': '批é‡å®¡æ‰¹', +}; diff --git a/src/locales/zh-CN/pwa.ts b/src/locales/zh-CN/pwa.ts new file mode 100644 index 0000000..e950484 --- /dev/null +++ b/src/locales/zh-CN/pwa.ts @@ -0,0 +1,6 @@ +export default { + 'app.pwa.offline': '当å‰å¤„于离线状æ€', + 'app.pwa.serviceworker.updated': '有新内容', + 'app.pwa.serviceworker.updated.hint': 'è¯·ç‚¹å‡»â€œåˆ·æ–°â€æŒ‰é’®æˆ–者手动刷新页é¢', + 'app.pwa.serviceworker.updated.ok': '刷新', +}; diff --git a/src/locales/zh-CN/settingDrawer.ts b/src/locales/zh-CN/settingDrawer.ts new file mode 100644 index 0000000..15685a4 --- /dev/null +++ b/src/locales/zh-CN/settingDrawer.ts @@ -0,0 +1,31 @@ +export default { + 'app.setting.pagestyle': 'æ•´ä½“é£Žæ ¼è®¾ç½®', + 'app.setting.pagestyle.dark': '暗色èœå•é£Žæ ¼', + 'app.setting.pagestyle.light': '亮色èœå•é£Žæ ¼', + 'app.setting.content-width': '内容区域宽度', + 'app.setting.content-width.fixed': '定宽', + 'app.setting.content-width.fluid': 'æµå¼', + 'app.setting.themecolor': '主题色', + 'app.setting.themecolor.dust': 'è–„æš®', + 'app.setting.themecolor.volcano': 'ç«å±±', + 'app.setting.themecolor.sunset': '日暮', + 'app.setting.themecolor.cyan': '明é’', + 'app.setting.themecolor.green': 'æžå…‰ç»¿', + 'app.setting.themecolor.daybreak': '拂晓è“(默认)', + 'app.setting.themecolor.geekblue': 'æžå®¢è“', + 'app.setting.themecolor.purple': '酱紫', + 'app.setting.navigationmode': '导航模å¼', + 'app.setting.sidemenu': 'ä¾§è¾¹èœå•布局', + 'app.setting.topmenu': '顶部èœå•布局', + 'app.setting.fixedheader': '固定 Header', + 'app.setting.fixedsidebar': '固定侧边èœå•', + 'app.setting.fixedsidebar.hint': 'ä¾§è¾¹èœå•布局时å¯é…ç½®', + 'app.setting.hideheader': '下滑时éšè— Header', + 'app.setting.hideheader.hint': '固定 Header æ—¶å¯é…ç½®', + 'app.setting.othersettings': '其他设置', + 'app.setting.weakmode': '色弱模å¼', + 'app.setting.copy': 'æ‹·è´è®¾ç½®', + 'app.setting.copyinfo': 'æ‹·è´æˆåŠŸï¼Œè¯·åˆ° src/defaultSettings.js 䏿›¿æ¢é»˜è®¤é…ç½®', + 'app.setting.production.hint': + 'é…ç½®æ åªåœ¨å¼€å‘环境用于预览,生产环境ä¸ä¼šå±•现,请拷è´åŽæ‰‹åŠ¨ä¿®æ”¹é…置文件', +}; diff --git a/src/locales/zh-CN/settings.ts b/src/locales/zh-CN/settings.ts new file mode 100644 index 0000000..df8af43 --- /dev/null +++ b/src/locales/zh-CN/settings.ts @@ -0,0 +1,55 @@ +export default { + 'app.settings.menuMap.basic': '基本设置', + 'app.settings.menuMap.security': '安全设置', + 'app.settings.menuMap.binding': 'è´¦å·ç»‘定', + 'app.settings.menuMap.notification': '新消æ¯é€šçŸ¥', + 'app.settings.basic.avatar': '头åƒ', + 'app.settings.basic.change-avatar': 'æ›´æ¢å¤´åƒ', + 'app.settings.basic.email': '邮箱', + 'app.settings.basic.email-message': '请输入您的邮箱!', + 'app.settings.basic.nickname': '昵称', + 'app.settings.basic.nickname-message': '请输入您的昵称!', + 'app.settings.basic.profile': '个人简介', + 'app.settings.basic.profile-message': '请输入个人简介!', + 'app.settings.basic.profile-placeholder': '个人简介', + 'app.settings.basic.country': '国家/地区', + 'app.settings.basic.country-message': '请输入您的国家或地区!', + 'app.settings.basic.geographic': '所在çœå¸‚', + 'app.settings.basic.geographic-message': '请输入您的所在çœå¸‚!', + 'app.settings.basic.address': 'è¡—é“地å€', + 'app.settings.basic.address-message': '请输入您的街é“地å€!', + 'app.settings.basic.phone': 'è”系电è¯', + 'app.settings.basic.phone-message': '请输入您的è”系电è¯!', + 'app.settings.basic.update': '更新基本信æ¯', + 'app.settings.security.strong': '强', + 'app.settings.security.medium': 'ä¸', + 'app.settings.security.weak': 'å¼±', + 'app.settings.security.password': '账户密ç ', + 'app.settings.security.password-description': '当å‰å¯†ç 强度', + 'app.settings.security.phone': 'å¯†ä¿æ‰‹æœº', + 'app.settings.security.phone-description': '已绑定手机', + 'app.settings.security.question': '密ä¿é—®é¢˜', + 'app.settings.security.question-description': '未设置密ä¿é—®é¢˜ï¼Œå¯†ä¿é—®é¢˜å¯æœ‰æ•ˆä¿æŠ¤è´¦æˆ·å®‰å…¨', + 'app.settings.security.email': '备用邮箱', + 'app.settings.security.email-description': '已绑定邮箱', + 'app.settings.security.mfa': 'MFA 设备', + 'app.settings.security.mfa-description': '未绑定 MFA 设备,绑定åŽï¼Œå¯ä»¥è¿›è¡ŒäºŒæ¬¡ç¡®è®¤', + 'app.settings.security.modify': '修改', + 'app.settings.security.set': '设置', + 'app.settings.security.bind': '绑定', + 'app.settings.binding.taobao': '绑定淘å®', + 'app.settings.binding.taobao-description': '当剿œªç»‘定淘å®è´¦å·', + 'app.settings.binding.alipay': '绑定支付å®', + 'app.settings.binding.alipay-description': '当剿œªç»‘定支付å®è´¦å·', + 'app.settings.binding.dingding': '绑定钉钉', + 'app.settings.binding.dingding-description': '当剿œªç»‘定钉钉账å·', + 'app.settings.binding.bind': '绑定', + 'app.settings.notification.password': '账户密ç ', + 'app.settings.notification.password-description': '其他用户的消æ¯å°†ä»¥ç«™å†…信的形å¼é€šçŸ¥', + 'app.settings.notification.messages': '系统消æ¯', + 'app.settings.notification.messages-description': '系统消æ¯å°†ä»¥ç«™å†…信的形å¼é€šçŸ¥', + 'app.settings.notification.todo': '待办任务', + 'app.settings.notification.todo-description': '待办任务将以站内信的形å¼é€šçŸ¥', + 'app.settings.open': 'å¼€', + 'app.settings.close': 'å…³', +}; diff --git a/src/locales/zh-TW.ts b/src/locales/zh-TW.ts new file mode 100644 index 0000000..6ad5f93 --- /dev/null +++ b/src/locales/zh-TW.ts @@ -0,0 +1,20 @@ +import component from './zh-TW/component'; +import globalHeader from './zh-TW/globalHeader'; +import menu from './zh-TW/menu'; +import pwa from './zh-TW/pwa'; +import settingDrawer from './zh-TW/settingDrawer'; +import settings from './zh-TW/settings'; + +export default { + 'navBar.lang': '語言', + 'layout.user.link.help': '幫助', + 'layout.user.link.privacy': 'éš±ç§', + 'layout.user.link.terms': 'æ¢æ¬¾', + 'app.preview.down.block': '下載æ¤é é¢åˆ°æœ¬åœ°é …ç›®', + ...globalHeader, + ...menu, + ...settingDrawer, + ...settings, + ...pwa, + ...component, +}; diff --git a/src/locales/zh-TW/component.ts b/src/locales/zh-TW/component.ts new file mode 100644 index 0000000..ba48e29 --- /dev/null +++ b/src/locales/zh-TW/component.ts @@ -0,0 +1,5 @@ +export default { + 'component.tagSelect.expand': '展開', + 'component.tagSelect.collapse': 'æ”¶èµ·', + 'component.tagSelect.all': '全部', +}; diff --git a/src/locales/zh-TW/globalHeader.ts b/src/locales/zh-TW/globalHeader.ts new file mode 100644 index 0000000..ed58451 --- /dev/null +++ b/src/locales/zh-TW/globalHeader.ts @@ -0,0 +1,17 @@ +export default { + 'component.globalHeader.search': '站內æœç´¢', + 'component.globalHeader.search.example1': 'æœç´¢æç¤ºå£¹', + 'component.globalHeader.search.example2': 'æœç´¢æç¤ºäºŒ', + 'component.globalHeader.search.example3': 'æœç´¢æç¤ºä¸‰', + 'component.globalHeader.help': '使用手冊', + 'component.globalHeader.notification': '通知', + 'component.globalHeader.notification.empty': '妳已查看所有通知', + 'component.globalHeader.message': '消æ¯', + 'component.globalHeader.message.empty': '您已讀完所有消æ¯', + 'component.globalHeader.event': '待辦', + 'component.globalHeader.event.empty': 'å¦³å·²å®Œæˆæ‰€æœ‰å¾…辦', + 'component.noticeIcon.clear': '清空', + 'component.noticeIcon.cleared': '清空了', + 'component.noticeIcon.empty': '暫無資料', + 'component.noticeIcon.view-more': '查看更多', +}; diff --git a/src/locales/zh-TW/menu.ts b/src/locales/zh-TW/menu.ts new file mode 100644 index 0000000..d724459 --- /dev/null +++ b/src/locales/zh-TW/menu.ts @@ -0,0 +1,52 @@ +export default { + 'menu.welcome': 'æ¡è¿Ž', + 'menu.more-blocks': '更多å€å¡Š', + 'menu.home': '首é ', + 'menu.login': '登錄', + 'menu.admin': 'æƒé™', + 'menu.admin.sub-page': '二级管ç†é¡µ', + 'menu.exception.403': '403', + 'menu.exception.404': '404', + 'menu.exception.500': '500', + 'menu.register': '註冊', + 'menu.register.result': 'è¨»å†Šçµæžœ', + 'menu.dashboard': 'Dashboard', + 'menu.dashboard.analysis': '分æžé ', + 'menu.dashboard.monitor': '監控é ', + 'menu.dashboard.workplace': '工作臺', + 'menu.form': '表單é ', + 'menu.form.basic-form': '基礎表單', + 'menu.form.step-form': '分æ¥è¡¨å–®', + 'menu.form.step-form.info': '分æ¥è¡¨å–®ï¼ˆå¡«å¯«è½‰è³¬ä¿¡æ¯ï¼‰', + 'menu.form.step-form.confirm': '分æ¥è¡¨å–®ï¼ˆç¢ºèªè½‰è³¬ä¿¡æ¯ï¼‰', + 'menu.form.step-form.result': '分æ¥è¡¨å–®ï¼ˆå®Œæˆï¼‰', + 'menu.form.advanced-form': '高級表單', + 'menu.list': '列表é ', + 'menu.list.table-list': 'æŸ¥è©¢è¡¨æ ¼', + 'menu.list.basic-list': '標淮列表', + 'menu.list.card-list': 'å¡ç‰‡åˆ—表', + 'menu.list.search-list': 'æœç´¢åˆ—表', + 'menu.list.search-list.articles': 'æœç´¢åˆ—è¡¨ï¼ˆæ–‡ç« ï¼‰', + 'menu.list.search-list.projects': 'æœç´¢åˆ—è¡¨ï¼ˆé …ç›®ï¼‰', + 'menu.list.search-list.applications': 'æœç´¢åˆ—表(應用)', + 'menu.profile': '詳情é ', + 'menu.profile.basic': '基礎詳情é ', + 'menu.profile.advanced': '高級詳情é ', + 'menu.result': 'çµæžœé ', + 'menu.result.success': 'æˆåŠŸé ', + 'menu.result.fail': '失敗é ', + 'menu.account': '個人é ', + 'menu.account.center': '個人ä¸å¿ƒ', + 'menu.account.settings': '個人è¨ç½®', + 'menu.account.trigger': 'è§¸ç™¼å ±éŒ¯', + 'menu.account.logout': '退出登錄', + 'menu.exception': '异常页', + 'menu.exception.not-permission': '403', + 'menu.exception.not-find': '404', + 'menu.exception.server-error': '500', + 'menu.exception.trigger': '触å‘错误', + 'menu.editor': '圖形編輯器', + 'menu.editor.flow': 'æµç¨‹ç·¨è¼¯å™¨', + 'menu.editor.mind': '腦圖編輯器', + 'menu.editor.koni': '拓撲編輯器', +}; diff --git a/src/locales/zh-TW/pwa.ts b/src/locales/zh-TW/pwa.ts new file mode 100644 index 0000000..108a6e4 --- /dev/null +++ b/src/locales/zh-TW/pwa.ts @@ -0,0 +1,6 @@ +export default { + 'app.pwa.offline': 'ç•¶å‰è™•於離線狀態', + 'app.pwa.serviceworker.updated': '有新內容', + 'app.pwa.serviceworker.updated.hint': 'è«‹é»žæ“Šâ€œåˆ·æ–°â€æŒ‰éˆ•或者手動刷新é é¢', + 'app.pwa.serviceworker.updated.ok': '刷新', +}; diff --git a/src/locales/zh-TW/settingDrawer.ts b/src/locales/zh-TW/settingDrawer.ts new file mode 100644 index 0000000..24dc281 --- /dev/null +++ b/src/locales/zh-TW/settingDrawer.ts @@ -0,0 +1,31 @@ +export default { + 'app.setting.pagestyle': 'æ•´é«”é¢¨æ ¼è¨ç½®', + 'app.setting.pagestyle.dark': '暗色èœå–®é¢¨æ ¼', + 'app.setting.pagestyle.light': '亮色èœå–®é¢¨æ ¼', + 'app.setting.content-width': '內容å€åŸŸå¯¬åº¦', + 'app.setting.content-width.fixed': '定寬', + 'app.setting.content-width.fluid': 'æµå¼', + 'app.setting.themecolor': '主題色', + 'app.setting.themecolor.dust': 'è–„æš®', + 'app.setting.themecolor.volcano': 'ç«å±±', + 'app.setting.themecolor.sunset': '日暮', + 'app.setting.themecolor.cyan': '明é’', + 'app.setting.themecolor.green': 'æ¥µå…‰ç¶ ', + 'app.setting.themecolor.daybreak': '拂曉è—(默èªï¼‰', + 'app.setting.themecolor.geekblue': '極客è—', + 'app.setting.themecolor.purple': '醬紫', + 'app.setting.navigationmode': '導航模å¼', + 'app.setting.sidemenu': 'å´é‚Šèœå–®å¸ƒå±€', + 'app.setting.topmenu': 'é ‚éƒ¨èœå–®å¸ƒå±€', + 'app.setting.fixedheader': '固定 Header', + 'app.setting.fixedsidebar': '固定å´é‚Šèœå–®', + 'app.setting.fixedsidebar.hint': 'å´é‚Šèœå–®å¸ƒå±€æ™‚å¯é…ç½®', + 'app.setting.hideheader': 'ä¸‹æ»‘æ™‚éš±è— Header', + 'app.setting.hideheader.hint': '固定 Header 時å¯é…ç½®', + 'app.setting.othersettings': 'å…¶ä»–è¨ç½®', + 'app.setting.weakmode': '色弱模å¼', + 'app.setting.copy': 'æ‹·è²è¨ç½®', + 'app.setting.copyinfo': 'æ‹·è²æˆåŠŸï¼Œè«‹åˆ° src/defaultSettings.js 䏿›¿æ›é»˜èªé…ç½®', + 'app.setting.production.hint': + 'é…置欄åªåœ¨é–‹ç™¼ç’°å¢ƒç”¨æ–¼é è¦½ï¼Œç”Ÿç”¢ç’°å¢ƒä¸æœƒå±•ç¾ï¼Œè«‹æ‹·è²å¾Œæ‰‹å‹•修改é…置文件', +}; diff --git a/src/locales/zh-TW/settings.ts b/src/locales/zh-TW/settings.ts new file mode 100644 index 0000000..dd45151 --- /dev/null +++ b/src/locales/zh-TW/settings.ts @@ -0,0 +1,55 @@ +export default { + 'app.settings.menuMap.basic': '基本è¨ç½®', + 'app.settings.menuMap.security': '安全è¨ç½®', + 'app.settings.menuMap.binding': '賬號ç¶å®š', + 'app.settings.menuMap.notification': '新消æ¯é€šçŸ¥', + 'app.settings.basic.avatar': 'é åƒ', + 'app.settings.basic.change-avatar': 'æ›´æ›é åƒ', + 'app.settings.basic.email': '郵箱', + 'app.settings.basic.email-message': '請輸入您的郵箱!', + 'app.settings.basic.nickname': '昵稱', + 'app.settings.basic.nickname-message': '請輸入您的昵稱!', + 'app.settings.basic.profile': '個人簡介', + 'app.settings.basic.profile-message': '請輸入個人簡介!', + 'app.settings.basic.profile-placeholder': '個人簡介', + 'app.settings.basic.country': '國家/地å€', + 'app.settings.basic.country-message': '請輸入您的國家或地å€!', + 'app.settings.basic.geographic': '所在çœå¸‚', + 'app.settings.basic.geographic-message': '請輸入您的所在çœå¸‚!', + 'app.settings.basic.address': 'è¡—é“地å€', + 'app.settings.basic.address-message': '請輸入您的街é“地å€!', + 'app.settings.basic.phone': 'è¯ç³»é›»è©±', + 'app.settings.basic.phone-message': '請輸入您的è¯ç³»é›»è©±!', + 'app.settings.basic.update': '更新基本信æ¯', + 'app.settings.security.strong': 'å¼·', + 'app.settings.security.medium': 'ä¸', + 'app.settings.security.weak': 'å¼±', + 'app.settings.security.password': '賬戶密碼', + 'app.settings.security.password-description': 'ç•¶å‰å¯†ç¢¼å¼·åº¦', + 'app.settings.security.phone': 'å¯†ä¿æ‰‹æ©Ÿ', + 'app.settings.security.phone-description': 'å·²ç¶å®šæ‰‹æ©Ÿ', + 'app.settings.security.question': '密ä¿å•題', + 'app.settings.security.question-description': '未è¨ç½®å¯†ä¿å•題,密ä¿å•é¡Œå¯æœ‰æ•ˆä¿è·è³¬æˆ¶å®‰å…¨', + 'app.settings.security.email': '備用郵箱', + 'app.settings.security.email-description': 'å·²ç¶å®šéƒµç®±', + 'app.settings.security.mfa': 'MFA è¨å‚™', + 'app.settings.security.mfa-description': '未ç¶å®š MFA è¨å‚™ï¼Œç¶å®šå¾Œï¼Œå¯ä»¥é€²è¡ŒäºŒæ¬¡ç¢ºèª', + 'app.settings.security.modify': '修改', + 'app.settings.security.set': 'è¨ç½®', + 'app.settings.security.bind': 'ç¶å®š', + 'app.settings.binding.taobao': 'ç¶å®šæ·˜å¯¶', + 'app.settings.binding.taobao-description': 'ç•¶å‰æœªç¶å®šæ·˜å¯¶è³¬è™Ÿ', + 'app.settings.binding.alipay': 'ç¶å®šæ”¯ä»˜å¯¶', + 'app.settings.binding.alipay-description': 'ç•¶å‰æœªç¶å®šæ”¯ä»˜å¯¶è³¬è™Ÿ', + 'app.settings.binding.dingding': 'ç¶å®šé‡˜é‡˜', + 'app.settings.binding.dingding-description': 'ç•¶å‰æœªç¶å®šé‡˜é‡˜è³¬è™Ÿ', + 'app.settings.binding.bind': 'ç¶å®š', + 'app.settings.notification.password': '賬戶密碼', + 'app.settings.notification.password-description': '其他用戶的消æ¯å°‡ä»¥ç«™å…§ä¿¡çš„å½¢å¼é€šçŸ¥', + 'app.settings.notification.messages': '系統消æ¯', + 'app.settings.notification.messages-description': '系統消æ¯å°‡ä»¥ç«™å…§ä¿¡çš„å½¢å¼é€šçŸ¥', + 'app.settings.notification.todo': '待辦任務', + 'app.settings.notification.todo-description': '待辦任務將以站內信的形å¼é€šçŸ¥', + 'app.settings.open': 'é–‹', + 'app.settings.close': 'é—œ', +}; -- GitLab From d1eb6ef5ca513fc05621d28d3f40bd7708d62968 Mon Sep 17 00:00:00 2001 From: victor-liu <victorliu1999@gmail.com> Date: Tue, 5 Jan 2021 11:39:00 +1100 Subject: [PATCH 12/18] added global models --- src/models/ca.ts | 161 ++++++++++++++++++++++++ src/models/connect.d.ts | 28 +++++ src/models/meta.ts | 264 ++++++++++++++++++++++++++++++++++++++++ src/models/od.ts | 126 +++++++++++++++++++ src/models/setting.ts | 37 ++++++ src/models/user.ts | 185 ++++++++++++++++++++++++++++ 6 files changed, 801 insertions(+) create mode 100644 src/models/ca.ts create mode 100644 src/models/connect.d.ts create mode 100644 src/models/meta.ts create mode 100644 src/models/od.ts create mode 100644 src/models/setting.ts create mode 100644 src/models/user.ts diff --git a/src/models/ca.ts b/src/models/ca.ts new file mode 100644 index 0000000..6a42712 --- /dev/null +++ b/src/models/ca.ts @@ -0,0 +1,161 @@ +import { message } from 'antd'; +import { Reducer } from 'redux'; +import caSettings, { CaSettings } from '../configs/caSettings'; +import { Subscription, Effect } from 'dva'; +import { getCaConfigs } from '@/services/ca'; +import { getPageQuery, convertJsonToCamelCase } from '@/utils/utils'; +import { history } from 'umi'; + +import { ConnectState } from '@/models/connect'; +import { getLoadedModuleStatus as metaGet } from '@/utils/metaModules'; +import { setLoadedModuleStatus as caSet, reloadModuleStatus as caReload } from '@/utils/caModules'; +import _ from 'lodash'; +import { stringify } from 'querystring'; +import { metaTranslationOfCaGroups } from '@/constants/translationGroups'; +import defaultSettings from '../../config/defaultSettings'; + +export interface CaModelType { + namespace: 'ca'; + state: CaSettings; + effects: { + fetchMeta: Effect; + fetchCaConfigs: Effect; + }; + reducers: { + saveCaConfigs: Reducer<CaSettings>; + setCaId: Reducer<CaSettings>; + setLoadedModule: Reducer<CaSettings>; + }; + subscriptions: { + caInit: Subscription; + }; +} + +const MetaModel: CaModelType = { + namespace: 'ca', + state: caSettings, + effects: { + *fetchMeta(_, { put, all, select }) { + /* + 1. transPkg + 2. cities + */ + const { caId, requiredLang, metaLoadedModule } = yield select((state: ConnectState) => ({ + caId: state.ca.caId, + requiredLang: state.meta.viewingLang, + metaLoadedModule: state.meta.loadedModule, + })); + + const transGroups = metaTranslationOfCaGroups; // TBD. minimal required transPkg for ca meta + + const payload = { caId, requiredLang, transGroups }; + + let getActions = metaGet('ca', metaLoadedModule, payload); + + if (getActions) { + let actionArray: any = []; + _.forEach(getActions, (value: any) => actionArray.push(put(value))); + yield all(actionArray); + } + }, + *fetchCaConfigs({ caId }, { call, put }) { + const response = yield call(getCaConfigs, { caId }); + + if (response.success) { + const caConfigs = convertJsonToCamelCase(response.result); + yield put({ + type: 'saveCaConfigs', + caConfigs, + }); + } else { + if (response.message) { + message.error(response.message); + } + } + // æ”¹çŠ¶æ€ + yield put({ + type: 'meta/setLoadedModule', + key: 'caConfigs', + value: true, + }); + }, + }, + reducers: { + setCaId(state = caSettings, { caId }) { + if (localStorage) { + localStorage.setItem(`${defaultSettings.projectKey}-ca-id`, caId); + } + return { + ...state, + caId, + }; + }, + saveCaConfigs(state = caSettings, { caConfigs }) { + return { + ...state, + caConfigs, + }; + }, + setLoadedModule(state = caSettings, { reload = false, key, subKey, value }) { + let currentLoadedModule = state.loadedModule; + if (reload) { + currentLoadedModule = caReload(reload, currentLoadedModule); + } else { + if (key && subKey) { + currentLoadedModule.api[key][subKey] = value; + } else if (key) { + currentLoadedModule.api[key] = value; + } + } + const loadedModule = caSet(currentLoadedModule); + return { + ...state, + loadedModule, + }; + }, + }, + subscriptions: { + caInit({ + dispatch, + history: { + location: { pathname, search }, + }, + }): any { + console.log(`pathname: ${pathname}` + ' CA model - init - set up ca from url params'); + console.log(`search: ${search}`); + + const { ca_id, ...queryParams } = getPageQuery() as { + ca_id: string; + queryParams: any; + }; + + //============处ç†caId (local | query)==============// + let caId = ca_id ? ca_id : false; + + if (!caId) { + const projectKey = defaultSettings.projectKey; + // if no city passed from url, try to read from the local storage + const localCaId = + localStorage && localStorage.getItem(`${projectKey}-ca-id`) + ? localStorage.getItem(`${projectKey}-ca-id`) + : false; + caId = localCaId ? localCaId : false; //TBD. + } + + if (caId) { + //set viewingBusinessId + dispatch({ + type: 'setCaId', + caId, + }); + } + //============处ç†caId - End ==============// + + history.replace({ + pathname: pathname === '/' ? '/od' : pathname, + search: stringify({ ...queryParams } as any), + }); + }, + }, +}; +export default MetaModel; diff --git a/src/models/connect.d.ts b/src/models/connect.d.ts new file mode 100644 index 0000000..d0c8ae1 --- /dev/null +++ b/src/models/connect.d.ts @@ -0,0 +1,28 @@ +import { MenuDataItem, Settings as ProSettings } from '@ant-design/pro-layout'; + +import { CaSettings } from '@/configs/caSettings'; +import { OdSettings } from '@/configs/odSettings'; +import { UserSettings } from '@/configs/userSettings'; +import { MetaSettings } from '@/configs/metaSettings'; + +export { GlobalModelState, UserModelState }; + +export interface Loading { + global: boolean; + effects: { [key: string]: boolean | undefined }; + models: { [key: string]: boolean | undefined }; +} + +export interface ConnectState { + meta: MetaSettings; + + user: UserModelState; + ca: CaSettings; + od: OdModelState; + + loading: Loading; +} + +export interface Route extends MenuDataItem { + routes?: Route[]; +} diff --git a/src/models/meta.ts b/src/models/meta.ts new file mode 100644 index 0000000..f5f6b0f --- /dev/null +++ b/src/models/meta.ts @@ -0,0 +1,264 @@ +import { message } from 'antd'; +import { Reducer } from 'redux'; + +import { Subscription, Effect } from 'dva'; + +import { getPageQuery } from '@/utils/utils'; +import { setLoadedModuleStatus, reloadModuleStatus } from '@/utils/metaModules'; +import { stringify } from 'querystring'; +import { ConnectState } from '@/models/connect'; + +import { history } from 'umi'; +import { setLocale } from 'umi'; + +import { getTranslations, getCurrentUserdetails } from '@/services/meta'; + +import metaSettings, { MetaSettings } from '../configs/metaSettings'; +import defaultSettings from '../../config/defaultSettings'; + +import { languageLabel, languageToLocal } from '@/constants/languages'; +import { ValidLoginRedirectParams } from '@/constants/routesParams'; + +import { convertJsonToCamelCase } from '@/utils/utils'; + +export interface MetaModelType { + namespace: string; + state: MetaSettings; + effects: { + fetchTranslations: Effect; + fetchCurrentUserDetails: Effect; + }; + reducers: { + setViewingLang: Reducer<MetaSettings>; + saveTranslations: Reducer<MetaSettings>; + saveCurrentUserDetails: Reducer<MetaSettings>; + + setMobileType: Reducer<MetaSettings>; + setLoginRedirect: Reducer<MetaSettings>; + + setLoadedModule: Reducer<MetaSettings>; + }; + subscriptions: { + metaInit: Subscription; + }; +} + +const MetaModel: MetaModelType = { + namespace: 'meta', + state: metaSettings, + effects: { + *fetchTranslations( + { requiredLang, transGroups = false, baseTans = false }, + { call, put, select }, + ) { + /* + before fetching the need translations pkg, + need to do a check first. + + transGroups must be passed + */ + const { currentLang, currentTransGroups } = yield select((state: ConnectState) => ({ + currentLang: state.meta.translations.lang, + currentTransGroups: Object.keys(state.meta.translations), + })); + + //do the filter + if (transGroups && requiredLang === currentLang) { + transGroups = transGroups.filter((group: string) => !currentTransGroups.includes(group)); + } + + // if no transGroups or no groups need to find + if ((!transGroups || transGroups.length === 0) && baseTans) { + yield put({ + type: 'setLoadedModule', + trans: true, + key: baseTans, + value: true, + }); + return; + } + + const response = yield call(getTranslations, { transGroups }); + + if (response.success) { + setLocale(languageToLocal[response.result.lang], false); + yield put({ + type: 'saveTranslations', + payload: { + replace: requiredLang === currentLang ? false : true, + passedTranslations: response.result, + notify: response.message, + }, + }); + + if (baseTans) { + //ä»£è¡¨è¿™ä¸ªè¯·æ±‚è¦æ”¹ -基 -翻译类 + yield put({ + type: 'setLoadedModule', + trans: true, + key: baseTans, + value: true, + }); + } + } + }, + *fetchCurrentUserDetails({ userId }, { call, put }) { + const response = yield call(getCurrentUserdetails, { userId }); + if (response.success) { + const currentUserDetails = convertJsonToCamelCase(response.result); + yield put({ + type: 'saveCurrentUserDetails', + currentUserDetails, + }); + + // æ”¹çŠ¶æ€ + yield put({ + type: 'setLoadedModule', + key: 'userDetails', + value: true, + }); + } else { + if (response.message) { + message.error(response.message); + } + } + }, + }, + reducers: { + setViewingLang(state = metaSettings, { viewingLang }) { + if (localStorage) { + localStorage.setItem(`${defaultSettings.projectKey}-view-lang`, viewingLang); + } + return { + ...state, + viewingLang, + }; + }, + saveTranslations(state = metaSettings, { payload: { replace, passedTranslations, notify } }) { + const translations = replace + ? passedTranslations + : { + ...state.translations, + translations: { + ...state.translations.translations, + ...passedTranslations.translations, + }, + }; + + const currentLang = state.translations.lang; + // if (currentLang && currentLang !== passedTranslations.lang) { + // message.success(notify); + // } + return { + ...state, + translations, + }; + }, + saveCurrentUserDetails(state = metaSettings, { currentUserDetails }) { + return { + ...state, + currentUserDetails, + }; + }, + + setLoginRedirect(state = metaSettings, { loginRedirect = false }) { + return { + ...state, + loginRedirect, + }; + }, + setMobileType(state = metaSettings, { width }) { + let isMobile = false; + let isXs = false; + if (width <= 767) { + isMobile = true; + if (width <= 576) { + isXs = true; + } + } + return { + ...state, + isMobile, + isXs, + }; + }, + setLoadedModule(state = metaSettings, { reload = false, trans = false, key, value }) { + let currentLoadedModule = state.loadedModule; + if (reload) { + currentLoadedModule = reloadModuleStatus(reload, currentLoadedModule); + } else { + if (trans) { + currentLoadedModule.api.transPkg[key] = value; + } else { + currentLoadedModule.api[key] = value; + } + } + const loadedModule = setLoadedModuleStatus(currentLoadedModule); + return { + ...state, + loadedModule, + }; + }, + }, + + subscriptions: { + metaInit({ + dispatch, + history: { + location: { pathname, search }, + }, + }): any { + console.log(`pathname: ${pathname}` + ' META model - init - set up meta from url params'); + console.log(`search: ${search}`); + + const projectKey = defaultSettings.projectKey; + + // const { location: { pathname }} = history; + const { lang, login_redirect, ...queryParams } = getPageQuery() as { + lang: string; + login_redirect: string; + queryParams: any; + }; + + //============处ç†viewingLang (local | query)==============// + let viewingLang = lang && languageLabel.includes(lang) ? lang : false; + + if (!viewingLang) { + // if no lang passed from url, try to read from the local storage + const localLang = + localStorage && localStorage.getItem(`${projectKey}-view-lang`) + ? localStorage.getItem(`${projectKey}-view-lang`) + : false; + viewingLang = localLang && languageLabel.includes(localLang) ? localLang : 'en_AU'; + } + + if (lang && !languageLabel.includes(lang)) { + // lang is sometimes, but should be valid + message.error('Selected viewing language is wrong, set to English as default.'); + } + + dispatch({ + //set显示的è¯è¨€ - Meta + type: 'setViewingLang', + viewingLang, + }); + //============处ç†viewingLang - End==============// + + //============处ç†login跳转 (query)==============// + if (login_redirect && ValidLoginRedirectParams.includes(login_redirect)) { + // set the login_redirect + dispatch({ + type: 'setLoginRedirect', + loginRedirect: login_redirect, + }); + } + //============处ç†login跳转 - End==============// + + history.replace({ + pathname: pathname === '/' ? '/od' : pathname, + search: stringify({ ...queryParams } as any), + }); + }, + }, +}; +export default MetaModel; diff --git a/src/models/od.ts b/src/models/od.ts new file mode 100644 index 0000000..dbc7bb8 --- /dev/null +++ b/src/models/od.ts @@ -0,0 +1,126 @@ +import { Reducer } from 'redux'; +import odSettings, { OdSettings } from '../configs/odSettings'; +import { Subscription, Effect } from 'dva'; +import { languageLabel } from '@/constants/languages'; +import { message } from 'antd'; +import { ConnectState } from '@/models/connect'; +import { getLoadedModuleStatus as metaGet } from '@/utils/metaModules'; +import { setLoadedModuleStatus as odSet, reloadModuleStatus } from '@/utils/odModules'; +import _ from 'lodash'; +import { convertJsonToCamelCase } from '@/utils/utils'; +import { metaTranslationOfOdGroups } from '@/constants/translationGroups'; + +import { stringify } from 'querystring'; + +export interface OdModelType { + namespace: string; + state: OdSettings; + effects: { + fetchMeta: Effect; + }; + reducers: { + setLayoutCollapsed: Reducer<OdSettings>; + setReloadAction: Reducer<OdSettings>; + + setLoadedModule: Reducer<OdSettings>; + }; + subscriptions: { + odInit: Subscription; + }; +} + +const OdModel: OdModelType = { + namespace: 'od', + state: odSettings, + effects: { + *fetchMeta(_, { put, all, select }) { + //init the od layout data + /* + 1. transPkg + 2. userDetails + + TBD. + */ + const { requiredLang, currentUser, metaModuleLoaded } = yield select( + (state: ConnectState) => ({ + requiredLang: state.meta.viewingLang, + currentUser: state.user.currentUser, + metaModuleLoaded: state.meta.loadedModule, + }), + ); + + const userId = currentUser && currentUser.id ? currentUser.id : false; + + const transGroups = metaTranslationOfOdGroups; + + //è¿™é‡ŒåŠ è½½od layoutçš„data --> od meta + //transPkg && userDetails + let payload = { requiredLang, userId, transGroups }; + + let getActions = metaGet('od', metaModuleLoaded, payload); + + if (getActions) { + let actionArray: any = []; + + _.forEach(getActions, (value: any) => actionArray.push(put(value))); + + yield all(actionArray); + } + }, + }, + reducers: { + setLayoutCollapsed(state = odSettings, { layoutCollapsed }) { + return { + ...state, + layoutCollapsed, + }; + }, + setReloadAction( + state = odSettings, + { showActioningMessage = false, spaceName, reloadType = false, redirectUrl = false }, + ) { + let reloadAction: any = { showActioningMessage, spaceName }; + + if (redirectUrl) { + reloadAction = { ...reloadAction, redirectUrl }; + } else if (reloadType) { + reloadAction = { ...reloadAction, reloadType }; + } + + return { + ...state, + reloadAction, + }; + }, + + setLoadedModule(state = odSettings, { reload = false, key, subKey = false, value }) { + let currentLoadedModule = state.loadedModule; + if (reload) { + currentLoadedModule = reloadModuleStatus(reload, currentLoadedModule); + } else { + if (key && subKey) { + currentLoadedModule.api[key][subKey] = value; + } else { + currentLoadedModule.api[key] = value; + } + } + const odModuleLoaded = odSet(currentLoadedModule); + return { + ...state, + odModuleLoaded, + }; + }, + }, + subscriptions: { + odInit({ + dispatch, + history: { + location: { pathname, search }, + }, + }): any { + console.log(`pathname: ${pathname}` + ' OD model - init - set up od from localStorage'); + console.log(`search: ${search}`); + }, + }, +}; +export default OdModel; diff --git a/src/models/setting.ts b/src/models/setting.ts new file mode 100644 index 0000000..37a4ea7 --- /dev/null +++ b/src/models/setting.ts @@ -0,0 +1,37 @@ +import { Reducer } from 'umi'; +import defaultSettings, { DefaultSettings } from '../../config/defaultSettings'; + +export interface SettingModelType { + namespace: 'settings'; + state: DefaultSettings; + reducers: { + changeSetting: Reducer<DefaultSettings>; + }; +} + +const updateColorWeak: (colorWeak: boolean) => void = (colorWeak) => { + const root = document.getElementById('root'); + if (root) { + root.className = colorWeak ? 'colorWeak' : ''; + } +}; + +const SettingModel: SettingModelType = { + namespace: 'settings', + state: defaultSettings, + reducers: { + changeSetting(state = defaultSettings, { payload }) { + const { colorWeak, contentWidth } = payload; + + if (state.contentWidth !== contentWidth && window.dispatchEvent) { + window.dispatchEvent(new Event('resize')); + } + updateColorWeak(!!colorWeak); + return { + ...state, + ...payload, + }; + }, + }, +}; +export default SettingModel; diff --git a/src/models/user.ts b/src/models/user.ts new file mode 100644 index 0000000..52072e6 --- /dev/null +++ b/src/models/user.ts @@ -0,0 +1,185 @@ +import { message } from 'antd'; +import { Effect, Subscription } from 'dva'; +import { Reducer } from 'redux'; +import userSettings, { UserSettings } from '@/configs/userSettings'; +import { getPageQuery } from '@/utils/utils'; +import { readUserInfoFromStorage, removeUserInfoFromStorage } from '@/utils/user'; +import { stringify } from 'querystring'; +import { refreshUserByToken } from '@/services/user'; +import { setAuthorizedUserInfo } from '@/utils/authority'; +import { history } from 'umi'; +import { ConnectState } from '@/models/connect'; +import { getLoadedModuleStatus } from '@/utils/metaModules'; +import _ from 'lodash'; +import { metaTranslationOfUserGroups } from '@/constants/translationGroups'; +import { reloadAuthorized } from '@/utils/Authorized'; + +export interface UserModelType { + namespace: 'user'; + state: UserSettings; + effects: { + fetchMeta: Effect; + refreshCurrentUserToken: Effect; + }; + reducers: { + saveCurrentUser: Reducer<UserSettings>; + clearCurrentUser: Reducer<UserSettings>; + setUserRefreshInfo: Reducer<UserSettings>; + initCurrentUser: Reducer<UserSettings>; + }; + subscriptions: { + userInit: Subscription; + }; +} + +const UserModel: UserModelType = { + namespace: 'user', + state: userSettings, + effects: { + *fetchMeta(_, { put, select, all }) { + /* + 1. transPkg + 2. claimInfo + */ + const { requiredLang, currentUser, metaLoadedModule } = yield select( + (state: ConnectState) => ({ + requiredLang: state.meta.viewingLang, + currentUser: state.user.currentUser, + metaLoadedModule: state.meta.loadedModule, + }), + ); + + // do a check first and set a default value + const userId = currentUser && currentUser.id ? currentUser.id : false; + + const transGroups = metaTranslationOfUserGroups; + + const payload = { userId, requiredLang, transGroups }; + + let getActions = getLoadedModuleStatus('user', metaLoadedModule, payload); + + if (getActions) { + let actionArray: any = []; + + _.forEach(getActions, (value: any) => actionArray.push(put(value))); + yield all(actionArray); + } + }, + *refreshCurrentUserToken({ refreshPayload }, { call, put }) { + const response = yield call(refreshUserByToken, { refreshPayload }); + if (response.success) { + yield put({ + type: 'saveCurrentUser', + payload: response.result, + remember: true, + }); + + //æˆåŠŸåˆ™æ¸…ç©ºuserRefreshInfo + yield put({ + type: 'setUserRefreshInfo', + refreshInfo: false, + }); + + message.success(response.message); + } else { + yield put({ + type: 'user/clearCurrentUser', + }); + + history.replace('/user/login'); + + if (response.message) { + message.error(response.message); + } + } + }, + }, + reducers: { + saveCurrentUser(state = userSettings, { payload, remember = false }) { + const { user_id, user_email, user_status, user_auth, token } = payload; + const token_receive_at = new Date().getTime(); //å˜çš„æ—¶å€™è®°å½•当剿—¶é—´ + setAuthorizedUserInfo({ authorizedUserInfo: { ...payload, token_receive_at }, remember }); + + return { + ...state, + currentUser: { + id: user_id, + email: user_email, + auth: user_auth, + status: user_status, + token: token, + tokenReceivedAt: token_receive_at, + }, + }; + }, + clearCurrentUser(state = userSettings) { + removeUserInfoFromStorage(); + return { + ...state, + currentUser: false, + }; + }, + setUserRefreshInfo(state = userSettings, { refreshInfo }) { + return { + ...state, + refreshInfo, + }; + }, + initCurrentUser(state = userSettings, { currentUser }) { + const { user_id, user_email, user_status, user_auth, token, token_receive_at } = currentUser; + reloadAuthorized(); + return { + ...state, + currentUser: { + id: user_id, + email: user_email, + auth: user_auth, + status: user_status, + token: token, + tokenReceivedAt: token_receive_at, + }, + }; + }, + }, + + subscriptions: { + userInit({ + dispatch, + history: { + location: { pathname, search }, + }, + }): any { + console.log(`pathname: ${pathname}` + ' USER model - init - set up user from url params'); + console.log(`search: ${search}`); + + const { register_id, register_token, ...queryParams } = getPageQuery() as { + register_id: string; + register_token: string; + queryParams: any; + }; + + //=============== 处ç†å½“剿ˆ–åˆå§‹åŒ–ç”¨æˆ·ä¿¡æ¯ (local |query) ===============// + + //这里init refreshInfo å’Œ currentUser + //这一项从localStorageé‡Œå– æ£€æŸ¥æ˜¯ä¸æ˜¯éœ€è¦refresh + + const userInfo = readUserInfoFromStorage(); + //å–到localStorage 或者 sessionStorageçš„ userInfo + if (userInfo && userInfo.user_id && userInfo.token) { + dispatch({ + type: 'initCurrentUser', + currentUser: userInfo, + }); + } + + //=============== 处ç†å½“å‰ç”¨æˆ·ä¿¡æ¯ (local |query) - End ===============// + + history.replace({ + pathname: pathname === '/' ? '/od' : pathname, + search: stringify({ ...queryParams } as any), + }); + }, + }, +}; + +export default UserModel; -- GitLab From 205fb84b24b4d8f1a3a8eca8ce72f7f9d77dc7b6 Mon Sep 17 00:00:00 2001 From: victor-liu <victorliu1999@gmail.com> Date: Tue, 5 Jan 2021 11:39:35 +1100 Subject: [PATCH 13/18] added global pages --- src/pages/403.tsx | 50 ++++++++++ src/pages/404.tsx | 24 +++++ src/pages/500.tsx | 42 ++++++++ src/pages/Admin.tsx | 43 +++++++++ src/pages/Welcome.less | 8 ++ src/pages/Welcome.tsx | 63 ++++++++++++ src/pages/document.ejs | 213 +++++++++++++++++++++++++++++++++++++++++ src/pages/index.less | 3 - src/pages/index.tsx | 10 -- 9 files changed, 443 insertions(+), 13 deletions(-) create mode 100644 src/pages/403.tsx create mode 100644 src/pages/404.tsx create mode 100644 src/pages/500.tsx create mode 100644 src/pages/Admin.tsx create mode 100644 src/pages/Welcome.less create mode 100644 src/pages/Welcome.tsx create mode 100644 src/pages/document.ejs delete mode 100644 src/pages/index.less delete mode 100644 src/pages/index.tsx diff --git a/src/pages/403.tsx b/src/pages/403.tsx new file mode 100644 index 0000000..7cd5696 --- /dev/null +++ b/src/pages/403.tsx @@ -0,0 +1,50 @@ +import { Button, Result } from 'antd'; +import React, { useEffect, useState } from 'react'; +import { message } from 'antd'; +import { getMapStateToProps } from '@/utils/utils'; +import { connect } from 'dva'; + +const LoaAuthPage: React.FC<any> = (props: any) => { + const { + dispatch, + helper: { tx }, + user: { currentUser }, + } = props; + + // useEffect(() => { + // dispatch({ + // type: 'meta/setLoadedModule', + // reload: 'all', + // }); + // dispatch({ + // type: 'od/setLoadedModule', + // reload: 'all', + // }); + // }, []); + + const reLogin = () => { + if (currentUser && currentUser.id) { + dispatch({ + type: 'user/clearCurrentUserToken', + }); + message.success(tx('Login.already_logged_out')); + } + + window.location.replace('/user/login'); + }; + + return ( + <Result + status="403" + title="403" + subTitle={'you do not have enough authority.'} + extra={ + <Button type="primary" onClick={reLogin}> + Please login + </Button> + } + ></Result> + ); +}; + +export default connect(getMapStateToProps(['meta', 'user', 'od']))(LoaAuthPage); diff --git a/src/pages/404.tsx b/src/pages/404.tsx new file mode 100644 index 0000000..fd4f08b --- /dev/null +++ b/src/pages/404.tsx @@ -0,0 +1,24 @@ +import { Button, Result } from 'antd'; +import React from 'react'; +import { history } from 'umi'; + +const NoFoundPage: React.FC<any> = () => { + const reDirect = () => { + window.location.replace('/'); + }; + + return ( + <Result + status="404" + title="404" + subTitle="Sorry, the page you visited does not exist." + extra={ + <Button type="primary" onClick={reDirect}> + Back Home + </Button> + } + /> + ); +}; + +export default NoFoundPage; diff --git a/src/pages/500.tsx b/src/pages/500.tsx new file mode 100644 index 0000000..d32b5de --- /dev/null +++ b/src/pages/500.tsx @@ -0,0 +1,42 @@ +import { Button, Result } from 'antd'; +import React, { useEffect, useState } from 'react'; +import { message } from 'antd'; +import { getMapStateToProps } from '@/utils/utils'; +import { connect } from 'dva'; + +const InternalSeverErrorPage: React.FC<any> = (props: any) => { + const { + dispatch, + helper: { tx }, + } = props; + + useEffect(() => { + dispatch({ + type: 'meta/setLoadedModule', + reload: 'all', + }); + dispatch({ + type: 'od/setLoadedModule', + reload: 'all', + }); + }, []); + + const reDirect = () => { + window.location.replace('/od'); + }; + + return ( + <Result + status="500" + title="500" + subTitle={tx('Login.sorry_the_server_is_wrong')} + extra={ + <Button type="primary" onClick={reDirect}> + {tx('Login.back_home')} + </Button> + } + ></Result> + ); +}; + +export default connect(getMapStateToProps(['meta', 'user', 'od']))(InternalSeverErrorPage); diff --git a/src/pages/Admin.tsx b/src/pages/Admin.tsx new file mode 100644 index 0000000..7270ec7 --- /dev/null +++ b/src/pages/Admin.tsx @@ -0,0 +1,43 @@ +import React from 'react'; +import { HeartTwoTone, SmileTwoTone } from '@ant-design/icons'; +import { Card, Typography, Alert } from 'antd'; +import { PageHeaderWrapper } from '@ant-design/pro-layout'; +import { useIntl } from 'umi'; + +export default (): React.ReactNode => { + const intl = useIntl(); + return ( + <PageHeaderWrapper + content={intl.formatMessage({ + id: 'pages.admin.subPage.title', + defaultMessage: ' 这个页é¢åªæœ‰ admin æƒé™æ‰èƒ½æŸ¥çœ‹', + })} + > + <Card> + <Alert + message={intl.formatMessage({ + id: 'pages.welcome.alertMessage', + defaultMessage: '更快更强的é‡åž‹ç»„件,已ç»å‘布。', + })} + type="success" + showIcon + banner + style={{ + margin: -12, + marginBottom: 48, + }} + /> + <Typography.Title level={2} style={{ textAlign: 'center' }}> + <SmileTwoTone /> Ant Design Pro <HeartTwoTone twoToneColor="#eb2f96" /> You + </Typography.Title> + </Card> + <p style={{ textAlign: 'center', marginTop: 24 }}> + Want to add more pages? Please refer to{' '} + <a href="https://pro.ant.design/docs/block-cn" target="_blank" rel="noopener noreferrer"> + use block + </a> + 。 + </p> + </PageHeaderWrapper> + ); +}; diff --git a/src/pages/Welcome.less b/src/pages/Welcome.less new file mode 100644 index 0000000..914c40d --- /dev/null +++ b/src/pages/Welcome.less @@ -0,0 +1,8 @@ +@import '~antd/lib/style/themes/default.less'; + +.pre { + margin: 12px 0; + padding: 12px 20px; + background: @input-bg; + box-shadow: @card-shadow; +} diff --git a/src/pages/Welcome.tsx b/src/pages/Welcome.tsx new file mode 100644 index 0000000..0c640e9 --- /dev/null +++ b/src/pages/Welcome.tsx @@ -0,0 +1,63 @@ +import React from 'react'; +import { PageContainer } from '@ant-design/pro-layout'; +import { Card, Alert, Typography } from 'antd'; +import { useIntl, FormattedMessage } from 'umi'; +import styles from './Welcome.less'; + +const CodePreview: React.FC<{}> = ({ children }) => ( + <pre className={styles.pre}> + <code> + <Typography.Text copyable>{children}</Typography.Text> + </code> + </pre> +); + +export default (): React.ReactNode => { + const intl = useIntl(); + return ( + <PageContainer> + <Card> + <Alert + message={intl.formatMessage({ + id: 'pages.welcome.alertMessage', + defaultMessage: '更快更强的é‡åž‹ç»„件,已ç»å‘布。', + })} + type="success" + showIcon + banner + style={{ + margin: -12, + marginBottom: 24, + }} + /> + <Typography.Text strong> + <FormattedMessage id="pages.welcome.advancedComponent" defaultMessage="é«˜çº§è¡¨æ ¼" />{' '} + <a + href="https://procomponents.ant.design/components/table" + rel="noopener noreferrer" + target="__blank" + > + <FormattedMessage id="pages.welcome.link" defaultMessage="欢迎使用" /> + </a> + </Typography.Text> + <CodePreview>yarn add @ant-design/pro-table</CodePreview> + <Typography.Text + strong + style={{ + marginBottom: 12, + }} + > + <FormattedMessage id="pages.welcome.advancedLayout" defaultMessage="高级布局" />{' '} + <a + href="https://procomponents.ant.design/components/layout" + rel="noopener noreferrer" + target="__blank" + > + <FormattedMessage id="pages.welcome.link" defaultMessage="欢迎使用" /> + </a> + </Typography.Text> + <CodePreview>yarn add @ant-design/pro-layout</CodePreview> + </Card> + </PageContainer> + ); +}; diff --git a/src/pages/document.ejs b/src/pages/document.ejs new file mode 100644 index 0000000..e42657a --- /dev/null +++ b/src/pages/document.ejs @@ -0,0 +1,213 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge" /> + <meta + name="keywords" + content="antd,umi,umijs,ant design,脚手架,布局, Ant Design,项目,Pro,admin,控制å°,主页,开箱å³ç”¨,ä¸åŽå°,解决方案,组件库" + /> + <meta + name="description" + content=" + An out-of-box UI solution for enterprise applications as a React boilerplate." + /> + <meta + name="description" + content=" + 开箱å³ç”¨çš„ä¸å°å‰ç«¯/设计解决方案。" + /> + <meta + name="viewport" + content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" + /> + <title>Ant Design Pro</title> + <link rel="icon" href="<%= context.config.publicPath +'favicon.ico'%>" type="image/x-icon" /> + </head> + <body> + <noscript>Out-of-the-box mid-stage front/design solution!</noscript> + <div id="root"> + <style> + html, + body, + #root { + height: 100%; + margin: 0; + padding: 0; + } + #root { + background-image: url('<%= context.config.publicPath +"home_bg.png"%>'); + background-repeat: no-repeat; + background-size: 100% auto; + } + .page-loading-warp { + display: flex; + align-items: center; + justify-content: center; + padding: 98px; + } + .ant-spin { + position: absolute; + display: none; + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + color: rgba(0, 0, 0, 0.65); + color: #1890ff; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + text-align: center; + list-style: none; + opacity: 0; + -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + transition: -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86), + -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + -webkit-font-feature-settings: 'tnum'; + font-feature-settings: 'tnum'; + } + + .ant-spin-spinning { + position: static; + display: inline-block; + opacity: 1; + } + + .ant-spin-dot { + position: relative; + display: inline-block; + width: 20px; + height: 20px; + font-size: 20px; + } + + .ant-spin-dot-item { + position: absolute; + display: block; + width: 9px; + height: 9px; + background-color: #1890ff; + border-radius: 100%; + -webkit-transform: scale(0.75); + -ms-transform: scale(0.75); + transform: scale(0.75); + -webkit-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; + opacity: 0.3; + -webkit-animation: antspinmove 1s infinite linear alternate; + animation: antSpinMove 1s infinite linear alternate; + } + + .ant-spin-dot-item:nth-child(1) { + top: 0; + left: 0; + } + + .ant-spin-dot-item:nth-child(2) { + top: 0; + right: 0; + -webkit-animation-delay: 0.4s; + animation-delay: 0.4s; + } + + .ant-spin-dot-item:nth-child(3) { + right: 0; + bottom: 0; + -webkit-animation-delay: 0.8s; + animation-delay: 0.8s; + } + + .ant-spin-dot-item:nth-child(4) { + bottom: 0; + left: 0; + -webkit-animation-delay: 1.2s; + animation-delay: 1.2s; + } + + .ant-spin-dot-spin { + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + -webkit-animation: antrotate 1.2s infinite linear; + animation: antRotate 1.2s infinite linear; + } + + .ant-spin-lg .ant-spin-dot { + width: 32px; + height: 32px; + font-size: 32px; + } + + .ant-spin-lg .ant-spin-dot i { + width: 14px; + height: 14px; + } + + @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) { + .ant-spin-blur { + background: #fff; + opacity: 0.5; + } + } + + @-webkit-keyframes antSpinMove { + to { + opacity: 1; + } + } + + @keyframes antSpinMove { + to { + opacity: 1; + } + } + + @-webkit-keyframes antRotate { + to { + -webkit-transform: rotate(405deg); + transform: rotate(405deg); + } + } + + @keyframes antRotate { + to { + -webkit-transform: rotate(405deg); + transform: rotate(405deg); + } + } + </style> + <div + style=" + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100%; + min-height: 420px; + " + > + <img src="<%= context.config.publicPath +'pro_icon.svg'%>" alt="logo" width="256" /> + <div class="page-loading-warp"> + <div class="ant-spin ant-spin-lg ant-spin-spinning"> + <span class="ant-spin-dot ant-spin-dot-spin" + ><i class="ant-spin-dot-item"></i><i class="ant-spin-dot-item"></i + ><i class="ant-spin-dot-item"></i><i class="ant-spin-dot-item"></i + ></span> + </div> + </div> + <div style="display: flex; align-items: center; justify-content: center"> + <img + src="https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg" + width="32" + style="margin-right: 8px" + /> + Ant Design + </div> + </div> + </div> + </body> +</html> diff --git a/src/pages/index.less b/src/pages/index.less deleted file mode 100644 index 586302b..0000000 --- a/src/pages/index.less +++ /dev/null @@ -1,3 +0,0 @@ -.title { - background: rgb(121, 242, 157); -} diff --git a/src/pages/index.tsx b/src/pages/index.tsx deleted file mode 100644 index 9171ffc..0000000 --- a/src/pages/index.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import styles from './index.less'; - -export default () => { - return ( - <div> - <h1 className={styles.title}>Page index</h1> - </div> - ); -} -- GitLab From 72429bae4a3a7bf51e332b85a43c362d28ab61c8 Mon Sep 17 00:00:00 2001 From: victor-liu <victorliu1999@gmail.com> Date: Tue, 5 Jan 2021 11:40:16 +1100 Subject: [PATCH 14/18] added pages for od and user --- src/pages/od/dashboard/config.ts | 1 + src/pages/od/dashboard/index.less | 3 + src/pages/od/dashboard/index.tsx | 31 +++++++ src/pages/user/login/components/LoginForm.tsx | 85 +++++++++++++++++++ .../user/login/components/LoginTitle.tsx | 18 ++++ src/pages/user/login/components/style.less | 13 +++ src/pages/user/login/config.ts | 5 ++ src/pages/user/login/index.less | 9 ++ src/pages/user/login/index.tsx | 43 ++++++++++ src/pages/user/login/model.ts | 64 ++++++++++++++ src/pages/user/login/services.ts | 12 +++ 11 files changed, 284 insertions(+) create mode 100644 src/pages/od/dashboard/config.ts create mode 100644 src/pages/od/dashboard/index.less create mode 100644 src/pages/od/dashboard/index.tsx create mode 100644 src/pages/user/login/components/LoginForm.tsx create mode 100644 src/pages/user/login/components/LoginTitle.tsx create mode 100644 src/pages/user/login/components/style.less create mode 100644 src/pages/user/login/config.ts create mode 100644 src/pages/user/login/index.less create mode 100644 src/pages/user/login/index.tsx create mode 100644 src/pages/user/login/model.ts create mode 100644 src/pages/user/login/services.ts diff --git a/src/pages/od/dashboard/config.ts b/src/pages/od/dashboard/config.ts new file mode 100644 index 0000000..987dac7 --- /dev/null +++ b/src/pages/od/dashboard/config.ts @@ -0,0 +1 @@ +export const spaceName = 'odDashboard'; diff --git a/src/pages/od/dashboard/index.less b/src/pages/od/dashboard/index.less new file mode 100644 index 0000000..e2f84e6 --- /dev/null +++ b/src/pages/od/dashboard/index.less @@ -0,0 +1,3 @@ +.container { + padding: 15px; +} diff --git a/src/pages/od/dashboard/index.tsx b/src/pages/od/dashboard/index.tsx new file mode 100644 index 0000000..752d4f7 --- /dev/null +++ b/src/pages/od/dashboard/index.tsx @@ -0,0 +1,31 @@ +import React, { useState, useEffect } from 'react'; +import { Avatar, Row, Col } from 'antd'; +import { connect } from 'dva'; +import styles from './index.less'; +import { getMapStateToProps } from '@/utils/utils'; +import _ from 'lodash'; +import { spaceName } from './config'; + +const Index: React.FC<any> = (props: any) => { + const { + loading, + dispatch, + od: { odModuleLoaded }, + } = props; + + // useEffect(() => { + // if (!odModuleLoaded[spaceName]) { + // dispatch({ + // type: `${spaceName}/fetchMeta`, + // }); + // } + // }, []); + + // if (!odModuleLoaded[spaceName]) { + // return <PageLoading />; + // } + + return <div className={styles.container}>123</div>; +}; + +export default connect(getMapStateToProps(['meta', 'od', 'loading']))(Index); diff --git a/src/pages/user/login/components/LoginForm.tsx b/src/pages/user/login/components/LoginForm.tsx new file mode 100644 index 0000000..1a39b21 --- /dev/null +++ b/src/pages/user/login/components/LoginForm.tsx @@ -0,0 +1,85 @@ +import { Alert, Checkbox, Button, Form, Input } from 'antd'; +// import { FormattedMessage, formatMessage } from 'umi-plugin-react/locale'; +import React, { useState } from 'react'; + +import { Dispatch, AnyAction } from 'redux'; +import { history, Link } from 'umi'; +import { connect } from 'dva'; +import styles from './style.less'; +import { getMapStateToProps } from '@/utils/utils'; +import { PageLoading } from '@ant-design/pro-layout'; +import { UserOutlined, LockOutlined } from '@ant-design/icons'; +import { spaceName } from '../config'; + +const LoginForm: React.FC<any> = (props: any) => { + const { + helper: { tx }, + loading, + dispatch, + } = props; + + const submitting = loading.effects[`${spaceName}/submit`]; + + const onFinish = (values: any) => { + console.log('Received values of form: ', values); + dispatch({ + type: `${spaceName}/submit`, + payload: values, + }); + }; + + return ( + <div className={styles.loginForm}> + <Form + name="normal_login" + className="login-form" + initialValues={{ remember: true }} + onFinish={onFinish} + > + <Form.Item + name="username" + rules={[{ required: true, message: 'Please input your Username!' }]} + > + <Input + prefix={<UserOutlined className="site-form-item-icon" />} + placeholder="guest / admin / superAdmin" + /> + </Form.Item> + + <Form.Item + name="password" + rules={[{ required: true, message: 'Please input your Password!' }]} + > + <Input + prefix={<LockOutlined className="site-form-item-icon" />} + type="password" + placeholder="ant.design" + /> + </Form.Item> + + <Form.Item> + <Form.Item name="remember" valuePropName="checked" noStyle> + <Checkbox>Remember me</Checkbox> + </Form.Item> + + <Link to="/user/forget-password">Forgot password</Link> + </Form.Item> + + <Form.Item> + <Button + type="primary" + htmlType="submit" + className="login-form-button" + disabled={submitting} + loading={submitting} + block + > + Log in + </Button> + </Form.Item> + </Form> + </div> + ); +}; + +export default connect(getMapStateToProps(['userLogin', 'loading', 'user', 'meta']))(LoginForm); diff --git a/src/pages/user/login/components/LoginTitle.tsx b/src/pages/user/login/components/LoginTitle.tsx new file mode 100644 index 0000000..c222aff --- /dev/null +++ b/src/pages/user/login/components/LoginTitle.tsx @@ -0,0 +1,18 @@ +import React from 'react'; +import { connect } from 'dva'; +import styles from './style.less'; +import { getMapStateToProps } from '@/utils/utils'; + +const LoginTitle: React.FC<any> = (props: any) => { + const { + helper: { tx }, + } = props; + + return ( + <div className={styles.subtitle}> + <div>{tx('Login.login')}</div> + </div> + ); +}; + +export default connect(getMapStateToProps([]))(LoginTitle); diff --git a/src/pages/user/login/components/style.less b/src/pages/user/login/components/style.less new file mode 100644 index 0000000..0dbc2ea --- /dev/null +++ b/src/pages/user/login/components/style.less @@ -0,0 +1,13 @@ +@import '~antd/es/style/themes/default.less'; + +.subtitle { + display: flex; + align-items: center; + justify-content: center; + color: @primary-color; + font-size: 40px; +} + +.loginForm { + margin-top: 10px; +} diff --git a/src/pages/user/login/config.ts b/src/pages/user/login/config.ts new file mode 100644 index 0000000..e36c29e --- /dev/null +++ b/src/pages/user/login/config.ts @@ -0,0 +1,5 @@ +export interface LoginSettings {} + +export default {} as LoginSettings; + +export const spaceName = 'userLogin'; diff --git a/src/pages/user/login/index.less b/src/pages/user/login/index.less new file mode 100644 index 0000000..7e76302 --- /dev/null +++ b/src/pages/user/login/index.less @@ -0,0 +1,9 @@ +@import '~antd/es/style/themes/default.less'; + +.main { + width: 370px; + margin: 0 auto; + @media screen and (max-width: @screen-sm) { + width: 95%; + } +} diff --git a/src/pages/user/login/index.tsx b/src/pages/user/login/index.tsx new file mode 100644 index 0000000..d7f4cb4 --- /dev/null +++ b/src/pages/user/login/index.tsx @@ -0,0 +1,43 @@ +import React, { Component, useState, useEffect } from 'react'; +import { connect } from 'dva'; +import styles from './index.less'; +import { getMapStateToProps } from '@/utils/utils'; +import { Alert, Checkbox, message } from 'antd'; +import PageLoading from '@/components/PageLoading'; +import LoginTitle from './components/LoginTitle'; +import LoginForm from './components/LoginForm'; + +import { Redirect, history } from 'umi'; + +const Login: React.FC<any> = (props: any) => { + const { + dispatch, + user: { currentUser }, + helper: { tx }, + location, + } = props; + + useEffect(() => { + //跳转过æ¥çš„ + if (location.state && location.state.needLogin) { + console.log('received location login state: ' + location.state.needLogin); + history.replace({ pathname: '/user/login', state: null }); + message.error(tx('Global.please_login_first')); + } + + //如果已ç»ç™»å½• ä¸èƒ½å†login + if (currentUser && currentUser.id) { + message.error(tx('Global.already_logged_in_log_out_first')); + history.replace('/od'); + } + }, []); + + return ( + <div className={styles.main}> + <LoginTitle /> + <LoginForm /> + </div> + ); +}; + +export default connect(getMapStateToProps(['meta', 'login', 'loading', 'user']))(Login); diff --git a/src/pages/user/login/model.ts b/src/pages/user/login/model.ts new file mode 100644 index 0000000..c688c1c --- /dev/null +++ b/src/pages/user/login/model.ts @@ -0,0 +1,64 @@ +import { message } from 'antd'; +import { Reducer } from 'redux'; +import { Effect } from 'dva'; +import { history } from 'umi'; +import { ConnectState } from '@/models/connect'; + +import { postUserLogin } from './services'; + +import loginSettings, { LoginSettings, spaceName } from './config'; + +export interface LoginModelType { + namespace: string; + state: LoginSettings; + effects: { + submit: Effect; + }; + reducers: {}; +} + +const Model: LoginModelType = { + namespace: spaceName, + state: { + status: loginSettings, + }, + effects: { + *submit({ payload, loginRedirect }, { call, put, select }) { + const response = yield call(postUserLogin, payload); + if (response.success) { + yield put({ + type: 'user/saveCurrentUser', + payload: response.result, + remember: payload.remember ? true : false, //如果是rememberçš„è¯ + }); + + //这里把currentUserDetails资æºç½®ç©º åŽé¢æŒ‰éœ€åŠ è½½ + yield put({ + type: 'meta/setLoadedModule', + key: 'currentUserDetails', + value: false, + }); + + //èµ°é‡å®šå‘ + if (loginRedirect) { + yield put({ + type: 'meta/setLoginRedirect', + loginRedirect: false, + }); + history.push(loginRedirect); + } else { + history.push('/od'); + } + + //æç¤ºæˆåŠŸ + message.success(response.message); + } else { + message.error(response.message); + } + }, + }, + + reducers: {}, +}; + +export default Model; diff --git a/src/pages/user/login/services.ts b/src/pages/user/login/services.ts new file mode 100644 index 0000000..5d52a0a --- /dev/null +++ b/src/pages/user/login/services.ts @@ -0,0 +1,12 @@ +import request from '@/utils/request'; + +export async function postUserLogin(params: any) { + return request('/api/login', { + method: 'POST', + headers: { bearLang: 'view' }, + data: { + ...params, + login_type: 'popsup', + }, + }); +} -- GitLab From d2a4bb8642bfdab4881809146d078c865aa423a0 Mon Sep 17 00:00:00 2001 From: victor-liu <victorliu1999@gmail.com> Date: Tue, 5 Jan 2021 11:40:35 +1100 Subject: [PATCH 15/18] added services file --- src/services/ca.ts | 9 +++++++++ src/services/meta.ts | 25 +++++++++++++++++++++++++ src/services/od.ts | 0 src/services/user.ts | 16 ++++++++++++++++ 4 files changed, 50 insertions(+) create mode 100644 src/services/ca.ts create mode 100644 src/services/meta.ts create mode 100644 src/services/od.ts create mode 100644 src/services/user.ts diff --git a/src/services/ca.ts b/src/services/ca.ts new file mode 100644 index 0000000..6db4945 --- /dev/null +++ b/src/services/ca.ts @@ -0,0 +1,9 @@ +import request from '@/utils/request'; +import queryString from 'query-string'; + +export async function getCaConfigs(params: any): Promise<any> { + return request(`/api/business/setting`, { + method: 'GET', + headers: { bearLang: 'view', bearId: 'caId' }, + }); +} diff --git a/src/services/meta.ts b/src/services/meta.ts new file mode 100644 index 0000000..f5a33a7 --- /dev/null +++ b/src/services/meta.ts @@ -0,0 +1,25 @@ +import request from '@/utils/request'; +import queryString from 'query-string'; + +export async function getTranslations(params: any): Promise<any> { + const { transGroups } = params; + return request('/api/translations', { + method: 'GET', + headers: { bearLang: 'view' }, + params: { groups: transGroups }, + paramsSerializer: (params) => { + const serealizedString = params['groups'] + ? queryString.stringify(params as any, { arrayFormat: 'index' }) + : queryString.stringify(params as any); + return serealizedString; + }, + }); +} + +export async function getCurrentUserdetails(params: any) { + const { userId } = params; + return request(`/api/user/${userId}?expand=business`, { + method: 'GET', + headers: { bearLang: 'view', bearToken: 'auth' }, + }); +} diff --git a/src/services/od.ts b/src/services/od.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/services/user.ts b/src/services/user.ts new file mode 100644 index 0000000..6f7ae0b --- /dev/null +++ b/src/services/user.ts @@ -0,0 +1,16 @@ +import request from '@/utils/request'; +import queryString from 'query-string'; + +export async function refreshUserByToken(params: any) { + const { + refreshPayload: { userId, refreshToken }, + } = params; + return request('/api/refresh_token', { + method: 'POST', + headers: { bearLang: 'view' }, + data: { + user_id: userId, + refresh_token: refreshToken, + }, + }); +} -- GitLab From cd76ea71c6a965166f6345b8bf31f9ae4c069f2a Mon Sep 17 00:00:00 2001 From: victor-liu <victorliu1999@gmail.com> Date: Tue, 5 Jan 2021 11:40:55 +1100 Subject: [PATCH 16/18] added utils --- src/utils/Authorized.ts | 19 ++++ src/utils/authority.ts | 67 ++++++++++++++ src/utils/caModules.ts | 169 +++++++++++++++++++++++++++++++++++ src/utils/metaModules.ts | 119 +++++++++++++++++++++++++ src/utils/odModules.ts | 174 ++++++++++++++++++++++++++++++++++++ src/utils/request.ts | 185 +++++++++++++++++++++++++++++++++++++++ src/utils/user.ts | 35 ++++++++ src/utils/utils.less | 16 ++++ src/utils/utils.test.ts | 37 ++++++++ src/utils/utils.ts | 149 +++++++++++++++++++++++++++++++ 10 files changed, 970 insertions(+) create mode 100644 src/utils/Authorized.ts create mode 100644 src/utils/authority.ts create mode 100644 src/utils/caModules.ts create mode 100644 src/utils/metaModules.ts create mode 100644 src/utils/odModules.ts create mode 100644 src/utils/request.ts create mode 100644 src/utils/user.ts create mode 100644 src/utils/utils.less create mode 100644 src/utils/utils.test.ts create mode 100644 src/utils/utils.ts diff --git a/src/utils/Authorized.ts b/src/utils/Authorized.ts new file mode 100644 index 0000000..96baa83 --- /dev/null +++ b/src/utils/Authorized.ts @@ -0,0 +1,19 @@ +import RenderAuthorize from '@/components/Authorized'; +import { getAuthorizedUserInfo } from './authority'; +/* eslint-disable eslint-comments/disable-enable-pair */ +/* eslint-disable import/no-mutable-exports */ +let Authorized = RenderAuthorize(getAuthorizedUserInfo()); + +// Reload the rights component +const reloadAuthorized = (): void => { + Authorized = RenderAuthorize(getAuthorizedUserInfo()); +}; + +/** + * hard code + * block need it。 + */ +window.reloadAuthorized = reloadAuthorized; + +export { reloadAuthorized }; +export default Authorized; diff --git a/src/utils/authority.ts b/src/utils/authority.ts new file mode 100644 index 0000000..582672f --- /dev/null +++ b/src/utils/authority.ts @@ -0,0 +1,67 @@ +import { reloadAuthorized } from './Authorized'; +import defaultSettings from '../../config/defaultSettings'; + +const projectKey = defaultSettings.projectKey; + +// use localStorage to store the authority info, which might be sent from server in actual project. +export function getAuthorizedUserInfo(): string | string[] { + let authorityString; + let authority; + + const localStoredUserAuth = + localStorage && + localStorage.getItem(`${projectKey}-authorized-user-info`) && + JSON.parse(localStorage.getItem(`${projectKey}-authorized-user-info`) as string).user_auth + ? JSON.parse(localStorage.getItem(`${projectKey}-authorized-user-info`) as string).user_auth + : false; + + const sessionStoredUserAuth = + sessionStorage && + sessionStorage.getItem(`${projectKey}-authorized-user-info`) && + JSON.parse(sessionStorage.getItem(`${projectKey}-authorized-user-info`) as string).user_auth + ? JSON.parse(sessionStorage.getItem(`${projectKey}-authorized-user-info`) as string).user_auth + : false; + + //session å’Œlocal都查一é 如果都没有å†è¿”回空 + if (localStoredUserAuth) { + authorityString = localStoredUserAuth; + } else if (sessionStoredUserAuth) { + authorityString = sessionStoredUserAuth; + } else { + authorityString = ''; + } + + try { + if (authorityString) { + authority = JSON.parse(authorityString); + } + } catch (e) { + authority = authorityString; + } + if (typeof authority === 'string') { + return [authority]; + } + + return authority; +} + +export function setAuthorizedUserInfo(payload: any): void { + const { remember, authorizedUserInfo } = payload; + + if (localStorage && sessionStorage) { + if (remember) { + localStorage.setItem( + `${projectKey}-authorized-user-info`, + JSON.stringify(authorizedUserInfo), + ); + } else { + sessionStorage.setItem( + `${projectKey}-authorized-user-info`, + JSON.stringify(authorizedUserInfo), + ); + } + } + + // auto reload + reloadAuthorized(); +} diff --git a/src/utils/caModules.ts b/src/utils/caModules.ts new file mode 100644 index 0000000..cdc1c7e --- /dev/null +++ b/src/utils/caModules.ts @@ -0,0 +1,169 @@ +import _ from 'lodash'; +import { isAllKeyTrue } from '@/utils/utils'; +import caSettings from '@/configs/caSettings'; + +const allModules = ['caHome']; + +/** + * set loaded ca status + * @param ca.loadedModule + * @param ca.loadedModule + */ + +export const setLoadedModuleStatus = (modules: any) => { + modules.caHome = isAllKeyTrue(modules.api.caHome) ? true : false; + + return modules; +}; + +/** + * + * @param reload trans, business, dish-update + * @param currentLoadedModule current odModuleLoaded model + * + */ +export const reloadModuleStatus = (reload: any, currentLoadedModule: any) => { + const blankApi = caSettings.loadedModule; + + if (reload === 'all') { + currentLoadedModule = { + ...currentLoadedModule, + api: blankApi, + }; + return currentLoadedModule; + } + + /* + reload : + caDish: 'caDish-switch', + + caCart: 'caCart-fresh', + + reloadModule: caDish/caMenu/caEvent/caDeal/caCart caDishes/caMenus/caEvents/caDeals/fresh + actionMode: switch clear fresh + + */ + + const actionArray = ['switch', 'clear', 'fresh']; + + const [reloadModule, actionMode] = reload.split('-'); + + if (allModules.includes(reloadModule) && actionArray.includes(actionMode)) { + //switch | clear æŸä¸€é¡¹ 则它的selfè¦é¦–先更改为false + currentLoadedModule = { + ...currentLoadedModule, + api: { + ...currentLoadedModule.api, + [reloadModule]: { ...currentLoadedModule.api[reloadModule], self: false }, + }, + }; + } + //其他情况TBD + + return currentLoadedModule; +}; + +/** + * + * @param moduleKey indicates which module you want to check + * @param caModuleLoaded current caModuleLoaded model + * @param state ConnectState data - object contains meta data + * + * Possible Arguments in "state" + */ + +export const getLoadedModuleStatus = ( + moduleKey: string, + caModuleLoaded: any, + state = false as any, +) => { + const { caId = false } = state; + + const modelsNeedToSendSelfId = ['caDish', 'caMenu', 'caDeal', 'caEvent']; + const modelsNoNeedToSendSelfId = ['caDishes', 'caMenus', 'caDeals', 'caEvents', 'caInfo']; + + const modelsNeedToLoadRecommend = ['caHome']; + const modelsNoNeedToSendCurrentCart = ['caCart']; + + const modelsNoNeedToLoadTagList = ['caDishes', 'caMenu']; + // const modelsNoNeedToLoadOfferingTypeList = ['caMenu']; + const modelsNoNeedToLoadAllMenus = ['caMenu']; + + let actions = []; + + /** + * 先检查哪一个模å—需è¦å–meta + * å¦‚æžœçŠ¶æ€æœºé‡Œçš„值(eg caModuleLoaded.dishe)是 false + * 并且它对应的数æ®ï¼ˆeg id)都å˜åœ¨çš„è¯ åˆ™è°ƒç”¨fetch 去获å–需è¦çš„æ•°æ® + * + * å¦åˆ™éœ€è¦setLoadedModule æ›´æ”¹çŠ¶æ€æœºé‡Œçš„值 + */ + + const capitalizedModuleKey = _.upperFirst(moduleKey); + + //检查有没有load过self, 没有则load + if (modelsNoNeedToSendSelfId.includes(moduleKey) && !caModuleLoaded.api[moduleKey].self) { + actions.push({ + type: 'fetch', + }); + } + + if ( + modelsNeedToSendSelfId.includes(moduleKey) && + viewingId && + !caModuleLoaded.api[moduleKey].self + ) { + actions.push({ + type: 'fetch', + viewingId, + }); + } + + //处ç†caHome + if (modelsNeedToLoadRecommend.includes(moduleKey)) { + _.forEach(caModuleLoaded.api[moduleKey], (loaded: boolean, key: string) => { + if (!loaded) { + actions.push({ + type: `fetch${capitalizedModuleKey}${_.upperFirst(key)}`, //fetchCaHomeRecommendedDishes ... + }); + } + }); + } + + //处ç†caCart + if (modelsNoNeedToSendCurrentCart.includes(moduleKey) && currentCart) { + if (currentCart.cartId && currentCart.cartType && !caModuleLoaded.api[moduleKey].self) { + actions.push({ + type: `fetch${capitalizedModuleKey}Details`, + currentCart, + }); + } else if (currentCart === 'needToCreateIndividalOrder') { + actions.push({ + type: 'ca/createIndividalOrder', + }); + } + } + + if (modelsNoNeedToLoadTagList.includes(moduleKey) && !caModuleLoaded.api.tag.tagList) { + actions.push({ + type: 'ca/fetchTagList', + }); + } + + // if ( + // modelsNoNeedToLoadOfferingTypeList.includes(moduleKey) && + // !caModuleLoaded.api.tag.offeringTypeList + // ) { + // actions.push({ + // type: 'ca/fetchOfferingTypeList', + // }); + // } + + if (modelsNoNeedToLoadAllMenus.includes(moduleKey) && !caModuleLoaded.api.allMenus) { + actions.push({ + type: 'ca/fetchAllMenus', + }); + } + + return actions.length === 0 ? false : actions; +}; diff --git a/src/utils/metaModules.ts b/src/utils/metaModules.ts new file mode 100644 index 0000000..9629667 --- /dev/null +++ b/src/utils/metaModules.ts @@ -0,0 +1,119 @@ +import metaSettings from '@/configs/metaSettings'; + +/** + * set loaded modules status + * @param meta.loadedModule [userDetails, transPkg: {}] + * @param meta.loadedModule [userDetails, transPkg: {}] + */ +export const setLoadedModuleStatus = (modules: any) => { + modules.ca = modules.api.transPkg.ca && modules.api.caConfigs ? true : false; + modules.user = modules.api.userDetails && modules.api.transPkg.user ? true : false; + modules.od = modules.api.userDetails && modules.api.transPkg.od ? true : false; + + return modules; +}; + +export const reloadModuleStatus = (reload: any, currentLoadedModule: any) => { + const blankApi = metaSettings.loadedModule; + + if (reload === 'all') { + //all -- 全都改 + currentLoadedModule = { + ...currentLoadedModule, + api: { + ...blankApi, + }, + }; + } else if (reload === 'view-trans') { + //trans -- 全都改 + currentLoadedModule = { + ...currentLoadedModule, + api: { + ...blankApi, + }, + }; + } else if (reload === 'user-status') { + currentLoadedModule = { + //user -- status 次级ä¾èµ–问题 + ...currentLoadedModule, + api: { + ...currentLoadedModule.api, + userDetails: false, + }, + }; + } + + return currentLoadedModule; +}; + +/** + * + * @param moduleKey indicates which module you want to check + * @param metaModuleLoaded current metaModuleLoaded model + * @param state ConnectState data - object contains meta data + * + * Possible Arguments in "state" + * Landing - claimBasic, userId + * Od - userId + * User - claimBasic + * + * Other (Translation related) + * requiredLange + * transGroups + */ + +export const getLoadedModuleStatus = (moduleKey: string, metaModuleLoaded: any, state: any) => { + const { caId = false, userId = false, requiredLang = false, transGroups = false } = state; + + let actions = []; + + /** + * 先检查哪一个模å—需è¦å–meta + * å¦‚æžœçŠ¶æ€æœºé‡Œçš„值(eg metaModuleLoaded.claimInfo)是 false + * 并且它对应的数æ®ï¼ˆeg claimBasic)都å˜åœ¨çš„è¯ åˆ™è°ƒç”¨fetchClaimInfo 去获å–需è¦çš„æ•°æ® + * + * å¦åˆ™éœ€è¦setLoadedModule æ›´æ”¹çŠ¶æ€æœºé‡Œçš„值 + */ + + if (moduleKey && requiredLang && transGroups && !metaModuleLoaded.api.transPkg[moduleKey]) { + //transé‡Œé¢æ²¡æœ‰load å°±load + //load过了就ä¸ç”¨å†load了 + actions.push({ + type: 'meta/fetchTranslations', + requiredLang, + transGroups, + baseTans: moduleKey, + }); + } + + if (moduleKey === 'ca') { + if (!metaModuleLoaded.api.caConfigs && caId) { + actions.push({ + type: 'fetchCaConfigs', + caId, + }); + } + } + + if (moduleKey === 'od' || moduleKey === 'user') { + if (!metaModuleLoaded.api.userDetails && userId) { + actions.push({ + type: 'meta/fetchCurrentUserDetails', + userId, + }); + } else { + actions.push({ + type: 'meta/setLoadedModule', + key: 'userDetails', + value: true, + }); + // //解决次级ä¾èµ–的问题 + // actions.push({ + // type: 'meta/setLoadedModule', + // key: 'currentEditingBusinessPackages', + // value: true, + // }); + } + } + return actions.length === 0 ? false : actions; +}; diff --git a/src/utils/odModules.ts b/src/utils/odModules.ts new file mode 100644 index 0000000..b719f06 --- /dev/null +++ b/src/utils/odModules.ts @@ -0,0 +1,174 @@ +import _ from 'lodash'; +import { isAllKeyTrue } from '@/utils/utils'; +import odSettings from '@/configs/odSettings'; + +/** + * set loaded modules status + * @param od.loadedModule [transPkg, editDish, ...] + * @param od.loadedModule [transPkg, editDish, ...] + */ +export const setLoadedModuleStatus = (modules: any) => { + modules.odDashboard = isAllKeyTrue(modules.api.odDashboard) ? true : false; + + return modules; +}; + +/** + * + * @param reload trans, business, dish-update + * @param currentLoadedModule current odModuleLoaded model + * + */ +export const reloadModuleStatus = (reload: any, currentLoadedModule: any) => { + const blankApi = odSettings.loadedModule; + + if (reload === 'all') { + //apiå…¨æ¢ + currentLoadedModule = { + ...currentLoadedModule, + api: blankApi, + }; + + return currentLoadedModule; + } + + /* + reload : + odDashboard: 'odDashboard-update' | 'odDashboard-switch', + + reloadModule: odDashboard/odMenu/odEvent/odDeal odDashboard/odMenus/odEvents/odDeals + actionMode: update/switch clear/create + + */ + const allModules = ['odDashboard']; + const actionArray = ['update', 'switch', 'clear', 'create']; + + //TBD 这个地方暂时åªç”¨æœ€ç®€å•的情况 夿‚的情况å†è®¨è®º + const modelsNeedToReloadAllDishesWhenUpdated = ['odDish']; + const modelsNeedToReloadAllDishesWhenCreated = ['odDishes']; + + const modelsNeedToReloadAllMenusWhenUpdated = ['odMenu']; + const modelsNeedToReloadAllMenusWhenCreated = ['odMenus']; + + const modelsNeedToReloadBusinessDetailsWhenUpdated = ['odBusiness']; + + const modelsNeedToReloadListSelivesWhenUpdated = ['odDish', 'odMenu', 'odEvent', 'odDeal']; + + const [reloadModule, actionMode] = reload.split('-'); + + if (allModules.includes(reloadModule) && actionArray.includes(actionMode)) { + //update | switch | clear | create æŸä¸€é¡¹ 则它的selfè¦é¦–先更改为false + currentLoadedModule = { + ...currentLoadedModule, + api: { + ...currentLoadedModule.api, + [reloadModule]: { ...currentLoadedModule.api[reloadModule], self: false }, + }, + }; + } + + //处ç†éœ€è¦reload list selves的情况 + if (actionMode === 'update' && modelsNeedToReloadListSelivesWhenUpdated.includes(reloadModule)) { + const singleToListNameConvert = { + odDish: 'odDishes', + odMenu: 'odMenus', + odEvent: 'odEvents', + odDeal: 'odDeals', + }; + + currentLoadedModule = { + ...currentLoadedModule, + api: { + ...currentLoadedModule.api, + [singleToListNameConvert[reloadModule]]: { + ...currentLoadedModule.api[singleToListNameConvert[reloadModule]], + self: false, + }, + }, + }; + } + + return currentLoadedModule; +}; +/** + * + * @param moduleKey indicates which module you want to check + * @param odModuleLoaded current odModuleLoaded model + * @param state ConnectState data - object contains meta data + * + * Possible Arguments in "state" + * editingId + */ + +export const getLoadedModuleStatus = ( + moduleKey: string, + odModuleLoaded: any, + state: any = false, +) => { + const { editingId = false } = state; + + let actions = []; + + // const singleModelArray = ['odDish', 'odMenu', 'odDeal', 'odEvent', 'business']; + // const listModelArray = ['odDishes', 'odMenus', 'odDeals', 'odEvents']; + + const allModules = ['odDashboard']; + + const modelsNeedToLoadSelfWithId: string[] = ['odDashboard']; + const modelsNeedToLoadSelfWithoutId: string[] = []; + + /** + * 先检查哪一个模å—需è¦å–od-meta + * 它对应的数æ®éƒ½å˜åœ¨çš„è¯ åˆ™è°ƒç”¨fetch 去获å–需è¦çš„æ•°æ® + */ + + //检查有没有load过self, 没有则load + + if (modelsNeedToLoadSelfWithId.includes(moduleKey) && !odModuleLoaded.api[moduleKey].self) { + //ä¸éœ€è¦ç»™ID + actions.push({ + type: 'fetch', + }); + } + + if ( + modelsNeedToLoadSelfWithoutId.includes(moduleKey) && + !odModuleLoaded.api[moduleKey].self && + editingId + ) { + //需è¦ç»™ID + if (!odModuleLoaded.api[moduleKey].self) { + actions.push({ + type: 'fetch', + editingId, + }); + } + } + + return actions.length === 0 ? false : actions; +}; + +/** + * 这个函数在od䏿œ€åŽä»…仅修改fetchMeta reloadModule,ä¸ä¿®æ”¹çŠ¶æ€æœºæœ¬èº« + * + */ +export const getReloadModule = ( + showActioningMessage: boolean, + spaceName: string, + nextMove: 'redirect' | 'stay' | false = false, + payload: string | false = false, +) => { + let action: any = { + type: 'od/setReloadAction', + showActioningMessage, + spaceName, + }; + + if (nextMove === 'redirect') { + action = { ...action, redirectUrl: payload }; + } else if (nextMove === 'stay') { + action = { ...action, reloadType: payload }; + } + + return action; +}; diff --git a/src/utils/request.ts b/src/utils/request.ts new file mode 100644 index 0000000..bc10589 --- /dev/null +++ b/src/utils/request.ts @@ -0,0 +1,185 @@ +import { Dispatch } from 'redux'; +// import { response } from 'express'; +/** + * request 网络请求工具 + * 更详细的 api 文档: https://github.com/umijs/umi-request + */ +import { readUserInfoFromStorage } from '@/utils/user'; +import { notification, message } from 'antd'; +import { history } from 'umi'; +import request, { extend } from 'umi-request'; +import { languageLabel } from '@/constants/languages'; +import { validBusinessIdFormat } from '@/constants/validNumberFormat'; +import _ from 'lodash'; +import defaultSettings from '../../config/defaultSettings'; + +const projectKey = defaultSettings.projectKey; + +const codeMessage = { + 200: 'OK', + 201: 'Created', + 202: 'Accepted', + 204: 'No Content', + 400: 'Bad Request', + 401: 'Unauthorized', + 403: 'Forbidden', + 404: 'Not Found', + 406: 'Variables Not Acceptable', + 410: 'Gone', + 422: 'Unprocessable Entity', + 500: 'Internal Server Error', + 502: 'Bad Gateway', + 503: 'Service Unavailable', + 504: 'Gateway Timeout', + + //personal defined code for successs + 240: 'Returned Failed Validation', + 241: 'Returned Registration Uncompleted', + 242: 'Returned Registration Completed', + 244: 'Business already claimed', + + //personal defined code for successs + 419: 'Page Expired', +}; + +/** + * 处ç†éœ€è¦bear token的请求 + */ +request.interceptors.request.use((url, options: any) => { + let lang: any = false; + let accessToken: any = false; + let bId: any = false; + + let headerJson: any = { + ...options.headers, + }; + + if (options.headers && options.headers.bearLang === 'view') { + lang = + localStorage && + localStorage.getItem(`${projectKey}-view-lang`) && + languageLabel.includes(localStorage.getItem(`${projectKey}-view-lang`) as string) + ? localStorage.getItem(`${projectKey}-view-lang`) + : 'en_AU'; + } else if (options.headers && options.headers.bearLang === 'edit') { + lang = + localStorage && + localStorage.getItem(`${projectKey}-edit-lang`) && + languageLabel.includes(localStorage.getItem(`${projectKey}-edit-lang`) as string) + ? localStorage.getItem(`${projectKey}-edit-lang`) + : 'en_AU'; + } + + if (options.headers && options.headers.bearId === 'bId') { + bId = + sessionStorage && + sessionStorage.getItem(`${projectKey}-od-editing-business-info`) && + JSON.parse(sessionStorage.getItem(`${projectKey}-od-editing-business-info`) as string).b_id + ? JSON.parse(sessionStorage.getItem(`${projectKey}-od-editing-business-info`) as string) + .b_id + : false; + } else if (options.headers && options.headers.bearId === 'caId') { + bId = + localStorage && + localStorage.getItem(`${projectKey}-ca-viewing-id`) && + validBusinessIdFormat.test(localStorage.getItem(`${projectKey}-ca-viewing-id`) as string) + ? localStorage.getItem(`${projectKey}-ca-viewing-id`) + : false; + } + + if (options.headers && options.headers.bearToken === 'auth') { + //从session å’Œ local里é¢åˆ†åˆ«æ‰¾token + const userInfo = readUserInfoFromStorage(); + //å–到localStorage 或者 sessionStorageçš„ userInfo + accessToken = userInfo && userInfo.token.access_token ? userInfo.token.access_token : false; + } + + if (lang) { + headerJson = _.omit({ ...headerJson, lang }, 'bearLang'); + } + if (bId) { + headerJson = _.omit({ ...headerJson, bid: bId }, 'bearId'); + } + if (accessToken) { + headerJson = _.omit({ ...headerJson, Authorization: `Bearer ${accessToken}` }, 'bearToken'); + } + + return { + url: url, + options: { + ...options, + headers: headerJson, + }, + }; +}); + +/** + * 异常处ç†ç¨‹åº (å¤„ç† No/403/404/404/500) + */ +const errorHandler = (error: { response: Response }): Response => { + const { response } = error; + const { status, url } = response; + + if (!response) { + // no response + notification.error({ + message: 'Network Wrong', + description: 'Can not connected to the sever', + }); + + history.push('/404'); + throw error; + } + + if (status === 403 || status === 404 || status === 500) { + //Redirect to certain pages. + notification.error({ + message: `${codeMessage[status]} ${status}: ${url}`, + }); + + history.push(`/${status}`); + throw error; + } + + return response; +}; + +/** + * 处ç†è¿”回对象error 400 + */ +request.interceptors.response.use(async (response, options) => { + const { responseType } = options; + const { status, url } = response; + + if (responseType && responseType !== 'json') { + // type not json, no handle + return response; + } + + if (Number(status.toString()[0]) === 2) { + // 2开头的就表示æˆåŠŸ (200 / 240 在里é¢å¤„ç†) + return response; + } + if (Number(status.toString()[0]) !== 2) { + //䏿˜¯2çš„è¯ æœ‰å¯èƒ½æ˜¯3xx 4xx 5xx è¿™æ ·çš„è¯å°±æ˜¾ç¤ºmessage就行了 + let data = null; + try { + data = await response.clone().json(); + } catch (error) { + console.error(error); + return response; + } + + const errMsg = data.message ? data.message : codeMessage[status]; + message.error(errMsg); + } + + return response; +}); + +const newRequest = extend({ + errorHandler, // é»˜è®¤é”™è¯¯å¤„ç† + credentials: 'include', // 默认请求是å¦å¸¦ä¸Šcookie +}); + +export default newRequest; diff --git a/src/utils/user.ts b/src/utils/user.ts new file mode 100644 index 0000000..36aed51 --- /dev/null +++ b/src/utils/user.ts @@ -0,0 +1,35 @@ +import defaultSettings from '../../config/defaultSettings'; + +export const readUserInfoFromStorage = () => { + let userInfo: any = false; + if (localStorage && localStorage.getItem(`${defaultSettings.projectKey}-authorized-user-info`)) { + userInfo = JSON.parse( + localStorage.getItem(`${defaultSettings.projectKey}-authorized-user-info`) as string, + ); + } //先从localStorage里é¢è¯» + + if (!userInfo) { + //å†ä»ŽsessionStorage里é¢è¯» + if ( + sessionStorage && + sessionStorage.getItem(`${defaultSettings.projectKey}-authorized-user-info`) + ) { + userInfo = JSON.parse( + sessionStorage.getItem(`${defaultSettings.projectKey}-authorized-user-info`) as string, + ); + } + } + return userInfo; +}; + +export const removeUserInfoFromStorage = () => { + if (localStorage && localStorage.getItem(`${defaultSettings.projectKey}-authorized-user-info`)) { + localStorage.removeItem(`${defaultSettings.projectKey}-authorized-user-info`); + } + if ( + sessionStorage && + sessionStorage.getItem(`${defaultSettings.projectKey}-authorized-user-info`) + ) { + sessionStorage.removeItem(`${defaultSettings.projectKey}-authorized-user-info`); + } +}; diff --git a/src/utils/utils.less b/src/utils/utils.less new file mode 100644 index 0000000..e9dfd5c --- /dev/null +++ b/src/utils/utils.less @@ -0,0 +1,16 @@ +// mixins for clearfix +// ------------------------ +.clearfix() { + zoom: 1; + &::before, + &::after { + display: table; + content: ' '; + } + &::after { + clear: both; + height: 0; + font-size: 0; + visibility: hidden; + } +} diff --git a/src/utils/utils.test.ts b/src/utils/utils.test.ts new file mode 100644 index 0000000..c2bb32d --- /dev/null +++ b/src/utils/utils.test.ts @@ -0,0 +1,37 @@ +import { isUrl } from './utils'; + +describe('isUrl tests', (): void => { + it('should return false for invalid and corner case inputs', (): void => { + expect(isUrl([] as any)).toBeFalsy(); + expect(isUrl({} as any)).toBeFalsy(); + expect(isUrl(false as any)).toBeFalsy(); + expect(isUrl(true as any)).toBeFalsy(); + expect(isUrl(NaN as any)).toBeFalsy(); + expect(isUrl(null as any)).toBeFalsy(); + expect(isUrl(undefined as any)).toBeFalsy(); + expect(isUrl('')).toBeFalsy(); + }); + + it('should return false for invalid URLs', (): void => { + expect(isUrl('foo')).toBeFalsy(); + expect(isUrl('bar')).toBeFalsy(); + expect(isUrl('bar/test')).toBeFalsy(); + expect(isUrl('http:/example.com/')).toBeFalsy(); + expect(isUrl('ttp://example.com/')).toBeFalsy(); + }); + + it('should return true for valid URLs', (): void => { + expect(isUrl('http://example.com/')).toBeTruthy(); + expect(isUrl('https://example.com/')).toBeTruthy(); + expect(isUrl('http://example.com/test/123')).toBeTruthy(); + expect(isUrl('https://example.com/test/123')).toBeTruthy(); + expect(isUrl('http://example.com/test/123?foo=bar')).toBeTruthy(); + expect(isUrl('https://example.com/test/123?foo=bar')).toBeTruthy(); + expect(isUrl('http://www.example.com/')).toBeTruthy(); + expect(isUrl('https://www.example.com/')).toBeTruthy(); + expect(isUrl('http://www.example.com/test/123')).toBeTruthy(); + expect(isUrl('https://www.example.com/test/123')).toBeTruthy(); + expect(isUrl('http://www.example.com/test/123?foo=bar')).toBeTruthy(); + expect(isUrl('https://www.example.com/test/123?foo=bar')).toBeTruthy(); + }); +}); diff --git a/src/utils/utils.ts b/src/utils/utils.ts new file mode 100644 index 0000000..cc2ec83 --- /dev/null +++ b/src/utils/utils.ts @@ -0,0 +1,149 @@ +import { parse } from 'querystring'; +import { ConnectState } from '@/models/connect'; +import _ from 'lodash'; + +/* eslint no-useless-escape:0 import/prefer-default-export:0 */ +const reg = /(((^https?:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)$/; + +export const isUrl = (path: string): boolean => reg.test(path); + +export const isAntDesignPro = (): boolean => { + if (ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION === 'site') { + return true; + } + return window.location.hostname === 'preview.pro.ant.design'; +}; + +// 给官方演示站点用,用于关é—真实开å‘环境ä¸éœ€è¦ä½¿ç”¨çš„特性 +export const isAntDesignProOrDev = (): boolean => { + const { NODE_ENV } = process.env; + if (NODE_ENV === 'development') { + return true; + } + return isAntDesignPro(); +}; + +export const getPageQuery = () => parse(window.location.href.split('?')[1]); + +export const getMapStateToProps = (args: string[]) => { + const mapStateToProps = (state: ConnectState) => { + /** + * Translation function + * @param label + * @returns {*} + */ + const tx = (label: string) => { + let ret = label; + const [group, key] = label.split('.'); + if (state.meta.translations.translations && state.meta.translations.translations[group]) { + if (state.meta.translations.translations[group][key]) { + ret = state.meta.translations.translations[group][key]; + } + } + return ret; + }; + + let props = { helper: { tx } } as any; + + args.map((item: string) => { + if (state[item]) { + props[item] = state[item]; + } + }); + + return props; + }; + return mapStateToProps; +}; + +export const convertJsonToCamelCase = (data: any) => { + const toCamel = (x: string) => _.camelCase(x); + + const convert = (item: any) => { + let newData = item instanceof Array ? [] : {}; + _.forEach(item, (value, key) => { + if (value instanceof Array) { + newData[toCamel(key)] = []; + _.forEach(value, (v) => { + if (v instanceof Object) { + newData[toCamel(key)].push(convert(v)); + } else { + newData[toCamel(key)].push(v); + } + }); + } else if (value instanceof Object) { + newData[toCamel(key)] = convert(value); + } else { + newData[toCamel(key)] = value; + } + }); + + return newData as any; + }; + + const convertedData = data instanceof Object ? convert(data) : data; + + return convertedData; +}; + +export const convertCamelCaseToSnakeCase = (data: any) => { + const toCamel = (x: string) => _.snakeCase(x); + + const convert = (item: any) => { + let newData = item instanceof Array ? [] : {}; + _.forEach(item, (value, key) => { + if (value instanceof Array) { + newData[toCamel(key)] = []; + _.forEach(value, (v) => { + if (v instanceof Object) { + newData[toCamel(key)].push(convert(v)); + } else { + newData[toCamel(key)].push(v); + } + }); + } else if (value instanceof Object) { + newData[toCamel(key)] = convert(value); + } else { + newData[toCamel(key)] = value; + } + }); + + return newData as any; + }; + + const convertedData = data instanceof Object ? convert(data) : data; + + return convertedData; +}; + +export const isAllKeyTrue = (data: object) => { + let flag = true; + _.forEach(data, (v, k) => { + if (v !== true) { + flag = false; + } + }); + return flag; +}; + +export const getValueFromMeta = (meta: any, key: any) => { + const result = meta.filter((x: any) => x.key === key)[0]?.value; + + return result; +}; + +export const batchGetValueFromMeta = (meta: any, keysArrayNeedToFetch: string[]) => { + let result = {}; + + const keyValueObjArray = keysArrayNeedToFetch.map((item: any) => { + const value = meta.filter((x: any) => x.key === item)[0]?.value; + result[item] = value; + return { key: item, value }; + }); + + keyValueObjArray.map((x: any) => { + result[x.key] = x.value; + }); + + return result; +}; -- GitLab From a8baa36ea8e50e3a8186393cc7e6f66397bc68e7 Mon Sep 17 00:00:00 2001 From: victor-liu <victorliu1999@gmail.com> Date: Tue, 5 Jan 2021 11:41:11 +1100 Subject: [PATCH 17/18] added test cases --- tests/PuppeteerEnvironment.js | 41 +++++++++++++++++++++++++++ tests/beforeTest.js | 39 ++++++++++++++++++++++++++ tests/getBrowser.js | 45 ++++++++++++++++++++++++++++++ tests/run-tests.js | 52 +++++++++++++++++++++++++++++++++++ 4 files changed, 177 insertions(+) create mode 100644 tests/PuppeteerEnvironment.js create mode 100644 tests/beforeTest.js create mode 100644 tests/getBrowser.js create mode 100644 tests/run-tests.js diff --git a/tests/PuppeteerEnvironment.js b/tests/PuppeteerEnvironment.js new file mode 100644 index 0000000..13409be --- /dev/null +++ b/tests/PuppeteerEnvironment.js @@ -0,0 +1,41 @@ +// eslint-disable-next-line +const NodeEnvironment = require('jest-environment-node'); +const getBrowser = require('./getBrowser'); + +class PuppeteerEnvironment extends NodeEnvironment { + // Jest is not available here, so we have to reverse engineer + // the setTimeout function, see https://github.com/facebook/jest/blob/v23.1.0/packages/jest-runtime/src/index.js#L823 + setTimeout(timeout) { + if (this.global.jasmine) { + // eslint-disable-next-line no-underscore-dangle + this.global.jasmine.DEFAULT_TIMEOUT_INTERVAL = timeout; + } else { + this.global[Symbol.for('TEST_TIMEOUT_SYMBOL')] = timeout; + } + } + + async setup() { + const browser = await getBrowser(); + const page = await browser.newPage(); + this.global.browser = browser; + this.global.page = page; + } + + async teardown() { + const { page, browser } = this.global; + + if (page) { + await page.close(); + } + + if (browser) { + await browser.disconnect(); + } + + if (browser) { + await browser.close(); + } + } +} + +module.exports = PuppeteerEnvironment; diff --git a/tests/beforeTest.js b/tests/beforeTest.js new file mode 100644 index 0000000..9302239 --- /dev/null +++ b/tests/beforeTest.js @@ -0,0 +1,39 @@ +/* eslint-disable global-require */ +/* eslint-disable import/no-extraneous-dependencies */ +const { execSync } = require('child_process'); +const { join } = require('path'); +const findChrome = require('carlo/lib/find_chrome'); +const detectInstaller = require('detect-installer'); + +const installPuppeteer = () => { + // find can use package manger + const packages = detectInstaller(join(__dirname, '../../')); + // get installed package manger + const packageName = packages.find(detectInstaller.hasPackageCommand) || 'npm'; + console.log(`🤖 will use ${packageName} install puppeteer`); + const command = `${packageName} ${packageName.includes('yarn') ? 'add' : 'i'} puppeteer`; + execSync(command, { + stdio: 'inherit', + }); +}; + +const initPuppeteer = async () => { + try { + // eslint-disable-next-line import/no-unresolved + const findChromePath = await findChrome({}); + const { executablePath } = findChromePath; + console.log(`🧲 find you browser in ${executablePath}`); + return; + } catch (error) { + console.log('🧲 no find chrome'); + } + + try { + require.resolve('puppeteer'); + } catch (error) { + // need install puppeteer + await installPuppeteer(); + } +}; + +initPuppeteer(); diff --git a/tests/getBrowser.js b/tests/getBrowser.js new file mode 100644 index 0000000..3b4ef33 --- /dev/null +++ b/tests/getBrowser.js @@ -0,0 +1,45 @@ +/* eslint-disable global-require */ +/* eslint-disable import/no-extraneous-dependencies */ +const findChrome = require('carlo/lib/find_chrome'); + +const getBrowser = async () => { + try { + // eslint-disable-next-line import/no-unresolved + const puppeteer = require('puppeteer'); + const browser = await puppeteer.launch({ + args: [ + '--disable-gpu', + '--disable-dev-shm-usage', + '--no-first-run', + '--no-zygote', + '--no-sandbox', + ], + }); + return browser; + } catch (error) { + // console.log(error) + } + + try { + // eslint-disable-next-line import/no-unresolved + const puppeteer = require('puppeteer-core'); + const findChromePath = await findChrome({}); + const { executablePath } = findChromePath; + const browser = await puppeteer.launch({ + executablePath, + args: [ + '--disable-gpu', + '--disable-dev-shm-usage', + '--no-first-run', + '--no-zygote', + '--no-sandbox', + ], + }); + return browser; + } catch (error) { + console.log('🧲 no find chrome'); + } + throw new Error('no find puppeteer'); +}; + +module.exports = getBrowser; diff --git a/tests/run-tests.js b/tests/run-tests.js new file mode 100644 index 0000000..3aa080d --- /dev/null +++ b/tests/run-tests.js @@ -0,0 +1,52 @@ +/* eslint-disable eslint-comments/disable-enable-pair */ +/* eslint-disable @typescript-eslint/no-var-requires */ +/* eslint-disable eslint-comments/no-unlimited-disable */ +const { spawn } = require('child_process'); +// eslint-disable-next-line import/no-extraneous-dependencies +const { kill } = require('cross-port-killer'); + +const env = Object.create(process.env); +env.BROWSER = 'none'; +env.TEST = true; +env.UMI_UI = 'none'; +env.PROGRESS = 'none'; +// flag to prevent multiple test +let once = false; + +const startServer = spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['start'], { + env, +}); + +startServer.stderr.on('data', (data) => { + // eslint-disable-next-line + console.log(data.toString()); +}); + +startServer.on('exit', () => { + kill(process.env.PORT || 8000); +}); + +console.log('Starting development server for e2e tests...'); +startServer.stdout.on('data', (data) => { + console.log(data.toString()); + // hack code , wait umi + if ( + (!once && data.toString().indexOf('Compiled successfully') >= 0) || + data.toString().indexOf('Theme generated successfully') >= 0 + ) { + // eslint-disable-next-line + once = true; + console.log('Development server is started, ready to run tests.'); + const testCmd = spawn( + /^win/.test(process.platform) ? 'npm.cmd' : 'npm', + ['test', '--', '--maxWorkers=1', '--runInBand'], + { + stdio: 'inherit', + }, + ); + testCmd.on('exit', (code) => { + startServer.kill(); + process.exit(code); + }); + } +}); -- GitLab From a33bbef72372fc9a5072be2f6306d68bba03cd46 Mon Sep 17 00:00:00 2001 From: victor-liu <victorliu1999@gmail.com> Date: Tue, 5 Jan 2021 12:45:18 +1100 Subject: [PATCH 18/18] test --- .eslintignore | 10 + .eslintrc.js | 8 + .prettierignore | 23 +- .prettierrc | 11 - .prettierrc.js | 5 + .stylelintrc.js | 5 + .umirc.ts | 10 - README.md | 54 +- config/config.ts | 53 + config/defaultSettings.ts | 46 + config/proxy.ts | 30 + config/routes.ts | 101 + jsconfig.json | 10 + package.json | 6 + public/CNAME | 1 + public/favicon.ico | Bin 0 -> 4286 bytes public/home_bg.png | Bin 0 -> 203330 bytes public/icons/icon-128x128.png | Bin 0 -> 1329 bytes public/icons/icon-192x192.png | Bin 0 -> 1856 bytes public/icons/icon-512x512.png | Bin 0 -> 5082 bytes public/pro_icon.svg | 5 + src/assets/joideaGroupLogo.svg | 1 + src/assets/logo.svg | 1 + src/assets/longLogo.svg | 36 + src/assets/user/maskBackground.svg | 69 + src/components/Authorized/Authorized.tsx | 35 + src/components/Authorized/AuthorizedRoute.tsx | 33 + .../Authorized/CheckPermissions.tsx | 79 + src/components/Authorized/PromiseRender.tsx | 93 + src/components/Authorized/Secured.tsx | 66 + src/components/Authorized/index.tsx | 11 + src/components/Authorized/renderAuthorize.ts | 30 + src/components/GlobalFooter/index.tsx | 66 + src/components/GlobalFooter/style.less | 39 + .../GlobalHeader/AvatarDropdown.tsx | 92 + .../GlobalHeader/NoticeIconView.tsx | 171 + src/components/GlobalHeader/RightContent.tsx | 47 + src/components/GlobalHeader/index.less | 82 + src/components/HeaderAvatar/index.less | 28 + src/components/HeaderAvatar/index.tsx | 82 + src/components/HeaderDropdown/index.less | 16 + src/components/HeaderDropdown/index.tsx | 19 + src/components/HeaderSearch/index.less | 30 + src/components/HeaderSearch/index.tsx | 105 + src/components/NoticeIcon/NoticeList.less | 103 + src/components/NoticeIcon/NoticeList.tsx | 114 + src/components/NoticeIcon/index.less | 35 + src/components/NoticeIcon/index.tsx | 135 + src/components/PageLoading/index.tsx | 5 + .../PageLoadingWithMargin/index.tsx | 12 + .../PageLoadingWithMargin/styles.less | 7 + src/components/SelectLang/index.less | 22 + src/components/SelectLang/index.tsx | 79 + src/configs/caSettings.ts | 21 + src/configs/metaSettings.ts | 55 + src/configs/odSettings.ts | 37 + src/configs/userSettings.ts | 22 + src/constants/languages.ts | 94 + src/constants/routesParams.ts | 1 + src/constants/translationGroups.ts | 75 + src/constants/validNumberFormat.ts | 3 + src/global.less | 54 + src/global.tsx | 85 + src/layouts/AuthLayout.tsx | 79 + src/layouts/BlankLayout.tsx | 74 + src/layouts/OdLayout.tsx | 190 ++ src/layouts/UserLayout.tsx | 53 + src/layouts/od/Header.tsx | 22 + src/layouts/od/style.less | 11 + src/layouts/user/Header.tsx | 16 + src/layouts/user/Lable.tsx | 24 + src/layouts/user/style.less | 62 + src/locales/en-US.ts | 24 + src/locales/en-US/component.ts | 5 + src/locales/en-US/globalHeader.ts | 17 + src/locales/en-US/menu.ts | 52 + src/locales/en-US/pages.ts | 68 + src/locales/en-US/pwa.ts | 6 + src/locales/en-US/settingDrawer.ts | 31 + src/locales/en-US/settings.ts | 60 + src/locales/id-ID.ts | 23 + src/locales/id-ID/component.ts | 5 + src/locales/id-ID/globalHeader.ts | 17 + src/locales/id-ID/menu.ts | 52 + src/locales/id-ID/pwa.ts | 7 + src/locales/id-ID/settingDrawer.ts | 32 + src/locales/id-ID/settings.ts | 60 + src/locales/pt-BR.ts | 20 + src/locales/pt-BR/component.ts | 5 + src/locales/pt-BR/globalHeader.ts | 18 + src/locales/pt-BR/menu.ts | 52 + src/locales/pt-BR/pwa.ts | 7 + src/locales/pt-BR/settingDrawer.ts | 32 + src/locales/pt-BR/settings.ts | 60 + src/locales/zh-CN.ts | 24 + src/locales/zh-CN/component.ts | 5 + src/locales/zh-CN/globalHeader.ts | 17 + src/locales/zh-CN/menu.ts | 52 + src/locales/zh-CN/pages.ts | 65 + src/locales/zh-CN/pwa.ts | 6 + src/locales/zh-CN/settingDrawer.ts | 31 + src/locales/zh-CN/settings.ts | 55 + src/locales/zh-TW.ts | 20 + src/locales/zh-TW/component.ts | 5 + src/locales/zh-TW/globalHeader.ts | 17 + src/locales/zh-TW/menu.ts | 52 + src/locales/zh-TW/pwa.ts | 6 + src/locales/zh-TW/settingDrawer.ts | 31 + src/locales/zh-TW/settings.ts | 55 + src/manifest.json | 22 + src/models/ca.ts | 161 + src/models/connect.d.ts | 28 + src/models/meta.ts | 264 ++ src/models/od.ts | 126 + src/models/setting.ts | 37 + src/models/user.ts | 185 ++ src/pages/403.tsx | 50 + src/pages/404.tsx | 24 + src/pages/500.tsx | 42 + src/pages/Admin.tsx | 43 + src/pages/Welcome.less | 8 + src/pages/Welcome.tsx | 63 + src/pages/document.ejs | 213 ++ src/pages/index.less | 3 - src/pages/index.tsx | 10 - src/pages/od/dashboard/config.ts | 1 + src/pages/od/dashboard/index.less | 3 + src/pages/od/dashboard/index.tsx | 31 + src/pages/user/login/components/LoginForm.tsx | 85 + .../user/login/components/LoginTitle.tsx | 18 + src/pages/user/login/components/style.less | 13 + src/pages/user/login/config.ts | 5 + src/pages/user/login/index.less | 9 + src/pages/user/login/index.tsx | 43 + src/pages/user/login/model.ts | 64 + src/pages/user/login/services.ts | 12 + src/service-worker.js | 70 + src/services/ca.ts | 9 + src/services/meta.ts | 25 + src/services/od.ts | 0 src/services/user.ts | 16 + src/typings.d.ts | 38 + src/utils/Authorized.ts | 19 + src/utils/authority.ts | 67 + src/utils/caModules.ts | 169 + src/utils/metaModules.ts | 119 + src/utils/odModules.ts | 174 + src/utils/request.ts | 185 ++ src/utils/user.ts | 35 + src/utils/utils.less | 16 + src/utils/utils.test.ts | 37 + src/utils/utils.ts | 149 + tests/PuppeteerEnvironment.js | 41 + tests/beforeTest.js | 39 + tests/getBrowser.js | 45 + tests/run-tests.js | 52 + tsconfig.json | 50 +- yarn.lock | 2826 ++++++++++++++++- 158 files changed, 9774 insertions(+), 163 deletions(-) create mode 100644 .eslintignore create mode 100644 .eslintrc.js delete mode 100644 .prettierrc create mode 100644 .prettierrc.js create mode 100644 .stylelintrc.js delete mode 100644 .umirc.ts create mode 100644 config/config.ts create mode 100644 config/defaultSettings.ts create mode 100644 config/proxy.ts create mode 100644 config/routes.ts create mode 100644 jsconfig.json create mode 100644 public/CNAME create mode 100644 public/favicon.ico create mode 100644 public/home_bg.png create mode 100644 public/icons/icon-128x128.png create mode 100644 public/icons/icon-192x192.png create mode 100644 public/icons/icon-512x512.png create mode 100644 public/pro_icon.svg create mode 100644 src/assets/joideaGroupLogo.svg create mode 100644 src/assets/logo.svg create mode 100644 src/assets/longLogo.svg create mode 100644 src/assets/user/maskBackground.svg create mode 100644 src/components/Authorized/Authorized.tsx create mode 100644 src/components/Authorized/AuthorizedRoute.tsx create mode 100644 src/components/Authorized/CheckPermissions.tsx create mode 100644 src/components/Authorized/PromiseRender.tsx create mode 100644 src/components/Authorized/Secured.tsx create mode 100644 src/components/Authorized/index.tsx create mode 100644 src/components/Authorized/renderAuthorize.ts create mode 100644 src/components/GlobalFooter/index.tsx create mode 100644 src/components/GlobalFooter/style.less create mode 100644 src/components/GlobalHeader/AvatarDropdown.tsx create mode 100644 src/components/GlobalHeader/NoticeIconView.tsx create mode 100644 src/components/GlobalHeader/RightContent.tsx create mode 100644 src/components/GlobalHeader/index.less create mode 100644 src/components/HeaderAvatar/index.less create mode 100644 src/components/HeaderAvatar/index.tsx create mode 100644 src/components/HeaderDropdown/index.less create mode 100644 src/components/HeaderDropdown/index.tsx create mode 100644 src/components/HeaderSearch/index.less create mode 100644 src/components/HeaderSearch/index.tsx create mode 100755 src/components/NoticeIcon/NoticeList.less create mode 100644 src/components/NoticeIcon/NoticeList.tsx create mode 100644 src/components/NoticeIcon/index.less create mode 100644 src/components/NoticeIcon/index.tsx create mode 100644 src/components/PageLoading/index.tsx create mode 100644 src/components/PageLoadingWithMargin/index.tsx create mode 100644 src/components/PageLoadingWithMargin/styles.less create mode 100644 src/components/SelectLang/index.less create mode 100644 src/components/SelectLang/index.tsx create mode 100644 src/configs/caSettings.ts create mode 100644 src/configs/metaSettings.ts create mode 100644 src/configs/odSettings.ts create mode 100644 src/configs/userSettings.ts create mode 100644 src/constants/languages.ts create mode 100644 src/constants/routesParams.ts create mode 100644 src/constants/translationGroups.ts create mode 100644 src/constants/validNumberFormat.ts create mode 100644 src/global.less create mode 100644 src/global.tsx create mode 100644 src/layouts/AuthLayout.tsx create mode 100644 src/layouts/BlankLayout.tsx create mode 100644 src/layouts/OdLayout.tsx create mode 100644 src/layouts/UserLayout.tsx create mode 100644 src/layouts/od/Header.tsx create mode 100644 src/layouts/od/style.less create mode 100644 src/layouts/user/Header.tsx create mode 100644 src/layouts/user/Lable.tsx create mode 100755 src/layouts/user/style.less create mode 100644 src/locales/en-US.ts create mode 100644 src/locales/en-US/component.ts create mode 100644 src/locales/en-US/globalHeader.ts create mode 100644 src/locales/en-US/menu.ts create mode 100644 src/locales/en-US/pages.ts create mode 100644 src/locales/en-US/pwa.ts create mode 100644 src/locales/en-US/settingDrawer.ts create mode 100644 src/locales/en-US/settings.ts create mode 100644 src/locales/id-ID.ts create mode 100644 src/locales/id-ID/component.ts create mode 100644 src/locales/id-ID/globalHeader.ts create mode 100644 src/locales/id-ID/menu.ts create mode 100644 src/locales/id-ID/pwa.ts create mode 100644 src/locales/id-ID/settingDrawer.ts create mode 100644 src/locales/id-ID/settings.ts create mode 100644 src/locales/pt-BR.ts create mode 100644 src/locales/pt-BR/component.ts create mode 100644 src/locales/pt-BR/globalHeader.ts create mode 100644 src/locales/pt-BR/menu.ts create mode 100644 src/locales/pt-BR/pwa.ts create mode 100644 src/locales/pt-BR/settingDrawer.ts create mode 100644 src/locales/pt-BR/settings.ts create mode 100644 src/locales/zh-CN.ts create mode 100644 src/locales/zh-CN/component.ts create mode 100644 src/locales/zh-CN/globalHeader.ts create mode 100644 src/locales/zh-CN/menu.ts create mode 100644 src/locales/zh-CN/pages.ts create mode 100644 src/locales/zh-CN/pwa.ts create mode 100644 src/locales/zh-CN/settingDrawer.ts create mode 100644 src/locales/zh-CN/settings.ts create mode 100644 src/locales/zh-TW.ts create mode 100644 src/locales/zh-TW/component.ts create mode 100644 src/locales/zh-TW/globalHeader.ts create mode 100644 src/locales/zh-TW/menu.ts create mode 100644 src/locales/zh-TW/pwa.ts create mode 100644 src/locales/zh-TW/settingDrawer.ts create mode 100644 src/locales/zh-TW/settings.ts create mode 100644 src/manifest.json create mode 100644 src/models/ca.ts create mode 100644 src/models/connect.d.ts create mode 100644 src/models/meta.ts create mode 100644 src/models/od.ts create mode 100644 src/models/setting.ts create mode 100644 src/models/user.ts create mode 100644 src/pages/403.tsx create mode 100644 src/pages/404.tsx create mode 100644 src/pages/500.tsx create mode 100644 src/pages/Admin.tsx create mode 100644 src/pages/Welcome.less create mode 100644 src/pages/Welcome.tsx create mode 100644 src/pages/document.ejs delete mode 100644 src/pages/index.less delete mode 100644 src/pages/index.tsx create mode 100644 src/pages/od/dashboard/config.ts create mode 100644 src/pages/od/dashboard/index.less create mode 100644 src/pages/od/dashboard/index.tsx create mode 100644 src/pages/user/login/components/LoginForm.tsx create mode 100644 src/pages/user/login/components/LoginTitle.tsx create mode 100644 src/pages/user/login/components/style.less create mode 100644 src/pages/user/login/config.ts create mode 100644 src/pages/user/login/index.less create mode 100644 src/pages/user/login/index.tsx create mode 100644 src/pages/user/login/model.ts create mode 100644 src/pages/user/login/services.ts create mode 100644 src/service-worker.js create mode 100644 src/services/ca.ts create mode 100644 src/services/meta.ts create mode 100644 src/services/od.ts create mode 100644 src/services/user.ts create mode 100644 src/typings.d.ts create mode 100644 src/utils/Authorized.ts create mode 100644 src/utils/authority.ts create mode 100644 src/utils/caModules.ts create mode 100644 src/utils/metaModules.ts create mode 100644 src/utils/odModules.ts create mode 100644 src/utils/request.ts create mode 100644 src/utils/user.ts create mode 100644 src/utils/utils.less create mode 100644 src/utils/utils.test.ts create mode 100644 src/utils/utils.ts create mode 100644 tests/PuppeteerEnvironment.js create mode 100644 tests/beforeTest.js create mode 100644 tests/getBrowser.js create mode 100644 tests/run-tests.js diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..d053230 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,10 @@ +/lambda/ +/scripts +/config +.history +*.test.js +/pages/Demo +/node_modules/ +/dist +/src/* +**/*.less diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..b882c20 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,8 @@ +module.exports = { + extends: [require.resolve('@umijs/fabric/dist/eslint')], + globals: { + ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION: true, + page: true, + REACT_APP_ENV: true, + }, +}; diff --git a/.prettierignore b/.prettierignore index 0d4222f..e367454 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,8 +1,23 @@ -**/*.md **/*.svg -**/*.ejs -**/*.html package.json .umi .umi-production -.umi-test +/dist +.dockerignore +.DS_Store +.eslintignore +*.png +*.toml +docker +.editorconfig +Dockerfile* +.gitignore +.prettierignore +LICENSE +.eslintcache +*.lock +yarn-error.log +.history +CNAME +/build +/public diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 94beb14..0000000 --- a/.prettierrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "singleQuote": true, - "trailingComma": "all", - "printWidth": 80, - "overrides": [ - { - "files": ".prettierrc", - "options": { "parser": "json" } - } - ] -} diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000..7b597d7 --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,5 @@ +const fabric = require('@umijs/fabric'); + +module.exports = { + ...fabric.prettier, +}; diff --git a/.stylelintrc.js b/.stylelintrc.js new file mode 100644 index 0000000..c203078 --- /dev/null +++ b/.stylelintrc.js @@ -0,0 +1,5 @@ +const fabric = require('@umijs/fabric'); + +module.exports = { + ...fabric.stylelint, +}; diff --git a/.umirc.ts b/.umirc.ts deleted file mode 100644 index af5394b..0000000 --- a/.umirc.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { defineConfig } from 'umi'; - -export default defineConfig({ - nodeModulesTransform: { - type: 'none', - }, - routes: [ - { path: '/', component: '@/pages/index' }, - ], -}); diff --git a/README.md b/README.md index 07afeb7..194ca29 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,57 @@ -# umi project +# Ant Design Mobile -## Getting Started +This project is initialized with [Ant Design Mobile](https://mobile.ant.design/). Follow is the quick guide for how to use. -Install dependencies, +## Environment Prepare + +Install `node_modules`: + +```bash +npm install +``` + +or + +```bash +yarn +``` + +## Provided Scripts + +Ant Design Mobile provides some useful script to help you quick start and build with web project, code style check and test. + +Scripts provided in `package.json`. It's safe to modify or add additional script: + +### Start project + +```bash +npm start +``` + +### Build project + +```bash +npm run build +``` + +### Check code style ```bash -$ yarn +npm run lint ``` -Start the dev server, +You can also use script to auto fix some lint error: ```bash -$ yarn start +npm run lint:fix ``` + +### Test code + +```bash +npm test +``` + +## More + +You can view full document on our [official website](https://mobile.ant.design/). And welcome any feedback in our [github](https://github.com/ant-design/ant-design-pro). diff --git a/config/config.ts b/config/config.ts new file mode 100644 index 0000000..90d3634 --- /dev/null +++ b/config/config.ts @@ -0,0 +1,53 @@ +// https://umijs.org/config/ +import { defineConfig } from 'umi'; +import defaultSettings from '../config/defaultSettings'; +import proxy from './proxy'; +import routes from './routes'; + +const { REACT_APP_ENV } = process.env; + +export default defineConfig({ + hash: true, + antd: {}, + dva: { + hmr: true, + }, + history: { + type: 'browser', + }, + locale: { + // default zh-CN + default: 'zh-CN', + antd: true, + // default true, when it is true, will use `navigator.language` overwrite default + baseNavigator: true, + }, + dynamicImport: {}, + targets: { + ie: 11, + }, + // umi routes: https://umijs.org/docs/routing + routes, + // Theme for antd: https://ant.design/docs/react/customize-theme-cn + theme: { + 'primary-color': defaultSettings.primaryColor, + 'link-color': defaultSettings.linkColor, + 'success-color': defaultSettings.successColor, + 'warning-color': defaultSettings.warningColor, + 'error-color': defaultSettings.errorColor, + }, + title: false, + ignoreMomentLocale: true, + proxy: proxy[REACT_APP_ENV || 'dev'], + manifest: { + basePath: '/', + }, + // https://github.com/zthxxx/react-dev-inspector + plugins: ['react-dev-inspector/plugins/umi/react-inspector'], + inspectorConfig: { + // loader options type and docs see below + exclude: [], + babelPlugins: [], + babelOptions: {}, + }, +}); diff --git a/config/defaultSettings.ts b/config/defaultSettings.ts new file mode 100644 index 0000000..8e15958 --- /dev/null +++ b/config/defaultSettings.ts @@ -0,0 +1,46 @@ +import { Settings as ProSettings } from '@ant-design/pro-layout'; + +type DefaultSettings = Partial<ProSettings> & { + pwa: boolean; + projectKey: string; + + projectOwnerUrl: string; + termsAndConditionUrl: string; + privacyPolicyUrl: string; + + primaryColor: string; + linkColor: string; // 链接色 + successColor: string; // æˆåŠŸè‰² + warningColor: string; // è¦å‘Šè‰² + errorColor: string; // 错误色 +}; + +const proSettings: DefaultSettings = { + navTheme: 'dark', + // æ‹‚æ™“è“ + layout: 'side', + contentWidth: 'Fluid', + fixedHeader: false, + fixSiderbar: true, + colorWeak: false, + title: 'Ant Mobile', + pwa: false, + iconfontUrl: '', + projectKey: 'sample', + + // Global Footer Urls + projectOwnerUrl: 'https://joidea.com/', + termsAndConditionUrl: 'https://joidea.com/', + privacyPolicyUrl: 'https://joidea.com/', + + // Theme Colors + primaryColor: '#000000', + linkColor: '#60829f', // 链接色 + successColor: '#52c41a', // æˆåŠŸè‰² + warningColor: '#d81920', // è¦å‘Šè‰² + errorColor: '#f5222d', // 错误色 +}; + +export type { DefaultSettings }; + +export default proSettings; diff --git a/config/proxy.ts b/config/proxy.ts new file mode 100644 index 0000000..3fa70dd --- /dev/null +++ b/config/proxy.ts @@ -0,0 +1,30 @@ +/** + * 在生产环境 ä»£ç†æ˜¯æ— 法生效的,所以这里没有生产环境的é…ç½® + * The agent cannot take effect in the production environment + * so there is no configuration of the production environment + * For details, please see + * https://pro.ant.design/docs/deploy + */ +export default { + dev: { + '/api/': { + target: 'https://preview.pro.ant.design', + changeOrigin: true, + pathRewrite: { '^': '' }, + }, + }, + test: { + '/api/': { + target: 'https://preview.pro.ant.design', + changeOrigin: true, + pathRewrite: { '^': '' }, + }, + }, + pre: { + '/api/': { + target: 'your pre url', + changeOrigin: true, + pathRewrite: { '^': '' }, + }, + }, +}; diff --git a/config/routes.ts b/config/routes.ts new file mode 100644 index 0000000..85e494b --- /dev/null +++ b/config/routes.ts @@ -0,0 +1,101 @@ +export default [ + { + path: '/', + component: '../layouts/BlankLayout', + routes: [ + { + name: '403', + path: '/403', + component: './403', + }, + { + name: '404', + path: '/404', + component: './404', + }, + { + name: '500', + path: '/500', + component: './500', + }, + { + path: '/', + component: '../layouts/AuthLayout', + routes: [ + { + path: '/user', + component: '../layouts/UserLayout', + routes: [ + { + name: 'login', + path: '/user/login', + component: './user/login', + }, + { + path: '/user', + redirect: './user/login', + }, + { + path: '/user/**', + redirect: '/404', + }, + ], + }, + { + path: '/od', + component: '../layouts/OdLayout', + authority: ['guest', 'admin', 'superAdmin'], + routes: [ + { + path: '/od/dashboard', + icon: 'home', + name: 'Dashboard', + authority: ['guest', 'admin', 'superAdmin'], + component: './od/dashboard', + }, + { + path: '/od/nnnn', + icon: 'home', + name: 'ADMIN', + authority: ['admin', 'superAdmin'], + component: './od/dashboard', + }, + { + path: '/od/mmmm', + icon: 'home', + name: 'SUPER ADMIN', + authority: ['superAdmin'], + component: './od/dashboard', + }, + { + path: '/od', + redirect: '/od/dashboard', + authority: ['guest', 'admin', 'superAdmin'], + }, + { + path: '/od/**', + redirect: '/404', + }, + ], + }, + { + path: '/', + redirect: '/od', + }, + { + path: '/**', + redirect: '/404', + }, + ], + }, + { + path: '/', + redirect: '/od', + }, + { + path: '/**', + redirect: '/404', + }, + ], + }, +]; diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..f87334d --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/package.json b/package.json index 8f003b7..3725b96 100644 --- a/package.json +++ b/package.json @@ -21,18 +21,24 @@ }, "dependencies": { "@ant-design/pro-layout": "^6.5.0", + "@fortawesome/fontawesome-svg-core": "^1.2.32", + "@fortawesome/free-solid-svg-icons": "^5.15.1", + "@fortawesome/react-fontawesome": "^0.1.14", "@umijs/preset-react": "1.x", "antd-mobile": "^2.3.4", "classnames": "2.2.6", "lodash": "^4.17.20", "moment": "^2.29.1", + "react-dev-inspector": "^1.1.4", "umi": "^3.3.3", "umi-request": "1.0.8" }, "devDependencies": { "@types/react": "^16.9.0", "@types/react-dom": "^16.9.0", + "@umijs/fabric": "^2.4.9", "@umijs/test": "^3.3.3", + "eslint": "^7.17.0", "lint-staged": "^10.0.7", "prettier": "^2.2.0", "react": "^16.12.0", diff --git a/public/CNAME b/public/CNAME new file mode 100644 index 0000000..30c2d4d --- /dev/null +++ b/public/CNAME @@ -0,0 +1 @@ +preview.pro.ant.design \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e2e93252988b5bed120ddeb168eb577bf0caa881 GIT binary patch literal 4286 zcmeHLO(?8k6#ga#Gs=ufvobTd=q@y~nOLdYlqL%nQY4WqC`)z}3y~cqOAAF4VkQd~ z^3$wrC}~D1l%!eMp!|gA&U5sN?~b{2>)yNg-s#Lc-+9k_p7Y<=XqqYcDJs(Vt%dBG z=F~Lpdy<kY?MITxmz6yG=6#_ThNfj_XTu;P21X4SHSoXGfZ1#YDJv`M!`YNhhWFB) zr}NWdvB2eWp`@e)`T6-N@vT-X+-^6Di;Iz$m-kL4Gcyx*yB%d^WhgH%M?pb>*pd!Y zozZT}udJ-#<m3d6jg832$atrpGKGbOSYKa9EEYp`bv1~obOeJztgf!&{QMjj7Z->| zqiAVq0sT@kAMMobbULxOw+F6{j*egO8CQ?TgTuo^+}_@zrlv;l$*-)e#PRVl?(Xgo zi9`?zg>ZFsh0DuJ)Ya9!von<qdi>7LPN@OfP9IfH_4tet&&I~a#O{TK1<3*LO-xJ( zZ*Fc5%v&m4#Z&mZySs8{XJ-fV^Yh@{p`ju8d_J)w6+U%`!(qAC+uJK~qg_o+O|QC` zTVg0Y{jSHqzP^^&G0t4^cwF+$`egj?@9$AtTMLuPB>7!lUKY8&zP?xd=H_PM(U;HS ztNi!(_oJes0<5X6tu4{BxVR{FO<TC8rl!DnI2;a)j*bd%X=zD%hcTI)oD|;7%*=0V zQ2DR$+uPfbd`}UgAJ5Ov;&)Y5mBixV;Q^<or$QqmBk=qEI669#xUh$qyPKOEBoYbn z;ccJjW6x(jep_4HD?WRH>)_x3UauFkv$I%RTSHe@7dAIHF+4mhc?|>t(!XbCXVQZk z8yje7Xh2R*&WCwdw&?N4$H!4$Uyq)i9_;V$3;y)<G;(uuW$tj!@Gj?+npNxro6UyO z(o)G2^Fp4&NVh9|RsW3l)6<jSK0ZETdwW}ar#{M(sPFA>^-LKhmkv{Z#(CP^-7Wn# zI5-H>z`y`nTU%u=f7Tbh-mg5fPT0G8`Wx6^vD1(>-r0;AFlyjWYC!!D@UQlt)%}4^ literal 0 HcmV?d00001 diff --git a/public/home_bg.png b/public/home_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..7c92a4bef248fd9a6cba50e72c5a641ee4cdca2f GIT binary patch literal 203330 zcmZUb2{@Ghzy4LCg;Yeg5oM6w45FcBM3^Bh_DC{JwuqXMtt=DCWH)0=7*s-3LUzV7 zV;kABjj?3QEY>XjpT58I`<?$e=jytqAzfXbp67kP@7H~QL|rp8;y)yIh>MGh-}tJ* zbuO;Gzqq)#xen|FKBG=Iy#@Tn?Rp7$iHoZge|XzzKk)G>=d0I|TwDQQF0RmUF0S9e zr$T>narvupan0Z1;?hm!;u3j~UTFaX{($GMsgVKKpTECef6Gq*zLLw>;L=UZ@M6Y- zFGKf(;m)qW6V&6ob~0Bl&Ek{~Hbvx~nV+dRo8&w4?n%7gvijb@lr(`10m<-Ax$#q* zbTsxFS084o`cE1xGmLx|hPZbdlp!z?#@Q3ds~@`D3fU7lJFzpdnmlbcD~aKyul7HC zJn>^4vb%~{2xPqW@75hJ?>^_25%Nv*2(e$!ZlJuo`~#Y<QyrqUROW+s-EtdtWjJ`_ zNkOo*tuid^2l?;I)=CZVI=;nOXH{Py4*XbVU_+|2(8F5cDt@<rs`)jB&554r!t-^~ zEw)waar<E)DuV|WdE`9%bxy4*7kd-A$;=M?T~sw;XHCWlGPNICGV5n&4*m{VpZZiL zj29M=oAl8WP{dqimn4(*u-0U_s6f(&k0Dk-mYI2z<k}kM^S*TRLr|AWO-5v@n%>;@ zIcjxeDt!;4s~VLuV8>`d&uBKmhyzgC5rGl+N7!0Dq7M<Pw*mZ(E_(eF(q<4W%X48G z3VC^Y#U*&7dy3UTE{prkrQ^sH8=(eL$B4BnF})d2Vh^TF!)14cYYmfQRS!Rw(}z?j zO*knCJi`gHDxQ(Q!rsp~f$(DZDoz3W8l~1!H8w`!9^*1^%KARuZ7b0WN7RdXi#Uyu zk?-%1Rf)R1N86rUS8ojS(Pp$lIl)ZKXNG>{5p@QHag-Cld=hd*oJd07hEZR$H6)JL z1{?<!w?1ZpBfoV&YAelA#5g5~3_l7S3>7e9j?P(Wq=-L8Eup*?W>0J-a&VZ>HWr_+ zC1G!3TUpHMp=tSM=Vu{$&#hE5Mw&`^ZFV(_yTt|dwD?aSL8Op2E-^^7-iloG*c0OV zQAn(2F+WvLU#)GF@2k3|U&S$6%<qPgIbM<;X4|0V=l+Vc&1XUWyUZ`YKIZ4W=rs2Y ztWK(pZlqWRrIAm-f;ZtCP3^9G1Z1ln+nld}Ja%P6q^)wD4EIbYbF;W1AMVNjsg!+5 z<I{t@G$pPdnbE8%r+Lk2_Qwb!l!($DsXwQtBI{){(V*oYw1PAzQ{onsdP=7-*IRK) zb4v_1gBc-=KXmD(rpxVu|2RR&lTI=c?c-Xu=!*oCFURq(?9qJ;AL(V9>YoUhLpa$5 zW}hsjYUD9@SuV-#K^x2Cfv767XMa1AOu}e0$opt&G=x<?xjc=K3|*;f@<Nn)p$4fV zSvR!>-S2!_y8M$*nJETRWYSFnQzVRZ8TI!15>2?b+xleEFXBGrU{L#zQ*<TuI9XzY zM-wAIZJ~cK<b~1Ioi$O|`)T#I)68QDoDyEVZ-<Ps>0)`}%v@iC7L<VtbK^<%Laji1 ziYRVA0WFFIH2m~?MBijnzUWSG?xCASric1xST{DE^W@}&NFME7-y(v>JDHEd_IAY2 z|1x&-NMT!N08h)cG*|O>kvlWLO0nDQI?axbO|;BYw7jU5YL1@W5h#TUWqT?Sv)jj6 zji?7|JrLTt{%X0Clc<1iZ4ep;9RRbNL5V4w#c`i==zTRB<KOROD&iFITOQPbp|A=G zq%<^rh<G7C&+SHV7Si~fx|CVtxc<$TFBY&@c?n8WK8~QSmc~P%ex}2>o$UFhV3u0e zmwshR)J~<kY(M1m1!ZUG9{z7oizizAnNHfIws8Yt2ow`Jn%ZJYTVUnx72Yf6gN~Lx zMY_1b2g^(~N1l)i(eImq%Leb5%)D#S`=N0EbC`luWHRB3+8mc|DDDJoFfvEASmFLA zCyQKGo;q03*H(l`PB{WztE>0B{l*e}zn8QRnWzVUkGLs9d5>718|?d7#20kbk*IrG zMK#Va43#@}7F66dfGF4+i??KtyPK`5eJhF0DoT2Knp?$kW#ka(3%xWQcN*iI5Z>@4 zra#58wGjjZwZh|ZBcTn!njK}VD_I_HmJaVTMOBbTz1<{`UCyRrSaiUvr;$|kmb}7= z)${jO)l+6lL$w86DnBN{t*SK?rW&to>_q5GT_A@ma=tWKtG#tSe%w|w+e=npV8Z7# zC>n!c)$lB9PpVTJuY){5pC@}JFAW!cbw`^Fp0;=bzOa!x)`RWMM0z7~@P)D(VqRTd zB&CTS^2!-6&tP-_R7rBf-#OsQY|ky~6Jp#48T1dcs#j)I##&(9pPy$gPbiu^HV?La zy8t<qKLytdcIOrRz$iPMDhlhHsh@E=fnRHz5yV_&S--&X;q5rrH_ulllqcLsnKByX zOW21~H}pQ~hB^9R5#5U%w%3MWiPyoNgiP(=b5QZAH#aB^Bwx^lC{>#RKS)HSD?`!5 zVU1q3jGhxaLK>{#wh=5|Ho?eGs&{P(vY2#O!&y)Y>sl7s7WSS&{<t?eO|FdXcFp0L zRYQnm3YRu3FUr`p#f5Uy4fuZ>Y(v|(l#EnYO?TIjk9ewN91}_Ip40J9<D^dcoRCUp z-iC4cLqwz%H;a$VyrT8W21qm>(pQ>n4BUMLK8Dc2zrYTLkw>wKOXCiQCmg#PS1~tn zsTv>}YzkBK`nB`#lb_>_Ili)|Z`Kt%3l31N&rS@y1)Fs}Ja|G)6KXLUQ?%Fcyt=Gi zMnycC#*y#%@ECNrpChFO3G%P85*ixmA4)-muQjN^C=Amj)8t8m7tfTZ=@^hH2AIAn zzze%H@i&`j%t%R;la5ItC1)g0%8B1?Lt!BdXd@pIc~~`xuOm$~Uli>Ypp3R2<CFBd ziqrc3?XAO^r8e`4(wHpC_FhlQvgp}|W<eB3+GgYn=6ol~PjMgQi_)jf@M-ZEm_OQB z7%yH6KMi|7A>GXAuNK=Ck7(z*UFT;L97BjQDZ}03*V8IZC0OV|VpWxdFmE+Z=0cWD z6Oy$dw~4<J(xRGw>e=OolS;UWuN=_n31r(q*W6Z$zoR!5CotVLe)Z^XOU%c}+UesS zrua+u8@wl{Jyk&ioRZT5a|U-h83gRnl-J6ba|&G{r;%+BW#}oAN%rY)^Vv7G;V0^q z{dJlncyhc@BSQwF5Dy}@*wyyF&zmFQq3oS4%<iECEsH(*Id|_GFMb6kPsKCUApT#d z8k9HH(Z^8dEM<Lp<4xnQ>d8AMv8t&_Tvl{IcO#oH;-JS<J}Lt5u&Lyn7RG(hEzsv_ zpYy>hR<!SjpMWbBr!mQ?MzVD)ZH9wH(uaM-Kc>zrV&t23ecc8b$Q4milBjImx)HpW z(|xVyEou5I%mHU4CQTdq{Msw*<HFKL7t=R{oT9ved<^;WPV;!*Y=W<-eY>-+7D-sZ zQQsz%D>C@NVkZZQZT>iwbd6yD)?o^LR~vjq_jEhB@M!9HvDQ((hi>n9!O5B02#Dpv znPkg*uJBovuC5pOD*2EiW@>TgdNe=J7q-=ohgF>nsCHXA@a}Y3DDL=J@l>gdfHA1I z+MM-@ffY?)-j?$+KWn}~nB=7)AUxA;lg7QYrl4Vg_*A15Xd|KUR?zUrOmwy0F>^td z4sJ0jUk0xOa_1DVXi}g4M9T(ZpXhJFQo1MUr|hF^sp*#wy-40rcTpGMU`C?W=TiP$ z2B|hMG(akK3@sQ5E4yhG)nN+WPp(Gn=2eOg>$XLvw*Ab#GHZc*bg$RUa8>~eS(p1x zJwwc*o*B8UZyzxrIB0TwXO>MrrGIl;dvqt=^ZCL2EZ;|&(U<qs`VTKxPo0#X23EO& zStlO+EB2S=wjAwm-LRBA5I&7n5o2|@l;F}<=pYwnWp3&NEpY{dg>_D=BAtaxGBe4l zNCv~wyo-?neh1c7SG3Q(5VkT^>@pq{G!R1X^bgznvS=Q3cA`{QKyCuq!fZfL&|P4n z{v(P;?4z9RHXoTivbKi$glU^{L}IFT;ME)#>oH27?hsSV6N?g4MZWjfIE#+vpul^O zeY)t3m%2F-rHAk?z{-(M#d#qqe=@hT#6sWVHJoNtGr|Q@roBZhmSreE7Vcr+H!*5p znJ)o#%EeIrrG<&XtOqCY!rt%gDhIoT_II7r16!{^b-asQr|w4bbTI=+J>yLQ#LPIa z$Z2YKCTX19r)N9>nd}uZMO<GUwgGjuxpurW-wiCFN~!Sfrn(?DgjRpu-PMwdQOVO$ zw){ewaoR8Nnf|lGJ$fJs7A&j^zgwbP%rF1Zqxbk;&bbK-ZRZ0|8&mgFB!;6<Ve(JF zW9<c0o||xpJ+YU{lX1Ida60|c?Ck87uiMk#TP?QNuiwxMR2Ay5@0$e%=VynBk3{l! zm{+5-4zOZIX?d?bBmP`ap*snH1g4x6x~4QbF!WDm=S!=Ux>`h5dvn`eS~d-<pguUQ z+r4fn;9uR~hm<qCv5z5NH&5jjb=q;P>zr+;?8YA4d?6r0*FOH+e&FK@|64-y_;twv z{g8GAI$aFr)f6_B<fcE8zAny6opHJSd5W$C12ro?a-Xw(=Hzf}bvRxs5OHSHsxUpq zN<$e6Op(`A9)>k!hWg4k%-FDTX$T*gx9`swE|;)1*x!dp0ngbUiqdtburM+;b^1YC z(oFx;PLE7u3%431P$0+7HXQ%PwU#b_H9BQKU$W|*2{(|3zGU_Jgp{>pch0NHQegp6 zkZN<z6k6x=i&5i#lgK3T61hzi!$k3FHcDueQjx2U_^XF1=**>2Ei`Qf#;%d3@)RtX zt@I@yX5N0v{G6uHH%horBJ<>M%@!z0zrTL!VO4UjPt*=qfRcbz=jr#8KB59-4j{ZV zrme2p$B)nCwatyUmOfU$-E@&MDMCzjdttoBexhY6MJKz1q4&Kq7txgh;>6Z$$$LS5 za?j?<C14%LBz0x;RTk?Xv$*=G_Te5o4S#t3A){+fHMkX}NXgBT=K?=CUzD$?O~X`X zoDSmUrlh~$`6Mkcz_5_K+m1nSt|gH7SKq%O_C?b}Hs@_9BVeiXP?`lE$^Le8kH9;z zJC&k^duxpB2+4COnI6h{y{^qWNv8Q*dpaAtu6;>QzOYGI@jSB;?U9_nLpnX$jxDGU zYh&DX*zPJMc+1U}hT|jzLZX0|!VC8`mrpnxQM{?*j7>QX>qxUOA%-^X>Sk&~%pjER zzH;XEwvuXs4>2y1G!Xyy`JhMox!t&3bRdWhY088pvo;_6VAHy$1KxHO=6@YQE7&{9 zmDklkO=WMirg*vBnX%-FKQUz7@mO^E4;Vi?VKGezymte19R_O3i6Pjuyrb7z9N_0B zT+CrFkH(~pAY=?x<uggbZ`>x_)CG}R_;V-}BEyMZ+c&g=`Rq)g>>N{gwv3+{(v?k& zknIj%X%Cm{S)x2n8X2(TWa&aOLIfZ7h)z==H02abTFT0=4n_dTl6fsjq$s*VPGA8e z&!EFGo8oa-*88W2V&Z?M-iyBTLaIf?tJkZrLm{~X>cxcebC8MZr*+GXMgdRok1|q+ z%h2Wt=KhAZPF2&u9I~%ZsX;x4I5Mj6X%?R?TRdi~cF*h2mJkK1nA-1N*O_QP{f6mA zHi)w-PU9b9tvgQ3!+v$<v^Rc+WfE{_%w@m5JryaH<_n{>UpuH4bbS~Q#jvX?3>lpV zBeWGQG#Ly=xleu{TA%CfGpH23<?o*QMt}iPeG_4uT+~t8HAfwb{d3k#<y)G9l#iE@ z_Hm^tLAr0rLHyj{$rm`)3t>jxKV(vv4`e_b1uTzu-jwXwPqb=3H^p92Cl|5IQd_yU zyr^^KQt*YT3{%(EJhX?_DRJU>fxm{HIfd`jkH}@;`WnUaSzRrTGFsrk6ICIF^%KcI zg-haXYql+5ga4LBJ5MfN=Bueo?!B3qTIsAB*(7E_C}{O|+LwH@>F)ugfhBZ0y5%*@ z2BxzHRqsKR$3!tg$p;Nr(d1PGzXi88pkY5_Vr~O|UlF9^_@w!GO(6g76pga0x<=30 zw6p0set{&UEmJh*v%k1DeWBV4o2NdJ2>aF8xF0hTNp=R*QTtm=8>=@)S@9Fr9<<Z_ zywm+TJWT~n+DC&&bvjoOQVwAd8BzX_ND<rE^FKHl7RXmr&Qd>%eroq}RaP0lI(_9v zXM3UiVzZnW(JLZ3&!tWMTD$Y`;*Jp}wf=POHq#x0U>^v$STY|m7E7jLU~<JL?(!BH zp7%$KfgT40fc~iQJ&bV}Z2F?n$iQ_|t7)9@q$u0;#Fc8Nil|2rlWniN!hm_ZLhb&( z>FrBdSEfkpxj`K~i2U#?mUX*x$B!R0!;*Il6&2VI6Jl*l7f$Ev0=KHBDe8Qt%I$m6 zF@YK#Wo`tYXW1h1V#<wdRHUh(dq$w^o-&BwS7>R!@%3JzSt?>LvB3ZOC#B})FyRw| zi$k*3$py!Q9h5I#+4W6+Gpb~I-rKSvHgJO-nKt+6Re*@oSSCsvG{C}W{e3{ftOf)Q zEtkPGKt~uplK2?hU5DFWTAO1e9F>Bv?>X=N!8ILUC8x)qNnb_e)J6@Kp_wr<MC|AC z{JF;_#HfCV5AO4;k}2~mtD7F!)y^*5aA48)xMaVUl|@V7_bPFg_El1mP=OtaQ}T@W z$Agt=&E|I?Pj+0jScu1&z02*5_cM3jzGdFZaZw@*GRP&O?}qM-P}LL@zI!kw1|X$L z##-XtrZ*P5y{xBV+_Zi!9<~_9md87?Wk!R%jm0_Rk*!6I>z7L@dG@0pV+2}oUsj)` zdR)5x#{7vS{s-$?7%rmvW0aFBrvK190%i#aCqS~SI~kY9L|F6F^3o~lD#(#+>Kl$k zEmXmmV1a;Wp~{{bYC-kH*WDzR)L-r6mvnsdmb7)_-X6JGyc#V)viJANAVC^+<oWx* zhVo_jrK~ft2OVobA*TL!w-TTEKL!a*TiD<*In*aoV<PO-8Q|a45^$vhLMF$!b%`$o z6p7t`Ia!J)MNRfk%i7{b3p81L!{V=WQWN*XHdBd!jH)94$|&BGhZeS;*A{V+v!F|L zy;t>0n3XYxdbKXK6Gy3ZzEVRE)X#ZfqMsfr@PqkK5|L_G;1~Is!Sx>nO*qU-eNbXG zZE^PDh3DkUAT~^x-G9Znhw4^)CM$6cTO0{~dpP-0T~9nILQWf9D=|#FD5#8%d<*vV zCT8Y(^1Mgb`MKqrU(NvWLDE!@&p(1hd^^wKwY=wDA2P1*PZvV5wRZ(;2g-Vsa=J;d zz;pPLXn^_j&9dY{M<$c(t8QZ_yLnD)t6pz0xcDqz51BKQVjP;&%r}P)IA1PK_T?Cw z3oiV9FJ&=3m73<NTRt8Kfd@Fe^2#ye9*?rG`nsLoc&$i;U3>(*wKMWZ7MrE?r{ozh zaOr{Dp2>d-tf661Ro{93&RGx6nr-OLE=-~;M>jE%Wu1Z}!aApmj@>(kKkL1Evcv^( zY55Y_4{~3EiSc;DINY=M$=kibh7rh9evn`4ODHiS6#nAVX{$#bgThq=KR!g|;_&2x zfch3kE~~VrP2Dk$8n8<;le_kc!(;rXM+t-giEt)E%&39qPZv+czGu+e0V^-PY7`~6 zvmc{*2tOaV>i7|xteukx-4nGlElzBs32CBhdpViP#pxanl>|#LHKy`TvNn7j3J7V` z{G%%cd|4LZ_J;ITwQ=A4>sCL8{7!`&*F!#LJq7<;V^`y^)hRLHZz@jd&|bGNY{x=) z@B>qSB{mmSjQf#^Hxd;u6BpnS5L0aoEW8mFkm5FvcqaAD^o&31dRG&fB#$CV>Ia(9 z_?j|-_cJ<ytqmdAg{hsQ&7cmKUp>&A@ESE)<kjMP+>UF+QEK|Z%7redT@_WeGXCq& z7~f_>+oX4YhdAxQnGb3U82c^&K=mH1b;ph*;QV2UtOwT}c3Y-l_Bh^N-8Knh!#9Zh z$nL9|prisBj7L|p<nTW(6k#ViNdrx5tkkP@BaVPANyv5eo5v6;$hm@4Yl#F#6`>|u za>KMs{!>F>tz4QHshXrKW!5%+^Rb@{|Nd}8&13i{5_m;SdPn1ZV2&2BD$e823jAPW zP@p5zg}DPqo0^=Fv9q?KGJ8nMyuJNUe@O#hLR-;}kRGzHd*##%(P6!|<D8#fq$oeg z+qVO1w-48t#!7ayfB3?<(AY70oBqM?tB))0w&~ytfv@JO-YsJl^%sW%G3R+mAbj$3 zIcj5yx$vpbY~H<9joZ&)GdC6&+ZT|V28Fp={nkYZQ@sYgF1Ce#f)-G3<`=<7_LF`) zp5+A>C0NKm7=aEkO$7@H+Zo)@m!H$>_wJ~UH@)H&f25!Fvep1Yv7&Ezs$I?9H-7v! zx8=u<6vsL_OMN?*zGkry(>e~PS#9Zk=3VR>o%SXBC02<(XYgk0!_tq0_IIlYrHkHt z?Sjn-!Heig<S=97_zCmM?0n;!ntG9@2?efVyu<?dc|XHQ)%jBO>>qA`@^0VXy$oPn zk!9wz6;s>$=Gd9X$}h0?^>PlK`<HM1%aiKAB70&+vT%}rZE4f=*NW~_)Q%}fk?FnW zMF}3y2{C3C6pEk!T{tE2umoN;M+W2P_NRBHdMi;^a2dr{{7K?5sp@+ESbQZRYIlp1 zeKv&0`_bcm9q^+5^djs^L|)*z*sPSb!+FM#R5i>Weuq^vRl1Wh-WYUA;DF^f+7DKR zC_aDs7VXpf=Fgif_4zsMwr`($M?ClO>Y4T<i;bo6#^znlb_BY*j@nBAALT`fxZQYh z<Ne-PEohIIVbuC3m1|qyj|4tSzTHe*@Q$X)jec!7r2mfb_0n}tnlCLq2`AB&nW$Pv z8Fl7tOh0u`#!pHAo!sv*u!9$nXI>k0w91viUL<F?JND`pW)jBm<AR7j-ObLuC|A+| zW1YKk6ahEBp+qErfJ<^l8SIDBaQJDW1RF(kn6J+zzcK%$6d}3E?Agw2HveKWe>)ue zgxCxN7S$n)bv>Nl;r0c!*)k=pzBV2W(tu?qTYXW59<k=>vi?CV%`eP|N3E<P7=a^t zqWin#-w+0H_tfEGu0lNsU~vSw-Q7b~?Mgd#T=dGt1l8iP&CP3R#Yumv8ue$=zHIS+ zubSR>*H<xtugcWT_TQ%Ukd0oz)M>1;is(yj`faQ=wQ(l!?NI0krzU0NTiiw#(BAqp zAZ|;oA%kUXS$*F{Q9A-C&iMRCjh8-kIbM-hI-jG$!UJZ!i*!}$Lj-is<9Z|uA`dEV zoI0P1I&r2@_$Oc{$#8!Co=)X-@bA9}R}}lcweh+`65gW=(BERZkFdZ&EPvek+kMd| z9W|;?I)Zi7MycJYgmeBawN@HEc?aDVrXISv1?auj<1rCd^L8Un)ddJYD6RZ_?{qH} zdNnKjLX_Iigqc)t&EBWm)cZys`{Y(JBhPU%pc~c2^;<6iPgRo0n}#dGz@l-tF$L5x zi<FG%6IGx5l<U=s5&lD9^B;UXQi6|lG~XLmMU;Afj7uS*h$yhs4M@9NQ{J3<k?UA5 zL0a8Afayj;g;jVJnkJuE{1fm8+dJB5Zt5RoNKf1ry{AZ**jD~>ZH~{=Xg_G4)%Mx} zE%#MRKmoKq2`H~Q#aV9*dL=78UtGkZuIUF~>yw21(%Pw@+{2&|L}o_%a3NgWZG4Ke z)Sbyg{5b`^dXH4oX083uD!h(=q5Bu=kbhT;w-q+%X5OR6l2MfP&QGZV;vDT7X=Xq& z(M5^a+=$~Gc!#lXfd_%ySr3jmv}M>eGe|I{X&akM)uD8B?ddyA$py4n0;;^-SWR*m zX|FR>A+3i$U+yS%q$BklW~S#VZcT5vn{N(lZ~(~MGRA&JY<CoYRlNO%tp0wYQAR&d zMk;>0h*BJGsa&V^-(nj8`asUnZAt`S0sZROacU|6U`7&gCe^wh4SuIyl}MO9ZKb8{ z(cyd}F?#?}B?`(|_jt;$j=!XrBP<q!C*X~5?HQ2#FPi)0V2w=LPKT;DI>JOo<jBn6 z-yNPaNxK0Ve>C&I>}zdcev*pC*BIfm2~##>G3DpJu~CMmS{-TFyxG!R!sCFk1SDix z+oHGc+8*Rh9ntZ$_og?rALgF3Ghelm;ux>J$yhQSx?1V0-v@kqyQHM6?#YWc=T>+* zm?I!hPzM%xD5J??m_&88DppD27lff!m(tAwro+KMNM=rh_K`nJ_b7Y_Dbhwy)zqo$ z+%)GK0Lt1MmBq?&1M6z_^ta8P_nuku2>7hDo$`eE%bU7vrveYJJEN!iJ@mGQpx<m7 zx>LC6aXi44nyS9*xW3NWNLytWg6F{wUV^a2R=Do5R1P3!{j6&(jmFr&-gPMWjKJm6 zs$)|5Q+c}JD+gYR2}{hO3S?5jdm&%>UZ$hR_q|Mrs<UX}Q}%e10?s@@N#lPmGgu9E zAtzRD=eZ{S8hJ=r=f2U2!%yTqhf&W^Qbdz5BXR#7oxTGS%X1=l*BN>a_Uv4eCZgRs zfr0hc8lrY5hn>^IOQf}Wfe-Bkh1VsRKZ)*iC%=cq9Ul4ERPCb;S4I9uJ0;c0fz^}u zaH9z8cHFZ+Uy+-E8TUTdpHfJv&x4Vio$mvoXu|#jcYfmPeyLs9ga3N7@+&Oa(%Nbo zn7H=3a1|tLAN-KuONGfdiIeC`gyL$g_h<}W4{0G^62BLrip+&Sam$!esMF9}29fue z;?~+@e->>PpPMOG2y7gmfwL^ZzG|1wri%zRQXOXm6|?rk5}CoW_!HQx>{l~E(K!FW z-~A8IX1=gJGP%m7H(wPC33(Wp-w!F}`UXq^X<*b^L(J4D`8y!T%<bN$_lP+2t)eui zrJ-fADsFA$gy{x*VZ)s&@xrmXF=afi*5<+%_%Y-iHY<2jb&4eeQ(@5e0_={li9IKY zf3d01CXzd++iDlzd;_Oty6bPD!aS+N7&;0O&2XdeS#aO*Uc2dYswIWhvJ!CdF{Idj zLfwC6s4|`>)C=WY7Xa|wu9B@ySe$o7>rJ6#Hhm?qCQM=IbOsCU7=aUo*}@j7&hbXw z`yy^F`{@8Q7h?<DH%E0peIB0qx*x5HpRWGsVxjam0G)I`QF8tD&i#x)e(2>R+m%q( z-lZ>ayWCm+6fmk6G|pM69zTa6p(WqB&YLMgzfMZdr%7<)jJ2HhOWo&aE4FAafNUv^ zFi;uH4c7FJZ~ZT^{H{b;!op4nq_JoQdu_{O3X&;o1QecBn`8dOBnAD|4OIcP(57v% ztSJUpAYIw{Q5A$?Cv#4XVw7#z?DC+l4ky4@>qR$u)8%(+38Ulw75zY{lo@3_#)Yq; zT90}cv_8%90MZpF{^jpKq~4mLZP?YScz<jw6LS`HpL2)PU%5Zmz)-NeNvh@vaaaLu z*tH*}hdhIcL_k;pk!#Sn2~iDd(}L*mU&;K1I5N_WCMljDq67hnXO}APE(2Rd??~Z) zzOX5N5+0MS_We*nEli-(k-~6gB{OF1{}v1$g5I%HCvLgNKToE2$zgm@lK}qoBE9^g zfxOoXjPJIgrgre@gf(dQHCG@%2LPHAajxcFVl-(1e?iSth$Is2qT+hvOZbVvl8`6K zwKmCfxrO<!$iAT12|>@X#r<`^*@yqeW&5z!?eBbFEn)3jx2pA9CbL1n%#Uq-GGt+# z3^Le3@|c^J<?!CSMU!t?v=CYxR}_s;lan0Iove!kg<1Uh5se1l@2ZhgMMlhz?%RAB zt{-9}C0MiVzmfL6=3b$l2S|G|`#D)?*_|1D8bqsp-;oSUk09q@1|tAMXsG9}j+djK zsM74VCv1pLSU}_R|9a8EX#+2Wvr~eU3lysEebT)}Y2uNR_DL7$cJIpT1;Sj5K@Mjs zZ?2r+Pyc;P!{2eRfx>9j*@U!SYtY=Z^V&lbwLKaE2=Xo1uw0rskdrwp1Ivy>G&!Ie zZL1%S`vmKi8({h|E{mwG7^4QwIIy)854V;^z;81XXnxMV<t0%IC}Ogo+ZT)R+_z~_ z;dRR^FvS9GMQ#<VU9a15-$M4UYwuZJR!YC@ssEng?FT;<a>}v+t4jGFkoVP8wgx_p z{ooKt*1Y{trTkT%XLH?VY?F=UCvd?LA+5#{#6^Z{qzgg<Mgs!F*6tNIAPiNb!HD#o zh2ArK$j6mwoAW4P+vHBL-rS+!$#I;(iw$N}U_tx%>w*lfqT#0+pvM!J2FM<r|DAUB zP5Ed7+ue1TS37)<0QRrQG@0H~HFzPKte7Bw@n=iF@prO8W;Wo^;P^$9#Ie1NshLK& zR0}=9Pi8GI2v+8_k{I;egwOGrkK?DwXuQq1C)rW3Fr3EJHoX-8)6_)Xto-NTbx`d8 zhP}1h$3Zhp+qvUO9d6kg3N<gtB6+!m`+*R_11|WaEdL2jKE+8ipj5jmYOCC?G(O5! zZpaIjl{w!rhwjAM>fR%lg$1FL+wbv9-Df)O(|7x-QQ&D)L6)<*9wZIws?VVUDFsjw zVquQrHFyBN#0T;PCay#KjY)(<1UU)lV)#rM@q0_`{%BT*jFy+Qv5KpDPh}juc>o4V z6RV67H8WdcN~@#xaiIJFB(VFTC*%C61BQf~-*_k`PW(m5zU^tKBkt%fC|Cn&-@nPc zv`r28dP@*<i+@=O^p^eR*0C;1SOvFd{eNjC73iMW!0Z!vH$$VGFCr78W|E*?Z(Qu{ zVVhp=lMy^ev7hJiqBhENVnl5R4OEc{=2bv3#c*MYGgNuB(w!>*L`yMZxee8kV6yQe zFk3<{x|N1#4%~EN{tN9=!y0m^Kv4G<=FtH}uN!PpkRsb}K;~iaCGd>wrVo(-KB;}1 z=+;r6ssh<8&;MCnh>oxP6vdr-W%dd(!TIId0s%uLoT+2?`T^O_Zs3=oy<^iYDT2RH z4cBX$uKS(cMXkvb(jr~{3Z@dMW}6Rm$@_(ULt_+%LK;+_cyYGy9sAB_GZdy9s~@sh z_pY!;>87E5;&m7@1%2fZ^K}}14%>K-(@Q;<xmT%|6WKPCmxjJ~NX@v*z10L9z0V9o ztb8~3uvTW=JFMO?(02EuWC-o%w^TFY=2iVtwoM)U;Bt{x=suwM^;#2cUOoQGd^}QX z2H4v3C)CLd69<8A@t^@i;NH|w-wiU2zRY<;{`K9X`v@;7*^xMz#23??u$)9ma3ub! zPKy#YuknM-=M|!TZR+MG2pz2aUb4jQq-4!@)Mnah*~eAi4;=j+wqq;f(tj{7hf|`1 zKY^(Y$K}CJZXX4~TSWTroQe;j0g<R|A>@Xk8V6<mMNSw3|6taaCdsc2MS*K{Us8F> zb)S@<GsZpAe&}Xh-J#R<%XL-<oF3e6qjMtS+s1={nkHH<TU&8Vd+2=7br6c_#saEs zXYj9ix!*bbT*8dRkZJ5YZ0m+b4+q<D-G`|KO^qts573hlgAE^>%uF-NuuJ7l&s-ba z+>ZNB^knnD&z%E|;LO>H`fSM)ZnQ;FU)%d`MfJ;!p_50JY9Cnrp4oKxsUrMns<CGq z`I0(aDg3>NQB*>J{?D9L6DZfcv(fm$0rbqQ-dR-Yg-1&i_cIUW=Ymfe2P4@RO^AuM zVQtivy^#yYO}T@MUBlDnc2bAS<}RKdLC^?u`cWwBghv(&Q?n79kynD#;SQFj4##S@ zjia+J%kH9hvQ7d>gdBt&Ap%Kh-^BOTu!b!q0Qxp!?8!M2A}USr{SG=OJgH$V;ySgr zVf}u#=+B+zDd5>6`#b$Ks8|{AXiUO_XkPxDu|LF9iMv05_^ZqMh{QD2BjeALjo}&J zj@06S$L{*+F|`W&dlYz)>)IG7X8VrA%L`h^pPEwvRD<GR<N;8FDnK9|JkQ>7Nnm4j zyGyc-bW;Z}0@3J(B}&4}Edb=N)mB7tuZS`?jVnX<Q4PRL@_NNv7}{!9rJ|=$&0iI@ zdv^=4@Yyap>9sb(?o{sZgQlPRdCRr42AdAJM%O&k6$JJ@>vn)nC37kSmpQ+Ij3fYN zpCn}`cYfIU^}RhDBqCBIE!Fr4>^3nRp7#9N&J$T+jfEagg+jjt4lnN${08k&x+9bL zmBzb2h2%vFc<cp6uH%pc^p22+`}0J_bGyIi3spd{H~Xa>Qsx$$wk`vu7NzO>86Y+7 zpQI-O1sAn>(hDq%zqlg#HE0<+a6GBgpzC5QJNC2aIphI}(bP8$q=9|G==&|zgf+c- zz6fM7Z=gEod6=tPT75?Q(^XVhf>DEq#iQE;u0s0H#xF-6-_`P7dg&F_g7%l`S(B=W zO<DUF=JjreN0Loh)~)bN@(tjQ#`~SE0{UPn?T(YENeie4Jcq5Jhd1b~9)MJOwd|Se z&h+K9^of2*L)-RdOWsb&^@?0Y#;;UU6+f;QPweW3eRv{r*oYG`n!K=?T~S94MiskO z6&mK}V8d?#3vRYP-iY<!Xz^6_QaeKls4e7Z3u|4eE^bVCX__9!dr7xkdbs;%pdvrg zYlIqJm|GZuAxR%uLXA*gO%Ph*4onPY@3_fGGdsFhUfa}_`k@B9153O}lctOMHoL&K z`H0?lV&j3rE>EPRLTOQ9{X73|lmAP11@*W%Sio`a1;xXdS1b2n<R_%t4xdo7qxgNs z8_z0B31Yz|(vf{)F;${QzmRIAS&OffGdWR*_-#=>G94%1W@0~?HMmZ-2UfSPD_$S^ zu+5g=O}0!A-C+mXI<!gJkQ<Y*1yuMv{<!&X)mmNwBldPmQ|p^nmz%VN<`+pZB9NDI z89Zl>RpiZKV<}KTG7>vrQEouDFpdzphW<j^@D2I+g!a%ZV5}{Nxf}b<&AsMKxwg_I zz(zdkaNh${+s4b|@5}zuvblddj_l4ZU?cRe;|Cf&yT~~)FNa?8hT$ZN^WUnCsZRLF z3b<p_h1JA4HwPDlOdn}yzPftNAv%O#-OIx*I--t3Ge8mP^FpF!msrqmxK!Znva^u6 zpaOL_L#V#kRFER+SQ)T=MK1M4r@U1<K|iV1Sm2>dsg>s~gzWZ*X&>`{+fDmMQ{%;3 z7-W6G9?)4%Dg!9_AS47gKddG%Lc56kBe@4Mk3YSV{S>IB2tGx(#PsVb9Dh2VLTYi# z2-LSbkZq@ylb*dZQJmqib|EgjYjU79>ayN0&t-@^LT!X}6aUw8P9GBjJ)X6gcCrI? zQ5v%tr78ksmWC5PGa)h7Sf@YKPwPq`jEYzX+mc2NeF>QNQJ*v{VlsPaP-SP3IVfj+ zLJw(<>J9#UQ5Bi;yy1tf%)|cx+x=N%d7EiNRrkCt`x^E<5v;S)cht84`a+=Av(O4K zen_aQ*JK`!RkM>*UpwjpGHYw(sV44KqH!XJ@;cZ}*~phe7P=48GmTyxai|m}Uk@dl z(hB~_UcS>09V!V98^5|&qIpjldS-i5-7#YMOWdidB!!jd%8ar<VsPChk@AkXFX!Wr z&;=FKi!fP4t3w#rE8ceZRl|?-Zc_R|;=`%Hc9Q;#EP*!y+R7`vLR~7i?avs4n7d%z zNyOk*GPg9y{mn7gR~;8uLLG?(Zakz=f~zSA$il?YZjqC1<695k6Jk`6$b>#>>waVH zhuOVF4uk0rW~{gGO4Mvi&3M1w^;r6z67o-Q3fR$oSRgpv`D;f{V1Nd$IQzlT<x>Ww z>L2Sv^Jb?pnVGW%&20&-qLZjMbJ(ScZZG@l+^20+0~#kY48GOV1eAqKqgq`u;|^K7 zYn_YIt~&2UJXmF}bKcy-NkPi23$WCKF}0%2eRG-fl9=!3zy00j!B}p+Q`W0y-ed;q zFVjSJd;~0Mo~)}Z{yVVzHab+dCSflqU_TwTvrZmFw@u|8vOb)7FgGn~9tHDp+oy;Q zs3{9A^lCYVd-N_D+FU70JTS7YpD9~KC}#ZraouL@@V8Kbtj_V=AlsTd5bdK+uGesh za0)7)?w%5uo%lDwJt2@XRT=|a>@uu3+iy<8)8^DQs%n98z@hQ4ZIQ}6V#B(k83ati zXFtd{(2XZrpEMP`NW2Q@Xm|eLws`OlUF>rgbk4v`$!V#YZIx#8X`mE@yLV%~b%gR- z$gV>JM=oQPJj01qR|endbhQ``^aW(#9;O;9paVp1zq)|pswd|3tknW~@4H*)f9fG) z+n(mr4VTgP3%z*mN;3y(1}ezLdk<$730L7j8*sAS_?<ud)%)sS+`8k;TgzS)+=Z6$ z#LIJu3{n*s&x4nuxcjuZojLF~Km}>dmY&7m!l=RB%o=k1w2U3b@b5nwQ@eASz4cAM zkd1l9L+#a>vn`ADLrooE+&e*9dkK$8X%ay{F_V;m9B@5(SO0Y2GHgD%<eB**Oocoi zo_AIC=3eI$>M#C@Pmgs9`8WHX1s2?rL|}1Hng#mZ1I%-O)fBLddqJP5?ExUc?ee?X zDW_c=j?Lc*6S+*F@A*eO*%O~iuu`c%^P*6D%-;|mJ0&Ei8GQ_mx)v!$G*Lm0O7)Wi z-^JDFgumEKJHZEUn7h@iLc)Y_FCWJKUwEs1o5IKh2qR2Rz@=KFnCteJCO}JB89AOj zK*RZE=MBJ|-V&^ZYC4bc)vA93F->WwZM)Q@ZqW14xT(~Vox^t7YtwuHv6ZKLbFz<z z(AK2fvOJhHY#xhOi~b*0tL*rU_gl%_BFv+)@sPv4U7m?ggKv+f?!=SQ_7L`N1IuSx zR4kGvFPPVP0Di+%x7<$8e@2v$I>`?df9KY2?FM@qq&S?5$k}XAp{xd4H;w<~xx5?t zA^eY5>%V;HDi$EpVHnw2&lCUhp$V`LlK__@!amU3TJj!3ukv6l$5!;)zVvnrdAh+o zDPBVo9A7tW72B@rXRdD!OkCB4C^<(yol*C61HH+QN)}%%OdI+I#G{KqJnCq9Qb<2e zK#E%SygG6F3TMt*5^+c%2~z>W&tJRV;!MPy#+pK%*{>#jZh*A@DyF0Pe&7wz+)LV6 zPy3m=ICWIeW%oWTsq>W!-wOf(CH6T+`V&ApT8>FGE7H(~_TbJmv|9^B4<Jcn*s?w7 zjP14KfmgI<Rcc3Gnvc(YbkDW3&EC7#f#v^q57)XiXY~waawo;Hp)n5jf#Cxm1Ik*u zIo)Ra*rsuAEmQfd<}2c28Z?ZU7F+;vMz1T5Frzob=S!HY6EcS|5OBboevOyT1dHga zP}Uzj>FEzNZuPcq!ioJohXLH>q8n+J_lq#G@v?&l|LsccSOFDFYq0i{siPR{_67HN zq2fG1Ocm*$A7Tg7$ml&~A_8IpS72Zac<~ktdGycqSgB=`Wqza*w<Qd@ERCwrZQeTB zOoLtx&1%H?N#$UOk<v3N;dMWjP#>z+4oJ1*RBJ^;655YzmJYbJwLmx}u{aHoS$oI$ z$!{$oXNwiARqKGoOagB;`}DgAqGsXFm;3Lw{m>e=a`^@mmYA|n{l=LG-v12A={LUb z_9lgNRU3{N?s7dW?Uzq<u8~Xi)ei*DyaWp!dXE756i3B=#QV-c|NqWyXY*eN`ViJX z4M3t>*b-prCC}y-IL8a9<Stxva|i2ZqF|2Sfr3hbedHszeLtuM>H*dHg)jM$Meoyr zJk-22ZSL*WP!UCEeFvY9jb31-X?Xpgkreay54<9oTBQdkMAB8W<S%l;FWfsJmL5j7 zKRap<GF1c|=(VU6w6{akaONvq7*>gqb2!oRtb(@sA^>g~p@i2-*M5WFcA~tGTDhK& z*UqW=<m3Mc&PEM8X*b@iTfX&j1sasAKa;-jM!;R|K(ieIxw+^eInUC@hD0?6_WX=> z=m3(>!x(w`jtMY+UQJ0;w}gO>j5WD27AEq^J`A|5Tg<mX#+;`jZ0k;Vyoe&9GfKvo z(VNRzwmZIzj@C`%`O5cwZy9jYyg=QVhd$5YwB{*{(fFDZlyvbeds6(|9*Y>q+Wh%z zMN`b*#*@j&!`jzE9<9$~vY~v7|7qlAX5nZo>!<6zLV961^C>6&<xtz?XT5jodO6Tc zP#Pv6Ge<bT&_7-xZL$HZQPX59cCvb?G{7)Mb#btX#%X;}Hb}c!>WKbgdhI_DH!6Q_ zDv;LDmGf1!d0-B-xW9V-lS4zJEhqu@40QB;Kz;}IA1?~rQQd`~zDMo7@6=|~=Ijp= zW|fGj`rb`-K`T0pW%gZOJZB1iE^s~$4%wq*YxvIdkinmh$xtJlR!Ka`wJ&=#x?0p! zuh9<z6~jd37j6M|l-YU0l1X1?z16Nl(^nm-NZatK!&(p52Vue33F7o=>~kzoM0x@; zZ*Ek;C@}!T?=iOA$OssV%j<x?=6aDHha3h=38-iGLy$!YY>I&gvX{CNAdx|MUSy2U z2t)|W9V2Sz_-mYR3YT=WRAd9at_PR&r#4=Bj5)NVETS*tx`czJs9ih8Uo<Q?%X&?M z&H{y`lF0S9AB1n^mn&h%QplD6OGJ?v`z8Q1$xy8P@8Xx@bu#UVnCW}3Q%G9F)b3x# z#iGPhV^o8LmzD8Rk0B=0Q}0)*i^bMene-0wb_JgBS>w^>8-?Z~s<SNU!iz5w+Ov~R zngVGY>m;BW6Av(Sh6w<!K2PPXHJ?rE<3k=&l|(F#LG6imzw)W0A3Cocy#P5g(;QXD zuZ^N@5O}G3V<m>W;xkFhF0MX<!|3nIPQc#j6v%gB$r(iL`i9l3ICwbTp)S$>sh@9I z!*157FYE*xIE};$2&vWdsUMt*SL@iIm}a;h=tH~no?<VPeojRy?)!FbXp}E=s#>P6 zo~QVrOH-b4RA<_8x1V`)3T2^DcV{-osI4Q_fMs<cPE@w1GN)^G!nLG?S$<L+$o4uL z<kF`l>kE$>ew)Ji3wL2c%-5_3T!39GISgzhC{94oiVhZlb!MPgdK~McR=l5xfi}t7 z(3#!yGD<3K%$Z;0PYW10(?VpUHeSxHhMKG4-Sip*5mBZ$zW5Of|2e_Zbqanks~MNT z>hg&d-GyM4QC`C}+)IK2z$g&Hf5HG*UIDbgBB3{rg8JF5&%C<Y8ns}3Q>BN@^^nm9 zhT72m-`krok8VaQej1M#YwYIEg^S;tk5PjnR}(&ak?2R3T4_@a134=;hx4zc39N2- zFn>t{ryjeLD9brtdtOFtKXuSL-8pHaQ>XD4c>-XHF5L!q0clUug<#;#bB{X*rn14n z3C2&@)Gpe`y+&d8PCftqY~qc^lFIL+Zo&_gGJHy%&Ud!Ehx?(dTP`N<N2GzB=lGUU z0R}iZmsru@mE20gyY+LCC$>K}yaw>@hF>OCyGz(1Ep<RF^25Dgo*`8M8}<2|q`IwD zm_6Re|G5G~oeD>StT?GNz$p+CaOq#o0%w`{0bdG;D=*7BjyFw2G9lWfjj28tSRE7R z3lzm63Mkt#kBhc)r_FD;L&ab98%t;OT!ADU+Nk1eM4Nr6&tLX)0{@BGF=1!`{&}SL z(8&_VUC(c>k^iI8`<L>@P60JOakhRlTvi`svlpB5>||wp8*|14MMMWmXh9@XpTmEs z!)av^msI}wpz3eOH^8uhAf`dBc#v^ysvwvg-#u1x_+O+qW5)MvFoh$zY{KwI+qaEm zEg_X|`r&&|=J@{Kob(R!6(c)*{rZPv`SJ3w4^vLwprAh2@^G9O5ENBp0vJzl?QAC4 zl9<83q96Suu%6Y~bjjfc+DeQz)Lip$Du!rH;al$3$1EMI*-n2GrdpdC(xtv`_;B+Z zFLA4EC#d|3_19+_BbNM8I^n!N2Zx{G64-2QLrA?pCcU{)6G($n8LWq!ex{EUy3W*< zF6-XAv6@>QIfs&P?|tOpKrHZzEH}Fj7p#Kz$i7V2I_ZO+{5@_pT3;4%v~u|%>6Ji8 zn&asUhxYg9BR74dAcaB8aY1vt9wAvvJ40g^-7qeMvY8zM`TyeI1@<*O?k#NaFYD$P z&?-**!0;nnRZL(onqbAma&#r%7tN?7zNCGMpTSkx#z5&UdK9tl#OOHq7~-Vhcvs=~ zX<$>t9mzrlT18tWUC6QC)ogD)Y^L!|<O1<O#ojW7M~64wn9RS0r4}WK>MP_YNtek@ z18K$&X2m}9TXj+8j>oRj6asVe=gPJAdHF<(Ko*hDQKV{7*Md;z9!iceY4&9!wd@{o z^JK)bl((9^dBTsxE-*AQAn>$bO>L<Oa9DR+e~d;!jy;}aIzlT+{^p;E-2WVj`QN=? zeoqQOegIS%OU?n3<L|%9p8-MEeOB;60ZZQ)rA#3s*(BE<tcn?t07DjmG6oFiuv0}o z_x&6IV?74Ctevw0RUV-BAt{P|dV!m&QipDSR}JF(zNR6tR=lx1%`@Ni+d<MOk!K$< zuu@Y%WWq-r)Ya8E1GAjiISxu@GoxS<O<`1Wqe*wHk&n}j*x5O3&jZLOvv}tl?=z(t zrq#K7z$w@Z&s$OqA8D~xU>YNd7-GX*etOak3!v7OKWhp@%FPz)&lm{_ZR-;Uz%zMk zJ3;Y9F|#MQKROyGt7JC=YHW%r!LBx3Py1T}Ru%x`Wnq+=yoh`VE-DNInAqzeOAatt z-(gJU6DBpY5hAW_+^p>O?jxRa)Y!2}h+v7pEqDTe*rute^91Ydj*p>qaqjBo48_G( zTrD}D6FA2WH#fa01(zDh&AVE|1<~%7nsO2cSj_!o${H*)8h3+f-2z<Xq3Us*5kM+{ z5R_4w$JI}Wa(72Ka8ulh5|o?bAaQ?{*JDg_xG7U_2`!{e%Q@DAg?Y@lx@C;eUCsq= zCY-nsF&ubR%iC^#balJ$aZt$aE46W{-U?`^O3#*2c~WV6UXt*F&ENV#G?{Pt)@@}V zX0>2fL+}fjL`Fjdrl3wS|4k8)q65*H2ut4RRURx_r43u{bZyf7*>#;l4o#y4i#&!X z3;iYr%Mm4B9HPosii+}%v|rxWPxE6}k20q_c-k+tLNb=|-P>clajHRe<r<bYISQjx zmUR@lYf>54`4t1ykvxDN?JE0<8r;RKL6M+%3sa$?`bqW8(_TMVVfA49#>Utb&XhJt z<F=j7eZebc1l(bkIzvtSkZ>5XOWt>;lgM8w=y3nhft>S2m9k4eZCY?$lleh>2bnG> zOc&ok#Ztx~NQPIWP^9<WaLAS0g!E`~G;Fc?9XoCl_N(dNp{vz&X{eR9>;l%F(m03R z@y%VnJ$X~FdlgE&+fsH5*_*xO;^k1CM)$V$0*z9k0k;w!p?_OS2EEHzqr;!(!G1iJ z1ZIe65M`l0$7k8X(9=;yJEegCM}pg?255o((ZP=WK=^NM#{`JXPWscDVVRLu_7@&p z0<_tJ!H8;_0-7(WRw_oP0%R}2O0ab2<0)W;-IvJW?Oy0K6_GC+;4zs(GAhr^ewx2H zxKas?Adur8vh9G(b$q6=ZKG7qcYB@Ue(0yz%%z!BBTlAs<}Y;*m+K0u#BVNkKpNRU zDc#7(!zfKjcQFbvz@df1m7_QSSe%Ooeu%*orj=ve&=JJ<(*}D#?{fnu330Pf*&lLh ziytWSS+0qn@rNLLX;U?sq@=_62T;dB&###Ryeto?9I=uiu^F>9_1c{3_dfWR(VvC} zDtw8Vu2Ng?W;wvo(;UpX=T^RBkEQ_+dSs$U{BWAg*nbJO4oIajr}@RlXLNX6l3YWG zzk@ooRKxQ#p57}eHJ%!&G%=WjoUW_&0r~`ufA_EeVvCfgV<o}mztJ&JF*%>+dbl{` zgCD;j+9mRP2ebwT4x*HF1eya+*k${eO0?{$adCKEHta3D?eCepf;Pr|U|ssB!UO>2 zYUZd!9gx&=FtF#qt#NbO>4@sow=2T=+}<0hZ;ledx4d3^xB!<yOPZ)o<R6pE=S)!p zubfR`xZ1oDW}5ey*7Y)fHFzQa4B<Ocx0sIY$c%%~&9_7wtENWBNon%`Pn9cTfwQ<* z$Fd@DC#tn_xTT->SZerwd^%B(-?rKRJS(aZ1=beyaXXK43;3*N{ZUT)#z?j@9}*8{ zLr1Ywd{t1-d#b}k)q_j?FE*})35YYDG^IM*X|QoAwxN~Ad&j7nKS7_@ePXfk`x30{ zezIzu7u)~FmkIbj#_EF~9G1MZ^CL$6gfw}f@NCTbVT^qnF#3Y}%*%NJf1JjY2adBa zjQ?el5u1nS8zM2pRQ5ojO`QpavXMPT>x<4L(c#XDoLzcS63>exONafgIl7>Jv)wmJ z9gQE-k-tw0i^DI(!~`cWx<>Ej9d1{%*Su*s?IbDS0!vRMYgQ*VIYbNyy%(7P<V**2 zA(S_RoCoWlQBKfu&)~ajZSgF$ta`Ai2|3*9o<gz)O4I5F@YCn{Cr1$v@tWLi=O!W~ zhh6pS{|h(Y()Z}11?S0MMV+k48_?BNewmgkM{pKf_n`A!<|uY#MOYoUME808&!JTo z1s1r;2ZZyn44{G}CLqrKx%B@Cd&{UO*M)z0s~}2B2oi#H=g?(P0z)?vQUe1Bio^_z zpok!yLkdWjlz=D<-QA#cmm&j03;4fq?{l7W-sf5C{i3YJ7Z%KYU%$Tg5_o_B^gY)p zO@Q+A>cpx|aF~(CBnweun3$<TZ0BW{t(aWpp37+=oPI|xxl>5gH>(MXgGB|Cux`tX z$ejC;^J1+oM(s5ESUB>iWY2w5ZFQ)*0zc>Touq?M`z4TmP-4_<wGnUYpVwoLD3c+B zeP`2h#Z5+@+b=CV1||4s1dQE)`@RUF*{Nra@5!ghp(-tS`K7IZOU@N_ccqVQ1lKOL zO8&wjcTFy>N566I>T5Kr^N9%0E^|lF(vk8y%FhNJHrgSSy6uD_=b=S>!Xm;&8mIDv zQ~%>YzlSWIeQ0=lt0m7>fgT5BJ-rJE<-llQQ6<B_bf4RL`pqE-;3g9AN?qMsmmO4j zcfBGDXFUTgQdw)eIMB&!fF;QNQRLZ7*zgG6x6V_Sh@ZeAJJx>R?7Ly(yNHK*D4ccb z!*Ltm7L~zEdotIfv3+N6^T>bpD8rI1$Cns@7liMHj(K@I0Sh!nUhLBwK**4f7@g0< zBsmzDODEdymUgAQx!O;u70Z%98?IR?k;0f_+}o@DzR#z^#GX<P(k4|n0NkrHBf5+q z!|vzpIebi@?c*;y)^X~9k6+2QYot%9xN9LjQi*k#_b~S!yb`-w_343+{Z8UC`QFRN zV?=eg|3s%O#Q1wA9a9qG-=Sp<*R06Ne0CPA;!UDHEn3}ly{@O(%u0pr(oWJ0jqk#i zA4$9=YZ;W@2p^@L8O(NfNEuFgC>Ps%Ik3m>lF^svAoBb4h5UzA6W`uQPt%Vl=$~u@ z32E{9@&ILFRA}KQF@j%vpX^-%A2fyD3nZ}vykCJX8(Q!H*yDVe7}>#-{M6dQH5CtT zLU<}y#*%j!>)1%_n(92)J!enkmK*Joo8Zpj=)eLA2eT4vija{Q*gIHrZ^G8VYRmN_ zK%BZ(pQzW>rlp^hY->%rpD9=u*f|r=^l9e}Bh0;z(Twg9@WtXVt!|sTT*0KCe?^hG zp2$o6i6UDh2N7c2cqWsB*nso@j6Bk0?YVHIn#8iH1=3C6uBLd~LWARQShH5oEhPz7 zpX9jtBwMZ6VY#Fqa7Vvw%;5X7yp5t+5=-CP1Mc;At%Vh?*ceCk_IRB=PDyN^Nnct( zmkPP6F@IXT^?>$f7Fx`gs`O@HR`fLtFVMKYzUwHIHC$*S&XBrZYFn8Po>FhjQz50D z`p5C2_(kiDT=3m;1^TeEq@j$h#aHd1d#!~RZ<@qSnh3k365KfOf?+bWW!&>m;L4kG z$Nm`3)FO>u58{(u9nvMB?5oe3V6O>A%J~k6_Rrm^vflW>lg^5`2r6Hw5$`(QU@Thz z#@*Zjhjb5;YX#T{ZL($oK&a(7T22FG4DZRlwNxd4J%nL$GN%g*Qz6}INAHVD!K}OY zMa2~HiLES~x)U1Is`NTZ-e<humNxC0hMXi?j+gF1H*DGo!f{$_u4#%xxcxADe!OA) zEbst;gj5CAIP{;$@`dURN3^lyan3K?x?uA=01RFy`?Y(JND)ULE4|Zt>SQb&p|M>a z_-0jZYW)?}?~fQ-Z=0BeT+3()oDD;YMMAC+&X`h@RpGi{3TPpzqzWD%QV$Heli=RJ zLiFWF4rO9FOrRiNb^h&SRjfN(&q`DV>Tg8n_n49~N93?oc6>==WS1Q=NSLy^3tm)H z*r#m3a_HQNT6@L>q?4}GtuRyPp0Z-xbOwohLCUM_Jk?Fuq=?pt=$zT)NTu%rdBmzh zd7T406Y1hNd1bN3>M6si%g4$QPSV|-bjQ?;OY7UHrPJ{EE1meShl%(R`2$Nj0NnFR zxfWdnioq)hOigU-UFZkYK*JDdS<=A_SK%32#nxmjVBXmze}+EdO$qb2Ut}m_riOwc zhX!KcCf_$xeWIZ+4LMss9qt?DAtp@k4ANR_Av~{&M4mm*bV_{4OF4JXF9>7}6mU1} zCcH9nx6#5`@-Sno`n)81hYUgGnM#WM2BN=pb8|+=-FTo>18QIJx6?eQ@sDm!u#-5y zpbgB@c&);>2_myBp|RhxXY7<9QZvN)nY522C`~>RxkK~<EskAQd3B{gZF1yI_;KDk z`{VeWT3B^%9bTbb@MQ7E-ScO(IEHieFUaCOmDr9#TK9=1E9S`YSfS8EOTes*76HSD zAkr7DR2Utx+TBaiAihV=*@7qh(RFzFO^Rx8I<1XgQVRFa!3biF0qVeXyD`{nWsGYO zdpJ)rQZ48}`9%~vbAuK6-wdDX!#z;KX3)Z+{5t8)yE=Vy@;P<kh9M{D^<N$8Oq8Xz z7FopJ^&&&E_bp7KgrwBtL7rZ2+S7;8j=0waq#gFfR6{0o4Q_3tpH3BDpoGeo-$Dt( zK?)y?Q^a>X-+hcLds|)27q~0YApt%9j+q@{V{2T(R|Edn7d%OwVMTj73pJ>`bLC7g z>FtRs*n7bS&btS^8`M(KOssmgqaU5TjWWlb4(8gPyPY0C`Ve-XE{zD|sPpMT?nSXT z8*>`ogZxbTM`>>{P0L$8!)J771PeVW)zC>Ftl1V(VW)(#2SM?CxaO6+Y<&nf_+>F= zEr{q)8V9G%UO)!7cRS)3DUOeX+|*)Qs5k=sGJL~ay`4%+Zo(K^3g4WG6N&yNA6M(N z=zcHL#>yQye7d!A<P|*XZ1{HrE*hm6Zl2U)a}%sz03dNH1#taS2CyCB%y_Umls9a~ zg9UK65aZIr^EN5iS>s6r6G4Iwj@M4q`t7CK>@K)TWAPIQ#{idA)lkkh044k+DC2iC z_^4NU@{IUaQ0v%ltzPV(He>(bi0qV-+f|QLymH3B^U|)-)5I-a=0E#HDR<@3PSm1s zQ%eC7x|^s`&Rd)<A4gD;6O&hm+*0{nvGY_2Y$^O~R8X4r`lNX1E=z0pq0;huel`x~ z%?Otrq=vA_xxTYeoDF+8ptmftr%+V9;Q>EMA-S4?;H}_hasw3|*MR;*3B#_3FNjBu zhi_SC#*nAnax;qINjgMbS%CF1seKI9>f^<~=vk7Kjxl#RX4`>z87q~vQ2mk%k>CYl ztUmj=kqF7Rw!k$DOkr`^Nelvlcy9a3**&elT3~2IbOUB=oi;R*eJk16J&iq;R!j4) zrxxW{UqF&xbHZH+lbfEp>6^3Rj?>obh-ho&<3nX>!o|Q&f(>>=HyV1y9R)Xg&ztnD z3OOP}iqtKP`Ru20fu#HxH9KtZXVvxgh#BRhf%TT(jeDlJ1X#8qZl{bQ#x3biAU*yK zG}Qg`j?OZ%<*?%Y#^v8<sgu&j-gi1^Je@P`IpT??sU#~~ptSI|t2r&lWf5dF%NN=K zFV}na=!VSXmmPEA5Dk<LU4?BcKet5}M#azVvGtJPM-Ej}XVHIGnT)~f{9;CJef0l8 z8S#Ik3=PfZN2)>qg!kHeSD<6{0wdcR?xSu6j;p%DUja2iypQeUOZq3t3nq<yS4|oX zVjhDi)T!M6MjE5OIRr^INAO^bD>FtVX~OVoW+r>wl}pb#w;Efd5dWj{qY+iAk80qn zSO7XEaN3P63HHUYEjFBpO{I_l<sYhTwb}2IpbC0%*QP52<x<vR)_{A_!k*{UBym04 zkEZUE{pP~a%fPz1yWo%N++qHPsS5+xMQ?6@UNe&<x>O@AEIgx@c2l3ORNZUR>vnoP zOP(&hAZ(psDNv_9ue%7%FsrCFLOfd}ZK9t#{Bap+2_B=Ug`MF)9Q5;D@H~kxJfmT( z=wG&GM7wlWp-hB&rH*KQXt)T8#0g10q;Uvxrr2ufnM!1_U8dQDmE<4%Z`9G(jDia` z)zXU`m_syrV~It>>0xIJ4GAf9ax4tWTv>J{jgKNyp6`?;2lXL8bc1KQ_eOF!AVc(z zDAkL0Rsa&`5UiGLZla2@i)HSq_&Rr=sJB(Laalx^Tr$muL46=pJ^6?M_iK4G>5wCk z^YYy!U|asN*0<Tt`G7NEoJVmM^`=ACbn|iMH?O^#J?Ar4(kA*}B_?gdSSVuKX4)r$ zmTCG<Rm{eR!aJohA!LA(ly=|$bYZ*y39&69B#9#NF*V1=154J70?jSD@?U78QJ#^y z(JCz&sihXl24itpVSqxA8J9H=MWz1yD^{W3=vP*_5#^W%1`E12*$W~U9OrzLnQ%QP z=rryZ#C^Eik!o7xYzh*>drkbF23!*FB_~UG*T6OvFJt7Q6%7z5dRO;P)}I64c;}rg zLrYeBk>J#K&_G-`!LVZFatA$#{N7)8;D9lh#S9_ub<mvL3-L3VC6*EI!dlj3Tgm4h z4KFvxi^O3~P@g65_6d(P1R>gUoDvC0TAduyO5Zjw$wh+|K5<^*iD7kWh??!X^=f-N zd4`h?oqzle_%Hyq;sS{<1Cccve<m#!$Q1cq;E&`cyNm>>04Xrq1*phvymwVHb<O@j z-HXrY+7%72O)}gb{4|xUfBh-H*2u{l6_DTXMu{U1DK6+iCpzp?WCkq9GUjy$$=BU< zt{q--H1z#M&iY-v@{}(_BA31hX?y1-TtKo=tXlsR&;MmHNQQx<?!-(a*6TUqTh-qA zpmT3OR^(LT-0x}Wm!y36_6`XS3A*G~m(??o78mGiMC>*!z&$s^q>-7%W$Grz@#nz5 zpb0G@dObSYEIE<h<!d)aT$HT%NAiJU#C?&{7f{yjl7fCOv&Jx|MCuwtN4u8^HbwiR zYL9=jFpe?jhINRNi6PDUfWuD(f(6<^Djv2v$geL!K5q3QoP86S-whm+HSnDdT2zt) zY_d<EqR*j*R`B_&*cw`MQJe2D-Ar0_2^^h6w-<zyCiPt`aPuFq&nDxiXC}NfiT{~A zlYBt&uxB_wGQ%r}bEHGE$^kyvRJkLP%WO)UqyI2=q%g^&0~fUfiqOTY|LOMUA-+Zj z8DQQ?!FCY*77_x_E@>o8k1H;Sf>D?H$O%ZH!c_2KqoGK-g3l)GB%CPaD;|W}0Wt$M zLOthR`#Ue^e-rcxqL$!k+hoWrUfOS^RQrlNeQFp>?#*B-;d-ERMDUStxzVoGKAJYB z>Qcc_U$NnP3<E<lJ9qvDEVsb>glnNL&Z)J4jWCiIgaA~S_G!18UbicdM}EJ+FH*-S z;@%+?D(HbvPbRP56vNzGv9OGkp(}fQL%sQzVVAtGw}HK|Xo!ZiYi>`~P2Xd^9h-)j z`f$o)VG$)|{@PqGcE`Ha-!3*};^fULzU-e8pVd2M)VB47K5RkWH;YgV&2IjaQ_o78 zmzM2cTu25+XYbC@7gP<p=3+Gp{Cy&WG!PYxO)E$G&91p4_tyA>#5M3-V#Fq2v)t#n zT+JQy35w?{j!(Mf5`RacmkP_+8FUjBJoa5*cFQQl-}dcxvPx&G6k=PW7czXTNpx%6 zTh7JW^kW!pM{?)08KwIoOI=-F#oO<;S&E6#d)*9=R_wZZR@*i&mP!QE7eE+qADoe| z`+x{Efd$9Gj;!GdNy;#Ewr?5KaGy94n$+WKRqV!aY)$<BrK0NX2#yB)>B>rk2;9MO zd*EPgCtE%@W(Jy=^-_m&ujh$mdN&9=a?L9Q4RF-+&K#=+cC^bb*2cKh0FB@j;u4CI zD=4)M6q<Wx0bdlwJY&b5543vqFZG22d}CfsS%=3H`M&zDz`}x}EKKhQHC72dYH*R? zgP?RZc@^}vE<V?PBom(9diC4^^VDiS9di!3$nQ1}l&?8s#|@QB#X7fO>)sr(X*4}{ zyBo+z&VA9;;->eq8ZLUknSRPJcP(|>^+Qbb$*o*mj&QvqJFB?xa><^4Pf5^=Fj*cQ zbg$D}_<~&Dbfx%TdyZ~l)st6vzz)jap@gHoCk{4@_B&5WEJ_t7qgBvGTbjHGzO@YM z?dm09Ts*PB90Q13f`J?bhy@eb#nk7K1098BrdO}XUhSd%hjm$XX-L258#xWDRjS>U z2`sZjRkp!b!56(`u5Xv65Ktz_o253A=*WVEJHs8&+xUF@0^$NyH%e{I*mhr-Cr=*w zaYzclT)a71w5$y%PQWkYk6p5X_|WJB&rEA-;RK;SGS#$5Rx!laz@QnVL~LXbIx4OQ zkCjF;zc}`TbPBP=bc_a5*{t)YY%r~;XB9h~a@$Mm9BQA-*@JKB1zCeTbnmjK<&rJ^ z1AN}7{WtLWz&3ZN#*u7lp#bHK7oGVW1E2f-ikOt6g{ZGsqSv~@|G!L>{|EviitXZa ziV?<bj~>LvVrgG(F)(WN0Puq|eSB_fLM;Svs{THd#kE~Tv`c*?G9I4+#?kR%p=E9f zY>2D?jVF)2$Z|t-7qtOb-7@lylFE(VwHPWLefxcwYFlQ*CYNBlxEJBMW9k{|4&k3) zV32LaB(qn@MdmF6w>W+WWL(9!4;OTH%Px_n_q52SrPsadlj#Suc4ihHoZs4@=J8s! zNfxfVHB{eW*&ugMTrotNz_9>hx!=fM99tEV^l3@qi9B0MHUIw4^FQXwaPD^|H@UcS z;k`=5)C>P~k5^+mMRi$53T-;zNND<)CdUOO>*%}jL!>TfqcJ;<S2eY?&?~x$|M6}o z0-Pro`3KObt3r0-fP4Cn{1S>Bv}=1dvGhlNA@d80<V-o8Wf%L#h0>MCy7r3512U3R z0KFI$>~@Dd%74+4VA*luwix#gHr}FU!|j?^2w6_5V}AyQy_kSfD)?Mq42`Kzq*bbq zNQ)2rE$ZS}8T?eJeExS9q9^0Iz=gRb6={I1Ly`AtC&gkv$4GqQh>u_F5xmH&jo<(h z%H~a}clAi~P9BZPU1;gbxZPvNKyMe|kZY$oX(%DuMX>WK*i(E6lhpQa9Q1qFTm@uL zt%Kim-1yQf*#X3;_qhE?Nj%pdwXmD&HmprPOq3I5T37mx7T)7-O9)Rl;W-+*@=flC zRKOkq>#vZ(Rz6Z@N4_+&9FgDAVu0kEAJgda27??=$$_WAab$KwJ#&+5?X5tG@?=_v zTm7A737ZQ^hC8ECiS&uiSllxQdIJsigj}1VWC5KmDnh;$D>1EoVY4ltfpr^SlZIhP zPGknMeo1G8+uwGXL)k3Z!8Z)`GK)5)MhI~~Y;DMMrXEbAwFvxY$lrI~{~uh`lInJa zXC45fqHdXJrX|d*sdn>}e<B5Kcr(2`2k1ewJ$UTt9J6ToDaERTgZ8|~6Ea@Dk@RCw zvtuJIii~D0PYQPOE5u&ACJ?Fk3L!dRq`0t?*7=M{AqAc21dnTGqlOI8U9E|K_y;7h z2|ggm5+&?vz7u}Y0f>~)=n2A>#j8-e*OL9GTmx|1GU96pSeAnw+p4AABzd>UUmONH zEOu$Rz)dl&rF|ic8~x?Y2j1LYL`)iktZN6=<jn%|P7;|w_O1?3ErfW7R~X%!`okv8 zmI-%93Skqt4TQvx@xtcp5Mo~2OOT&7Ut?AePOK(Fry+ubiOTO;fFT56Qwb=(wOo?* zwz1M{{gn))oFU+WwAg_-XFBl||B8uM%+wpNtAe%hfg-XWQ+AquW-Mbe(d2S*U`Chk zbZ+1+1H@&3k(6*dK^XkLoHg`$75w&GV``IxDjL^acdhV$Pj-ZX7m_Xm&cW9PxqXWb z=e?VOHXljr6n?l06dy7H$8Y;jjl5m$9v+xi#xP4;(y>8ggZaOWPb)GM%f}r(jPLo^ zH0ghr^;9j697yLgUIrn-gc*?S3wO1Xs!_U+aGd0Qy-RbDZsH;6!%*js2R|rg!l?SP zJs?0P8t%hfO{SQEe)i9|qfP%53Tp8{cMh?*3^S>5@^qS1zr(MdB_BA8PJ=Qnjb^e} ztk&q9pg9_J_XN{B?Q$0{yWTRUI8&qt`;-4*sq`i?<*>tn==lxErQAxrb9IAbfgW{a zh@-bi{j4q{+x9?n3y(!VLj~gWRvMADuB@88rvrgWBOAW3vVk66{zpqkcgMyeD~P@v z#5jqeO02w$7BnDuVU^7sRj#`#>#!Ps+p`D1bSFD2!oW(PLPQ?2{_b*kiLGse?kHt} zDDTc6d8qZM`_KQKc8M~<^_+*f*FMt{-CB^^UA^31l$Q1OU&Z;0K*+xS&GujTvhlc` zw}baje`hT9UaEh+(ZV;!zcfQQ3&%hZ<o!LCm8j9u)@IcHtr!nki--XeAI<Js4@^qe z)FW#1<CK*Zy7s}omtrHgTv2aTLt(y3v(Op^ncl9Nvt1%!FLiNUTKRA6RbovhzGW0+ zRlnpzGlPx_=Zj|dIUx&hwlgMt_f}Ew(MPi771uDBe-Sp>--A<r@{ytm%}Aoimejot zo*nau?TD4JafboFdZYTS$Jw*N0gL#5oTvjvAZVlt{$NP#0W0biV)!<fY|P?_XWboQ zV`D4DOh})2yVW>RJYF4)pm>$8@k*gKh5d+s;0Oez3Q>|wTEEblcanUvaXF52bCLwx zb-_qw={fkN7SqxW4XAp&@RBj*A(xUbyULz$d0B$E%BOO4uywRyU}C(^>MW07tU5v# zLdMh`xzr}vRK~0<Z-X^Y_UhPi;ocUVy@_?6V0Q~?Gj1`w?VYTSf02peas3(x+x=;a zajc=%Q-7R1hd1{!uPye#r9C$3DxoJt?>pOVr{VjJr8B)+dn_ltuuDNA>O(olfFa_a z@)8Kv{0pglHO@*du{^o;J8X(2&++n?7}{o3UWAhviQsU@`*%iPT>^7@rcq|v@6`-2 z<__BZf7cXgQH62jo@>Q%QuYz}smyZ02(KI4q^q_2m~s;<nk0eh;G{k<C(n*)pauzp z>0~cec^^}?ZP=)uzO_Uw`Y%w*)J-*y`v<R))hWn;ngw5>S$hxzQ%Q@&gSB7uMYh@U zfg31zn4nJATMgnbymDh7zgsc2gkG~ohxH8bf}$DyTKD@seHB&ySx0*9|6OOalTE#q zSwX&DotA_;7}$<jl|g%<ei-*tBKw@>`x{pdcn9`rQ-`=rQo#sLB~pfG!b@r43q4Nl z@+@?gf3ZTR;mcLEeomj{+?g=bfjHv<<00g@H|!mp&?ou9{ZegD_>M5DQ-lAy?`X#< zHt-?19AHmaPts!a#`XVzauL$#xAM8<WbNvdbu2n_RiR8!M(3uvJyNB#=|a)J;&wih zM6Rt_K`g$Y@7XR`^(0b}sUxc6yo}~&;!h<RT9*nwSic>?i2^mANd@S_?I5iHzCAnX z#*XOSoh-ASiSd_TX+<gYLmdUM>u~GMq=_rkkd}B+9R)qv?i*UJV1wNnhUouLpTg~G z22dVj{{MmUNa!sCM`F;+zbv{G^?GEEH2L6hJ8f+iPOE+Kr~H#yPq#&@H-*$AsM+*V z|7lUG6Y2Wf3r6W~WIBsEVqIuv`BzfsX9O^h+Q<?`c-=kCK2Rk)w}DB4?>k5KNQF)M z)$A)cI=uZxs%==KECi^dWWR>pCp;ky2RW*JmjxycJdNf78|+>9+f~zbLi=_xfH@Y^ zhT+$}!r^g;A-?P;&u5|-WcQ<}9>sqqOuTM4`zUD#x>WUn#=9wl`}`6123UpxHT1NA zyt{k6L)?p9kR5Z{xs@Xqak5|7)a4mMUpmQU6P2s++FrwUVBQ#4kx-7k@iU{>-<ChU zR-kX*Ktk_lP28foDd&m@_l&gENlK!|VJbc!5Q46K6}d7p-la`_L*hHMBIX|h?(W@w z;Uy(ii-hGL546-r3q&1#RT?Og?1DS1?NZf7xL8e@Yj<|?j}7b-tS0;`-9bp1>ok1B z+*UiJrsT2aMiwYU00l($)cx}ip1>YOD?4iuVnx4FY&!-cgFnZ=h=x{}V2E9IYFre? ze#4L}U0-C)(!Jhb=Hj(BVGn{|a-13Fr<C(>Qhv();IcY_6*Z|z%3FXZk2UQjAaikN z<e{{5w_5ydE$W@9SJi#4w}(>f|BV%ISjO$OK}Fx+OE4bLzSQ?ffb}Sa?#<%soUdEm zNbN8shrg%%z^UlImGJ~$zwIYqeNnRvBw&>d#hI$Yvt82S!<%b3<mqnudF}vH+SSsr zqq(NxK}vSIe?Ote_)^pED`4s|ky_JHi{sqigJIRzpUuiZKAqo7T%#rl#s@!1l1^z? z*Gu41fnMln|HhBzac|9F?`-n*;Dg5}Dh&P-2j&t`Y6w(l`$d?}bGa9t%|8QJyUN#M zF+_+fVp9^-$KF0K6MOzHg+?8MjYq6#9#bU^>_+L_3Py%#4vi~`+wMMc5#H|a=G~m< zBGB?n+B0KJ*~p4V32?FND8)VJOV6b%X!Wn8x4f~NA}qY(ogAmG7p?F}U(AkS5}dOF za;_E&L-3-6kLtPF^QN1GHAHFI+tT&ZIeWrOS9rGTLVbZg;9KUK6Ypx5FAt+S4pG<B z4j<RagreY%v9fsXmt4!80%-;jjBh52mo9>>%gh}zFrQq()8RLw=NPe_nF~X3S+lX$ z=18EgmZhF|DcnI)aQsSc!4VziQFoD!hsfLtF*sY*Z;YH=V9p|Wj!%hJwX}aAXH80U zN3M+J6;VFlc4=|B*xQpEh&lX!B)LOK8u<p@Dmnh560%;F&^4w_u_WiSN${6=Wp1do zFlDj9otrnaKF8y2U#`zhN?9Wy&rP{s#dop?wEQP-vtbiPd@MgKNowq5{l0{I@VvoH zrF!9`h-U9Uy<v(i`7z-2{QPthW%R~NYW5q3CA!@InHcYg85r;=yBS%8{Lr*SCvR>U z^~-==SCAPmzBVau5w5lY`)QZPAw37udo>@+X56tq&HfXUHf$dLrj^-*2ZX^ae4-dI z!Yy7H0l8E^&Q_t<y4f+oJj@;XiAMoc1{Qh8hko3bnCG{uWU(wk;dXOF??2&Ppwo!y z64^pb&C3Pdo7cQGXI4=O%eCOAuJ`ao{AN^Z51c&=`ni86j0tuu-bR34OTUZdt39HB zV8Q4-o0_<0a?aAz&*xXtYXe$fvfstsYOyZ(rSUcumS_yUxP)VAb|qg`7o%ED!-6U8 zkV4lqwB`Q7Sy-p)^B=vU41BYKvCkwZ1)WdAt3=$Z2H8L$6n1}D9`!ZaZ_CDlldUE& zxKgAX<3${Ulsg{mE`e(;18h6lfgzx&`r-YVx2{@*?U#UQm!e#>o)9$d1wk^E@)Gmj zl3F_w6MST9=og;+!%GSXgMW8^%Bf4o>4WV83u^FpGtsN&F*NllgeXzbzkWTX<KAO# znFm=G;{ncw+5TJJHF(>kD_KeruxGn9+wk}mdxCSe%p`WqR9Go*ayh8<--{jWdpHD@ zc5SEVGe$y6U*#%FRHR&k#pmR+xSA)V{eMM6+AOStV3XdX35|k!H6!J{S#D3KPm)l( zMd2^KpTnMAvV`>YIpruNV-n7W%@~V0t*EyLdLXXRj*@f<4BdjM!Cv*D_LqO34@P$^ zC$tim2a<h15_;`r`);`Y`m-iB$|i;`r_6W8-&^q6Cqv$_)1!Bfgk@<yXCM6t$zh31 zR*?C6z;5RstS=^9+T;7`YBEyHIk3=vF~9QA_PM=DxuP8F611IMrNp*9VOd9llF*PY zerL@Tb?`ms{|5<YU*iB0q+5~$0cE7*mO2yeoD8p{LjwNrpirf21Ru(OAwR;ALgTW% zKAByXl>ipET&{oAr3c?~T1D{dx2pTzaf-AG7I}x5C5o&&GF+Nsk?&n$Rk|GDV0A@= z?=$aw?HTfbWec+PAaMA=VRoyhHg@MAp8f7fCld-j3uW=(i17?bQl{y9i%D`1Iw<YD zkSJ^N3VN#eeQyCnm7RqEBtKH&|1wn14;g*R;0-avxZ88J>zV<Y*L-e9#`Lw61=7+$ zwy)?-;{}VJ8qIot#l!%xY}VhxecU>vqUKGR8WDtD`avNG$t4h=C_TD>O=Jm6Rq;Or zW)tuRBjnpqMkz*W6qSbR>hd4K*b)Z!CiSo9$my4nS`VhM++V`L<sWMDTZ4>qJ)N{; z85&xehnIuIM+OIhu=8{9r<ye0gID>V-jN0Et}?W2Ui&%ib({Zj;;Pqlt8B15tP}S_ zaomaN82z`J`B{Z~msct?awwUALsbw<sq3G&n7C6Z+UaW(9pvCS`a~w61C+8Zfpw2f z2-K~XX3j)5dV08=^{sv9_i9|p(EulfzT;#!Zku2c2d^5)tGeqaWnMm`WuB(y-lQ2C z+@73+De6$M381|)f*e!U50`LOgCM=cW{VevixS~4v}Yz^)Ix~KKHDu==C?Mm9b3sa zU;D)2WbEThzf779`{of__LGDuf5#n=$s;^6BDHWgs==X&Bg2tp<?RK$NgYC;p--au z3pk>9lbCzGHa{DVU|C)ecO#X=%sG#QA6)fE4bCkd-%DtIJD70xZ+};FH%cvBT_2jT zYsixd^|`X8;>XS=;Vb8oBX9Hzr}WT?z>KH02wg`@QyY~qHnPd16iepwOh*l8C6_+c z>fS}sog^EOO;i1L!Xm6#^wIY=A6767{8?-pm7)11g(lRf{n2g$1>}=Q$gmfrbx}Vq zO{K76Bd6;JJY+?r!P9&8Xz>X$xyC;+z7>Cs=b!kv@}^B<zXVS(iswQ_4fhl(&Wv18 z!Yfy6Us*#BYbQ;B=u=e~u#AJ)ShPM-K1L~ppgJw6<aT$nJTA=QEAr23hhFpt?Uv_y zn3cShW)snEwG=E0&9tvdmQ4g9O~*XC9Px0R22uEH&tW>=11^={EzgJe3#jkbX(}qk ze9+NNF*n?q5lKT9))fi{Ga<ge8Mn{Edaj@YYLYNA?CBo-HxER^8%)2BWRFAGvmu86 z_{_m+xs@&)aY|Q=78G0v3pyi#<WbBVvpO&QqL(UyModvt>K@Qwl@`iJWj6I$P7;-6 zZ-FMY!CMD}`Dvq$uq$73u#iaoU>3#AzUjRP<uv`G_9la6U_BEeo`1Q_O#Y-gZkrmn zw6b1|eTx*gRkSSK4zR1PWw|@6Z4qm>^!{1B$NBzyP{&HtWR6Iw?)uqX{_N@Xxd(%4 zTtPfP9Aq`(47;t`mS=S38A)rh-{nxYwC-TkLGEOR0*nor_tqvF<;EkvD<>z0adWP! zvg>I-f2E>D>FN-olC(1xEdaNTab9j6kI=ZAEb(jqCG3({m+6M{_MQQvF!FeakkBDx zxHO+*u>SXUt*&T2aUMHw*I`{uaBjR8Hr068Vd?E+l_4RT?QTEs$ovCCk%&&;A+_|_ zaYop&Nh`3lPne6Gq3I#EjZW<K>e$$?@nZTx`LBg0pJVmNQ?{Ut2aESXw#lz3C8!`X zDLYgsT(UH{Lzcgb;r5A55e-uyVm%l^ev|bLU+Q0lSVKj=wddrO=FcAXCI~J(Bbn>h z`lWFzc{!(G$P=Q~*BjG$+1FtN%0hHxlmeqLX?!y|8`C&Pak1vd@Q)l^Ww?>hD|}j+ zz0WJx$uRN|S-Nf%BQ`<O)l@-Pg6yk0Q2*c_48@5)3?u^dfVS`${Y_}^f#RdfYX7pu zdyvI#+IPQ~<)}+-kMF#ev{_UVC+j~sXG2oyy>(`vPCV>E*q-{l*r#){$jhJbtK<($ zNqH9CLXh0m*V+%gA105qaImxXijlpt)z4X<?tLf3UP(RmQ`EY<L{t~p50aK&(R7<w z*q2ON_9)QUEk?U3lWOhOD9$lvdbsUL2-82!PRVfLpuqc3?^`k6wU?IFs!QdTQKPc6 z!~n5~TlP>T`9bRiiPqbY>Jvrz!{7dIE>V6nCZ4O!hwe3Jm+;7C<@&>sSHUtlcHEWI zp1l_?4=p1Nw(u{d_I=Huls*J_+r0N=aKXeSI{4o_Ss0gPLw*I9cwt7gbV}L#uvY5n zAUp+vGj|xu^P)v;o4<dlOV#~JlJVh95WxW7D#YjVT;CM0b8qc~*?}c<4aOqeN_oSZ z&G`VATw!3wx~yiX+EdgdS!!Is23Zm<y-#*0`l#lrRuBywF3{Y)hz73TuEl92`h<iI z|Jr`YH{~FBNsPCu-I}BD&P##vw2aGip^?>sayO43tbenGB$wNn*l?2Ee@`1a8Zeg% zauq$KtQtD>9}YT1z~PFMBaEzRTAnDvy+=I~UjYLeS3!ML!t6T>vTrZVS8_HR10#tw z;yK5(Iq3)w7jlrO(PR0}1b?0F6>Q%%LsySV-6q3|A?)$bubRuXAUF}AM=6tt(v*u` zqF;C%V%aFGHNd)=v}WsY*~KA5P~-5ZcaOJu+ILBPMC-@kIe9{^_UhvrynpePjkB|7 z4L^PzIIxnPLTUu$9{ql+fNih;9@u3aczv}lQrNL1kL<~D=udsM-4MO5_#Up0mJ3gR z#u%vN;*dU!G`kk$tq-L_pGj?cu68A4S#(plrH3Q_t$hmxG4UKGmcbDB1ofgvl?m-~ zXRm5VXJK8B%LLx&P}=1ePE6MJuE-e3oAK;R>WB@88FY*t@7_sjF3ffJwy@HQH67dI zdN|N?AX<=+i$A6g4y+ghHIoVhLnhYcfq#VryoO4tNRmHT7VPVivWp9+eiq$0xi#*h zA*iB!jgc%eLka;Tn&>xu{40yJ6u5`(7S-fnuzU2@htC1l)z4?&C{oU5zwqW}qLD3^ zc7giUU2LKOFW&|c;FYN1z#wWyEd+P^s!<p|g_%M?bzF7Je<+{Symq^yE2uYxL)BR& zzcab5J5H6lFvca7wC#3v_IB$d|65|hkt#j6NT$Zi3o>p`l76s>{gZ?Qlm}clVf*CA zMIzGup^MSD*o&*a$u@y!l%?G7LHNMZVP*-&zWexpGoAOMJnf4cnfTWCp=LFs5T=nn z+-r5VZS>7SG~z=?O0E-HEAd^<f=L}$4zl`f9uY+$Zjk5mw+SC&pt*zVJWNk}t}981 zmN&O|<mGQ%%Xw()ekIPRSnC7o9%C?-Y9GVw3c|xLi(nu2L)OvgAWe3B{+VSxm#)@N z*zlHmusy?s@Uoo7Fg6ApShYz$!y|h|NhuU*90e)YzxclViTXReK)k`O-Eg;ojleam z!RM~_)JIbX0E)u=&{}JA*M-4EMS*RmTBooQhdi^=izqnb=j>{xYQd$T-a$OQXRnOh zu(sm2XY7A8@_z9wLd1*_-5*G;;2XgQJd(!u{Kl25V20Uf2Q&&bKuslT$x8nBW=TkU zLc*m&yGg6v^SZ+8L(T0w&UG7gI3B@G(!|P~P<bj7Bs)gF;}%MQSmGy(5PgQ!w&%hO zp}dJ_I5qgH*g_R<qUPl^a@P0M8f%*58Re2|&j6+PlJqtscnj8E9_RrnZ_c$;lG)8B z-D-^!Dtg%^{nwL@h6CYJN(%E9MN3z{?c1+yEwtn-KRQiPN?q;390+eWDe>1b{#4s8 zChn@I=OwaEb)B};sMx+2+w5>E^Q)g%HxZ87DL+cUN_Z$fKDoIF*<8hbP6m+)ZpLpn zVt<m{=!tP2Xmp!BIc1*Y=_;ifyZlNFG&qGKfu8-LQz63dTX%rsU)IR*gxv+h3Q5{} zPTIN?ak*DNeUj}=3R^7ii&g}9(eF-$IIo7lCK=MJ?DISzr5A>PaZS>M3t&hOXNWyG zK%(Jc$YYpE6wmIs#|F3e^+dakl5fQzmt@|v9lSNJBls#TJXrSyzx{bs@EX;x$^$Ll z?pDfI4Ym{C7vJ5wrYj10V$J5KryiX>r*f7<h?#p=jd^eqd*jm*uWubl<^m}->W~}k zIRqtL4S3m38BNkUgevvN=XeiFC6!6CtNS-Y-^t$j5>wEWXJ|HjZ@Km+u!EMnvwNs{ z#ui6p&~~Won6547+>`HSmtse<dRgjq>>74_JlGY+AbcTP`!DOR>g^MUs%KnIW-4~w z<s9z|@J9#R@u}gy-M!np*6~m4<fA3`Nk7-0bjC@4=q<}XX$`_J&`Le>R5e`z8?1ue zec6wapI!&6P*d;9%%-^vH~uiticMd%b^bf7(J5pp-EnV_!t6&C;Zjz#67LP|qn(iK zoU*ckxgx92GB`<oXMih~z?9|wMJ6bKsAD{D;dkrQQOkN4cSI!KI{d-owku+PJ<jc9 z1H-d8)Yd{Rl06iHJX|qZg%c-^v$fR50eb<Au}~;LGqZyWUz)s3`w~Nrgy>#-_Y=P9 z_9Q|E2httxaHW$(f^DNrpe=f8Y^#lW_x-l8Ci8@>+k7sgk(QqO{5OLtQ0Zz@!i%vt zP`goTHS0z@U?@W97n;J_#oqbTj4Grbs<L#B%6v{97L}-|vLsTE#Z6Fsyb0RUpmRaC z`yTW!{BnS4O`)|AyPNDznEt7ZnX~XAtxcCDpPZ}M?BJT|Zro^)0n)6cwiw9`E@;VH z7Lm7v6!1C6kZ$eNO~P-;RDRKVwCT6u0xR1T9bVkaYCoQ{9Dyd3K@&Pn3UR9ptnz-V zwW~!1e;W`nE7V=P%>O1-zmpdkb2>{EQ4@h^I@Sh?R-c5#bkT-#v0y_b=@xely_eif zaJ&3${Z%ZFU{Ni|`525uoe;;a8!k_v&KHgTJ2+DIHpog9=R70Yl%M-kvMz9x<5sRq znlhyv+`;m4zBqfVgtLa7?8I{XWJF0vEiri0s3RmonM8Cgf9I7ZmwX}R_{5iUymKPN zh~|s+WOY-^&e+JXy`)0DsHiYfmJ;kN52k<~yEB^bQhIV0b~d<SGi!%aOKm%8e*S#+ zX!*OU2Of&}b<ZgEw;0FEQr6M~t7v77me4)nPBy{#4e6$$-0z*W%USS1Y~8Z!j_gpu zFfBO+B%#AOWae^OIKHP-R!&Q5U#+`pwn*-KX7&ZRYr;i4>7r~))^_S}1^LMlB{VXk z=<3~-6WbO)y_EWJyDA9Xjj<!A$dDh8w&Sc94g8smK_5J_xT_lKF**ay8l#ha!i;SR zxgtJ{`z*TLH2mtg=eHz-aawNw?8hHn|F{~Xr3ss;teDQc%*YHfgsN@Py3MGCzYhD- zE=~=ePrSumHtchM?Dynp_zbv!&h*50ZFgfzn}4>3eWTvtmw08E;OXi8qe4gUxhfZr z<SCs@HN+bCEAY>{wlxqWPyEiS+}+HkdK5wS4h>}u<zHgtIzPelreZWMwT}w#@4?R3 zvKU2dyM@rQ-gn{HK4-JE7>G-AYq!+c6IH6AEl%TRPA$*G@on@X+*pQ?D3OQXVT7@d zsj<vP{xih&PTy{*KF21?!w5S<=~xzo_bI>}I5%Nr&a6(J?vGlRC4!}#V2kMdz=<|8 zGn9Ua{|j#Ac5-hv@I_sjAp3F3?8bVn;@)%t;>924WE869cb;TB`(Rd`a{r$MZznEs zC6z23H?Z*AJ$L5~Q_4LKB9$egyW&WGlcSk{sJI3^;WzrLZP=l2Bq|R&GqH*DTM=)% zF=KCmX8xgoy^B{bbi!4&SZt+CJ$9il_dKEf;6xdehGic|EXowUW2kUhDvG^!lpaW* zj6copR8&zn&U?JGskkqE*Yy4+e*GBB(t|VP96EEy?x?-qJI*#{+lQS}gFkjc+Twrc zl9nfbrFMZ=_h>Wb8}~W2iLZX?4GGcP?KrX*+D`eD30X;~4nB3hTgpAptf<ra8RU6( zz*AF)h^B1eQ-8Em7E&D`GIo?8ia5IKt|BV>xRpSw!8YICmP+HtE8S84CiEe!bQL1^ z75QZQT=r+z_u&~Scmuq?PwB5}d=M=ElN3%*K9Y#WKYd?AD??;#FaWZ{@b9+v4tB$J z<LqZ@?6N(8|7of_77q(vWQA3~8+k*Y6Gz(kI-aS0T=fn)919Ti?yDMq*@vK=_%50e zmdp~n>N<Lv)%k0FO%ibrr~wof@c$rgjpwRD@XHX`zc`=zpT;tHGgD#9SnraEhWn6! z%zfa1#0^1sqlrDoEJjXvh!NkP{1zos%+>m;<4<q5-4C^4_pRS-nNGwPftMi&Q;OXX zd||GJD?T{sAl2&j0L2mq7OYS0{7*IF-(N4!obuSy*bNAS>)$dJrcB=%Z_e+ZN_HqZ zt{l~{+0*QbwQJ_AiH=~e=Q6X*d2+Ehn8bdeDUO;sLX4hDKe<Ocqgts5td?7{s{RWx zv+t`P#^WT$g89|5?f6_Z7)4N2aha=4TyiRpJ<0jz>*B(w{LW3ls8`7va~D`fF>3`0 zTsIKY;ahH64Ho!XF4^y(HR4Yv@PXs9(@pe<;7$B4+d~2M<K7UK{ciJDUSdcLL;76p z*VyoGPIpLnJict*d%~Gsh1h<m;MWHdxT5P0%3rP%rRn%2Q#1*Elha5v$>sN`A6C`$ zx&Eg%)faD2nefsgZgx&VSaSGPU^3d&Mwrsz#>*NPVBn-gR&&3YRv+w<ofAn*DYv7w zO>ifE((}5nh?Lb{vCTLl+XQoRd~aAsEPbMfrimCWbsa<?ZJey(-16@t3Fr>J2YDXR zmK4L^MG{s+BJzYoI3!*A^lqy%n}~l2&_enBi20y9yMZa_U$_MB%5}pO7+R&O)#3!s zqhw-GPY=}fi=+~bP2Pu{g|8(Z<^=bMb%r`QJ0$nExbfn=cOq^>`JIeyAJI-)jlP|M zCOl^|Sg@>jIzCpsslGihclNRLyKtW{@W$3rXRlw(CBq|vZG~I#aI+n^#3n|9KAkFg z@vtM?klCG<EGolh=eeW|KUT)qu2MDGcvuJ~1YQhfn@3C-62+qk?wg3ErgvPnn2Gza z_DmRr8JOF$+8P%3m1)DjWG|@XOUf8az<G=4rphUH<8us7ryaAO6osBsrIQ@@B_|Hc zX>8_jgC2rKGPr(cZ#Y}cKKs@Rr{N`g3E>PVlU}pli?CA^#mTMYH6NNUGP+C(I8-{z zgvzFka&)O1eD_Pht%2uQ{Vz}kM#^Gc{bTiaw2;V#95Zp>L{1FF&Dhlp9xar@{o<5y z^N08Rp1y19IdS-oBgk^`zGCt0tPvk68K@F&L{CsfuXl;e;CSeZT#3C!4BgV#*3EPT ztv_Rxiks6B5!yT8a=nWxt{6zY9Yh-1x-7rGMtad>UBtn@-i7sp3Ck7Rg?+H04DSzp zfU~9zr}|wVPvX^*&EMje<Q{mGn6^6{N4l`pUGqWx2p;i8C6r~gmhnOOaq|YF1aCA! zEFXs(e_NkgZ<VN;6-8*0L-FMt9bsz0OzTAtB5s|`P-=<v2Bhzeq;a9-`*bA0!X4^C zhmE5PX?hgvUM8fIedTc6$I-}sd_VPk7kJXqpv(t)&uO3vLh$M|0IZTQ-~Vjj|9T@( z`Q~K;R;z)v6GDpnjWcxhcM#Q;5%be1on>?3yDjzE=Z+~(y)L0!nx*!C2#}7J=JlCg zbLps9ASZzFZeVei_`T;{9b>@!9aP#}`(1P`J?I*3RUZ$v;a$~$UR*J5i|Vzm8FDLA z{-OSFxk_sVo1Kr%(&JkP!|(MQ4|)9PMT=z(JlG%p_1DY4R2A>*2ler8)O9xRF5xS@ zurSY;BuC|~P4+G4*k+&NN}K)}JnaI+h#&Y@;JVS2UH$+gQVmM;)aeSe-L;mWWmWl( zG6BvGGA-wbU_TbJ)~h+<Fu`S$13wnN#Is@VzX?%EV=dKP)&A6VfvEVLajp><s>new z6U-EfcNt!bP6_@2V|>83TQAx+1O0&7kr>Y%bi2Y!BxxRD-v4h#WSV3=D+6dy8p^?L zqLR}Mctu+_v#&!<J#Vkghkx^`wB{Z^ZZ{tn{Y5Iu9o8O6&Bp!Y()bHNk1(|7MKnSr zry94p6XgSojSaD2yJlUS{fk-G0dX8I4U=!2PUdsH8nkw-t^h4Fu>)*08!l(?kfD)1 zhg5Z^l{XUGf}c2ywn3*~J$~X4SAAOvLTULaDv|f&1}sFgMm-cZ4Xsb*PVU+bbO^M+ z^vD&&P1ZXyT)i|zabUTrHcVEQyFTOBsI#{9eL@JoI^SJobJCfcwH~ADPbYRgtZO}N z5va+e06p65S;?WcGqu#kyCDg}yEUzdPi70kLd~U>X$=L#IvX82eyYe}qxmrhnZl_t zKe&9u&|1SwFm`9w0hZ?f6_4VoIMNXwui9omElUixjnNdAR>IdBOooKhTu#1o!ur}; z`|?<y?XKB9)}ydGuKhEU7Mo-*K!-bRgiF6huRAHnbl{cJClDHnP|rEMi0xh9%jTgi ze-NePT1xOkEX}kEX+RmBA|ye1n@@QL+W95c*xEIj>3{ll>ky-4Gy=rDQpttu0Z01V zHp*i;hfN`Dt<3S9TWMKst>Hv8P1->CI(&YdA}Z@67CYg^Cu~QQ#$Hd%OZ}wyvYNXf z(VE82jQ}%NO?IpF2BYRDYrCLt2P#+d_m`|FL5rvH;;?a|@dl~2q=~F(3r<LU`@_^B z8@St+x-xMWH0=c!jZs(9mAipnSIfj)O=H6v-t!Hh8zvj79gsJE*BYoNgDZGamuKa# z26?iOCUX02Kx6-KqG(6oFz44N;HHNEqC{u<d%`-t1Gi8#MF}iKb)i2M*8|Fo+JA8% z1{b|M7HmFXB8>QM9;FyP&=yIJpx?0}$fi4qS$BWeGjMV$_Qo0i&)DqF6|iXzu6cgK zXeD?qH+W-)SdZX2N%%EVm<Pcmc?ggH7jGk}2kdv>^{ln*>2hWW@Rpgk<gwR;$l5&z zVRg;t4n6o`$IQ2g=oNm;yoF#s3{jVM#NG&SbjUtW_zAnptIaB?ao5qj@l34G{kpnm zCPX*MrZs&4HG%S=TASa|w~Se%KQuV*EFF!p>pglB<`cKL{d-jXy=eibs^HVPs%6f; zQXYG9Lr0ptS%U>u5TO6iJ#DdKH<i*LosdxX5Sm#;XuY~S_2Rq@7#5Nd|I7mYT?Kq9 z8_A9$5@r3mW1#U}be~u|yliH@)hCsM#I-;J&YxZ(=FxA@r&%KMKV+yNP{PjIw4*53 zNxZ7^0WM{}Kru@-x$<Vwr>}joaWha`r;mmrwh|+XUQ8bg%RM1KO5#W}km5V$8~sKi z%eY`R`Idj;TTE#4>g?oum1cDqb)Al?<UpDYn<!Naz7Y?9BaMk@nqV{;;-`Lc&&bpW zf0~hWn=VzHc9QdEY7=jPOT3Fjs<%XfL_4WyHvhQs%fPsRyt>=XElslEq7zbZ@tbz@ zFZ1L3<a}~dv1#p3ohly7@!mG>eq~UnF7U)vIQ{tCR#VCZhwH$>k>TG)Y$X$+%w?&h z&P5soTH#zN**uR0NZ^@p<-(U^m1aq49kRnMF3L1GQx1+XuP0~6n`;Ul^*XA{dP5z9 z1Q@oD27AJef=&4`&yJDo^gORWCN!!o;VTV1>OV9&Z=YmHB6xIobE-P~3+89m)mr7p zq}vWIu1#w#N<to>YJm{_Ly6*d-c#}ZZ2ko{-vd=rB)$hV(qE=qedh4Sg@c+4YjiuQ zYz@W2YOJcSeqzn$de&vgVs>J1+9S9$@%u%&CHoLE*G7|LwY-@_NrG~!f+?9WaYM%! zsYPj2UIrd~WLXku2RgkyeW7@k;FWW&BAlLO;lB5E5cvpcwkhx$Eui{UGIi9%7RPMF zR=D7?bA^Tpo%z@@Bzni6@kJ)NBDF#Y>k!>}uGc;9x){^w?<Moa`O<cO2vNd3Wx5sz zygKSo9n4z(XR@CQ)Wx<@hZgOk5uLAC<-$!DMEgaHdozaQo!{BZef7jx+z|9-=1#b- zEKr7Yf>>bIb_`pF#xWJSAywdxTPRlN%;TeC8QS9;-QcY^S4S;JzFJtXtjLb{J>3su zph<Lr84t8VI!2wN-ZsR#Z~*Iw93S6VX|HFJWq)9fgk<4a%(e^xSl6xJMnh%A#1)s- zJs{nZnTTTa1HidzDVa>7I^$X}<8XOLq0ZfEE+(yg>bA8!9*oYt+oO}4tt)R$;xoBb zc;8cB&>;>$hlt43kvpb6d=D?^P{+l^Vt>+NlAW)b2s4<c;9R5`LsgAWav5ZL*ZTyP zV&|fM91<KZ8*G%M#J1PQczr(-hii8`zFLV5=9}LMpO6g2&>G0KXhNXUxS|4kV+J95 zd57=WblXm#Nbq)K_zd2!TgfIO%@03Qi-bok%%$gzmyYK9gUIeY`diM}V%i8M?E4sD ziI3P#7<=hjw?jOwNHl`K(3ZP&oVjbA=GazhfGBAVb-p(L&+c#oS!4`Yfjcr|bUv?2 zLx%CvdL!u4P+{Sk5k9FF6{IpeZMk`!(^P$;-TTaJ)6g$YN@X7=+xJ@uam8Rq4kL4E zJKKfh_;8Hl%HG4g$P#o$Z4!0!a_f+D`^XP4beS2*q2qFITc$Ewbu!uZyKT*{6S0mk z8g@_fm<l42Rv)IAv>lGXBXs8nWySg}ZN)*isf1xdsrFx_K6H5`Tv;-~938E|B{CYg z=k^1urr)buUwuTc?ibx8^uFULgfUaZSDN_MH~u>`kd@Qv0hOzDe2Zwkp$mgZ5<fB& z(JLJriqx-Rp4jb<1;eUu{JLHRhZ=kv$!~&mr9G(=8Jw=o=0LwenPQ{Q*a_BYm2 zVvp;H5>+8QcW=uFh!+igd|6-ycG?(|-IX_CjFaAh1T~!@9Rv-c1@%t6y$RIh)8CZ3 zNO3uJczc<9=X6UW^h7taVL9XAKB1d<%4b!Zt%k>lXTu#Jqb~1CJ4Zj2EbFJ2WeN7b z#rmt>RZlXIw7D2J`n=$c`hEKRKSm|=7Z!Rr5tgwun@L#IZzj86%QrPOBd@QnaXv0_ zW~7vrObamNSTApQ40m#`A3N^XrP*n;T*2mD-SvEc9%g4yC}B*$jwMMI@I(6Dly;57 z!7&}8f()v`Zuk4hSrHqLLoTS0DoF~m4xti}1{2|=e?)tD%UL7ZnZ5p~Y|=6JGHG+h zne)9};NzXG@ka2(zfdVv9~i&;bz%(q9Lg3-%aM2}-=0&SuD|9a6=Qm~t-f}XGn&OO zm_a!dY1BS<@0m4j0^Z}4x+cf}nKW0=w3Z>~-I%|YWYO3FxTo^(azyYlU_ngXVAu=K za=he&A<;@Uz1`iDhLaS=a39&JxHeTadsCq^jX<)T&)#s0eJug1qaR}r6IRs=6JQ2n zNu*Em>@P{MNGlby0Hx9AW1;HxG;#wCt!N1aAc&Z;#~$O5-}WIT#={iunF9X*inj42 zaHOlh-H|2GLie;T2oE{7##ik9!dAzHc97vh@_W+SQUus;t<qmByraCUS=6A3l7Bp^ zk^cYqI`4QY`2X);4GmJs3emE~i6eVlWo0FMg{)&_L^$Vg&_Z_RIS9!}X0pQJ$R6jA zQ9_P!jI54xPFB|aQP=hTUf1vb-S^{h{n3A2InL+3Ua#lt;co`k0_a7-ZdU@V1>Y-? z?W(0HrB$kbLW`ZOUkj#OQl@vt+|Kj*T&7uQsnuy`vXZ6B-`}}>Q;kTNrL<s!+}^b% z3QG2FY#D5};LdZVvxm&KdbnTQ4aB{k#P#O{#xACOTM_38{Zcm10g{v-oG_mjY_g`# z#rA$wi+k2|x&OSs{h67`ui>KfNeJEREL|_6Bj!)=ybg>qweo(Y+9~o$TYFQfTd$RF z(A}Zfp-p{J^`j^xvPyTb|8}u;;u!^oEyz!hiOYcalKxMi*85ZYNXpLY(`_!Z7hgTH z4^FsrG-e2Dy(;N4HX`w*x;uB;ysr_qpyNf65hGb)YF04z8Y5xw)-}E)&w=ZWRkov3 z%mpXkr2Rbvz1SaunjL;{nzXs(Wo?}efiJ~INJ)0hK~+0WFkqaUbB<*;Zxka=?r42| z$zp0<mw)QagJ2uXtRtUq(dhE0U}f2cA-!9iWVc=Q=2a5i6P+zJwzkX}^OT1`5+{&z zkl6YGKHM9YbdlWjpQ$GT0IQ}E?@z?G0|`Rb5oOm$*^lzPn%*vhW_<mny|kN#vTdvu z`m-B;7MH{F$92K^tm!0`PM-Eis#q%thN`HswbC9LH${ViXC|a*{&unplu~*nIFEVL z{>zmH^`~JbVmrxSm9k&57j!zhe<DGyi7HqM&XF!~#0R!3pI_V5`-xefc$I9`E{l-d z@+i9U%(uY{eT~p?NS8jFlAYT@Klh0ter?Kg;h2PnO$+_?YLIL*3T;dlFW-poJ=)^r zVXSQNFUZ$nAUXQW*b&0;q-V1v+?Y=D0OQ%+JcnvO$&Wt6%iZVtqB?_f@>|oRJdxtw zS<dP<cyQEV$j=2z#Xh$SYEW0eLVvT(d2Ix@kPz!9zIU|?@<vHLXg8XTi#hja9_Pi{ z_cm_~w>5xa_S$ZP1@%1IP~tl#U(I~Acrv|n{q9WHvon{3;UDXjk6W)^n%BGW7OTyM zo1hJ6{+eS*Cy1{RGUBD--j|B?;@f={G9Gz;h>c9q7@$8u7}OK8taK4|^s$hrx@PzK zRjI>Lx~`C?d1XzRNX_Lq_FQiwVS-^vn;)dp3qAAFMvlGbrB9oV-C*nes^hwiH?-`$ zT`09|er|@}o381yQ%72*o$ZIKGuw!{{?w#%%L#UwI5(5{9W8ymoaf!D@<|8>7kium z*IwWog~F51#}4}BJU2ch!3$&9<!Ah4O;}mw);23c+$CO8*=?$ZfZ!=8N`DiD1?F2J z{(bW;aNGV*TFB;Ej3Kp*O@``5Gu9;)33siRqzOs4_Jqz`70Jit#tO}qLsd18=eEip z+PH^x(UsVJTqN2v{c(0LC@O>h;(?6853YIxg6YV%I*vHG=3@0zqCstD_<Ss&&S%(8 zWz3g<VmOyqcLvv0nUnhRQR6KHFi~LRuj_NVQeU=`W13scY`II#7HB;aE?$pLn0NaA zIfC`$?N_lo!~NVOUuWv3(e9>a3vio0Pzd_tlw7PfvWQ^GzpMzT)bchM%6R=}s1LJP z(+?Kes{<c-f8gxh6XNznY=~Eox<Z*uD_XK0^9XRgVO3x{?|^83>|m#>b7Suw1@^Te zEtI70?(E$ME;k3&h_J;LC|$2YMFxNI_lM@0L3GM;@vn?OCTy1u(BX5;*Wzs6@O5J- z-M_|@-e2R1`2zQ<m3C17b^(>eHrmfCV(cO+Cn@WUsmjBCzKy5L&gX23Y;<YeN||ba z7CtEhjC3z4Z!g9wCCwT<3j3+R)5Rr~o1)-5s$_XKM%U<1X1;mFR{;rbUeqg^dP^`Y ztnj1`Ee&&b#4ZDW+N$P8E8W<bRWvx)%mivwGr9MWIIXW)l{@N)Na8-X(7FzK*bz!y z`}6APfBKh}IDGM#y+t3pQJ}t&_66Hy3h8??L^j?<!S48<DL>=h?!Y85b^WVXao(ib z&$ABk?A<=;6UGC+)1r1WU?;{ynA>vP)(u@_TR;ud%*Q<BR(qzL0+md<Ug!k;-^{d~ zN|1*tuPl?6Q9Swih$#1$a-X|(i;eB#{%YP6-fH(3pUk*ur4?%1Pp!?AtHslhcN*nq z*cy!+=PPWw%iTj$j|ml?&@JO_^wdj8PS%bTIPV%xdSKCSCVCXE%V$3pKd77;sPy9i zB;1WPFlt2mYEbZ<AnVScJ^i&aX7jZ#zahIpWvENp77f(y5A1k+-cz$ScBFwX7l~XH z+D27P1ERJP(6h0v<nvat(C)MR!z9c?oCPc-72YUasIJ1-6;r18yD%Y`(E;5O{eCeC zJf++}F43+Pn6#7rsGlA;<?pJQQPhPc_*KNaBsKB7ICGj_c=thns8Ru`zVbH7OR^eG zu~6Zy_d{-ODsWExbM9cebT(f7OKStv$p83R_1&O(CIL<%2k{)4pG%$N@3BK#1(jSU zemD?+NaQ^X8_qmsGEpz7);lrDjFfo>hT8KQk~~$DlRp#)bTR3=28tw%pp2iC=4zC* zw^e;s=<&8+t`q&CbAVvI>3{7{k(+WLPzA2JshteJhL9`b)uu;gJ!+Mn${&3E{_Pj* z885q+?B{CfY8X7%z&|Fj@ODOU9-{V=|FfzN)7W?&YGA3u)SHrvmuw2s^xK$P?-jEM zYg!M7Y;+i?=AE+#@FvB`@9C{|=Yq4@cyHHhd(EFA4WKVq&W_BsxBr~Wo_TkbLC@*r z`J{bpt2Oq&mgA<lgq6Iz0BLk;GQ9jv(k%aQxqH4-zs1C9^ld*!^G4fSaw}V%TJ!Z* zn$sS6aJh>;^)ll?D|E&B^U`o0_lU_Z1Q|c13dV}64BJ?;x@CgU>02kHkL<avnlFHj z_BJgToKk8p0CEDt(N7<@=VINq>e_s-G_R>>dQ5H?X6YuE9a3f(cDBkV?#)%IX1$uk z`sTx(%@-KZ`#ezS0nCVfn$mx)$x+9GCt(I9$LW=Ip@wnMz{3Y|;mj7)Fy2)UFL_el z`JT;u5=Yzkv8oz6X@RY~KxU)#Ot;R4=7)}M7`14j2Op*!E<J+B2I`O`q3J0sT;(TT z+6OTCvSo?J&ev<>50O3%hoDX-c*}Nma1cd`pW9=}Z(oZyWVWOqj+>PxEIM(^sw4P* zItq=KP6Tv~n_1v}%qZNLQO=whEpjdc#_F)QxIM)SwSw(!7a4nGWw#Z-uY`=>54}-S zfTee~DhQ7~zqk4BLbBdmrK#4)uq2l8P_*1<K`p$=sf;qYG<x5wtqF|12gL?MSZ<vu zN5C1uZbz&RegNvCK4Uy~VyIru`rd`wlYe?>U>>B^r1bZ=%MM@7*x6iq#oLVH;`zy* z-d~hgkpK9?gOO&LirbT)WX9&tOn>@HyhIe8+w$H$g1vPHIUkRhh{`|P9cR>0NO?D6 z@~81q&r})xDcCWBCW0@!)w1lZO#>VG9`(MYUJlg#>sJ=Og9%F<JVzB;zHNTVQp`X9 z3@JZSWcCPWZQ6UaffdDdKJDqDd}iTfvH7bKn>r6Yzxl{^pJppMvcWln5{|7zzG!98 zFeq>{cyQG#BWzUS=(_-$R0Hn>TSaEsv?JW#D}?m92ld#|hL01wJC@{Ed(Ve)r39|C zL?3=Po2r=k9QW;3E^n#K6PC?LpR;kro%F;{6P`Ns*<FTagw+)#Gb;Ozw?nsM9^<2- zqt9CA44azG_w`|f_P@N*t{}d&yEakY{h9>2owV^yV>xW{8Y@53`rt@v(Fnghi%j_w zA<;j6LXCC9jO1mv25uLoj;PALHTl$%$Kj|p=`$bo^G_3Q#WTkxr}}fkk)5Tk###%R zdW>3<>`n^8;gE7eF<t*-)`K1dG2MbY{3m0X7A&kX`ZE*2^+P!b<9VcBtu2J5?hUPk z50leS@TW%5e#1|027}21>irY3oTUv#CHn!Ei?m<1#&B%PVZFSR<eJJ#duH9ENBFb* z_%ZXHp~oIAlk}gDqRml17kx+8W+W9nx&v~H?j9)ptWN!?Kq8A+aGjn%u`2$CF%b~p zb^`(;02MmvfTQieH+#bLN45rDcb?SUZ7&rS<?}V_uME!miVqm1L!O=C6DiP`^BQSK zxD#g8gyKyL(8<)m<797zq`t3b@*JxUmWioGoK)Z9Th)XiV77bny&A%{im{IsA-`2$ zfe6L-Cgq&z(P1MBZmlHOUH5yJY@t7<r!lWJ88Qx(rBOONQm(c)7{%AH;|P9N32!0G z&2@GGeOkayIQmtIf6Vj3=2KVI;=Zb%j6ALjQ63W1C3M%O#*0h#C?(sUMqzX(qy<}( zhQt=0w0vD>2I;LiF}`(y-^UNlISzWdX^cF_^<CXXT(o_<`8e*0Q~Gl^Yq$(MN@?_e zQ1nicC@-)|PI&MH5#8~)yp({%Q=dl^6UhP0-1kDqqD(z?eB86|*;MSywS*^qmm@!y z3yLZmBhXV`P#)<C{Ta)?O5U!M*{qM-pk?<fUfrEJVjpt{8>*S)f~)3_CN6aZhtnFK z2ESXXGl`?V?ahRZM<>yh^+<nzmp2T5sc9=2RB_CF66-(Nx4AL2mG<dSqcyo)@z6V} zTr<s4y$XE+WGC&rQxpd0m|`Z&E&(cNKAv=kXKhZ8H+2$4!eU?>9<y<HIxs#d#W7&t zIOl!LsDJWp`tUZ^`JBJ07OmhIKbL621lPw>?P&e%9Tvh7FN3%FeV^+pS6ibvxCT^H z#JxFGq$L;TdXvQ&%ilez>570-ba;HSPcy%9z7?c~eV0KVqDg00<Y&v-e2UCbKA!b7 zc80x{z4IrkV4s8dm)gp2I_t=(T!qJucYfL{Fn^SJa=yEQoby)Gq4#59LS!=x(fTOg z)h<MLLG_GVT|$#a0cTU%0cckF(#<0_cWoq)FS@m_M~#9+lhT^Zr-Mda@;M!sKNNc8 z<vV$qeaRQ$$g2p9Pe`b>v%TE?B-w&XVT<Nieuj}&sT5rMIKoeu($UnQ?7qEYgfyYM zpmOKivkQfXZZ)qb;xv);jGK;7dhKVL#kOwNdd3v1iqllB_sig?INPTYs2%{)A#S&j z{6R_s;+E3+0dGklcJ{co7xAJ-nali3PHNipX%#rs&oY7MrIV*46&k&L9k;zjIx#_} z$V66;pn-WA?|>}X_N|?AU66LJkIF<woDt_gU{ZR^f76e-`UX{5dF644-}ceoQW$VK zIERk$Zic=zl#@qdJs%$xy@f6s_P;Hsx=0hN3{445^4^_Ix}6*oakeGy=BaQ^A9aZV z->Ly|%H~qruOOY^=fB9nvxpbnAUR`gCLKZ+%<n1G9r3gr*cpxiRisOyqf>KHdV+sh zT~>B;iPB-wn7HC{{OzUlDFhNH(dCU#2v(cwp<&%&^SFF8?OKh_bG2LkFK{G**RMaH zXf&A5hx}w>2ykJZRx!)uabRTL+x+m8*3LV=K_gf6Dihze@VoL0M68R+m3Hes{WRSA z#wU#um<(^-@3!N=IP+b0(;{uy?G$vCD=XU?8YutjxBpJ(=_YXkZ63%^GzK4fp%fq7 zKSKvvtkYkoY&n{<^Aoo!q#2ttmvU{SIQE6^<~h#uBN7>v0$p2?9;33{v6d?y*T}?q z<V7aoW?t@MZf)?{^jWDxUG%&y#PwE;b${HQdR=Fb-Lk3$iXr|zOKz)krt(e&(jsbY z$7Piq+ca>D!#sg^uYs4Gyt1RTO(?+jEcgw)fv5IJr%Sw!5puq%i5MB>L&)qmAMlB+ zOXRxgOOp%xkxlo4fY$fM-7{0)wd{TX(|55`zhO7F?a&AI&zi|nXU}?b7~Z_s;kZD( zRYUhJV__HznJT|1nCvuqLN|_`Pd-r%Jj0yxjS>!?Vta!KUu%~TliAhHx@~Oy&hE=4 zzMH#&tNl#rI%GwrU_(!FlBnjo{%AFCWVMH4Eo7vD(Y+B+1V?~T&u`wW86?3}B5>TX zb+mj6*b+SiP(MD38^5QpFlycTD>)m<D7pUrk-;ZIOVh!-9R9W6uj3_CCSkDB0l@=e zOIE3)i#~LK7XnTm^Da}uck^OhmNW7W_crZ1_Umxfy?7QVRC|~L0v7xPI*<D2Ypwi< zPz@Y%-+mb#tEGP%a!mfr>Ro}&4ah4~l{<-cH@#Yh6XD&PL^?uLu>dU(EiP3Gm-{Kk z6f#%oFdBkI=Y8W)K<$Gte&vB21bwqDocL*4`~#QoFp{|GBK;tk+LTA>Z%LN4cxXNN zTKAIl6qA65ok1R3VOD3VH>x6SGDJ%&&}X44zU1{SnwXH@aC*DwuP*v@Qqq&w?&<L( zc!M@o+ku2n2K3|~cdYkNcZ_sDo~|t2T~)9Dj1e@7$G#g~iBl8gl>TJ(tY?(*kj9F% zwMaVl+?#7dQsc+9V}dN=AH5A%U#wNQGGz;~#(tLQ?l(~=ni9?G)Z9@0<NF;R915G} zGHe&hH_w{na;l%B`(qAI+DM8EPI!C-&5sV~-%%tMPguH-^>cbPE`+Eld7Q|K;yWGW zYTmezVDQPZsc>%~`l?{x07e{ddoMV+A2sE3EcIgkrBX~jJ2*sCWr$q<)dlN|Q#IRY zET=sl&13r);4A=M3BK@ztw6+`Uch9x$>8?DR$TBRvQnIB?_>08Qof$cD0pbI&M*7% z?H~2}a+m2OT_5sTeMvk#m0PM^{K3+u^u$Z;;9xC;X&Rifm!R6k;p~|aw8uIFVF-a9 z{PBh7M!Hpgn&w#KN_Y-ymrVn_bA@rdE<aOGLmO>9g_$0TloSpX%{Q_Jemn6d5q+_d zYfkqXY#Q~rbp~caRs|motAXWsJer_oJ%4a;2>RfEP<za}v-=rcI`y?T-%TXz%@~#z zu_Dl<_JTaGmvJAUi@s0^ruRn6mUt)7NebR9z?01PXHvx?ljE2;O=$9iQLR)>nd;FG zQ-fa!y06y%H1GWq9ORT<o7(YGV;Yh&zy(8I<AKL_BOZ*F@r`@7>sfLX?)2T>2t8aX zbideJRl7_+@;^C8#4o9477-BKv-N988AY-W(P(bv;Y4SaV!^{S4bpc7CNr6|Df<Cv zN#=_ax>Ju9ZeE(gyzp<EsJYWd4_4hwdHrglYEAd2b;6kTv!Qa4lQ$*0m~@Xalg3;1 zOp1T}P+-W8+<bj(AmH8Gy3Y3%)4irIwEmXw%x8Dl<k&x}Hh_?<j*~^Gs%vR}CR}L# z^!2iH#@sS3FTC`57!baO?=pU~mRVwtE3qfW=U?iQeXeH|{geSw&8`R04R7MF$?BA; zSTA-3(;4!nvEeHd&0=c{y!NNJ7WIR(JUK{5x~UsC^vV;-yyGl1osoWv<Km!c?Q%3j zoG|TP@J`r0gZ=J(Y1=*3K8N9WD3b26@Uu9Dv#Wiz44rU!YQ*AEv5sbO1y}4(iLXM^ zFAwsR^wt$%zr^syFgZ=zAfdPc4}RPJj5f~Nw5)az%HTMf+Cs_yR0Rpaifs6&e|`wa z&3A}|shx}1VKWzsYj#dztBkyy-i+mC|B`4GUuJ#DH0tNMOmo$Fg<D%^ON&2X1!bvU z*A&ojuR}Bb;EUvWe4tYDt|grg`DoJ$KJl&VRgW0J^a;2H-VYFM^c%taH`8YfdF6In z(F|!!=kjN$yQXD=g~!Xv<&Bh+d9Pl<x^>e_FL$gSH<}*PSSg;gir4G<q?YR0qOMw; z_1Wl(71ye~UnQc-E4-G@z{WEaoix~3zK8VjOoh{rgWkQ5dcgMpN%eL{>*7hL@p)O_ z8+ITNh4=hi&*pEEPnOiFFpwyv#1U%QRqk=Qnt|*$o!~gq>=BwXSO2sTUa!N|*33Lg zz~(@yZ7mr_6%dPkSF~eYWmXY(<mWDa((4dU;Y!KD*y9bXWe9Tdq5BuFiVXBnqd#u; zzeEeA-KubZjkHKH>WCdpeB689rPUz$yr{AXrqudw#rbh|>aDpg$zW)}5!D&r67(Or zOr4z9&1zGJE)Pj4xcw`|0qA!hAoH6uRVB-hl1)~6;6K`cx=Yp4P+dB~tiOnbP;n%< zBA;%ECe~S}g|%!iyo5<?bvfx7eizI<jwmOJj_YNK@2U?=cQ-G`Ml&gVYdg;`*Y{#O z^{48}&S$J8VZ2CCp@8-&IJ`$PZu`bM*x{N?P2L37O0&qLom=HAZzIsq_A5Nfp>vOu zSTe0rjHbm2)k+`Vrg)`hK?(IP0%JOhgO5VxDqMCUB5wVMU<!ou-Ai{J?r3yI@L4`j zoXCCHCOQdJz2?9^BAtLXFcCT*cPZYxfhk?Xpy$;O=_E?@hk>{dUxv4FYJMyZNVa8& zius=mcCzQkOD8>3x7E70Lu3}vQ8NDYk>poT&z3$N?U}I^jqOI50Ssa@KTtP5q9J6J zoR(#UKri_H$M)Mam%%?2>xw(YkKebD8#uej@xapl4`EM6zBhga-798kAihB-E{=Od zA}BAtxjQNRhf$&FYm>;uN`yc`T+7^(k-5^9;tx;QaN3{mDhhIEBKIjEeY-LpcdDj5 zZwaEx)8q7?T<?I((YN0FpDGZrr~FLmVTWz^&Vb*Mp%o9I@us(FNU7rqRZ|0g&wZV{ zO_nQ27Gig`HsYg#)q3J5%U-}WiB{p&^}`ok(~XKWLw(I>EE9sYo!@*C)Iv?tbeF=q zC|6p=w3a?8i#q_5t2H|ISYdgj;j9#C>k7GQVn=&TyPf5uuFe9q^k{*QW?-nM4**J| zLFB0si1!9RtKTbA5@5vcuS~IZoMd5|%q^%xo(sV0T%DaQE8|Z;c#dz1YhSeCfRw6~ z$$BIz6seR9FGN;9Z#M@-o*1kG1^X&Bxf{v1!<S)dG;j_0H<ZjXwCo&p<5zdk{4Y~b zIQj8=sNN0BJgQtS?V90i<2l2R&*N7rs#W&eGk3(-M`00Iy+zmFHoyU|o=t}g3c<_m zzJ4{>9X@D`$JC{W(;+Z!67$HHf{(Qqc*`U13YBWgmkoHQNP_N9$mzW$e#>xW_&IC$ zlk}60LX*W7T3PX$p&O1$=kMU_UXh(3+&!H?h*p3l<K%)Xb@G_EjQ?I2dUq_;$EG4s zTX+Jz{(Yb!bA?;9Juz^2&+ykClNi&rYNe0(-iD38StU+BIb}0|m-!e~%ON%JwiW;F zqu7!QCtqVoz4n>%4N^nqd&bgZCTB!4fy(N`sEDNP-lK2c(`MAJa}B!GW%>rIc3c>j zd7YpJy*Y0Ugq%#<IcP0yFQVDtfFxDsSa@no<|1%U!*c)Xu%<U<44#C65YFDZT&y9G zd%QnHzVZ6|-7C99Rgb)Jp+8HF>jc{Q81FgzbMm_{ct(gMN4;r1ijHcWYu4p|iz6w1 z`V2xV_i>U3$PvieSI*{yoa%)8x;*PsUUac+rAs$ZKd8z|&9A(jC?3iUrA^}wgvvk{ z&bhNXl1AkQSxE{@fXcg%&U*$RGr-g(5AdsIvF#A$(nMFGJ^F*YfeOVPDRs$o+ixMd zy8R!gyWRy_ayci2<`q>*b4>&sQ5r-0Tp8!&N6r{Iuxoj?kvx7iN*@G#UGKDOM;cxv zS50~*I|`-V?SKrkW%Y=NJ{-ILzhexe=tA$WJAjO#&99YHZm4NWjq+&bmSOaZxD0;b z^s=Sl=;z%zxloCHnYF9h;kQ*UwdkfqC(_#<l*fAK$v$uA#2$OgR2(5z{km*p?VN%< zSDEv<nO@UgF`yK1&UE?7y%}_XoJ^HwBg=EgOCDgXKa9+ke`{C`q5F4kgp>Dwb0ba- z%~@R}SI+>C=p41w1zh~6|FrktM-~ouX+F?Pn05-R|7qO<nxLYlI#w(*iXV?YdHU|c zebI*WeU$hDmh-i|RSdSK9@D(OMJqWIY|qi~Be|tl$KqUZmD+9AhH}I{vhZ|j!itu< zHY-m9>M`hbHe`N_mmlHw#ml)Fwv7FZ8$*IL=JRPmM-$d8nYMclW~f5#!`7fCy&qR~ zrrlC~p!yq-KnZ{1dzq_BQg^1gHR%+r<JY+;iliF*V`iI|VCQtwD9g#%sUPAE$|vrM z4s;_-o3<iQo-2WmapFQz!srw!dh7EtEi#XXrvDozrG~f(?xx)%m`|=*FMLR<#u~H& zq*A!&*ML+ZaToNuq&dJ7^5^w8@yDlC>#p_}6y&KE$6G{KVBlL+lU0MXfZJ`^{>Lra zsw4V1)shTCr9V~HqH>g<4q0hOBC4N(b({9pVkefmcRr$<C!_oq7!j?jhuEh9$5|$p z6SULGEB6DzEBv>GGW{VuD?sx5+^$0%$EO^{h~ThxtjgBvpKo>oJnx~_5QDDK!!Fi@ z*fN~8@L7Yd11G2YX1%zGX82>)6h-qAKEdc@FpxN6nXeseTYrt#7b()0=&n0QJ~^>< zV>kJ#Rk?!Ao2SN4ydLa}fdlseq?f^Gs}d8Y5IYC(Hq9mqC9`EmV&`Uk`|$T3$ITpB z&+(WA9xYcA)X+raG9$m7r_+a|FOg>iGEPm5NugNQJe|hNBIYse3AA@joQP!Q*zeKH zH($UtXeCD=qbDv*L?^SV$|B+%h3I1j9xOj?ao~<6ntfrRH1GoyN(D%-xX-~8OA`N} z!kFQEs>TXY{a7#A%3hRMJey7i(WC*=59aDp`qFk%-7r}$I=x(QC}ckB8!VMR4bd8} zA5+XC#evF+3U9F1NwkN|=+BHDz&hh^CA*Z8kWf3Wb=CfZmn)It-2+`Y_M76$u&?U* zjwF+dePSq^4*7KQB2~H&-PoF(tGb#k01>wCmXv?~Z%i|hs_9PHZ&UV7g<Ih;i(@1^ zAdtb>&F;F1>KT5{NM|EdK-B;bq)&$eS7(lM$hH%ve*cOUeyqvcl1Oo;Ec0WhOb?EA zG^_HaCfFD!AjUpcaFgi~rb)Or2IE6%0&fKR!A8qG{GX>~kYp$O06#^sM~L0mqzor% zs)2wBk%`MmI^uiIlew6<LyXLXuWvl^d>6{XBVe2qYo0U*t19QV&Xrf;dD=yiiC9Pv z5O0=ayD5M?x1AR6%_d|ZGz~b)c?h@4n8#OoU;T9Kp#OILiW6x|ag$3ojw6qwn64A9 ze<SK|73+U;nM>wCu|<;}EZ-2A0c*;@E3xLgeeYeQFY`9epIi<D!gnYByknn}u$}3; zkEOZ)bR5t02dF+TMY0shv7OhZO$UB1$k)3-!zG~M8jzvFJ5vjW8kCVl4h8M91gyLW zd8(2?D09FLksOZZ-0tvO1RF;1z?_=6KIbI__VrIme;sy}(d~?g+$a7j)?M-i`$BK} z`!^0=;U1~@bIWD4-0~6{Tnme5-<z;qg^fLW<)!(F?hCf=OzB-dY+*}zqAXj6NO4aR z!e~=!cGS)q{p6bs!n4cJWW_)~;19AB4SUNw@sEJwYnmK}*lpvY?q)9#tpRkrDm;P0 zgxrItKw@~}-{2AB*`zl&eQkPYM8Q`@56Xjif7t99EJIWwJS)6c@`mKV4d;+qX<M&X z@sTEiuro8gRANQw@4mwy<w+^QnCkY#nLbN8^djo@8B=p;;`Z*3mm`mFb**!bmri?X zb(CImpPYBM-s;<PQ#gkQF%2L$;-8qlhTE?d%55hcwg*1Q({1eH)#ucN8dWqCSks5z zvP=xo%xz02?;32XT9nL)XArg^rG*c*Z`eq(8nJ?fOUbvz<@CUd{r$f1ne-3fg^0(B zkUWcS#_OK=bs}Z`Z~PRpWKVGFzflq9$_^U9s~{5Y0Q{Rk%prN%Kh?p<y6W|toE)K1 z!IYc$Y}D{jBowC{g1scDS%hL+@n8i9s;w*MkAAyIlfB27nE&I*QtLmPiQWXOTWuPx zbQLcfNA(fb+Ep`<y}FhAbUY`gvV?ovnWFcFJBpyZ^;lY#9FCP=F?rGtX1dwSNJ2ga ziA;4?8Td$G2_Zy53HLMsba(12)<p%XWdAkZLcAzP`>007y2Ys1eK&g9qd*5#9lCyR z!&>Oi)1(k>5bun*^C7!yvF`Nw`WMZEf3m2}^h}Kfp>WW>o+J)Y?GcybYB3Du+xXf4 zgi!qz5210Z$?0&pC3OQZRSZ~ZVtAbx{QwYXF03O-W7dU=(qIB7bbV4?Le2;HYd;H4 z2<1=G3$8Db`JqN=1e_2ngcHpJq7)~V&BoJd?r^VRV{tjMf#{2^kYS~IST?{H4rq^c z>72}adBt8*I@(oeB=PSvq>_Rb*j-LO_zQ{Gc=~$=zA5{uUQNQ+RuI5ix4B&&;w7!} z<Y7CXE=xK)8TQVJ|Jt9inbGkF{MpX8;#+JRP==Sr6WD7Wtfa;d*}FH`;N_n<iN?mH z`$m}ycykp`n6ogF2+#=E9*JJD9r}jxNALhjb(wSL|L2VOPuLw~@XeiP=ND6gPUtaf zr(Tri=cAL!N^_}T0T2rH@qvftsl{Y{?EG36#ViC2`L{@8Fokp&z7;R%^hgXT*P^9R zrG@dFP6T&?zN%{>D4a6cl~xjk)4eX?pYp0;rBzq~b5T-YGAWA9vlSb(Y4Mw9r_d<v zGynF*jSShS7ZbX^+U~^T4IwMgF-(SnB3U%m1%z>@+Y=KQqyNZzmGVYBKqvjU-zIR< zMmV7lL*$YS93vuB<^+lC)SXS_n5ILwP1UTg)9vqzj>x)ufA<qRoEb`c-|tdK7?27v z7nTpm#O(W<P=EQGz&_x3P^eEc`kQi(d31%1Z=cNs*Ie*-J%5+3k@Df(H=47vm6Ti; z&^xT@))$H9yK3c*yM9s=Tc1cpL6B(D4Bt(L50S5y-=Vrerh_3k+bMaUDE*q0O!Z*j z&3o^yYWuwCwRPM7dZ;T^@9adOp)21HV+X1ri<_Wqs;ELGk0H)E4}Qa%2CPAqq$*QQ z^7<B1&a~&{XB_|GeTcTWs+IC5ACEgo){=grr-r*t<o>YutCL_-kT`F6yw|O_vloZ% z6Z&r}5xv2+kCi)%zd%SV2RYh|pp<_N8+vljl=4ee_X};jPf-Y}x-3)&6Rd!|!HxWk zX~l1kgy!iVbTf8}6%dg95EYvayD3x#=}cgr-qsL%eNgrk8Md-xM=WDWaYrnYBi)@} zc|5WU>YU3)4g7@u>L`x0tw>w&pN1I8ja_%A{$F`iUJCq({14^dFM`#F$x7$DdliUv zCZOZMjRU*`4h}ulkX93EKky!CkZiJ&D1&LmELX3i1>36-mF<0TR*@q)-%d`b+55fI z3E&=w%mp%mp$Tv@!;$O)?N?^D>^IZo-o2HSYK9v=0zzU;I|wlsq23qVH{l3W@&#Y& z!=E9#cVucGhMKBUx7<>k)qBMIMs@mh%5O_1Xr@n^IN8+Z74*~@QayOaho;8(K^s!% zio#t3{Q!D;tZiF2X{wESQnY1ee^v4RA_&_8F|dq0TFArQ?|-y!?BfAOBdeyw33UgR z49Zw&9!Fx?^h`N>;E*i*DX?WvKSI(9jezkCW+~o5gZS_TSVUp!jU~O~{e&E@bV+Oe z9ZOy51+702ruVstRw?j8M6PT{(uy^8hi-FM7<3q(N+wZlw(kY)jjE>qABU;6nXxcx z&mU4VnWEcUf%%as<1b!^n>sNZf2#nU4>_W~9aV{$%pK-&3JNX&%yjq`MWF#4IW!T~ z5b_D@oMUTu@u%gf^@R2CYxpa>c|s1*^f<oX;R{ERzf31F?KKL6BwHKeW>eH&je<v` z$iY!Yq>!F0ckd&4S!gtwL7tH(TIr+N&vAHvlv!hr;m{SLmaid>s7n9!Adx^~EqV&) zA3y(L-58P5?{~7Hm-_t#Hj_}di7HB>U}fWL(Me@6rGKU?09nT>*dqYYe5Fv0-keov zJ8vu>Hm$Y26g~WYv=zlLIliOG*I1P0Qq<GH+;;-va^_V^8`Dnd7ea+al_wBe30X3; z1lEuAPSFrfY58bspeQl$;5dXdcBVmD5iAgJsboH&?aT|w_tTVJwgojEBn-;0+>Tqf zq8?o@1Pk=`VkCO5obk9&`46WR?;@lxRJ;$5aQmq{J?jG49G9eH!(okXq8|<W4ww4J z7k^~wZbq?!>0wN0BS>i62?_Tna$pTfOJ8^#;k(HVz=VFU_+;noZ|gaF-+JDxkA=)p z&H+l~zsmT`BBcjT*5_v<Y`2}cYtj2-LGo$>%mTqx-oEBm43jYCJ+4`ra1);(Y?a6E z<=3lk1-NTltSDR*T+^EI+HlxV5J?j$rYI{v{u<cE`@XdzE>10JAvRP&1;5w}jzn}I zT(S8(wy@LwvGl?_peo?rujZ*YK2tHIB+Ir%{0|i|-BLcrPkXy<;?N?wt-kjH1AFf< z9HMUg7tt=Q_p=YK4c)^eMBjK~jvY-{FOx+IG>pfQO=*73jWruVd;n<TSvCXmpp#x& zJeB(&(xP8!1|OErfy;>^*j)h{eQ8<(G413F(dqNi*-reQKB~6j-bq_tlN6_vrtYPk z+;#`$I^~fibv17*Txtf;2M%rQLRJb~PzOA(xt(uWuVp0m&_12gSukmPd%>4-igGDQ z)d<Q4x~5+V240HbUyRy3U46^nMQ94;gSm>V0RFevUp2qmfvl0SJ_UJb^s3GqXhO$c zbY2Qu#uA>F73zh7jJI^GH;aV{g%l4_Ww_1UJcL(Lsh~nDz3a<(G}L>J1|DfLe0qxx zyT!7bCl^+K(Toy0@ct<fg1I%3E`iPt@aA*5`s1^csg55+GrL|}n~SWJ@W-NOt@w6x z_mVWB%BLz_`gKx~u1t;5&;;0zU;6*z5zI2dft|ES0MJab>q-d*4&7*w8aJH^u-|&e zG*0fV8^MZ9ZPjcOo&|ky$dBr2CW3JJ=;H9)+zo0ZQ0{{mg5Nk<Kx#shbSvo>6-Lr~ z4{wC_AdWA+V!LSFDXB;+NI^xyrdIJg!@EjE5RK^P!dWFzib-jIi$PWy4(HS+A=~lK zwDLYj?98O=GMBdR`tubMhS^gL_KUJH0&W5Z!(aD`K)wc>=7G7S<fU`L%>9hkcBkJM zw(7fZ?`JXzng1t~i5(T6&(@_WEp{i`r)1$3L~opP&RCk6K+vAsQ;JH}r0Ej2K@qm2 zazb}Z3fa7Cjt)%+6fWdr$i=5|=2#MHPZR4MX3<rr3x3Cf4euztx_k4pxdyI)hPd@B z9QqUb)2*5V?v2fxh-%hMMQb0|hHef7{2<X~6g{v)762(MzV-%7!(NKa?#}*gjtNHF z@~Heo7>-AVP{|T9d%U`8*4v=#=-@Y5zNc`hQlo20w4T{9ftC6w;o;O+F~~Ip{Eu<S ztd;R@n@xuO*b(SmsH2D4|9X1ZJoDh=@WyZqFNSo}yAmlK=6S?kD&dd4HlmyGZar5P z5+qWD?7f3M@p<c6GXAF&?6vWQaB}P&HMh3)NMyT#!|svN!2L=azSDlGVLS|;_50+| zoC|F*^qxcMg5*VK%I&nU=3j9E&EVycBQAs05bE6$CwT2HkqrRC1}(ldPPUY!iHzy= zuC4do1`+69*(U0s{<`vOP{<pIAF%RO{QESo8|Si<U8+wbq_`muz7IBCPMec3t3Lma zvU}k7kPhiy=iAmT@K8kdQ7w*GJpT894pvvU!*Kb|u;XN@>0UlpuXf5HMv;g)5&+2R zlG!yWPwm>yd~nEiJe&FMg3GG}8V!_Q%Y9liJGF#!ymw~o$i58W5IADica29G@CqO8 zyJ6=_{cjfZ@3f?Sf@u+c+A5-*75E8F8|y;$zsM)718lWR%s#J3ipSQZTx!K{1U>K8 zVQTbpk<vX7B&W9@0ttTm=0#F&QH#krSe2bPZiLd8qg1i>I+pRmzKzI@-N&e47V@pe zaa7UG=;jCdZ58;*{mQG2_=o`9w|%4z<poM9Z^oHeOd3NE!Jc(fAogo#p|tGul<yXY zuR;hh#X8>N&D!M`9q$+<;$Ax7Z|X@LhR!%L5Z#-=I9WG_1f@5bTC3rrMW=9Rd=!;w zR(OSE#SuKfQt7$@32ro?dMgBp#dex3MC@O9_az-tlLY_6rd@!rUotu7swCQHJk6g* zdoNI$*BHHBPN%)MHA289z<3BxSfGlbtx<z}4WMM)<vWtRyIvp8#3rD<Cm(ZdzW)y) zwAUiSv`s#N96J$^gcfogn*P1spT&-5#8yhE9=!4Zk<_Blo5l}9j*>v`Y9;t9ft29i zdwmSZV277)yx+KeO^w`bpA2udo8>#OtDy?L0-Kcv(RY>z$%NhYi*TrSqL=F4y>@)Z z=f@_b^s3Qk*2yU0r!ao-sc%K@*DURg-E$~U+Kv?HxJ_emE?I?E1|^o!VO_sXlt$Bm z7N!Bd#CNLht@1Ych8Zc}_Nq7CC^>v+p-HZ}c{}yk6rgKRN%}DMUR=?>Pls6^W0v%& zAl}vmm+Vv*a*OeLnL@9La~HTn{dzbc`~Alc0D^wqHe6QU!Gltcgo_6s%08+2MxDAK z3RC<S8s>K*<A3V2D;Mp1cV>LBC``Quj~j1)i3#^FPf43!#qiH6a+YAS&TxDln3gn# z4768ZUx(8c=(VI|@=Q$%H#4k|Y%Ab?#tQCdAje@e4oD+*k2NSK<L1+2tfMYtT_+xZ z`1dg0-u5`o-}TwDOFpFi-2Q<5+l}~i-;H=>dVudS+n&$vwXP@+{slr_{V?uH_&gIF zS`UZnQ%i%Z8v3Rs7}sG(k@^NR5~7(dZ<iKXA#)FqxKQ%?uRbA_Z2n{U3URr8U4CCs zST*fgmYWX^d-Braxty+u+>@|R`^$P^;+g+I==X<e_qM`*D{1Jmbiij#h54A-_L$C0 zL~523e*@;CQ=W#Kqklmphqt|}_a-i4Vo1c2!zs9aUMbrgTaE;8rcE4t5y1JYIjck{ zf$`)4tYu5xFsjtkQL@`$n|`@6|7>a7TH*IJS?qY2MrZR81(X;_nGaf%U_0A1mSB!3 znt3o3@e6+<Fk!{l;I%tWCV~IX%R?E-uQ4eaDiJB67!HYnx0sZh2NeW^+wJm9+VIbX z!d|32=Dc}1^7)IkRk_O##p>ZqJwSXSf3!4HZQAU1!e8aPa9h`xGeBixit%-ci9z5I z9(D@Gm!F-M@1s~UlO!-lU4d^5irk|E`V>k(Rz9@-upTS4ISowCFg*4KZLohy9YT;w zu>YYLJpr|?BkIIx$`pd$<{yRI(y(KHEiXlunp~AzltpC@5<m)6Ws$y@eB@jqRclsj ze<iO5ye$7-$pfAUx4I>zRx6ZlSMCXXt@Zlh4LkRspKrZ(ahcV2FgYpxKKxlIG;}sP zH1A8&j)OR~Y!;oYOZ{Rq5#(0y7B7<#(O}(upk;rg0LwiSTFKLO)=lEXRxNmH;}%*y zd&Zv*K3NrObv5yN8qfDd_Md<d`^UX>xx57--u=<c#@y+J5#PEqb4E19V3%4?xTHGN za#Y$=HB<TLecwd4;$Sj7-*&zfXJKrA&CusirPc<?l!80WM%~sazn1WDu)RoxKgMl- zb7cK=@bb?mOT&m?To0R2`I#d|jm@jztY(@$?a<K8imX0BhS3mqJaZIlpfv!4V=$x@ z-~I7NVInN{5F_gzF;kR*a9N4}x%(0FY7_&(!G?aJOvs}7p@GMW1^!`eC}pGxfC?bt z-m;3|%sXb$0GYIkfgfGj@xaO_;wWgE8T%CLMR#4Em}wwzmIV+Sz+60c%8~*Qc$^9u zX^@B<kzxjny^Td%ot=EYmQu2rpYr-#u$?$fg@LidPTe9U56W!b`H?Fj6*DyZlfI}3 ztGRtISmcZiS*O9Nb|?k4$Al`)d?88XCe(3a-44lck&8<B(r}D%0$$%=kafb=P`}Ff zbJC;)_{;S|=aQ*K0Udvr@q3i-^nhpko+DOd(}^KF$>l2{>S$hO0P{82J>pWnc-<=g zqw3LAn2dt##TalPSbm!n{*HPf6=sGX+bDnYb9Htj=w5~iKX-Q>FZtGo^$_g9=B^|P zCj@x@X-4z@_naq`E-3yX{ZD>{K;^aIGrvdYJ^i?@Hq@pceL8t}huVtI-*eo=kz25U z?di{Nk#fXTikWcJv`RYyHaMeuBPafyjC*q(66{kwm>b5Qftk;ffMziS0+GVD_0U?i zIjffS$jvnUSE@6YE%J3DfK}`B)OG6a6`-e@!HY+>$4=JV<!f~^<!1%S4kZs`jrd!! zX&<s%>lA=Kp*j_m3h8a<ufdY`u$y?USl!Z#voo+)#HFp5dx6h|56!~t%5bE#s(Ag! z4i?2V^Q@NmAcvzF0(qr6w}1nJY=A0NpNC9sF;I8(vGNzm&~1W7>47V5?2b`gT0D}V z#{QkPQ^}B?2%f9;vi+t4ed^c&%VT@bHcZ99j}_k?zw?$I>Z1sC4YITs&lU{+;D*k5 z7?l8yKzu=M#S_4=#<}012O^zTF3pr4wGRcKd1B@B>8%AU^JRd|En2bBbHH8U)8pM1 z*2o1IR@(bSpx|rr`jw-D-^kq0(Xj}9sf!RI%W%iu14kGEyT|kjfq}Kkqrte?y`b}Z zLF1D+<yRQZPvASCzd?q+-s3LP$(Y%+_-WJHCE1`CSnn6^6aRbY7KRuOm2|F~6Wu>- z5s+}X22kZQIvp>;E6~Rgn*a7Y{kzC_8RgWX3n|To+1R0P$}OHf;N*H}5|=4&h2Opm zlEfvUboj4fC2ky0+J)u#-s|E6&r6oPisI^$zm*(L*KWuE$zC6Yv~Rs+dCYBqIzAC# z4mHBBzn%+-Cd20fI_vzwZzFNa(<1*K`m4@T+yA~)hxYCDuDBo>rw8-O!6;)Tv5c<Y zQA*waDKPTq*`|VQ;Wu`$k9!SanCi6f@ZfN}yl}&Z<|CyuAM#vq2HS<GdZoS9WFV0M z5ARm}2CyKFfsY1se7xk7q%Ct$j>jAGEe#6LSpT}XzwY)4LvI6-Ku9^d;!K0>Jm(In z7AfV;AWV;;_wEN-TMd@47TBrt&I(1O1e}A?+-&c3MorliU|gQrsk3ORlOj_j4`Hn& zs5eJN@_E71!7AQVMR#qoavWihp{>%>v;G<|nLyo-vyOsbQ|~JOwOI#sKaq0Ze_sbu zU3KR;5SkW;X4hcT2;e7Ufz|FZe}^r^J899|^hxaPd>xn08wXq5!M*slrJ<C0agfHg zLB3offoS7SAn8Cu_bj|QYU1Pm;AOy^ssG%H!m;n~{Xe04|2ol+r@*z5)w1JgTJ@L5 zgDw_*w~kC$>^p$ia(;yl?mK`uJ}f0G1Z^U7jaspm=|oHKyhl@wUvZ6f5AE*|gBR@h zJsf`;lc?Y9LeF6`RN79Ac1e2iX8>vdLC*c$)dYHf@do0Pjok?FL;iiCpD~WSEvyVz z1P?o`L`OC_%|H{&Ia*rl`733a55yy{)F|Ldo5S5^caOpKV3YbyzsGcsF5r#_#ZxjP ziB)DMin?34>3P;M50f%}R0zh&2F>;ejgnBQjk;X2M8O~KvkUzMb#daq=NBHCQrkjQ zlktQGa7MyMS3J0TU&xQH{NAG5G(_Rv+_EapvB<cwHs{3@YyST@$m_M%-CKEoZO_kf z55obj-(>syj>@Z199etmx3twJad-I%-y%6Y`3bx)zIeYAngqPRUdqmOl&9N0`puwV z;-}d$er!?s_XIf%VUx@EGa^vCk7F+5N~uEyLS%NeduS?9mq#fEF6UYB05MVefk8v> zb%FJj_S<So%oAL4B)(!pZWU5k3Eq~4OR`|a3>_?|?6Lo^@53l^rkW*vs7QOXftTdn zix7Sy2;=wY<R9YGk;f1(#|)<YY${#9N=#1z*RH>g@H?DJ2Du$33x+F8(rf(~MXK~g zK7DDvn*k@Vd9OPu?=c|L7od6%XEJDM8Zph}@CX#B*ZTSPp_Ofo2R8h-m4umE@s`^G zv3G`bwnbQ>5Z3$50<+>-CyeoL7jmW6A5xEpl^aJVYB}_oKw43rAymQ?_uQ7=R8n2P z0WtkCS$by7b$2!!?QX;n`|VW21Az7d$XPWY)-Y@OM+fk0awp7sY4B9f)Eg+>P7e+b zZf{ZWcj0Wsk=vHqS$4J0(Ckd5${cVx(B|mQa{GiSi-Qdh^+AZ!Zm7UVf$TfCde<ci z95nt>_(xv=eWkRLSc}}5(qo>63g`X~Oa2=6mpO$8eAE!-(YQn_D9Z?XZPKc&-kA?v zJRlTuaPv7D<m8^CNuJQQbPuMiNC(`XmtoEup7)$)T7@~z1;1HZTz=$Kzb9&~zSHKH zGe7~C_ko@2Spxl{FHrJ~PhH);DA)?`XW~XHTY~cUJMJ&0{qU)4h|h}C|3v~T#leMm zq)9;DWlS92*4~z12!7qRG~N#B#AIb5<94gLn}f#^9PrpGiQeQ230ZHKGi8X<Vx1p3 zCV9)CDBGL+Ss<@<S6br1wOtV@fPf!pfJ~=@w`X!o7g^01Y-n8n^ZAEBm4Q8tb00uT ziwd~%S}MH}-DD1jf#*_XSHxiW&R~3Wgzc;6bfEdFNV<45FZjuZsTE$K!z1)3h9|lK zljWV_hk@ldw+W{?yh`zDR+(IPVgjSx=u<KS(lnY}J!^GfKaDAh%vc%GqcQc>f#Pem zo3~^oiKO4kl~w4O0Fjy8$ovl~La}!_(7R`Q>BNMT>g?Wh>;tAyIa)%q;Jeh=;6Rl@ zqaUBGJ_@3M%eOby9t1a-NZ7aGy9q2pVCp5GMoXJ;L~%gl(mHib^5$-%bxkE8(g`Qx zT`Kwcg;HI@ldkNn%8?d}n*?kQ%HE|0DUN48B$qbTaU*bGS-Y7QE5A8))h4k_#Cmas z)|P&$^Iz_dzn1I`sF?QE?QAcS9jr*=EHN=ErK9Ud6conkT=BT`NFs(q;A#D><(9Rs zPo2B|N$<JYl<xg^(|+*pP5bN5XS)&7X=HX<4?RtE3U~#-VW&2G2fS<g(^G!=I6luZ z#gJ^d$tc^ly*t2F)F*M+y-6F{{<lk-*$1XFa2;&H&+G19`+<9s^k$RKcQ}^c0I$%# zVq@nR|86|=E9RVK{ht-DZBKo@aKNw3_-LXtQjyLB(qM{Asr|<izMHmlN9l9d^RcM@ z147I+tj|wDg(X6^UT%%iKMWb`^Vn`+l>$S*Hqr?bF>EyXG;j4bPj6$L-7f1@aM$W} zN#&TLI*TxKIeyoBwZ{$qj6cEQSX*XAE#6BiM1MQbwV4+pmayB@w56DlL`G9Qj*n+% zkgqk^5Z2>CU>^{xUICGP$H7Xz(XUgt&5o!0x0H_@ul(L79rTJGggS*x_nS9Ua+RO- zvguiPr_^E%Jr2~iBc#aamGw3?Z;n3kP1;!%T4+qChDa-JFiF=Q#yNZUvEbb{7h#Ue zMxiLP(^K)cnU=fP_bC;11HjRq&Z*bF#x_SvH!FJ)fotV>_qAa<H?}sh-J2(7YR3;O zA+iZ+t15mh#1d@$U8w}P&2BUD4qm`S#?`ZL5p8kI{x&gKnY=Qtzpc#*#i@!zOB{#? zpoD3AyH1?F7LQeD)N*{Y$r0bN6D#;}_VcBZ{;P}8xcedhTGlgyWqoD@d=()rhruRK zcek@Af5SZn{*C-DnwKicmTO<R2UOq0{BEGQ1}{mM{Gu^Z6nq;Pkkv8pB;?o7OzYjf zR_VNT$;<J<Kw2oWy>8n+qZnGdq$z!w^Mu(Q9?MQ%|8jxz38rmyH~q7^H-a?wfA&{| z;cVnJ(pD07G!kCE8N}6~x6(7=S?2i0(B?(Xb(ecQCY0ol)4VA4tMXy(5Sv(_Yb}gh zOH&;9)9dbcn+Yq%UE+HeaTO1pz0jx>{k?7$XhnQ@hvP$c$5h1QtOL+u@uGYVXz_hV z0iD%_Hy(6g6=14MVn7tyZe3^?a$oTymIS>_X$Qd(gqMTeN0#`o=o*QJY)<1+{vrM9 zo*TgB3&OV1r@R(((8-s2G{XK!&`4|dMRlc5i?xxi5Urkr+$<292@bSlFz}rS-U|vB z30M)|Q8H@;Il9|QmrU0XF#om#P=}Y{cZNwRovBu#V<+V7^)5G9mpt`F_3DTHdzVk0 zoA4|sHx>Di{F<$kB=%2l?r)z$A}hi)p<SEyom1g^E6Fb7CuY}v5{G*tvXw!<m(B(y zOmul<Kje5Ien{bFUS)IesHRwga&GIzM}h7Qr7i1iYmS#2#xvoS$m-*e#iFg8lQ2C{ zp*#m`NUNgH_-8+MaaI<7MB5OyQWgFcxDfinBE<LXa*xwNl!}v?c5S}z&9gBt=C3X| zd^V47FQmn`?ZiF{9`D3uCuw##S}$^#bV_zOVlSb+8kmxFp4>SCJ;{I9F+p%fqO-JG zPtK#KqwW({WHL}~|NrXV#?7QlmU*Wp0zQ<F=hHlxf)o0gJ$X|R84T6WK}Ya5QSWHx zhEe71TeV)3t~vKi*#kGZ3sR{u9+|^+IfWrtG`tuluXSN{bh1U#bfE^~v|6#~5;y)` zV-~2`NY_<L>AUy?4M|zj{3(5}cmjVMX7|$UyRkA$iJ|QXP`bEXe>Ld3NH`~v159QR zT0R?Z=lMkVoIdHFYkl@o_1=Hn)n89~iIHKH-P6Q#Pp<3&sovB$ns19WRr)I?!$-Wi z1xHrOgPqyyZ;i6E^Ec&4RPX+HdjfB#j;iO=7cbnjR!?#xXrL20vGNbWgZ$kGl{qs8 z+m4Q9FZj;uV==pQ2Pp7C*laIJ7TG}od2DqwzS)=MlyYv(;Y!uXTXr1e1q#^eEz*9p z?ca<{i1PNc=qL#|2U^2KqSr-yK#lQ;g^6`h{B`zK-6<A@?BIIEm7?_@>vK!ksGrfx z+OJ6uc3;+@aHl*?3`$93CMd|J<vF7A;lgJ{Qu<=L<tvLT0HZlKonZSucYk&GmnaVm z#d`beZ#z&P%IL|$EBREtxxKBLJ@VWxc+E?ef>pP-<V_@Wo$|6`UA}eYP1)3@adel> zKbmJnvpdeX%zQCg8+})#Q0jKu?4)(hsLW&dW3U<tyh!$Gz+D;dof;DY0tnAn*-V72 zr(03|fAcNDI+{D^7E4!%n$(z1T>G8fLuvwCE8wuKNi?1syF}dl{wa3H=EZh58`MaQ zc@uL)Tgnoz>dn!gq^kxMOA*YDfVH*iTw;c7uBQH@P0)@gvWf?s){<vrCraEGDRY!n z8u*j6yMzAp71uVa3_$Pqo3>?zIK`MN1PR8PE7eHMzYEc--1yORx#2Wn#)}Qe73kLZ z654C9EFa(V0mYm6zSy#BBU6Kh3x>~j?Mge$)U!Y#=Yi9T#zwf^ihrIY&6zqC#qqr> z2zb=*s7JtFS!-TI$Gu8uBI{B45)Sc``NnOYlVhjGjw3;zP&$|50~8}Cl|8>+1L?du zC443nz?XbL-NYnk@4v$~N*H(o#HJBw{pP5>Y`fs|kTy#x^6Rwe7n6+$wgD4~I5Z>0 z!nX7OF!tv0Q1AU4@TpFz(40~<mT?lYWSg;@IAse%wjw)YEhS6LSSvAE$IcLrosumr zvJ4Hz3{ohhtb+=TnJGrL=QExA-1oVEzu)t`o_{L6TFlJn`~F<->$=|8`;q`c{)H^# zp_M!3Qd>JL!>oUTFj;8HSz%Vz^3@{Oa@RonnrfjP`t<BaUydV4cJtXi`pAmf1B>sQ z3w}+BpH-)n#*7_P0YMCAH^?N(mdp4lW3W*S)MxvCPWGd)dmwC$mY*eP(*t_lnoe1L zGjKrgYLdk}5%z=}iH(p(ceQkfd6+$6;!wG(EGuZ3I-C?hka{~J3-MkQe*(XK#Id%b zyXx?j2UVC|^j9zcO(J01CUXIe;G`LS-m6sDil6yB7U)3#*{*v9G^*${@)0oU<8vqS zY$A0Pg!24lw^QDsuW6Vec6gf!((55X9uRwiO*8FkZd3a67A41d4HP1Y+w_C{SZ6b| z2!B>%@_f4Lg{U`e6V@+K04sDiON2)qYJ0}Hr?OiBmY3sn%iYayH%+<c>1lcRCXO*r ze<Fk;`mOereOBe3by}6ISLAkHxVGu5l-}XF`~a=jX9gZ)qkh@({(wQ}K85Q>cgV`( zsUDw_eBM(V6)(ZhxHa)4ZC$InwC|jzbvNZAFHhFe@Mh}P_O~$3NNdGHeutLItK?<5 z)hWOqH1kXf2|V<U2~0p-(Yoew$1c@19%t7wnf!A%?&HXw<d@@_oK`ynKnFK~CuHNZ zI;mc}z{z|ju`x+Qr%?b>>3=W5g;sq{n~d%8ux+Mgq;cH_VeoXjs~MgC4bXHuhcAoE zZ_U#^I3+*?`|LiDZ#JwLU)8~UykBuA<C<Q)o2UDpUre59-T9}4@NbF#FA2e^YXnIA z^(hy!_kVo_SOxj1%uuh%t+frz-aaV`057c23wt~>XdEu1;&}_d=9%@8PaUwZ-21uQ zeQkTbeC?2(HAx294{dj!3GI72w~^0zS$Q1srV!Bb+x+%fn%}!ng1PfdPD;C^Jp*hC z3H^&f$YVSR8tF%E^cVR2sqV6-uu`)ROwthX^E$vM`XeXu{1QFC$HPFBZxLM#MJzQA zdq<!`<(~d9$?Y&avwYjLQX}R6k`RcABRs~fzKx#n?C%`M3~69Y8H7j9TBxN2^dH`1 zd<LeS4bon9!Zh+i?q4{Ke8+6M+VvJ>PW;U$$RUoFEvF*o=jj*LEVtX>p5E;|Q11!q zWVUQrbyj%iPu!3}ys+T2q#)uklW=5kuncnn(TdM+Zy;zez6*LC*5DteZT$57w{7aP zZ4V`?z13LCr05oSo(3L(KYQb6YsgPpm^262_MyU1k4Npzxkx9lrFsQ(30yDNB`5#D z_<1-b5UR+(AIwn_Kv>~#e?cEffEuQG^5iSX%3~I&iR;9@uL4zc)TTc;b*yzi_56t- zG&qu?ELOm=v-GR`g*In0NNh%%i2@g%%wMyN(*I@^Zq))~so#T(wzxN!0GlK`Cr37~ z5KNB8g6L19iIHjhPfm7(v+^uqiS`l)1JAiFvjAvH0F;nvm}FupfATT&{Fu0LQ{vao z`Z+j|ja2By80S<vZ(A*(mPM;9H=%4NKqq`@8IK`CBVHNrj$ddB{Lwq;gXMVo1J6pw z{q5<0ehWMY_RH?9I6H|aGTut`2h0+O*tn=;U43VQJq*ucQ{Cn%rYL1uztGp+`^p%D zrSiT87ImT6`ni)&?N+HRAkS15Ag4(`YV**F+4RQVO*t61IaofRbFX%u0~V%%2jCdT z%71aLD_Gn=QC)$qI`z>PcA;+;IUzgu3m0cVmbcbg>uh`2>_pa5;l@K7X5osGegff5 z+Lo_#YZ{@e&xHaDlOThe$}To`GybLIc-dS@9k#AyWw6B_NZ=eN_b+XeNg)-S@hCIW zBwM}si`}^j&*6W?c?UAVVjx+V4a+u~9LUm74Jy02D{#pKOhWhy*io9n{fgTDyt%Wl ziKm|`)ZDOR8i88AngKQ8albUtm<P=yetonVaf;d*TW%{6-FPkll^=J(Ok|)hNq`4{ zw}XJT126py)+QS0h>@Zb)um44=11&EB^`O6>n+V>gj%{praIzZzyY}k`?-L%@N{iA z2*244tO3`%0nL1A+Ho%k)5-35AxsZfgXK8+W24z2@mnGl1RFLz;(RvN&%^tY6W`?q z@-2eriqc^Q-9+tV8rp5lPkdYC3A~NAxI7key5oPU3&GQl*CzUDe#Lt%gJCyg6?`;) z##8`$;n8~fJ<rvtkFlFJrIs&eLnkD#HgO?_D^|edos(KmBoTZX-3=26{t_hchBVuy zWgbrqfMOjjc}<6y-C%@t`}->M$K$;~UzyAWcmZIqE8%{X7lJq*DDViXOp^1CXUUfQ zN(n0VBg8Hj+`;|BF;L20qLzx`eZXe;RB9<loZGFHMgbG4kLJO~z^h<=2GEDbS!-S! zL{}x&<PFDSZOJjRa`$%ILkS@#xAq@7-C0Zf#G3kS-Cn~zc$PC04ewWpjSIcGR<Ln( zp2e~4NloOZtmQGcz^v-5pVQ(dE0~9(2~!|1RG<0FuD|XwVcHhH3;5_iq(>>Q6rdZs z`Y@iw5vVm=dEN9VGQvt%wxQ$-C0TOk#itsug7kJ-MO^sy8L9l-)|{f*81gF6uIF0; zsUl0yP{DI_g>Z_(f+O!lCUeVpqJP@Ydg#mgz*@ePl)3$hvH>jge_8fH*4o<^?sdD) z2+q<R5WB`_J@qjY(|j~kd-Bj(?2eFI)G67ay3F+uuL#sv5k;1_^V>A^68(8*k;J}Q zg6B~xN+dl<makv-_<G*G3(ZN7V}_5as1z@M<G^QruziX1Sg=?|O*{!btU)6^P02Z1 z(j}45T$8>310~2>C4X_M=_XG<SU;ZGk45eQ`sDQ!`0wlj#?F?uQ>5=n$MO@r`}zlZ z$=}Q$NRWpH!_*KC*-l5MP%n5oLnM02dcB=%Wj8_z?l+;F^oFnDwG8kB$4d~R3AlIQ z7Bj^bPLsW^+pR=pk5~J?`d_~N|40l~KP3iv$7h0cg>K><=C)csVV}t=J}q<2B)-A9 zq_4L#2tNlmeu1h^^KolRe2@M!0}V-l77g@AwkB{Wh5yzTeqsaJwzR|Gdi3)zms>j? zR`cxBB}Swcn526%zg+1sc`Rn(df#9E{W+cc05j;{O0!)*J@rurw1o75U}MTg6XYy* zAWBc3_0)axl<1I_grD(tjK31gJ9dwi)_RWMg7Y~-J=w*f4<!q|*PYF%6xTz{k35Y1 zQ>rUvMk-K-6Yg}9y=~p1l^oK%qGs`f9a+Do{7zqW9~c8pTbMo13#0xIM?dKe$I<UE z1d0PclafZ<0t5pYj3SZ}V4uCTq@yMS2xpZL)JWVT)Q0X;_?m@0Ldw%%jQ*P<-zSiP z;oeP%h2f9vMa?4q%=|sAw&ode;#`}TMbl#p@D$Pe0LBH_?b-AO*rhz<N3lu{U#2gy zZKQ=YxPj_lO`gpzv@yQe*DM&min2-#0h4jOz}lph7vd4V$CZh`U{5gG)Y><<b)>0J zz5he{XSmfoeF`0a3}GPm^j*%GSDJxs6Or?4754yQ@bQ<SeS8{TNZU{bnP1mc!I@Br zwp0*$K<M)TBQaBc?^O(Wl!wnWCgTR?TwwzPPTjk8pNGM@@lV3P+WD)(09$?FXG8+s z&B@{wjB?f33IAmMywQ&bJq7#-owX=&M^EeR?Tv`-&U#`{29_A5S-zR%7DbUleDM_A z4>nz(qvrl#x%EB1Cw$WSS?{?v=Z-b4m9M>`oy{@eVC45tT36JM+&oc^XvzV0!2r2h zq((Lfd#XuU8)pKyV8zTw6%10=ng40C1l^Na66e#RM9K1P%fa?~yq`2w?tk5d(ycK` zcj%5WU?_by^IfpGeto73B^uQl@%5W0qqY8#G;L!G3t}GfRvKQtxbVg0Ro~hodjhCX z72~-=f%~ws2AAGAg-Zcsx8mP2gtf{i?TO+Av(#3PUTWemu?W9RzJ>}Uncd`RQfHl9 zRE*~pyohNLr>o6?)UdTTn`<lp6|yqd<k5nI9;FWRXCF%7vX+z_4X7T)K~R^uRBw$O zyUG3^p&$F`klt}eQuC1s8(LU2XlPQYdQUYA?|2dGvkeyaf^D=>h|*KWZt)8mH#4!7 zz@hpt|A8g`Z~uYw<M+~!L;NWZO1glLBg#*>Rf#vAurN&iwlUG4Xb&Bf9ZU9H^3T8$ zawNIZ6RxAu&G$KRm4m(YnZ2)9mrmT(4TN8{xEcRq71i?9&aSiBYGn(=N%PW=g2@VE z7aA9UfJfaJVA*z~4}hV}kCskJY3b|oUQ^&0sO6FQSnBvSV~zH+$oBxu3nlP(G{b=( zC2FVK8~QW{TH;|~vbwP)l?^TSV7qzNxnJn^m9v{y=~w3$M?8TS9hO5!w6-RyUhen@ zh{$6_+?>cy3)#DA>Tp3>1odecWuFP02w2$KG>8%Smm%S6uYmqwza3B|QvX&Zv=hJ` z7OAxJgV?hZ8_~C;w?r@9Y}LW-vDz@<N1R>_vD`M}Du12Q#gnj=4=fM6W1+d9(qbdF zYazYFiQDw==^zfg1fYm)pC9%tPk})Yd)2k}ovqyuT4$c^?&jN@8K3A@gYjp;e8vB_ zNFmam(7ohNSk(mnD*B^7og?fGFnH5w!}R(<O}vZ+*GJ$%YS^KyrG>gotjh70$4m$7 zRMSuiBOBFz>YlWMiU^HR*OaHJnz=was9<gRup_NFenw&7Bm@}GG{`_EORTo?f-0>D z?zdk0bpC=^?&X)wyz8~+JpwIERDZ<8om-^=*1|-Y6&N+x)puMGKnS8$bO%U4N+5s= zb<rI^GifW&w^83*C6>2$yW0pMrdt~r>wF;SB;?f$Q10!4>i`fLBEYWjLvLZ$VQ0HD zT!9@4t(8N2vecBsf@r+6cZ?)+jTq+9I7=`T@Xt-^|3noV98}?S(Cq^ZSho6@K)5vP z+d<~;Y)J(WrndsWpalgG5Pf-s(Jiuec}LqfZPipgf`7S>gLhYtm=>>H!{ay3ZfDkJ z>s}`V{S^3iP5?3lV2b=4U<1WIvU)wPbjpdZrXXp6+$h}N9D!XcYC+smD4b<@1HSZn z*!JPP9Lc7>0kjnQN~Od`_T>h{rao4_JYwIR{-N?WX=kV&A2vFUX9(1~r{JhOq@<SI z+ngi<Yi^Eh;bsa8fZJ#5!**_>PHlIy{}L)V&7MTmV@tYQVPJ8WW(OcS{yT?2PWQEB zOGe23WDW(<!KZX~?}P}o8H>y<>o=MJgZsCl8dsurw%S&eW^em^pl%voM=A8vP2^eB zOei|4;t|TkzM&+e#cL7V@{O6$>!@q@(?+_ruYKvyD)-QL`ZH>pn<L*NRw7mD@&mw3 z_0?QExd;95(3!u+0sk{F@KHv)cE5j7pb3yX$+fkBzHsJf6>m8kOU|@C!vHhx{T*Ty z(ep*$fOWTWut4dcN3Jw$?QA&|;n=-bv%Kyj&qLP$(ru%SP~ckluW7(};9Qu+fCCDj z7;AY*)#~0j*fPY<3-0(Fkazrhm!C9!NOSC80|X1)H>n7rU$hej_>F$*6_5QSJbj!` z(1|TfA))=X7V{o%Kb%izTMT-XBZk!brM~aAdeNuIAyF;fD}2s8T8}Y)Pj8-VZ)1Bq z`#Hb*2`|i&D$rpGEQVRN?JMe9ch?oANg>YU%I<A`uc?3w4GTXKUwLO#bNc)LIavSz zMpw97Ovx($+c^L*z&+#x2s>gS*JaA4PMFt=52`hHEn0UTPsCl56VFX~y~btqr`oM4 z8LH7mYMIn2VPlHkjkRaUwpwYa3+~&iR)ld<SJsk~GG8<^Hft$sIj5LCa+q$ZWqj-N z?O1GGrnhH%qQD)`o_Gs!>}iFv6J84pYosrkRKZ+2uh%~+&O2b$JJ@UYu6l0HzjLNJ zg8lUyGJ|bCh4?-~UkFS(4-$hSWJLQxCDhmG6^971Tt&5o+ev~GwbKNf^@Y{rG<b=d zBsCIk?v&BXqg}pXp88SNvv^5uA5cEL30}gKMkQr@Z{)_G$cMM2_sjB0XX-ut{lMEr z{ll4B3AkAdG6zH?EWH9^9}nz8k8Ubgmot-5Yv-MIxE<DiVZZ0X%Csm^MD*QCo&I|| zEw}vPp}s94%qUPxF+Hq0#7>}JTjX_TamUz=dQls(Y$I*SEcqe*IX_)~lt1|>G2VfY zBah}+ybVscDJs2I;Oc~^E!j(^Wb#!Wf05<H*HD-zE9QehpW69>>4-R7Aj6jAoT!p? zXn)c55@M`C;Nc#Y@8Og=-2%uWJ5B3=b|U04hW!Vu98-tsVHU-LzmSzSf_nr6DJxUP z_cz@oC{*@gs<YsR2_Ej>e>9ru)`;5qL)gRn1?u3=vCHruwz?lt=*Gm1*LJldPJyQv z{C7ci*pO-06ZpNbr?U#>h_P|aBUS?sIeQCkcE}O)amHY8wX2DCxH6=$16RVXI{=a8 zya88WU)YA+&N`IDk5OgO1X+u1P;Xi@-@xVMGKG6{iXFPKP`RNumXtsA+aj_{Rnh5| zMzmT1Q$*mas)7Xu2KIE`RlsTFGTMSGP#mwtaA5)8!Ldz!b$qyd@VnQ+;rr>&Xw4Vq z0>9kP=2_`qN#Wj%c>e`D_e-esMe5m2y<2ov=KB8ddj1n0>UXM1pUNJOsLqiLnQdw0 z#|+3w#MXz(=(w_82b?$Ij)P~)*3*_mN?NZu7aw20cYbYvV%fr?Q*F;e=DVVPtn-xr zNid0m@+h{?oop|e>GEsDvSrsz3?8_NH(&@?)jC2<)&o}J6fSa`8mYZw`c)hJSo%^N zwYlq}=}_`@9i@=lZZ{93&ahE1l?%kxH*ja2Xa3@>^QNfixT>vs8vIS-N3OXuX>pW_ zYGi|>;3Bt^krLv1u7iQRZV79qvipX%y#*##Fyz9-sIJ@`$RoJWMY;|`dS>}Sgs1Z` z`HRW&E%=)om$ipiJ}$88GSo_FL7d43^<9v6-{zFVb9zaqCx|fvu;_Oz#b^aEHwas$ zZFobKa*E!-LAC#OywaPXo^wL7yhyB>p6S~yVkO+y7(VoC>8|nAXztz}kEFC8-;0ya z9R^SbiDInmgF$9pLtv+{>Jktf>peNhVw_)#{k9QAc+$(+U{Y52)kseCtL}kdanoc8 z8LuO~n9*dM7$iy!g1|WRMW0Wtn(rWjXCvx)T%5=D1Z?(B)p92BS-rKTjr*D*A!l{` zd5wr6Jn3TU8RYMKj=OpvIX1Rs(Y^o0lVay@ixFB7`xVWIC_im`rPgGy`td_D84j^R z_DoI1Z0ZLeSRXz<Wn#%wFc)Rqc0AU;m!t_hH0`?A`E>Ik4Orw!h=lf1H%<i8Y;;(4 zisS&3WY>w{d$EOc`B7WzUj<P3%FMWEfD<)9Kff<p+q%54zq4=BNj80Rbjv!{eU8@- ziWyvSPK`b#XX2oF(y7hyyt`>>Ii?z{G-RN$A2Pw?pEKiX2!l-d=sCT+lfh8B)`e>d z4?+GMIs`&RRM97QF74`tq8?Hn2E2zX%xTu-h}Iff$5MZ_&htv-`G~W^ed0}h&mE84 zCgS~NNL!-{Z^`1b?wyJTRbCAx4Q~F8%F4^+k)xM&Q^8BAobl%$2;5@)0T`vRmn8>b z&t{5}iIpdN5;lK}(S9jnHL!^2JgvQHsf}WGrBbdonES}KApwR(Tr^gJAlL^tEVCei zSh+uMON5W+LVkY8YK-!X?;ESX1rRzqgN|*DF29yFqQRfVTDz-7XG&|<ht2uXJCnCY zm8~V?Jnwzajos87kW_9Iwcm@o@i~?eYQtnpBZb>H9I*}qq}xc}4&78D#^m`IR=t$p zbOqXOq91%N+l+yw37V*L2kz1O4J254?#<XA$S$-;2zwMe%zNcfzXcGSSXw{o$Gs_L z0R)^77eZG*7<>}imm6@Bl1}ZzXY4V|R8$IqDB_dxtu}Xrd-FR#SzK9vg$FsmK6o4r zg**oJPgj2PSv)xt8NN^9y;Lf{z;S8p2g5CD#e~O0v8(LsT5aPo1Mg1WsvTfY-iKVp z*!E{jyohZ<hiD5^@}zHMB9CI(QXrCM-zAc67Ma9eY+YwXZ1By&{fCsl=7gH4no<@Y zp(66#bE%!x$h0(pIk+iuC<tli>FY+NdNf|NFMB~ae1m#4DIK}gvGEbh#=!6k;7L}a zRTab<(mc>MPE412Em74u1Se2FToBx5MLjq{m?vYC6#zHzh|<1)8#wPz(@4N{&_&wb zTz<1EDLLa3%A-GKp@jHRA9XM8bHNvG%Ni71>4}9r3uOn*mEY6Zuh-ZLvL9Pbd{j?5 zD+HIzNo{Nkx1%`=1&6`ahE4`IoGsF~YvTYcc*>P~J8h><dGKcInIlpa{o8PDuQ*L^ z=e$olA*>-EU>NLsill`|j19IKPwbchb7<WiqFRlbk_6X~x%2DJAcEA!G9Dfs=M$uu z^nI^xt@{W0GD}LmaI=47+f?Q|lvCLcK_8;4Z$>9&ME1@OWa<Pd8tQdwp5JgqJpqTG zR(f2Yb~5EH@)FaWOcLHM7UGYPAJZ35x;}tI7CsWSql5@C>N3E0yg3`C;e1)aW54mi zlZAVc!qnM=uo!wM-}c1I<Lr%l<7M^MaL?`c(%4d)fY+N7Lf{&#&FW6=L#Qh0_xtVq zQeAe0C7+Z#+1C8$<1Fo^{bC8fB=DxPFyUOFot}<B-j5-l#9rx^jL~yiJ@;_#)sePw z9R1J&xaf|uQI4yt;Wg9Vez1VTnXBuHT{z=52ThE+=;|~Hs9dx&`0_LNL}4F<J_(?r z+We}7wK9!W(N(n9E;m{s)JbcZ^*_tf9R1wldG{p=9a5^YK9U2~$}&z%Mg4Y3^1aLN zLi^Y~MJ7o)1cN(RB&-j_A_Xt_i^8~(Epa$gY~@r@4*($zb~$N>`)cM+{rWVJy@D^a zfj<%QGY)a}{1*-x{SOWS)w(x)_QjjTh=eA1eVnv>j(209dgf<5{I^UZ#M1eX5)Z*N zdA>DcB}YlBNBhxr8C|Qk-;JUQ^PN3B*$$-DJj{@oHFf-nfHDj02(aHL(I`~9m4#gD z1%dpRn6uUfwYP(QIdBt^A4{KS1T62x!o;1AgOQAir;x%|xXZ}<w*UmG!%Vdl-QN<Q zu-yKk2wV}c<hfaka+~eQtwgHx5jj>w#A{26tSKcdWv>;VeS?;rj8T{bI-%4SQSS{6 zt^VxZ$TK<)z3N{wA{E-KjKf83;#SN%qOnvBi71QQV{ds0=_T)eVv<aSh=%L!q^xkZ zH*A80d&~r@{VuK4?S;HW_D%WoPriJthK?FDMWJ8xNo6;kaj4B{0$)knlt;Y|F)}~| zpUlhIr)za|z59r-Yj?7949j5=`Aue75x}a^7*Im$l5&d1)l<m%m^x5cNCwCou+!UO z_l>m$tgd>Wo#@;+GP$J*^VNR%Ds@*I6jsizw$l$fF7oQauWW7SxujU=6gPqmP7U$S zS|&2`AOzdCcTy{7`*q~fG)lL`V_y?0NYT+pCpap@$Gb5xrI$TSJ__KP47$goF**+A zardUwPUu--W7U7blFVZJ?0>_OEf7Vg0QE^AOo;`smZtdnFYGNl`XHvfROr+L&4b(+ zHhJe^FqKuNZ2u65D-dG5VPJYgB3)E@iffEM@aRGY^e6&6zm4v)O{l`OY+)2{`qq^u zlunM3Daw6_W~sAkq9UKfm+No6M`AtUQC7?xm@EZ#EM#t48F?Jp77Z?96Kv(I!WZ<0 z$C7y;U-xJ1Xok&D>Pz@c3v#KQ<g0x@2i$jl8GBmdAXx1slF(bT??@U}9Xc62P&?7) zuGfn!mS|o><KMuO4|!gfwu`0bygx3-a*u`<uP4nyFTWU;7Fxx0LLC*6{>~Q;eJb}< z0B~eF2x-Q=0kSq`>(jXM$f4VVbCyoknYa^GW9k2eNo)W~B4}d$K0AwHehp|XBs%A+ zZuYtbVm>-%m0A`HqGFc^m-F}qQkE^3<c~+5=d+5+`23@UXIcJun=#)I!ecw_>u!<n zy~`#i_yu}g9Axbbh!g$m(owG+VEF0BnZt{i(FAf=%Yz(MEBATUw)eJJGcLTwT-s_o z{C8&_(xW;3wcmtak`BV=nPm-&V7P-1BgJr4(_U)FnPNt7L9ALbI$j3A*5<op-^cq+ zkBzvky@5~qDgqR+Wj&u|EK$4G(RsADUbIv=EQi|YIJo%&d>zdcmL{tn%+a*hOqX+E z!Zpf=K2E(q=eB|o<a|6C0Jzni#Gj%mWGyMva1up#2G$E!IW&pJ9h}H|lvt+VUx>s2 zxe2~AM$WA3Vfv4~R!p=`G2Z7jwX=QFUnUS8>3dJR{H*Ly=@1IBissW<O;<B+vz!8{ z5vqY6gI_5Rx|by5%gbyr_ON)QZ#UW?!i@!X(CxuG^a~usOJb{~8zQ-D8{yKPYh^!* z5hv4Q!r3Y<N2@c~lvGM=xD?C0gCquv-)r<D68kbaV-DamkP3GfV$X6-!%4%oCBb7T z#USaF*M#vd<V>XXH*>p{xcfN^o*u&w<3&JN1LPh4<9K$DbvOCQp2IS;J$H=mZVs+W zFo&{_DZea(t&hl_ZYHyCoSUFiL1TA_=E@CIol}@N^5RE$BGn<1`aaMS_KvZFkMdlT z++iQo_U#ALjkX=SS%wK@N9@XpWcM~(<B8S_8F9q~3)yr7xLQ`48r38B#L6@Os@S+p z^d6IpI4{B1Z%vRA3YXjk02n#;TXP=)?FUO#!q58$f~F2MGY)LOV_=~V27)(mpzjNJ z6;F@nz8fHMitE57lU1kiXUSa71cpvFL~F&B7xHkuK~GI#atzPGCV)HX026RW3Kdc( zGH|Ey^r<&A{rFr~t&$l1RXKb%`Ey<cZL4%BvH8fDABxh<%4jjv?613rtoH<1#5(h~ zkR=n&+^zB_Tzh_GB{BqNMxI><E9l6);AI9rLaDx+lYodlUaylbte5VmO%Gv4b0GSl zxll}~h-0fL$uzU3d63oft|vsFf-qas0&B|IU!3o1&Wx`lA*aSde&~x}`NngX!3u&q zNiu+-o@gW~i8)wt<S_NuKNBkIoBz<l=PUypk^w@+koOJy0i+p4$^#n}siviHs^|{x z!j!@~WW+&pnX+D&3<+aR$pWH;Z)-=e?R4$ua?YrS?aS<aCUrS$#B@%F{<4G;9o5x1 z+0mhFu(b;M2l;eM=5@5O6WvA7ohWT>P)>UyV!Cn7&3NLuXPPuN_`Tox7gJRu54GA| zr6CV|Kimrm+k*$a^KlqLNLFLe9NcSl5KyM>cR2@ryFVb&@oA>pN1L`DZe0^~F=pXw zpAaWf2^7-+P6fM@_Oi!o7l;9K=$M6rV_ywkL&&yDvisMlZf`=QIA54Vlx2y#RymEA zyWF*TxYxt(Pp(|@sN-v{?Nx5cFX$_uePh*(jo+YnsEgnRDmpPJC3t#;eTdWOZD7>7 z@m{kr(b9t1=ciL`T89Fl8PdWlF=k~fW?cqXG{h=g{nmhr@N&QIQ|(X*(Q>vqCEMgz z$O1__-1aXvgdqjXX4HgrnG<Z2MNA~D{5#~5+(RFsc5e1%?z++)nRuw&Qz}!~0RD!0 zl*RCl-UX%n>gsWXci->M3J*rEs__H?=g)pn*hljLZalrRA_*QD*IXN;wnesycJivq zF*mI-uu~Y21z;GYnNc1T60qEG0#Z0Y;ztU<)Gfe4ru^+;gVwQg)XuNF-%A-?&GGi{ z$PW^DZ9w^!*@yPlczQAbTBp}WDLs>T#Yscph3aoNFFf`S)rBP>v#=l{!WX=Ptg{D} z_xTVdAREl*5WH1OD!<i$bK;ZKL#K=6(wZ3`kxn(O@I5?pUkQJ~k7Hi5q?&)ikBC!# z(%6X6To99dKl<5-*ud-H3s<_gS!bl8d>VO7DH|t}(sWH$kIN1DWyg*>H#mmA&OmzU z^(IPVzYQO`%a>=^OM7NgHj+>_ni;hjhi!ghQR@>a?MID_es=RjEfj<}bn8mc*X96F zydRGnm?B+X{|_VLxuV_$!t`&xNxY`4w3TSKG?DfZSU04x*O$n!OrnLv(97SFM?}57 zL(YoIkvxe0W52fiI)1sH_yD)dG*HE{?54g5MGzJ|y{x&|a>#%M>iP($OvmGrK;jz7 z4webcqk6dCZtp$KzcQ3ubTNEw5mUEbt!cP#+Y@x8kFOkigKf+$+`kgh1{d{F7*fh8 zs0}>sPwJ8kXP=*-cg|L<)QQkvoVuyV3vL>V`BQ}YsP1;>X_qfsqr;s+qE~Y&9l8S) zQ>##GLCBSn0LA($lovGb`(jMRm$EdZC)m=3$c(%0sJ$1j59<XfG3+hmbt;-Sim+6& zYH6l5w&PIApPP35e&v@>4j1)y*aOwUxj7{n4`cXQH?Dxzb-xMLswUMUPqJ;7&V4kX z&UDs}%OU2e%Jt2^AM`k{@igHL99@G_>+`HMm&`=#jE_1hK8QfS;DNTM=pV7zC?8Aw zY)2(d?1ofK`P;zENYNd$TA;TEJ%bp;WIf?WP83v2kfj%(4$d;d*leL0G*x^nig}Pz z^CaYi(A+P6Gk{FnSSj=7r;_}p>I?kZqqaVbxk&2wen{sFQ&!^jAp$nBHWQk_eJeL7 z)^kaF8L){>t}^LniXR_B`q5=3A0p&bP3IT)p3IFQ3JoD)-K5W$`!sO>R?o{#zTOSf zXp)Hf98jhBF1~Ywi!MLY+{&)Y1%$@5ZJSKm^>;Z%gULZWkhiPFnaE9fnCHs#9IjL` z7A2f}8)CGvmEH))+dBLa11Gt7p5M5sCyQX$qu<jp_lypegL8W%4)sMo#e#U+E_N$z z|KOA2pa524Q;XTqWFh%7a+pykfFEbr&Vw`K(J~nacHG1R!bE62n-GyLmryXJdmCi= z{tKP7*#?UQAU6$Q#^Iw$;2H`>h_&3dNgC^dFW*Fd?FVxsC$Xs~N7O~RbM`&zyC6f} zJ~1~+vYvmZmE$l-MLO_M!%_m4TxEt<50!fjQlHny9++{F%=f(OVI<yvOY|i3;9gy) zRZ-KUM?|QzHK0t8-hlw6SuUoxw+9>%+c3BA%eHtiK?3~d4qw%h{FSO{S@QWj)`~1A z%qbb?i23Yy#UcCtXsg3K^(3>V>iLvllx-9IS@-wxGO28z?v6x)Ea@b(penl^F0TPi z70?^_BiriXO6HK{-^c_xB6^{(WX2!r$BW2f)u}*wvDFI-1O(aSfO&OlqIOldy24(0 ziO7J?h7+Pxq%|M`E&EA4Z7<t6$i#`;ZEC+Zis2dvKnXjKJ!AOiuMI7QWS#f&lGM!; z(pVB9HqpJ!NMrRHYNJ*Ay|%Svus~fZDwoP5Lm0OEW#AIt{gZV$8j7G*)ZWp*j0+CZ zH(`as%z8F10~|ly2}l!?{dz*7w*Xb@nobh#CUVmf25;AijEB(YNgVKUqPL`LmVu<L z2W7;~jru62D-%mZ!zx|f=0@@Eps=f;z?XIIj{|%Kp1>8ZP+ldvI_Vi8Kt?WEMp+-g z5~x1j6}&LUbB$V^my6h*nDt8xj3R_S{pQ}HBNZXx7u?x!mnhXw@3pHs9y;FiPhfJw zYybP05oYob13(m6j9BdG-gvpLUw*mui;>=0>sz>IOhx=a_BjD;50iZWncHIKnAbHa zsAfR>xbxc>edLqNk9leAmWzQQtt+F&Rb2Nj+*8j9q%-MBp$%wnK!vgjZ|#PW(-ivV zrf0Fp0-V)~?G)(FQ4E3L#GdZ<mKL9r?-K_`Gd!6qK440?;@F9m@QxbfPPmF`7n%8A zAZ3y~33_uX4|h5Jxyy_4uXg}U8FU~-b_9t6#!vO8fHEa6KfvQhZE~<1-+?-~Qp`7$ z;jhXL0pkQ!357Lyep*HK6o?8M=TOm!I3y&G`8$TV3$ifh51kbC2oUXVQXY@~2V4>Q zB~n1=vbaVegd5XCHx4L^e$ui-9_Ony1{K_2dO-E`GsA~Nkwmg!xgSDez-%L?-omns zHs(XDdj3cGUqAm|q1kZGs#>!f3Gth`SxLE!?eneXXXQ-Sr{OfgA{T#~?c$Oz;qpG+ z<8Oks*Q94om8=|^OVVo~{A5S~n{=_hxK<GOMO*>a1kJlHSUzi-JpE|$p3a)5HRS`2 zYxcaPs_}NI0cG`+3cC5MJR;fMt%RnlVmxS0DBUc3Oz<rcAKF}nya?BIeX1Vl%z-4q z$Z#0|NnCRWVrM#M?x3b`DFi9zXXB2D9z>p=ChZEZIqV}38Pog}y`C~#B;`e*xuUi2 zM}s%Qmb9UQgmnS7W^ui(WNP4(i(sG!OkB$E-VYIKy<h*7;|s$%dJ3N0Kk6fnz+^k5 zZ4DkY0;GtgdrwNN%JIrl$F0!7B;Ko7u*3T+@+%2_8>hxFr@4l~ijr|EEd$K#@bKlU zGM2%+M7J3%<EjVPQL*Ka0Mnt1T=Uz!oagBTXg1luz$Sa6oaxG6)QsKTUhrJYK&hZE z)$~Q!DoSu!J#d|Af;T+>6a5DM;x~JK0ovvca|83Z=tX<UwdjF`WstC{>f9625gz?b zcp@94E`YzuVXS&*Q#U30<u+x7Zp=6vQSAE@n)cJMPxtpQPYmF0hEwu?73~IWNciu7 zskTMBubY!dO&Al(A}D+E^RA+x=Xlv<HL&Blj?v{xzn2BIV#Xelywd$uD+j1F!<!TK zfY!=c6&mu0olS5+v~~s?;dV3wa_gT$=0-N~lL@#OBtM4TitM8)Jn4{254@AkFsE!_ zk-iihetsIkzHwAk6|msorZER43}l}JRRb|3IP+n(R%cReC{cuHaB6i8Aj0}SVEz{Z z|GfjWH__CCSWo`N`oPoVt&2j>J}m0bem4UP#%mX=>no!*(*DDORL_FkS#Hc_hp7q? z-G}V2R_pgQ7bNzCBapP+QH4)K4KzZXj57m%(>Xk~5$>VA+qqi*JT&?DMa9t1)sIcr zS5jMQX$&ijx~ziODu;+~yTUbeBO}g=Aau3+m3mH(b$JX|K6Uhvq-v)Bf51mk6IJh_ zeHM!&&SYQcNSM6$-n(BYXNTdf6?=&@tBQ=Odfj~V!M*waLza=Y;qDlY9-t}N+_dgT z%Xj+mL(<5mn2|F(8*OP0gbi;{K#K|1r!;yZ$%o3%O0kZEQem+w)XZIM9!sNsGlUkc zCg}vt9=XUt9sv$Q`_RsxN(y>st1zQUAan4;9r87BPys_<!cNfSZ%NEg#@@NyPqLgy zOdH}@My7v7+75x}DOY(Q-0kpdhw<1AfZOG0|2Zt17x|?!&6K@wGiq|Awopr`&mqZx zQq<w1PUT_cELLU~`4C&<KA*jkBba?KXP;<#%2sj__Eqn0N%=pGc=!GIeoobHA7l!s zG-?aezrhYIAS~3L-(90m=V$v6Z+0~Et=<RK>Mz^@q91(%PFrZC+jfIz+n36rME2nm zu)j&eqqraguhn-JHh!EsruZ@L(tK)hWID9D>`=MVatJEJ=hGc&{VfA7tD`$lt;KY| zh+~Hp7SV2(Bo7Z?)&HEaAga7C<bSF(r)RfTk%ymvj5%RIjHGNn9NjMh4B^Q@HL>jw z=&b<>*ONWEagb()E7!zzgS)(J#cbRGZC~<iz=RD0v>rzxZ#N(L??gDJ&#!6CQ+d`g z_2-#dW*)JgzS#gBbtFcFJ-1jfq1KPnT;g{j-gMA{G@d>^omvV#u9aiVp>$=JDSsi3 zqYy17TVQ3s1nks$f<*MA`u+Vhuqf^FOH%Tt!qNQuw+aQ4PU@X7<S<L~jOWLIKw(RX z?wW)x7h1@c1bWN_OBZ<7ltvpZP*?7?oRtOXLf$orCrLTS*(Rry-an^d^a^r1QT&%h zyU+%Y+*kl_KxqCd&QjvJG=Eu+$f<$fU}XEgO+8xuDU$pQkQ@rhD5vxo<7P%tpYGlP zYiSN^DZ6BHS-WrU$*q0KQ>3G!lGvP?X}=jz({pix6IX%QL-Ye85yG}%L(@o5hNM|P zWDUUK@}f98<hC&7brm2wp@}9dzTeNsnt5mzC=I1{r9;Ev^eqbW#xL}cIdHF?ng=|H zc03XF<giCZlRXQ39#NZ!X0>&)&5G+)ZQ%isuY4{GJnk62orqR)+npScuUTJP6%jX@ z{r-5Wz%fM0B~NeX86RRB-6g&Vo|Irm5P0J5)vc%?Rsxl2D7vzASFEy5Hd!f)p_m66 zFxtx~&@fX-UMt?68-n4kzlxR0R7@$1Y3|;ks{GnN{rD!=)FNVAZGj{R_O3l?nGFiJ zCH+&2S-1Qo2DuEI>?olCAt`wFXVKVNi%>bqj2%J=Q$7ry?@sIyLZSTsi7Zai;0#;7 zs2=p)EUqfETL;#AyjU0{=ojkSL91=swYDnp*(KD-^m^;Ew<H7z+y}Iea!U2-f+#1m z?#lakNZ3kUE-of~6huH`z*8y@8Zf%9M;fn|Mh;9#R6&yZ&4Q?-CmU#bNb(*ynzuer zlveTdXMQGXzK=64j?9dcF7?u@;R$Pn+l*8`Ets-k)oFoA%`B!1m>{E{!i?U=v6uj2 ztZz!}Oy`>r9Vy`U7|p9S{kGG*{#m&x(ZSOm#%xY=h;xynN1XzljQU=@3HCm%-)spW z%)-@;Pk4AMZ!<kj_>1^*<D|v%c(8vnpbH;0PFg!C_IV;7y?j>$?_g*enUmE;8r(+I z<fr}lA)+L-CtAXA|3hpw4P2%XSmd#&H~)qeV3g@^;YF066_bh|3$&h}Hiy})NQJ-3 zTk))<D7AbS@>*HrFCJElrScdO3ZJ6|mrX_tk5Utx;MZSMf9qE`^IET{FGrSD>WodL zfm=STF8bY1Y_Z4fY0nA@*@DMim}B@NQLHg@;j-oYDFx$grX?=U#zOw_U7XxHuzuVe z8|R$OGNk)ri4D^=9+DZ}q_=Vd&@ecl15v`Rn`z(s$u<h{?t9jqbdqqwTC%_=R)i0M zu1M_z_~O)<UmrQab7}iGM39kY8Vghqb)RlYr>g<sP@Hmg#~%``;<vW$s;a)-fOJ@! z2InFVGn#?paH6&pU@r0Nc7E`rF@0Avu>fMo{J)$ZKyitZjS6dQxg|YE4KK6vExGmC zaE_W-1dpD#IjVTZx+d|oyvw2T>{pqoU3;6tZ@>KTa!`8&^r2uKfQR|H=CkkpD5N$H zype!BK^72*r5d;>k3ANjTqdt_r_qYy0drnGYw}f`t*G5M18x!D{^+hf3%qknrx;nx z5x|oQux=cha9ZqJ0EPT9&{J8WK5}f*{ZU;GlvsVVSGTb*XEjVnE9Zwd!JE{k_Qx|5 z>E)37{hf`@FFXgwCA2m}ko~sf@juoUM4e}T`adESAQA-;H~HyIulxey@IDgi)v@3i zlfr7Dl{yJg?Ofd2%5-)3=v~|~j@AoQWz2_MauTKw<;>3nI#^V<JjL5N-h%iOTl{Er zzS5m+K|}%4W2z%rOVXpeyuo>dB9h+Qxed@}v00fFd{i1{!)#X#Ew7nTgoVs>%=;@r zgc$Jo9d975d-&fj3_ji(?~zh5+cE$6i!gL5Z`w6};K4;b+?(m24v>oz-Z{J46gdnT zTNdL?0sO{|OW;AP2|H8-FY&L6`a{>_ll45#%;R44XS1vILi3$wR?vBu(Bz*eBS=P9 z7`60=ZaKVK>{hFjvQzC0K}P?XJn^<+SHh$>YXzST=nWuc0cT7_)&HrkkR9GysNhoq zU+Qpwc{2ozC%k4$qFEf$Sf^x3EemZ}#6!u9J4sNoDF>wN`C$c6CkB+Qm-Fs0`?@9k z60c<Z=!A=JeBS<&k5T7^>;qhHJx38#otxG}hTX6rCugVDxfzi9X>Wr{>%b@r=+pnf zW-QD;PRd-wl)SGh038eXzD2Gzs6kq8Gbf(!wAJiH;Gc|AGW*?$TTWGl)K0;2;MdwM zX}>zYF#AML3c;_)t1T(UUdF2=4=cXeEh!>5<dyJwgqu*A^X=injDH%=idhH6XL88f z=`9%0UqFfuGNC8$;A(!|PLAW4AyegF)3E92IOB~$IPAglIaw^*k<;h9!OqL{;aIi< z_I`r%Kv2JEL9FHnx(|3tO%1mi?3RjdRVD33Iq8F6`)cA{&p~Hwigg87O`uUJnAY^| z5|8kwX`v#JFvfEczw(!(7E%%u#KKcznb$C*>BOF|;yW^`X1($!)bHZ<th<ff>|v}h zS{$8P_lgEjfsIYR?Ko*Cstd3vE-+_~<!5nqkq&K+eAh;Kc<-{R&0L2n6Ls@TrO4%b zQEMke6*O~f<(|sB2o`%306f9QbU!_PvjOi@+}_ixT@HdOX8zV!3ITK(i81zOg4A5* zrbN2>n!%gC!+&uY!z-?5Ao?)XnQ5C9F!?47(8O~-aD|=1E;vWEZ3OmxUtHMM-yEGi zF~6<<)I`}jwmR#FywUk+D1WNjU25lB%f8H_w<bo)q*F@sim?W?IEt0ebGNt>-t30{ z+0z9JKW1-(r6Alfdg;h_M=uj&)P_%q_Bc1ZJ#YD2$;L^wsWO+c&I`#XRhljV)H8mj zD?jjle12KN`#+r@ie0*KhL1H}4&%94%ihjnRs^MGn;7cm2TUdEKJ^<Q!75P-8%arN z!)?kak8VWL{!D)nNap8K2ZLaNl)dRse_N0#Uz^*i;m{a=z@AP`i(c?NpDn#;Za~rM z`rp0}S>RXmW`KK`%uJcSNS$mC+!)Ny&2i&2B&dugU{4XGIEXGsoOTIqbS#t_T9{33 zoK#MWizm3|51*p`(Wu}-R<u~w`gT0yWw-@#f@7TfFO6jp)3*|n8k<tE)QLVrm%$dY z6Uv_TQ%nPXe7GDwdi&p&4`KHZ?doY)InggzDdvh%c-3-KENHbGfU;?rJ|cZZlsqYP z{G3OdUui^~I5iQl2}hGhR!>3$a;Fbt9avf@54+G@C=H%m88Mq{bPxSWabFKbGTB{{ zcJe{sR0#%<7><|^DY#{fddA2BV)^$Moz6L?lnZuua~>VgPQoRvo6~f8K{t?l&zY~J zK}+;iJLwANlhOjS7Mn>Nv~d70xf2n#xt3WDcNb^fn<$Iy_(n2AkTk%5W5C7t!RkHT zynWbkYjxpx8f#oDr$^EAn^M<F6P*Z)uZux#^-h4&e;8oiaw6(-UvxhZESSh8>QDQ} zbPJMtx%c42HL5eyB*o#yb;5sXFZWl+O{+}37<G3Qc(YuT{=yzWHYx%1rmM)#!h&i~ zq+w>C0KP})kn*z=X64R`TffcGlMHF!xy!8`rbhAI>#BS*=}RU--_8w2-jq$ZSo6kx z`cr!NVpgFHOgom`*KM5q>rqfqmPjNdY)5AM<=xYB7tSWFf9^6=()2?EyAbH1BQUz= zmdF1|YJe-JdiK#IJF;!LAgZmll`m|?CH+Rrv=j>=pVM=D9ygl(>3r;!$n=OR2_Ir3 zpHRVz^Mhke@Q&A;!L<(T>gf{s?+33@{?=MtbIH<9**wC16^+ghi|>g@I>mI0Nuvmq z=nkATaF{L#Ca=z)uorDj12;=0tykg>j$=IqEDJ9fS->3SP%ZtBV{e13s%g<{wd<__ zl>#@LZYAo0lOT(6585npl4)Dn7Xcn;3u0-*@89M1xBLoaXP-m0L>x31*@JXomCZi2 z@CCo)P`p$AH_uTg4H*irN%58g$CY?D#C|3F%JQ=N?{qR_`us%3SF;*NRoXNQ3+$I6 zEOXyQBp1H0hoo7seR~3Sz0oycx8zJ`+k_7sc2n_i5s$wcqzEo9>KCMFLAMNWOPJX` z@6u2Xr$Idq%gimm=g!4~!zLGf<UQ|TqzQ*>5`|T;&uRA37Zm)H)1WR=Ap@Q5XgQrH zkJN=kgXjJULbTTF_KKDRqaR5F6ZWVCf7qV+{0>=IAs})#*hsy8HaPAn|7MC9Wuh%3 zgE-4+p}qyj>Csv{b16s=M^B6y;YLgr5^>M$g}%R^%Lct+h{5-hX$|7(WNAPgnOsZh z8y4OzgC#0J?3vTnz|<xBiVCE2+YTT%Sp$nB_+yiuXiqyU%It2~=HkFw<@y#ZG#e<^ ziisyC%C`SVf63?;qlBdc7u%TMtfl{19<op){3BSK9Ab2LcFrv-hV>z|H8}sK6ITfq z$qQCi_c7{J3ag^C%x0T7A-}Vjn*lEq5*PD>6<Y~hc>@mu-KYFw!RdH-2`m)^axLk+ z%N-mKWIZVw?Ekc9O`pUP`S68cxjfdkUpJLbVuYRw9^8zCj7xlR`7v!pkj<wma`BZe zThhs}`=i>X0FuPrck!N5V7UyDlCD!?OSe<IKc9V8WS<){UEhNyfPb7=NH)bH6LD*d z?2iwUUtQGyhTrMCQt@8Z@39>)cT~*#tKjQ0p3x++H<!JbYx_cr`l4jMs7X+HAUWpq zhWcBUMW|}0BWAwGzCV1B{hTlFk}InNmC^+7+Lh>Y)~=7_gHhyIqC5a*GN(;PW2>i> z)~1S+r4?Ec@c(#BAFtnV)9#yXwK%jQ2{h6=h;zJW5pr`M@XUhv13``*nN1&`9ay{8 zL*9@)N1%@j)Vp$z(d*D(jv>&ytfKBg8{yZe<g52ZgHf$+u>y(`5j=98U&)I3r)3pO zJO&@;MYb-XF<yTeP9I`>M;_m@kuTbV%}$8C+}Vr-gIn1ze*b9H{90V}=@bcz!Mqa2 z^wpmfA?ZE=;am`60uIXI*bd-{cMQYk+`&f)+5Wy@*m!=ha#HJ2*VhFl(jA`<@*iQz zPZhfCmN3ase$;THsUf_SKkqUD9x0(&YQ&e@Qg{z68zisTPB{LT!6Wh%Y?0HEr>`e` zf(b_EUQ0QYw^DaUA<Gd5I>cZ9-}RF<&bxXP`4XZ03V&zvp<}ypq{u6!5i&%B{4IYJ z#nR$@$%}k{RAwl|4be}}!3&6>07!Z)XQJ%WtypI}5M=!TjswKWXfBA!+SG#?x5!(c zOJ8Wkm*9Q83eFfc!UOdc4Oi+;?p!EsXs#@atrb3b?G>qZ$`uA$PQXK-0$1Dhu1Wh( z&rEdHCjcKCpFcY55_?JEdstbalC@_Kc~PsL+|gGeq3SD^?L*)lPjE#Y?N2d6z57XS z$e)L!x5sK|RePK+^m2q0hzX`zx^3bvZVtJv2@Bkmux}OLtNg-maH_2RAK;^)3iSY+ z(_u53-2m*#SI_bYa~z<G6w*;h6dxc+Gcd{zf8huFQMVT+I#YR`DDdj1=~PEZzt46{ zaBo!LwIXm`b&g*x>t>h})HD5CA`T1&Qx2tle$IXt_8H(0sRfy;1xBO|Oyw_TV>@($ zfGE}6hQAHYuz2~3Ha)@tKRayD$LB&8vFa(nN5PK=wvf{hs8iXdYqrMF@q%ljZINH= zBc!3(Zt6}vnNZF8yh3}v@$6VJ%JJkiZ?ZY`{DegD>hgfHvT!Y6D&I5@j|kj5nE)e+ z)6>+Fy_@O{1^CRfm?_+>M>7l;;6^JsJkp%uWuLipe)c#xG&Yp5ypUs?U4yK7+Uc^w z>r~wR6W#(&y;^2uoC>fJ#O1i`foaG6)KEqf$ssG=%yukWcw+Q1ZGB&OgKPSP#9-UE zdldvJHZU^|cVxWJb~#Gr8JBpl?$O}9kR)bQv!0*Qi_u6Uq*M$Obxb(;!)oRE2_R#D zq6+*CGyZ|w=hA0Td;t@|-y&hE^GQ~zpPeQWD-QgCS~2Rw)%QRiVr_c>Ug=}3s4*+A z;vayDL!20Y?g(1BH=W<Q?!x;oeCdS6z@JHW&!pa;bdnl6V|nUnRH6mZUxtqh(HXIY zdJKgn7(Qms+?Rai8RRRH*_#3oh*kXGu8(r${t3T!5*F*wP2z6}lZ~P%T)sQu(O~O; z0y4Deu6vGhdP|E<5u>aFLxXOlO`6>DL)w<kL;>a^vyK~Y$WW&ML+sjjCF}EPU&>tj zznziKiHy}F98VU|jYMx)>SQ)~o%2YG@bPty_aVB8^L;0}m52{UdW05ShWNzf9`D+F zYOcO#_9z|-lLh8AS7+D`BNxAr$IaKqwn-BHHH*1|-<b;^&BB2=C|BC!TVP3L%@jE7 z`V%~+8nMqf8#PYw`b=y1W*0|%);i$v>Aa+sxQ2RtNkm+-d$ky)BhEAi-pDmBmA2&M zSyDQ@=^1wK^yJN|XO*4*rKU(d0t-OVb{}`+k0Gz<4(Y$LzWch9c=Wgb|GJ6|OR5+H zFq+DacXN&eYf|9R>E}D^ZM-ssLJO(D2p+BS@!3#6v|KQCT>>oj1t`rV4leiTG)6TU z$02H@Ey`!Pvdya8HQz~4oE73nWH<E!F&}W`-9Ul@esy4dbvYmPrFLrTFefqn*k+mC zLoFzKBN)Kug^IPdD`Fv6&zWCod_hdZ$zeeAg@lN<&z=HzxLTp~%5bddkAvObP|JHF z3rf0js+Sd$><FJ6#mtse4|sImsZyzcJ077*^;*7rol(UrGsl|08jFe^G@dxm{|0$K zfvm~-eC8OU&I8Ub;%?&t_L%yL2DmmCzWhsANdRrc6-zh94fzR6=8rlRz+sQ#a5r0S z>{})Q%?U*6fuV!1{>^&!+}kN)fGSNNj5O@8ZE_Us1N|c(iSb@rls;A|X7pZ+@R9)^ zmss|cAv)!(Z{NrLt*%thI&Lq`H6YCx>e(T0H$9SHy!)}Vw!zGNk#vFfUn&bYnduK} z2*~T50EA?*p7TxK5xrzGIifQ;GTfYTCFkCy*r(@LFT>YXuf)vq?nTKV?cT+GRG+N8 z(W0JtSOisama?Bb1Um4IuHr)mBhH05vN6n;vo+)}WD#TAJ3EdI`E@`KApoU6L<hE> zC?8A7-qkjcEgePS_&w%6VZkWO!%xTGC;r><@lLFi$1vsQ@z$VsW91yr$4`&`CO@Fm z!&cflfi~-#-F>5FA}(K<sIvwx1GzMv!MNo?!1NVIOFuc!tm66ZLcTv)6cKkd(yHl5 zVW)T|&&cLEOKzi*?|*W?dGzXH3p=SY=^Zeda;zVq$=8k}3r=8lWm$O-6Sf(rs;|hD zP1?OZr}%vef$h5}a*>t8J(t%NO=GArx}D-yoJYc{oh;3kO4EwY5en^r59cmlvra$H zLQZS}`bFjH+&QQuTOyiZ!<1jo?)`)wjsB`KrjT#7@m{`wZ^eb<nd(KJo&yIp4pTi< zztS$Z;Gag6I%|}4dR84~)*h`Ap}{M<I`=nNG5<?%DLyizlW#bU*8B^v*mj;0QoZK< zqfJ65m}vJSwSv&m2ApLRGk2<-<+}6;l5?AqV}9dLX75Os(<~nGm}VFSW}9UlyXQ?v zj^eRt(fOeFSOtPxxuIT|@Pa^*&3=8mrB}ZR#Q=fP&FdzPD_?^)cf_=Xdw&kdKxLLq z$Sda86#g=!{#$wRYxTjXZohl(PWt-Hq%>6eQC7_weX-85*p8r{27Q<vi$z8K34Pm! zTo{q)_j}L<Gs&*JRIZ4ht|#8Umd%VTdsXQz|C|s!1Gee*0@1uKaZQV1JMi<0jXM1Q z@O9pSROtWzzYVz=Dam$ZC;OOjqLO)zt%U5IN=BSx7Da?(AID5WQVvCAon#!x%*f0! zj**pv?9uOiy7zwW{fzJLuY3JhI_Ld<y`SUpveIZUco)-KKlML~F&zI^jIn6~3aBA0 zBb7FbTb3ANwfr*(L@$AWRCeVp&e}e0OorD(iSRXT!M4E{vB4#e-`CFPxCUJ^e0nj% zR{PLtcypMGoHN%2WYvR6TTOkdmHmf*7G!=NhU7Fl2z3Q;Yw`AW!UDX64a%W7;#X^j zVVOh_O2wP_c)fh-1l`eiawV1;p=l=r*Tk1<e|I3irlU=;?*lZ+Jt2<OEH1KRuQZ^< z;0T4q_kQ+h3#`I$3GWNs16G}l3wRmR@ZX)Xpk|tj3CKf<K2BP@%r+>Wyswyj@K7T| zNu18&vv%&_ON#V|Y>to0p)u`p(@u0ZL1xsf>4}rNY7)rZW6$TMMQ{W@4iasP_)x>z z`0-R=>STi;NTyPVAbeo7X4nwW0pcr_4|r?g6+fQ@MV@dT1nOeBR1-~avSe!7R3obs z4Y6(t>GW{TXcpdtp9$5md>doPku|Hbeb7GpmkSdtf?fv@kJq!K++beGH}wwRx(IW8 z5VFU@OX`SNhj9}G98s|2e`qD=&-!9zTcHOF{sxf6<(#AG`TGf9dNTbn{vFG4=e*GZ z9E49RlcxC(W%Qc~8$x$%o|E#d*NS$NZyWRuMs|qhE=k+Wcbp1TX#cYxgVwCU)w5}G z-V*nugA||y`klbCmT@Br=BCC2dCIx{vKFqxBRnVxKpzLiM`ya5LO{||jfy}8*0EHz zfOZUZN&yP}I|{g!^J^BY`zi(H@L^7ofqKWmV=wYnFm`cs;%dC$nLW)mW<6rBM#5wb zln=9l8{Q<0WFE6JFZNXW+mBgjwC?o}(j+-;(d(ti>b0TLdp2MQ%D=iXJ#xph)0tex zWBPvnn<sM|Jv-qM!v)5YU<LIyx`V(m<2mEjZJz7!pfejx9K;`B`GLheK8lqX4z6j> z$Tum<*RFr&0BO|%j^LJyoL*$+if!@9`bj%6k^!aU$giLW@Xo*IZoz{^*CwkAh?C9O z$b%3?HFFp?vF&!-zXp@#DG(|J0W?u`A}k|o;8iZE`sx*@RL0$|L4J<j;N5s2!6&d1 zO>2GNeE72<bQ!Hzgz@L{r4O6I#5($%u-@rrJa(Jsyu*Nw1>ZTXmDHgdM2~ua3L>iW zfav3v-x^RCMMLa(n}hw0jK|c$t1nPhe1=|t``xUoB>-|(hH6cClO8Fmn^2=3NMmbV z^?c-{6{j3N<i>K(c%%M?5Hw*TZLGf1r?%qCxrXzCI!=d{te#)t7><@;ruZx;Bz02w zbxJ<np<nI_|3}#4+@0m?uuZF8E3{%F>RpW(xC8NnG@7UXVah!F|C%zhT*o?_nC>Q7 zk~Pbh%e#_wn)8-P;rrUnc{2LK=R*SOm!%U<c|y@FBBuusVdE9NM5W?wn!*IP2~p1D zgY|id=dn3CMBT5;FLyQN#J;S8IFKGNtkr3#T#zXszo5rQjY&K$z@e$#A=Yk}ghxp9 z1d9yFS>3n&KKAjiG^!$HOOcWf7KCNH4`#Lf-2TuVXVV*g@s`u~s*~wx$HCA!{aQGn zDzUVFrb+xE8GmIl!-?obSL&T2bZ)xQw(he3iDmd-1sD+gPz#1EyHGH9?RVqoXZKmC zp3D*OBCMZ$xEAiUk%)wEQ&S!mdTq;7OY*IOAk>FE3$hX~$-Ko+MN)$mPLqLJNc<|v zcp~5ET!S3G-&YjkbSwwKKxn&-vFCc9Rh>GLw*?=mQ=_Gn#DP%^55hL+#G1Bji5tI- zc7onISrF%l&ok&Zi?Ow*`Tv?RzLP7+x{!m}{t{HX;+kY0DKC4<R`)!1*YNtsNypds zYV6LdTM8zg9{HW{w1A`NK$+#ftVPOG<r+ygvP$BA<UKrQM^6FWUy|*%di$UhpFyO} zwcPvPFAINEY-nJ~zE<?)L~g@&<ZolMVr!?i?BA$Y6<_!x@WIb}K=;S=k&z5)ZGDtr zbx2#y8t!LZvp5#l$4_inNuUK6|6a5J*7au9Y9S&dG*TmBv%8+<&furWI~8^fvcn~e z^3hOdrYerY?U-A9eJ67Dbybe+#symlY5hcY-LD3+Q)-0YY9%e$r-Wg8qr5}lHT+_# z`>y;|DC-)f2>IvyvGUja0eO{%zBcG1efmpXA#Oa)LNLOcK~Zx33tabHgFoi^A(iV= z$8#9I5Daso-OTybl2w;hcXJttfaApgY-k|K<RZ_l-s6XeA;n?$+E8CJ@aGQc#zcda zdLrZXX>}RlpkkTYv|B+LYHqz>WAw$e3nZgKb%!Fu^YMtsGf<OM1s24?>~0FPQ{9ag zkLaEKSbAaO>l9gG^8RO1UPLY*zVx-Nb`sy)v2Pa4792(&9S7g2U=u`~<P7GnBrqQ9 z-#t<=WhV=!WYA3lC}p6`g71Sl;HCgG!YS6_oBU{M&^bUam%EVivP?>X40PovYRuGk z3V3URXJ#5e{_%|>V^{kEN}b*yAyN_HRQKAk#uYHGWSD&WS{qUA>+y1Uw{jNsV5@;A zOUy6dh9aNLC1?>d2)|D+yV`u(tD$>yef|#WYpkM)-Qu|<=H;=jqW90rVS8U-DL^4n z=%KmPByAH$l}EUlc)LcXzgSZ2XjN~2YB&Zi)I0{(ShDAZ<suL?V2X-Rq~<Na6-|`^ zR$G1|<ELzI@}Ei2*$_)uxtpsyLn1+z*1J!f$40=9<6+b}M9G>@rw+vKUp(L|teZY8 zob@8~9Vy$1I{yfuLk^)+`UP83E3q{yk6a8or$+hfaEXC>Gkf~UT6f!iUg;*D2)xk+ z5<4--tutWU0QCk@>d7JtY@(7QWAwp4?~#q)+AZ)C-EH`=w+Gc;;Ldh9O!^kii3vtB zrf;5kp>P|+3_PUM<x+E#3y#<MoAc}x9M0Gj5w(JE7&nn`)fsBb5gqj6*Dbf`x{0&Y zPiH<Vqs<2TYu1>SH~*MK1{H|MfvHUm48c_tS9NQ8SKH&f?`OcQVFKIJ1Ai04$?j;9 zO(S*KxDev;P~SeBR!x!fyueYs%+%&=|C6_&j?EAne669dzSB!j9jR2;I7CvLw2TKq z7xO4665<)%>aIrKw>$m;ga_ilJ8g@QE}H{eW&oN*g-8fC&A2basIyJ|*cQQH<&X3S z9T18vV34kcQZQcg^&YTurJ|?sIKO#|9+J?jjWb1gm)F{A;p)%Z1!5hmsxKtFIb^iU zPLoA<6E-9nBcY>3ClBDYu$qKnNW&$GKZ-AZnlha5#ZSLX89XDHG(3eu3N4S<3e&uI z-+Fs>ATDgNGeQ6*OH-TxGThmXnBgpUaB%Xqfnc{B%CPWmHjyj{UN58>+WO^z<P*+- z$tICnEY6A!=3#ca>sH+e8!YoHJd{S^s(||lg75JIB&G_pST9UxBY`<ZpP#l#Yg)d3 z2$V?3;Z*oU4s27yrLC%~rMi6Y-m?#%r<8lAUhDI5t^PT3$eqFqYdZP;qmDa++~T52 z7t9c**=}Hq{;X5ApJRTS$T1`H_VxI}Y?dy@HKV<DZdPVLRJ3`LF>S2<md<<agc~); z*Aw1s$ztk)ALV{m3i|9{>zAm{;ViIPb;;KKA5#bGa<IzsZBi^2tKcvoyz^5&@WN6> zx^epVR`uYDKg5t<Ge<Smdq{+FcLImll%q1%&%Ij2>OAPhm{#@ix<1i$KH2&rZcI45 z^=iG;JG%;E_{B$ipgYY#$o&GpDk-1^eda}Z=_7odBNb<cS5tO$5=CQUlJ`>lWtcX? zf$Ok_+#_^NbWe?1K=iC5KHr=VcoNOu5VDsJG+&Q@RdI6%SH(d|71Z1MSNc6*q99X! zv&-f&Ex1@yX9ni2c7#cJeEKu0cQMdfxbYHPjQ%xA$h=mtn*K_$5!4c)G`lZKxyK4o zi(}i6>{#e|5Qh3*onOu6A-v>_GMn`DIIw3E<lrs-VAUgLGO*Wrw127X|JQsmqg1A8 zoeKH|^!S>wd=08T(6cGAF4+xPEWNV2yYtOJRz_PGEVznq&qO;yZmzXyLEY+Ew4hTb zW!W*xMdp!O`#n=OCj~gN^?nR2Gp+18a{flDZ^#ERl@Fi5!S;G$pP9tdRGo`d%*Ib8 zOX9Hc)w`>Ibznkx!PI!~cK~Z5{h@<I<OLSn1qeVUIPNlOg*k@fUgV#p3wHP<H7dDp zxXjG7{pC1b*(f|&vOaOBB!buCoXK194+y^ZPUg@AjsCR~DfBKVlCbp{9;~n~kAdow zP5yhX57J|Awo1gnMFZY3;t(Z|b1q}V2no<L1#j@q`Vn`QAo0NjYA^=)iKOj;>}<=s z)huRkIg*+1UV=BmLL$CLsGDCjaplQy#h4`VkxhK`K&_X%FgeM4YZnVnB-*v4HM3QF ziR40OxzUSPj#!R+dXOZhfPM%SEjfoqoWBnNZd1V4z3bGYoDO)tIpDbju>53Am~*~- zGWG1}->ZGBHddiFW_Bu;Fe9VZUi~8|Xzyz!?XG6Rie|mX56QejgzS5}imPHr>LMi) zMD=I#8diLwr7n~o<%z|#p-*+%75Q)`i~Gp{`TG5g?ETL@$6*+-gfN(Ud1E5;6oV{= z;Iyal(mMZ0h%7iL&C8>{!7Ms3Jer43gFZ@&2e;`151{z+5_dC^dn}O7R^YDQLgM*= z@+X2Cs6E*Gs@c{PW6BzB4h6!YoGsze7%5C*q$D6Y`t#n#W#}DDKJ<!EgFIe+fVogS z?mUO&dQ2C+gRg(B^71uT{l`b9F>95g=!g}HJ_PJ$iuL0l>8%vE%<`|QKI5G0-L3#T zLwh{l+{$T!?VX2o=(R#g34T*w-e$Lt6z6FG$(OhI^iW+HoeI(E$uQ=+9pOd|P+G5G zUv8Yag8gPOkA{M9NDUmMGlW}@Har-u_1Yi2`&IH<om%V1jOqIE6&`9`sug@VGoBFW zAoNV8U%EwB*o5vC#z)rt@NrZJ#`r{IU@9RXmwQ|<um$**f5lCUf$fc!2fs8BUvgO) z8=&=+uri-xE|*#%<&nze+MSW+hu+ztBcZkKqTzeZZ$s^>ryQ4!ee4MjIL42#t8a|d zI))u8mEwR}<8)(RZ_cuV=4J}c<q#T<1Sh*!x47jR&_6^`LQl;*4Ya1N^`E+3Z>BN$ zrJts~6pSJ{!;)nQ5o1jau`s&P1q3972EEZroSYa1aiRse{Vb1+fi-q4m`Lour+60X zIMHmHR$YyO%W>ewB%4qOwFHg=s6l2l8(Lmd<)PC}D7Yzy9ar}YL23whKEHznyIm8a zh8qs?Iv*Dj$cP?UWqarM`R!nmKes$n_Q!t&P8BJyWU6oE*TxcRQ5M)A)?h-)2>qqK zDbC`H{nF;eUSaH^)>842C-PZDdd*m)uW+P9Z?bpFRL~a1aSKB4h$OCLh&Zqt^Xa_8 zTy0|BcKeJ!pSV)<o$FPQniy&@o?tMQ)3|U&NRCPce~R3g0wa85_4Z!VdGwx$G3wp_ zVbpx@01ut?Ri=SFyLPsvdgtam#|B6`U5~FDVoOh9k+#%M@daabjwe)gs3g+U?VHu} zkvthwVV9d={dJPi={tiT?2g;iPep4NZC~N*7DUT84R}n5T@}f0BSUJ^XFNTuwWjpC zY~`5Fz)Y}I9~D<3<+Kgbw}3k_(a;~5It6+|_(%{h(}ksV?><HDU4j6@Xnb_3Z4?iU z+UCoINC6Ist(a?reU;$+w4iVmK>I5D=4nn}t;dz!;L3se=&Kh%v6~S>Q=A+d1!NF8 z{ll2Km9_taokS}(H84KP0_KlfeHm{3l)oJs!dgk_e>pVj831(^sWsAcZ1Lqravof6 zVpF7<D5vI-fq+WJctVG(f4ElfDkbOS!Aq|gBQd}c@X1FF+12qRcYZEJ*iIk~%$XX+ zUW+s{d;i(PHMX{R;w|t{0EjPELfMg4o?H~<VF>-6kVr}SG3h)L?YqBupP&XrXbc*U zf^AefK=kl8`7<6un>@dP1+SqJ+T~f$whXdaeod<aaSt9e!&2ZN@l_$bA!!uJU?p9e zANt<m+8}H~@h;}&3}#(Y=R@@CPx?`|%&`L;(_Pn=XNCVBM{4x9<lhXqfJ-+E;^Rya z=kJm;Dl*Z3sHm@zAApk068`3b_^+}{OKvg8tC^J_U}Te=F{zP~5_?jLto77Ml8iim zoAW7K4E(i^j+vcHtAG~M`&XaBT{7NMY{%GmnxEXLS>X-~k7-#rd}yu_+ZHyye+-rZ z4ps0atTrHzD!}f3vJvj+DrfwSw+%BbKbkb`!^*U6rStv~E@AU0GGOu=u|bkr@el-L zpg0i715=xZYSZqjdi%44?VM|aiZTgvOftkuxdYp4gG`cJAQ;j8K+hjDr5*0PdxB{X z&TZoJGP?YsKbB8ydz1DlP}+a>U4lUCi>zk7w!KDMJn@cCCfvu5>%e%-(vgMtfUG#v zpjyLsPBc1@l>*x4XFzlzrzJf{m_VUUAX16&&iYLO?9V5v!W<=qw3eH;gt)N<0q4nS z{}PR5=C($Ghe*T{y@7?`kneW5c9C`uM=d;WllFDVXlLJ}x){KWlJ0O(_e{F(=aA)Y zMGw19X*R#S2DG53Rxcg<<nhpl_t%iA9T7oW|7YQaYRq`KtlZ-Um%}Sh;yE;TG+fQE zJFG(!T4DNllneX<X6m(|Ww4&@GTSHt4(&4uKp094Twf8ot{rtOESUatA-ci%$VV0M z$Sk>-Eyixq2GXcf6X1cDncO9J?hdg_cUNLA#O}VoN5_A#$S8+k!Ti8Axa0Y1%Fc#_ zFy;V!l4k)zvJ;9Mwp?qep5<3h2b*L>XAy23$IFZ;sy@qu$4-%D+Kd&<gxO<;ZqD=& z8?U+3tm#7*z;h@kg%Gj_14t=QiHG9SE2K<D;y|C>E#NKhzfT~Ry4K*~0-lz;l#*Ds z&deZcMH<Z7&0$RTxj%SCty=G3>@(V>lR4lRuaP`<5m}HX>&aULagd!Jd6T=<jvug7 ziS%RHe|B5`&3&Oq?J;CkVkHwpqg!FAWYiXeDt8lzfhfh%K8+Yfrq%;Pk87p!0kEQ} zvj@y^D?32lrw*~PyYBsSX9BXwd%dc$l`gyx(FPmbOu<Or@2l=p`pKR-D5D+jGFkg* zalq51TzTlI&@RswVovV7xg;yeU?u+JAJ~syg%@5zbr90!Xl?s65ZURelZV%#x+{yu z#znU~egQwQ=rT6<Q^w%}Ey~f>$_uwmR09Q<#ZX}O2&M<t>dT4!aB6Y3y<nzAieyT; zFO-ruRUZpvE}yxbI8q+hnk_sTaipiZ56Yy_u`Q%W1NwYr;%>lhNtiIUX@%$F270<b zo;ZYm2(lm`aU%j4abN>b8|7}4p9ZO8Rw_hiy~m@__tl*>g`&r{^Yt#PsYS}KW@Ok} z6`#@)$sUt2wLJhaGaho6so}wXGIKDQY2IR|ic~nPh{8NE48Lw?k^_8($XjFQlI*Sx zetMwSD)7Zxl>OLkG5SGQrSo-a|I>9@8CYZEdm?jszWrMbHH|lMNp-R9zlV<bb4f=~ z;5?<i^eeMMD)kZe+9*dai9E<{i|f+;EG_wmt8C}Z;AokNiuhW1?dj@MdGJo}&HKjf z(F7LjD#6i#z~06J=!Z?MG@p5-Qbw1?X!}$${M#kc^z)mnE0SH+T@xLjt>4|x$?`iL zsJojvZJRc$oyIK-2q3W&Im6a}%p45BR|6%pgA*kGUP}8P6USjD)z65U?zcYW(Qv=~ zjapK`*!t$uN|5`Fkg3{kd72kK0E_V%)&7}RG@!(WY}za>`EZ(=QMHPHlY3t!_pma1 zeVzG#S}*eGf(dw`tmx9fqG(@AhL_^H&R_J8k&Y*nW7hJ{Y;9!&E0u}{Vu`U+msjrD zLy%tW#sDqi5!0KJ$7kl8)biO7doGD1T!uW*S9x_l#lPG`9E}jbf=XYRmDE<=W$3<{ zvw7&0t(P*b0a&^)N?<Wo%~Bkb+2;uvd_urK&^iaQ>`&Ph{eJJt${<#&BP-NGwk<V8 zBBCsWb8Q}-o6?5pQxoVjROAg6s^aMZIZr)zXaJ=}4Z+(m4JAuE-?K*-<+<Jj;^Bw@ zRRnQ+lK4<CX`(rA(C9N4#y$n{*3O%3td?L`E!fqBzs;U|Ro3gRJ)52wzU%hip34?E zQ6_-rlHF<3r|IUe`CL(V{U4o|vwwA7K*j|hDHZIfd$#SD&$1;N7`Qr1Dmjal>Ivh4 zmwXskq^cdFv5v;#q|6T~;mtyJH*fu#V2v`R7?X9hQab5CLWH$4z{t8r&Cow2P8lCN z3uchN4VRS~rt7X?6@o@h+ghRtc1|{8>De}+i`-DXU6KWWkdMUCA`=rgAkZ3Jnnp?Q zaDV}Vp&!dck8@FE+7;&mHB9PlZFV}Fccbz{7iw!&Z)UWX^av$T(hsj>geVy#tYpFT z0r`?}Z1H2~xmyek^C_+xzD?|5X4ct>S^}hj@zQW`c5PCWI%e&SoWZ7hh`~p)Zr1q_ zsSi$u|Cl{!abDU#w^6BtS$NJ<m?LWMD0q<<lx2nybReA{cZXo-Ac0#uA51(MlG{p{ z7d-{Rx%$LVSeRVOyx1LfaWVOcp{DSj7n5&N8#wTv7oLTfczJP{Kfbtr@GMvjWRh5s zNL~Q6$Q*RHzyT>F7v=vM+XT+jPxU`unU#H9qj`raydaSxk{tuQ7dv^TTVrKu|LVgW zM;B0q5cw`ItzvY_n?&slL>eJbgv=b%B+#4(cG&HGP4JBL$2{>ouI)W#__)JiCA>$7 zRYW#Wh-U!CD)o39YH9Kew*PyMKDV>VYSpukazdy6kr3IHBMrgswp5R9wY~UI_1<p$ zM(|rCR0K1W60uh-XgO>~+#MqV4Me}5Y)s9JU1Z{bv@5B|Umc3`n9xzw&2^ePuL+gm zMst?vq(pNQ*@x;FI}+llU6FA160LHNv_`=X(c=8J>TE_%XM5KAZnmCqnq$cHkQC~l z`m=hw!i(G9L(wb%5z5aW%pp%5S%ePAB3mV?QqlL?vvNW4k6LrZfO2YwVWI<aK`|={ zW1RdBln;WemW`&w{7ZU|&sa7Q_ezj9Lt#Pi(6P%xYxk;XRho9+J21WHx(4kFdlOLN zblAE@QMZ*}M~uOYhCDyn0P=`jAO@<yqU9D)G5KLR?fdmWKAooVOq{Ou_8BmKvgKVz zIn8IvGU|c`ZZeQm)rD*%Pr)+49c*_9G**HcL0bqGNB9z0XE%P6if`fx@pu5SKNgQO zBnGa<GaM&y(a|+(&-8-^IihCe<mniA6>Y%Dy;rL(q{_yC5(j-m3Fq;{2Jtyvk6ymA zqov<IXmo+b9AX7;lV5{LPr;)zHEN+?tBv1v)!rv^=@pz9*41A6e0eu~qI+7gvh=10 zV9fz2BS5~;Qnn&%+&FDOs`mX@Beh|>_iDj<_^o3fiz6qd8HG^4IM`rT<QchPJ7$S& zObZ2lrj|!zNlS2Vr)d7e2KQxevI?w*bX?)(h4SGm)&45uQazcmPqS%dE^BvBgcJ^C zeUttQ^yU^|f3q@CQJK_`$iZJBk%|HCHIPRG`FY9liLW3_bopt@4`0#Z6xR}upJy#n zZlttVTG+4D$-(pGbxUYP6x=@Qn?nP^(mm+2eogFBf{*Mpi8pmSc=%0>|I#WPbq<7* zs`rLMX)2f6s~^LHkAXKq-@Xr)<(_Ht76`>(3{(>PUwvFmCN-n=2K91=_s%9Bmkq9; zGZRQ3NUxf9L+S$gX&=kyv)JyiCF8lC5{tt#^(jJwS&R<jLmv}SC6OGKvjo95V~kk6 zexR-;5wA9xjqC&hkiw)L50g78P-QuG+%v)NgKhdI2!Vz0oli0AmiYme8$bSE#MI8H zf7WKM1Alv$5%u*6K^_)V_tVhj&45iftx6&FGXiLG>oT9hGEJeI*Znb&V)Q4jd}v3B z6{jimj#ge>uAwlh#3Thl*wngx{`4h|cQjoEzfbO;;<*S5+35QtCqg2EHz?R%#IT%? zG@Bar1rrP=(Nt=`_54dWtqR<KO)rywO)nSw!1OYaXRtfl|1HmWuP~M1T8_IXu^+w0 ze(NJOH~|hBa)Khmprb<WhHeA)m``$ok9|?I&?ig%`*OJxUdt}>AmJKI4LAKOGqS=f z1-W^16Rhx(J=C@LNL7q?W>xy>rpLrP!ZYgS1n(A4qB=LR3Pb6%q)Q*NsN)N@Z0x~T zoN{BdXTXq)<H(Au-otwmc{C<?i>MelAS9{KrO9YJ``9ZwoFz%89_lxhzMF)cGroNj z>V&_&^GQY6tt?u49Z{R@EYe8_5!*)eF@j=E021@m3p<(FR1M%(eCX}>^E#xve1jQy zm_-Xf5G$uT4+5512@kO05AObp7ve|hPY-vQp<heT03YeyorSNka9_<0KD^DqF2?ER zd<9%*DZs;jY<<1kT7ul;00eO!8bOV44vb?|JNr{MSJUWJ!h@)tGl2*DrMcI)q=tYp zbp3dD0CFAmAteHzMi2mEY-zZk>~>qNXUsz5$4i#MtycXiz?@K*|IdyMW~~lPcq`A4 z$Roe{LcvGJXeUdj*e&>mXo(cZntGg^f@G8FSn&Bo&XQ%(lgs`dI%MV|%N`;!%tlmR zvKBeoBb%bt6D9NoXL`<-Gg;2-ilM*So5(A5XXiH8Kz~;ZH9_keL0KeXsZt6s{f>vA z$|$Zmo}*X|5x~&;_u>txdr~7L8Ep+G0NQi#A)6JvY|9^sSitSpGjKHjSW7Lls=DZ( z%y2xxQ&X?L#40pZC{b2&U5$H4tmzW0x6*Mj0mk;zi=5yeLihNpT@<+c2GejSGXo{j z0hGIGgt7W+w_qRXbuFwG{he76`UIa$`G59!Q>dj{#Hw^t!&qYj5CUEIG+@DJ(V%!O zkX41l28o^)JbexHJ7l@->u}=Q&L{U`&vRT4<&l7gjVsa+uO>5y)qg*h41%$d0#6x| zbB^O*wc2WLo#AKVO{y)T1nX0Qhd+_t!bxBq88BC3XM2;JLV?y~*5rU)Myp_&@1t42 z$H;2P#&I-E<)8hz<+a;GN3Hov0?pvl1dO{4T%gb;w2`jYVaOVcwOQJUDjV|(uj+kw zf3=b42{kjX_~GqdM<_(lZSWXK&vCCkV;t03a&OudX4*go=9qABE^~dW7rK5@8vb7X zy=ShUs8A&ZJ@{#m%md?GsXJ!F?)I{@Q4-d_R-CXoLisi9<mS0vc!HNJUNDgL>~L(+ z%IcMm@*nqP_sIWvjhdED+%g{VW@Ne#W*!hs7Y0vSK*#!%srqsp@4<A-q=$#*wZiJI zW`s;lzHQ5fQ+fQRsmUcagxm<GUvpzERVmu7@=$<M9atO$Kj1Ga;rpJfEIYxrzAMYe zYu@r-CJ?N1dh`mU0I-d0z#?{|8Isb##kK-EL(VVus8!N`24q2RR|u9B2ByMY%FFGR zCtrG`(Ev{Me0L|}11{oIi#t%J0`gM0FvH*K>g08%;AwP|rp>)ydQL9W8}wJoHBTCu zFuxOxbkox+fJPfMFnnN>*3+@Ggmkunrj9si-}jHvC$Gi?oR&-`SY%qHdw#~A(_65R zOD$6v6aQaHls{dej4aR?aL&j~&0Qo`j3!#7Jlah=HYvlUz(F+JESI)r3dpO@*`AJI z-w@EZH?EQLFy}vZJCh`4krEo8poNU{pyw>~3x6C@of*T}Z2<})E6X!~SV5$HNz%oJ zXUREH9P=HL16;`l64@XBZs~xMa8nAvqouEck}wpQLif%BO9=eywIL}JU0r&|CgWup z&ur%pYpW(ix*^3$o6VC!+uF@S1IDti94%Ovfghtf=Wtdu#H|L$Qr~j4CeA¬4*_ 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	g>MQXTm2T=TNap`^ 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 literal 0 HcmV?d00001 diff --git a/public/icons/icon-128x128.png b/public/icons/icon-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..48d0e2339a60a637b94319c65e8654289b4f4b6c GIT binary patch literal 1329 zcmV-11<v}3P)<h;3K|Lk000e1NJLTq004jh004jp0{{R3^x%>C0002qP)t-s01zMl z|Nj6D8~_Fu01Fxg6ePmN$p8o!Wo~x>2^n*Hg!uURG(b#MUupdO{0J2!4IC;FATIs> z{@dN(0umtr1r+b_@!;a*CNn?_87S=S?pR`MN>yMYFg?=M*UQe)wYk2qw7Hs~re<$= zUubdX=<2(_!=9w6l9``_ijrw^dn`Fc6(TV7_4V=c^R2SBrmV4+ouiMHoQsl~euj;D zf{I&ZZXPQ+87DQ^+ugv!$3;(CLQPmWL{HY)+rGlaqNuHRe}`^&fKXdyK1x+FK1#;P z&4`be_4fDT<mMDxr)~fM1P)0=K~#9!?U~tDA~6s^t1H0}wr1b=O<83XP;hsg`Trjp zKuJQ|I0&cv%tP*DwVvFrBvl1~Mx)VaG#ZUYqtR$I8jVKt-+>muWjt2mKnbI+d3dfa z_PK3Vs;zn;Ot~u#==o*X;a^nmOa{(_o(tmup<lT;1q-eSNXltz5?mHAQg;>uw*`!> z#lUp|BbBD0;J$!S0To9DO4Z9XkCjq#?=s{WNE{XLCFmLibLLfxLm3nt7Wj-&k{L;X zo_Y$L6(Ax^@lhJo2uNHK09we3_>jt`DV`HX8L^}WDJO|ULbS4T1b_}iycq`oGqNH4 zQJi@^@H`%ly#;k8%FIH(J#9^VH>(ITJX3)9M7)?mVD;pNM){2bV!rABC{yFeZXJ$q ztx`Yw*~<P5a$$yN39uVki^2$`w!5n)HAf-w?3Kd?<blC&V~=9Z<Yx)w_65AVKHV{| z4MB2-+w7Z@r16D^4m)QHY9hYKC<4Y!RejCOMu0}7lS(7c&d9)6#4kLGK=eLjNUmWG zhRcRM$vit%0L_w!KOzVL3-8+nE{#JpI{ZWd5|l6cL=Fmg*N<2|Y8>Rj#FGR_Att-g zD?cO<T~VO(lnlhK+QIs?sq9jX{iGM*7E187s2nu&>lXM^rD8S|s+a(LB7MePP8cKc zywqQW@o0gm8Qu`-)UW-9#K*uQ5WQT5&CGnc%phPyF4p1{wj=@#5xikX3uI#(QrZ2A z66>Nxz+a;r*Km#iEGXxR4BFJu%9#^UG{?XqFlA~7sH!J&2X_C6*P7#50#^tYfm`)p zW2Pupno-5;QoKQ)pCj;SS_MKc4Ai#W7h-YyLi$8b7l@8b3KjwX8wCk}6<4mh7hj6_ z@bnBUa)|InAVBSV)+C{3Cf$?e`b2@nQ<nk!OTcU2N^stn^UTi$qP_cSFw7DDDL~rd zpW1r@k)${q9z0UuVsy1;^ge07q%&09weJOF2A=mbko<WDo)dfnNf0h(JzD|$!D*VX zza5pId@hh2DZuZ<X&*6FVC9#$<AiQ_tblsj%V3|G32{;Y!=e|ZB4{^IMT5*q0l<N* zxlBe)QK9<<N4G$|1{IXimyno=;^1rsW)0CLa=TN^yCr$In6m;vhjO3@BB7LWGAqlm zbdF97bdqv>ysp0$(swOoN^Eg(SO9p-Q1JJAAwzQCMaKm&bGV`U^9&pp0Gf^+nkRf5 zTo3@>xi{<xO%YuY04|QbN~11&+W7)C8vzORv}4xoABZoSoy&j(S+{-LlgUpFS4iO) z;>%p{gIpTF5iJBic@aIws^IC=-v{M~W@Y%aj8G0o!r2b|HdROb8D$LP+n;<mf<~j! nXfzs)Mx)VaG#ZUYqdCZ5-SbtG{yBcd00000NkvXXu0mjfakXIe literal 0 HcmV?d00001 diff --git a/public/icons/icon-192x192.png b/public/icons/icon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..938e9b53f6850d97c693b3e3107968fbced5050c GIT binary patch literal 1856 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 literal 0 HcmV?d00001 diff --git a/public/icons/icon-512x512.png b/public/icons/icon-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..21fc108f00294d66855a6c10af022b9d6d0f23b9 GIT binary patch literal 5082 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 literal 0 HcmV?d00001 diff --git a/public/pro_icon.svg b/public/pro_icon.svg new file mode 100644 index 0000000..e075b78 --- /dev/null +++ b/public/pro_icon.svg @@ -0,0 +1,5 @@ +<svg width="42" height="42" xmlns="http://www.w3.org/2000/svg"> + <g> + <path fill="#070707" d="m6.717392,13.773912l5.6,0c2.8,0 4.7,1.9 4.7,4.7c0,2.8 -2,4.7 -4.9,4.7l-2.5,0l0,4.3l-2.9,0l0,-13.7zm2.9,2.2l0,4.9l1.9,0c1.6,0 2.6,-0.9 2.6,-2.4c0,-1.6 -0.9,-2.4 -2.6,-2.4l-1.9,0l0,-0.1zm8.9,11.5l2.7,0l0,-5.7c0,-1.4 0.8,-2.3 2.2,-2.3c0.4,0 0.8,0.1 1,0.2l0,-2.4c-0.2,-0.1 -0.5,-0.1 -0.8,-0.1c-1.2,0 -2.1,0.7 -2.4,2l-0.1,0l0,-1.9l-2.7,0l0,10.2l0.1,0zm11.7,0.1c-3.1,0 -5,-2 -5,-5.3c0,-3.3 2,-5.3 5,-5.3s5,2 5,5.3c0,3.4 -1.9,5.3 -5,5.3zm0,-2.1c1.4,0 2.2,-1.1 2.2,-3.2c0,-2 -0.8,-3.2 -2.2,-3.2c-1.4,0 -2.2,1.2 -2.2,3.2c0,2.1 0.8,3.2 2.2,3.2z" class="st0" id="Ant-Design-Pro"/> + </g> +</svg> \ No newline at end of file diff --git a/src/assets/joideaGroupLogo.svg b/src/assets/joideaGroupLogo.svg new file mode 100644 index 0000000..b7e3ead --- /dev/null +++ b/src/assets/joideaGroupLogo.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 63.91 28.24"><defs><style>.cls-1{fill:#8fc640;}.cls-2{fill:#2799a1;}.cls-3{fill:#edc82a;}.cls-4{fill:#d45f5f;}.cls-5{fill:#73a942;}.cls-6{fill:#a24d8e;}.cls-7{fill:#8c8c8c;}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M59.18,3.14h-.93v3a.62.62,0,0,1-.11.39.41.41,0,0,1-.31.12.41.41,0,0,1-.3-.12.57.57,0,0,1-.12-.39v-3h-.92a.47.47,0,0,1-.32-.09.34.34,0,0,1-.11-.25.33.33,0,0,1,.11-.26.49.49,0,0,1,.32-.09h2.69a.49.49,0,0,1,.32.09.35.35,0,0,1,.11.26.34.34,0,0,1-.11.25A.49.49,0,0,1,59.18,3.14Z"/><path class="cls-1" d="M61.33,6l-.67-2.66V6.21a.53.53,0,0,1-.1.36.38.38,0,0,1-.29.12A.39.39,0,0,1,60,6.58a.54.54,0,0,1-.11-.37V2.91A.41.41,0,0,1,60,2.54a.69.69,0,0,1,.38-.09h.26a1,1,0,0,1,.35,0,.33.33,0,0,1,.16.15,3.34,3.34,0,0,1,.11.36l.61,2.29L62.51,3a3.34,3.34,0,0,1,.11-.36.33.33,0,0,1,.16-.15,1,1,0,0,1,.34,0h.27a.69.69,0,0,1,.38.09c.1.06.14.19.14.37v3.3a.53.53,0,0,1-.1.36.37.37,0,0,1-.29.12.38.38,0,0,1-.28-.12.53.53,0,0,1-.1-.36V3.33L62.47,6c0,.18-.08.3-.11.38a.54.54,0,0,1-.15.22.45.45,0,0,1-.31.1.45.45,0,0,1-.41-.22.92.92,0,0,1-.09-.23c0-.08,0-.16-.07-.25"/><path class="cls-2" d="M32.07,5.75a.65.65,0,0,1-.18.44.62.62,0,0,1-.44.18A.6.6,0,0,1,31,6.19a.65.65,0,0,1-.18-.44A.67.67,0,0,1,31,5.31a.65.65,0,0,1,.44-.18.62.62,0,0,1,.43.18.63.63,0,0,1,.19.44"/><path class="cls-3" d="M30.11,6a.59.59,0,0,1-.05.23.58.58,0,0,1-.13.2.66.66,0,0,1-.2.14.69.69,0,0,1-.24.05.66.66,0,0,1-.35-.11.56.56,0,0,1-.22-.28.6.6,0,0,1,0-.35.62.62,0,0,1,.49-.49.69.69,0,0,1,.35,0,.63.63,0,0,1,.28.23A.61.61,0,0,1,30.11,6Z"/><path class="cls-4" d="M28.19,7a.6.6,0,0,1-.18.42.63.63,0,0,1-.43.17.61.61,0,0,1-.43-.17A.57.57,0,0,1,27,7a.61.61,0,0,1,0-.24.56.56,0,0,1,.14-.2.6.6,0,0,1,.2-.14.61.61,0,0,1,.24,0,.59.59,0,0,1,.23,0,.6.6,0,0,1,.2.14.56.56,0,0,1,.14.2A.61.61,0,0,1,28.19,7Z"/><path class="cls-5" d="M32.79,6a.62.62,0,0,0,.18.43.61.61,0,0,0,.44.19.63.63,0,0,0,.44-.19A.62.62,0,0,0,34,6a.65.65,0,0,0-.18-.44.62.62,0,0,0-.44-.18.61.61,0,0,0-.62.62"/><path class="cls-6" d="M34.7,7a.67.67,0,0,0,0,.24.6.6,0,0,0,.14.21.48.48,0,0,0,.2.14.69.69,0,0,0,.24,0,.64.64,0,0,0,.24,0,.6.6,0,0,0,.21-.14.57.57,0,0,0,.13-.21.67.67,0,0,0,0-.24.63.63,0,0,0-.18-.44.6.6,0,0,0-.44-.18.59.59,0,0,0-.23,0,.6.6,0,0,0-.2.14.56.56,0,0,0-.14.2.6.6,0,0,0,0,.24"/><path class="cls-1" d="M32,14.83h-.91l-.19-6.16h1.29Z"/><path class="cls-1" d="M25.53,9.49a2.1,2.1,0,0,0-1.21.36,2.22,2.22,0,0,0-.81,1,2.16,2.16,0,0,0-.13,1.26A2.22,2.22,0,0,0,24,13.21a2.31,2.31,0,0,0,1.12.6,2.18,2.18,0,0,0,2.24-.92,2.18,2.18,0,0,0-1.8-3.4Zm0,5.26a3.07,3.07,0,0,1-2.85-1.9,3,3,0,0,1-.18-1.78,3.09,3.09,0,0,1,.84-1.58,3,3,0,0,1,1.58-.84,3.08,3.08,0,1,1,.61,6.1Z"/><path class="cls-1" d="M37.51,9.5a2.25,2.25,0,0,0-1.21.36,2.13,2.13,0,0,0-.8,1,2.18,2.18,0,0,0-.12,1.26A2.15,2.15,0,0,0,36,13.21a2.27,2.27,0,0,0,1.12.6,2.2,2.2,0,0,0,2.23-.93,2.17,2.17,0,0,0,.36-1.21A2.15,2.15,0,0,0,37.51,9.5Zm0,5.25a3.1,3.1,0,0,1-1.43-.37,2.91,2.91,0,0,1-1.1-1A3,3,0,0,1,34.47,12a3,3,0,0,1,.2-1.47,3,3,0,0,1,.85-1.2,3.1,3.1,0,0,1,2.8-.63,3.07,3.07,0,0,1,1.3.71V4.24h.91V14.65h-.91v-.73a3.13,3.13,0,0,1-2.11.83"/><path class="cls-1" d="M43.46,10.84h4.08a2.22,2.22,0,0,0-4.08,0Zm2,3.92a3,3,0,0,1-3.08-3.09A3,3,0,0,1,45.5,8.59a2.92,2.92,0,0,1,3.08,3v.18H43.32a2.08,2.08,0,0,0,2.18,2.13,2.06,2.06,0,0,0,1.93-1.09l.08-.14.82.37-.09.17a2.89,2.89,0,0,1-2.74,1.59"/><path class="cls-1" d="M53.19,9.5A2.25,2.25,0,0,0,52,9.86a2.13,2.13,0,0,0-.8,1,2.1,2.1,0,0,0-.12,1.26,2.15,2.15,0,0,0,.59,1.11,2.28,2.28,0,0,0,1.11.6A2.17,2.17,0,0,0,54,13.68a2.13,2.13,0,0,0,1-.8,2.17,2.17,0,0,0,.36-1.21A2.15,2.15,0,0,0,53.19,9.5Zm0,5.25a3.09,3.09,0,0,1-1.43-.36A3.08,3.08,0,0,1,50.14,12a3,3,0,0,1,.19-1.46,3.11,3.11,0,0,1,.84-1.21,3.17,3.17,0,0,1,1.31-.68A3.09,3.09,0,0,1,54,8.7a3.05,3.05,0,0,1,1.29.69V8.68h.92v6h-.92V14A3,3,0,0,1,53.19,14.75Z"/><path class="cls-1" d="M19.89,7.51a.32.32,0,0,1-.14,0c-.33-.07-.5-.23-.5-.48a1.14,1.14,0,0,1,.44-.75,1.5,1.5,0,0,1,.72-.51h.09a.89.89,0,0,1,.29.08A.56.56,0,0,1,21,6a.42.42,0,0,1,.08.18.44.44,0,0,1,0,.2,1.42,1.42,0,0,1-.5.74,1.09,1.09,0,0,1-.69.36Zm-2.48,6.57C10.74,15.5,2.57,18.49,1.05,22.37a3,3,0,0,0,.42,2.79,5.86,5.86,0,0,0,4.77,2.35h.25c2.57-.1,5.07-2.07,7.42-5.85a39.13,39.13,0,0,0,3.51-7.58ZM6.19,28.24A6.77,6.77,0,0,1,.73,25.33a3.7,3.7,0,0,1-.46-3.57c.86-2,3.55-3.91,8-5.66a57.22,57.22,0,0,1,9.39-2.74A26.71,26.71,0,0,0,18.92,9l0,0V8.87c0-.35.51-.67.75-.76l.21,0a.63.63,0,0,1,.19,0,.57.57,0,0,1,.16.11.51.51,0,0,1,.09.16.37.37,0,0,1,0,.18,1.09,1.09,0,0,1-.21.48c-.14.39-.39,1.16-.64,1.91s-.5,1.56-.74,2.23a30,30,0,0,1,4.44-.39,8,8,0,0,1,1.29.08,1.78,1.78,0,0,1,1.13.94,1,1,0,0,1,.12.48,1,1,0,0,1-.12.48,2.88,2.88,0,0,1-.91,1l-.21.17a.68.68,0,0,1-.37.18.28.28,0,0,1-.13,0,.43.43,0,0,1-.09-.1c-.07-.18.06-.34.19-.47A3.27,3.27,0,0,0,25,14.25a.52.52,0,0,0,0-.45.71.71,0,0,0-.55-.23c-.29,0-.7-.05-1.2-.05a26,26,0,0,0-4.71.4,39.51,39.51,0,0,1-4.17,8.79C12,26.18,9.36,28,6.55,28.22H6.19"/><path class="cls-7" d="M38.58,19.33a1.78,1.78,0,0,1,.12-.65,1.74,1.74,0,0,1,.34-.55,1.52,1.52,0,0,1,.52-.38,1.49,1.49,0,0,1,.67-.14,2,2,0,0,1,.62.09,2.3,2.3,0,0,1,.52.26.23.23,0,0,1,.09.19.21.21,0,0,1-.07.16.2.2,0,0,1-.15.06.23.23,0,0,1-.14,0,1.34,1.34,0,0,0-.4-.19,1.44,1.44,0,0,0-.46-.08,1.09,1.09,0,0,0-.48.11,1.19,1.19,0,0,0-.39.27,1.29,1.29,0,0,0-.34.88,1.21,1.21,0,0,0,.15.6,1.08,1.08,0,0,0,.41.41,1.28,1.28,0,0,0,.63.15,1.58,1.58,0,0,0,.38,0l.36-.08v-.78h-.69a.22.22,0,0,1-.17-.07.21.21,0,0,1-.06-.16.25.25,0,0,1,.06-.16.25.25,0,0,1,.17-.06h.92a.21.21,0,0,1,.22.22v1.16h0a.19.19,0,0,1,0,.12.25.25,0,0,1-.1.08,3.37,3.37,0,0,1-.48.15,2,2,0,0,1-.56.07,1.7,1.7,0,0,1-.85-.21,1.47,1.47,0,0,1-.59-.57A1.63,1.63,0,0,1,38.58,19.33Z"/><path class="cls-7" d="M45,20.75a.25.25,0,0,1-.06.16.22.22,0,0,1-.14.06.14.14,0,0,1-.11,0,.23.23,0,0,1-.07-.06,1.91,1.91,0,0,1-.36-.33,2.19,2.19,0,0,1-.26-.41,1,1,0,0,0-.19-.3.51.51,0,0,0-.23-.15.89.89,0,0,0-.35-.05H43v1.11h0a.21.21,0,0,1-.07.16.22.22,0,0,1-.16.07.23.23,0,0,1-.16-.08.24.24,0,0,1-.06-.17V17.88a.2.2,0,0,1,.07-.16.21.21,0,0,1,.15-.07h.66a1.94,1.94,0,0,1,.7.12,1,1,0,0,1,.48.34.88.88,0,0,1,.18.57.79.79,0,0,1-.09.38,1,1,0,0,1-.23.29,1.5,1.5,0,0,1-.32.19,1.24,1.24,0,0,1,.16.24,4.54,4.54,0,0,0,.25.45,1.52,1.52,0,0,0,.33.34.19.19,0,0,1,.07.08A.17.17,0,0,1,45,20.75Zm-1.55-2.64H43v1.08h.44a1.58,1.58,0,0,0,.65-.13.41.41,0,0,0,.24-.39.44.44,0,0,0-.25-.42A1.25,1.25,0,0,0,43.44,18.11Z"/><path class="cls-7" d="M47.57,17.62a1.53,1.53,0,0,1,.64.13,1.61,1.61,0,0,1,.84.91,1.78,1.78,0,0,1,.12.65,1.75,1.75,0,0,1-.12.65,1.69,1.69,0,0,1-.33.53,1.57,1.57,0,0,1-.51.36,1.67,1.67,0,0,1-1.29,0,1.57,1.57,0,0,1-.51-.36,1.64,1.64,0,0,1-.32-.54A1.75,1.75,0,0,1,46,19.3a1.72,1.72,0,0,1,.46-1.18,1.47,1.47,0,0,1,1.14-.5Zm0,.46a1.08,1.08,0,0,0-.6.17,1.15,1.15,0,0,0-.4.47,1.32,1.32,0,0,0-.15.62,1.13,1.13,0,0,0,.09.45,1.52,1.52,0,0,0,.24.38,1.34,1.34,0,0,0,.37.25.92.92,0,0,0,.44.1,1,1,0,0,0,.44-.1,1.37,1.37,0,0,0,.37-.26,1.39,1.39,0,0,0,.25-.38,1.06,1.06,0,0,0,.09-.42,1.31,1.31,0,0,0-.16-.65,1.21,1.21,0,0,0-.41-.46A1,1,0,0,0,47.58,18.08Z"/><path class="cls-7" d="M50.2,17.88a.25.25,0,0,1,.06-.16.22.22,0,0,1,.15-.06.23.23,0,0,1,.17.05.21.21,0,0,1,.07.17l0,1.64a1.36,1.36,0,0,0,.2.78.7.7,0,0,0,.64.28.93.93,0,0,0,.53-.13.74.74,0,0,0,.29-.36,1.44,1.44,0,0,0,.09-.53V17.88h0a.18.18,0,0,1,.07-.15.19.19,0,0,1,.16-.07.24.24,0,0,1,.23.22h0v1.68a1.61,1.61,0,0,1-.34,1.08,1.3,1.3,0,0,1-2.17-.33,2.12,2.12,0,0,1-.15-.78V17.88Z"/><path class="cls-7" d="M54.19,21a.23.23,0,0,1-.16-.06.21.21,0,0,1-.07-.16h0V17.88a.3.3,0,0,1,0-.14.21.21,0,0,1,.17-.08h.72a1.64,1.64,0,0,1,.6.11.89.89,0,0,1,.43.33.88.88,0,0,1,.16.55,1.06,1.06,0,0,1-.16.62,1,1,0,0,1-.47.34,1.69,1.69,0,0,1-.66.12h-.39v1h0a.24.24,0,0,1-.07.16A.25.25,0,0,1,54.19,21Zm1.45-2.31a.46.46,0,0,0-.2-.41,1.11,1.11,0,0,0-.56-.12h-.47v1.16h.38a1.35,1.35,0,0,0,.63-.13A.52.52,0,0,0,55.64,18.64Z"/><path class="cls-7" d="M.69,4.15h.36V3a1,1,0,0,0,.6.25c.5,0,.94-.43.94-1.17S2.29,1,1.73,1a1.16,1.16,0,0,0-.7.3H1l0-.25H.69ZM1.59,3a.89.89,0,0,1-.54-.22V1.62a.9.9,0,0,1,.59-.3c.41,0,.57.32.57.8S2,3,1.59,3Zm2,.31A1.17,1.17,0,0,0,4.33,3h0l0,.26h.3V1.9c0-.54-.22-.89-.75-.89a1.62,1.62,0,0,0-.86.28l.15.25a1.24,1.24,0,0,1,.65-.23c.36,0,.45.27.45.55C3.38,2,3,2.2,3,2.67A.59.59,0,0,0,3.61,3.29ZM3.71,3a.33.33,0,0,1-.38-.35c0-.28.25-.46,1-.55v.61A.89.89,0,0,1,3.71,3Zm1.66.24h.36V1.84c.14-.37.37-.5.55-.5a.46.46,0,0,1,.21,0l.07-.32A.43.43,0,0,0,6.33,1a.74.74,0,0,0-.62.45h0l0-.4h-.3Zm2.23,0A1.35,1.35,0,0,0,8,3.21l-.07-.27A1,1,0,0,1,7.68,3c-.25,0-.34-.15-.34-.42V1.36h.59v-.3H7.34V.45H7l0,.61-.34,0v.28H7v1.2C7,3,7.14,3.29,7.6,3.29Zm2.56,0a1,1,0,0,0,1-1.14,1,1,0,1,0-2,0A1,1,0,0,0,10.16,3.29Zm0-.31c-.37,0-.62-.33-.62-.83s.25-.84.62-.84.64.34.64.84S10.54,3,10.16,3Zm1.65.26h.36V1.36h.46v-.3h-.46V.72c0-.28.1-.43.31-.43a.57.57,0,0,1,.24.06L12.8.07A1,1,0,0,0,12.44,0c-.43,0-.63.28-.63.72v.34l-.3,0v.28h.3Z"/></g></g></svg> \ No newline at end of file diff --git a/src/assets/logo.svg b/src/assets/logo.svg new file mode 100644 index 0000000..239bf69 --- /dev/null +++ b/src/assets/logo.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200" version="1.1" viewBox="0 0 200 200"><title>Group 28 Copy 5</title><desc>Created with Sketch.</desc><defs><linearGradient id="linearGradient-1" x1="62.102%" x2="108.197%" y1="0%" y2="37.864%"><stop offset="0%" stop-color="#4285EB"/><stop offset="100%" stop-color="#2EC7FF"/></linearGradient><linearGradient id="linearGradient-2" x1="69.644%" x2="54.043%" y1="0%" y2="108.457%"><stop offset="0%" stop-color="#29CDFF"/><stop offset="37.86%" stop-color="#148EFF"/><stop offset="100%" stop-color="#0A60FF"/></linearGradient><linearGradient id="linearGradient-3" x1="69.691%" x2="16.723%" y1="-12.974%" y2="117.391%"><stop offset="0%" stop-color="#FA816E"/><stop offset="41.473%" stop-color="#F74A5C"/><stop offset="100%" stop-color="#F51D2C"/></linearGradient><linearGradient id="linearGradient-4" x1="68.128%" x2="30.44%" y1="-35.691%" y2="114.943%"><stop offset="0%" stop-color="#FA8E7D"/><stop offset="51.264%" stop-color="#F74A5C"/><stop offset="100%" stop-color="#F51D2C"/></linearGradient></defs><g id="Page-1" fill="none" fill-rule="evenodd" stroke="none" stroke-width="1"><g id="logo" transform="translate(-20.000000, -20.000000)"><g id="Group-28-Copy-5" transform="translate(20.000000, 20.000000)"><g id="Group-27-Copy-3"><g id="Group-25" fill-rule="nonzero"><g id="2"><path id="Shape" fill="url(#linearGradient-1)" d="M91.5880863,4.17652823 L4.17996544,91.5127728 C-0.519240605,96.2081146 -0.519240605,103.791885 4.17996544,108.487227 L91.5880863,195.823472 C96.2872923,200.518814 103.877304,200.518814 108.57651,195.823472 L145.225487,159.204632 C149.433969,154.999611 149.433969,148.181924 145.225487,143.976903 C141.017005,139.771881 134.193707,139.771881 129.985225,143.976903 L102.20193,171.737352 C101.032305,172.906015 99.2571609,172.906015 98.0875359,171.737352 L28.285908,101.993122 C27.1162831,100.824459 27.1162831,99.050775 28.285908,97.8821118 L98.0875359,28.1378823 C99.2571609,26.9692191 101.032305,26.9692191 102.20193,28.1378823 L129.985225,55.8983314 C134.193707,60.1033528 141.017005,60.1033528 145.225487,55.8983314 C149.433969,51.69331 149.433969,44.8756232 145.225487,40.6706018 L108.58055,4.05574592 C103.862049,-0.537986846 96.2692618,-0.500797906 91.5880863,4.17652823 Z"/><path id="Shape" fill="url(#linearGradient-2)" d="M91.5880863,4.17652823 L4.17996544,91.5127728 C-0.519240605,96.2081146 -0.519240605,103.791885 4.17996544,108.487227 L91.5880863,195.823472 C96.2872923,200.518814 103.877304,200.518814 108.57651,195.823472 L145.225487,159.204632 C149.433969,154.999611 149.433969,148.181924 145.225487,143.976903 C141.017005,139.771881 134.193707,139.771881 129.985225,143.976903 L102.20193,171.737352 C101.032305,172.906015 99.2571609,172.906015 98.0875359,171.737352 L28.285908,101.993122 C27.1162831,100.824459 27.1162831,99.050775 28.285908,97.8821118 L98.0875359,28.1378823 C100.999864,25.6271836 105.751642,20.541824 112.729652,19.3524487 C117.915585,18.4685261 123.585219,20.4140239 129.738554,25.1889424 C125.624663,21.0784292 118.571995,14.0340304 108.58055,4.05574592 C103.862049,-0.537986846 96.2692618,-0.500797906 91.5880863,4.17652823 Z"/></g><path id="Shape" fill="url(#linearGradient-3)" d="M153.685633,135.854579 C157.894115,140.0596 164.717412,140.0596 168.925894,135.854579 L195.959977,108.842726 C200.659183,104.147384 200.659183,96.5636133 195.960527,91.8688194 L168.690777,64.7181159 C164.472332,60.5180858 157.646868,60.5241425 153.435895,64.7316526 C149.227413,68.936674 149.227413,75.7543607 153.435895,79.9593821 L171.854035,98.3623765 C173.02366,99.5310396 173.02366,101.304724 171.854035,102.473387 L153.685633,120.626849 C149.47715,124.83187 149.47715,131.649557 153.685633,135.854579 Z"/></g><ellipse id="Combined-Shape" cx="100.519" cy="100.437" fill="url(#linearGradient-4)" rx="23.6" ry="23.581"/></g></g></g></g></svg> \ No newline at end of file diff --git a/src/assets/longLogo.svg b/src/assets/longLogo.svg new file mode 100644 index 0000000..ad67806 --- /dev/null +++ b/src/assets/longLogo.svg @@ -0,0 +1,36 @@ +<svg width="245" height="70" viewBox="0 0 245 70" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M32.4764 6.25299L6.25401 32.4539C4.84425 33.8625 4.84425 36.1376 6.25401 37.5462L32.4764 63.7471C33.8862 65.1557 36.1632 65.1557 37.573 63.7471L48.5677 52.7614C49.8302 51.4999 49.8302 49.4546 48.5677 48.1931C47.3051 46.9316 45.2581 46.9316 43.9956 48.1931L35.6606 56.5212C35.3097 56.8718 34.7772 56.8718 34.4263 56.5212L13.4858 35.598C13.1349 35.2474 13.1349 34.7153 13.4858 34.3647L34.4263 13.4414C34.7772 13.0908 35.3097 13.0908 35.6606 13.4414L43.9956 21.7695C45.2581 23.031 47.3051 23.031 48.5677 21.7695C49.8302 20.508 49.8302 18.4627 48.5677 17.2012L37.5742 6.21676C36.1586 4.83864 33.8808 4.84979 32.4764 6.25299Z" fill="url(#paint0_linear)"/> +<path d="M32.4764 6.25299L6.25401 32.4539C4.84425 33.8625 4.84425 36.1376 6.25401 37.5462L32.4764 63.7471C33.8862 65.1557 36.1632 65.1557 37.573 63.7471L48.5677 52.7614C49.8302 51.4999 49.8302 49.4546 48.5677 48.1931C47.3051 46.9316 45.2581 46.9316 43.9956 48.1931L35.6606 56.5212C35.3097 56.8718 34.7772 56.8718 34.4263 56.5212L13.4858 35.598C13.1349 35.2474 13.1349 34.7153 13.4858 34.3647L34.4263 13.4414C35.3 12.6882 36.7255 11.1626 38.8189 10.8058C40.3747 10.5406 42.0756 11.1242 43.9216 12.5567C42.6874 11.3236 40.5716 9.21024 37.5742 6.21676C36.1586 4.83864 33.8808 4.84979 32.4764 6.25299Z" fill="url(#paint1_linear)"/> +<path d="M51.1057 45.7564C52.3682 47.0179 54.4152 47.0179 55.6778 45.7564L63.788 37.6529C65.1978 36.2443 65.1978 33.9692 63.7882 32.5607L55.6072 24.4155C54.3417 23.1555 52.2941 23.1573 51.0308 24.4196C49.7682 25.6811 49.7682 27.7264 51.0308 28.9879L56.5562 34.5088C56.9071 34.8594 56.9071 35.3915 56.5562 35.7421L51.1057 41.1881C49.8431 42.4496 49.8431 44.4949 51.1057 45.7564Z" fill="url(#paint2_linear)"/> +<path d="M35.1558 42.2053C39.066 42.2053 42.2359 39.038 42.2359 35.131C42.2359 31.224 39.066 28.0568 35.1558 28.0568C31.2456 28.0568 28.0758 31.224 28.0758 35.131C28.0758 39.038 31.2456 42.2053 35.1558 42.2053Z" fill="url(#paint3_linear)"/> +<path d="M93.19 21.32L85 42.74H88.75L90.7 37.37H99.67L101.62 42.74H105.37L97.18 21.32H93.19ZM91.75 34.49L95.14 25.1H95.26L98.62 34.49H91.75Z" fill="#262626"/> +<path d="M115.171 26.81C114.241 26.81 113.401 26.99 112.621 27.38C111.871 27.74 111.181 28.31 110.581 29.03V27.23H107.161V42.74H110.581V33.41C110.701 32.18 111.121 31.22 111.841 30.56C112.471 29.96 113.221 29.66 114.061 29.66C116.401 29.66 117.571 30.92 117.571 33.47V42.74H120.991V33.17C120.991 28.91 119.041 26.81 115.171 26.81Z" fill="#262626"/> +<path d="M129.453 22.22L126.033 23.63V27.23H123.243V30.05H126.033V38.81C126.033 40.07 126.333 41 126.933 41.66C127.563 42.38 128.553 42.74 129.903 42.74H132.513V39.92H130.473C130.113 39.92 129.873 39.83 129.693 39.65C129.513 39.44 129.453 39.17 129.453 38.81V30.05H132.903V27.23H129.453V22.22Z" fill="#262626"/> +<path d="M145.752 21.32V42.74H153.582C157.062 42.74 159.672 41.78 161.472 39.86C163.182 38.03 164.052 35.42 164.052 32.03C164.052 28.61 163.182 26 161.472 24.2C159.672 22.28 157.062 21.32 153.582 21.32H145.752ZM149.262 24.32H152.922C155.592 24.32 157.542 24.92 158.772 26.15C159.972 27.35 160.572 29.33 160.572 32.03C160.572 34.67 159.972 36.62 158.772 37.88C157.542 39.11 155.592 39.74 152.922 39.74H149.262V24.32Z" fill="#262626"/> +<path d="M173.644 26.81C171.334 26.81 169.504 27.59 168.184 29.18C166.804 30.74 166.144 32.66 166.144 34.97C166.144 37.55 166.864 39.56 168.304 41.03C169.654 42.44 171.484 43.16 173.794 43.16C175.864 43.16 177.574 42.56 178.954 41.39C180.034 40.43 180.754 39.2 181.114 37.76H177.694C177.274 38.63 176.824 39.26 176.314 39.65C175.654 40.13 174.814 40.37 173.764 40.37C172.534 40.37 171.574 39.98 170.914 39.23C170.254 38.48 169.864 37.37 169.744 35.93H181.354C181.354 33.14 180.724 30.95 179.494 29.39C178.144 27.65 176.194 26.81 173.644 26.81ZM173.734 29.6C176.134 29.6 177.484 30.83 177.784 33.35H169.804C170.014 32.12 170.434 31.19 171.064 30.56C171.724 29.9 172.594 29.6 173.734 29.6Z" fill="#262626"/> +<path d="M189.916 26.81C187.996 26.81 186.466 27.2 185.296 28.04C184.096 28.82 183.526 29.93 183.526 31.37C183.526 32.72 184.126 33.77 185.326 34.52C186.076 35 187.366 35.45 189.196 35.87C190.756 36.23 191.776 36.5 192.256 36.74C193.156 37.16 193.606 37.73 193.606 38.45C193.606 39.71 192.406 40.37 190.006 40.37C188.866 40.37 188.056 40.16 187.546 39.8C187.036 39.38 186.676 38.69 186.496 37.7H183.166C183.496 41.33 185.806 43.16 190.126 43.16C194.776 43.16 197.116 41.51 197.116 38.21C197.116 36.83 196.486 35.72 195.256 34.94C194.416 34.37 193.096 33.89 191.356 33.47C189.796 33.08 188.776 32.78 188.266 32.57C187.426 32.21 187.036 31.76 187.036 31.28C187.036 30.68 187.276 30.26 187.816 29.99C188.266 29.72 188.956 29.6 189.856 29.6C190.906 29.6 191.686 29.75 192.196 30.08C192.676 30.38 193.036 30.95 193.276 31.73H196.606C196.246 28.43 193.996 26.81 189.916 26.81Z" fill="#262626"/> +<path d="M202.137 20.9C201.477 20.9 200.937 21.11 200.487 21.53C200.037 21.95 199.827 22.49 199.827 23.15C199.827 23.81 200.037 24.35 200.487 24.8C200.937 25.22 201.477 25.43 202.137 25.43C202.797 25.43 203.337 25.22 203.787 24.8C204.237 24.38 204.477 23.81 204.477 23.15C204.477 22.49 204.237 21.95 203.817 21.53C203.367 21.11 202.797 20.9 202.137 20.9ZM200.427 27.23V42.74H203.847V27.23H200.427Z" fill="#262626"/> +<path d="M214.539 26.81C212.439 26.81 210.729 27.53 209.439 28.97C208.119 30.41 207.489 32.3 207.489 34.64C207.489 36.98 208.119 38.87 209.439 40.28C210.729 41.66 212.439 42.38 214.539 42.38C216.459 42.38 217.989 41.57 219.129 39.98V42.26C219.129 45.02 217.839 46.4 215.259 46.4C214.059 46.4 213.189 46.22 212.649 45.89C212.079 45.53 211.719 44.93 211.539 44.06H208.119C208.419 45.8 209.139 47.06 210.279 47.9C211.419 48.68 213.069 49.1 215.259 49.1C220.119 49.1 222.549 46.64 222.549 41.75V27.23H219.129V29.12C217.989 27.56 216.459 26.81 214.539 26.81ZM215.079 29.57C216.369 29.57 217.389 30.02 218.109 30.92C218.799 31.82 219.159 33.05 219.159 34.64C219.159 36.2 218.799 37.4 218.109 38.3C217.389 39.14 216.369 39.59 215.049 39.59C213.549 39.59 212.499 39.08 211.839 38.09C211.269 37.25 210.999 36.11 210.999 34.64C210.999 33.02 211.359 31.79 212.079 30.92C212.799 30.02 213.789 29.57 215.079 29.57Z" fill="#262626"/> +<path d="M234.146 26.81C233.216 26.81 232.376 26.99 231.596 27.38C230.846 27.74 230.156 28.31 229.556 29.03V27.23H226.136V42.74H229.556V33.41C229.676 32.18 230.096 31.22 230.816 30.56C231.446 29.96 232.196 29.66 233.036 29.66C235.376 29.66 236.546 30.92 236.546 33.47V42.74H239.966V33.17C239.966 28.91 238.016 26.81 234.146 26.81Z" fill="#262626"/> +<defs> +<linearGradient id="paint0_linear" x1="32.7191" y1="5.1918" x2="57.6381" y2="20.4094" gradientUnits="userSpaceOnUse"> +<stop stop-color="#4285EB"/> +<stop offset="1" stop-color="#2EC7FF"/> +</linearGradient> +<linearGradient id="paint1_linear" x1="36.0615" y1="5.1918" x2="23.7538" y2="68.8011" gradientUnits="userSpaceOnUse"> +<stop stop-color="#29CDFF"/> +<stop offset="0.378601" stop-color="#148EFF"/> +<stop offset="1" stop-color="#0A60FF"/> +</linearGradient> +<linearGradient id="paint2_linear" x1="60.3713" y1="20.4576" x2="44.3571" y2="45.5025" gradientUnits="userSpaceOnUse"> +<stop stop-color="#FA816E"/> +<stop offset="0.414726" stop-color="#F74A5C"/> +<stop offset="1" stop-color="#F51D2C"/> +</linearGradient> +<linearGradient id="paint3_linear" x1="37.7228" y1="23.0071" x2="32.3944" y2="44.3215" gradientUnits="userSpaceOnUse"> +<stop stop-color="#FA8E7D"/> +<stop offset="0.512635" stop-color="#F74A5C"/> +<stop offset="1" stop-color="#F51D2C"/> +</linearGradient> +</defs> +</svg> diff --git a/src/assets/user/maskBackground.svg b/src/assets/user/maskBackground.svg new file mode 100644 index 0000000..89c2597 --- /dev/null +++ b/src/assets/user/maskBackground.svg @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="1361px" height="609px" viewBox="0 0 1361 609" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch --> + <title>Group 21</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="账户密ç 登录-æ ¡éªŒ" transform="translate(-79.000000, -82.000000)"> + <g id="Group-21" transform="translate(77.000000, 73.000000)"> + <g id="Group-18" opacity="0.8" transform="translate(74.901416, 569.699158) rotate(-7.000000) translate(-74.901416, -569.699158) translate(4.901416, 525.199158)"> + <ellipse id="Oval-11" fill="#CFDAE6" opacity="0.25" cx="63.5748792" cy="32.468367" rx="21.7830479" ry="21.766008"></ellipse> + <ellipse id="Oval-3" fill="#CFDAE6" opacity="0.599999964" cx="5.98746479" cy="13.8668601" rx="5.2173913" ry="5.21330997"></ellipse> + <path d="M38.1354514,88.3520215 C43.8984227,88.3520215 48.570234,83.6838647 48.570234,77.9254015 C48.570234,72.1669383 43.8984227,67.4987816 38.1354514,67.4987816 C32.3724801,67.4987816 27.7006688,72.1669383 27.7006688,77.9254015 C27.7006688,83.6838647 32.3724801,88.3520215 38.1354514,88.3520215 Z" id="Oval-3-Copy" fill="#CFDAE6" opacity="0.45"></path> + <path d="M64.2775582,33.1704963 L119.185836,16.5654915" id="Path-12" stroke="#CFDAE6" stroke-width="1.73913043" stroke-linecap="round" stroke-linejoin="round"></path> + <path d="M42.1431708,26.5002681 L7.71190162,14.5640702" id="Path-16" stroke="#E0B4B7" stroke-width="0.702678964" opacity="0.7" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"></path> + <path d="M63.9262187,33.521561 L43.6721326,69.3250951" id="Path-15" stroke="#BACAD9" stroke-width="0.702678964" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"></path> + <g id="Group-17" transform="translate(126.850922, 13.543654) rotate(30.000000) translate(-126.850922, -13.543654) translate(117.285705, 4.381889)" fill="#CFDAE6"> + <ellipse id="Oval-4" opacity="0.45" cx="9.13482653" cy="9.12768076" rx="9.13482653" ry="9.12768076"></ellipse> + <path d="M18.2696531,18.2553615 C18.2696531,13.2142826 14.1798519,9.12768076 9.13482653,9.12768076 C4.08980114,9.12768076 0,13.2142826 0,18.2553615 L18.2696531,18.2553615 Z" id="Oval-4" transform="translate(9.134827, 13.691521) scale(-1, -1) translate(-9.134827, -13.691521) "></path> + </g> + </g> + <g id="Group-14" transform="translate(216.294700, 123.725600) rotate(-5.000000) translate(-216.294700, -123.725600) translate(106.294700, 35.225600)"> + <ellipse id="Oval-2" fill="#CFDAE6" opacity="0.25" cx="29.1176471" cy="29.1402439" rx="29.1176471" ry="29.1402439"></ellipse> + <ellipse id="Oval-2" fill="#CFDAE6" opacity="0.3" cx="29.1176471" cy="29.1402439" rx="21.5686275" ry="21.5853659"></ellipse> + <ellipse id="Oval-2-Copy" stroke="#CFDAE6" opacity="0.4" cx="179.019608" cy="138.146341" rx="23.7254902" ry="23.7439024"></ellipse> + <ellipse id="Oval-2" fill="#BACAD9" opacity="0.5" cx="29.1176471" cy="29.1402439" rx="10.7843137" ry="10.7926829"></ellipse> + <path d="M29.1176471,39.9329268 L29.1176471,18.347561 C23.1616351,18.347561 18.3333333,23.1796097 18.3333333,29.1402439 C18.3333333,35.1008781 23.1616351,39.9329268 29.1176471,39.9329268 Z" id="Oval-2" fill="#BACAD9"></path> + <g id="Group-9" opacity="0.45" transform="translate(172.000000, 131.000000)" fill="#E6A1A6"> + <ellipse id="Oval-2-Copy-2" cx="7.01960784" cy="7.14634146" rx="6.47058824" ry="6.47560976"></ellipse> + <path d="M0.549019608,13.6219512 C4.12262681,13.6219512 7.01960784,10.722722 7.01960784,7.14634146 C7.01960784,3.56996095 4.12262681,0.670731707 0.549019608,0.670731707 L0.549019608,13.6219512 Z" id="Oval-2-Copy-2" transform="translate(3.784314, 7.146341) scale(-1, 1) translate(-3.784314, -7.146341) "></path> + </g> + <ellipse id="Oval-10" fill="#CFDAE6" cx="218.382353" cy="138.685976" rx="1.61764706" ry="1.61890244"></ellipse> + <ellipse id="Oval-10-Copy-2" fill="#E0B4B7" opacity="0.35" cx="179.558824" cy="175.381098" rx="1.61764706" ry="1.61890244"></ellipse> + <ellipse id="Oval-10-Copy" fill="#E0B4B7" opacity="0.35" cx="180.098039" cy="102.530488" rx="2.15686275" ry="2.15853659"></ellipse> + <path d="M28.9985381,29.9671598 L171.151018,132.876024" id="Path-11" stroke="#CFDAE6" opacity="0.8"></path> + </g> + <g id="Group-10" opacity="0.799999952" transform="translate(1054.100635, 36.659317) rotate(-11.000000) translate(-1054.100635, -36.659317) translate(1026.600635, 4.659317)"> + <ellipse id="Oval-7" stroke="#CFDAE6" stroke-width="0.941176471" cx="43.8135593" cy="32" rx="11.1864407" ry="11.2941176"></ellipse> + <g id="Group-12" transform="translate(34.596774, 23.111111)" fill="#BACAD9"> + <ellipse id="Oval-7" opacity="0.45" cx="9.18534718" cy="8.88888889" rx="8.47457627" ry="8.55614973"></ellipse> + <path d="M9.18534718,17.4450386 C13.8657264,17.4450386 17.6599235,13.6143199 17.6599235,8.88888889 C17.6599235,4.16345787 13.8657264,0.332739156 9.18534718,0.332739156 L9.18534718,17.4450386 Z" id="Oval-7"></path> + </g> + <path d="M34.6597385,24.809694 L5.71666084,4.76878945" id="Path-2" stroke="#CFDAE6" stroke-width="0.941176471"></path> + <ellipse id="Oval" stroke="#CFDAE6" stroke-width="0.941176471" cx="3.26271186" cy="3.29411765" rx="3.26271186" ry="3.29411765"></ellipse> + <ellipse id="Oval-Copy" fill="#F7E1AD" cx="2.79661017" cy="61.1764706" rx="2.79661017" ry="2.82352941"></ellipse> + <path d="M34.6312443,39.2922712 L5.06366663,59.785082" id="Path-10" stroke="#CFDAE6" stroke-width="0.941176471"></path> + </g> + <g id="Group-19" opacity="0.33" transform="translate(1282.537219, 446.502867) rotate(-10.000000) translate(-1282.537219, -446.502867) translate(1142.537219, 327.502867)"> + <g id="Group-17" transform="translate(141.333539, 104.502742) rotate(275.000000) translate(-141.333539, -104.502742) translate(129.333539, 92.502742)" fill="#BACAD9"> + <circle id="Oval-4" opacity="0.45" cx="11.6666667" cy="11.6666667" r="11.6666667"></circle> + <path d="M23.3333333,23.3333333 C23.3333333,16.8900113 18.1099887,11.6666667 11.6666667,11.6666667 C5.22334459,11.6666667 0,16.8900113 0,23.3333333 L23.3333333,23.3333333 Z" id="Oval-4" transform="translate(11.666667, 17.500000) scale(-1, -1) translate(-11.666667, -17.500000) "></path> + </g> + <circle id="Oval-5-Copy-6" fill="#CFDAE6" cx="201.833333" cy="87.5" r="5.83333333"></circle> + <path d="M143.5,88.8126685 L155.070501,17.6038544" id="Path-17" stroke="#BACAD9" stroke-width="1.16666667"></path> + <path d="M17.5,37.3333333 L127.466252,97.6449735" id="Path-18" stroke="#BACAD9" stroke-width="1.16666667"></path> + <polyline id="Path-19" stroke="#CFDAE6" stroke-width="1.16666667" points="143.902597 120.302281 174.935455 231.571342 38.5 147.510847 126.366941 110.833333"></polyline> + <path d="M159.833333,99.7453842 L195.416667,89.25" id="Path-20" stroke="#E0B4B7" stroke-width="1.16666667" opacity="0.6"></path> + <path d="M205.333333,82.1372105 L238.719406,36.1666667" id="Path-24" stroke="#BACAD9" stroke-width="1.16666667"></path> + <path d="M266.723424,132.231988 L207.083333,90.4166667" id="Path-25" stroke="#CFDAE6" stroke-width="1.16666667"></path> + <circle id="Oval-5" fill="#C1D1E0" cx="156.916667" cy="8.75" r="8.75"></circle> + <circle id="Oval-5-Copy-3" fill="#C1D1E0" cx="39.0833333" cy="148.75" r="5.25"></circle> + <circle id="Oval-5-Copy-2" fill-opacity="0.6" fill="#D1DEED" cx="8.75" cy="33.25" r="8.75"></circle> + <circle id="Oval-5-Copy-4" fill-opacity="0.6" fill="#D1DEED" cx="243.833333" cy="30.3333333" r="5.83333333"></circle> + <circle id="Oval-5-Copy-5" fill="#E0B4B7" cx="175.583333" cy="232.75" r="5.25"></circle> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/src/components/Authorized/Authorized.tsx b/src/components/Authorized/Authorized.tsx new file mode 100644 index 0000000..d91b7b5 --- /dev/null +++ b/src/components/Authorized/Authorized.tsx @@ -0,0 +1,35 @@ +import React from 'react'; +import { Result } from 'antd'; +import check, { IAuthorityType } from './CheckPermissions'; + +import AuthorizedRoute from './AuthorizedRoute'; +import Secured from './Secured'; + +interface AuthorizedProps { + authority: IAuthorityType; + noMatch?: React.ReactNode; +} + +type IAuthorizedType = React.FunctionComponent<AuthorizedProps> & { + Secured: typeof Secured; + check: typeof check; + AuthorizedRoute: typeof AuthorizedRoute; +}; + +const Authorized: React.FunctionComponent<AuthorizedProps> = ({ + children, + authority, + noMatch = ( + <Result + status="403" + title="403" + subTitle="Sorry, you are not authorized to access this page." + /> + ), +}) => { + const childrenRender: React.ReactNode = typeof children === 'undefined' ? null : children; + const dom = check(authority, childrenRender, noMatch); + return <>{dom}</>; +}; + +export default Authorized as IAuthorizedType; diff --git a/src/components/Authorized/AuthorizedRoute.tsx b/src/components/Authorized/AuthorizedRoute.tsx new file mode 100644 index 0000000..c2eb08e --- /dev/null +++ b/src/components/Authorized/AuthorizedRoute.tsx @@ -0,0 +1,33 @@ +import { Redirect, Route } from 'umi'; + +import React from 'react'; +import Authorized from './Authorized'; +import { IAuthorityType } from './CheckPermissions'; + +interface AuthorizedRouteProps { + currentAuthority: string; + component: React.ComponentClass<any, any>; + render: (props: any) => React.ReactNode; + redirectPath: string; + authority: IAuthorityType; +} + +const AuthorizedRoute: React.SFC<AuthorizedRouteProps> = ({ + component: Component, + render, + authority, + redirectPath, + ...rest +}) => ( + <Authorized + authority={authority} + noMatch={<Route {...rest} render={() => <Redirect to={{ pathname: redirectPath }} />} />} + > + <Route + {...rest} + render={(props: any) => (Component ? <Component {...props} /> : render(props))} + /> + </Authorized> +); + +export default AuthorizedRoute; diff --git a/src/components/Authorized/CheckPermissions.tsx b/src/components/Authorized/CheckPermissions.tsx new file mode 100644 index 0000000..887bcc1 --- /dev/null +++ b/src/components/Authorized/CheckPermissions.tsx @@ -0,0 +1,79 @@ +import React from 'react'; +import { CURRENT } from './renderAuthorize'; +// eslint-disable-next-line import/no-cycle +import PromiseRender from './PromiseRender'; + +export type IAuthorityType = + | undefined + | string + | string[] + | Promise<boolean> + | ((currentAuthority: string | string[]) => IAuthorityType); + +/** + * 通用æƒé™æ£€æŸ¥æ–¹æ³• + * Common check permissions method + * @param { æƒé™åˆ¤å®š | Permission judgment } authority + * @param { ä½ çš„æƒé™ | Your permission description } currentAuthority + * @param { 通过的组件 | Passing components } target + * @param { 未通过的组件 | no pass components } Exception + */ +const checkPermissions = <T, K>( + authority: IAuthorityType, + currentAuthority: string | string[], + target: T, + Exception: K, +): T | K | React.ReactNode => { + // 没有判定æƒé™.默认查看所有 + // Retirement authority, return target; + if (!authority) { + return target; + } + // æ•°ç»„å¤„ç† + if (Array.isArray(authority)) { + if (Array.isArray(currentAuthority)) { + if (currentAuthority.some((item) => authority.includes(item))) { + return target; + } + } else if (authority.includes(currentAuthority)) { + return target; + } + return Exception; + } + // string å¤„ç† + if (typeof authority === 'string') { + if (Array.isArray(currentAuthority)) { + if (currentAuthority.some((item) => authority === item)) { + return target; + } + } else if (authority === currentAuthority) { + return target; + } + return Exception; + } + // Promise å¤„ç† + if (authority instanceof Promise) { + return <PromiseRender<T, K> ok={target} error={Exception} promise={authority} />; + } + // Function å¤„ç† + if (typeof authority === 'function') { + const bool = authority(currentAuthority); + // 函数执行åŽè¿”回值是 Promise + if (bool instanceof Promise) { + return <PromiseRender<T, K> ok={target} error={Exception} promise={bool} />; + } + if (bool) { + return target; + } + return Exception; + } + throw new Error('unsupported parameters'); +}; + +export { checkPermissions }; + +function check<T, K>(authority: IAuthorityType, target: T, Exception: K): T | K | React.ReactNode { + return checkPermissions<T, K>(authority, CURRENT, target, Exception); +} + +export default check; diff --git a/src/components/Authorized/PromiseRender.tsx b/src/components/Authorized/PromiseRender.tsx new file mode 100644 index 0000000..25f2597 --- /dev/null +++ b/src/components/Authorized/PromiseRender.tsx @@ -0,0 +1,93 @@ +import React from 'react'; +import { Spin } from 'antd'; +import isEqual from 'lodash/isEqual'; +import { isComponentClass } from './Secured'; +// eslint-disable-next-line import/no-cycle + +interface PromiseRenderProps<T, K> { + ok: T; + error: K; + promise: Promise<boolean>; +} + +interface PromiseRenderState { + component: React.ComponentClass | React.FunctionComponent; +} + +export default class PromiseRender<T, K> extends React.Component< + PromiseRenderProps<T, K>, + PromiseRenderState +> { + state: PromiseRenderState = { + component: () => null, + }; + + componentDidMount() { + this.setRenderComponent(this.props); + } + + shouldComponentUpdate = (nextProps: PromiseRenderProps<T, K>, nextState: PromiseRenderState) => { + const { component } = this.state; + if (!isEqual(nextProps, this.props)) { + this.setRenderComponent(nextProps); + } + if (nextState.component !== component) return true; + return false; + }; + + // set render Component : ok or error + setRenderComponent(props: PromiseRenderProps<T, K>) { + const ok = this.checkIsInstantiation(props.ok); + const error = this.checkIsInstantiation(props.error); + props.promise + .then(() => { + this.setState({ + component: ok, + }); + return true; + }) + .catch(() => { + this.setState({ + component: error, + }); + }); + } + + // Determine whether the incoming component has been instantiated + // AuthorizedRoute is already instantiated + // Authorized render is already instantiated, children is no instantiated + // Secured is not instantiated + checkIsInstantiation = ( + target: React.ReactNode | React.ComponentClass, + ): React.FunctionComponent => { + if (isComponentClass(target)) { + const Target = target as React.ComponentClass; + return (props: any) => <Target {...props} />; + } + if (React.isValidElement(target)) { + return (props: any) => React.cloneElement(target, props); + } + return () => target as React.ReactNode & null; + }; + + render() { + const { component: Component } = this.state; + const { ok, error, promise, ...rest } = this.props; + + return Component ? ( + <Component {...rest} /> + ) : ( + <div + style={{ + width: '100%', + height: '100%', + margin: 'auto', + paddingTop: 50, + textAlign: 'center', + }} + > + <Spin size="large" /> + </div> + ); + } +} diff --git a/src/components/Authorized/Secured.tsx b/src/components/Authorized/Secured.tsx new file mode 100644 index 0000000..0bdbbe4 --- /dev/null +++ b/src/components/Authorized/Secured.tsx @@ -0,0 +1,66 @@ +import React from 'react'; +import CheckPermissions from './CheckPermissions'; + +/** + * 默认ä¸èƒ½è®¿é—®ä»»ä½•é¡µé¢ + * default is "NULL" + */ +const Exception403 = () => 403; + +export const isComponentClass = (component: React.ComponentClass | React.ReactNode): boolean => { + if (!component) return false; + const proto = Object.getPrototypeOf(component); + if (proto === React.Component || proto === Function.prototype) return true; + return isComponentClass(proto); +}; + +// Determine whether the incoming component has been instantiated +// AuthorizedRoute is already instantiated +// Authorized render is already instantiated, children is no instantiated +// Secured is not instantiated +const checkIsInstantiation = (target: React.ComponentClass | React.ReactNode) => { + if (isComponentClass(target)) { + const Target = target as React.ComponentClass; + return (props: any) => <Target {...props} />; + } + if (React.isValidElement(target)) { + return (props: any) => React.cloneElement(target, props); + } + return () => target; +}; + +/** + * ç”¨äºŽåˆ¤æ–æ˜¯å¦æ‹¥æœ‰æƒé™è®¿é—®æ¤ view æƒé™ + * authority 支æŒä¼ å…¥ string, () => boolean | Promise + * e.g. 'user' åªæœ‰ user 用户能访问 + * e.g. 'user,admin' user å’Œ admin 都能访问 + * e.g. ()=>boolean 返回true能访问,返回falseä¸èƒ½è®¿é—® + * e.g. Promise then 能访问 catchä¸èƒ½è®¿é—® + * e.g. authority support incoming string, () => boolean | Promise + * e.g. 'user' only user user can access + * e.g. 'user, admin' user and admin can access + * e.g. () => boolean true to be able to visit, return false can not be accessed + * e.g. Promise then can not access the visit to catch + * @param {string | function | Promise} authority + * @param {ReactNode} error éžå¿…éœ€å‚æ•° + */ +const authorize = (authority: string, error?: React.ReactNode) => { + /** + * conversion into a class + * 防æ¢ä¼ å…¥å—符串时找ä¸åˆ°staticContexté€ æˆæŠ¥é”™ + * String parameters can cause staticContext not found error + */ + let classError: boolean | React.FunctionComponent = false; + if (error) { + classError = (() => error) as React.FunctionComponent; + } + if (!authority) { + throw new Error('authority is required'); + } + return function decideAuthority(target: React.ComponentClass | React.ReactNode) { + const component = CheckPermissions(authority, target, classError || Exception403); + return checkIsInstantiation(component); + }; +}; + +export default authorize; diff --git a/src/components/Authorized/index.tsx b/src/components/Authorized/index.tsx new file mode 100644 index 0000000..6703a46 --- /dev/null +++ b/src/components/Authorized/index.tsx @@ -0,0 +1,11 @@ +import Authorized from './Authorized'; +import Secured from './Secured'; +import check from './CheckPermissions'; +import renderAuthorize from './renderAuthorize'; + +Authorized.Secured = Secured; +Authorized.check = check; + +const RenderAuthorize = renderAuthorize(Authorized); + +export default RenderAuthorize; diff --git a/src/components/Authorized/renderAuthorize.ts b/src/components/Authorized/renderAuthorize.ts new file mode 100644 index 0000000..df00875 --- /dev/null +++ b/src/components/Authorized/renderAuthorize.ts @@ -0,0 +1,30 @@ +/* eslint-disable eslint-comments/disable-enable-pair */ +/* eslint-disable import/no-mutable-exports */ +let CURRENT: string | string[] = 'NULL'; + +type CurrentAuthorityType = string | string[] | (() => typeof CURRENT); +/** + * use authority or getAuthority + * @param {string|()=>String} currentAuthority + */ +const renderAuthorize = <T>(Authorized: T): ((currentAuthority: CurrentAuthorityType) => T) => ( + currentAuthority: CurrentAuthorityType, +): T => { + if (currentAuthority) { + if (typeof currentAuthority === 'function') { + CURRENT = currentAuthority(); + } + if ( + Object.prototype.toString.call(currentAuthority) === '[object String]' || + Array.isArray(currentAuthority) + ) { + CURRENT = currentAuthority as string[]; + } + } else { + CURRENT = 'NULL'; + } + return Authorized; +}; + +export { CURRENT }; +export default <T>(Authorized: T) => renderAuthorize<T>(Authorized); diff --git a/src/components/GlobalFooter/index.tsx b/src/components/GlobalFooter/index.tsx new file mode 100644 index 0000000..84ed279 --- /dev/null +++ b/src/components/GlobalFooter/index.tsx @@ -0,0 +1,66 @@ +import { DefaultFooter } from '@ant-design/pro-layout'; +import styles from './style.less'; +import React, { useState } from 'react'; +import longLogo from '@/assets/longLogo.svg'; +import { getMapStateToProps } from '@/utils/utils'; +import joideaLogo from '@/assets/joideaGroupLogo.svg'; +import { Button, Modal } from 'antd'; +import { connect } from 'dva'; +import defaultSettings from '../../../config/defaultSettings'; + +const Footer: React.FC<any> = (props: any) => { + const { + helper: { tx }, + } = props; + + const [showModal, setShowModal]: [boolean, any] = useState(false); + const [title, setTitle]: [string, any] = useState(''); + const { projectOwnerUrl, termsAndConditionUrl, privacyPolicyUrl } = defaultSettings; + + const routeToUrl = (url: string) => { + window.location.href = url; + }; + + return ( + <div className={styles.customerizedFooterContainer}> + <DefaultFooter + className={styles.CustomerizedFooter} + links={[ + { + key: 'ANT-DESIGN', + title: <img alt="logo" className={styles.footerPopsupLogo} src={longLogo} />, + href: '/od', + }, + { key: '', title: '|', href: '' }, + { + key: 'JOIDEA', + title: <img alt="logo" className={styles.footerJoideaLogo} src={joideaLogo} />, + href: 'https://joidea.com', + blankTarget: true, + }, + ]} + copyright="Joidea - All Rights Reserved" + /> + + <span className={styles.CustomerizedFooterLinks}> + <Button type="link" onClick={() => routeToUrl(projectOwnerUrl)}> + {'Joidea'} + </Button> + + <Button type="link" onClick={() => routeToUrl(termsAndConditionUrl)}> + {tx('Global.terms_and_condition')} + </Button> + <Button type="link" onClick={() => routeToUrl(privacyPolicyUrl)}> + {tx('Global.privacy_policy')} + </Button> + </span> + + <Modal title={title} visible={showModal} footer={null} onCancel={() => setShowModal(false)}> + {title === 'terms' && <p> {tx('Global.terms_and_condition')}</p>} + {title === 'privacy' && <p> {tx('Global.privacy')}</p>} + </Modal> + </div> + ); +}; + +export default connect(getMapStateToProps([]))(Footer); diff --git a/src/components/GlobalFooter/style.less b/src/components/GlobalFooter/style.less new file mode 100644 index 0000000..45f397c --- /dev/null +++ b/src/components/GlobalFooter/style.less @@ -0,0 +1,39 @@ +@import '~antd/es/style/themes/default.less'; + +.customerizedFooterContainer { + display: flex; + flex-direction: column; + align-items: center; + + .CustomerizedFooter { + background: unset !important; + } + + .CustomerizedFooterLinks { + display: flex; + justify-content: space-between; + button { + color: @primary-color; + } + } + :global { + footer .ant-pro-global-footer-links a { + margin-right: 15px; + } + + .ant-pro-global-footer { + margin-bottom: 0; + } + } +} + +.footerPopsupLogo { + height: 20px; +} +.footerJoideaLogo { + height: 40px; +} + +.registerLayout { + min-width: 368px; +} diff --git a/src/components/GlobalHeader/AvatarDropdown.tsx b/src/components/GlobalHeader/AvatarDropdown.tsx new file mode 100644 index 0000000..f9e4468 --- /dev/null +++ b/src/components/GlobalHeader/AvatarDropdown.tsx @@ -0,0 +1,92 @@ +import { LogoutOutlined, SettingOutlined, UserOutlined } from '@ant-design/icons'; +import { Avatar, Menu, Spin } from 'antd'; +import React from 'react'; +import { history, ConnectProps, connect } from 'umi'; +import { ConnectState } from '@/models/connect'; +import { CurrentUser } from '@/models/user'; +import HeaderDropdown from '../HeaderDropdown'; +import styles from './index.less'; + +export interface GlobalHeaderRightProps extends Partial<ConnectProps> { + currentUser?: CurrentUser; + menu?: boolean; +} + +class AvatarDropdown extends React.Component<GlobalHeaderRightProps> { + onMenuClick = (event: { + key: React.Key; + keyPath: React.Key[]; + item: React.ReactInstance; + domEvent: React.MouseEvent<HTMLElement>; + }) => { + const { key } = event; + + if (key === 'logout') { + const { dispatch } = this.props; + + if (dispatch) { + dispatch({ + type: 'user/clearCurrentUser', + }); + } + + return; + } + + history.push(`/account/${key}`); + }; + + render(): React.ReactNode { + const { + currentUser = { + avatar: '', + name: '', + }, + menu, + } = this.props; + const menuHeaderDropdown = ( + <Menu className={styles.menu} selectedKeys={[]} onClick={this.onMenuClick}> + {menu && ( + <Menu.Item key="center"> + <UserOutlined /> + 个人ä¸å¿ƒ + </Menu.Item> + )} + {menu && ( + <Menu.Item key="settings"> + <SettingOutlined /> + 个人设置 + </Menu.Item> + )} + {menu && <Menu.Divider />} + + <Menu.Item key="logout"> + <LogoutOutlined /> + 退出登录 + </Menu.Item> + </Menu> + ); + return currentUser && currentUser.name ? ( + <HeaderDropdown overlay={menuHeaderDropdown}> + <span className={`${styles.action} ${styles.account}`}> + <Avatar size="small" className={styles.avatar} src={currentUser.avatar} alt="avatar" /> + <span className={`${styles.name} anticon`}>{currentUser.name}</span> + </span> + </HeaderDropdown> + ) : ( + <span className={`${styles.action} ${styles.account}`}> + <Spin + size="small" + style={{ + marginLeft: 8, + marginRight: 8, + }} + /> + </span> + ); + } +} + +export default connect(({ user }: ConnectState) => ({ + currentUser: user.currentUser, +}))(AvatarDropdown); diff --git a/src/components/GlobalHeader/NoticeIconView.tsx b/src/components/GlobalHeader/NoticeIconView.tsx new file mode 100644 index 0000000..825d308 --- /dev/null +++ b/src/components/GlobalHeader/NoticeIconView.tsx @@ -0,0 +1,171 @@ +import React, { Component } from 'react'; +import { connect, ConnectProps } from 'umi'; +import { Tag, message } from 'antd'; +import groupBy from 'lodash/groupBy'; +import moment from 'moment'; +import { NoticeItem } from '@/models/global'; +import { CurrentUser } from '@/models/user'; +import { ConnectState } from '@/models/connect'; +import NoticeIcon from '../NoticeIcon'; +import styles from './index.less'; + +export interface GlobalHeaderRightProps extends Partial<ConnectProps> { + notices?: NoticeItem[]; + currentUser?: CurrentUser; + fetchingNotices?: boolean; + onNoticeVisibleChange?: (visible: boolean) => void; + onNoticeClear?: (tabName?: string) => void; +} + +class GlobalHeaderRight extends Component<GlobalHeaderRightProps> { + componentDidMount() { + const { dispatch } = this.props; + + if (dispatch) { + dispatch({ + type: 'global/fetchNotices', + }); + } + } + + changeReadState = (clickedItem: NoticeItem): void => { + const { id } = clickedItem; + const { dispatch } = this.props; + + if (dispatch) { + dispatch({ + type: 'global/changeNoticeReadState', + payload: id, + }); + } + }; + + handleNoticeClear = (title: string, key: string) => { + const { dispatch } = this.props; + message.success(`${'清空了'} ${title}`); + + if (dispatch) { + dispatch({ + type: 'global/clearNotices', + payload: key, + }); + } + }; + + getNoticeData = (): { + [key: string]: NoticeItem[]; + } => { + const { notices = [] } = this.props; + + if (!notices || notices.length === 0 || !Array.isArray(notices)) { + return {}; + } + + const newNotices = notices.map((notice) => { + const newNotice = { ...notice }; + + if (newNotice.datetime) { + newNotice.datetime = moment(notice.datetime as string).fromNow(); + } + + if (newNotice.id) { + newNotice.key = newNotice.id; + } + + if (newNotice.extra && newNotice.status) { + const color = { + todo: '', + processing: 'blue', + urgent: 'red', + doing: 'gold', + }[newNotice.status]; + newNotice.extra = ( + <Tag + color={color} + style={{ + marginRight: 0, + }} + > + {newNotice.extra} + </Tag> + ); + } + + return newNotice; + }); + return groupBy(newNotices, 'type'); + }; + + getUnreadData = (noticeData: { [key: string]: NoticeItem[] }) => { + const unreadMsg: { + [key: string]: number; + } = {}; + Object.keys(noticeData).forEach((key) => { + const value = noticeData[key]; + + if (!unreadMsg[key]) { + unreadMsg[key] = 0; + } + + if (Array.isArray(value)) { + unreadMsg[key] = value.filter((item) => !item.read).length; + } + }); + return unreadMsg; + }; + + render() { + const { currentUser, fetchingNotices, onNoticeVisibleChange } = this.props; + const noticeData = this.getNoticeData(); + const unreadMsg = this.getUnreadData(noticeData); + return ( + <NoticeIcon + className={styles.action} + count={currentUser && currentUser.unreadCount} + onItemClick={(item) => { + this.changeReadState(item as NoticeItem); + }} + loading={fetchingNotices} + clearText="清空" + viewMoreText="查看更多" + onClear={this.handleNoticeClear} + onPopupVisibleChange={onNoticeVisibleChange} + onViewMore={() => message.info('Click on view more')} + clearClose + > + <NoticeIcon.Tab + tabKey="notification" + count={unreadMsg.notification} + list={noticeData.notification} + title="通知" + emptyText="ä½ å·²æŸ¥çœ‹æ‰€æœ‰é€šçŸ¥" + showViewMore + /> + <NoticeIcon.Tab + tabKey="message" + count={unreadMsg.message} + list={noticeData.message} + title="消æ¯" + emptyText="您已读完所有消æ¯" + showViewMore + /> + <NoticeIcon.Tab + tabKey="event" + title="待办" + emptyText="ä½ å·²å®Œæˆæ‰€æœ‰å¾…办" + count={unreadMsg.event} + list={noticeData.event} + showViewMore + /> + </NoticeIcon> + ); + } +} + +export default connect(({ user, global, loading }: ConnectState) => ({ + currentUser: user.currentUser, + collapsed: global.collapsed, + fetchingMoreNotices: loading.effects['global/fetchMoreNotices'], + fetchingNotices: loading.effects['global/fetchNotices'], + notices: global.notices, +}))(GlobalHeaderRight); diff --git a/src/components/GlobalHeader/RightContent.tsx b/src/components/GlobalHeader/RightContent.tsx new file mode 100644 index 0000000..2d1bfd5 --- /dev/null +++ b/src/components/GlobalHeader/RightContent.tsx @@ -0,0 +1,47 @@ +import { Tooltip, Button, Menu, Dropdown } from 'antd'; +import React, { useState } from 'react'; +import { connect } from 'dva'; +import { formatMessage } from 'umi-plugin-react/locale'; +import { ConnectState } from '@/models/connect'; +import HeaderSearch from '../HeaderSearch'; +import SelectLang from '../SelectLang'; +import styles from './index.less'; +import { getMapStateToProps } from '@/utils/utils'; +import HeaderAvatar from '@/components/HeaderAvatar'; + +const GlobalHeaderRight: React.FC<any> = (props) => { + const { + helper: { tx }, + meta, + od, + dispatch, + } = props; + + // const menu = ( + // <Menu defaultSelectedKeys={[`${editingBusiness.bId}`]} onClick={changeOdBusinessId}> + // {ownedBusiness.map((item: any) => ( + // <Menu.Item key={item.bId}>{item.businessName}</Menu.Item> + // ))} + // </Menu> + // ); + + return ( + <div className={styles.right}> + {/* <Dropdown overlay={menu} placement="bottomRight"> + <Button type="link" className={styles.business}> + {editingBusiness.businessName} + <Icon style={{ marginLeft: '2px' }} type="down" /> + </Button> + </Dropdown> */} + + {/* <Avatar /> */} + <HeaderAvatar modelKey="od" /> + + <span className={styles.action}> + <SelectLang modelKey="od" /> + </span> + </div> + ); +}; + +export default connect(getMapStateToProps(['meta', 'od', 'user']))(GlobalHeaderRight); diff --git a/src/components/GlobalHeader/index.less b/src/components/GlobalHeader/index.less new file mode 100644 index 0000000..a7fa9bf --- /dev/null +++ b/src/components/GlobalHeader/index.less @@ -0,0 +1,82 @@ +@import '~antd/es/style/themes/default.less'; + +@pro-header-hover-bg: rgba(0, 0, 0, 0.025); + +.menu { + :global(.anticon) { + margin-right: 8px; + } + :global(.ant-dropdown-menu-item) { + min-width: 160px; + } +} + +.right { + display: flex; + float: right; + height: 48px; + margin-left: auto; + overflow: hidden; + .action { + display: flex; + align-items: center; + height: 100%; + padding: 0 12px; + cursor: pointer; + transition: all 0.3s; + > span { + vertical-align: middle; + } + &:hover { + background: @pro-header-hover-bg; + } + &:global(.opened) { + background: @pro-header-hover-bg; + } + } + .search { + padding: 0 12px; + &:hover { + background: transparent; + } + } + .account { + .avatar { + margin: ~'calc((@{layout-header-height} - 24px) / 2)' 0; + margin-right: 8px; + color: @primary-color; + vertical-align: top; + background: rgba(255, 255, 255, 0.85); + } + } +} + +.dark { + .action { + color: rgba(255, 255, 255, 0.85); + > span { + color: rgba(255, 255, 255, 0.85); + } + &:hover, + &:global(.opened) { + background: @primary-color; + } + } +} + +:global(.ant-pro-global-header) { + .dark { + .action { + color: @text-color; + > span { + color: @text-color; + } + &:hover { + color: rgba(255, 255, 255, 0.85); + > span { + color: rgba(255, 255, 255, 0.85); + } + } + } + } +} diff --git a/src/components/HeaderAvatar/index.less b/src/components/HeaderAvatar/index.less new file mode 100644 index 0000000..774e987 --- /dev/null +++ b/src/components/HeaderAvatar/index.less @@ -0,0 +1,28 @@ +.removeBorder { + padding: 0; + border-width: 0; +} + +.loginedBtns { + display: flex; + align-items: center; + justify-content: space-between; + min-width: 50px; + height: 100%; + color: @primary-color; +} + +.loginBtns { + display: flex; + align-items: center; + justify-content: space-between; + min-width: 85px; + height: 100%; + color: #737373; +} + +.menuItem { + display: flex; + flex-direction: row-reverse; + font-size: 15px; +} diff --git a/src/components/HeaderAvatar/index.tsx b/src/components/HeaderAvatar/index.tsx new file mode 100644 index 0000000..f7ae0c8 --- /dev/null +++ b/src/components/HeaderAvatar/index.tsx @@ -0,0 +1,82 @@ +import React from 'react'; +import { connect } from 'dva'; +import { getMapStateToProps } from '@/utils/utils'; +import { Menu, Button, Avatar, message } from 'antd'; +import HeaderDropdown from '../HeaderDropdown'; +import styles from './index.less'; +import classNames from 'classnames'; +import { history } from 'umi'; +import { DownOutlined, UserOutlined } from '@ant-design/icons'; + +interface HeaderAvatarProps { + modelKey: any; +} + +const HeaderAvatar: React.FC<HeaderAvatarProps> = (props: any) => { + const { + meta: { + isMobile, + currentUserDetails: { avatar = false }, + }, + user: { currentUser }, + dispatch, + helper: { tx }, + modelKey, + } = props; + + const isLogin = currentUser && currentUser.id ? true : false; + + const isWeb = isMobile ? false : true; + + const loginedClass = classNames(styles.removeBorder, styles.loginedBtns); + + const unLoginClass = classNames(styles.removeBorder, styles.loginBtns); + + const onClickUserProfile = () => { + history.push('/od/dashboard'); + }; + + const toggleSignOut = () => { + if (dispatch) { + dispatch({ + type: 'user/clearCurrentUser', + }); + message.success(tx('Login.already_logged_out')); + } + }; + + const loginMenuDropdown = ( + <Menu> + <Menu.Item key="email" className={styles.menuItem} onClick={onClickUserProfile}> + {currentUser.email} + </Menu.Item> + <Menu.Item key="signOut" className={styles.menuItem} onClick={toggleSignOut}> + {tx('Login.sign_out')} + </Menu.Item> + </Menu> + ); + + if (isLogin) { + return ( + <HeaderDropdown overlay={loginMenuDropdown} placement="bottomRight"> + <Button className={loginedClass}> + <Avatar + src={avatar && avatar.url} + icon={<UserOutlined />} + style={{ backgroundColor: '@primary-color' }} + /> + <DownOutlined /> + </Button> + </HeaderDropdown> + ); + } + + return ( + <Button className={unLoginClass} onClick={() => history.push('/user/login')}> + <Avatar size={32} icon="user" /> + {isWeb && tx('Login.login')} + </Button> + ); +}; + +export default connect(getMapStateToProps(['meta', 'user']))(HeaderAvatar); diff --git a/src/components/HeaderDropdown/index.less b/src/components/HeaderDropdown/index.less new file mode 100644 index 0000000..004b53e --- /dev/null +++ b/src/components/HeaderDropdown/index.less @@ -0,0 +1,16 @@ +@import '~antd/es/style/themes/default.less'; + +.container > * { + background-color: @popover-bg; + border-radius: 4px; + box-shadow: @shadow-1-down; +} + +@media screen and (max-width: @screen-xs) { + .container { + width: 100% !important; + } + .container > * { + border-radius: 0 !important; + } +} diff --git a/src/components/HeaderDropdown/index.tsx b/src/components/HeaderDropdown/index.tsx new file mode 100644 index 0000000..cc60727 --- /dev/null +++ b/src/components/HeaderDropdown/index.tsx @@ -0,0 +1,19 @@ +import { DropDownProps } from 'antd/es/dropdown'; +import { Dropdown } from 'antd'; +import React from 'react'; +import classNames from 'classnames'; +import styles from './index.less'; + +declare type OverlayFunc = () => React.ReactNode; + +export interface HeaderDropdownProps extends Omit<DropDownProps, 'overlay'> { + overlayClassName?: string; + overlay: React.ReactNode | OverlayFunc | any; + placement?: 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topCenter' | 'topRight' | 'bottomCenter'; +} + +const HeaderDropdown: React.FC<HeaderDropdownProps> = ({ overlayClassName: cls, ...restProps }) => ( + <Dropdown overlayClassName={classNames(styles.container, cls)} {...restProps} /> +); + +export default HeaderDropdown; diff --git a/src/components/HeaderSearch/index.less b/src/components/HeaderSearch/index.less new file mode 100644 index 0000000..9af69d5 --- /dev/null +++ b/src/components/HeaderSearch/index.less @@ -0,0 +1,30 @@ +@import '~antd/es/style/themes/default.less'; + +.headerSearch { + .input { + width: 0; + min-width: 0; + overflow: hidden; + background: transparent; + border-radius: 0; + transition: width 0.3s, margin-left 0.3s; + :global(.ant-select-selection) { + background: transparent; + } + input { + padding-right: 0; + padding-left: 0; + border: 0; + box-shadow: none !important; + } + &, + &:hover, + &:focus { + border-bottom: 1px solid @border-color-base; + } + &.show { + width: 210px; + margin-left: 8px; + } + } +} diff --git a/src/components/HeaderSearch/index.tsx b/src/components/HeaderSearch/index.tsx new file mode 100644 index 0000000..290d431 --- /dev/null +++ b/src/components/HeaderSearch/index.tsx @@ -0,0 +1,105 @@ +import { SearchOutlined } from '@ant-design/icons'; +import { AutoComplete, Input } from 'antd'; +import useMergeValue from 'use-merge-value'; +import { AutoCompleteProps } from 'antd/es/auto-complete'; +import React, { useRef } from 'react'; + +import classNames from 'classnames'; +import styles from './index.less'; + +export interface HeaderSearchProps { + onSearch?: (value?: string) => void; + onChange?: (value?: string) => void; + onVisibleChange?: (b: boolean) => void; + className?: string; + placeholder?: string; + options: AutoCompleteProps['options']; + defaultOpen?: boolean; + open?: boolean; + defaultValue?: string; + value?: string; +} + +const HeaderSearch: React.FC<HeaderSearchProps> = (props) => { + const { + className, + defaultValue, + onVisibleChange, + placeholder, + open, + defaultOpen, + ...restProps + } = props; + + const inputRef = useRef<Input | null>(null); + + const [value, setValue] = useMergeValue<string | undefined>(defaultValue, { + value: props.value, + onChange: props.onChange, + }); + + const [searchMode, setSearchMode] = useMergeValue(defaultOpen || false, { + value: props.open, + onChange: onVisibleChange, + }); + + const inputClass = classNames(styles.input, { + [styles.show]: searchMode, + }); + + return ( + <div + className={classNames(className, styles.headerSearch)} + onClick={() => { + setSearchMode(true); + if (searchMode && inputRef.current) { + inputRef.current.focus(); + } + }} + onTransitionEnd={({ propertyName }) => { + if (propertyName === 'width' && !searchMode) { + if (onVisibleChange) { + onVisibleChange(searchMode); + } + } + }} + > + <SearchOutlined + key="Icon" + style={{ + cursor: 'pointer', + }} + /> + <AutoComplete + key="AutoComplete" + className={inputClass} + value={value} + style={{ + height: 28, + marginTop: -6, + }} + options={restProps.options} + onChange={setValue} + > + <Input + ref={inputRef} + defaultValue={defaultValue} + aria-label={placeholder} + placeholder={placeholder} + onKeyDown={(e) => { + if (e.key === 'Enter') { + if (restProps.onSearch) { + restProps.onSearch(value); + } + } + }} + onBlur={() => { + setSearchMode(false); + }} + /> + </AutoComplete> + </div> + ); +}; + +export default HeaderSearch; diff --git a/src/components/NoticeIcon/NoticeList.less b/src/components/NoticeIcon/NoticeList.less new file mode 100755 index 0000000..65e0c40 --- /dev/null +++ b/src/components/NoticeIcon/NoticeList.less @@ -0,0 +1,103 @@ +@import '~antd/es/style/themes/default.less'; + +.list { + max-height: 400px; + overflow: auto; + &::-webkit-scrollbar { + display: none; + } + .item { + padding-right: 24px; + padding-left: 24px; + overflow: hidden; + cursor: pointer; + transition: all 0.3s; + + .meta { + width: 100%; + } + + .avatar { + margin-top: 4px; + background: @component-background; + } + .iconElement { + font-size: 32px; + } + + &.read { + opacity: 0.4; + } + &:last-child { + border-bottom: 0; + } + &:hover { + background: @primary-1; + } + .title { + margin-bottom: 8px; + font-weight: normal; + } + .description { + font-size: 12px; + line-height: @line-height-base; + } + .datetime { + margin-top: 4px; + font-size: 12px; + line-height: @line-height-base; + } + .extra { + float: right; + margin-top: -1.5px; + margin-right: 0; + color: @text-color-secondary; + font-weight: normal; + } + } + .loadMore { + padding: 8px 0; + color: @primary-6; + text-align: center; + cursor: pointer; + &.loadedAll { + color: rgba(0, 0, 0, 0.25); + cursor: unset; + } + } +} + +.notFound { + padding: 73px 0 88px; + color: @text-color-secondary; + text-align: center; + img { + display: inline-block; + height: 76px; + margin-bottom: 16px; + } +} + +.bottomBar { + height: 46px; + color: @text-color; + line-height: 46px; + text-align: center; + border-top: 1px solid @border-color-split; + border-radius: 0 0 @border-radius-base @border-radius-base; + transition: all 0.3s; + div { + display: inline-block; + width: 50%; + cursor: pointer; + transition: all 0.3s; + user-select: none; + + &:only-child { + width: 100%; + } + &:not(:only-child):last-child { + border-left: 1px solid @border-color-split; + } + } +} diff --git a/src/components/NoticeIcon/NoticeList.tsx b/src/components/NoticeIcon/NoticeList.tsx new file mode 100644 index 0000000..7c1b6ab --- /dev/null +++ b/src/components/NoticeIcon/NoticeList.tsx @@ -0,0 +1,114 @@ +import { Avatar, List } from 'antd'; + +import React from 'react'; +import classNames from 'classnames'; +import { NoticeIconData } from './index'; +import styles from './NoticeList.less'; + +export interface NoticeIconTabProps { + count?: number; + name?: string; + showClear?: boolean; + showViewMore?: boolean; + style?: React.CSSProperties; + title: string; + tabKey: string; + data?: NoticeIconData[]; + onClick?: (item: NoticeIconData) => void; + onClear?: () => void; + emptyText?: string; + clearText?: string; + viewMoreText?: string; + list: NoticeIconData[]; + onViewMore?: (e: any) => void; +} +const NoticeList: React.SFC<NoticeIconTabProps> = ({ + data = [], + onClick, + onClear, + title, + onViewMore, + emptyText, + showClear = true, + clearText, + viewMoreText, + showViewMore = false, +}) => { + if (!data || data.length === 0) { + return ( + <div className={styles.notFound}> + <img + src="https://gw.alipayobjects.com/zos/rmsportal/sAuJeJzSKbUmHfBQRzmZ.svg" + alt="not found" + /> + <div>{emptyText}</div> + </div> + ); + } + return ( + <div> + <List<NoticeIconData> + className={styles.list} + dataSource={data} + renderItem={(item, i) => { + const itemCls = classNames(styles.item, { + [styles.read]: item.read, + }); + // eslint-disable-next-line no-nested-ternary + const leftIcon = item.avatar ? ( + typeof item.avatar === 'string' ? ( + <Avatar className={styles.avatar} src={item.avatar} /> + ) : ( + <span className={styles.iconElement}>{item.avatar}</span> + ) + ) : null; + + return ( + <List.Item + className={itemCls} + key={item.key || i} + onClick={() => onClick && onClick(item)} + > + <List.Item.Meta + className={styles.meta} + avatar={leftIcon} + title={ + <div className={styles.title}> + {item.title} + <div className={styles.extra}>{item.extra}</div> + </div> + } + description={ + <div> + <div className={styles.description}>{item.description}</div> + <div className={styles.datetime}>{item.datetime}</div> + </div> + } + /> + </List.Item> + ); + }} + /> + <div className={styles.bottomBar}> + {showClear ? ( + <div onClick={onClear}> + {clearText} {title} + </div> + ) : null} + {showViewMore ? ( + <div + onClick={(e) => { + if (onViewMore) { + onViewMore(e); + } + }} + > + {viewMoreText} + </div> + ) : null} + </div> + </div> + ); +}; + +export default NoticeList; diff --git a/src/components/NoticeIcon/index.less b/src/components/NoticeIcon/index.less new file mode 100644 index 0000000..45251cd --- /dev/null +++ b/src/components/NoticeIcon/index.less @@ -0,0 +1,35 @@ +@import '~antd/es/style/themes/default.less'; + +.popover { + position: relative; + width: 336px; +} + +.noticeButton { + display: inline-block; + cursor: pointer; + transition: all 0.3s; +} +.icon { + padding: 4px; + vertical-align: middle; +} + +.badge { + font-size: 16px; +} + +.tabs { + :global { + .ant-tabs-nav-list { + margin: auto; + } + + .ant-tabs-nav-scroll { + text-align: center; + } + .ant-tabs-bar { + margin-bottom: 0; + } + } +} diff --git a/src/components/NoticeIcon/index.tsx b/src/components/NoticeIcon/index.tsx new file mode 100644 index 0000000..f91740e --- /dev/null +++ b/src/components/NoticeIcon/index.tsx @@ -0,0 +1,135 @@ +import { BellOutlined } from '@ant-design/icons'; +import { Badge, Spin, Tabs } from 'antd'; +import useMergeValue from 'use-merge-value'; +import React from 'react'; +import classNames from 'classnames'; +import NoticeList, { NoticeIconTabProps } from './NoticeList'; + +import HeaderDropdown from '../HeaderDropdown'; +import styles from './index.less'; + +const { TabPane } = Tabs; + +export interface NoticeIconData { + avatar?: string | React.ReactNode; + title?: React.ReactNode; + description?: React.ReactNode; + datetime?: React.ReactNode; + extra?: React.ReactNode; + style?: React.CSSProperties; + key?: string | number; + read?: boolean; +} + +export interface NoticeIconProps { + count?: number; + bell?: React.ReactNode; + className?: string; + loading?: boolean; + onClear?: (tabName: string, tabKey: string) => void; + onItemClick?: (item: NoticeIconData, tabProps: NoticeIconTabProps) => void; + onViewMore?: (tabProps: NoticeIconTabProps, e: MouseEvent) => void; + onTabChange?: (tabTile: string) => void; + style?: React.CSSProperties; + onPopupVisibleChange?: (visible: boolean) => void; + popupVisible?: boolean; + clearText?: string; + viewMoreText?: string; + clearClose?: boolean; + emptyImage?: string; + children: React.ReactElement<NoticeIconTabProps>[]; +} + +const NoticeIcon: React.FC<NoticeIconProps> & { + Tab: typeof NoticeList; +} = (props) => { + const getNotificationBox = (): React.ReactNode => { + const { + children, + loading, + onClear, + onTabChange, + onItemClick, + onViewMore, + clearText, + viewMoreText, + } = props; + if (!children) { + return null; + } + const panes: React.ReactNode[] = []; + React.Children.forEach(children, (child: React.ReactElement<NoticeIconTabProps>): void => { + if (!child) { + return; + } + const { list, title, count, tabKey, showClear, showViewMore } = child.props; + const len = list && list.length ? list.length : 0; + const msgCount = count || count === 0 ? count : len; + const tabTitle: string = msgCount > 0 ? `${title} (${msgCount})` : title; + panes.push( + <TabPane tab={tabTitle} key={tabKey}> + <NoticeList + {...child.props} + clearText={clearText} + viewMoreText={viewMoreText} + data={list} + onClear={(): void => onClear && onClear(title, tabKey)} + onClick={(item): void => onItemClick && onItemClick(item, child.props)} + onViewMore={(event): void => onViewMore && onViewMore(child.props, event)} + showClear={showClear} + showViewMore={showViewMore} + title={title} + /> + </TabPane>, + ); + }); + return ( + <Spin spinning={loading} delay={300}> + <Tabs className={styles.tabs} onChange={onTabChange}> + {panes} + </Tabs> + </Spin> + ); + }; + + const { className, count, bell } = props; + + const [visible, setVisible] = useMergeValue<boolean>(false, { + value: props.popupVisible, + onChange: props.onPopupVisibleChange, + }); + const noticeButtonClass = classNames(className, styles.noticeButton); + const notificationBox = getNotificationBox(); + const NoticeBellIcon = bell || <BellOutlined className={styles.icon} />; + const trigger = ( + <span className={classNames(noticeButtonClass, { opened: visible })}> + <Badge count={count} style={{ boxShadow: 'none' }} className={styles.badge}> + {NoticeBellIcon} + </Badge> + </span> + ); + if (!notificationBox) { + return trigger; + } + + return ( + <HeaderDropdown + placement="bottomRight" + overlay={notificationBox} + overlayClassName={styles.popover} + trigger={['click']} + visible={visible} + onVisibleChange={setVisible} + > + {trigger} + </HeaderDropdown> + ); +}; + +NoticeIcon.defaultProps = { + emptyImage: 'https://gw.alipayobjects.com/zos/rmsportal/wAhyIChODzsoKIOBHcBk.svg', +}; + +NoticeIcon.Tab = NoticeList; + +export default NoticeIcon; diff --git a/src/components/PageLoading/index.tsx b/src/components/PageLoading/index.tsx new file mode 100644 index 0000000..096c58f --- /dev/null +++ b/src/components/PageLoading/index.tsx @@ -0,0 +1,5 @@ +import { PageLoading } from '@ant-design/pro-layout'; + +// loading components from code split +// https://umijs.org/plugin/umi-plugin-react.html#dynamicimport +export default PageLoading; diff --git a/src/components/PageLoadingWithMargin/index.tsx b/src/components/PageLoadingWithMargin/index.tsx new file mode 100644 index 0000000..8ec4d3e --- /dev/null +++ b/src/components/PageLoadingWithMargin/index.tsx @@ -0,0 +1,12 @@ +import { PageLoading as Loading } from '@ant-design/pro-layout'; +import React from 'react'; +import styles from './styles.less'; +// loading components from code split +// https://umijs.org/plugin/umi-plugin-react.html#dynamicimport + +const PageLoadingWithMargin = () => ( + <div className={styles.loadingStyle}> + <Loading /> + </div> +); +export default PageLoadingWithMargin; diff --git a/src/components/PageLoadingWithMargin/styles.less b/src/components/PageLoadingWithMargin/styles.less new file mode 100644 index 0000000..79859d6 --- /dev/null +++ b/src/components/PageLoadingWithMargin/styles.less @@ -0,0 +1,7 @@ +@import '~antd/lib/style/themes/default.less'; + +.loadingStyle { + div { + margin-top: 10vh; + } +} diff --git a/src/components/SelectLang/index.less b/src/components/SelectLang/index.less new file mode 100644 index 0000000..b960b71 --- /dev/null +++ b/src/components/SelectLang/index.less @@ -0,0 +1,22 @@ +@import '~antd/es/style/themes/default.less'; + +.menu { + :global(.anticon) { + margin-right: 8px; + } + :global(.ant-dropdown-menu-item) { + min-width: 160px; + } +} + +.langButton { + display: flex; + align-items: center; + color: white; + background: @primary-color; +} + +.langIcon { + margin-left: 5px; + font-size: 28px; +} diff --git a/src/components/SelectLang/index.tsx b/src/components/SelectLang/index.tsx new file mode 100644 index 0000000..e324327 --- /dev/null +++ b/src/components/SelectLang/index.tsx @@ -0,0 +1,79 @@ +import { Menu, Button, Dropdown } from 'antd'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faLanguage } from '@fortawesome/free-solid-svg-icons'; +import React from 'react'; +import classNames from 'classnames'; +import HeaderDropdown from '../HeaderDropdown'; +import styles from './index.less'; + +import { withRouter } from 'react-router'; +import { getMapStateToProps } from '@/utils/utils'; +import { languageLabels, languageLabel, languageToLocal } from '@/constants/languages'; +import { connect } from 'dva'; +import _ from 'lodash'; + +interface SelectLangProps { + modelKey: any; +} + +const SelectLang: React.FC<SelectLangProps> = (props: any) => { + const { + meta: { + translations: { lang }, + }, + ca: { caConfigs = {} }, + modelKey, + dispatch, + } = props; + + const renderLanguageLabel = + modelKey === 'ca' + ? languageLabel.filter((x: any) => caConfigs.displayLang.includes(x)) + : languageLabel; + + const updateTranslations = (language: string) => { + if (lang === language) { + return; + } + + dispatch({ + type: 'meta/setViewingLang', + viewingLang: language, + }); + + if (modelKey) { + dispatch({ + type: `${modelKey}/fetchMeta`, + reload: 'trans', + }); + } + + //如果是od || caçš„è¯éœ€è¦é‡ç½® + if (modelKey === 'od' || modelKey === 'ca') { + dispatch({ + type: `${modelKey}/setLoadedModule`, + reload: 'view-trans', + }); + } + }; + + const changeLang = ({ key }: any): void => updateTranslations(key); + const langMenu = ( + <Menu className={styles.menu} selectedKeys={[lang]} onClick={changeLang}> + {renderLanguageLabel.map((locale) => ( + <Menu.Item key={locale}>{languageLabels[locale]}</Menu.Item> + ))} + </Menu> + ); + + return ( + <Dropdown overlay={langMenu} placement="bottomRight" trigger={['click']}> + <Button type="link" className={styles.langButton}> + <div>{languageLabels[lang]}</div> + <FontAwesomeIcon icon={faLanguage} className={styles.langIcon} /> + </Button> + </Dropdown> + ); +}; + +export default connect(getMapStateToProps(['meta', 'ca']))(SelectLang); diff --git a/src/configs/caSettings.ts b/src/configs/caSettings.ts new file mode 100644 index 0000000..6e34616 --- /dev/null +++ b/src/configs/caSettings.ts @@ -0,0 +1,21 @@ +export interface CaSettings { + caId: string; + + loadedModule: { + api: { + caHome: { self: boolean }; + }; + + caHome: boolean; + }; +} + +export default { + loadedModule: { + api: { + caHome: { self: false }, + }, + + caHome: false, + }, +} as CaSettings; diff --git a/src/configs/metaSettings.ts b/src/configs/metaSettings.ts new file mode 100644 index 0000000..31e8772 --- /dev/null +++ b/src/configs/metaSettings.ts @@ -0,0 +1,55 @@ +export interface MetaSettings { + translations: { + [key: string]: any; + }; + + loadedModule: { + api: { + currentUserDetails: boolean; + caConfigs: boolean; + transPkg: { + ca: boolean; + od: boolean; + user: boolean; + }; + }; + ca: boolean; + od: boolean; + user: boolean; + }; + viewingLang: string; + + currentUserDetails: { + firstName: string; + lastName: string; + contactLang: string; + ownedBusiness: any[]; + }; + + loginRedirect: string | false; + isMobile: boolean; + isXs: boolean; +} + +export default { + translations: {}, + loadedModule: { + api: { + currentUserDetails: false, + caConfigs: false, + transPkg: { + ca: false, + od: false, + user: false, + }, + }, + ca: false, + od: false, + user: false, + }, + viewingLang: 'en_AU', + loginRedirect: false, + currentUserDetails: {}, + isMobile: false, + isXs: false, +} as MetaSettings; diff --git a/src/configs/odSettings.ts b/src/configs/odSettings.ts new file mode 100644 index 0000000..5d3adbb --- /dev/null +++ b/src/configs/odSettings.ts @@ -0,0 +1,37 @@ +export interface OdSettings { + layoutCollapsed: boolean; + + reloadAction: { + showActioningMessage: 'unset' | boolean; + spaceName: string; + redirectUrl?: string; + reloadType?: string; + pageModelKey?: string; + }; + + loadedModule: { + api: { + odDashboard: { + self: boolean; + }; + }; + + odDashboard: boolean; + }; +} + +export default { + layoutCollapsed: false, + + reloadAction: { + showActioningMessage: 'unset', + }, + + loadedModule: { + api: { + odDashboard: { + self: false, + }, + }, + }, +} as OdSettings; diff --git a/src/configs/userSettings.ts b/src/configs/userSettings.ts new file mode 100644 index 0000000..256b982 --- /dev/null +++ b/src/configs/userSettings.ts @@ -0,0 +1,22 @@ +export interface UserSettings { + currentUser: + | { + id: number; + email: string; + auth: string; + status: string; + token: any; + tokenReceivedAt: number; + } + | false; + refreshInfo?: + | { + userId: number; + refreshToken: string; + } + | false; +} + +export default { + currentUser: {}, +} as UserSettings; diff --git a/src/constants/languages.ts b/src/constants/languages.ts new file mode 100644 index 0000000..ed5c1e2 --- /dev/null +++ b/src/constants/languages.ts @@ -0,0 +1,94 @@ +export const languageType = [ + { + type: 'en_AU', + text: 'English', + }, + { + type: 'zh_CN', + text: 'ç®€ä½“ä¸æ–‡', + }, + { + type: 'zh_HK', + text: 'ç¹é«”䏿–‡', + }, + { + type: 'ru_RU', + text: 'РуÑÑкий', + }, + { + type: 'ja_JP', + text: '日本語', + }, + { + type: 'fr_FR', + text: 'Français', + }, + { + type: 'de_DE', + text: 'Deutsch', + }, + { + type: 'it_IT', + text: 'Italiano', + }, + { + type: 'es_ES', + text: 'Español', + }, + { + type: 'ko_KR', + text: '한국어', + }, +]; + +export const languageLabel = [ + 'en_AU', + 'zh_CN', + 'zh_HK', + 'ru_RU', + 'ja_JP', + 'fr_FR', + 'de_DE', + 'it_IT', + 'es_ES', + 'ko_KR', +]; + +export const languageToLocal = { + en_AU: 'en-US', + zh_CN: 'zh-CN', + zh_HK: 'zh-TW', + ru_RU: 'ru-RU', + ja_JP: 'ja-JP', + fr_FR: 'fr-FR', + de_DE: 'de-DE', + it_IT: 'it-IT', + es_ES: 'es-ES', + ko_KR: 'ko-KR', +}; + +export const languageLabels = { + en_AU: 'English', + zh_CN: 'ç®€ä½“ä¸æ–‡', + zh_HK: 'ç¹é«”䏿–‡', + ru_RU: 'РуÑÑкий', + ja_JP: '日本語', + fr_FR: 'Français', + de_DE: 'Deutsch', + it_IT: 'Italiano', + es_ES: 'Español', + ko_KR: '한국어', +}; + +// export const languageIcons = { +// 'en-AU': '🇦🇺', +// 'zh-CN': '🇨🇳', +// 'zh-HK': 'ðŸ‡ðŸ‡°', +// 'ru-RU': '🇷🇺', +// 'ja-JP': '🇯🇵', +// 'fr-FR': '🇫🇷', +// 'de-DE': '🇩🇪', +// 'it-IT': '🇮🇹', +// 'es-ES': '🇪🇸', +// 'ko-KR': '🇰🇷', +// } diff --git a/src/constants/routesParams.ts b/src/constants/routesParams.ts new file mode 100644 index 0000000..c1d4530 --- /dev/null +++ b/src/constants/routesParams.ts @@ -0,0 +1 @@ +export const ValidLoginRedirectParams = ['package']; diff --git a/src/constants/translationGroups.ts b/src/constants/translationGroups.ts new file mode 100644 index 0000000..3f47e0f --- /dev/null +++ b/src/constants/translationGroups.ts @@ -0,0 +1,75 @@ +export const metaTranslationOfOdGroups = [ + 'Global', + 'Dashboard', + 'Package', + 'Management_Dish_Grid_View', + 'Management_Dish_Detail', + 'Management_Menu_Grid_View', + 'Management_Menu_Detail', + 'Management_Menu_List_View', + 'Login', + 'Management_Event', + 'Management_Deal', + 'Premium_Service', + 'Settings_Business', + 'Orders_Payments', + 'CA_Cart', + 'CA_Deals', + 'CA_Menus', + 'Contact_POPSUP', + 'Register', + 'Claim_Business', + 'Orders_Payments', + 'Settings_Business_Profile_Setting', +]; + +export const odTranslationGroups = [ + 'Login', + 'Global', + 'Management_Dish_Detail', + 'Management_Menu_Detail', + 'Management_Event', + 'Management_Deal', + 'Settings_Business_Profile_Setting', + 'Package', +]; + +export const metaTranslationOfCaGroups = [ + 'Global', + 'CA_Cart', + 'Orders_Payments', + 'Login', + 'CA_Deals', + 'CA_Menus', + 'CA_Events', + 'Management_Event', + 'CA_Group', + 'CA_Home', + 'CA_Info', + 'CA_Welcome', + 'Management_Event', + 'header', + 'Dashboard', + 'Register', + 'Claim_Business', +]; + +export const metaTranslationOfLandingGroups = [ + 'Global', + 'Orders_Payments', + 'Login', + 'Dashboard', + 'Register', + 'Claim_Business', +]; + +export const metaTranslationOfUserGroups = [ + 'Global', + 'Orders_Payments', + 'Login', + 'Contact_POPSUP', + 'Dashboard', + 'Settings_Business_Profile_Setting', + 'Register', + 'Claim_Business', +]; diff --git a/src/constants/validNumberFormat.ts b/src/constants/validNumberFormat.ts new file mode 100644 index 0000000..b8a821a --- /dev/null +++ b/src/constants/validNumberFormat.ts @@ -0,0 +1,3 @@ +export const validItemIdFormat = /^[0-9]*$/; + +export const validBusinessIdFormat = /^[0-9]{8}$/; diff --git a/src/global.less b/src/global.less new file mode 100644 index 0000000..1b51401 --- /dev/null +++ b/src/global.less @@ -0,0 +1,54 @@ +@import '~antd/es/style/themes/default.less'; + +html, +body, +#root { + height: 100%; +} + +.colorWeak { + filter: invert(80%); +} + +.ant-layout { + min-height: 100vh; +} + +canvas { + display: block; +} + +body { + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +ul, +ol { + list-style: none; +} + +@media (max-width: @screen-xs) { + .ant-table { + width: 100%; + overflow-x: auto; + &-thead > tr, + &-tbody > tr { + > th, + > td { + white-space: pre; + > span { + display: block; + } + } + } + } +} + +// 兼容IE11 +@media screen and(-ms-high-contrast: active), (-ms-high-contrast: none) { + body .ant-design-pro > .ant-layout { + min-height: 100vh; + } +} diff --git a/src/global.tsx b/src/global.tsx new file mode 100644 index 0000000..5e35503 --- /dev/null +++ b/src/global.tsx @@ -0,0 +1,85 @@ +import { Button, message, notification } from 'antd'; + +import React from 'react'; +import { useIntl } from 'umi'; +import defaultSettings from '../config/defaultSettings'; + +const { pwa } = defaultSettings; +const isHttps = document.location.protocol === 'https:'; + +// if pwa is true +if (pwa) { + // Notify user if offline now + window.addEventListener('sw.offline', () => { + message.warning(useIntl().formatMessage({ id: 'app.pwa.offline' })); + }); + + // Pop up a prompt on the page asking the user if they want to use the latest version + window.addEventListener('sw.updated', (event: Event) => { + const e = event as CustomEvent; + const reloadSW = async () => { + // Check if there is sw whose state is waiting in ServiceWorkerRegistration + // https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration + const worker = e.detail && e.detail.waiting; + if (!worker) { + return true; + } + // Send skip-waiting event to waiting SW with MessageChannel + await new Promise((resolve, reject) => { + const channel = new MessageChannel(); + channel.port1.onmessage = (msgEvent) => { + if (msgEvent.data.error) { + reject(msgEvent.data.error); + } else { + resolve(msgEvent.data); + } + }; + worker.postMessage({ type: 'skip-waiting' }, [channel.port2]); + }); + // Refresh current page to use the updated HTML and other assets after SW has skiped waiting + window.location.reload(true); + return true; + }; + const key = `open${Date.now()}`; + const btn = ( + <Button + type="primary" + onClick={() => { + notification.close(key); + reloadSW(); + }} + > + {useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated.ok' })} + </Button> + ); + notification.open({ + message: useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated' }), + description: useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated.hint' }), + btn, + key, + onClose: async () => {}, + }); + }); +} else if ('serviceWorker' in navigator && isHttps) { + // unregister service worker + const { serviceWorker } = navigator; + if (serviceWorker.getRegistrations) { + serviceWorker.getRegistrations().then((sws) => { + sws.forEach((sw) => { + sw.unregister(); + }); + }); + } + serviceWorker.getRegistration().then((sw) => { + if (sw) sw.unregister(); + }); + + // remove all caches + if (window.caches && window.caches.keys) { + caches.keys().then((keys) => { + keys.forEach((key) => { + caches.delete(key); + }); + }); + } +} diff --git a/src/layouts/AuthLayout.tsx b/src/layouts/AuthLayout.tsx new file mode 100644 index 0000000..abc9246 --- /dev/null +++ b/src/layouts/AuthLayout.tsx @@ -0,0 +1,79 @@ +import React, { useEffect, useState } from 'react'; +import { connect } from 'dva'; +import PageLoading from '@/components/PageLoading'; +import { history } from 'umi'; +import { getMapStateToProps } from '@/utils/utils'; +import { message } from 'antd'; +import { Redirect } from 'umi'; +/* +这里åªåštokençš„æ ¡éªŒ +*/ +const AuthLayout: React.FC<any> = (props: any) => { + const { + dispatch, + user: { currentUser }, + helper: { tx }, + children, + loading, + } = props; + + const processing = loading.effects['user/refreshCurrentUserToken']; + + //需è¦åˆ¤æ–æ˜¯ä¸æ˜¯è¦refresh + useEffect(() => { + let needRefresh = false; + let refreshPayload = props.user.refreshInfo; + + //这个地方给refreshPayload留出一个ä½å + //e.g. 处ç†é‚£ç§ä¸é—´è¿‡ç¨‹è¢«æ‰“æ– éœ€è¦åŽç«¯ä»‹å…¥ä¸é—´æµç¨‹çš„æƒ…况 + if (refreshPayload && !currentUser) { + //有refreshPayload && currentUserä¸å˜åœ¨ + needRefresh = true; + } else if (currentUser && currentUser.id && currentUser.token) { + // redux里有currentUser, 检查token是å¦è¿‡æœŸ + const tokenReceivedAt = currentUser.tokenReceivedAt; + const tokenValidPeriod = Number(currentUser.token.expires_in); + const currentTime = new Date().getTime(); //当剿—¶é—´ + if (tokenReceivedAt + tokenValidPeriod * 1000 <= currentTime) { + console.log('å·²ç»è¿‡æœŸï¼'); + //有currentUser å·²ç»è¿‡æœŸ, ä¸éœ€è¦refresh 但需è¦é‡æ–°ç™»å½• + dispatch({ + type: 'user/clearCurrentUserToken', + }); + message.error(tx('Global.please_login_again')); + history.replace('/user/login'); + } else if (tokenReceivedAt + tokenValidPeriod * 1000 - currentTime < 3600 * 24 * 5 * 1000) { + console.log('ä¸è¶³äº”天ï¼ï¼'); + //3600s * 24å°æ—¶/天 * 5 = 5天 + //有currentUser æ—¶é—´ä¸è¶³5天, 需è¦refresh + needRefresh = true; + refreshPayload = { + userId: currentUser.id, + refreshToken: currentUser.token.refresh_token, + }; + } + //有currentUser 时间超过5天, ä¸éœ€è¦refresh + } + + if (needRefresh && refreshPayload) { + dispatch({ + type: 'user/refreshCurrentUserToken', + refreshPayload, + }); + } + }, []); + + if (processing) { + // processing 时显示loading + return <PageLoading />; + } + + if (currentUser && currentUser.status && currentUser.status !== 'ok') { + //user状æ€ä¸å¯¹çš„è¯ åŽ»contact + return <Redirect to="/user/contact" />; + } + + return children; +}; + +export default connect(getMapStateToProps(['loading', 'user']))(AuthLayout); diff --git a/src/layouts/BlankLayout.tsx b/src/layouts/BlankLayout.tsx new file mode 100644 index 0000000..96ee9e8 --- /dev/null +++ b/src/layouts/BlankLayout.tsx @@ -0,0 +1,74 @@ +import React, { useState, useEffect } from 'react'; +import { getMapStateToProps } from '@/utils/utils'; +import { connect } from 'dva'; +import { ConfigProvider } from 'antd'; +import en_US from 'antd/es/locale/en_US'; +import zh_CN from 'antd/es/locale/zh_CN'; +import zh_TW from 'antd/es/locale/zh_TW'; +import ru_RU from 'antd/es/locale/ru_RU'; +import ja_JP from 'antd/es/locale/ja_JP'; +import fr_FR from 'antd/es/locale/fr_FR'; +import de_DE from 'antd/es/locale/de_DE'; +import it_IT from 'antd/es/locale/it_IT'; +import es_ES from 'antd/es/locale/es_ES'; +import ko_KR from 'antd/es/locale/ko_KR'; + +const antdLanSelect = { + en_AU: en_US, + zh_CN, + zh_HK: zh_TW, + ru_RU, + ja_JP, + fr_FR, + de_DE, + it_IT, + es_ES, + ko_KR, +}; + +const useWindowSize = () => { + const isClient = typeof window === 'object'; + + const getSize = () => { + return { + width: isClient ? window.innerWidth : undefined, + height: isClient ? window.innerHeight : undefined, + }; + }; + + const [windowSize, setWindowSize] = useState(getSize); + + useEffect((): any => { + if (!isClient) { + return false; + } + + function handleResize() { + setWindowSize(getSize()); + } + + window.addEventListener('resize', handleResize); + return () => window.removeEventListener('resize', handleResize); + }, []); // Empty array ensures that effect is only run on mount and unmount + + return windowSize; +}; + +const Layout: React.FC<any> = (props) => { + const { dispatch, meta, children } = props; + + const size = useWindowSize(); + + const isMobile = (size.width as number) <= 767 ? true : false; + const isXs = (size.width as number) <= 576 ? true : false; + + if (isMobile !== meta.isMobile || isXs !== meta.isXs) { + dispatch({ + type: 'meta/setMobileType', + width: size.width as number, + }); + } + return <ConfigProvider locale={antdLanSelect[meta.viewingLang]}>{children}</ConfigProvider>; +}; + +export default connect(getMapStateToProps(['meta', 'od', 'user']))(Layout); diff --git a/src/layouts/OdLayout.tsx b/src/layouts/OdLayout.tsx new file mode 100644 index 0000000..512339b --- /dev/null +++ b/src/layouts/OdLayout.tsx @@ -0,0 +1,190 @@ +/** + * Ant Design Pro v4 use `@ant-design/pro-layout` to handle Layout. + * You can view component api by: + * https://github.com/ant-design/ant-design-pro-layout + */ +import ProLayout, { + MenuDataItem, + BasicLayoutProps as ProLayoutProps, + Settings, + DefaultFooter, +} from '@ant-design/pro-layout'; +import React, { useState, useEffect, useRef, useMemo } from 'react'; +import { history, Link, useIntl, Redirect } from 'umi'; +import { connect } from 'dva'; +import { message, Button, Result } from 'antd'; + +import Authorized from '@/utils/Authorized'; +import { getMapStateToProps } from '@/utils/utils'; + +import logo from '@/assets/logo.svg'; +import styles from './od/style.less'; +import Footer from '@/components/GlobalFooter'; +import Header from './od/Header'; + +import PageLoading from '@/components/PageLoading'; +import defaultSettings from '../../config/defaultSettings'; +import { getMatchMenu } from '@umijs/route-utils'; + +const newFooterRender: any = () => { + return <Footer />; +}; + +/** + * use Authorized check all menu item + */ +const menuDataRender = (menuList: any[]): any[] => { + return menuList.map((item) => { + const localItem = { + ...item, + children: item.children ? menuDataRender(item.children) : [], + }; + return Authorized.check(item.authority, localItem, null) as any; + }); +}; + +const newBreadcrumbRender: any = (routers = []) => { + const { formatMessage } = useIntl(); + return [ + { + path: '/', + breadcrumbName: formatMessage({ + id: 'menu.home', + defaultMessage: 'Home', + }), + }, + ...routers, + ]; +}; + +const newItemRender: any = (route: any, params: any, routes: any, paths: any) => { + const first = routes.indexOf(route) === 0; + return first ? ( + <Link to={paths.join('/')}>{route.breadcrumbName}</Link> + ) : ( + <span>{route.breadcrumbName}</span> + ); +}; + +const OdLayout: React.FC<any> = (props: any) => { + const { + dispatch, + children, + od, + meta: { loadedModule, isMobile, isXs }, + user: { currentUser }, + helper: { tx }, + } = props; + + const menuDataRef = useRef<MenuDataItem[]>([]); + + const isLogin = currentUser && currentUser.id ? true : false; + const { showActioningMessage } = od.reloadAction; + + const handleMenuCollapse = (collapsed: boolean): void => { + if (dispatch) { + dispatch({ + type: 'od/setLayoutCollapsed', + layoutCollapsed: collapsed, + }); + } + }; + + const menuItemRender = (menuItemProps: any, defaultDom: any) => { + if (menuItemProps.isUrl || menuItemProps.children || !menuItemProps.path) { + return defaultDom; + } + return <Link to={menuItemProps.path}>{defaultDom}</Link>; + }; + + const postMenuDataRender = (menuData: any) => { + menuDataRef.current = menuData || []; + return menuData || []; + }; + + // get children authority + const authorized = useMemo(() => { + return ( + getMatchMenu(location.pathname || '/', menuDataRef.current).pop() || { + authority: undefined, + } + ); + }, [location.pathname]); + + // useEffect(() => { + // if (!loadedModule.od) { + // dispatch({ + // type: 'od/fetchMeta', + // }); + // } + // }, [metaModuleLoaded.od]); + + // useEffect(() => { + // //上æ¥å°±æ˜¯unset 则直接过就行了 + // const noNeedReload = showActioningMessage === 'unset' ? true : false; + + // if (noNeedReload) { + // return; + // } + + // const { spaceName, reloadType = false, redirectUrl = false } = od.reloadAction; + + // if (showActioningMessage) { + // const hide = message.loading(tx('Global.action_in_progress...'), 0); + // setTimeout(hide, 1500); + // } else { + // /**这里è¦å†³å®šæ”¶åˆ°è¿”回值以åŽçš„动作 ç›®å‰æœ‰ä¸¤ç§ + // 1. update action -> åˆ·æ–°æœ¬é¡µé¢ + // 2. create action -> è·³è½¬å…¶ä»–é¡µé¢ + // 这里用redirectUrlæ¥åˆ¤æ–æ˜¯æ€Žä¹ˆåš + // **/ + // if (redirectUrl) { + // //æš‚æ—¶åªæœ‰create会触å‘é‡å®šå‘ + // router.push(redirectUrl); + // } + // if (spaceName && reloadType) { + // dispatch({ + // type: `${spaceName}/fetchMeta`, + // reload: `${spaceName}-${reloadType}`, + // }); + // } + // } + // }, [showActioningMessage]); + + // if (!metaModuleLoaded.od) { + // return <PageLoading />; + // } + + //MOCK: 关闿¤å¤„å³å¯çœ‹od里é¢çš„内容3 + // if (!isLogin) { + // return <Redirect to="/user/login" />; + // } + + return ( + <span className={styles.odContainer}> + <ProLayout + {...props} + {...defaultSettings} + className={styles.odLayout} + logo={logo} + collapsed={od.layoutCollapsed} + onCollapse={handleMenuCollapse} + onMenuHeaderClick={() => history.push('/')} + menuItemRender={menuItemRender} + breadcrumbRender={newBreadcrumbRender} + itemRender={newItemRender} + footerRender={newFooterRender} + menuDataRender={menuDataRender} + postMenuData={postMenuDataRender} + rightContentRender={() => <Header />} + title={defaultSettings.title} + > + <Authorized authority={authorized!.authority} noMatch={<Redirect to="/403" />}> + {children} + </Authorized> + </ProLayout> + </span> + ); +}; + +export default connect(getMapStateToProps(['meta', 'od', 'user']))(OdLayout); diff --git a/src/layouts/UserLayout.tsx b/src/layouts/UserLayout.tsx new file mode 100644 index 0000000..2ed0ab7 --- /dev/null +++ b/src/layouts/UserLayout.tsx @@ -0,0 +1,53 @@ +import React, { useState, useEffect } from 'react'; +import { connect } from 'dva'; +import { Helmet } from 'react-helmet'; +import styles from './user/style.less'; +import { getMapStateToProps } from '@/utils/utils'; +import PageLoading from '@/components/PageLoading'; +import Header from './user/Header'; +import Footer from '@/components/GlobalFooter'; +import Lable from './user/Lable'; + +const UserLayout: React.FC<any> = (props) => { + const { + dispatch, + meta: { loadedModule }, + helper: { tx }, + children, + } = props; + const title = `${tx('Login.login')}`; + + // useEffect(() => { + // if (!loadedModule.user) { + // dispatch({ + // type: 'user/fetchMeta', + // }); + // } + // }, [loadedModule.user]); + + // if (!loadedModule.user) { + // return <PageLoading />; + // } + + return ( + <div> + <Helmet> + <title>{title}</title> + <meta name="description" content={title} /> + </Helmet> + + <div className={styles.container}> + <Header /> + + <div className={styles.content}> + <Lable /> + {children} + </div> + + <Footer /> + </div> + </div> + ); +}; + +export default connect(getMapStateToProps(['loading', 'meta']))(UserLayout); diff --git a/src/layouts/od/Header.tsx b/src/layouts/od/Header.tsx new file mode 100644 index 0000000..0cdbfe1 --- /dev/null +++ b/src/layouts/od/Header.tsx @@ -0,0 +1,22 @@ +import styles from './style.less'; +import React, { useState } from 'react'; +import RightContent from '@/components/GlobalHeader/RightContent'; +import { getMapStateToProps } from '@/utils/utils'; +import { Result, Button, Breadcrumb } from 'antd'; +import { connect, useIntl } from 'umi'; +import { getMenuData } from '@ant-design/pro-layout'; +import { MenuFoldOutlined, MenuUnfoldOutlined } from '@ant-design/icons'; + +const Header: React.FC<any> = (props: any) => { + const { + dispatch, + helper: { tx }, + od: { collapsed }, + routes, + pathname, + } = props; + + return <RightContent />; +}; + +export default connect(getMapStateToProps(['meta', 'od', 'user']))(Header); diff --git a/src/layouts/od/style.less b/src/layouts/od/style.less new file mode 100644 index 0000000..4fea5c9 --- /dev/null +++ b/src/layouts/od/style.less @@ -0,0 +1,11 @@ +.odContainer { + display: flex; + flex-direction: column; + height: 100vh; + + :global { + .ant-pro-sider-menu-logo h1 { + display: none !important; + } + } +} diff --git a/src/layouts/user/Header.tsx b/src/layouts/user/Header.tsx new file mode 100644 index 0000000..3ab1e16 --- /dev/null +++ b/src/layouts/user/Header.tsx @@ -0,0 +1,16 @@ +import React, { Component } from 'react'; +import { getMapStateToProps } from '@/utils/utils'; +import { connect, useIntl } from 'umi'; + +import SelectLang from '@/components/SelectLang'; +import styles from './style.less'; + +const Header: React.FC<any> = (props: any) => { + return ( + <div className={styles.lang}> + <SelectLang modelKey="user" /> + </div> + ); +}; + +export default connect(getMapStateToProps(['meta', 'loading']))(Header); diff --git a/src/layouts/user/Lable.tsx b/src/layouts/user/Lable.tsx new file mode 100644 index 0000000..46510bd --- /dev/null +++ b/src/layouts/user/Lable.tsx @@ -0,0 +1,24 @@ +import styles from './style.less'; +import logo from '@/assets/longLogo.svg'; +import { Link } from 'umi'; +import React from 'react'; +import { connect } from 'dva'; +import { getMapStateToProps } from '@/utils/utils'; + +const Lable: React.FC<any> = (props: any) => { + const { + helper: { tx }, + } = props; + + return ( + <div className={styles.top}> + <div className={styles.header}> + <Link to="/od"> + <img alt="logo" className={styles.logo} src={logo} /> + </Link> + </div> + <div className={styles.desc}>{tx('t_welcome to joidea')}</div> + </div> + ); +}; +export default connect(getMapStateToProps(['user']))(Lable); diff --git a/src/layouts/user/style.less b/src/layouts/user/style.less new file mode 100755 index 0000000..8da810d --- /dev/null +++ b/src/layouts/user/style.less @@ -0,0 +1,62 @@ +@import '~antd/es/style/themes/default.less'; + +.container { + display: flex; + flex-direction: column; + height: 100vh; + overflow: auto; + background: @layout-body-background; + background-image: url('~@/assets/user/maskBackground.svg'); + background-repeat: no-repeat; + background-position: center; + background-size: cover; + + .content { + flex: 1; + padding: 30px 0; + } + .lang { + display: flex; + justify-content: flex-end; + width: 100%; + height: 40px; + padding-top: 15px; + line-height: 45px; + text-align: right; + :global(.ant-dropdown-trigger) { + margin-right: 25px; + } + } +} + +.top { + text-align: center; + .header { + height: 45px; + line-height: 45px; + a { + text-decoration: none; + } + .logo { + height: 55px; + } + } + + .desc { + margin-top: 15px; + margin-bottom: 20px; + color: @primary-color; + font-weight: bold; + font-size: 20px; + line-height: 20px; + } +} + +.title { + position: relative; + top: 2px; + color: @heading-color; + font-weight: 600; + font-size: 35px; + font-family: Avenir, 'Helvetica Neue', Arial, Helvetica, sans-serif; +} diff --git a/src/locales/en-US.ts b/src/locales/en-US.ts new file mode 100644 index 0000000..24c25fa --- /dev/null +++ b/src/locales/en-US.ts @@ -0,0 +1,24 @@ +import component from './en-US/component'; +import globalHeader from './en-US/globalHeader'; +import menu from './en-US/menu'; +import pwa from './en-US/pwa'; +import settingDrawer from './en-US/settingDrawer'; +import settings from './en-US/settings'; +import pages from './en-US/pages'; + +export default { + 'navBar.lang': 'Languages', + 'layout.user.link.help': 'Help', + 'layout.user.link.privacy': 'Privacy', + 'layout.user.link.terms': 'Terms', + 'app.preview.down.block': 'Download this page to your local project', + 'app.welcome.link.fetch-blocks': 'Get all block', + 'app.welcome.link.block-list': 'Quickly build standard, pages based on `block` development', + ...globalHeader, + ...menu, + ...settingDrawer, + ...settings, + ...pwa, + ...component, + ...pages, +}; diff --git a/src/locales/en-US/component.ts b/src/locales/en-US/component.ts new file mode 100644 index 0000000..3ba7eed --- /dev/null +++ b/src/locales/en-US/component.ts @@ -0,0 +1,5 @@ +export default { + 'component.tagSelect.expand': 'Expand', + 'component.tagSelect.collapse': 'Collapse', + 'component.tagSelect.all': 'All', +}; diff --git a/src/locales/en-US/globalHeader.ts b/src/locales/en-US/globalHeader.ts new file mode 100644 index 0000000..60b6d4e --- /dev/null +++ b/src/locales/en-US/globalHeader.ts @@ -0,0 +1,17 @@ +export default { + 'component.globalHeader.search': 'Search', + 'component.globalHeader.search.example1': 'Search example 1', + 'component.globalHeader.search.example2': 'Search example 2', + 'component.globalHeader.search.example3': 'Search example 3', + 'component.globalHeader.help': 'Help', + 'component.globalHeader.notification': 'Notification', + 'component.globalHeader.notification.empty': 'You have viewed all notifications.', + 'component.globalHeader.message': 'Message', + 'component.globalHeader.message.empty': 'You have viewed all messsages.', + 'component.globalHeader.event': 'Event', + 'component.globalHeader.event.empty': 'You have viewed all events.', + 'component.noticeIcon.clear': 'Clear', + 'component.noticeIcon.cleared': 'Cleared', + 'component.noticeIcon.empty': 'No notifications', + 'component.noticeIcon.view-more': 'View more', +}; diff --git a/src/locales/en-US/menu.ts b/src/locales/en-US/menu.ts new file mode 100644 index 0000000..a737e69 --- /dev/null +++ b/src/locales/en-US/menu.ts @@ -0,0 +1,52 @@ +export default { + 'menu.welcome': 'Welcome', + 'menu.more-blocks': 'More Blocks', + 'menu.home': 'Home', + 'menu.admin': 'Admin', + 'menu.admin.sub-page': 'Sub-Page', + 'menu.login': 'Login', + 'menu.register': 'Register', + 'menu.register.result': 'Register Result', + 'menu.dashboard': 'Dashboard', + 'menu.dashboard.analysis': 'Analysis', + 'menu.dashboard.monitor': 'Monitor', + 'menu.dashboard.workplace': 'Workplace', + 'menu.exception.403': '403', + 'menu.exception.404': '404', + 'menu.exception.500': '500', + 'menu.form': 'Form', + 'menu.form.basic-form': 'Basic Form', + 'menu.form.step-form': 'Step Form', + 'menu.form.step-form.info': 'Step Form(write transfer information)', + 'menu.form.step-form.confirm': 'Step Form(confirm transfer information)', + 'menu.form.step-form.result': 'Step Form(finished)', + 'menu.form.advanced-form': 'Advanced Form', + 'menu.list': 'List', + 'menu.list.table-list': 'Search Table', + 'menu.list.basic-list': 'Basic List', + 'menu.list.card-list': 'Card List', + 'menu.list.search-list': 'Search List', + 'menu.list.search-list.articles': 'Search List(articles)', + 'menu.list.search-list.projects': 'Search List(projects)', + 'menu.list.search-list.applications': 'Search List(applications)', + 'menu.profile': 'Profile', + 'menu.profile.basic': 'Basic Profile', + 'menu.profile.advanced': 'Advanced Profile', + 'menu.result': 'Result', + 'menu.result.success': 'Success', + 'menu.result.fail': 'Fail', + 'menu.exception': 'Exception', + 'menu.exception.not-permission': '403', + 'menu.exception.not-find': '404', + 'menu.exception.server-error': '500', + 'menu.exception.trigger': 'Trigger', + 'menu.account': 'Account', + 'menu.account.center': 'Account Center', + 'menu.account.settings': 'Account Settings', + 'menu.account.trigger': 'Trigger Error', + 'menu.account.logout': 'Logout', + 'menu.editor': 'Graphic Editor', + 'menu.editor.flow': 'Flow Editor', + 'menu.editor.mind': 'Mind Editor', + 'menu.editor.koni': 'Koni Editor', +}; diff --git a/src/locales/en-US/pages.ts b/src/locales/en-US/pages.ts new file mode 100644 index 0000000..43dbdbc --- /dev/null +++ b/src/locales/en-US/pages.ts @@ -0,0 +1,68 @@ +export default { + 'pages.layouts.userLayout.title': + 'Ant Design is the most influential web design specification in Xihu district', + 'pages.login.accountLogin.tab': 'Account Login', + 'pages.login.accountLogin.errorMessage': 'Incorrect username/password(admin/ant.design)', + 'pages.login.username.placeholder': 'Username: admin or user', + 'pages.login.username.required': 'Please input your username!', + 'pages.login.password.placeholder': 'Password: ant.design', + 'pages.login.password.required': 'Please input your password!', + 'pages.login.phoneLogin.tab': 'Phone Login', + 'pages.login.phoneLogin.errorMessage': 'Verification Code Error', + 'pages.login.phoneNumber.placeholder': 'Phone Number', + 'pages.login.phoneNumber.required': 'Please input your phone number!', + 'pages.login.phoneNumber.invalid': 'Phone number is invalid!', + 'pages.login.captcha.placeholder': 'Verification Code', + 'pages.login.captcha.required': 'Please input verification code!', + 'pages.login.phoneLogin.getVerificationCode': 'Get Code', + 'pages.getCaptchaSecondText': 'sec(s)', + 'pages.login.rememberMe': 'Remember me', + 'pages.login.forgotPassword': 'Forgot Password ?', + 'pages.login.submit': 'Submit', + 'pages.login.loginWith': 'Login with :', + 'pages.login.registerAccount': 'Register Account', + 'pages.welcome.advancedComponent': 'Advanced Component', + 'pages.welcome.link': 'Welcome', + 'pages.welcome.advancedLayout': 'Advanced Layout', + 'pages.welcome.alertMessage': 'Faster and stronger heavy-duty components have been released.', + 'pages.admin.subPage.title': 'This page can only be viewed by Admin', + 'pages.admin.subPage.alertMessage': + 'Umi ui is now released, welcome to use npm run ui to start the experience.', + 'pages.searchTable.createForm.newRule': 'New Rule', + 'pages.searchTable.updateForm.ruleConfig': 'Rule configuration', + 'pages.searchTable.updateForm.basicConfig': 'Basic Information', + 'pages.searchTable.updateForm.ruleName.nameLabel': 'Rule Name', + 'pages.searchTable.updateForm.ruleName.nameRules': 'Please enter the rule name!', + 'pages.searchTable.updateForm.ruleDesc.descLabel': 'Rule Description', + 'pages.searchTable.updateForm.ruleDesc.descPlaceholder': 'Please enter at least five characters', + 'pages.searchTable.updateForm.ruleDesc.descRules': + 'Please enter a rule description of at least five characters!', + 'pages.searchTable.updateForm.ruleProps.title': 'Configure Properties', + 'pages.searchTable.updateForm.object': 'Monitoring Object', + 'pages.searchTable.updateForm.ruleProps.templateLabel': 'Rule Template', + 'pages.searchTable.updateForm.ruleProps.typeLabel': 'Rule Type', + 'pages.searchTable.updateForm.schedulingPeriod.title': 'Set Scheduling Period', + 'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'Starting Time', + 'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'Please choose a start time!', + 'pages.searchTable.titleDesc': 'Description', + 'pages.searchTable.ruleName': 'Rule name is required', + 'pages.searchTable.titleCallNo': 'Number of Service Calls', + 'pages.searchTable.titleStatus': 'Status', + 'pages.searchTable.nameStatus.default': 'default', + 'pages.searchTable.nameStatus.running': 'running', + 'pages.searchTable.nameStatus.online': 'online', + 'pages.searchTable.nameStatus.abnormal': 'abnormal', + 'pages.searchTable.titleUpdatedAt': 'Last Scheduled at', + 'pages.searchTable.exception': 'Please enter the reason for the exception!', + 'pages.searchTable.titleOption': 'Option', + 'pages.searchTable.config': 'Configuration', + 'pages.searchTable.subscribeAlert': 'Subscribe to alerts', + 'pages.searchTable.title': 'Enquiry Form', + 'pages.searchTable.new': 'New', + 'pages.searchTable.chosen': 'chosen', + 'pages.searchTable.item': 'item', + 'pages.searchTable.totalServiceCalls': 'Total Number of Service Calls', + 'pages.searchTable.tenThousand': '0000', + 'pages.searchTable.batchDeletion': 'bacth deletion', + 'pages.searchTable.batchApproval': 'batch approval', +}; diff --git a/src/locales/en-US/pwa.ts b/src/locales/en-US/pwa.ts new file mode 100644 index 0000000..ed8d199 --- /dev/null +++ b/src/locales/en-US/pwa.ts @@ -0,0 +1,6 @@ +export default { + 'app.pwa.offline': 'You are offline now', + 'app.pwa.serviceworker.updated': 'New content is available', + 'app.pwa.serviceworker.updated.hint': 'Please press the "Refresh" button to reload current page', + 'app.pwa.serviceworker.updated.ok': 'Refresh', +}; diff --git a/src/locales/en-US/settingDrawer.ts b/src/locales/en-US/settingDrawer.ts new file mode 100644 index 0000000..a644905 --- /dev/null +++ b/src/locales/en-US/settingDrawer.ts @@ -0,0 +1,31 @@ +export default { + 'app.setting.pagestyle': 'Page style setting', + 'app.setting.pagestyle.dark': 'Dark style', + 'app.setting.pagestyle.light': 'Light style', + 'app.setting.content-width': 'Content Width', + 'app.setting.content-width.fixed': 'Fixed', + 'app.setting.content-width.fluid': 'Fluid', + 'app.setting.themecolor': 'Theme Color', + 'app.setting.themecolor.dust': 'Dust Red', + 'app.setting.themecolor.volcano': 'Volcano', + 'app.setting.themecolor.sunset': 'Sunset Orange', + 'app.setting.themecolor.cyan': 'Cyan', + 'app.setting.themecolor.green': 'Polar Green', + 'app.setting.themecolor.daybreak': 'Daybreak Blue (default)', + 'app.setting.themecolor.geekblue': 'Geek Glue', + 'app.setting.themecolor.purple': 'Golden Purple', + 'app.setting.navigationmode': 'Navigation Mode', + 'app.setting.sidemenu': 'Side Menu Layout', + 'app.setting.topmenu': 'Top Menu Layout', + 'app.setting.fixedheader': 'Fixed Header', + 'app.setting.fixedsidebar': 'Fixed Sidebar', + 'app.setting.fixedsidebar.hint': 'Works on Side Menu Layout', + 'app.setting.hideheader': 'Hidden Header when scrolling', + 'app.setting.hideheader.hint': 'Works when Hidden Header is enabled', + 'app.setting.othersettings': 'Other Settings', + 'app.setting.weakmode': 'Weak Mode', + 'app.setting.copy': 'Copy Setting', + 'app.setting.copyinfo': 'copy success,please replace defaultSettings in src/models/setting.js', + 'app.setting.production.hint': + 'Setting panel shows in development environment only, please manually modify', +}; diff --git a/src/locales/en-US/settings.ts b/src/locales/en-US/settings.ts new file mode 100644 index 0000000..822dd00 --- /dev/null +++ b/src/locales/en-US/settings.ts @@ -0,0 +1,60 @@ +export default { + 'app.settings.menuMap.basic': 'Basic Settings', + 'app.settings.menuMap.security': 'Security Settings', + 'app.settings.menuMap.binding': 'Account Binding', + 'app.settings.menuMap.notification': 'New Message Notification', + 'app.settings.basic.avatar': 'Avatar', + 'app.settings.basic.change-avatar': 'Change avatar', + 'app.settings.basic.email': 'Email', + 'app.settings.basic.email-message': 'Please input your email!', + 'app.settings.basic.nickname': 'Nickname', + 'app.settings.basic.nickname-message': 'Please input your Nickname!', + 'app.settings.basic.profile': 'Personal profile', + 'app.settings.basic.profile-message': 'Please input your personal profile!', + 'app.settings.basic.profile-placeholder': 'Brief introduction to yourself', + 'app.settings.basic.country': 'Country/Region', + 'app.settings.basic.country-message': 'Please input your country!', + 'app.settings.basic.geographic': 'Province or city', + 'app.settings.basic.geographic-message': 'Please input your geographic info!', + 'app.settings.basic.address': 'Street Address', + 'app.settings.basic.address-message': 'Please input your address!', + 'app.settings.basic.phone': 'Phone Number', + 'app.settings.basic.phone-message': 'Please input your phone!', + 'app.settings.basic.update': 'Update Information', + 'app.settings.security.strong': 'Strong', + 'app.settings.security.medium': 'Medium', + 'app.settings.security.weak': 'Weak', + 'app.settings.security.password': 'Account Password', + 'app.settings.security.password-description': 'Current password strength', + 'app.settings.security.phone': 'Security Phone', + 'app.settings.security.phone-description': 'Bound phone', + 'app.settings.security.question': 'Security Question', + 'app.settings.security.question-description': + 'The security question is not set, and the security policy can effectively protect the account security', + 'app.settings.security.email': 'Backup Email', + 'app.settings.security.email-description': 'Bound Email', + 'app.settings.security.mfa': 'MFA Device', + 'app.settings.security.mfa-description': + 'Unbound MFA device, after binding, can be confirmed twice', + 'app.settings.security.modify': 'Modify', + 'app.settings.security.set': 'Set', + 'app.settings.security.bind': 'Bind', + 'app.settings.binding.taobao': 'Binding Taobao', + 'app.settings.binding.taobao-description': 'Currently unbound Taobao account', + 'app.settings.binding.alipay': 'Binding Alipay', + 'app.settings.binding.alipay-description': 'Currently unbound Alipay account', + 'app.settings.binding.dingding': 'Binding DingTalk', + 'app.settings.binding.dingding-description': 'Currently unbound DingTalk account', + 'app.settings.binding.bind': 'Bind', + 'app.settings.notification.password': 'Account Password', + 'app.settings.notification.password-description': + 'Messages from other users will be notified in the form of a station letter', + 'app.settings.notification.messages': 'System Messages', + 'app.settings.notification.messages-description': + 'System messages will be notified in the form of a station letter', + 'app.settings.notification.todo': 'To-do Notification', + 'app.settings.notification.todo-description': + 'The to-do list will be notified in the form of a letter from the station', + 'app.settings.open': 'Open', + 'app.settings.close': 'Close', +}; diff --git a/src/locales/id-ID.ts b/src/locales/id-ID.ts new file mode 100644 index 0000000..e0bdf5c --- /dev/null +++ b/src/locales/id-ID.ts @@ -0,0 +1,23 @@ +import component from './id-ID/component'; +import globalHeader from './id-ID/globalHeader'; +import menu from './id-ID/menu'; +import pwa from './id-ID/pwa'; +import settingDrawer from './id-ID/settingDrawer'; +import settings from './id-ID/settings'; + +export default { + 'navbar.lang': 'Bahasa', + 'layout.user.link.help': 'Bantuan', + 'layout.user.link.privacy': 'Privasi', + 'layout.user.link.terms': 'Ketentuan', + 'app.preview.down.block': 'Unduh halaman ini dalam projek lokal anda', + 'app.welcome.link.fetch-blocks': 'Dapatkan semua blok', + 'app.welcome.link.block-list': + 'Buat standar dengan cepat, halaman-halaman berdasarkan pengembangan `block`', + ...globalHeader, + ...menu, + ...settingDrawer, + ...settings, + ...pwa, + ...component, +}; diff --git a/src/locales/id-ID/component.ts b/src/locales/id-ID/component.ts new file mode 100644 index 0000000..fe583af --- /dev/null +++ b/src/locales/id-ID/component.ts @@ -0,0 +1,5 @@ +export default { + 'component.tagSelect.expand': 'Perluas', + 'component.tagSelect.collapse': 'Lipat', + 'component.tagSelect.all': 'Semua', +}; diff --git a/src/locales/id-ID/globalHeader.ts b/src/locales/id-ID/globalHeader.ts new file mode 100644 index 0000000..e6283ea --- /dev/null +++ b/src/locales/id-ID/globalHeader.ts @@ -0,0 +1,17 @@ +export default { + 'component.globalHeader.search': 'Pencarian', + 'component.globalHeader.search.example1': 'Contoh 1 Pencarian', + 'component.globalHeader.search.example2': 'Contoh 2 Pencarian', + 'component.globalHeader.search.example3': 'Contoh 3 Pencarian', + 'component.globalHeader.help': 'Bantuan', + 'component.globalHeader.notification': 'Notifikasi', + 'component.globalHeader.notification.empty': 'Anda telah membaca semua notifikasi', + 'component.globalHeader.message': 'Pesan', + 'component.globalHeader.message.empty': 'Anda telah membaca semua pesan.', + 'component.globalHeader.event': 'Acara', + 'component.globalHeader.event.empty': 'Anda telah melihat semua acara.', + 'component.noticeIcon.clear': 'Kosongkan', + 'component.noticeIcon.cleared': 'Berhasil dikosongkan', + 'component.noticeIcon.empty': 'Tidak ada pemberitahuan', + 'component.noticeIcon.view-more': 'Melihat lebih', +}; diff --git a/src/locales/id-ID/menu.ts b/src/locales/id-ID/menu.ts new file mode 100644 index 0000000..862518b --- /dev/null +++ b/src/locales/id-ID/menu.ts @@ -0,0 +1,52 @@ +export default { + 'menu.welcome': 'Selamat Datang', + 'menu.more-blocks': 'Blocks Lainnya', + 'menu.home': 'Halaman Awal', + 'menu.admin': 'Admin', + 'menu.admin.sub-page': 'Sub-Halaman', + 'menu.login': 'Masuk', + 'menu.register': 'Pendaftaran', + 'menu.register.result': 'Hasil Pendaftaran', + 'menu.dashboard': 'Dasbor', + 'menu.dashboard.analysis': 'Analisis', + 'menu.dashboard.monitor': 'Monitor', + 'menu.dashboard.workplace': 'Workplace', + 'menu.exception.403': '403', + 'menu.exception.404': '404', + 'menu.exception.500': '500', + 'menu.form': 'Form', + 'menu.form.basic-form': 'Form Dasar', + 'menu.form.step-form': 'Form Bertahap', + 'menu.form.step-form.info': 'Form Bertahap(menulis informasi yang dibagikan)', + 'menu.form.step-form.confirm': 'Form Bertahap(konfirmasi informasi yang dibagikan)', + 'menu.form.step-form.result': 'Form Bertahap(selesai)', + 'menu.form.advanced-form': 'Form Lanjutan', + 'menu.list': 'Daftar', + 'menu.list.table-list': 'Tabel Pencarian', + 'menu.list.basic-list': 'Daftar Dasar', + 'menu.list.card-list': 'Daftar Kartu', + 'menu.list.search-list': 'Daftar Pencarian', + 'menu.list.search-list.articles': 'Daftar Pencarian(artikel)', + 'menu.list.search-list.projects': 'Daftar Pencarian(projek)', + 'menu.list.search-list.applications': 'Daftar Pencarian(aplikasi)', + 'menu.profile': 'Profil', + 'menu.profile.basic': 'Profil Dasar', + 'menu.profile.advanced': 'Profile Lanjutan', + 'menu.result': 'Hasil', + 'menu.result.success': 'Sukses', + 'menu.result.fail': 'Gagal', + 'menu.exception': 'Pengecualian', + 'menu.exception.not-permission': '403', + 'menu.exception.not-find': '404', + 'menu.exception.server-error': '500', + 'menu.exception.trigger': 'Jalankan', + 'menu.account': 'Akun', + 'menu.account.center': 'Detail Akun', + 'menu.account.settings': 'Pengaturan Akun', + 'menu.account.trigger': 'Mengaktivasi Error', + 'menu.account.logout': 'Keluar', + 'menu.editor': 'Penyusun Grafis', + 'menu.editor.flow': 'Penyusun Alur', + 'menu.editor.mind': 'Penyusun Mind', + 'menu.editor.koni': 'Penyusun Koni', +}; diff --git a/src/locales/id-ID/pwa.ts b/src/locales/id-ID/pwa.ts new file mode 100644 index 0000000..b2cb8a1 --- /dev/null +++ b/src/locales/id-ID/pwa.ts @@ -0,0 +1,7 @@ +export default { + 'app.pwa.offline': 'Koneksi anda terputus', + 'app.pwa.serviceworker.updated': 'Konten baru sudah tersedia', + 'app.pwa.serviceworker.updated.hint': + 'Silahkan klik tombol "Refresh" untuk memuat ulang halaman ini', + 'app.pwa.serviceworker.updated.ok': 'Memuat ulang', +}; diff --git a/src/locales/id-ID/settingDrawer.ts b/src/locales/id-ID/settingDrawer.ts new file mode 100644 index 0000000..3b37703 --- /dev/null +++ b/src/locales/id-ID/settingDrawer.ts @@ -0,0 +1,32 @@ +export default { + 'app.setting.pagestyle': 'Pengaturan style Halaman', + 'app.setting.pagestyle.dark': 'Style Gelap', + 'app.setting.pagestyle.light': 'Style Cerah', + 'app.setting.content-width': 'Lebar Konten', + 'app.setting.content-width.fixed': 'Tetap', + 'app.setting.content-width.fluid': 'Fluid', + 'app.setting.themecolor': 'Theme Color', + 'app.setting.themecolor.dust': 'Dust Red', + 'app.setting.themecolor.volcano': 'Volcano', + 'app.setting.themecolor.sunset': 'Sunset Orange', + 'app.setting.themecolor.cyan': 'Cyan', + 'app.setting.themecolor.green': 'Polar Green', + 'app.setting.themecolor.daybreak': 'Daybreak Blue (bawaan)', + 'app.setting.themecolor.geekblue': 'Geek Glue', + 'app.setting.themecolor.purple': 'Golden Purple', + 'app.setting.navigationmode': 'Mode Navigasi', + 'app.setting.sidemenu': 'Susunan Menu Samping', + 'app.setting.topmenu': 'Susunan Menu Atas', + 'app.setting.fixedheader': 'Header Tetap', + 'app.setting.fixedsidebar': 'Sidebar Tetap', + 'app.setting.fixedsidebar.hint': 'Berjalan pada Susunan Menu Samping', + 'app.setting.hideheader': 'Sembunyikan Header ketika gulir ke bawah', + 'app.setting.hideheader.hint': 'Bekerja ketika Header tersembunyi dimunculkan', // 'app.setting.hideheader.hint': 'Works when Hidden Header is enabled', + 'app.setting.othersettings': 'Pengaturan Lainnya', + 'app.setting.weakmode': 'Mode Lemah', + 'app.setting.copy': 'Salin Pengaturan', + 'app.setting.copyinfo': + 'Berhasil disalin,tolong ubah defaultSettings pada src/models/setting.js', + 'app.setting.production.hint': + 'Panel pengaturan hanya muncul pada lingkungan pengembangan, silahkan modifikasi secara menual', +}; diff --git a/src/locales/id-ID/settings.ts b/src/locales/id-ID/settings.ts new file mode 100644 index 0000000..04b7d12 --- /dev/null +++ b/src/locales/id-ID/settings.ts @@ -0,0 +1,60 @@ +export default { + 'app.settings.menuMap.basic': 'Pengaturan Dasar', + 'app.settings.menuMap.security': 'Pengaturan Keamanan', + 'app.settings.menuMap.binding': 'Pengikatan Akun', + 'app.settings.menuMap.notification': 'Notifikasi Pesan Baru', + 'app.settings.basic.avatar': 'Avatar', + 'app.settings.basic.change-avatar': 'Ubah avatar', + 'app.settings.basic.email': 'Email', + 'app.settings.basic.email-message': 'Tolong masukkan email!', + 'app.settings.basic.nickname': 'Nickname', + 'app.settings.basic.nickname-message': 'Tolong masukkan Nickname!', + 'app.settings.basic.profile': 'Profil Personal', + 'app.settings.basic.profile-message': 'Tolong masukkan profil personal!', + 'app.settings.basic.profile-placeholder': 'Perkenalan Singkat tentang Diri Anda', + 'app.settings.basic.country': 'Negara/Wilayah', + 'app.settings.basic.country-message': 'Tolong masukkan negara anda!', + 'app.settings.basic.geographic': 'Provinsi atau kota', + 'app.settings.basic.geographic-message': 'Tolong masukkan info geografis anda!', + 'app.settings.basic.address': 'Alamat Jalan', + 'app.settings.basic.address-message': 'Tolong masukkan Alamat Jalan anda!', + 'app.settings.basic.phone': 'Nomor Ponsel', + 'app.settings.basic.phone-message': 'Tolong masukkan Nomor Ponsel anda!', + 'app.settings.basic.update': 'Perbarui Informasi', + 'app.settings.security.strong': 'Kuat', + 'app.settings.security.medium': 'Sedang', + 'app.settings.security.weak': 'Lemah', + 'app.settings.security.password': 'Kata Sandi Akun', + 'app.settings.security.password-description': 'Kekuatan Kata Sandi saat ini', + 'app.settings.security.phone': 'Keamanan Ponsel', + 'app.settings.security.phone-description': 'Mengikat Ponsel', + 'app.settings.security.question': 'Pertanyaan Keamanan', + 'app.settings.security.question-description': + 'Pertanyaan Keamanan belum diatur, dan kebijakan keamanan dapat melindungi akun secara efektif', + 'app.settings.security.email': 'Email Cadangan', + 'app.settings.security.email-description': 'Mengikat Email', + 'app.settings.security.mfa': 'Perangka MFA', + 'app.settings.security.mfa-description': + 'Tidak mengikat Perangkat MFA, setelah diikat, dapat dikonfirmasi dua kali', + 'app.settings.security.modify': 'Modifikasi', + 'app.settings.security.set': 'Setel', + 'app.settings.security.bind': 'Ikat', + 'app.settings.binding.taobao': 'Mengikat Taobao', + 'app.settings.binding.taobao-description': 'Tidak mengikat akun Taobao saat ini', + 'app.settings.binding.alipay': 'Mengikat Alipay', + 'app.settings.binding.alipay-description': 'Tidak mengikat akun Alipay saat ini', + 'app.settings.binding.dingding': 'Mengikat DingTalk', + 'app.settings.binding.dingding-description': 'Tidak mengikat akun DingTalk', + 'app.settings.binding.bind': 'Ikat', + 'app.settings.notification.password': 'Kata Sandi Akun', + 'app.settings.notification.password-description': + 'Pesan dari pengguna lain akan diberitahu dalam bentuk surat', + 'app.settings.notification.messages': 'Pesan Sistem', + 'app.settings.notification.messages-description': + 'Pesan sistem akan diberitahu dalam bentuk surat', + 'app.settings.notification.todo': 'Notifikasi daftar To-do', + 'app.settings.notification.todo-description': + 'Daftar to-do akan diberitahukan dalam bentuk surat dari stasiun', + 'app.settings.open': 'Buka', + 'app.settings.close': 'Tutup', +}; diff --git a/src/locales/pt-BR.ts b/src/locales/pt-BR.ts new file mode 100644 index 0000000..ee3733b --- /dev/null +++ b/src/locales/pt-BR.ts @@ -0,0 +1,20 @@ +import component from './pt-BR/component'; +import globalHeader from './pt-BR/globalHeader'; +import menu from './pt-BR/menu'; +import pwa from './pt-BR/pwa'; +import settingDrawer from './pt-BR/settingDrawer'; +import settings from './pt-BR/settings'; + +export default { + 'navBar.lang': 'Idiomas', + 'layout.user.link.help': 'ajuda', + 'layout.user.link.privacy': 'polÃtica de privacidade', + 'layout.user.link.terms': 'termos de serviços', + 'app.preview.down.block': 'Download this page to your local project', + ...globalHeader, + ...menu, + ...settingDrawer, + ...settings, + ...pwa, + ...component, +}; diff --git a/src/locales/pt-BR/component.ts b/src/locales/pt-BR/component.ts new file mode 100644 index 0000000..7cf9999 --- /dev/null +++ b/src/locales/pt-BR/component.ts @@ -0,0 +1,5 @@ +export default { + 'component.tagSelect.expand': 'Expandir', + 'component.tagSelect.collapse': 'Diminuir', + 'component.tagSelect.all': 'Todas', +}; diff --git a/src/locales/pt-BR/globalHeader.ts b/src/locales/pt-BR/globalHeader.ts new file mode 100644 index 0000000..c927399 --- /dev/null +++ b/src/locales/pt-BR/globalHeader.ts @@ -0,0 +1,18 @@ +export default { + 'component.globalHeader.search': 'Busca', + 'component.globalHeader.search.example1': 'Exemplo de busca 1', + 'component.globalHeader.search.example2': 'Exemplo de busca 2', + 'component.globalHeader.search.example3': 'Exemplo de busca 3', + 'component.globalHeader.help': 'Ajuda', + 'component.globalHeader.notification': 'Notificação', + 'component.globalHeader.notification.empty': 'Você visualizou todas as notificações.', + 'component.globalHeader.message': 'Mensagem', + 'component.globalHeader.message.empty': 'Você visualizou todas as mensagens.', + 'component.globalHeader.event': 'Evento', + 'component.globalHeader.event.empty': 'Você visualizou todos os eventos.', + 'component.noticeIcon.clear': 'Limpar', + 'component.noticeIcon.cleared': 'Limpo', + 'component.noticeIcon.empty': 'Sem notificações', + 'component.noticeIcon.loaded': 'Carregado', + 'component.noticeIcon.view-more': 'Veja mais', +}; diff --git a/src/locales/pt-BR/menu.ts b/src/locales/pt-BR/menu.ts new file mode 100644 index 0000000..b87ebbb --- /dev/null +++ b/src/locales/pt-BR/menu.ts @@ -0,0 +1,52 @@ +export default { + 'menu.welcome': 'Welcome', + 'menu.more-blocks': 'More Blocks', + 'menu.home': 'InÃcio', + 'menu.login': 'Login', + 'menu.admin': 'Admin', + 'menu.admin.sub-page': 'Sub-Page', + 'menu.register': 'Registro', + 'menu.register.result': 'Resultado de registro', + 'menu.dashboard': 'Dashboard', + 'menu.dashboard.analysis': 'Análise', + 'menu.dashboard.monitor': 'Monitor', + 'menu.dashboard.workplace': 'Ambiente de Trabalho', + 'menu.exception.403': '403', + 'menu.exception.404': '404', + 'menu.exception.500': '500', + 'menu.form': 'Formulário', + 'menu.form.basic-form': 'Formulário Básico', + 'menu.form.step-form': 'Formulário Assistido', + 'menu.form.step-form.info': 'Formulário Assistido(gravar informações de transferência)', + 'menu.form.step-form.confirm': 'Formulário Assistido(confirmar informações de transferência)', + 'menu.form.step-form.result': 'Formulário Assistido(finalizado)', + 'menu.form.advanced-form': 'Formulário Avançado', + 'menu.list': 'Lista', + 'menu.list.table-list': 'Tabela de Busca', + 'menu.list.basic-list': 'Lista Básica', + 'menu.list.card-list': 'Lista de Card', + 'menu.list.search-list': 'Lista de Busca', + 'menu.list.search-list.articles': 'Lista de Busca(artigos)', + 'menu.list.search-list.projects': 'Lista de Busca(projetos)', + 'menu.list.search-list.applications': 'Lista de Busca(aplicações)', + 'menu.profile': 'Perfil', + 'menu.profile.basic': 'Perfil Básico', + 'menu.profile.advanced': 'Perfil Avançado', + 'menu.result': 'Resultado', + 'menu.result.success': 'Sucesso', + 'menu.result.fail': 'Falha', + 'menu.exception': 'Exceção', + 'menu.exception.not-permission': '403', + 'menu.exception.not-find': '404', + 'menu.exception.server-error': '500', + 'menu.exception.trigger': 'Disparar', + 'menu.account': 'Conta', + 'menu.account.center': 'Central da Conta', + 'menu.account.settings': 'Configurar Conta', + 'menu.account.trigger': 'Disparar Erro', + 'menu.account.logout': 'Sair', + 'menu.editor': 'Graphic Editor', + 'menu.editor.flow': 'Flow Editor', + 'menu.editor.mind': 'Mind Editor', + 'menu.editor.koni': 'Koni Editor', +}; diff --git a/src/locales/pt-BR/pwa.ts b/src/locales/pt-BR/pwa.ts new file mode 100644 index 0000000..05cc797 --- /dev/null +++ b/src/locales/pt-BR/pwa.ts @@ -0,0 +1,7 @@ +export default { + 'app.pwa.offline': 'Você está offline agora', + 'app.pwa.serviceworker.updated': 'Novo conteúdo está disponÃvel', + 'app.pwa.serviceworker.updated.hint': + 'Por favor, pressione o botão "Atualizar" para recarregar a página atual', + 'app.pwa.serviceworker.updated.ok': 'Atualizar', +}; diff --git a/src/locales/pt-BR/settingDrawer.ts b/src/locales/pt-BR/settingDrawer.ts new file mode 100644 index 0000000..8a10b57 --- /dev/null +++ b/src/locales/pt-BR/settingDrawer.ts @@ -0,0 +1,32 @@ +export default { + 'app.setting.pagestyle': 'Configuração de estilo da página', + 'app.setting.pagestyle.dark': 'Dark style', + 'app.setting.pagestyle.light': 'Light style', + 'app.setting.content-width': 'Largura do conteúdo', + 'app.setting.content-width.fixed': 'Fixo', + 'app.setting.content-width.fluid': 'Fluido', + 'app.setting.themecolor': 'Cor do Tema', + 'app.setting.themecolor.dust': 'Dust Red', + 'app.setting.themecolor.volcano': 'Volcano', + 'app.setting.themecolor.sunset': 'Sunset Orange', + 'app.setting.themecolor.cyan': 'Cyan', + 'app.setting.themecolor.green': 'Polar Green', + 'app.setting.themecolor.daybreak': 'Daybreak Blue (default)', + 'app.setting.themecolor.geekblue': 'Geek Glue', + 'app.setting.themecolor.purple': 'Golden Purple', + 'app.setting.navigationmode': 'Modo de Navegação', + 'app.setting.sidemenu': 'Layout do Menu Lateral', + 'app.setting.topmenu': 'Layout do Menu Superior', + 'app.setting.fixedheader': 'Cabeçalho fixo', + 'app.setting.fixedsidebar': 'Barra lateral fixa', + 'app.setting.fixedsidebar.hint': 'Funciona no layout do menu lateral', + 'app.setting.hideheader': 'Esconder o cabeçalho quando rolar', + 'app.setting.hideheader.hint': 'Funciona quando o esconder cabeçalho está abilitado', + 'app.setting.othersettings': 'Outras configurações', + 'app.setting.weakmode': 'Weak Mode', + 'app.setting.copy': 'Copiar Configuração', + 'app.setting.copyinfo': + 'copiado com sucesso,por favor trocar o defaultSettings em src/models/setting.js', + 'app.setting.production.hint': + 'O painel de configuração apenas é exibido no ambiente de desenvolvimento, por favor modifique manualmente o', +}; diff --git a/src/locales/pt-BR/settings.ts b/src/locales/pt-BR/settings.ts new file mode 100644 index 0000000..aad2e38 --- /dev/null +++ b/src/locales/pt-BR/settings.ts @@ -0,0 +1,60 @@ +export default { + 'app.settings.menuMap.basic': 'Configurações Básicas', + 'app.settings.menuMap.security': 'Configurações de Segurança', + 'app.settings.menuMap.binding': 'Vinculação de Conta', + 'app.settings.menuMap.notification': 'Mensagens de Notificação', + 'app.settings.basic.avatar': 'Avatar', + 'app.settings.basic.change-avatar': 'Alterar avatar', + 'app.settings.basic.email': 'Email', + 'app.settings.basic.email-message': 'Por favor insira seu email!', + 'app.settings.basic.nickname': 'Nome de usuário', + 'app.settings.basic.nickname-message': 'Por favor insira seu nome de usuário!', + 'app.settings.basic.profile': 'Perfil pessoal', + 'app.settings.basic.profile-message': 'Por favor insira seu perfil pessoal!', + 'app.settings.basic.profile-placeholder': 'Breve introdução sua', + 'app.settings.basic.country': 'PaÃs/Região', + 'app.settings.basic.country-message': 'Por favor insira paÃs!', + 'app.settings.basic.geographic': 'ProvÃncia, estado ou cidade', + 'app.settings.basic.geographic-message': 'Por favor insira suas informações geográficas!', + 'app.settings.basic.address': 'Endereço', + 'app.settings.basic.address-message': 'Por favor insira seu endereço!', + 'app.settings.basic.phone': 'Número de telefone', + 'app.settings.basic.phone-message': 'Por favor insira seu número de telefone!', + 'app.settings.basic.update': 'Atualizar Informações', + 'app.settings.security.strong': 'Forte', + 'app.settings.security.medium': 'Média', + 'app.settings.security.weak': 'Fraca', + 'app.settings.security.password': 'Senha da Conta', + 'app.settings.security.password-description': 'Força da senha', + 'app.settings.security.phone': 'Telefone de Seguraça', + 'app.settings.security.phone-description': 'Telefone vinculado', + 'app.settings.security.question': 'Pergunta de Segurança', + 'app.settings.security.question-description': + 'A pergunta de segurança não está definida e a polÃtica de segurança pode proteger efetivamente a segurança da conta', + 'app.settings.security.email': 'Email de Backup', + 'app.settings.security.email-description': 'Email vinculado', + 'app.settings.security.mfa': 'Dispositivo MFA', + 'app.settings.security.mfa-description': + 'O dispositivo MFA não vinculado, após a vinculação, pode ser confirmado duas vezes', + 'app.settings.security.modify': 'Modificar', + 'app.settings.security.set': 'Atribuir', + 'app.settings.security.bind': 'Vincular', + 'app.settings.binding.taobao': 'Vincular Taobao', + 'app.settings.binding.taobao-description': 'Atualmente não vinculado à conta Taobao', + 'app.settings.binding.alipay': 'Vincular Alipay', + 'app.settings.binding.alipay-description': 'Atualmente não vinculado à conta Alipay', + 'app.settings.binding.dingding': 'Vincular DingTalk', + 'app.settings.binding.dingding-description': 'Atualmente não vinculado à conta DingTalk', + 'app.settings.binding.bind': 'Vincular', + 'app.settings.notification.password': 'Senha da Conta', + 'app.settings.notification.password-description': + 'Mensagens de outros usuários serão notificadas na forma de uma estação de letra', + 'app.settings.notification.messages': 'Mensagens de Sistema', + 'app.settings.notification.messages-description': + 'Mensagens de sistema serão notificadas na forma de uma estação de letra', + 'app.settings.notification.todo': 'Notificação de To-do', + 'app.settings.notification.todo-description': + 'A lista de to-do será notificada na forma de uma estação de letra', + 'app.settings.open': 'Aberto', + 'app.settings.close': 'Fechado', +}; diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts new file mode 100644 index 0000000..565b2c3 --- /dev/null +++ b/src/locales/zh-CN.ts @@ -0,0 +1,24 @@ +import component from './zh-CN/component'; +import globalHeader from './zh-CN/globalHeader'; +import menu from './zh-CN/menu'; +import pwa from './zh-CN/pwa'; +import settingDrawer from './zh-CN/settingDrawer'; +import settings from './zh-CN/settings'; +import pages from './zh-CN/pages'; + +export default { + 'navBar.lang': 'è¯è¨€', + 'layout.user.link.help': '帮助', + 'layout.user.link.privacy': 'éšç§', + 'layout.user.link.terms': 'æ¡æ¬¾', + 'app.preview.down.block': '下载æ¤é¡µé¢åˆ°æœ¬åœ°é¡¹ç›®', + 'app.welcome.link.fetch-blocks': '获å–全部区å—', + 'app.welcome.link.block-list': '基于 block å¼€å‘ï¼Œå¿«é€Ÿæž„å»ºæ ‡å‡†é¡µé¢', + ...pages, + ...globalHeader, + ...menu, + ...settingDrawer, + ...settings, + ...pwa, + ...component, +}; diff --git a/src/locales/zh-CN/component.ts b/src/locales/zh-CN/component.ts new file mode 100644 index 0000000..1f1fead --- /dev/null +++ b/src/locales/zh-CN/component.ts @@ -0,0 +1,5 @@ +export default { + 'component.tagSelect.expand': '展开', + 'component.tagSelect.collapse': 'æ”¶èµ·', + 'component.tagSelect.all': '全部', +}; diff --git a/src/locales/zh-CN/globalHeader.ts b/src/locales/zh-CN/globalHeader.ts new file mode 100644 index 0000000..9fd66a5 --- /dev/null +++ b/src/locales/zh-CN/globalHeader.ts @@ -0,0 +1,17 @@ +export default { + 'component.globalHeader.search': '站内æœç´¢', + 'component.globalHeader.search.example1': 'æœç´¢æç¤ºä¸€', + 'component.globalHeader.search.example2': 'æœç´¢æç¤ºäºŒ', + 'component.globalHeader.search.example3': 'æœç´¢æç¤ºä¸‰', + 'component.globalHeader.help': '使用文档', + 'component.globalHeader.notification': '通知', + 'component.globalHeader.notification.empty': 'ä½ å·²æŸ¥çœ‹æ‰€æœ‰é€šçŸ¥', + 'component.globalHeader.message': '消æ¯', + 'component.globalHeader.message.empty': '您已读完所有消æ¯', + 'component.globalHeader.event': '待办', + 'component.globalHeader.event.empty': 'ä½ å·²å®Œæˆæ‰€æœ‰å¾…办', + 'component.noticeIcon.clear': '清空', + 'component.noticeIcon.cleared': '清空了', + 'component.noticeIcon.empty': 'æš‚æ— æ•°æ®', + 'component.noticeIcon.view-more': '查看更多', +}; diff --git a/src/locales/zh-CN/menu.ts b/src/locales/zh-CN/menu.ts new file mode 100644 index 0000000..985b516 --- /dev/null +++ b/src/locales/zh-CN/menu.ts @@ -0,0 +1,52 @@ +export default { + 'menu.welcome': '欢迎', + 'menu.more-blocks': '更多区å—', + 'menu.home': '首页', + 'menu.admin': '管ç†é¡µ', + 'menu.admin.sub-page': '二级管ç†é¡µ', + 'menu.login': '登录', + 'menu.register': '注册', + 'menu.register.result': '注册结果', + 'menu.dashboard': 'Dashboard', + 'menu.dashboard.analysis': '分æžé¡µ', + 'menu.dashboard.monitor': '监控页', + 'menu.dashboard.workplace': '工作å°', + 'menu.exception.403': '403', + 'menu.exception.404': '404', + 'menu.exception.500': '500', + 'menu.form': '表å•页', + 'menu.form.basic-form': '基础表å•', + 'menu.form.step-form': '分æ¥è¡¨å•', + 'menu.form.step-form.info': '分æ¥è¡¨å•(填写转账信æ¯ï¼‰', + 'menu.form.step-form.confirm': '分æ¥è¡¨å•(确认转账信æ¯ï¼‰', + 'menu.form.step-form.result': '分æ¥è¡¨å•(完æˆï¼‰', + 'menu.form.advanced-form': '高级表å•', + 'menu.list': '列表页', + 'menu.list.table-list': 'æŸ¥è¯¢è¡¨æ ¼', + 'menu.list.basic-list': 'æ ‡å‡†åˆ—è¡¨', + 'menu.list.card-list': 'å¡ç‰‡åˆ—表', + 'menu.list.search-list': 'æœç´¢åˆ—表', + 'menu.list.search-list.articles': 'æœç´¢åˆ—è¡¨ï¼ˆæ–‡ç« ï¼‰', + 'menu.list.search-list.projects': 'æœç´¢åˆ—表(项目)', + 'menu.list.search-list.applications': 'æœç´¢åˆ—表(应用)', + 'menu.profile': '详情页', + 'menu.profile.basic': '基础详情页', + 'menu.profile.advanced': '高级详情页', + 'menu.result': '结果页', + 'menu.result.success': 'æˆåŠŸé¡µ', + 'menu.result.fail': '失败页', + 'menu.exception': '异常页', + 'menu.exception.not-permission': '403', + 'menu.exception.not-find': '404', + 'menu.exception.server-error': '500', + 'menu.exception.trigger': '触å‘错误', + 'menu.account': '个人页', + 'menu.account.center': '个人ä¸å¿ƒ', + 'menu.account.settings': '个人设置', + 'menu.account.trigger': 'è§¦å‘æŠ¥é”™', + 'menu.account.logout': '退出登录', + 'menu.editor': '图形编辑器', + 'menu.editor.flow': 'æµç¨‹ç¼–辑器', + 'menu.editor.mind': '脑图编辑器', + 'menu.editor.koni': '拓扑编辑器', +}; diff --git a/src/locales/zh-CN/pages.ts b/src/locales/zh-CN/pages.ts new file mode 100644 index 0000000..96298b3 --- /dev/null +++ b/src/locales/zh-CN/pages.ts @@ -0,0 +1,65 @@ +export default { + 'pages.layouts.userLayout.title': 'Ant Design 是西湖区最具影å“力的 Web 设计规范', + 'pages.login.accountLogin.tab': '账户密ç 登录', + 'pages.login.accountLogin.errorMessage': '错误的用户å和密ç (admin/ant.design)', + 'pages.login.username.placeholder': '用户å: admin or user', + 'pages.login.username.required': 'ç”¨æˆ·åæ˜¯å¿…填项ï¼', + 'pages.login.password.placeholder': '密ç : ant.design', + 'pages.login.password.required': 'å¯†ç æ˜¯å¿…填项ï¼', + 'pages.login.phoneLogin.tab': '手机å·ç™»å½•', + 'pages.login.phoneLogin.errorMessage': '验è¯ç 错误', + 'pages.login.phoneNumber.placeholder': '请输入手机å·ï¼', + 'pages.login.phoneNumber.required': 'æ‰‹æœºå·æ˜¯å¿…填项ï¼', + 'pages.login.phoneNumber.invalid': 'ä¸åˆæ³•的手机å·ï¼', + 'pages.login.captcha.placeholder': '请输入验è¯ç ï¼', + 'pages.login.captcha.required': '验è¯ç 是必填项ï¼', + 'pages.login.phoneLogin.getVerificationCode': '获å–验è¯ç ', + 'pages.getCaptchaSecondText': 'ç§’åŽé‡æ–°èŽ·å–', + 'pages.login.rememberMe': '自动登录', + 'pages.login.forgotPassword': '忘记密ç ?', + 'pages.login.submit': 'æäº¤', + 'pages.login.loginWith': 'å…¶ä»–ç™»å½•æ–¹å¼ :', + 'pages.login.registerAccount': '注册账户', + 'pages.welcome.advancedComponent': 'é«˜çº§è¡¨æ ¼', + 'pages.welcome.link': '欢迎使用', + 'pages.welcome.advancedLayout': '高级布局', + 'pages.welcome.alertMessage': '更快更强的é‡åž‹ç»„件,已ç»å‘布。', + 'pages.admin.subPage.title': ' 这个页é¢åªæœ‰ admin æƒé™æ‰èƒ½æŸ¥çœ‹', + 'pages.admin.subPage.alertMessage': 'umi ui 现已å‘布,欢迎使用 npm run ui å¯åŠ¨ä½“éªŒã€‚', + 'pages.searchTable.createForm.newRule': '新建规则', + 'pages.searchTable.updateForm.ruleConfig': '规则é…ç½®', + 'pages.searchTable.updateForm.basicConfig': '基本信æ¯', + 'pages.searchTable.updateForm.ruleName.nameLabel': '规则åç§°', + 'pages.searchTable.updateForm.ruleName.nameRules': '请输入规则åç§°ï¼', + 'pages.searchTable.updateForm.ruleDesc.descLabel': '规则æè¿°', + 'pages.searchTable.updateForm.ruleDesc.descPlaceholder': '请输入至少五个å—符', + 'pages.searchTable.updateForm.ruleDesc.descRules': '请输入至少五个å—符的规则æè¿°ï¼', + 'pages.searchTable.updateForm.ruleProps.title': 'é…置规则属性', + 'pages.searchTable.updateForm.object': '监控对象', + 'pages.searchTable.updateForm.ruleProps.templateLabel': '规则模æ¿', + 'pages.searchTable.updateForm.ruleProps.typeLabel': '规则类型', + 'pages.searchTable.updateForm.schedulingPeriod.title': '设定调度周期', + 'pages.searchTable.updateForm.schedulingPeriod.timeLabel': '开始时间', + 'pages.searchTable.updateForm.schedulingPeriod.timeRules': '请选择开始时间ï¼', + 'pages.searchTable.titleDesc': 'æè¿°', + 'pages.searchTable.ruleName': '规则å称为必填项', + 'pages.searchTable.titleCallNo': 'æœåŠ¡è°ƒç”¨æ¬¡æ•°', + 'pages.searchTable.titleStatus': '状æ€', + 'pages.searchTable.nameStatus.default': 'å…³é—', + 'pages.searchTable.nameStatus.running': 'è¿è¡Œä¸', + 'pages.searchTable.nameStatus.online': '已上线', + 'pages.searchTable.nameStatus.abnormal': '异常', + 'pages.searchTable.titleUpdatedAt': '上次调度时间', + 'pages.searchTable.exception': 'è¯·è¾“å…¥å¼‚å¸¸åŽŸå› ï¼', + 'pages.searchTable.titleOption': 'æ“作', + 'pages.searchTable.config': 'é…ç½®', + 'pages.searchTable.subscribeAlert': 'è®¢é˜…è¦æŠ¥', + 'pages.searchTable.title': 'æŸ¥è¯¢è¡¨æ ¼', + 'pages.searchTable.new': '新建', + 'pages.searchTable.chosen': '已选择', + 'pages.searchTable.item': '项', + 'pages.searchTable.totalServiceCalls': 'æœåŠ¡è°ƒç”¨æ¬¡æ•°æ€»è®¡', + 'pages.searchTable.tenThousand': '万', + 'pages.searchTable.batchDeletion': '批é‡åˆ 除', + 'pages.searchTable.batchApproval': '批é‡å®¡æ‰¹', +}; diff --git a/src/locales/zh-CN/pwa.ts b/src/locales/zh-CN/pwa.ts new file mode 100644 index 0000000..e950484 --- /dev/null +++ b/src/locales/zh-CN/pwa.ts @@ -0,0 +1,6 @@ +export default { + 'app.pwa.offline': '当å‰å¤„于离线状æ€', + 'app.pwa.serviceworker.updated': '有新内容', + 'app.pwa.serviceworker.updated.hint': 'è¯·ç‚¹å‡»â€œåˆ·æ–°â€æŒ‰é’®æˆ–者手动刷新页é¢', + 'app.pwa.serviceworker.updated.ok': '刷新', +}; diff --git a/src/locales/zh-CN/settingDrawer.ts b/src/locales/zh-CN/settingDrawer.ts new file mode 100644 index 0000000..15685a4 --- /dev/null +++ b/src/locales/zh-CN/settingDrawer.ts @@ -0,0 +1,31 @@ +export default { + 'app.setting.pagestyle': 'æ•´ä½“é£Žæ ¼è®¾ç½®', + 'app.setting.pagestyle.dark': '暗色èœå•é£Žæ ¼', + 'app.setting.pagestyle.light': '亮色èœå•é£Žæ ¼', + 'app.setting.content-width': '内容区域宽度', + 'app.setting.content-width.fixed': '定宽', + 'app.setting.content-width.fluid': 'æµå¼', + 'app.setting.themecolor': '主题色', + 'app.setting.themecolor.dust': 'è–„æš®', + 'app.setting.themecolor.volcano': 'ç«å±±', + 'app.setting.themecolor.sunset': '日暮', + 'app.setting.themecolor.cyan': '明é’', + 'app.setting.themecolor.green': 'æžå…‰ç»¿', + 'app.setting.themecolor.daybreak': '拂晓è“(默认)', + 'app.setting.themecolor.geekblue': 'æžå®¢è“', + 'app.setting.themecolor.purple': '酱紫', + 'app.setting.navigationmode': '导航模å¼', + 'app.setting.sidemenu': 'ä¾§è¾¹èœå•布局', + 'app.setting.topmenu': '顶部èœå•布局', + 'app.setting.fixedheader': '固定 Header', + 'app.setting.fixedsidebar': '固定侧边èœå•', + 'app.setting.fixedsidebar.hint': 'ä¾§è¾¹èœå•布局时å¯é…ç½®', + 'app.setting.hideheader': '下滑时éšè— Header', + 'app.setting.hideheader.hint': '固定 Header æ—¶å¯é…ç½®', + 'app.setting.othersettings': '其他设置', + 'app.setting.weakmode': '色弱模å¼', + 'app.setting.copy': 'æ‹·è´è®¾ç½®', + 'app.setting.copyinfo': 'æ‹·è´æˆåŠŸï¼Œè¯·åˆ° src/defaultSettings.js 䏿›¿æ¢é»˜è®¤é…ç½®', + 'app.setting.production.hint': + 'é…ç½®æ åªåœ¨å¼€å‘环境用于预览,生产环境ä¸ä¼šå±•现,请拷è´åŽæ‰‹åŠ¨ä¿®æ”¹é…置文件', +}; diff --git a/src/locales/zh-CN/settings.ts b/src/locales/zh-CN/settings.ts new file mode 100644 index 0000000..df8af43 --- /dev/null +++ b/src/locales/zh-CN/settings.ts @@ -0,0 +1,55 @@ +export default { + 'app.settings.menuMap.basic': '基本设置', + 'app.settings.menuMap.security': '安全设置', + 'app.settings.menuMap.binding': 'è´¦å·ç»‘定', + 'app.settings.menuMap.notification': '新消æ¯é€šçŸ¥', + 'app.settings.basic.avatar': '头åƒ', + 'app.settings.basic.change-avatar': 'æ›´æ¢å¤´åƒ', + 'app.settings.basic.email': '邮箱', + 'app.settings.basic.email-message': '请输入您的邮箱!', + 'app.settings.basic.nickname': '昵称', + 'app.settings.basic.nickname-message': '请输入您的昵称!', + 'app.settings.basic.profile': '个人简介', + 'app.settings.basic.profile-message': '请输入个人简介!', + 'app.settings.basic.profile-placeholder': '个人简介', + 'app.settings.basic.country': '国家/地区', + 'app.settings.basic.country-message': '请输入您的国家或地区!', + 'app.settings.basic.geographic': '所在çœå¸‚', + 'app.settings.basic.geographic-message': '请输入您的所在çœå¸‚!', + 'app.settings.basic.address': 'è¡—é“地å€', + 'app.settings.basic.address-message': '请输入您的街é“地å€!', + 'app.settings.basic.phone': 'è”系电è¯', + 'app.settings.basic.phone-message': '请输入您的è”系电è¯!', + 'app.settings.basic.update': '更新基本信æ¯', + 'app.settings.security.strong': '强', + 'app.settings.security.medium': 'ä¸', + 'app.settings.security.weak': 'å¼±', + 'app.settings.security.password': '账户密ç ', + 'app.settings.security.password-description': '当å‰å¯†ç 强度', + 'app.settings.security.phone': 'å¯†ä¿æ‰‹æœº', + 'app.settings.security.phone-description': '已绑定手机', + 'app.settings.security.question': '密ä¿é—®é¢˜', + 'app.settings.security.question-description': '未设置密ä¿é—®é¢˜ï¼Œå¯†ä¿é—®é¢˜å¯æœ‰æ•ˆä¿æŠ¤è´¦æˆ·å®‰å…¨', + 'app.settings.security.email': '备用邮箱', + 'app.settings.security.email-description': '已绑定邮箱', + 'app.settings.security.mfa': 'MFA 设备', + 'app.settings.security.mfa-description': '未绑定 MFA 设备,绑定åŽï¼Œå¯ä»¥è¿›è¡ŒäºŒæ¬¡ç¡®è®¤', + 'app.settings.security.modify': '修改', + 'app.settings.security.set': '设置', + 'app.settings.security.bind': '绑定', + 'app.settings.binding.taobao': '绑定淘å®', + 'app.settings.binding.taobao-description': '当剿œªç»‘定淘å®è´¦å·', + 'app.settings.binding.alipay': '绑定支付å®', + 'app.settings.binding.alipay-description': '当剿œªç»‘定支付å®è´¦å·', + 'app.settings.binding.dingding': '绑定钉钉', + 'app.settings.binding.dingding-description': '当剿œªç»‘定钉钉账å·', + 'app.settings.binding.bind': '绑定', + 'app.settings.notification.password': '账户密ç ', + 'app.settings.notification.password-description': '其他用户的消æ¯å°†ä»¥ç«™å†…信的形å¼é€šçŸ¥', + 'app.settings.notification.messages': '系统消æ¯', + 'app.settings.notification.messages-description': '系统消æ¯å°†ä»¥ç«™å†…信的形å¼é€šçŸ¥', + 'app.settings.notification.todo': '待办任务', + 'app.settings.notification.todo-description': '待办任务将以站内信的形å¼é€šçŸ¥', + 'app.settings.open': 'å¼€', + 'app.settings.close': 'å…³', +}; diff --git a/src/locales/zh-TW.ts b/src/locales/zh-TW.ts new file mode 100644 index 0000000..6ad5f93 --- /dev/null +++ b/src/locales/zh-TW.ts @@ -0,0 +1,20 @@ +import component from './zh-TW/component'; +import globalHeader from './zh-TW/globalHeader'; +import menu from './zh-TW/menu'; +import pwa from './zh-TW/pwa'; +import settingDrawer from './zh-TW/settingDrawer'; +import settings from './zh-TW/settings'; + +export default { + 'navBar.lang': '語言', + 'layout.user.link.help': '幫助', + 'layout.user.link.privacy': 'éš±ç§', + 'layout.user.link.terms': 'æ¢æ¬¾', + 'app.preview.down.block': '下載æ¤é é¢åˆ°æœ¬åœ°é …ç›®', + ...globalHeader, + ...menu, + ...settingDrawer, + ...settings, + ...pwa, + ...component, +}; diff --git a/src/locales/zh-TW/component.ts b/src/locales/zh-TW/component.ts new file mode 100644 index 0000000..ba48e29 --- /dev/null +++ b/src/locales/zh-TW/component.ts @@ -0,0 +1,5 @@ +export default { + 'component.tagSelect.expand': '展開', + 'component.tagSelect.collapse': 'æ”¶èµ·', + 'component.tagSelect.all': '全部', +}; diff --git a/src/locales/zh-TW/globalHeader.ts b/src/locales/zh-TW/globalHeader.ts new file mode 100644 index 0000000..ed58451 --- /dev/null +++ b/src/locales/zh-TW/globalHeader.ts @@ -0,0 +1,17 @@ +export default { + 'component.globalHeader.search': '站內æœç´¢', + 'component.globalHeader.search.example1': 'æœç´¢æç¤ºå£¹', + 'component.globalHeader.search.example2': 'æœç´¢æç¤ºäºŒ', + 'component.globalHeader.search.example3': 'æœç´¢æç¤ºä¸‰', + 'component.globalHeader.help': '使用手冊', + 'component.globalHeader.notification': '通知', + 'component.globalHeader.notification.empty': '妳已查看所有通知', + 'component.globalHeader.message': '消æ¯', + 'component.globalHeader.message.empty': '您已讀完所有消æ¯', + 'component.globalHeader.event': '待辦', + 'component.globalHeader.event.empty': 'å¦³å·²å®Œæˆæ‰€æœ‰å¾…辦', + 'component.noticeIcon.clear': '清空', + 'component.noticeIcon.cleared': '清空了', + 'component.noticeIcon.empty': '暫無資料', + 'component.noticeIcon.view-more': '查看更多', +}; diff --git a/src/locales/zh-TW/menu.ts b/src/locales/zh-TW/menu.ts new file mode 100644 index 0000000..d724459 --- /dev/null +++ b/src/locales/zh-TW/menu.ts @@ -0,0 +1,52 @@ +export default { + 'menu.welcome': 'æ¡è¿Ž', + 'menu.more-blocks': '更多å€å¡Š', + 'menu.home': '首é ', + 'menu.login': '登錄', + 'menu.admin': 'æƒé™', + 'menu.admin.sub-page': '二级管ç†é¡µ', + 'menu.exception.403': '403', + 'menu.exception.404': '404', + 'menu.exception.500': '500', + 'menu.register': '註冊', + 'menu.register.result': 'è¨»å†Šçµæžœ', + 'menu.dashboard': 'Dashboard', + 'menu.dashboard.analysis': '分æžé ', + 'menu.dashboard.monitor': '監控é ', + 'menu.dashboard.workplace': '工作臺', + 'menu.form': '表單é ', + 'menu.form.basic-form': '基礎表單', + 'menu.form.step-form': '分æ¥è¡¨å–®', + 'menu.form.step-form.info': '分æ¥è¡¨å–®ï¼ˆå¡«å¯«è½‰è³¬ä¿¡æ¯ï¼‰', + 'menu.form.step-form.confirm': '分æ¥è¡¨å–®ï¼ˆç¢ºèªè½‰è³¬ä¿¡æ¯ï¼‰', + 'menu.form.step-form.result': '分æ¥è¡¨å–®ï¼ˆå®Œæˆï¼‰', + 'menu.form.advanced-form': '高級表單', + 'menu.list': '列表é ', + 'menu.list.table-list': 'æŸ¥è©¢è¡¨æ ¼', + 'menu.list.basic-list': '標淮列表', + 'menu.list.card-list': 'å¡ç‰‡åˆ—表', + 'menu.list.search-list': 'æœç´¢åˆ—表', + 'menu.list.search-list.articles': 'æœç´¢åˆ—è¡¨ï¼ˆæ–‡ç« ï¼‰', + 'menu.list.search-list.projects': 'æœç´¢åˆ—è¡¨ï¼ˆé …ç›®ï¼‰', + 'menu.list.search-list.applications': 'æœç´¢åˆ—表(應用)', + 'menu.profile': '詳情é ', + 'menu.profile.basic': '基礎詳情é ', + 'menu.profile.advanced': '高級詳情é ', + 'menu.result': 'çµæžœé ', + 'menu.result.success': 'æˆåŠŸé ', + 'menu.result.fail': '失敗é ', + 'menu.account': '個人é ', + 'menu.account.center': '個人ä¸å¿ƒ', + 'menu.account.settings': '個人è¨ç½®', + 'menu.account.trigger': 'è§¸ç™¼å ±éŒ¯', + 'menu.account.logout': '退出登錄', + 'menu.exception': '异常页', + 'menu.exception.not-permission': '403', + 'menu.exception.not-find': '404', + 'menu.exception.server-error': '500', + 'menu.exception.trigger': '触å‘错误', + 'menu.editor': '圖形編輯器', + 'menu.editor.flow': 'æµç¨‹ç·¨è¼¯å™¨', + 'menu.editor.mind': '腦圖編輯器', + 'menu.editor.koni': '拓撲編輯器', +}; diff --git a/src/locales/zh-TW/pwa.ts b/src/locales/zh-TW/pwa.ts new file mode 100644 index 0000000..108a6e4 --- /dev/null +++ b/src/locales/zh-TW/pwa.ts @@ -0,0 +1,6 @@ +export default { + 'app.pwa.offline': 'ç•¶å‰è™•於離線狀態', + 'app.pwa.serviceworker.updated': '有新內容', + 'app.pwa.serviceworker.updated.hint': 'è«‹é»žæ“Šâ€œåˆ·æ–°â€æŒ‰éˆ•或者手動刷新é é¢', + 'app.pwa.serviceworker.updated.ok': '刷新', +}; diff --git a/src/locales/zh-TW/settingDrawer.ts b/src/locales/zh-TW/settingDrawer.ts new file mode 100644 index 0000000..24dc281 --- /dev/null +++ b/src/locales/zh-TW/settingDrawer.ts @@ -0,0 +1,31 @@ +export default { + 'app.setting.pagestyle': 'æ•´é«”é¢¨æ ¼è¨ç½®', + 'app.setting.pagestyle.dark': '暗色èœå–®é¢¨æ ¼', + 'app.setting.pagestyle.light': '亮色èœå–®é¢¨æ ¼', + 'app.setting.content-width': '內容å€åŸŸå¯¬åº¦', + 'app.setting.content-width.fixed': '定寬', + 'app.setting.content-width.fluid': 'æµå¼', + 'app.setting.themecolor': '主題色', + 'app.setting.themecolor.dust': 'è–„æš®', + 'app.setting.themecolor.volcano': 'ç«å±±', + 'app.setting.themecolor.sunset': '日暮', + 'app.setting.themecolor.cyan': '明é’', + 'app.setting.themecolor.green': 'æ¥µå…‰ç¶ ', + 'app.setting.themecolor.daybreak': '拂曉è—(默èªï¼‰', + 'app.setting.themecolor.geekblue': '極客è—', + 'app.setting.themecolor.purple': '醬紫', + 'app.setting.navigationmode': '導航模å¼', + 'app.setting.sidemenu': 'å´é‚Šèœå–®å¸ƒå±€', + 'app.setting.topmenu': 'é ‚éƒ¨èœå–®å¸ƒå±€', + 'app.setting.fixedheader': '固定 Header', + 'app.setting.fixedsidebar': '固定å´é‚Šèœå–®', + 'app.setting.fixedsidebar.hint': 'å´é‚Šèœå–®å¸ƒå±€æ™‚å¯é…ç½®', + 'app.setting.hideheader': 'ä¸‹æ»‘æ™‚éš±è— Header', + 'app.setting.hideheader.hint': '固定 Header 時å¯é…ç½®', + 'app.setting.othersettings': 'å…¶ä»–è¨ç½®', + 'app.setting.weakmode': '色弱模å¼', + 'app.setting.copy': 'æ‹·è²è¨ç½®', + 'app.setting.copyinfo': 'æ‹·è²æˆåŠŸï¼Œè«‹åˆ° src/defaultSettings.js 䏿›¿æ›é»˜èªé…ç½®', + 'app.setting.production.hint': + 'é…置欄åªåœ¨é–‹ç™¼ç’°å¢ƒç”¨æ–¼é è¦½ï¼Œç”Ÿç”¢ç’°å¢ƒä¸æœƒå±•ç¾ï¼Œè«‹æ‹·è²å¾Œæ‰‹å‹•修改é…置文件', +}; diff --git a/src/locales/zh-TW/settings.ts b/src/locales/zh-TW/settings.ts new file mode 100644 index 0000000..dd45151 --- /dev/null +++ b/src/locales/zh-TW/settings.ts @@ -0,0 +1,55 @@ +export default { + 'app.settings.menuMap.basic': '基本è¨ç½®', + 'app.settings.menuMap.security': '安全è¨ç½®', + 'app.settings.menuMap.binding': '賬號ç¶å®š', + 'app.settings.menuMap.notification': '新消æ¯é€šçŸ¥', + 'app.settings.basic.avatar': 'é åƒ', + 'app.settings.basic.change-avatar': 'æ›´æ›é åƒ', + 'app.settings.basic.email': '郵箱', + 'app.settings.basic.email-message': '請輸入您的郵箱!', + 'app.settings.basic.nickname': '昵稱', + 'app.settings.basic.nickname-message': '請輸入您的昵稱!', + 'app.settings.basic.profile': '個人簡介', + 'app.settings.basic.profile-message': '請輸入個人簡介!', + 'app.settings.basic.profile-placeholder': '個人簡介', + 'app.settings.basic.country': '國家/地å€', + 'app.settings.basic.country-message': '請輸入您的國家或地å€!', + 'app.settings.basic.geographic': '所在çœå¸‚', + 'app.settings.basic.geographic-message': '請輸入您的所在çœå¸‚!', + 'app.settings.basic.address': 'è¡—é“地å€', + 'app.settings.basic.address-message': '請輸入您的街é“地å€!', + 'app.settings.basic.phone': 'è¯ç³»é›»è©±', + 'app.settings.basic.phone-message': '請輸入您的è¯ç³»é›»è©±!', + 'app.settings.basic.update': '更新基本信æ¯', + 'app.settings.security.strong': 'å¼·', + 'app.settings.security.medium': 'ä¸', + 'app.settings.security.weak': 'å¼±', + 'app.settings.security.password': '賬戶密碼', + 'app.settings.security.password-description': 'ç•¶å‰å¯†ç¢¼å¼·åº¦', + 'app.settings.security.phone': 'å¯†ä¿æ‰‹æ©Ÿ', + 'app.settings.security.phone-description': 'å·²ç¶å®šæ‰‹æ©Ÿ', + 'app.settings.security.question': '密ä¿å•題', + 'app.settings.security.question-description': '未è¨ç½®å¯†ä¿å•題,密ä¿å•é¡Œå¯æœ‰æ•ˆä¿è·è³¬æˆ¶å®‰å…¨', + 'app.settings.security.email': '備用郵箱', + 'app.settings.security.email-description': 'å·²ç¶å®šéƒµç®±', + 'app.settings.security.mfa': 'MFA è¨å‚™', + 'app.settings.security.mfa-description': '未ç¶å®š MFA è¨å‚™ï¼Œç¶å®šå¾Œï¼Œå¯ä»¥é€²è¡ŒäºŒæ¬¡ç¢ºèª', + 'app.settings.security.modify': '修改', + 'app.settings.security.set': 'è¨ç½®', + 'app.settings.security.bind': 'ç¶å®š', + 'app.settings.binding.taobao': 'ç¶å®šæ·˜å¯¶', + 'app.settings.binding.taobao-description': 'ç•¶å‰æœªç¶å®šæ·˜å¯¶è³¬è™Ÿ', + 'app.settings.binding.alipay': 'ç¶å®šæ”¯ä»˜å¯¶', + 'app.settings.binding.alipay-description': 'ç•¶å‰æœªç¶å®šæ”¯ä»˜å¯¶è³¬è™Ÿ', + 'app.settings.binding.dingding': 'ç¶å®šé‡˜é‡˜', + 'app.settings.binding.dingding-description': 'ç•¶å‰æœªç¶å®šé‡˜é‡˜è³¬è™Ÿ', + 'app.settings.binding.bind': 'ç¶å®š', + 'app.settings.notification.password': '賬戶密碼', + 'app.settings.notification.password-description': '其他用戶的消æ¯å°‡ä»¥ç«™å…§ä¿¡çš„å½¢å¼é€šçŸ¥', + 'app.settings.notification.messages': '系統消æ¯', + 'app.settings.notification.messages-description': '系統消æ¯å°‡ä»¥ç«™å…§ä¿¡çš„å½¢å¼é€šçŸ¥', + 'app.settings.notification.todo': '待辦任務', + 'app.settings.notification.todo-description': '待辦任務將以站內信的形å¼é€šçŸ¥', + 'app.settings.open': 'é–‹', + 'app.settings.close': 'é—œ', +}; diff --git a/src/manifest.json b/src/manifest.json new file mode 100644 index 0000000..9e30e7d --- /dev/null +++ b/src/manifest.json @@ -0,0 +1,22 @@ +{ + "name": "Ant Mobile", + "short_name": "Ant Mobile", + "display": "standalone", + "start_url": "./?utm_source=homescreen", + "theme_color": "#002140", + "background_color": "#001529", + "icons": [ + { + "src": "icons/icon-192x192.png", + "sizes": "192x192" + }, + { + "src": "icons/icon-128x128.png", + "sizes": "128x128" + }, + { + "src": "icons/icon-512x512.png", + "sizes": "512x512" + } + ] +} diff --git a/src/models/ca.ts b/src/models/ca.ts new file mode 100644 index 0000000..6a42712 --- /dev/null +++ b/src/models/ca.ts @@ -0,0 +1,161 @@ +import { message } from 'antd'; +import { Reducer } from 'redux'; +import caSettings, { CaSettings } from '../configs/caSettings'; +import { Subscription, Effect } from 'dva'; +import { getCaConfigs } from '@/services/ca'; +import { getPageQuery, convertJsonToCamelCase } from '@/utils/utils'; +import { history } from 'umi'; + +import { ConnectState } from '@/models/connect'; +import { getLoadedModuleStatus as metaGet } from '@/utils/metaModules'; +import { setLoadedModuleStatus as caSet, reloadModuleStatus as caReload } from '@/utils/caModules'; +import _ from 'lodash'; +import { stringify } from 'querystring'; +import { metaTranslationOfCaGroups } from '@/constants/translationGroups'; +import defaultSettings from '../../config/defaultSettings'; + +export interface CaModelType { + namespace: 'ca'; + state: CaSettings; + effects: { + fetchMeta: Effect; + fetchCaConfigs: Effect; + }; + reducers: { + saveCaConfigs: Reducer<CaSettings>; + setCaId: Reducer<CaSettings>; + setLoadedModule: Reducer<CaSettings>; + }; + subscriptions: { + caInit: Subscription; + }; +} + +const MetaModel: CaModelType = { + namespace: 'ca', + state: caSettings, + effects: { + *fetchMeta(_, { put, all, select }) { + /* + 1. transPkg + 2. cities + */ + const { caId, requiredLang, metaLoadedModule } = yield select((state: ConnectState) => ({ + caId: state.ca.caId, + requiredLang: state.meta.viewingLang, + metaLoadedModule: state.meta.loadedModule, + })); + + const transGroups = metaTranslationOfCaGroups; // TBD. minimal required transPkg for ca meta + + const payload = { caId, requiredLang, transGroups }; + + let getActions = metaGet('ca', metaLoadedModule, payload); + + if (getActions) { + let actionArray: any = []; + _.forEach(getActions, (value: any) => actionArray.push(put(value))); + yield all(actionArray); + } + }, + *fetchCaConfigs({ caId }, { call, put }) { + const response = yield call(getCaConfigs, { caId }); + + if (response.success) { + const caConfigs = convertJsonToCamelCase(response.result); + yield put({ + type: 'saveCaConfigs', + caConfigs, + }); + } else { + if (response.message) { + message.error(response.message); + } + } + // æ”¹çŠ¶æ€ + yield put({ + type: 'meta/setLoadedModule', + key: 'caConfigs', + value: true, + }); + }, + }, + reducers: { + setCaId(state = caSettings, { caId }) { + if (localStorage) { + localStorage.setItem(`${defaultSettings.projectKey}-ca-id`, caId); + } + return { + ...state, + caId, + }; + }, + saveCaConfigs(state = caSettings, { caConfigs }) { + return { + ...state, + caConfigs, + }; + }, + setLoadedModule(state = caSettings, { reload = false, key, subKey, value }) { + let currentLoadedModule = state.loadedModule; + if (reload) { + currentLoadedModule = caReload(reload, currentLoadedModule); + } else { + if (key && subKey) { + currentLoadedModule.api[key][subKey] = value; + } else if (key) { + currentLoadedModule.api[key] = value; + } + } + const loadedModule = caSet(currentLoadedModule); + return { + ...state, + loadedModule, + }; + }, + }, + subscriptions: { + caInit({ + dispatch, + history: { + location: { pathname, search }, + }, + }): any { + console.log(`pathname: ${pathname}` + ' CA model - init - set up ca from url params'); + console.log(`search: ${search}`); + + const { ca_id, ...queryParams } = getPageQuery() as { + ca_id: string; + queryParams: any; + }; + + //============处ç†caId (local | query)==============// + let caId = ca_id ? ca_id : false; + + if (!caId) { + const projectKey = defaultSettings.projectKey; + // if no city passed from url, try to read from the local storage + const localCaId = + localStorage && localStorage.getItem(`${projectKey}-ca-id`) + ? localStorage.getItem(`${projectKey}-ca-id`) + : false; + caId = localCaId ? localCaId : false; //TBD. + } + + if (caId) { + //set viewingBusinessId + dispatch({ + type: 'setCaId', + caId, + }); + } + //============处ç†caId - End ==============// + + history.replace({ + pathname: pathname === '/' ? '/od' : pathname, + search: stringify({ ...queryParams } as any), + }); + }, + }, +}; +export default MetaModel; diff --git a/src/models/connect.d.ts b/src/models/connect.d.ts new file mode 100644 index 0000000..d0c8ae1 --- /dev/null +++ b/src/models/connect.d.ts @@ -0,0 +1,28 @@ +import { MenuDataItem, Settings as ProSettings } from '@ant-design/pro-layout'; + +import { CaSettings } from '@/configs/caSettings'; +import { OdSettings } from '@/configs/odSettings'; +import { UserSettings } from '@/configs/userSettings'; +import { MetaSettings } from '@/configs/metaSettings'; + +export { GlobalModelState, UserModelState }; + +export interface Loading { + global: boolean; + effects: { [key: string]: boolean | undefined }; + models: { [key: string]: boolean | undefined }; +} + +export interface ConnectState { + meta: MetaSettings; + + user: UserModelState; + ca: CaSettings; + od: OdModelState; + + loading: Loading; +} + +export interface Route extends MenuDataItem { + routes?: Route[]; +} diff --git a/src/models/meta.ts b/src/models/meta.ts new file mode 100644 index 0000000..f5f6b0f --- /dev/null +++ b/src/models/meta.ts @@ -0,0 +1,264 @@ +import { message } from 'antd'; +import { Reducer } from 'redux'; + +import { Subscription, Effect } from 'dva'; + +import { getPageQuery } from '@/utils/utils'; +import { setLoadedModuleStatus, reloadModuleStatus } from '@/utils/metaModules'; +import { stringify } from 'querystring'; +import { ConnectState } from '@/models/connect'; + +import { history } from 'umi'; +import { setLocale } from 'umi'; + +import { getTranslations, getCurrentUserdetails } from '@/services/meta'; + +import metaSettings, { MetaSettings } from '../configs/metaSettings'; +import defaultSettings from '../../config/defaultSettings'; + +import { languageLabel, languageToLocal } from '@/constants/languages'; +import { ValidLoginRedirectParams } from '@/constants/routesParams'; + +import { convertJsonToCamelCase } from '@/utils/utils'; + +export interface MetaModelType { + namespace: string; + state: MetaSettings; + effects: { + fetchTranslations: Effect; + fetchCurrentUserDetails: Effect; + }; + reducers: { + setViewingLang: Reducer<MetaSettings>; + saveTranslations: Reducer<MetaSettings>; + saveCurrentUserDetails: Reducer<MetaSettings>; + + setMobileType: Reducer<MetaSettings>; + setLoginRedirect: Reducer<MetaSettings>; + + setLoadedModule: Reducer<MetaSettings>; + }; + subscriptions: { + metaInit: Subscription; + }; +} + +const MetaModel: MetaModelType = { + namespace: 'meta', + state: metaSettings, + effects: { + *fetchTranslations( + { requiredLang, transGroups = false, baseTans = false }, + { call, put, select }, + ) { + /* + before fetching the need translations pkg, + need to do a check first. + + transGroups must be passed + */ + const { currentLang, currentTransGroups } = yield select((state: ConnectState) => ({ + currentLang: state.meta.translations.lang, + currentTransGroups: Object.keys(state.meta.translations), + })); + + //do the filter + if (transGroups && requiredLang === currentLang) { + transGroups = transGroups.filter((group: string) => !currentTransGroups.includes(group)); + } + + // if no transGroups or no groups need to find + if ((!transGroups || transGroups.length === 0) && baseTans) { + yield put({ + type: 'setLoadedModule', + trans: true, + key: baseTans, + value: true, + }); + return; + } + + const response = yield call(getTranslations, { transGroups }); + + if (response.success) { + setLocale(languageToLocal[response.result.lang], false); + yield put({ + type: 'saveTranslations', + payload: { + replace: requiredLang === currentLang ? false : true, + passedTranslations: response.result, + notify: response.message, + }, + }); + + if (baseTans) { + //ä»£è¡¨è¿™ä¸ªè¯·æ±‚è¦æ”¹ -基 -翻译类 + yield put({ + type: 'setLoadedModule', + trans: true, + key: baseTans, + value: true, + }); + } + } + }, + *fetchCurrentUserDetails({ userId }, { call, put }) { + const response = yield call(getCurrentUserdetails, { userId }); + if (response.success) { + const currentUserDetails = convertJsonToCamelCase(response.result); + yield put({ + type: 'saveCurrentUserDetails', + currentUserDetails, + }); + + // æ”¹çŠ¶æ€ + yield put({ + type: 'setLoadedModule', + key: 'userDetails', + value: true, + }); + } else { + if (response.message) { + message.error(response.message); + } + } + }, + }, + reducers: { + setViewingLang(state = metaSettings, { viewingLang }) { + if (localStorage) { + localStorage.setItem(`${defaultSettings.projectKey}-view-lang`, viewingLang); + } + return { + ...state, + viewingLang, + }; + }, + saveTranslations(state = metaSettings, { payload: { replace, passedTranslations, notify } }) { + const translations = replace + ? passedTranslations + : { + ...state.translations, + translations: { + ...state.translations.translations, + ...passedTranslations.translations, + }, + }; + + const currentLang = state.translations.lang; + // if (currentLang && currentLang !== passedTranslations.lang) { + // message.success(notify); + // } + return { + ...state, + translations, + }; + }, + saveCurrentUserDetails(state = metaSettings, { currentUserDetails }) { + return { + ...state, + currentUserDetails, + }; + }, + + setLoginRedirect(state = metaSettings, { loginRedirect = false }) { + return { + ...state, + loginRedirect, + }; + }, + setMobileType(state = metaSettings, { width }) { + let isMobile = false; + let isXs = false; + if (width <= 767) { + isMobile = true; + if (width <= 576) { + isXs = true; + } + } + return { + ...state, + isMobile, + isXs, + }; + }, + setLoadedModule(state = metaSettings, { reload = false, trans = false, key, value }) { + let currentLoadedModule = state.loadedModule; + if (reload) { + currentLoadedModule = reloadModuleStatus(reload, currentLoadedModule); + } else { + if (trans) { + currentLoadedModule.api.transPkg[key] = value; + } else { + currentLoadedModule.api[key] = value; + } + } + const loadedModule = setLoadedModuleStatus(currentLoadedModule); + return { + ...state, + loadedModule, + }; + }, + }, + + subscriptions: { + metaInit({ + dispatch, + history: { + location: { pathname, search }, + }, + }): any { + console.log(`pathname: ${pathname}` + ' META model - init - set up meta from url params'); + console.log(`search: ${search}`); + + const projectKey = defaultSettings.projectKey; + + // const { location: { pathname }} = history; + const { lang, login_redirect, ...queryParams } = getPageQuery() as { + lang: string; + login_redirect: string; + queryParams: any; + }; + + //============处ç†viewingLang (local | query)==============// + let viewingLang = lang && languageLabel.includes(lang) ? lang : false; + + if (!viewingLang) { + // if no lang passed from url, try to read from the local storage + const localLang = + localStorage && localStorage.getItem(`${projectKey}-view-lang`) + ? localStorage.getItem(`${projectKey}-view-lang`) + : false; + viewingLang = localLang && languageLabel.includes(localLang) ? localLang : 'en_AU'; + } + + if (lang && !languageLabel.includes(lang)) { + // lang is sometimes, but should be valid + message.error('Selected viewing language is wrong, set to English as default.'); + } + + dispatch({ + //set显示的è¯è¨€ - Meta + type: 'setViewingLang', + viewingLang, + }); + //============处ç†viewingLang - End==============// + + //============处ç†login跳转 (query)==============// + if (login_redirect && ValidLoginRedirectParams.includes(login_redirect)) { + // set the login_redirect + dispatch({ + type: 'setLoginRedirect', + loginRedirect: login_redirect, + }); + } + //============处ç†login跳转 - End==============// + + history.replace({ + pathname: pathname === '/' ? '/od' : pathname, + search: stringify({ ...queryParams } as any), + }); + }, + }, +}; +export default MetaModel; diff --git a/src/models/od.ts b/src/models/od.ts new file mode 100644 index 0000000..dbc7bb8 --- /dev/null +++ b/src/models/od.ts @@ -0,0 +1,126 @@ +import { Reducer } from 'redux'; +import odSettings, { OdSettings } from '../configs/odSettings'; +import { Subscription, Effect } from 'dva'; +import { languageLabel } from '@/constants/languages'; +import { message } from 'antd'; +import { ConnectState } from '@/models/connect'; +import { getLoadedModuleStatus as metaGet } from '@/utils/metaModules'; +import { setLoadedModuleStatus as odSet, reloadModuleStatus } from '@/utils/odModules'; +import _ from 'lodash'; +import { convertJsonToCamelCase } from '@/utils/utils'; +import { metaTranslationOfOdGroups } from '@/constants/translationGroups'; + +import { stringify } from 'querystring'; + +export interface OdModelType { + namespace: string; + state: OdSettings; + effects: { + fetchMeta: Effect; + }; + reducers: { + setLayoutCollapsed: Reducer<OdSettings>; + setReloadAction: Reducer<OdSettings>; + + setLoadedModule: Reducer<OdSettings>; + }; + subscriptions: { + odInit: Subscription; + }; +} + +const OdModel: OdModelType = { + namespace: 'od', + state: odSettings, + effects: { + *fetchMeta(_, { put, all, select }) { + //init the od layout data + /* + 1. transPkg + 2. userDetails + + TBD. + */ + const { requiredLang, currentUser, metaModuleLoaded } = yield select( + (state: ConnectState) => ({ + requiredLang: state.meta.viewingLang, + currentUser: state.user.currentUser, + metaModuleLoaded: state.meta.loadedModule, + }), + ); + + const userId = currentUser && currentUser.id ? currentUser.id : false; + + const transGroups = metaTranslationOfOdGroups; + + //è¿™é‡ŒåŠ è½½od layoutçš„data --> od meta + //transPkg && userDetails + let payload = { requiredLang, userId, transGroups }; + + let getActions = metaGet('od', metaModuleLoaded, payload); + + if (getActions) { + let actionArray: any = []; + + _.forEach(getActions, (value: any) => actionArray.push(put(value))); + + yield all(actionArray); + } + }, + }, + reducers: { + setLayoutCollapsed(state = odSettings, { layoutCollapsed }) { + return { + ...state, + layoutCollapsed, + }; + }, + setReloadAction( + state = odSettings, + { showActioningMessage = false, spaceName, reloadType = false, redirectUrl = false }, + ) { + let reloadAction: any = { showActioningMessage, spaceName }; + + if (redirectUrl) { + reloadAction = { ...reloadAction, redirectUrl }; + } else if (reloadType) { + reloadAction = { ...reloadAction, reloadType }; + } + + return { + ...state, + reloadAction, + }; + }, + + setLoadedModule(state = odSettings, { reload = false, key, subKey = false, value }) { + let currentLoadedModule = state.loadedModule; + if (reload) { + currentLoadedModule = reloadModuleStatus(reload, currentLoadedModule); + } else { + if (key && subKey) { + currentLoadedModule.api[key][subKey] = value; + } else { + currentLoadedModule.api[key] = value; + } + } + const odModuleLoaded = odSet(currentLoadedModule); + return { + ...state, + odModuleLoaded, + }; + }, + }, + subscriptions: { + odInit({ + dispatch, + history: { + location: { pathname, search }, + }, + }): any { + console.log(`pathname: ${pathname}` + ' OD model - init - set up od from localStorage'); + console.log(`search: ${search}`); + }, + }, +}; +export default OdModel; diff --git a/src/models/setting.ts b/src/models/setting.ts new file mode 100644 index 0000000..37a4ea7 --- /dev/null +++ b/src/models/setting.ts @@ -0,0 +1,37 @@ +import { Reducer } from 'umi'; +import defaultSettings, { DefaultSettings } from '../../config/defaultSettings'; + +export interface SettingModelType { + namespace: 'settings'; + state: DefaultSettings; + reducers: { + changeSetting: Reducer<DefaultSettings>; + }; +} + +const updateColorWeak: (colorWeak: boolean) => void = (colorWeak) => { + const root = document.getElementById('root'); + if (root) { + root.className = colorWeak ? 'colorWeak' : ''; + } +}; + +const SettingModel: SettingModelType = { + namespace: 'settings', + state: defaultSettings, + reducers: { + changeSetting(state = defaultSettings, { payload }) { + const { colorWeak, contentWidth } = payload; + + if (state.contentWidth !== contentWidth && window.dispatchEvent) { + window.dispatchEvent(new Event('resize')); + } + updateColorWeak(!!colorWeak); + return { + ...state, + ...payload, + }; + }, + }, +}; +export default SettingModel; diff --git a/src/models/user.ts b/src/models/user.ts new file mode 100644 index 0000000..52072e6 --- /dev/null +++ b/src/models/user.ts @@ -0,0 +1,185 @@ +import { message } from 'antd'; +import { Effect, Subscription } from 'dva'; +import { Reducer } from 'redux'; +import userSettings, { UserSettings } from '@/configs/userSettings'; +import { getPageQuery } from '@/utils/utils'; +import { readUserInfoFromStorage, removeUserInfoFromStorage } from '@/utils/user'; +import { stringify } from 'querystring'; +import { refreshUserByToken } from '@/services/user'; +import { setAuthorizedUserInfo } from '@/utils/authority'; +import { history } from 'umi'; +import { ConnectState } from '@/models/connect'; +import { getLoadedModuleStatus } from '@/utils/metaModules'; +import _ from 'lodash'; +import { metaTranslationOfUserGroups } from '@/constants/translationGroups'; +import { reloadAuthorized } from '@/utils/Authorized'; + +export interface UserModelType { + namespace: 'user'; + state: UserSettings; + effects: { + fetchMeta: Effect; + refreshCurrentUserToken: Effect; + }; + reducers: { + saveCurrentUser: Reducer<UserSettings>; + clearCurrentUser: Reducer<UserSettings>; + setUserRefreshInfo: Reducer<UserSettings>; + initCurrentUser: Reducer<UserSettings>; + }; + subscriptions: { + userInit: Subscription; + }; +} + +const UserModel: UserModelType = { + namespace: 'user', + state: userSettings, + effects: { + *fetchMeta(_, { put, select, all }) { + /* + 1. transPkg + 2. claimInfo + */ + const { requiredLang, currentUser, metaLoadedModule } = yield select( + (state: ConnectState) => ({ + requiredLang: state.meta.viewingLang, + currentUser: state.user.currentUser, + metaLoadedModule: state.meta.loadedModule, + }), + ); + + // do a check first and set a default value + const userId = currentUser && currentUser.id ? currentUser.id : false; + + const transGroups = metaTranslationOfUserGroups; + + const payload = { userId, requiredLang, transGroups }; + + let getActions = getLoadedModuleStatus('user', metaLoadedModule, payload); + + if (getActions) { + let actionArray: any = []; + + _.forEach(getActions, (value: any) => actionArray.push(put(value))); + yield all(actionArray); + } + }, + *refreshCurrentUserToken({ refreshPayload }, { call, put }) { + const response = yield call(refreshUserByToken, { refreshPayload }); + if (response.success) { + yield put({ + type: 'saveCurrentUser', + payload: response.result, + remember: true, + }); + + //æˆåŠŸåˆ™æ¸…ç©ºuserRefreshInfo + yield put({ + type: 'setUserRefreshInfo', + refreshInfo: false, + }); + + message.success(response.message); + } else { + yield put({ + type: 'user/clearCurrentUser', + }); + + history.replace('/user/login'); + + if (response.message) { + message.error(response.message); + } + } + }, + }, + reducers: { + saveCurrentUser(state = userSettings, { payload, remember = false }) { + const { user_id, user_email, user_status, user_auth, token } = payload; + const token_receive_at = new Date().getTime(); //å˜çš„æ—¶å€™è®°å½•当剿—¶é—´ + setAuthorizedUserInfo({ authorizedUserInfo: { ...payload, token_receive_at }, remember }); + + return { + ...state, + currentUser: { + id: user_id, + email: user_email, + auth: user_auth, + status: user_status, + token: token, + tokenReceivedAt: token_receive_at, + }, + }; + }, + clearCurrentUser(state = userSettings) { + removeUserInfoFromStorage(); + return { + ...state, + currentUser: false, + }; + }, + setUserRefreshInfo(state = userSettings, { refreshInfo }) { + return { + ...state, + refreshInfo, + }; + }, + initCurrentUser(state = userSettings, { currentUser }) { + const { user_id, user_email, user_status, user_auth, token, token_receive_at } = currentUser; + reloadAuthorized(); + return { + ...state, + currentUser: { + id: user_id, + email: user_email, + auth: user_auth, + status: user_status, + token: token, + tokenReceivedAt: token_receive_at, + }, + }; + }, + }, + + subscriptions: { + userInit({ + dispatch, + history: { + location: { pathname, search }, + }, + }): any { + console.log(`pathname: ${pathname}` + ' USER model - init - set up user from url params'); + console.log(`search: ${search}`); + + const { register_id, register_token, ...queryParams } = getPageQuery() as { + register_id: string; + register_token: string; + queryParams: any; + }; + + //=============== 处ç†å½“剿ˆ–åˆå§‹åŒ–ç”¨æˆ·ä¿¡æ¯ (local |query) ===============// + + //这里init refreshInfo å’Œ currentUser + //这一项从localStorageé‡Œå– æ£€æŸ¥æ˜¯ä¸æ˜¯éœ€è¦refresh + + const userInfo = readUserInfoFromStorage(); + //å–到localStorage 或者 sessionStorageçš„ userInfo + if (userInfo && userInfo.user_id && userInfo.token) { + dispatch({ + type: 'initCurrentUser', + currentUser: userInfo, + }); + } + + //=============== 处ç†å½“å‰ç”¨æˆ·ä¿¡æ¯ (local |query) - End ===============// + + history.replace({ + pathname: pathname === '/' ? '/od' : pathname, + search: stringify({ ...queryParams } as any), + }); + }, + }, +}; + +export default UserModel; diff --git a/src/pages/403.tsx b/src/pages/403.tsx new file mode 100644 index 0000000..7cd5696 --- /dev/null +++ b/src/pages/403.tsx @@ -0,0 +1,50 @@ +import { Button, Result } from 'antd'; +import React, { useEffect, useState } from 'react'; +import { message } from 'antd'; +import { getMapStateToProps } from '@/utils/utils'; +import { connect } from 'dva'; + +const LoaAuthPage: React.FC<any> = (props: any) => { + const { + dispatch, + helper: { tx }, + user: { currentUser }, + } = props; + + // useEffect(() => { + // dispatch({ + // type: 'meta/setLoadedModule', + // reload: 'all', + // }); + // dispatch({ + // type: 'od/setLoadedModule', + // reload: 'all', + // }); + // }, []); + + const reLogin = () => { + if (currentUser && currentUser.id) { + dispatch({ + type: 'user/clearCurrentUserToken', + }); + message.success(tx('Login.already_logged_out')); + } + + window.location.replace('/user/login'); + }; + + return ( + <Result + status="403" + title="403" + subTitle={'you do not have enough authority.'} + extra={ + <Button type="primary" onClick={reLogin}> + Please login + </Button> + } + ></Result> + ); +}; + +export default connect(getMapStateToProps(['meta', 'user', 'od']))(LoaAuthPage); diff --git a/src/pages/404.tsx b/src/pages/404.tsx new file mode 100644 index 0000000..fd4f08b --- /dev/null +++ b/src/pages/404.tsx @@ -0,0 +1,24 @@ +import { Button, Result } from 'antd'; +import React from 'react'; +import { history } from 'umi'; + +const NoFoundPage: React.FC<any> = () => { + const reDirect = () => { + window.location.replace('/'); + }; + + return ( + <Result + status="404" + title="404" + subTitle="Sorry, the page you visited does not exist." + extra={ + <Button type="primary" onClick={reDirect}> + Back Home + </Button> + } + /> + ); +}; + +export default NoFoundPage; diff --git a/src/pages/500.tsx b/src/pages/500.tsx new file mode 100644 index 0000000..d32b5de --- /dev/null +++ b/src/pages/500.tsx @@ -0,0 +1,42 @@ +import { Button, Result } from 'antd'; +import React, { useEffect, useState } from 'react'; +import { message } from 'antd'; +import { getMapStateToProps } from '@/utils/utils'; +import { connect } from 'dva'; + +const InternalSeverErrorPage: React.FC<any> = (props: any) => { + const { + dispatch, + helper: { tx }, + } = props; + + useEffect(() => { + dispatch({ + type: 'meta/setLoadedModule', + reload: 'all', + }); + dispatch({ + type: 'od/setLoadedModule', + reload: 'all', + }); + }, []); + + const reDirect = () => { + window.location.replace('/od'); + }; + + return ( + <Result + status="500" + title="500" + subTitle={tx('Login.sorry_the_server_is_wrong')} + extra={ + <Button type="primary" onClick={reDirect}> + {tx('Login.back_home')} + </Button> + } + ></Result> + ); +}; + +export default connect(getMapStateToProps(['meta', 'user', 'od']))(InternalSeverErrorPage); diff --git a/src/pages/Admin.tsx b/src/pages/Admin.tsx new file mode 100644 index 0000000..7270ec7 --- /dev/null +++ b/src/pages/Admin.tsx @@ -0,0 +1,43 @@ +import React from 'react'; +import { HeartTwoTone, SmileTwoTone } from '@ant-design/icons'; +import { Card, Typography, Alert } from 'antd'; +import { PageHeaderWrapper } from '@ant-design/pro-layout'; +import { useIntl } from 'umi'; + +export default (): React.ReactNode => { + const intl = useIntl(); + return ( + <PageHeaderWrapper + content={intl.formatMessage({ + id: 'pages.admin.subPage.title', + defaultMessage: ' 这个页é¢åªæœ‰ admin æƒé™æ‰èƒ½æŸ¥çœ‹', + })} + > + <Card> + <Alert + message={intl.formatMessage({ + id: 'pages.welcome.alertMessage', + defaultMessage: '更快更强的é‡åž‹ç»„件,已ç»å‘布。', + })} + type="success" + showIcon + banner + style={{ + margin: -12, + marginBottom: 48, + }} + /> + <Typography.Title level={2} style={{ textAlign: 'center' }}> + <SmileTwoTone /> Ant Design Pro <HeartTwoTone twoToneColor="#eb2f96" /> You + </Typography.Title> + </Card> + <p style={{ textAlign: 'center', marginTop: 24 }}> + Want to add more pages? Please refer to{' '} + <a href="https://pro.ant.design/docs/block-cn" target="_blank" rel="noopener noreferrer"> + use block + </a> + 。 + </p> + </PageHeaderWrapper> + ); +}; diff --git a/src/pages/Welcome.less b/src/pages/Welcome.less new file mode 100644 index 0000000..914c40d --- /dev/null +++ b/src/pages/Welcome.less @@ -0,0 +1,8 @@ +@import '~antd/lib/style/themes/default.less'; + +.pre { + margin: 12px 0; + padding: 12px 20px; + background: @input-bg; + box-shadow: @card-shadow; +} diff --git a/src/pages/Welcome.tsx b/src/pages/Welcome.tsx new file mode 100644 index 0000000..0c640e9 --- /dev/null +++ b/src/pages/Welcome.tsx @@ -0,0 +1,63 @@ +import React from 'react'; +import { PageContainer } from '@ant-design/pro-layout'; +import { Card, Alert, Typography } from 'antd'; +import { useIntl, FormattedMessage } from 'umi'; +import styles from './Welcome.less'; + +const CodePreview: React.FC<{}> = ({ children }) => ( + <pre className={styles.pre}> + <code> + <Typography.Text copyable>{children}</Typography.Text> + </code> + </pre> +); + +export default (): React.ReactNode => { + const intl = useIntl(); + return ( + <PageContainer> + <Card> + <Alert + message={intl.formatMessage({ + id: 'pages.welcome.alertMessage', + defaultMessage: '更快更强的é‡åž‹ç»„件,已ç»å‘布。', + })} + type="success" + showIcon + banner + style={{ + margin: -12, + marginBottom: 24, + }} + /> + <Typography.Text strong> + <FormattedMessage id="pages.welcome.advancedComponent" defaultMessage="é«˜çº§è¡¨æ ¼" />{' '} + <a + href="https://procomponents.ant.design/components/table" + rel="noopener noreferrer" + target="__blank" + > + <FormattedMessage id="pages.welcome.link" defaultMessage="欢迎使用" /> + </a> + </Typography.Text> + <CodePreview>yarn add @ant-design/pro-table</CodePreview> + <Typography.Text + strong + style={{ + marginBottom: 12, + }} + > + <FormattedMessage id="pages.welcome.advancedLayout" defaultMessage="高级布局" />{' '} + <a + href="https://procomponents.ant.design/components/layout" + rel="noopener noreferrer" + target="__blank" + > + <FormattedMessage id="pages.welcome.link" defaultMessage="欢迎使用" /> + </a> + </Typography.Text> + <CodePreview>yarn add @ant-design/pro-layout</CodePreview> + </Card> + </PageContainer> + ); +}; diff --git a/src/pages/document.ejs b/src/pages/document.ejs new file mode 100644 index 0000000..e42657a --- /dev/null +++ b/src/pages/document.ejs @@ -0,0 +1,213 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge" /> + <meta + name="keywords" + content="antd,umi,umijs,ant design,脚手架,布局, Ant Design,项目,Pro,admin,控制å°,主页,开箱å³ç”¨,ä¸åŽå°,解决方案,组件库" + /> + <meta + name="description" + content=" + An out-of-box UI solution for enterprise applications as a React boilerplate." + /> + <meta + name="description" + content=" + 开箱å³ç”¨çš„ä¸å°å‰ç«¯/设计解决方案。" + /> + <meta + name="viewport" + content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" + /> + <title>Ant Design Pro</title> + <link rel="icon" href="<%= context.config.publicPath +'favicon.ico'%>" type="image/x-icon" /> + </head> + <body> + <noscript>Out-of-the-box mid-stage front/design solution!</noscript> + <div id="root"> + <style> + html, + body, + #root { + height: 100%; + margin: 0; + padding: 0; + } + #root { + background-image: url('<%= context.config.publicPath +"home_bg.png"%>'); + background-repeat: no-repeat; + background-size: 100% auto; + } + .page-loading-warp { + display: flex; + align-items: center; + justify-content: center; + padding: 98px; + } + .ant-spin { + position: absolute; + display: none; + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + color: rgba(0, 0, 0, 0.65); + color: #1890ff; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + text-align: center; + list-style: none; + opacity: 0; + -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + transition: -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86), + -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + -webkit-font-feature-settings: 'tnum'; + font-feature-settings: 'tnum'; + } + + .ant-spin-spinning { + position: static; + display: inline-block; + opacity: 1; + } + + .ant-spin-dot { + position: relative; + display: inline-block; + width: 20px; + height: 20px; + font-size: 20px; + } + + .ant-spin-dot-item { + position: absolute; + display: block; + width: 9px; + height: 9px; + background-color: #1890ff; + border-radius: 100%; + -webkit-transform: scale(0.75); + -ms-transform: scale(0.75); + transform: scale(0.75); + -webkit-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; + opacity: 0.3; + -webkit-animation: antspinmove 1s infinite linear alternate; + animation: antSpinMove 1s infinite linear alternate; + } + + .ant-spin-dot-item:nth-child(1) { + top: 0; + left: 0; + } + + .ant-spin-dot-item:nth-child(2) { + top: 0; + right: 0; + -webkit-animation-delay: 0.4s; + animation-delay: 0.4s; + } + + .ant-spin-dot-item:nth-child(3) { + right: 0; + bottom: 0; + -webkit-animation-delay: 0.8s; + animation-delay: 0.8s; + } + + .ant-spin-dot-item:nth-child(4) { + bottom: 0; + left: 0; + -webkit-animation-delay: 1.2s; + animation-delay: 1.2s; + } + + .ant-spin-dot-spin { + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + -webkit-animation: antrotate 1.2s infinite linear; + animation: antRotate 1.2s infinite linear; + } + + .ant-spin-lg .ant-spin-dot { + width: 32px; + height: 32px; + font-size: 32px; + } + + .ant-spin-lg .ant-spin-dot i { + width: 14px; + height: 14px; + } + + @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) { + .ant-spin-blur { + background: #fff; + opacity: 0.5; + } + } + + @-webkit-keyframes antSpinMove { + to { + opacity: 1; + } + } + + @keyframes antSpinMove { + to { + opacity: 1; + } + } + + @-webkit-keyframes antRotate { + to { + -webkit-transform: rotate(405deg); + transform: rotate(405deg); + } + } + + @keyframes antRotate { + to { + -webkit-transform: rotate(405deg); + transform: rotate(405deg); + } + } + </style> + <div + style=" + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100%; + min-height: 420px; + " + > + <img src="<%= context.config.publicPath +'pro_icon.svg'%>" alt="logo" width="256" /> + <div class="page-loading-warp"> + <div class="ant-spin ant-spin-lg ant-spin-spinning"> + <span class="ant-spin-dot ant-spin-dot-spin" + ><i class="ant-spin-dot-item"></i><i class="ant-spin-dot-item"></i + ><i class="ant-spin-dot-item"></i><i class="ant-spin-dot-item"></i + ></span> + </div> + </div> + <div style="display: flex; align-items: center; justify-content: center"> + <img + src="https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg" + width="32" + style="margin-right: 8px" + /> + Ant Design + </div> + </div> + </div> + </body> +</html> diff --git a/src/pages/index.less b/src/pages/index.less deleted file mode 100644 index 586302b..0000000 --- a/src/pages/index.less +++ /dev/null @@ -1,3 +0,0 @@ -.title { - background: rgb(121, 242, 157); -} diff --git a/src/pages/index.tsx b/src/pages/index.tsx deleted file mode 100644 index 9171ffc..0000000 --- a/src/pages/index.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import styles from './index.less'; - -export default () => { - return ( - <div> - <h1 className={styles.title}>Page index</h1> - </div> - ); -} diff --git a/src/pages/od/dashboard/config.ts b/src/pages/od/dashboard/config.ts new file mode 100644 index 0000000..987dac7 --- /dev/null +++ b/src/pages/od/dashboard/config.ts @@ -0,0 +1 @@ +export const spaceName = 'odDashboard'; diff --git a/src/pages/od/dashboard/index.less b/src/pages/od/dashboard/index.less new file mode 100644 index 0000000..e2f84e6 --- /dev/null +++ b/src/pages/od/dashboard/index.less @@ -0,0 +1,3 @@ +.container { + padding: 15px; +} diff --git a/src/pages/od/dashboard/index.tsx b/src/pages/od/dashboard/index.tsx new file mode 100644 index 0000000..752d4f7 --- /dev/null +++ b/src/pages/od/dashboard/index.tsx @@ -0,0 +1,31 @@ +import React, { useState, useEffect } from 'react'; +import { Avatar, Row, Col } from 'antd'; +import { connect } from 'dva'; +import styles from './index.less'; +import { getMapStateToProps } from '@/utils/utils'; +import _ from 'lodash'; +import { spaceName } from './config'; + +const Index: React.FC<any> = (props: any) => { + const { + loading, + dispatch, + od: { odModuleLoaded }, + } = props; + + // useEffect(() => { + // if (!odModuleLoaded[spaceName]) { + // dispatch({ + // type: `${spaceName}/fetchMeta`, + // }); + // } + // }, []); + + // if (!odModuleLoaded[spaceName]) { + // return <PageLoading />; + // } + + return <div className={styles.container}>123</div>; +}; + +export default connect(getMapStateToProps(['meta', 'od', 'loading']))(Index); diff --git a/src/pages/user/login/components/LoginForm.tsx b/src/pages/user/login/components/LoginForm.tsx new file mode 100644 index 0000000..1a39b21 --- /dev/null +++ b/src/pages/user/login/components/LoginForm.tsx @@ -0,0 +1,85 @@ +import { Alert, Checkbox, Button, Form, Input } from 'antd'; +// import { FormattedMessage, formatMessage } from 'umi-plugin-react/locale'; +import React, { useState } from 'react'; + +import { Dispatch, AnyAction } from 'redux'; +import { history, Link } from 'umi'; +import { connect } from 'dva'; +import styles from './style.less'; +import { getMapStateToProps } from '@/utils/utils'; +import { PageLoading } from '@ant-design/pro-layout'; +import { UserOutlined, LockOutlined } from '@ant-design/icons'; +import { spaceName } from '../config'; + +const LoginForm: React.FC<any> = (props: any) => { + const { + helper: { tx }, + loading, + dispatch, + } = props; + + const submitting = loading.effects[`${spaceName}/submit`]; + + const onFinish = (values: any) => { + console.log('Received values of form: ', values); + dispatch({ + type: `${spaceName}/submit`, + payload: values, + }); + }; + + return ( + <div className={styles.loginForm}> + <Form + name="normal_login" + className="login-form" + initialValues={{ remember: true }} + onFinish={onFinish} + > + <Form.Item + name="username" + rules={[{ required: true, message: 'Please input your Username!' }]} + > + <Input + prefix={<UserOutlined className="site-form-item-icon" />} + placeholder="guest / admin / superAdmin" + /> + </Form.Item> + + <Form.Item + name="password" + rules={[{ required: true, message: 'Please input your Password!' }]} + > + <Input + prefix={<LockOutlined className="site-form-item-icon" />} + type="password" + placeholder="ant.design" + /> + </Form.Item> + + <Form.Item> + <Form.Item name="remember" valuePropName="checked" noStyle> + <Checkbox>Remember me</Checkbox> + </Form.Item> + + <Link to="/user/forget-password">Forgot password</Link> + </Form.Item> + + <Form.Item> + <Button + type="primary" + htmlType="submit" + className="login-form-button" + disabled={submitting} + loading={submitting} + block + > + Log in + </Button> + </Form.Item> + </Form> + </div> + ); +}; + +export default connect(getMapStateToProps(['userLogin', 'loading', 'user', 'meta']))(LoginForm); diff --git a/src/pages/user/login/components/LoginTitle.tsx b/src/pages/user/login/components/LoginTitle.tsx new file mode 100644 index 0000000..c222aff --- /dev/null +++ b/src/pages/user/login/components/LoginTitle.tsx @@ -0,0 +1,18 @@ +import React from 'react'; +import { connect } from 'dva'; +import styles from './style.less'; +import { getMapStateToProps } from '@/utils/utils'; + +const LoginTitle: React.FC<any> = (props: any) => { + const { + helper: { tx }, + } = props; + + return ( + <div className={styles.subtitle}> + <div>{tx('Login.login')}</div> + </div> + ); +}; + +export default connect(getMapStateToProps([]))(LoginTitle); diff --git a/src/pages/user/login/components/style.less b/src/pages/user/login/components/style.less new file mode 100644 index 0000000..0dbc2ea --- /dev/null +++ b/src/pages/user/login/components/style.less @@ -0,0 +1,13 @@ +@import '~antd/es/style/themes/default.less'; + +.subtitle { + display: flex; + align-items: center; + justify-content: center; + color: @primary-color; + font-size: 40px; +} + +.loginForm { + margin-top: 10px; +} diff --git a/src/pages/user/login/config.ts b/src/pages/user/login/config.ts new file mode 100644 index 0000000..e36c29e --- /dev/null +++ b/src/pages/user/login/config.ts @@ -0,0 +1,5 @@ +export interface LoginSettings {} + +export default {} as LoginSettings; + +export const spaceName = 'userLogin'; diff --git a/src/pages/user/login/index.less b/src/pages/user/login/index.less new file mode 100644 index 0000000..7e76302 --- /dev/null +++ b/src/pages/user/login/index.less @@ -0,0 +1,9 @@ +@import '~antd/es/style/themes/default.less'; + +.main { + width: 370px; + margin: 0 auto; + @media screen and (max-width: @screen-sm) { + width: 95%; + } +} diff --git a/src/pages/user/login/index.tsx b/src/pages/user/login/index.tsx new file mode 100644 index 0000000..d7f4cb4 --- /dev/null +++ b/src/pages/user/login/index.tsx @@ -0,0 +1,43 @@ +import React, { Component, useState, useEffect } from 'react'; +import { connect } from 'dva'; +import styles from './index.less'; +import { getMapStateToProps } from '@/utils/utils'; +import { Alert, Checkbox, message } from 'antd'; +import PageLoading from '@/components/PageLoading'; +import LoginTitle from './components/LoginTitle'; +import LoginForm from './components/LoginForm'; + +import { Redirect, history } from 'umi'; + +const Login: React.FC<any> = (props: any) => { + const { + dispatch, + user: { currentUser }, + helper: { tx }, + location, + } = props; + + useEffect(() => { + //跳转过æ¥çš„ + if (location.state && location.state.needLogin) { + console.log('received location login state: ' + location.state.needLogin); + history.replace({ pathname: '/user/login', state: null }); + message.error(tx('Global.please_login_first')); + } + + //如果已ç»ç™»å½• ä¸èƒ½å†login + if (currentUser && currentUser.id) { + message.error(tx('Global.already_logged_in_log_out_first')); + history.replace('/od'); + } + }, []); + + return ( + <div className={styles.main}> + <LoginTitle /> + <LoginForm /> + </div> + ); +}; + +export default connect(getMapStateToProps(['meta', 'login', 'loading', 'user']))(Login); diff --git a/src/pages/user/login/model.ts b/src/pages/user/login/model.ts new file mode 100644 index 0000000..c688c1c --- /dev/null +++ b/src/pages/user/login/model.ts @@ -0,0 +1,64 @@ +import { message } from 'antd'; +import { Reducer } from 'redux'; +import { Effect } from 'dva'; +import { history } from 'umi'; +import { ConnectState } from '@/models/connect'; + +import { postUserLogin } from './services'; + +import loginSettings, { LoginSettings, spaceName } from './config'; + +export interface LoginModelType { + namespace: string; + state: LoginSettings; + effects: { + submit: Effect; + }; + reducers: {}; +} + +const Model: LoginModelType = { + namespace: spaceName, + state: { + status: loginSettings, + }, + effects: { + *submit({ payload, loginRedirect }, { call, put, select }) { + const response = yield call(postUserLogin, payload); + if (response.success) { + yield put({ + type: 'user/saveCurrentUser', + payload: response.result, + remember: payload.remember ? true : false, //如果是rememberçš„è¯ + }); + + //这里把currentUserDetails资æºç½®ç©º åŽé¢æŒ‰éœ€åŠ è½½ + yield put({ + type: 'meta/setLoadedModule', + key: 'currentUserDetails', + value: false, + }); + + //èµ°é‡å®šå‘ + if (loginRedirect) { + yield put({ + type: 'meta/setLoginRedirect', + loginRedirect: false, + }); + history.push(loginRedirect); + } else { + history.push('/od'); + } + + //æç¤ºæˆåŠŸ + message.success(response.message); + } else { + message.error(response.message); + } + }, + }, + + reducers: {}, +}; + +export default Model; diff --git a/src/pages/user/login/services.ts b/src/pages/user/login/services.ts new file mode 100644 index 0000000..5d52a0a --- /dev/null +++ b/src/pages/user/login/services.ts @@ -0,0 +1,12 @@ +import request from '@/utils/request'; + +export async function postUserLogin(params: any) { + return request('/api/login', { + method: 'POST', + headers: { bearLang: 'view' }, + data: { + ...params, + login_type: 'popsup', + }, + }); +} diff --git a/src/service-worker.js b/src/service-worker.js new file mode 100644 index 0000000..03b3d51 --- /dev/null +++ b/src/service-worker.js @@ -0,0 +1,70 @@ +/* eslint-disable eslint-comments/disable-enable-pair */ +/* eslint-disable no-restricted-globals */ +/* eslint-disable no-underscore-dangle */ +/* globals workbox */ +workbox.core.setCacheNameDetails({ + prefix: 'antd-pro', + suffix: 'v1', +}); +// Control all opened tabs ASAP +workbox.clientsClaim(); + +/** + * Use precaching list generated by workbox in build process. + * https://developers.google.com/web/tools/workbox/reference-docs/latest/workbox.precaching + */ +workbox.precaching.precacheAndRoute(self.__precacheManifest || []); + +/** + * Register a navigation route. + * https://developers.google.com/web/tools/workbox/modules/workbox-routing#how_to_register_a_navigation_route + */ +workbox.routing.registerNavigationRoute('/index.html'); + +/** + * Use runtime cache: + * https://developers.google.com/web/tools/workbox/reference-docs/latest/workbox.routing#.registerRoute + * + * Workbox provides all common caching strategies including CacheFirst, NetworkFirst etc. + * https://developers.google.com/web/tools/workbox/reference-docs/latest/workbox.strategies + */ + +/** + * Handle API requests + */ +workbox.routing.registerRoute(/\/api\//, workbox.strategies.networkFirst()); + +/** + * Handle third party requests + */ +workbox.routing.registerRoute( + /^https:\/\/gw\.alipayobjects\.com\//, + workbox.strategies.networkFirst(), +); +workbox.routing.registerRoute( + /^https:\/\/cdnjs\.cloudflare\.com\//, + workbox.strategies.networkFirst(), +); +workbox.routing.registerRoute(/\/color.less/, workbox.strategies.networkFirst()); + +/** + * Response to client after skipping waiting with MessageChannel + */ +addEventListener('message', (event) => { + const replyPort = event.ports[0]; + const message = event.data; + if (replyPort && message && message.type === 'skip-waiting') { + event.waitUntil( + self.skipWaiting().then( + () => + replyPort.postMessage({ + error: null, + }), + (error) => + replyPort.postMessage({ + error, + }), + ), + ); + } +}); diff --git a/src/services/ca.ts b/src/services/ca.ts new file mode 100644 index 0000000..6db4945 --- /dev/null +++ b/src/services/ca.ts @@ -0,0 +1,9 @@ +import request from '@/utils/request'; +import queryString from 'query-string'; + +export async function getCaConfigs(params: any): Promise<any> { + return request(`/api/business/setting`, { + method: 'GET', + headers: { bearLang: 'view', bearId: 'caId' }, + }); +} diff --git a/src/services/meta.ts b/src/services/meta.ts new file mode 100644 index 0000000..f5a33a7 --- /dev/null +++ b/src/services/meta.ts @@ -0,0 +1,25 @@ +import request from '@/utils/request'; +import queryString from 'query-string'; + +export async function getTranslations(params: any): Promise<any> { + const { transGroups } = params; + return request('/api/translations', { + method: 'GET', + headers: { bearLang: 'view' }, + params: { groups: transGroups }, + paramsSerializer: (params) => { + const serealizedString = params['groups'] + ? queryString.stringify(params as any, { arrayFormat: 'index' }) + : queryString.stringify(params as any); + return serealizedString; + }, + }); +} + +export async function getCurrentUserdetails(params: any) { + const { userId } = params; + return request(`/api/user/${userId}?expand=business`, { + method: 'GET', + headers: { bearLang: 'view', bearToken: 'auth' }, + }); +} diff --git a/src/services/od.ts b/src/services/od.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/services/user.ts b/src/services/user.ts new file mode 100644 index 0000000..6f7ae0b --- /dev/null +++ b/src/services/user.ts @@ -0,0 +1,16 @@ +import request from '@/utils/request'; +import queryString from 'query-string'; + +export async function refreshUserByToken(params: any) { + const { + refreshPayload: { userId, refreshToken }, + } = params; + return request('/api/refresh_token', { + method: 'POST', + headers: { bearLang: 'view' }, + data: { + user_id: userId, + refresh_token: refreshToken, + }, + }); +} diff --git a/src/typings.d.ts b/src/typings.d.ts new file mode 100644 index 0000000..eb1d955 --- /dev/null +++ b/src/typings.d.ts @@ -0,0 +1,38 @@ +declare module 'slash2'; +declare module '*.css'; +declare module '*.less'; +declare module '*.scss'; +declare module '*.sass'; +declare module '*.svg'; +declare module '*.png'; +declare module '*.jpg'; +declare module '*.jpeg'; +declare module '*.gif'; +declare module '*.bmp'; +declare module '*.tiff'; +declare module 'omit.js'; + +// google analytics interface +interface GAFieldsObject { + eventCategory: string; + eventAction: string; + eventLabel?: string; + eventValue?: number; + nonInteraction?: boolean; +} +interface Window { + ga: ( + command: 'send', + hitType: 'event' | 'pageview', + fieldsObject: GAFieldsObject | string, + ) => void; + reloadAuthorized: () => void; +} + +declare let ga: Function; + +// preview.pro.ant.design only do not use in your production ; +// preview.pro.ant.design 专用环境å˜é‡ï¼Œè¯·ä¸è¦åœ¨ä½ 的项目ä¸ä½¿ç”¨å®ƒã€‚ +declare let ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION: 'site' | undefined; + +declare const REACT_APP_ENV: 'test' | 'dev' | 'pre' | false; diff --git a/src/utils/Authorized.ts b/src/utils/Authorized.ts new file mode 100644 index 0000000..96baa83 --- /dev/null +++ b/src/utils/Authorized.ts @@ -0,0 +1,19 @@ +import RenderAuthorize from '@/components/Authorized'; +import { getAuthorizedUserInfo } from './authority'; +/* eslint-disable eslint-comments/disable-enable-pair */ +/* eslint-disable import/no-mutable-exports */ +let Authorized = RenderAuthorize(getAuthorizedUserInfo()); + +// Reload the rights component +const reloadAuthorized = (): void => { + Authorized = RenderAuthorize(getAuthorizedUserInfo()); +}; + +/** + * hard code + * block need it。 + */ +window.reloadAuthorized = reloadAuthorized; + +export { reloadAuthorized }; +export default Authorized; diff --git a/src/utils/authority.ts b/src/utils/authority.ts new file mode 100644 index 0000000..582672f --- /dev/null +++ b/src/utils/authority.ts @@ -0,0 +1,67 @@ +import { reloadAuthorized } from './Authorized'; +import defaultSettings from '../../config/defaultSettings'; + +const projectKey = defaultSettings.projectKey; + +// use localStorage to store the authority info, which might be sent from server in actual project. +export function getAuthorizedUserInfo(): string | string[] { + let authorityString; + let authority; + + const localStoredUserAuth = + localStorage && + localStorage.getItem(`${projectKey}-authorized-user-info`) && + JSON.parse(localStorage.getItem(`${projectKey}-authorized-user-info`) as string).user_auth + ? JSON.parse(localStorage.getItem(`${projectKey}-authorized-user-info`) as string).user_auth + : false; + + const sessionStoredUserAuth = + sessionStorage && + sessionStorage.getItem(`${projectKey}-authorized-user-info`) && + JSON.parse(sessionStorage.getItem(`${projectKey}-authorized-user-info`) as string).user_auth + ? JSON.parse(sessionStorage.getItem(`${projectKey}-authorized-user-info`) as string).user_auth + : false; + + //session å’Œlocal都查一é 如果都没有å†è¿”回空 + if (localStoredUserAuth) { + authorityString = localStoredUserAuth; + } else if (sessionStoredUserAuth) { + authorityString = sessionStoredUserAuth; + } else { + authorityString = ''; + } + + try { + if (authorityString) { + authority = JSON.parse(authorityString); + } + } catch (e) { + authority = authorityString; + } + if (typeof authority === 'string') { + return [authority]; + } + + return authority; +} + +export function setAuthorizedUserInfo(payload: any): void { + const { remember, authorizedUserInfo } = payload; + + if (localStorage && sessionStorage) { + if (remember) { + localStorage.setItem( + `${projectKey}-authorized-user-info`, + JSON.stringify(authorizedUserInfo), + ); + } else { + sessionStorage.setItem( + `${projectKey}-authorized-user-info`, + JSON.stringify(authorizedUserInfo), + ); + } + } + + // auto reload + reloadAuthorized(); +} diff --git a/src/utils/caModules.ts b/src/utils/caModules.ts new file mode 100644 index 0000000..cdc1c7e --- /dev/null +++ b/src/utils/caModules.ts @@ -0,0 +1,169 @@ +import _ from 'lodash'; +import { isAllKeyTrue } from '@/utils/utils'; +import caSettings from '@/configs/caSettings'; + +const allModules = ['caHome']; + +/** + * set loaded ca status + * @param ca.loadedModule + * @param ca.loadedModule + */ + +export const setLoadedModuleStatus = (modules: any) => { + modules.caHome = isAllKeyTrue(modules.api.caHome) ? true : false; + + return modules; +}; + +/** + * + * @param reload trans, business, dish-update + * @param currentLoadedModule current odModuleLoaded model + * + */ +export const reloadModuleStatus = (reload: any, currentLoadedModule: any) => { + const blankApi = caSettings.loadedModule; + + if (reload === 'all') { + currentLoadedModule = { + ...currentLoadedModule, + api: blankApi, + }; + return currentLoadedModule; + } + + /* + reload : + caDish: 'caDish-switch', + + caCart: 'caCart-fresh', + + reloadModule: caDish/caMenu/caEvent/caDeal/caCart caDishes/caMenus/caEvents/caDeals/fresh + actionMode: switch clear fresh + + */ + + const actionArray = ['switch', 'clear', 'fresh']; + + const [reloadModule, actionMode] = reload.split('-'); + + if (allModules.includes(reloadModule) && actionArray.includes(actionMode)) { + //switch | clear æŸä¸€é¡¹ 则它的selfè¦é¦–先更改为false + currentLoadedModule = { + ...currentLoadedModule, + api: { + ...currentLoadedModule.api, + [reloadModule]: { ...currentLoadedModule.api[reloadModule], self: false }, + }, + }; + } + //其他情况TBD + + return currentLoadedModule; +}; + +/** + * + * @param moduleKey indicates which module you want to check + * @param caModuleLoaded current caModuleLoaded model + * @param state ConnectState data - object contains meta data + * + * Possible Arguments in "state" + */ + +export const getLoadedModuleStatus = ( + moduleKey: string, + caModuleLoaded: any, + state = false as any, +) => { + const { caId = false } = state; + + const modelsNeedToSendSelfId = ['caDish', 'caMenu', 'caDeal', 'caEvent']; + const modelsNoNeedToSendSelfId = ['caDishes', 'caMenus', 'caDeals', 'caEvents', 'caInfo']; + + const modelsNeedToLoadRecommend = ['caHome']; + const modelsNoNeedToSendCurrentCart = ['caCart']; + + const modelsNoNeedToLoadTagList = ['caDishes', 'caMenu']; + // const modelsNoNeedToLoadOfferingTypeList = ['caMenu']; + const modelsNoNeedToLoadAllMenus = ['caMenu']; + + let actions = []; + + /** + * 先检查哪一个模å—需è¦å–meta + * å¦‚æžœçŠ¶æ€æœºé‡Œçš„值(eg caModuleLoaded.dishe)是 false + * 并且它对应的数æ®ï¼ˆeg id)都å˜åœ¨çš„è¯ åˆ™è°ƒç”¨fetch 去获å–需è¦çš„æ•°æ® + * + * å¦åˆ™éœ€è¦setLoadedModule æ›´æ”¹çŠ¶æ€æœºé‡Œçš„值 + */ + + const capitalizedModuleKey = _.upperFirst(moduleKey); + + //检查有没有load过self, 没有则load + if (modelsNoNeedToSendSelfId.includes(moduleKey) && !caModuleLoaded.api[moduleKey].self) { + actions.push({ + type: 'fetch', + }); + } + + if ( + modelsNeedToSendSelfId.includes(moduleKey) && + viewingId && + !caModuleLoaded.api[moduleKey].self + ) { + actions.push({ + type: 'fetch', + viewingId, + }); + } + + //处ç†caHome + if (modelsNeedToLoadRecommend.includes(moduleKey)) { + _.forEach(caModuleLoaded.api[moduleKey], (loaded: boolean, key: string) => { + if (!loaded) { + actions.push({ + type: `fetch${capitalizedModuleKey}${_.upperFirst(key)}`, //fetchCaHomeRecommendedDishes ... + }); + } + }); + } + + //处ç†caCart + if (modelsNoNeedToSendCurrentCart.includes(moduleKey) && currentCart) { + if (currentCart.cartId && currentCart.cartType && !caModuleLoaded.api[moduleKey].self) { + actions.push({ + type: `fetch${capitalizedModuleKey}Details`, + currentCart, + }); + } else if (currentCart === 'needToCreateIndividalOrder') { + actions.push({ + type: 'ca/createIndividalOrder', + }); + } + } + + if (modelsNoNeedToLoadTagList.includes(moduleKey) && !caModuleLoaded.api.tag.tagList) { + actions.push({ + type: 'ca/fetchTagList', + }); + } + + // if ( + // modelsNoNeedToLoadOfferingTypeList.includes(moduleKey) && + // !caModuleLoaded.api.tag.offeringTypeList + // ) { + // actions.push({ + // type: 'ca/fetchOfferingTypeList', + // }); + // } + + if (modelsNoNeedToLoadAllMenus.includes(moduleKey) && !caModuleLoaded.api.allMenus) { + actions.push({ + type: 'ca/fetchAllMenus', + }); + } + + return actions.length === 0 ? false : actions; +}; diff --git a/src/utils/metaModules.ts b/src/utils/metaModules.ts new file mode 100644 index 0000000..9629667 --- /dev/null +++ b/src/utils/metaModules.ts @@ -0,0 +1,119 @@ +import metaSettings from '@/configs/metaSettings'; + +/** + * set loaded modules status + * @param meta.loadedModule [userDetails, transPkg: {}] + * @param meta.loadedModule [userDetails, transPkg: {}] + */ +export const setLoadedModuleStatus = (modules: any) => { + modules.ca = modules.api.transPkg.ca && modules.api.caConfigs ? true : false; + modules.user = modules.api.userDetails && modules.api.transPkg.user ? true : false; + modules.od = modules.api.userDetails && modules.api.transPkg.od ? true : false; + + return modules; +}; + +export const reloadModuleStatus = (reload: any, currentLoadedModule: any) => { + const blankApi = metaSettings.loadedModule; + + if (reload === 'all') { + //all -- 全都改 + currentLoadedModule = { + ...currentLoadedModule, + api: { + ...blankApi, + }, + }; + } else if (reload === 'view-trans') { + //trans -- 全都改 + currentLoadedModule = { + ...currentLoadedModule, + api: { + ...blankApi, + }, + }; + } else if (reload === 'user-status') { + currentLoadedModule = { + //user -- status 次级ä¾èµ–问题 + ...currentLoadedModule, + api: { + ...currentLoadedModule.api, + userDetails: false, + }, + }; + } + + return currentLoadedModule; +}; + +/** + * + * @param moduleKey indicates which module you want to check + * @param metaModuleLoaded current metaModuleLoaded model + * @param state ConnectState data - object contains meta data + * + * Possible Arguments in "state" + * Landing - claimBasic, userId + * Od - userId + * User - claimBasic + * + * Other (Translation related) + * requiredLange + * transGroups + */ + +export const getLoadedModuleStatus = (moduleKey: string, metaModuleLoaded: any, state: any) => { + const { caId = false, userId = false, requiredLang = false, transGroups = false } = state; + + let actions = []; + + /** + * 先检查哪一个模å—需è¦å–meta + * å¦‚æžœçŠ¶æ€æœºé‡Œçš„值(eg metaModuleLoaded.claimInfo)是 false + * 并且它对应的数æ®ï¼ˆeg claimBasic)都å˜åœ¨çš„è¯ åˆ™è°ƒç”¨fetchClaimInfo 去获å–需è¦çš„æ•°æ® + * + * å¦åˆ™éœ€è¦setLoadedModule æ›´æ”¹çŠ¶æ€æœºé‡Œçš„值 + */ + + if (moduleKey && requiredLang && transGroups && !metaModuleLoaded.api.transPkg[moduleKey]) { + //transé‡Œé¢æ²¡æœ‰load å°±load + //load过了就ä¸ç”¨å†load了 + actions.push({ + type: 'meta/fetchTranslations', + requiredLang, + transGroups, + baseTans: moduleKey, + }); + } + + if (moduleKey === 'ca') { + if (!metaModuleLoaded.api.caConfigs && caId) { + actions.push({ + type: 'fetchCaConfigs', + caId, + }); + } + } + + if (moduleKey === 'od' || moduleKey === 'user') { + if (!metaModuleLoaded.api.userDetails && userId) { + actions.push({ + type: 'meta/fetchCurrentUserDetails', + userId, + }); + } else { + actions.push({ + type: 'meta/setLoadedModule', + key: 'userDetails', + value: true, + }); + // //解决次级ä¾èµ–的问题 + // actions.push({ + // type: 'meta/setLoadedModule', + // key: 'currentEditingBusinessPackages', + // value: true, + // }); + } + } + return actions.length === 0 ? false : actions; +}; diff --git a/src/utils/odModules.ts b/src/utils/odModules.ts new file mode 100644 index 0000000..b719f06 --- /dev/null +++ b/src/utils/odModules.ts @@ -0,0 +1,174 @@ +import _ from 'lodash'; +import { isAllKeyTrue } from '@/utils/utils'; +import odSettings from '@/configs/odSettings'; + +/** + * set loaded modules status + * @param od.loadedModule [transPkg, editDish, ...] + * @param od.loadedModule [transPkg, editDish, ...] + */ +export const setLoadedModuleStatus = (modules: any) => { + modules.odDashboard = isAllKeyTrue(modules.api.odDashboard) ? true : false; + + return modules; +}; + +/** + * + * @param reload trans, business, dish-update + * @param currentLoadedModule current odModuleLoaded model + * + */ +export const reloadModuleStatus = (reload: any, currentLoadedModule: any) => { + const blankApi = odSettings.loadedModule; + + if (reload === 'all') { + //apiå…¨æ¢ + currentLoadedModule = { + ...currentLoadedModule, + api: blankApi, + }; + + return currentLoadedModule; + } + + /* + reload : + odDashboard: 'odDashboard-update' | 'odDashboard-switch', + + reloadModule: odDashboard/odMenu/odEvent/odDeal odDashboard/odMenus/odEvents/odDeals + actionMode: update/switch clear/create + + */ + const allModules = ['odDashboard']; + const actionArray = ['update', 'switch', 'clear', 'create']; + + //TBD 这个地方暂时åªç”¨æœ€ç®€å•的情况 夿‚的情况å†è®¨è®º + const modelsNeedToReloadAllDishesWhenUpdated = ['odDish']; + const modelsNeedToReloadAllDishesWhenCreated = ['odDishes']; + + const modelsNeedToReloadAllMenusWhenUpdated = ['odMenu']; + const modelsNeedToReloadAllMenusWhenCreated = ['odMenus']; + + const modelsNeedToReloadBusinessDetailsWhenUpdated = ['odBusiness']; + + const modelsNeedToReloadListSelivesWhenUpdated = ['odDish', 'odMenu', 'odEvent', 'odDeal']; + + const [reloadModule, actionMode] = reload.split('-'); + + if (allModules.includes(reloadModule) && actionArray.includes(actionMode)) { + //update | switch | clear | create æŸä¸€é¡¹ 则它的selfè¦é¦–先更改为false + currentLoadedModule = { + ...currentLoadedModule, + api: { + ...currentLoadedModule.api, + [reloadModule]: { ...currentLoadedModule.api[reloadModule], self: false }, + }, + }; + } + + //处ç†éœ€è¦reload list selves的情况 + if (actionMode === 'update' && modelsNeedToReloadListSelivesWhenUpdated.includes(reloadModule)) { + const singleToListNameConvert = { + odDish: 'odDishes', + odMenu: 'odMenus', + odEvent: 'odEvents', + odDeal: 'odDeals', + }; + + currentLoadedModule = { + ...currentLoadedModule, + api: { + ...currentLoadedModule.api, + [singleToListNameConvert[reloadModule]]: { + ...currentLoadedModule.api[singleToListNameConvert[reloadModule]], + self: false, + }, + }, + }; + } + + return currentLoadedModule; +}; +/** + * + * @param moduleKey indicates which module you want to check + * @param odModuleLoaded current odModuleLoaded model + * @param state ConnectState data - object contains meta data + * + * Possible Arguments in "state" + * editingId + */ + +export const getLoadedModuleStatus = ( + moduleKey: string, + odModuleLoaded: any, + state: any = false, +) => { + const { editingId = false } = state; + + let actions = []; + + // const singleModelArray = ['odDish', 'odMenu', 'odDeal', 'odEvent', 'business']; + // const listModelArray = ['odDishes', 'odMenus', 'odDeals', 'odEvents']; + + const allModules = ['odDashboard']; + + const modelsNeedToLoadSelfWithId: string[] = ['odDashboard']; + const modelsNeedToLoadSelfWithoutId: string[] = []; + + /** + * 先检查哪一个模å—需è¦å–od-meta + * 它对应的数æ®éƒ½å˜åœ¨çš„è¯ åˆ™è°ƒç”¨fetch 去获å–需è¦çš„æ•°æ® + */ + + //检查有没有load过self, 没有则load + + if (modelsNeedToLoadSelfWithId.includes(moduleKey) && !odModuleLoaded.api[moduleKey].self) { + //ä¸éœ€è¦ç»™ID + actions.push({ + type: 'fetch', + }); + } + + if ( + modelsNeedToLoadSelfWithoutId.includes(moduleKey) && + !odModuleLoaded.api[moduleKey].self && + editingId + ) { + //需è¦ç»™ID + if (!odModuleLoaded.api[moduleKey].self) { + actions.push({ + type: 'fetch', + editingId, + }); + } + } + + return actions.length === 0 ? false : actions; +}; + +/** + * 这个函数在od䏿œ€åŽä»…仅修改fetchMeta reloadModule,ä¸ä¿®æ”¹çŠ¶æ€æœºæœ¬èº« + * + */ +export const getReloadModule = ( + showActioningMessage: boolean, + spaceName: string, + nextMove: 'redirect' | 'stay' | false = false, + payload: string | false = false, +) => { + let action: any = { + type: 'od/setReloadAction', + showActioningMessage, + spaceName, + }; + + if (nextMove === 'redirect') { + action = { ...action, redirectUrl: payload }; + } else if (nextMove === 'stay') { + action = { ...action, reloadType: payload }; + } + + return action; +}; diff --git a/src/utils/request.ts b/src/utils/request.ts new file mode 100644 index 0000000..bc10589 --- /dev/null +++ b/src/utils/request.ts @@ -0,0 +1,185 @@ +import { Dispatch } from 'redux'; +// import { response } from 'express'; +/** + * request 网络请求工具 + * 更详细的 api 文档: https://github.com/umijs/umi-request + */ +import { readUserInfoFromStorage } from '@/utils/user'; +import { notification, message } from 'antd'; +import { history } from 'umi'; +import request, { extend } from 'umi-request'; +import { languageLabel } from '@/constants/languages'; +import { validBusinessIdFormat } from '@/constants/validNumberFormat'; +import _ from 'lodash'; +import defaultSettings from '../../config/defaultSettings'; + +const projectKey = defaultSettings.projectKey; + +const codeMessage = { + 200: 'OK', + 201: 'Created', + 202: 'Accepted', + 204: 'No Content', + 400: 'Bad Request', + 401: 'Unauthorized', + 403: 'Forbidden', + 404: 'Not Found', + 406: 'Variables Not Acceptable', + 410: 'Gone', + 422: 'Unprocessable Entity', + 500: 'Internal Server Error', + 502: 'Bad Gateway', + 503: 'Service Unavailable', + 504: 'Gateway Timeout', + + //personal defined code for successs + 240: 'Returned Failed Validation', + 241: 'Returned Registration Uncompleted', + 242: 'Returned Registration Completed', + 244: 'Business already claimed', + + //personal defined code for successs + 419: 'Page Expired', +}; + +/** + * 处ç†éœ€è¦bear token的请求 + */ +request.interceptors.request.use((url, options: any) => { + let lang: any = false; + let accessToken: any = false; + let bId: any = false; + + let headerJson: any = { + ...options.headers, + }; + + if (options.headers && options.headers.bearLang === 'view') { + lang = + localStorage && + localStorage.getItem(`${projectKey}-view-lang`) && + languageLabel.includes(localStorage.getItem(`${projectKey}-view-lang`) as string) + ? localStorage.getItem(`${projectKey}-view-lang`) + : 'en_AU'; + } else if (options.headers && options.headers.bearLang === 'edit') { + lang = + localStorage && + localStorage.getItem(`${projectKey}-edit-lang`) && + languageLabel.includes(localStorage.getItem(`${projectKey}-edit-lang`) as string) + ? localStorage.getItem(`${projectKey}-edit-lang`) + : 'en_AU'; + } + + if (options.headers && options.headers.bearId === 'bId') { + bId = + sessionStorage && + sessionStorage.getItem(`${projectKey}-od-editing-business-info`) && + JSON.parse(sessionStorage.getItem(`${projectKey}-od-editing-business-info`) as string).b_id + ? JSON.parse(sessionStorage.getItem(`${projectKey}-od-editing-business-info`) as string) + .b_id + : false; + } else if (options.headers && options.headers.bearId === 'caId') { + bId = + localStorage && + localStorage.getItem(`${projectKey}-ca-viewing-id`) && + validBusinessIdFormat.test(localStorage.getItem(`${projectKey}-ca-viewing-id`) as string) + ? localStorage.getItem(`${projectKey}-ca-viewing-id`) + : false; + } + + if (options.headers && options.headers.bearToken === 'auth') { + //从session å’Œ local里é¢åˆ†åˆ«æ‰¾token + const userInfo = readUserInfoFromStorage(); + //å–到localStorage 或者 sessionStorageçš„ userInfo + accessToken = userInfo && userInfo.token.access_token ? userInfo.token.access_token : false; + } + + if (lang) { + headerJson = _.omit({ ...headerJson, lang }, 'bearLang'); + } + if (bId) { + headerJson = _.omit({ ...headerJson, bid: bId }, 'bearId'); + } + if (accessToken) { + headerJson = _.omit({ ...headerJson, Authorization: `Bearer ${accessToken}` }, 'bearToken'); + } + + return { + url: url, + options: { + ...options, + headers: headerJson, + }, + }; +}); + +/** + * 异常处ç†ç¨‹åº (å¤„ç† No/403/404/404/500) + */ +const errorHandler = (error: { response: Response }): Response => { + const { response } = error; + const { status, url } = response; + + if (!response) { + // no response + notification.error({ + message: 'Network Wrong', + description: 'Can not connected to the sever', + }); + + history.push('/404'); + throw error; + } + + if (status === 403 || status === 404 || status === 500) { + //Redirect to certain pages. + notification.error({ + message: `${codeMessage[status]} ${status}: ${url}`, + }); + + history.push(`/${status}`); + throw error; + } + + return response; +}; + +/** + * 处ç†è¿”回对象error 400 + */ +request.interceptors.response.use(async (response, options) => { + const { responseType } = options; + const { status, url } = response; + + if (responseType && responseType !== 'json') { + // type not json, no handle + return response; + } + + if (Number(status.toString()[0]) === 2) { + // 2开头的就表示æˆåŠŸ (200 / 240 在里é¢å¤„ç†) + return response; + } + if (Number(status.toString()[0]) !== 2) { + //䏿˜¯2çš„è¯ æœ‰å¯èƒ½æ˜¯3xx 4xx 5xx è¿™æ ·çš„è¯å°±æ˜¾ç¤ºmessage就行了 + let data = null; + try { + data = await response.clone().json(); + } catch (error) { + console.error(error); + return response; + } + + const errMsg = data.message ? data.message : codeMessage[status]; + message.error(errMsg); + } + + return response; +}); + +const newRequest = extend({ + errorHandler, // é»˜è®¤é”™è¯¯å¤„ç† + credentials: 'include', // 默认请求是å¦å¸¦ä¸Šcookie +}); + +export default newRequest; diff --git a/src/utils/user.ts b/src/utils/user.ts new file mode 100644 index 0000000..36aed51 --- /dev/null +++ b/src/utils/user.ts @@ -0,0 +1,35 @@ +import defaultSettings from '../../config/defaultSettings'; + +export const readUserInfoFromStorage = () => { + let userInfo: any = false; + if (localStorage && localStorage.getItem(`${defaultSettings.projectKey}-authorized-user-info`)) { + userInfo = JSON.parse( + localStorage.getItem(`${defaultSettings.projectKey}-authorized-user-info`) as string, + ); + } //先从localStorage里é¢è¯» + + if (!userInfo) { + //å†ä»ŽsessionStorage里é¢è¯» + if ( + sessionStorage && + sessionStorage.getItem(`${defaultSettings.projectKey}-authorized-user-info`) + ) { + userInfo = JSON.parse( + sessionStorage.getItem(`${defaultSettings.projectKey}-authorized-user-info`) as string, + ); + } + } + return userInfo; +}; + +export const removeUserInfoFromStorage = () => { + if (localStorage && localStorage.getItem(`${defaultSettings.projectKey}-authorized-user-info`)) { + localStorage.removeItem(`${defaultSettings.projectKey}-authorized-user-info`); + } + if ( + sessionStorage && + sessionStorage.getItem(`${defaultSettings.projectKey}-authorized-user-info`) + ) { + sessionStorage.removeItem(`${defaultSettings.projectKey}-authorized-user-info`); + } +}; diff --git a/src/utils/utils.less b/src/utils/utils.less new file mode 100644 index 0000000..e9dfd5c --- /dev/null +++ b/src/utils/utils.less @@ -0,0 +1,16 @@ +// mixins for clearfix +// ------------------------ +.clearfix() { + zoom: 1; + &::before, + &::after { + display: table; + content: ' '; + } + &::after { + clear: both; + height: 0; + font-size: 0; + visibility: hidden; + } +} diff --git a/src/utils/utils.test.ts b/src/utils/utils.test.ts new file mode 100644 index 0000000..c2bb32d --- /dev/null +++ b/src/utils/utils.test.ts @@ -0,0 +1,37 @@ +import { isUrl } from './utils'; + +describe('isUrl tests', (): void => { + it('should return false for invalid and corner case inputs', (): void => { + expect(isUrl([] as any)).toBeFalsy(); + expect(isUrl({} as any)).toBeFalsy(); + expect(isUrl(false as any)).toBeFalsy(); + expect(isUrl(true as any)).toBeFalsy(); + expect(isUrl(NaN as any)).toBeFalsy(); + expect(isUrl(null as any)).toBeFalsy(); + expect(isUrl(undefined as any)).toBeFalsy(); + expect(isUrl('')).toBeFalsy(); + }); + + it('should return false for invalid URLs', (): void => { + expect(isUrl('foo')).toBeFalsy(); + expect(isUrl('bar')).toBeFalsy(); + expect(isUrl('bar/test')).toBeFalsy(); + expect(isUrl('http:/example.com/')).toBeFalsy(); + expect(isUrl('ttp://example.com/')).toBeFalsy(); + }); + + it('should return true for valid URLs', (): void => { + expect(isUrl('http://example.com/')).toBeTruthy(); + expect(isUrl('https://example.com/')).toBeTruthy(); + expect(isUrl('http://example.com/test/123')).toBeTruthy(); + expect(isUrl('https://example.com/test/123')).toBeTruthy(); + expect(isUrl('http://example.com/test/123?foo=bar')).toBeTruthy(); + expect(isUrl('https://example.com/test/123?foo=bar')).toBeTruthy(); + expect(isUrl('http://www.example.com/')).toBeTruthy(); + expect(isUrl('https://www.example.com/')).toBeTruthy(); + expect(isUrl('http://www.example.com/test/123')).toBeTruthy(); + expect(isUrl('https://www.example.com/test/123')).toBeTruthy(); + expect(isUrl('http://www.example.com/test/123?foo=bar')).toBeTruthy(); + expect(isUrl('https://www.example.com/test/123?foo=bar')).toBeTruthy(); + }); +}); diff --git a/src/utils/utils.ts b/src/utils/utils.ts new file mode 100644 index 0000000..cc2ec83 --- /dev/null +++ b/src/utils/utils.ts @@ -0,0 +1,149 @@ +import { parse } from 'querystring'; +import { ConnectState } from '@/models/connect'; +import _ from 'lodash'; + +/* eslint no-useless-escape:0 import/prefer-default-export:0 */ +const reg = /(((^https?:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)$/; + +export const isUrl = (path: string): boolean => reg.test(path); + +export const isAntDesignPro = (): boolean => { + if (ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION === 'site') { + return true; + } + return window.location.hostname === 'preview.pro.ant.design'; +}; + +// 给官方演示站点用,用于关é—真实开å‘环境ä¸éœ€è¦ä½¿ç”¨çš„特性 +export const isAntDesignProOrDev = (): boolean => { + const { NODE_ENV } = process.env; + if (NODE_ENV === 'development') { + return true; + } + return isAntDesignPro(); +}; + +export const getPageQuery = () => parse(window.location.href.split('?')[1]); + +export const getMapStateToProps = (args: string[]) => { + const mapStateToProps = (state: ConnectState) => { + /** + * Translation function + * @param label + * @returns {*} + */ + const tx = (label: string) => { + let ret = label; + const [group, key] = label.split('.'); + if (state.meta.translations.translations && state.meta.translations.translations[group]) { + if (state.meta.translations.translations[group][key]) { + ret = state.meta.translations.translations[group][key]; + } + } + return ret; + }; + + let props = { helper: { tx } } as any; + + args.map((item: string) => { + if (state[item]) { + props[item] = state[item]; + } + }); + + return props; + }; + return mapStateToProps; +}; + +export const convertJsonToCamelCase = (data: any) => { + const toCamel = (x: string) => _.camelCase(x); + + const convert = (item: any) => { + let newData = item instanceof Array ? [] : {}; + _.forEach(item, (value, key) => { + if (value instanceof Array) { + newData[toCamel(key)] = []; + _.forEach(value, (v) => { + if (v instanceof Object) { + newData[toCamel(key)].push(convert(v)); + } else { + newData[toCamel(key)].push(v); + } + }); + } else if (value instanceof Object) { + newData[toCamel(key)] = convert(value); + } else { + newData[toCamel(key)] = value; + } + }); + + return newData as any; + }; + + const convertedData = data instanceof Object ? convert(data) : data; + + return convertedData; +}; + +export const convertCamelCaseToSnakeCase = (data: any) => { + const toCamel = (x: string) => _.snakeCase(x); + + const convert = (item: any) => { + let newData = item instanceof Array ? [] : {}; + _.forEach(item, (value, key) => { + if (value instanceof Array) { + newData[toCamel(key)] = []; + _.forEach(value, (v) => { + if (v instanceof Object) { + newData[toCamel(key)].push(convert(v)); + } else { + newData[toCamel(key)].push(v); + } + }); + } else if (value instanceof Object) { + newData[toCamel(key)] = convert(value); + } else { + newData[toCamel(key)] = value; + } + }); + + return newData as any; + }; + + const convertedData = data instanceof Object ? convert(data) : data; + + return convertedData; +}; + +export const isAllKeyTrue = (data: object) => { + let flag = true; + _.forEach(data, (v, k) => { + if (v !== true) { + flag = false; + } + }); + return flag; +}; + +export const getValueFromMeta = (meta: any, key: any) => { + const result = meta.filter((x: any) => x.key === key)[0]?.value; + + return result; +}; + +export const batchGetValueFromMeta = (meta: any, keysArrayNeedToFetch: string[]) => { + let result = {}; + + const keyValueObjArray = keysArrayNeedToFetch.map((item: any) => { + const value = meta.filter((x: any) => x.key === item)[0]?.value; + result[item] = value; + return { key: item, value }; + }); + + keyValueObjArray.map((x: any) => { + result[x.key] = x.value; + }); + + return result; +}; diff --git a/tests/PuppeteerEnvironment.js b/tests/PuppeteerEnvironment.js new file mode 100644 index 0000000..13409be --- /dev/null +++ b/tests/PuppeteerEnvironment.js @@ -0,0 +1,41 @@ +// eslint-disable-next-line +const NodeEnvironment = require('jest-environment-node'); +const getBrowser = require('./getBrowser'); + +class PuppeteerEnvironment extends NodeEnvironment { + // Jest is not available here, so we have to reverse engineer + // the setTimeout function, see https://github.com/facebook/jest/blob/v23.1.0/packages/jest-runtime/src/index.js#L823 + setTimeout(timeout) { + if (this.global.jasmine) { + // eslint-disable-next-line no-underscore-dangle + this.global.jasmine.DEFAULT_TIMEOUT_INTERVAL = timeout; + } else { + this.global[Symbol.for('TEST_TIMEOUT_SYMBOL')] = timeout; + } + } + + async setup() { + const browser = await getBrowser(); + const page = await browser.newPage(); + this.global.browser = browser; + this.global.page = page; + } + + async teardown() { + const { page, browser } = this.global; + + if (page) { + await page.close(); + } + + if (browser) { + await browser.disconnect(); + } + + if (browser) { + await browser.close(); + } + } +} + +module.exports = PuppeteerEnvironment; diff --git a/tests/beforeTest.js b/tests/beforeTest.js new file mode 100644 index 0000000..9302239 --- /dev/null +++ b/tests/beforeTest.js @@ -0,0 +1,39 @@ +/* eslint-disable global-require */ +/* eslint-disable import/no-extraneous-dependencies */ +const { execSync } = require('child_process'); +const { join } = require('path'); +const findChrome = require('carlo/lib/find_chrome'); +const detectInstaller = require('detect-installer'); + +const installPuppeteer = () => { + // find can use package manger + const packages = detectInstaller(join(__dirname, '../../')); + // get installed package manger + const packageName = packages.find(detectInstaller.hasPackageCommand) || 'npm'; + console.log(`🤖 will use ${packageName} install puppeteer`); + const command = `${packageName} ${packageName.includes('yarn') ? 'add' : 'i'} puppeteer`; + execSync(command, { + stdio: 'inherit', + }); +}; + +const initPuppeteer = async () => { + try { + // eslint-disable-next-line import/no-unresolved + const findChromePath = await findChrome({}); + const { executablePath } = findChromePath; + console.log(`🧲 find you browser in ${executablePath}`); + return; + } catch (error) { + console.log('🧲 no find chrome'); + } + + try { + require.resolve('puppeteer'); + } catch (error) { + // need install puppeteer + await installPuppeteer(); + } +}; + +initPuppeteer(); diff --git a/tests/getBrowser.js b/tests/getBrowser.js new file mode 100644 index 0000000..3b4ef33 --- /dev/null +++ b/tests/getBrowser.js @@ -0,0 +1,45 @@ +/* eslint-disable global-require */ +/* eslint-disable import/no-extraneous-dependencies */ +const findChrome = require('carlo/lib/find_chrome'); + +const getBrowser = async () => { + try { + // eslint-disable-next-line import/no-unresolved + const puppeteer = require('puppeteer'); + const browser = await puppeteer.launch({ + args: [ + '--disable-gpu', + '--disable-dev-shm-usage', + '--no-first-run', + '--no-zygote', + '--no-sandbox', + ], + }); + return browser; + } catch (error) { + // console.log(error) + } + + try { + // eslint-disable-next-line import/no-unresolved + const puppeteer = require('puppeteer-core'); + const findChromePath = await findChrome({}); + const { executablePath } = findChromePath; + const browser = await puppeteer.launch({ + executablePath, + args: [ + '--disable-gpu', + '--disable-dev-shm-usage', + '--no-first-run', + '--no-zygote', + '--no-sandbox', + ], + }); + return browser; + } catch (error) { + console.log('🧲 no find chrome'); + } + throw new Error('no find puppeteer'); +}; + +module.exports = getBrowser; diff --git a/tests/run-tests.js b/tests/run-tests.js new file mode 100644 index 0000000..3aa080d --- /dev/null +++ b/tests/run-tests.js @@ -0,0 +1,52 @@ +/* eslint-disable eslint-comments/disable-enable-pair */ +/* eslint-disable @typescript-eslint/no-var-requires */ +/* eslint-disable eslint-comments/no-unlimited-disable */ +const { spawn } = require('child_process'); +// eslint-disable-next-line import/no-extraneous-dependencies +const { kill } = require('cross-port-killer'); + +const env = Object.create(process.env); +env.BROWSER = 'none'; +env.TEST = true; +env.UMI_UI = 'none'; +env.PROGRESS = 'none'; +// flag to prevent multiple test +let once = false; + +const startServer = spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['start'], { + env, +}); + +startServer.stderr.on('data', (data) => { + // eslint-disable-next-line + console.log(data.toString()); +}); + +startServer.on('exit', () => { + kill(process.env.PORT || 8000); +}); + +console.log('Starting development server for e2e tests...'); +startServer.stdout.on('data', (data) => { + console.log(data.toString()); + // hack code , wait umi + if ( + (!once && data.toString().indexOf('Compiled successfully') >= 0) || + data.toString().indexOf('Theme generated successfully') >= 0 + ) { + // eslint-disable-next-line + once = true; + console.log('Development server is started, ready to run tests.'); + const testCmd = spawn( + /^win/.test(process.platform) ? 'npm.cmd' : 'npm', + ['test', '--', '--maxWorkers=1', '--runInBand'], + { + stdio: 'inherit', + }, + ); + testCmd.on('exit', (code) => { + startServer.kill(); + process.exit(code); + }); + } +}); diff --git a/tsconfig.json b/tsconfig.json index f0c3b93..6d8ba2b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,36 +1,40 @@ { "compilerOptions": { - "target": "esnext", + "outDir": "build/dist", "module": "esnext", - "moduleResolution": "node", - "importHelpers": true, - "jsx": "react", - "esModuleInterop": true, + "target": "esnext", + "lib": ["esnext", "dom"], "sourceMap": true, - "baseUrl": "./", + "baseUrl": ".", + "jsx": "preserve", + "allowSyntheticDefaultImports": true, + "moduleResolution": "node", + "forceConsistentCasingInFileNames": true, + "noImplicitReturns": true, + "suppressImplicitAnyIndexErrors": true, + "noUnusedLocals": true, + "allowJs": true, + "skipLibCheck": true, + "experimentalDecorators": true, "strict": true, "paths": { - "@/*": ["src/*"], - "@@/*": ["src/.umi/*"] - }, - "allowSyntheticDefaultImports": true + "@/*": ["./src/*"], + "@@/*": ["./src/.umi/*"] + } }, "include": [ "mock/**/*", "src/**/*", + "tests/**/*", + "test/**/*", + "__test__/**/*", + "typings/**/*", "config/**/*", - ".umirc.ts", - "typings.d.ts" + ".eslintrc.js", + ".stylelintrc.js", + ".prettierrc.js", + "jest.config.js", + "mock/*" ], - "exclude": [ - "node_modules", - "lib", - "es", - "dist", - "typings", - "**/__test__", - "test", - "docs", - "tests" - ] + "exclude": ["node_modules", "build", "dist", "scripts", "src/.umi/*", "webpack", "jest"] } diff --git a/yarn.lock b/yarn.lock index 565f4f8..e646e1e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -89,6 +89,13 @@ lodash "^4.17.15" resize-observer-polyfill "^1.5.0" +"@babel/code-frame@7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== + dependencies: + "@babel/highlight" "^7.8.3" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.11", "@babel/code-frame@^7.8.3": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" @@ -123,7 +130,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.1.0", "@babel/core@^7.4.5", "@babel/core@^7.7.5": +"@babel/core@>=7.2.2", "@babel/core@>=7.9.0", "@babel/core@^7.1.0", "@babel/core@^7.11.6", "@babel/core@^7.4.5", "@babel/core@^7.7.5": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== @@ -144,7 +151,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.12.1", "@babel/generator@^7.12.10", "@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.4.0": +"@babel/generator@^7.11.6", "@babel/generator@^7.12.1", "@babel/generator@^7.12.10", "@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.4.0": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.11.tgz#98a7df7b8c358c9a37ab07a24056853016aba3af" integrity sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA== @@ -346,7 +353,7 @@ "@babel/traverse" "^7.12.5" "@babel/types" "^7.12.5" -"@babel/highlight@^7.10.4": +"@babel/highlight@^7.10.4", "@babel/highlight@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== @@ -360,7 +367,7 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.5.tgz#b4af32ddd473c0bfa643bd7ff0728b8e71b81ea0" integrity sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ== -"@babel/parser@^7.1.0", "@babel/parser@^7.12.10", "@babel/parser@^7.12.11", "@babel/parser@^7.12.3", "@babel/parser@^7.12.5", "@babel/parser@^7.12.7", "@babel/parser@^7.4.3": +"@babel/parser@^7.1.0", "@babel/parser@^7.11.5", "@babel/parser@^7.12.10", "@babel/parser@^7.12.11", "@babel/parser@^7.12.3", "@babel/parser@^7.12.5", "@babel/parser@^7.12.7", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.11.tgz#9ce3595bcd74bc5c466905e86c535b8b25011e79" integrity sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg== @@ -1189,6 +1196,14 @@ pirates "^4.0.0" source-map-support "^0.5.16" +"@babel/runtime-corejs3@^7.10.2": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.12.5.tgz#ffee91da0eb4c6dae080774e94ba606368e414f4" + integrity sha512-roGr54CsTmNPPzZoCP1AmDXuBoNao7tnSA83TXTwt+UK5QVyh1DIJnrgYRPWKCF2flqZQXwa7Yr8v7VmLzF0YQ== + dependencies: + core-js-pure "^3.0.0" + regenerator-runtime "^0.13.4" + "@babel/runtime@7.12.5", "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.8.4": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" @@ -1220,7 +1235,7 @@ globals "^11.1.0" lodash "^4.17.19" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.10", "@babel/traverse@^7.12.5", "@babel/traverse@^7.4.3": +"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.10", "@babel/traverse@^7.12.5", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0": version "7.12.12" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.12.tgz#d0cd87892704edd8da002d674bc811ce64743376" integrity sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w== @@ -1244,7 +1259,7 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" -"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.12.1", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.12", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0", "@babel/types@^7.4.4": +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.12.1", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.12", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0": version "7.12.12" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.12.tgz#4608a6ec313abbd87afa55004d373ad04a96c299" integrity sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ== @@ -1276,6 +1291,22 @@ resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.3.1.tgz#fa0efcf813daa43f8a6aef3ddaa80f7e66f1278e" integrity sha512-jUJrjU62MUgHDSu5JfONfgRM2V7GfN5KknsygfIbxwRZXGeayIzxk4O9GiYgEAr9DG5HJThTF5+a5x3wtrOKzQ== +"@eslint/eslintrc@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz#d01fc791e2fc33e88a29d6f3dc7e93d0cd784b76" + integrity sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + lodash "^4.17.19" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + "@formatjs/intl-displaynames@^1.2.0": version "1.2.10" resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-1.2.10.tgz#bb9625cca90b099978cd967c6a98aaf4e23fc878" @@ -1316,6 +1347,32 @@ resolved "https://registry.yarnpkg.com/@formatjs/intl-utils/-/intl-utils-2.3.0.tgz#2dc8c57044de0340eb53a7ba602e59abf80dc799" integrity sha512-KWk80UPIzPmUg+P0rKh6TqspRw0G6eux1PuJr+zz47ftMaZ9QDwbGzHZbtzWkl5hgayM/qrKRutllRC7D/vVXQ== +"@fortawesome/fontawesome-common-types@^0.2.32": + version "0.2.32" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.32.tgz#3436795d5684f22742989bfa08f46f50f516f259" + integrity sha512-ux2EDjKMpcdHBVLi/eWZynnPxs0BtFVXJkgHIxXRl+9ZFaHPvYamAfCzeeQFqHRjuJtX90wVnMRaMQAAlctz3w== + +"@fortawesome/fontawesome-svg-core@^1.2.32": + version "1.2.32" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.32.tgz#da092bfc7266aa274be8604de610d7115f9ba6cf" + integrity sha512-XjqyeLCsR/c/usUpdWcOdVtWFVjPbDFBTQkn2fQRrWhhUoxriQohO2RWDxLyUM8XpD+Zzg5xwJ8gqTYGDLeGaQ== + dependencies: + "@fortawesome/fontawesome-common-types" "^0.2.32" + +"@fortawesome/free-solid-svg-icons@^5.15.1": + version "5.15.1" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.1.tgz#e1432676ddd43108b41197fee9f86d910ad458ef" + integrity sha512-EFMuKtzRMNbvjab/SvJBaOOpaqJfdSap/Nl6hst7CgrJxwfORR1drdTV6q1Ib/JVzq4xObdTDcT6sqTaXMqfdg== + dependencies: + "@fortawesome/fontawesome-common-types" "^0.2.32" + +"@fortawesome/react-fontawesome@^0.1.14": + version "0.1.14" + resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.14.tgz#bf28875c3935b69ce2dc620e1060b217a47f64ca" + integrity sha512-4wqNb0gRLVaBm/h+lGe8UfPPivcbuJ6ecI4hIgW0LjI7kzpYB9FkN0L9apbVzg+lsBdcTf0AlBtODjcSX5mmKA== + dependencies: + prop-types "^15.7.2" + "@hapi/address@^2.1.2": version "2.1.4" resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" @@ -1615,6 +1672,21 @@ "@types/yargs" "^15.0.0" chalk "^3.0.0" +"@mdn/browser-compat-data@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@mdn/browser-compat-data/-/browser-compat-data-2.0.7.tgz#72ec37b9c1e00ce0b4e0309d753be18e2da12ee3" + integrity sha512-GeeM827DlzFFidn1eKkMBiqXFD2oLsnZbaiGhByPl0vcapsRzUL+t9hDoov1swc9rB2jw64R+ihtzC8qOE9wXw== + dependencies: + extend "3.0.2" + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + "@nodelib/fs.scandir@2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" @@ -1628,6 +1700,11 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + "@nodelib/fs.walk@^1.2.3": version "1.2.6" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" @@ -1672,6 +1749,21 @@ dependencies: type-detect "4.0.8" +"@stylelint/postcss-css-in-js@^0.37.2": + version "0.37.2" + resolved "https://registry.yarnpkg.com/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz#7e5a84ad181f4234a2480803422a47b8749af3d2" + integrity sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA== + dependencies: + "@babel/core" ">=7.9.0" + +"@stylelint/postcss-markdown@^0.36.2": + version "0.36.2" + resolved "https://registry.yarnpkg.com/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz#0a540c4692f8dcdfc13c8e352c17e7bfee2bb391" + integrity sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ== + dependencies: + remark "^13.0.0" + unist-util-find-all-after "^3.0.2" + "@svgr/babel-plugin-add-jsx-attribute@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz#dadcb6218503532d6884b210e7f3c502caaa44b1" @@ -1914,7 +2006,7 @@ "@types/qs" "*" "@types/serve-static" "*" -"@types/glob@*", "@types/glob@7.1.3": +"@types/glob@*", "@types/glob@7.1.3", "@types/glob@^7.1.1": version "7.1.3" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== @@ -2008,6 +2100,11 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + "@types/lodash@4.14.161": version "4.14.161" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.161.tgz#a21ca0777dabc6e4f44f3d07f37b765f54188b18" @@ -2026,6 +2123,13 @@ resolved "https://registry.yarnpkg.com/@types/marked/-/marked-1.2.1.tgz#9864ecc10d0edb72e7be4e94acb5fcc607c15eed" integrity sha512-d5adCgRHB+NAme23hkiTkvpfZUDqoNtL2Sr2nZBJqSj3zyHLxsfFWsGQ2sK2z9aX6L1xkJzon2c0jTPcsEjpaQ== +"@types/mdast@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb" + integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw== + dependencies: + "@types/unist" "*" + "@types/memory-fs@*": version "0.3.2" resolved "https://registry.yarnpkg.com/@types/memory-fs/-/memory-fs-0.3.2.tgz#5d4753f9b390cb077c8c8af97bc96463399ceccd" @@ -2045,11 +2149,16 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a" integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q== -"@types/minimatch@*": +"@types/minimatch@*", "@types/minimatch@^3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== +"@types/minimist@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256" + integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg== + "@types/mkdirp@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-1.0.1.tgz#0930b948914a78587de35458b86c907b6e98bbf6" @@ -2304,6 +2413,27 @@ dependencies: source-map "^0.6.1" +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" + integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== + +"@types/vfile-message@*": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/vfile-message/-/vfile-message-2.0.0.tgz#690e46af0fdfc1f9faae00cd049cc888957927d5" + integrity sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw== + dependencies: + vfile-message "*" + +"@types/vfile@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/vfile/-/vfile-3.0.2.tgz#19c18cd232df11ce6fa6ad80259bc86c366b09b9" + integrity sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw== + dependencies: + "@types/node" "*" + "@types/unist" "*" + "@types/vfile-message" "*" + "@types/webpack-bundle-analyzer@3.8.0": version "3.8.0" resolved "https://registry.yarnpkg.com/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz#d1f196f95159254f76a3c2283c4677585bdf354d" @@ -2397,6 +2527,76 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin@^4.10.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.12.0.tgz#00d1b23b40b58031e6d7c04a5bc6c1a30a2e834a" + integrity sha512-wHKj6q8s70sO5i39H2g1gtpCXCvjVszzj6FFygneNFyIAxRvNSVz9GML7XpqrB9t7hNutXw+MHnLN/Ih6uyB8Q== + dependencies: + "@typescript-eslint/experimental-utils" "4.12.0" + "@typescript-eslint/scope-manager" "4.12.0" + debug "^4.1.1" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@4.12.0", "@typescript-eslint/experimental-utils@^4.0.1": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.12.0.tgz#372838e76db76c9a56959217b768a19f7129546b" + integrity sha512-MpXZXUAvHt99c9ScXijx7i061o5HEjXltO+sbYfZAAHxv3XankQkPaNi5myy0Yh0Tyea3Hdq1pi7Vsh0GJb0fA== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/scope-manager" "4.12.0" + "@typescript-eslint/types" "4.12.0" + "@typescript-eslint/typescript-estree" "4.12.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@^4.10.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.12.0.tgz#e1cf30436e4f916c31fcc962158917bd9e9d460a" + integrity sha512-9XxVADAo9vlfjfoxnjboBTxYOiNY93/QuvcPgsiKvHxW6tOZx1W4TvkIQ2jB3k5M0pbFP5FlXihLK49TjZXhuQ== + dependencies: + "@typescript-eslint/scope-manager" "4.12.0" + "@typescript-eslint/types" "4.12.0" + "@typescript-eslint/typescript-estree" "4.12.0" + debug "^4.1.1" + +"@typescript-eslint/scope-manager@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.12.0.tgz#beeb8beca895a07b10c593185a5612f1085ef279" + integrity sha512-QVf9oCSVLte/8jvOsxmgBdOaoe2J0wtEmBr13Yz0rkBNkl5D8bfnf6G4Vhox9qqMIoG7QQoVwd2eG9DM/ge4Qg== + dependencies: + "@typescript-eslint/types" "4.12.0" + "@typescript-eslint/visitor-keys" "4.12.0" + +"@typescript-eslint/types@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.12.0.tgz#fb891fe7ccc9ea8b2bbd2780e36da45d0dc055e5" + integrity sha512-N2RhGeheVLGtyy+CxRmxdsniB7sMSCfsnbh8K/+RUIXYYq3Ub5+sukRCjVE80QerrUBvuEvs4fDhz5AW/pcL6g== + +"@typescript-eslint/typescript-estree@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.12.0.tgz#3963418c850f564bdab3882ae23795d115d6d32e" + integrity sha512-gZkFcmmp/CnzqD2RKMich2/FjBTsYopjiwJCroxqHZIY11IIoN0l5lKqcgoAPKHt33H2mAkSfvzj8i44Jm7F4w== + dependencies: + "@typescript-eslint/types" "4.12.0" + "@typescript-eslint/visitor-keys" "4.12.0" + debug "^4.1.1" + globby "^11.0.1" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/visitor-keys@4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.12.0.tgz#a470a79be6958075fa91c725371a83baf428a67a" + integrity sha512-hVpsLARbDh4B9TKYz5cLbcdMIOAoBYgFPCSP9FFS/liSF+b33gVNq8JHY3QGhHNVz85hObvL7BEYLlgx553WCw== + dependencies: + "@typescript-eslint/types" "4.12.0" + eslint-visitor-keys "^2.0.0" + "@umijs/ast@3.3.3": version "3.3.3" resolved "https://registry.yarnpkg.com/@umijs/ast/-/ast-3.3.3.tgz#5c70ce8ce4a2d2020dd7f65ead42dbd5b02b3aee" @@ -2543,6 +2743,39 @@ resolved "https://registry.yarnpkg.com/@umijs/error-code-map/-/error-code-map-1.0.1.tgz#2a2dd7b4bcd11869e968264ff3dabacfabe8b874" integrity sha512-Q0KSpQYKTF2XWOlAxJO/SRbRhIGAp1GK1spWFbzwv3h0WvfX7pPeA05Y3p0hut7Vcjhdocnx5NduuApF4R1lGQ== +"@umijs/fabric@^2.4.9": + version "2.4.9" + resolved "https://registry.yarnpkg.com/@umijs/fabric/-/fabric-2.4.9.tgz#7eed66c36523c3bdc0ac269eea8b9961d643fe1b" + integrity sha512-9qPXp41V4hz7PYcYA7ooj3vb2zFKUmEsYixMhvRigw5vHnTiNvgDwlzNqjmhtwJOZzANz+1ssEWDqwRzg68Z0g== + dependencies: + "@typescript-eslint/eslint-plugin" "^4.10.0" + "@typescript-eslint/parser" "^4.10.0" + eslint "^7.11.0" + eslint-config-airbnb-base "^14.2.0" + eslint-config-prettier "^6.13.0" + eslint-formatter-pretty "^4.0.0" + eslint-plugin-babel "^5.3.0" + eslint-plugin-compat "^3.1.1" + eslint-plugin-eslint-comments "^3.1.1" + eslint-plugin-import "^2.17.3" + eslint-plugin-jest "^24.0.1" + eslint-plugin-jsx-a11y "^6.2.0" + eslint-plugin-markdown "^1.0.0" + eslint-plugin-promise "^4.1.1" + eslint-plugin-react "^7.21.5" + eslint-plugin-react-hooks "^4.1.2" + eslint-plugin-unicorn "^20.0.0" + fast-glob "^3.2.4" + stylelint "^13.7.0" + stylelint-config-css-modules "^2.2.0" + stylelint-config-prettier "^8.0.1" + stylelint-config-rational-order "^0.1.2" + stylelint-config-standard "^20.0.0" + stylelint-declaration-block-no-ignored-properties "^2.1.0" + stylelint-no-unsupported-browser-features "^4.1.4" + stylelint-order "^4.0.0" + typescript "^4.0.2" + "@umijs/plugin-access@2.3.2": version "2.3.2" resolved "https://registry.yarnpkg.com/@umijs/plugin-access/-/plugin-access-2.3.2.tgz#2d736e72bf27c69c7a0d1d1d1ac334a408e069c0" @@ -2992,6 +3225,14 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +JSONStream@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-0.8.4.tgz#91657dfe6ff857483066132b4618b62e8f4887bd" + integrity sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70= + dependencies: + jsonparse "0.0.5" + through ">=2.2.7 <3" + abab@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" @@ -3013,6 +3254,11 @@ acorn-globals@^4.3.0, acorn-globals@^4.3.2: acorn "^6.0.1" acorn-walk "^6.0.1" +acorn-jsx@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + acorn-walk@^6.0.1: version "6.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" @@ -3028,7 +3274,7 @@ acorn@^6.0.1, acorn@^6.0.4, acorn@^6.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^7.1.0, acorn@^7.1.1: +acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== @@ -3040,7 +3286,7 @@ add-dom-event-listener@^1.1.0: dependencies: object-assign "4.x" -address@1.1.2: +address@1.1.2, address@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== @@ -3063,7 +3309,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -3073,6 +3319,16 @@ ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.0.3.tgz#13ae747eff125cafb230ac504b2406cf371eece2" + integrity sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + alphanum-sort@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" @@ -3125,7 +3381,7 @@ ansi-styles@^2.2.1: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -3264,6 +3520,14 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== + dependencies: + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -3279,31 +3543,93 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= +array-differ@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" + integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== + array-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= +array-includes@^3.1.1, array-includes@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.2.tgz#a8db03e0b88c8c6aeddc49cb132f9bcab4ebf9c8" + integrity sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + get-intrinsic "^1.0.1" + is-string "^1.0.5" + array-tree-filter@2.1.x, array-tree-filter@^2.1.0, array-tree-filter@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190" integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw== +array-union@^1.0.1, array-union@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array.prototype.flat@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" + integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +array.prototype.flatmap@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9" + integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + function-bind "^1.1.1" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -3344,6 +3670,16 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +ast-metadata-inferer@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/ast-metadata-inferer/-/ast-metadata-inferer-0.4.0.tgz#6be85ceeffcf267bd79db8e1ae731da44880b45f" + integrity sha512-tKHdBe8N/Vq2nLAm4YPBVREVZjMux6KrqyPfNQgIbDl0t7HaNSmy8w4OyVHYg/cvyn5BW7o7pVwpjPte89Zhcg== + +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" @@ -3396,7 +3732,7 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@^9.6.1: +autoprefixer@^9.0.0, autoprefixer@^9.6.1, autoprefixer@^9.8.6: version "9.8.6" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== @@ -3419,11 +3755,42 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== +axe-core@^4.0.2: + version "4.1.1" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.1.1.tgz#70a7855888e287f7add66002211a423937063eaf" + integrity sha512-5Kgy8Cz6LPC9DJcNb3yjAXTu3XihQgEdnIg50c//zOC/MyLP0Clg+Y8Sh9ZjjnvBrDZU4DgXS9C3T9r4/scGZQ== + +axobject-query@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== + +babel-code-frame@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + babel-core@7.0.0-bridge.0: version "7.0.0-bridge.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== +babel-eslint@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + babel-jest@^25.4.0, babel-jest@^25.5.1: version "25.5.1" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.5.1.tgz#bc2e6101f849d6f6aec09720ffc7bc5332e62853" @@ -3554,6 +3921,11 @@ babel-runtime@6.x, babel-runtime@^6.23.0, babel-runtime@^6.26.0: core-js "^2.4.0" regenerator-runtime "^0.11.0" +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -3761,7 +4133,17 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.0, browserslist@^4.6.4: +browserslist@4.10.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.10.0.tgz#f179737913eaf0d2b98e4926ac1ca6a15cbcc6a9" + integrity sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA== + dependencies: + caniuse-lite "^1.0.30001035" + electron-to-chromium "^1.3.378" + node-releases "^1.1.52" + pkg-up "^3.1.0" + +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.12.2, browserslist@^4.14.5, browserslist@^4.14.7, browserslist@^4.16.0, browserslist@^4.6.4: version "4.16.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.0.tgz#410277627500be3cb28a1bfe037586fbedf9488b" integrity sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ== @@ -3930,6 +4312,29 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camelcase-keys@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" + integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= + dependencies: + camelcase "^4.1.0" + map-obj "^2.0.0" + quick-lru "^1.0.0" + +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -3950,6 +4355,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, can resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001171.tgz#3291e11e02699ad0a29e69b8d407666fc843eba7" integrity sha512-5Alrh8TTYPG9IH4UkRqEBZoEToWRLvPbSQokvzSz0lii8/FOWKG4keO1HoYfPWs8IF/NH/dyNPg1cmJGvV3Zlg== +caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001157, caniuse-lite@^1.0.30001166: + version "1.0.30001173" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001173.tgz#3c47bbe3cd6d7a9eda7f50ac016d158005569f56" + integrity sha512-R3aqmjrICdGCTAnSXtNyvWYMK3YtV5jwudbq0T7nN9k4kmE4CBuwPqyJ+KBzepSTh0huivV2gLbSMEzTTmfeYw== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -3970,6 +4380,20 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +ccount@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" + integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@4.1.0, chalk@^4.0.0, chalk@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" @@ -3989,15 +4413,6 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" @@ -4006,6 +4421,31 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +character-entities-html4@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.4.tgz#0e64b0a3753ddbf1fdc044c5fd01d0199a02e125" + integrity sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g== + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + check-types@^8.0.3: version "8.0.3" resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" @@ -4057,7 +4497,7 @@ chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" -chokidar@^3.4.1, chokidar@^3.4.2: +chokidar@^3.3.0, chokidar@^3.4.1, chokidar@^3.4.2: version "3.4.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== @@ -4122,6 +4562,13 @@ classnames@2.2.6, classnames@2.x, classnames@^2.2.0, classnames@^2.2.1, classnam resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== +clean-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7" + integrity sha1-jffHquUf02h06PjQW5GAvBGj/tc= + dependencies: + escape-string-regexp "^1.0.5" + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -4162,6 +4609,11 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + clipboardy@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-2.3.0.tgz#3c2903650c68e46a91b388985bc2774287dba290" @@ -4180,6 +4632,15 @@ cliui@6.0.0, cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + clone-deep@^0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6" @@ -4191,6 +4652,21 @@ clone-deep@^0.2.4: lazy-cache "^1.0.3" shallow-clone "^0.1.2" +clone-regexp@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-1.0.1.tgz#051805cd33173375d82118fc0918606da39fd60f" + integrity sha512-Fcij9IwRW27XedRIJnSOEupS7RVcXtObJXbcUOX93UCLqqOdRpkvzKywOOSizmEK/Is3S/RHX9dLdfo6R1Q1mw== + dependencies: + is-regexp "^1.0.0" + is-supported-regexp-flag "^1.0.0" + +clone-regexp@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f" + integrity sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q== + dependencies: + is-regexp "^2.0.0" + clone-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" @@ -4217,6 +4693,11 @@ coa@^2.0.2: chalk "^2.4.1" q "^1.1.2" +collapse-white-space@^1.0.2: + version "1.0.6" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" + integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== + collect-v8-coverage@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" @@ -4362,6 +4843,11 @@ concat-stream@^1.5.0, concat-stream@^1.5.2: readable-stream "^2.2.2" typedarray "^0.0.6" +confusing-browser-globals@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59" + integrity sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA== + connected-react-router@6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/connected-react-router/-/connected-react-router-6.5.2.tgz#422af70f86cb276681e20ab4295cf27dd9b6c7e3" @@ -4386,6 +4872,11 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + content-disposition@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" @@ -4464,6 +4955,11 @@ core-js-compat@^3.6.2, core-js-compat@^3.8.0: browserslist "^4.16.0" semver "7.0.0" +core-js-pure@^3.0.0: + version "3.8.2" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.8.2.tgz#286f885c0dac1cdcd6d78397392abc25ddeca225" + integrity sha512-v6zfIQqL/pzTVAbZvYUozsxNfxcFb6Ks3ZfEbuneJl3FW9Jb8F6vLWB6f+qTmAu72msUdyb84V8d/yBFf7FNnw== + core-js@3.6.5: version "3.6.5" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" @@ -4479,6 +4975,11 @@ core-js@^2.4.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== +core-js@^3.6.5: + version "3.8.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.2.tgz#0a1fd6709246da9ca8eff5bb0cbd15fba9ac7044" + integrity sha512-FfApuSRgrR6G5s58casCBd9M2k+4ikuu4wbW6pJyYU7bd9zvFc9qf7vr5xmrZOhT9nn+8uwlH1oRR9jTnFoA3A== + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -4560,7 +5061,16 @@ crequire@1.8.1: resolved "https://registry.yarnpkg.com/crequire/-/crequire-1.8.1.tgz#ac81f204786b5f201194eb1698cf441b10a4b57d" integrity sha1-rIHyBHhrXyARlOsWmM9EGxCktX0= -cross-spawn@7.0.3, cross-spawn@^7.0.0: +cross-spawn@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -4681,6 +5191,16 @@ css-prefers-color-scheme@^3.1.1: dependencies: postcss "^7.0.5" +css-rule-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/css-rule-stream/-/css-rule-stream-1.1.0.tgz#3786e7198983d965a26e31957e09078cbb7705a2" + integrity sha1-N4bnGYmD2WWibjGVfgkHjLt3BaI= + dependencies: + css-tokenize "^1.0.1" + duplexer2 "0.0.2" + ldjson-stream "^1.2.1" + through2 "^0.6.3" + css-select-base-adapter@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" @@ -4706,6 +5226,14 @@ css-select@~1.2.0: domutils "1.5.1" nth-check "~1.0.1" +css-tokenize@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-tokenize/-/css-tokenize-1.0.1.tgz#4625cb1eda21c143858b7f81d6803c1d26fc14be" + integrity sha1-RiXLHtohwUOFi3+B1oA8HSb8FL4= + dependencies: + inherits "^2.0.1" + readable-stream "^1.0.33" + css-tree@1.0.0-alpha.37: version "1.0.0-alpha.37" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" @@ -4851,6 +5379,13 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.5.tgz#7fdec6a28a67ae18647c51668a9ff95bb2fa7bb8" integrity sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ== +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" @@ -4864,6 +5399,11 @@ d@1, d@^1.0.1: es5-ext "^0.10.50" type "^1.0.1" +damerau-levenshtein@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" + integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug== + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -4890,7 +5430,7 @@ dayjs@^1.8.30: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.1.tgz#114f678624842035396667a24eb1436814bc16fd" integrity sha512-2xg7JrHQeLBQFkvTumLoy62x1siyeocc98QwjtURgvRqOPYmAkMUdmSjrOA+MlmL6QMQn5MUhDf6rNZNuPc1LQ== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -4911,14 +5451,22 @@ debug@^3.1.1, debug@^3.2.6: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: +debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: ms "2.1.2" -decamelize@^1.2.0: +decamelize-keys@^1.0.0, decamelize-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -4940,7 +5488,7 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= -deep-is@~0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= @@ -5022,6 +5570,14 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== +detect-port-alt@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + dicer@0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" @@ -5044,6 +5600,21 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dir-glob@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== + dependencies: + arrify "^1.0.1" + path-type "^3.0.0" + +dir-glob@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -5051,6 +5622,45 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +doiuse@^4.3.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/doiuse/-/doiuse-4.4.0.tgz#d02541820a05b60ae69facbe2c1abd00513db7c2" + integrity sha512-+RbL+7ECpBzbX+GMnX3PXzc/t+ufvZV/q/ysES5U8i0VexgGKLezQPCVehKwzLH2pIFC0pISfPaSm69CxuEw6w== + dependencies: + browserslist "^4.14.7" + caniuse-lite "^1.0.30001157" + css-rule-stream "^1.1.0" + duplexer2 "0.0.2" + jsonfilter "^1.1.2" + ldjson-stream "^1.2.1" + multimatch "^5.0.0" + postcss "^8.1.6" + source-map "^0.7.3" + through2 "^4.0.2" + yargs "^16.1.0" + dom-align@1.x, dom-align@^1.7.0: version "1.12.0" resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.0.tgz#56fb7156df0b91099830364d2d48f88963f5a29c" @@ -5134,12 +5744,19 @@ dotenv@8.2.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== +duplexer2@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + integrity sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds= + dependencies: + readable-stream "~1.1.9" + duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= -duplexer@^0.1.1: +duplexer@^0.1.1, duplexer@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== @@ -5226,7 +5843,7 @@ ejs@^2.6.1: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== -electron-to-chromium@^1.3.621: +electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.621: version "1.3.633" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.633.tgz#16dd5aec9de03894e8d14a1db4cda8a369b9b7fe" integrity sha512-bsVCsONiVX1abkWdH7KtpuDAhsQ3N3bjPYhROSAXE78roJKet0Y5wznA14JE9pzbwSZmSMAW6KiKYf1RvbTJkA== @@ -5244,11 +5861,26 @@ elliptic@^6.5.3: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.0.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.0.tgz#a26da8e832b16a9753309f25e35e3c0efb9a066a" + integrity sha512-DNc3KFPK18bPdElMJnf/Pkv5TXhxFU3YFDEuGLDRtPmV4rkmCjBkCSEp22u6rBHdSN9Vlp/GK7k98prmE1Jgug== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + emojis-list@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" @@ -5282,7 +5914,7 @@ enhanced-resolve@^4.3.0: memory-fs "^0.5.0" tapable "^1.0.0" -enquirer@^2.3.6: +enquirer@^2.3.5, enquirer@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -5306,7 +5938,7 @@ errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" -error-ex@^1.3.1: +error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== @@ -5320,7 +5952,7 @@ error-stack-parser@^2.0.0, error-stack-parser@^2.0.6: dependencies: stackframe "^1.1.1" -es-abstract@^1.17.2: +es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: version "1.17.7" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== @@ -5415,16 +6047,16 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= +escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - escodegen@^1.11.0, escodegen@^1.11.1: version "1.14.3" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" @@ -5437,6 +6069,196 @@ escodegen@^1.11.0, escodegen@^1.11.1: optionalDependencies: source-map "~0.6.1" +eslint-ast-utils@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz#3d58ba557801cfb1c941d68131ee9f8c34bd1586" + integrity sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA== + dependencies: + lodash.get "^4.4.2" + lodash.zip "^4.2.0" + +eslint-config-airbnb-base@^14.2.0: + version "14.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz#8a2eb38455dc5a312550193b319cdaeef042cd1e" + integrity sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA== + dependencies: + confusing-browser-globals "^1.0.10" + object.assign "^4.1.2" + object.entries "^1.1.2" + +eslint-config-prettier@^6.13.0: + version "6.15.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" + integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== + dependencies: + get-stdin "^6.0.0" + +eslint-formatter-pretty@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-formatter-pretty/-/eslint-formatter-pretty-4.0.0.tgz#dc15f3bf4fb51b7ba5fbedb77f57ba8841140ce2" + integrity sha512-QgdeZxQwWcN0TcXXNZJiS6BizhAANFhCzkE7Yl9HKB7WjElzwED6+FbbZB2gji8ofgJTGPqKm6VRCNT3OGCeEw== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + eslint-rule-docs "^1.1.5" + log-symbols "^4.0.0" + plur "^4.0.0" + string-width "^4.2.0" + supports-hyperlinks "^2.0.0" + +eslint-import-resolver-node@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== + dependencies: + debug "^2.6.9" + resolve "^1.13.1" + +eslint-module-utils@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" + integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== + dependencies: + debug "^2.6.9" + pkg-dir "^2.0.0" + +eslint-plugin-babel@^5.3.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-babel/-/eslint-plugin-babel-5.3.1.tgz#75a2413ffbf17e7be57458301c60291f2cfbf560" + integrity sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g== + dependencies: + eslint-rule-composer "^0.3.0" + +eslint-plugin-compat@^3.1.1: + version "3.9.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-compat/-/eslint-plugin-compat-3.9.0.tgz#a7a224e09b102b58e7f7dff52c936428ff3e0186" + integrity sha512-lt3l5PHFHVEYSZ5zijcoYvtQJPsBifRiH5N0Et57KwVu7l/yxmHhSG6VJiLMa/lXrg93Qu8049RNQOMn0+yJBg== + dependencies: + "@mdn/browser-compat-data" "^2.0.7" + ast-metadata-inferer "^0.4.0" + browserslist "^4.12.2" + caniuse-lite "^1.0.30001166" + core-js "^3.6.5" + find-up "^4.1.0" + lodash.memoize "4.1.2" + semver "7.3.2" + +eslint-plugin-eslint-comments@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz#9e1cd7b4413526abb313933071d7aba05ca12ffa" + integrity sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ== + dependencies: + escape-string-regexp "^1.0.5" + ignore "^5.0.5" + +eslint-plugin-import@^2.17.3: + version "2.22.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" + integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== + dependencies: + array-includes "^3.1.1" + array.prototype.flat "^1.2.3" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.4" + eslint-module-utils "^2.6.0" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.1" + read-pkg-up "^2.0.0" + resolve "^1.17.0" + tsconfig-paths "^3.9.0" + +eslint-plugin-jest@^24.0.1: + version "24.1.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.1.3.tgz#fa3db864f06c5623ff43485ca6c0e8fc5fe8ba0c" + integrity sha512-dNGGjzuEzCE3d5EPZQ/QGtmlMotqnYWD/QpCZ1UuZlrMAdhG5rldh0N0haCvhGnUkSeuORS5VNROwF9Hrgn3Lg== + dependencies: + "@typescript-eslint/experimental-utils" "^4.0.1" + +eslint-plugin-jsx-a11y@^6.2.0: + version "6.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz#a2d84caa49756942f42f1ffab9002436391718fd" + integrity sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg== + dependencies: + "@babel/runtime" "^7.11.2" + aria-query "^4.2.2" + array-includes "^3.1.1" + ast-types-flow "^0.0.7" + axe-core "^4.0.2" + axobject-query "^2.2.0" + damerau-levenshtein "^1.0.6" + emoji-regex "^9.0.0" + has "^1.0.3" + jsx-ast-utils "^3.1.0" + language-tags "^1.0.5" + +eslint-plugin-markdown@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-markdown/-/eslint-plugin-markdown-1.0.2.tgz#79274bf17ce3ead48e4a55cbcb6d7ce735754280" + integrity sha512-BfvXKsO0K+zvdarNc801jsE/NTLmig4oKhZ1U3aSUgTf2dB/US5+CrfGxMsCK2Ki1vS1R3HPok+uYpufFndhzw== + dependencies: + object-assign "^4.0.1" + remark-parse "^5.0.0" + unified "^6.1.2" + +eslint-plugin-promise@^4.1.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" + integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw== + +eslint-plugin-react-hooks@^4.1.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556" + integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ== + +eslint-plugin-react@^7.21.5: + version "7.22.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.22.0.tgz#3d1c542d1d3169c45421c1215d9470e341707269" + integrity sha512-p30tuX3VS+NWv9nQot9xIGAHBXR0+xJVaZriEsHoJrASGCJZDJ8JLNM0YqKqI0AKm6Uxaa1VUHoNEibxRCMQHA== + dependencies: + array-includes "^3.1.1" + array.prototype.flatmap "^1.2.3" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.4.1 || ^3.0.0" + object.entries "^1.1.2" + object.fromentries "^2.0.2" + object.values "^1.1.1" + prop-types "^15.7.2" + resolve "^1.18.1" + string.prototype.matchall "^4.0.2" + +eslint-plugin-unicorn@^20.0.0: + version "20.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-20.1.0.tgz#a43f60ffc98406d72ec2a5fcc6dad24ba0192bc9" + integrity sha512-XQxLBJT/gnwyRR6cfYsIK1AdekQchAt5tmcsnldevGjgR2xoZsRUa5/i6e0seNHy2RoT57CkTnbVHwHF8No8LA== + dependencies: + ci-info "^2.0.0" + clean-regexp "^1.0.0" + eslint-ast-utils "^1.1.0" + eslint-template-visitor "^2.0.0" + eslint-utils "^2.0.0" + import-modules "^2.0.0" + lodash "^4.17.15" + pluralize "^8.0.0" + read-pkg-up "^7.0.1" + regexp-tree "^0.1.21" + reserved-words "^0.1.2" + safe-regex "^2.1.1" + semver "^7.3.2" + +eslint-rule-composer@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" + integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== + +eslint-rule-docs@^1.1.5: + version "1.1.218" + resolved "https://registry.yarnpkg.com/eslint-rule-docs/-/eslint-rule-docs-1.1.218.tgz#089482e87918995f51f86c5412b30c9cb46a1ea1" + integrity sha512-oGT85qE8VvBEUuW1/9NjCye9+1kY5zjjiJgkzPHPDhwS3k3GwEN9NfflKW+eDM+lYB18EVuXUDiubNcdgabEQA== + eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -5445,12 +6267,106 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-scope@^5.0.0, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-template-visitor@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/eslint-template-visitor/-/eslint-template-visitor-2.2.2.tgz#46cd2b06eca5c1d97369aadd96e131df88fdd59c" + integrity sha512-SkcLjzKw3JjKTWHacRDeLBa2gxb600zbCKTkXj/V97QnZ9yxkknoPL8vc8PFueqbFXP7mYNTQzjCjcMpTRdRaA== + dependencies: + babel-eslint "^10.1.0" + eslint-visitor-keys "^2.0.0" + esquery "^1.3.1" + multimap "^1.1.0" + +eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + +eslint@^7.11.0, eslint@^7.17.0: + version "7.17.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.17.0.tgz#4ccda5bf12572ad3bf760e6f195886f50569adb0" + integrity sha512-zJk08MiBgwuGoxes5sSQhOtibZ75pz0J35XTRlZOk9xMffhpA9BTbQZxoXZzOl5zMbleShbGwtw+1kGferfFwQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^0.2.2" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.2.0" + esutils "^2.0.2" + file-entry-cache "^6.0.0" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash "^4.17.19" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.4" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esrecurse@^4.1.0: +esquery@^1.2.0, esquery@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.1.0, esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== @@ -5462,7 +6378,7 @@ estraverse@^4.1.1, estraverse@^4.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.2.0: +estraverse@^5.1.0, estraverse@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== @@ -5587,6 +6503,20 @@ execa@^4.0.0, execa@^4.1.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execall@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execall/-/execall-1.0.0.tgz#73d0904e395b3cab0658b08d09ec25307f29bb73" + integrity sha1-c9CQTjlbPKsGWLCNCewlMH8pu3M= + dependencies: + clone-regexp "^1.0.0" + +execall@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45" + integrity sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow== + dependencies: + clone-regexp "^2.1.0" + exenv@^1.2.0: version "1.2.2" resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" @@ -5680,11 +6610,20 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@~3.0.2: +extend@3.0.2, extend@^3.0.0, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -5719,6 +6658,18 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-glob@^2.0.2, fast-glob@^2.2.6: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + fast-glob@^3.1.1, fast-glob@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" @@ -5736,11 +6687,16 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + fastq@^1.6.0: version "1.10.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.0.tgz#74dbefccade964932cdf500473ef302719c652bb" @@ -5787,13 +6743,27 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -figures@^3.2.0: +figures@^3.0.0, figures@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: escape-string-regexp "^1.0.5" +file-entry-cache@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-4.0.0.tgz#633567d15364aefe0b299e1e217735e8f3a9f6e8" + integrity sha512-AVSwsnbV8vH/UVbvgEhf3saVQXORNv0ZzSkvkhQIaia5Tia+JhGTaa/ePUSVoPHQyGayQNmYfkzFi3WZV5zcpA== + dependencies: + flat-cache "^2.0.1" + +file-entry-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a" + integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== + dependencies: + flat-cache "^3.0.4" + file-loader@6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.1.0.tgz#65b9fcfb0ea7f65a234a1f10cdd7f1ab9a33f253" @@ -5814,6 +6784,11 @@ filelist@^1.0.1: dependencies: minimatch "^3.0.4" +filesize@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.0.1.tgz#f850b509909c7c86f7e450ea19006c31c2ed3d2f" + integrity sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg== + filesize@^3.6.1: version "3.6.1" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" @@ -5867,7 +6842,15 @@ find-cache-dir@^3.3.1: make-dir "^3.0.2" pkg-dir "^4.1.0" -find-up@^2.0.0: +find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -5881,13 +6864,32 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + +flatted@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067" + integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA== flatten@^1.0.2: version "1.0.3" @@ -5929,6 +6931,20 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +fork-ts-checker-webpack-plugin@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz#a1642c0d3e65f50c2cc1742e9c0a80f441f86b19" + integrity sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ== + dependencies: + babel-code-frame "^6.22.0" + chalk "^2.4.1" + chokidar "^3.3.0" + micromatch "^3.1.10" + minimatch "^3.0.4" + semver "^5.6.0" + tapable "^1.0.0" + worker-rpc "^0.1.0" + fork-ts-checker-webpack-plugin@6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.0.5.tgz#20d8766b644833cc5c600b9b7c6fbba0c8087419" @@ -6073,17 +7089,22 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + gensync@^1.0.0-beta.1: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.0: +get-intrinsic@^1.0.0, get-intrinsic@^1.0.1, get-intrinsic@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.2.tgz#6820da226e50b24894e08859469dc68361545d49" integrity sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg== @@ -6102,6 +7123,16 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== + +get-stdin@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -6141,13 +7172,18 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@~5.1.0: +glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@~5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== dependencies: is-glob "^4.0.1" +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + glob@7.1.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" @@ -6160,6 +7196,22 @@ glob@7.1.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" +global-modules@2.0.0, global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + global@^4.3.2: version "4.4.0" resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" @@ -6173,6 +7225,26 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +globby@8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" + integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== + dependencies: + array-union "^1.0.1" + dir-glob "2.0.0" + fast-glob "^2.0.2" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + globby@^11.0.1: version "11.0.1" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" @@ -6185,6 +7257,32 @@ globby@^11.0.1: merge2 "^1.3.0" slash "^3.0.0" +globby@^9.0.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" + integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.2" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" + +globjoin@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" + integrity sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM= + +gonzales-pe@^4.2.3, gonzales-pe@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3" + integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ== + dependencies: + minimist "^1.2.5" + got@9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -6212,7 +7310,7 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -gzip-size@^5.0.0: +gzip-size@5.1.1, gzip-size@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== @@ -6238,6 +7336,11 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + harmony-reflect@^1.4.6: version "1.6.1" resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.1.tgz#c108d4f2bb451efef7a37861fdbdae72c9bdefa9" @@ -6376,6 +7479,18 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== +hosted-git-info@^3.0.6: + version "3.0.7" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.7.tgz#a30727385ea85acfcee94e0aad9e368c792e036c" + integrity sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ== + dependencies: + lru-cache "^6.0.0" + +hotkeys-js@^3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/hotkeys-js/-/hotkeys-js-3.8.1.tgz#fa7051f73bf1dc92a8b8d580a40b247f91966376" + integrity sha512-YlhVQtyG9f1b7GhtzdhR0Pl+cImD1ZrKI6zYUa7QLd0zuThiL7RzZ+ANJyy7z+kmcCpNYBf5PjBa3CjiQ5PFpw== + hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" @@ -6418,7 +7533,17 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -htmlparser2@^3.9.1: +html-tags@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b" + integrity sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos= + +html-tags@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" + integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== + +htmlparser2@^3.10.0, htmlparser2@^3.9.1: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== @@ -6511,7 +7636,7 @@ hyphenate-style-name@^1.0.0: resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== -iconv-lite@0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -6549,7 +7674,17 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= -ignore@^5.1.4: +ignore@^3.3.5: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + +ignore@^4.0.3, ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.0.4, ignore@^5.0.5, ignore@^5.1.4, ignore@^5.1.8: version "5.1.8" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== @@ -6559,6 +7694,11 @@ image-size@~0.5.0: resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= +immer@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/immer/-/immer-1.10.0.tgz#bad67605ba9c810275d91e1c2a47d4582e98286d" + integrity sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg== + immer@7.0.5: version "7.0.5" resolved "https://registry.yarnpkg.com/immer/-/immer-7.0.5.tgz#8af347db5b60b40af8ae7baf1784ea4d35b5208e" @@ -6589,7 +7729,7 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.1.0, import-fresh@^3.2.1: +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -6604,6 +7744,16 @@ import-from@^2.1.0: dependencies: resolve-from "^3.0.0" +import-lazy@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-3.1.0.tgz#891279202c8a2280fdbd6674dbd8da1a1dfc67cc" + integrity sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ== + +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + import-local@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" @@ -6612,11 +7762,21 @@ import-local@^3.0.2: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" +import-modules@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-modules/-/import-modules-2.1.0.tgz#abe7df297cb6c1f19b57246eb8b8bd9664b6d8c2" + integrity sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A== + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" @@ -6640,7 +7800,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6655,11 +7815,44 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inquirer@7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" + integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.2.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + insert-css@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/insert-css/-/insert-css-2.0.0.tgz#eb5d1097b7542f4c79ea3060d3aee07d053880f4" integrity sha1-610Ql7dUL0x56jBg067gfQU4gPQ= +internal-slot@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" + integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== + dependencies: + es-abstract "^1.17.0-next.1" + has "^1.0.3" + side-channel "^1.0.2" + intl-format-cache@^4.2.21: version "4.3.1" resolved "https://registry.yarnpkg.com/intl-format-cache/-/intl-format-cache-4.3.1.tgz#484d31a9872161e6c02139349b259a6229ade377" @@ -6707,6 +7900,11 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +irregular-plurals@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.2.0.tgz#b19c490a0723798db51b235d7e39add44dab0822" + integrity sha512-YqTdPLfwP7YFN0SsD3QUVCkm9ZG2VzOXv3DOrw5G5mkMbVwptTwVcFv7/C0vOpBmgTxAeTG19XpUs1E522LW9Q== + is-absolute-url@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" @@ -6726,6 +7924,24 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumeric@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz#4a9cef71daf4c001c1d81d63d140cf53fd6889f4" + integrity sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ= + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -6750,11 +7966,16 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-buffer@^1.0.2, is-buffer@^1.1.5: +is-buffer@^1.0.2, is-buffer@^1.1.4, is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + is-callable@^1.1.4, is-callable@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" @@ -6812,6 +8033,11 @@ is-date-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -6886,6 +8112,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + is-negative-zero@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" @@ -6913,11 +8144,16 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== -is-plain-obj@^1.0.0: +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -6942,11 +8178,21 @@ is-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= +is-regexp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d" + integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA== + is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== +is-root@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -6957,6 +8203,16 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + +is-supported-regexp-flag@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz#21ee16518d2c1dd3edd3e9a0d57e50207ac364ca" + integrity sha512-3vcJecUUrpgCqc/ca0aWeNu64UGgxcvO60K/Fkr1N6RSvfGCTU60UKN68JDmKokgba0rFFJs12EnzOQa14ubKQ== + is-svg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" @@ -6976,11 +8232,21 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-whitespace-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" + integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== + is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== +is-word-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" + integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== + is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" @@ -7582,6 +8848,11 @@ joi2types@~1.0.7: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + js-yaml@^3.12.1, js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" @@ -7719,11 +8990,21 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -7771,6 +9052,21 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonfilter@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/jsonfilter/-/jsonfilter-1.1.2.tgz#21ef7cedc75193813c75932e96a98be205ba5a11" + integrity sha1-Ie987cdRk4E8dZMulqmL4gW6WhE= + dependencies: + JSONStream "^0.8.4" + minimist "^1.1.0" + stream-combiner "^0.2.1" + through2 "^0.6.3" + +jsonparse@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-0.0.5.tgz#330542ad3f0a654665b778f3eb2d9a9fa507ac64" + integrity sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ= + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -7781,6 +9077,14 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz#41108d2cec408c3453c1bbe8a4aae9e1e2bd8f82" + integrity sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q== + dependencies: + array-includes "^3.1.2" + object.assign "^4.1.2" + keyv@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" @@ -7814,7 +9118,7 @@ kind-of@^5.0.0: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -7824,6 +9128,28 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +known-css-properties@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.11.0.tgz#0da784f115ea77c76b81536d7052e90ee6c86a8a" + integrity sha512-bEZlJzXo5V/ApNNa5z375mJC6Nrz4vG43UgcSCrg2OHC+yuB6j0iDSrY7RQ/+PRofFB03wNIIt9iXIVLr4wc7w== + +known-css-properties@^0.20.0: + version "0.20.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.20.0.tgz#0570831661b47dd835293218381166090ff60e96" + integrity sha512-URvsjaA9ypfreqJ2/ylDr5MUERhJZ+DhguoWRr2xgS5C7aGCalXo+ewL+GixgKBfhT2vuL02nbIgNGqVWgTOYw== + +language-subtag-registry@~0.3.2: + version "0.3.21" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" + integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== + +language-tags@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo= + dependencies: + language-subtag-registry "~0.3.2" + last-call-webpack-plugin@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" @@ -7849,6 +9175,14 @@ lcid@^3.0.0: dependencies: invert-kv "^3.0.0" +ldjson-stream@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ldjson-stream/-/ldjson-stream-1.2.1.tgz#91beceda5ac4ed2b17e649fb777e7abfa0189c2b" + integrity sha1-kb7O2lrE7SsX5kn7d356v6AYnCs= + dependencies: + split2 "^0.2.1" + through2 "^0.6.1" + less-loader@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-5.0.0.tgz#498dde3a6c6c4f887458ee9ed3f086a12ad1b466" @@ -7878,11 +9212,24 @@ levdist@^1.0.0: resolved "https://registry.yarnpkg.com/levdist/-/levdist-1.0.0.tgz#91d7a3044964f2ccc421a0477cac827fe75c5718" integrity sha1-kdejBElk8szEIaBHfKyCf+dcVxg= +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -7938,6 +9285,16 @@ listr2@^3.2.2: rxjs "^6.6.3" through "^2.3.8" +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -7953,6 +9310,15 @@ loader-runner@^2.4.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" @@ -8004,12 +9370,17 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= -lodash.memoize@^4.1.2: +lodash.memoize@4.1.2, lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= @@ -8049,11 +9420,23 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@4.17.20, "lodash@>=3.5 <5", lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5: +lodash.zip@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020" + integrity sha1-7GZi5IlkCO1KtsVCo5kLcswIACA= + +lodash@4.17.20, "lodash@>=3.5 <5", lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== +log-symbols@^2.0.0, log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + log-symbols@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" @@ -8083,6 +9466,11 @@ lolex@^5.0.0: dependencies: "@sinonjs/commons" "^1.7.0" +longest-streak@^2.0.0, longest-streak@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" + integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -8090,6 +9478,14 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3 dependencies: js-tokens "^3.0.0 || ^4.0.0" +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" @@ -8163,6 +9559,21 @@ map-cache@^0.2.2: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" + integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= + +map-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5" + integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g== + map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -8170,6 +9581,16 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +markdown-escapes@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" + integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== + +markdown-table@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" + integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== + marked-terminal@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-4.1.0.tgz#01087372d3636dc7cb286475a1d6147187f500e0" @@ -8194,6 +9615,11 @@ matchmediaquery@^0.3.0: dependencies: css-mediaquery "^0.1.2" +mathml-tag-names@^2.0.1, mathml-tag-names@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" + integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -8203,6 +9629,41 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +mdast-util-compact@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-1.0.4.tgz#d531bb7667b5123abf20859be086c4d06c894593" + integrity sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg== + dependencies: + unist-util-visit "^1.1.0" + +mdast-util-from-markdown@^0.8.0: + version "0.8.4" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.4.tgz#2882100c1b9fc967d3f83806802f303666682d32" + integrity sha512-jj891B5pV2r63n2kBTFh8cRI2uR9LQHsXG1zSDqfhXkIlDzrTcIlbB5+5aaYEkl8vOPIOPLf8VT7Ere1wWTMdw== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-string "^2.0.0" + micromark "~2.11.0" + parse-entities "^2.0.0" + unist-util-stringify-position "^2.0.0" + +mdast-util-to-markdown@^0.6.0: + version "0.6.2" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.2.tgz#8fe6f42a2683c43c5609dfb40407c095409c85b4" + integrity sha512-iRczns6WMvu0hUw02LXsPDJshBIwtUPbvHBWo19IQeU0YqmzlA8Pd30U8V7uiI0VPkxzS7A/NXBXH6u+HS87Zg== + dependencies: + "@types/unist" "^2.0.0" + longest-streak "^2.0.0" + mdast-util-to-string "^2.0.0" + parse-entities "^2.0.0" + repeat-string "^1.0.0" + zwitch "^1.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + mdn-data@2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" @@ -8269,6 +9730,38 @@ memory-fs@^0.5.0: errno "^0.1.3" readable-stream "^2.0.1" +meow@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" + integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== + dependencies: + camelcase-keys "^4.0.0" + decamelize-keys "^1.0.0" + loud-rejection "^1.0.0" + minimist-options "^3.0.1" + normalize-package-data "^2.3.4" + read-pkg-up "^3.0.0" + redent "^2.0.0" + trim-newlines "^2.0.0" + yargs-parser "^10.0.0" + +meow@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.0.tgz#0fcaa267e35e4d58584b8205923df6021ddcc7ba" + integrity sha512-fNWkgM1UVMey2kf24yLiccxLihc5W+6zVus3/N0b+VfnJgxV99E9u04X6NAiKdg6ED7DAQBX5sy36NM0QJZkWA== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + merge-deep@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.2.tgz#f39fa100a4f1bd34ff29f7d2bf4508fbb8d83ad2" @@ -8288,7 +9781,7 @@ merge-stream@2.0.0, merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0: +merge2@^1.2.3, merge2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -8298,6 +9791,19 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= +microevent.ts@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" + integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== + +micromark@~2.11.0: + version "2.11.2" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.2.tgz#e8b6a05f54697d2d3d27fc89600c6bc40dd05f35" + integrity sha512-IXuP76p2uj8uMg4FQc1cRE7lPCLsfAXuEfdjtdO55VRiFO1asrCSQ5g43NmPqFtRwzEnEhafRVzn2jg0UiKArQ== + dependencies: + debug "^4.0.0" + parse-entities "^2.0.0" + micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -8372,6 +9878,11 @@ min-document@^2.19.0: dependencies: dom-walk "^0.1.0" +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + mini-create-react-context@^0.3.0: version "0.3.3" resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.3.3.tgz#b1b2bc6604d3a6c5d9752bad7692615410ebb38e" @@ -8415,14 +9926,31 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@^3.0.4: +minimatch@3.0.4, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist-options@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" + integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -8558,11 +10086,32 @@ multer@1.4.2: type-is "^1.6.4" xtend "^4.0.0" +multimap@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multimap/-/multimap-1.1.0.tgz#5263febc085a1791c33b59bb3afc6a76a2a10ca8" + integrity sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw== + +multimatch@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" + integrity sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== + dependencies: + "@types/minimatch" "^3.0.3" + array-differ "^3.0.0" + array-union "^2.1.0" + arrify "^2.0.1" + minimatch "^3.0.4" + mustache@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.0.1.tgz#d99beb031701ad433338e7ea65e0489416c854a2" integrity sha512-yL5VE97+OXn4+Er3THSmTdCFCtx5hHWzrolvH+JObZnUYwuaG7XV+Ch4fR2cIrcYI0tFHxS7iyFYl14bW8y2sA== +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + mz@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" @@ -8577,6 +10126,11 @@ nan@^2.12.1: resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== +nanoid@^3.1.20: + version "3.1.20" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -8701,12 +10255,12 @@ node-notifier@^6.0.0: shellwords "^0.1.1" which "^1.3.1" -node-releases@^1.1.67: +node-releases@^1.1.52, node-releases@^1.1.67: version "1.1.67" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.67.tgz#28ebfcccd0baa6aad8e8d4d8fe4cbc49ae239c12" integrity sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg== -normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -8716,6 +10270,16 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +normalize-package-data@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.0.tgz#1f8a7c423b3d2e85eb36985eaf81de381d01301a" + integrity sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw== + dependencies: + hosted-git-info "^3.0.6" + resolve "^1.17.0" + semver "^7.3.2" + validate-npm-package-license "^3.0.1" + normalize-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" @@ -8738,6 +10302,11 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= +normalize-selector@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03" + integrity sha1-0LFF62kRicY6eNIB3E/bEpPvDAM= + normalize-url@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" @@ -8813,7 +10382,7 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.8.0: +object-inspect@^1.8.0, object-inspect@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== @@ -8830,7 +10399,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0, object.assign@^4.1.1: +object.assign@^4.1.0, object.assign@^4.1.1, object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== @@ -8840,7 +10409,7 @@ object.assign@^4.1.0, object.assign@^4.1.1: has-symbols "^1.0.1" object-keys "^1.1.1" -object.entries@^1.1.0: +object.entries@^1.1.0, object.entries@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.3.tgz#c601c7f168b62374541a07ddbd3e2d5e4f7711a6" integrity sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg== @@ -8850,6 +10419,16 @@ object.entries@^1.1.0: es-abstract "^1.18.0-next.1" has "^1.0.3" +object.fromentries@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.3.tgz#13cefcffa702dc67750314a3305e8cb3fad1d072" + integrity sha512-IDUSMXs6LOSJBWE++L0lzIbSqHl9KDCfff2x/JSEIDtEUavUnyMYC2ZGay/04Zq4UT8lvd4xNhU4/YHKibAOlw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + has "^1.0.3" + object.getownpropertydescriptors@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz#0dfda8d108074d9c563e80490c883b6661091544" @@ -8866,7 +10445,7 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0: +object.values@^1.1.0, object.values@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== @@ -8919,6 +10498,14 @@ ono@^4.0.11: dependencies: format-util "^1.0.3" +open@^7.0.2: + version "7.3.0" + resolved "https://registry.yarnpkg.com/open/-/open-7.3.0.tgz#45461fdee46444f3645b6e14eb3ca94b82e1be69" + integrity sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + opener@^1.5.1: version "1.5.2" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" @@ -8944,6 +10531,18 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + original@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" @@ -8965,6 +10564,11 @@ os-locale@5.0.0: lcid "^3.0.0" mem "^5.0.0" +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" @@ -9086,6 +10690,37 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" +parse-entities@^1.0.2, parse-entities@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50" + integrity sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -9183,6 +10818,13 @@ path-to-regexp@2.4.0: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.4.0.tgz#35ce7f333d5616f1c1e1bfe266c3aba2e5b2e704" integrity sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w== +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -9216,12 +10858,17 @@ picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= -pify@^4.0.1: +pify@^4.0.0, pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== @@ -9241,6 +10888,13 @@ pkg-conf@^2.1.0: find-up "^2.0.0" load-json-file "^4.0.0" +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -9255,7 +10909,7 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pkg-up@3.1.0: +pkg-up@3.1.0, pkg-up@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== @@ -9269,6 +10923,18 @@ please-upgrade-node@^3.2.0: dependencies: semver-compare "^1.0.0" +plur@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/plur/-/plur-4.0.0.tgz#729aedb08f452645fe8c58ef115bf16b0a73ef84" + integrity sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg== + dependencies: + irregular-plurals "^3.2.0" + +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" @@ -9485,6 +11151,13 @@ postcss-gap-properties@^2.0.0: dependencies: postcss "^7.0.2" +postcss-html@^0.36.0: + version "0.36.0" + resolved "https://registry.yarnpkg.com/postcss-html/-/postcss-html-0.36.0.tgz#b40913f94eaacc2453fd30a1327ad6ee1f88b204" + integrity sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw== + dependencies: + htmlparser2 "^3.10.0" + postcss-image-set-function@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" @@ -9501,6 +11174,13 @@ postcss-initial@^3.0.0: lodash.template "^4.5.0" postcss "^7.0.2" +postcss-jsx@^0.36.0: + version "0.36.4" + resolved "https://registry.yarnpkg.com/postcss-jsx/-/postcss-jsx-0.36.4.tgz#37a68f300a39e5748d547f19a747b3257240bd50" + integrity sha512-jwO/7qWUvYuWYnpOb0+4bIIgJt7003pgU3P6nETBLaOyBXuTD55ho21xnals5nBrlpTIFodyd3/jBi6UO3dHvA== + dependencies: + "@babel/core" ">=7.2.2" + postcss-lab-function@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" @@ -9510,6 +11190,13 @@ postcss-lab-function@^2.0.1: postcss "^7.0.2" postcss-values-parser "^2.0.0" +postcss-less@^3.1.0, postcss-less@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-3.1.4.tgz#369f58642b5928ef898ffbc1a6e93c958304c5ad" + integrity sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA== + dependencies: + postcss "^7.0.14" + postcss-load-config@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" @@ -9535,6 +11222,14 @@ postcss-logical@^3.0.0: dependencies: postcss "^7.0.2" +postcss-markdown@^0.36.0: + version "0.36.0" + resolved "https://registry.yarnpkg.com/postcss-markdown/-/postcss-markdown-0.36.0.tgz#7f22849ae0e3db18820b7b0d5e7833f13a447560" + integrity sha512-rl7fs1r/LNSB2bWRhyZ+lM/0bwKv9fhl38/06gF6mKMo/NPnp55+K1dSTosSVjFZc0e1ppBlu+WT91ba0PMBfQ== + dependencies: + remark "^10.0.1" + unist-util-find-all-after "^1.0.2" + postcss-media-minmax@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" @@ -9542,6 +11237,11 @@ postcss-media-minmax@^4.0.0: dependencies: postcss "^7.0.2" +postcss-media-query-parser@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" + integrity sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ= + postcss-merge-longhand@^4.0.11: version "4.0.11" resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" @@ -9834,13 +11534,51 @@ postcss-replace-overflow-wrap@^3.0.0: dependencies: postcss "^7.0.2" -postcss-safe-parser@4.0.2: +postcss-reporter@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-6.0.1.tgz#7c055120060a97c8837b4e48215661aafb74245f" + integrity sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw== + dependencies: + chalk "^2.4.1" + lodash "^4.17.11" + log-symbols "^2.2.0" + postcss "^7.0.7" + +postcss-resolve-nested-selector@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" + integrity sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4= + +postcss-safe-parser@4.0.2, postcss-safe-parser@^4.0.0, postcss-safe-parser@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz#a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96" integrity sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g== dependencies: postcss "^7.0.26" +postcss-sass@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/postcss-sass/-/postcss-sass-0.3.5.tgz#6d3e39f101a53d2efa091f953493116d32beb68c" + integrity sha512-B5z2Kob4xBxFjcufFnhQ2HqJQ2y/Zs/ic5EZbCywCkxKd756Q40cIQ/veRDwSrw1BF6+4wUgmpm0sBASqVi65A== + dependencies: + gonzales-pe "^4.2.3" + postcss "^7.0.1" + +postcss-sass@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/postcss-sass/-/postcss-sass-0.4.4.tgz#91f0f3447b45ce373227a98b61f8d8f0785285a3" + integrity sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg== + dependencies: + gonzales-pe "^4.3.0" + postcss "^7.0.21" + +postcss-scss@^2.0.0, postcss-scss@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.1.1.tgz#ec3a75fa29a55e016b90bf3269026c53c1d2b383" + integrity sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA== + dependencies: + postcss "^7.0.6" + postcss-selector-matches@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" @@ -9857,7 +11595,7 @@ postcss-selector-not@^4.0.0: balanced-match "^1.0.0" postcss "^7.0.2" -postcss-selector-parser@^3.0.0: +postcss-selector-parser@^3.0.0, postcss-selector-parser@^3.1.0: version "3.1.2" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== @@ -9875,7 +11613,7 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: version "6.0.4" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== @@ -9885,6 +11623,22 @@ postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: uniq "^1.0.1" util-deprecate "^1.0.2" +postcss-sorting@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-sorting/-/postcss-sorting-4.1.0.tgz#a107f0bf3852977fa64e4442bc340c88d5aacdb3" + integrity sha512-r4T2oQd1giURJdHQ/RMb72dKZCuLOdWx2B/XhXN1Y1ZdnwXsKH896Qz6vD4tFy9xSjpKNYhlZoJmWyhH/7JUQw== + dependencies: + lodash "^4.17.4" + postcss "^7.0.0" + +postcss-sorting@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-sorting/-/postcss-sorting-5.0.1.tgz#10d5d0059eea8334dacc820c0121864035bc3f11" + integrity sha512-Y9fUFkIhfrm6i0Ta3n+89j56EFqaNRdUKqXyRp6kvTcSXnmgEjaVowCXH+JBe9+YKWqd4nc28r2sgwnzJalccA== + dependencies: + lodash "^4.17.14" + postcss "^7.0.17" + postcss-svgo@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" @@ -9895,6 +11649,11 @@ postcss-svgo@^4.0.2: postcss-value-parser "^3.0.0" svgo "^1.0.0" +postcss-syntax@^0.36.2: + version "0.36.2" + resolved "https://registry.yarnpkg.com/postcss-syntax/-/postcss-syntax-0.36.2.tgz#f08578c7d95834574e5593a82dfbfa8afae3b51c" + integrity sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w== + postcss-unique-selectors@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" @@ -9904,7 +11663,7 @@ postcss-unique-selectors@^4.0.1: postcss "^7.0.0" uniqs "^2.0.0" -postcss-value-parser@^3.0.0: +postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.0: version "3.3.1" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== @@ -9932,7 +11691,7 @@ postcss@7.0.32: source-map "^0.6.1" supports-color "^6.1.0" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.13, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.31, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7: version "7.0.35" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== @@ -9941,6 +11700,20 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2 source-map "^0.6.1" supports-color "^6.1.0" +postcss@^8.1.4, postcss@^8.1.6: + version "8.2.2" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.2.tgz#60613b62297005084fd21024a68637798864fe26" + integrity sha512-HM1NDNWLgglJPQQMNwvLxgH2KcrKZklKLi/xXYIOaqQB57p/pDWEJNS83PVICYsn1Dg/9C26TiejNr422/ePaQ== + dependencies: + colorette "^1.2.1" + nanoid "^3.1.20" + source-map "^0.6.1" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -9996,6 +11769,11 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -10128,7 +11906,7 @@ query-string@^4.1.0: object-assign "^4.1.0" strict-uri-encode "^1.0.0" -query-string@^6.0.0, query-string@^6.11.0: +query-string@^6.0.0, query-string@^6.11.0, query-string@^6.13.2: version "6.13.8" resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.8.tgz#8cf231759c85484da3cf05a851810d8e825c1159" integrity sha512-jxJzQI2edQPE/NPUOusNjO/ZOGqr1o2OBa/3M00fU76FsLXDVbJDv/p7ng5OdQyorKrkRz1oqfwmbe5MAMePQg== @@ -10152,6 +11930,16 @@ querystringify@^2.1.1: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== +quick-lru@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" + integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= + +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + raf@^3.1.0, raf@^3.3.2, raf@^3.4.0: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" @@ -10665,6 +12453,50 @@ react-copy-to-clipboard@^5.0.1: copy-to-clipboard "^3" prop-types "^15.5.8" +react-dev-inspector@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/react-dev-inspector/-/react-dev-inspector-1.1.4.tgz#32d5af126bdce93d153930eaabafcc63ac93e4c6" + integrity sha512-co+z6wgOHtbVmvY76/X00pShDXtzxrelkO1n44lpRbeQLIjRZskvDR+4GtXsnlYOABUO2lubGoJVjiqTkcrIkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.11.6" + "@babel/parser" "^7.11.5" + "@babel/traverse" "^7.11.5" + hotkeys-js "^3.8.1" + loader-utils "^2.0.0" + query-string "^6.13.2" + react-dev-utils "^10.2.1" + +react-dev-utils@^10.2.1: + version "10.2.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-10.2.1.tgz#f6de325ae25fa4d546d09df4bb1befdc6dd19c19" + integrity sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ== + dependencies: + "@babel/code-frame" "7.8.3" + address "1.1.2" + browserslist "4.10.0" + chalk "2.4.2" + cross-spawn "7.0.1" + detect-port-alt "1.1.6" + escape-string-regexp "2.0.0" + filesize "6.0.1" + find-up "4.1.0" + fork-ts-checker-webpack-plugin "3.1.1" + global-modules "2.0.0" + globby "8.0.2" + gzip-size "5.1.1" + immer "1.10.0" + inquirer "7.0.4" + is-root "2.1.0" + loader-utils "1.2.3" + open "^7.0.2" + pkg-up "3.1.0" + react-error-overlay "^6.0.7" + recursive-readdir "2.2.2" + shell-quote "1.7.2" + strip-ansi "6.0.0" + text-table "0.2.0" + react-dom@^16.12.0, react-dom@^16.13.1: version "16.14.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" @@ -10680,6 +12512,11 @@ react-error-overlay@6.0.7: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108" integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA== +react-error-overlay@^6.0.7: + version "6.0.8" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.8.tgz#474ed11d04fc6bda3af643447d85e9127ed6b5de" + integrity sha512-HvPuUQnLp5H7TouGq3kzBeioJmXms1wHy9EGjz2OURWBp4qZO6AfGEcnxts1D/CbwPLRAgTMPCEgYhA3sEM4vw== + react-fast-compare@^3.1.1: version "3.2.0" resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" @@ -10845,6 +12682,22 @@ react@^16.12.0, react@^16.13.1: object-assign "^4.1.1" prop-types "^15.6.2" +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + read-pkg-up@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" @@ -10862,6 +12715,15 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" @@ -10894,7 +12756,7 @@ read-pkg@^5.2.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@1.1.x: +readable-stream@1.1.x, readable-stream@^1.0.33, readable-stream@~1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= @@ -10904,7 +12766,7 @@ readable-stream@1.1.x: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: +readable-stream@3, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -10913,6 +12775,16 @@ readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +"readable-stream@>=1.0.33-1 <1.1.0-0": + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" @@ -10948,6 +12820,29 @@ realpath-native@^2.0.0: resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-2.0.0.tgz#7377ac429b6e1fd599dc38d08ed942d0d7beb866" integrity sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q== +recursive-readdir@2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + dependencies: + minimatch "3.0.4" + +redent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" + integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= + dependencies: + indent-string "^3.0.0" + strip-indent "^2.0.0" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + redeyed@~2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" @@ -11010,6 +12905,24 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexp-tree@^0.1.21, regexp-tree@~0.1.1: + version "0.1.21" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.21.tgz#55e2246b7f7d36f1b461490942fa780299c400d7" + integrity sha512-kUUXjX4AnqnR8KRTCrayAo9PzYMRKmVoGgaz2tBuz0MF3g1ZbGebmtW0yFHfFK9CmBjQKeYIgoL22pFLBJY7sw== + +regexp.prototype.flags@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" + integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +regexpp@^3.0.0, regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + regexpu-core@^4.7.1: version "4.7.1" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" @@ -11034,6 +12947,100 @@ regjsparser@^0.6.4: dependencies: jsesc "~0.5.0" +remark-parse@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-5.0.0.tgz#4c077f9e499044d1d5c13f80d7a98cf7b9285d95" + integrity sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA== + dependencies: + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^1.1.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^1.0.0" + vfile-location "^2.0.0" + xtend "^4.0.1" + +remark-parse@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-6.0.3.tgz#c99131052809da482108413f87b0ee7f52180a3a" + integrity sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg== + dependencies: + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^1.1.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^1.0.0" + vfile-location "^2.0.0" + xtend "^4.0.1" + +remark-parse@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" + integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== + dependencies: + mdast-util-from-markdown "^0.8.0" + +remark-stringify@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-6.0.4.tgz#16ac229d4d1593249018663c7bddf28aafc4e088" + integrity sha512-eRWGdEPMVudijE/psbIDNcnJLRVx3xhfuEsTDGgH4GsFF91dVhw5nhmnBppafJ7+NWINW6C7ZwWbi30ImJzqWg== + dependencies: + ccount "^1.0.0" + is-alphanumeric "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + longest-streak "^2.0.1" + markdown-escapes "^1.0.0" + markdown-table "^1.1.0" + mdast-util-compact "^1.0.0" + parse-entities "^1.0.2" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + stringify-entities "^1.0.1" + unherit "^1.0.4" + xtend "^4.0.1" + +remark-stringify@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-9.0.1.tgz#576d06e910548b0a7191a71f27b33f1218862894" + integrity sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg== + dependencies: + mdast-util-to-markdown "^0.6.0" + +remark@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/remark/-/remark-10.0.1.tgz#3058076dc41781bf505d8978c291485fe47667df" + integrity sha512-E6lMuoLIy2TyiokHprMjcWNJ5UxfGQjaMSMhV+f4idM625UjjK4j798+gPs5mfjzDE6vL0oFKVeZM6gZVSVrzQ== + dependencies: + remark-parse "^6.0.0" + remark-stringify "^6.0.0" + unified "^7.0.0" + +remark@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/remark/-/remark-13.0.0.tgz#d15d9bf71a402f40287ebe36067b66d54868e425" + integrity sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA== + dependencies: + remark-parse "^9.0.0" + remark-stringify "^9.0.0" + unified "^9.1.0" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -11044,11 +13051,16 @@ repeat-element@^1.1.2: resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.6.1: +repeat-string@^1.0.0, repeat-string@^1.5.4, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= +replace-ext@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= + request-promise-core@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" @@ -11096,6 +13108,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" @@ -11106,6 +13123,11 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= +reserved-words@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1" + integrity sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE= + resize-observer-polyfill@^1.5.0, resize-observer-polyfill@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" @@ -11155,7 +13177,7 @@ resolve@1.17.0: dependencies: path-parse "^1.0.6" -resolve@^1.10.0, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.8.1: +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.3.2, resolve@^1.8.1: version "1.19.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== @@ -11198,6 +13220,13 @@ rgba-regex@^1.0.0: resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -11377,6 +13406,11 @@ rsvp@^4.8.4: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== +run-async@^2.2.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + run-parallel@^1.1.9: version "1.1.10" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" @@ -11389,7 +13423,7 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^6.6.3: +rxjs@^6.5.3, rxjs@^6.6.3: version "6.6.3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== @@ -11413,6 +13447,13 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" +safe-regex@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" + integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== + dependencies: + regexp-tree "~0.1.1" + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -11531,7 +13572,7 @@ semver@^6.0.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.2: +semver@^7.2.1, semver@^7.3.2: version "7.3.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== @@ -11665,11 +13706,25 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +side-channel@^1.0.2, side-channel@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -11696,6 +13751,11 @@ sisteransi@^1.0.5: resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + slash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" @@ -11706,6 +13766,15 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + slice-ansi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" @@ -11875,6 +13944,11 @@ spdy@4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" +specificity@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019" + integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg== + speed-measure-webpack-plugin@1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.3.tgz#6ff894fc83e8a6310dde3af863a0329cd79da4f5" @@ -11894,6 +13968,13 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" +split2@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/split2/-/split2-0.2.1.tgz#02ddac9adc03ec0bb78c1282ec079ca6e85ae900" + integrity sha1-At2smtwD7Au3jBKC7Aecpuha6QA= + dependencies: + through2 "~0.6.1" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -11945,6 +14026,11 @@ stackframe@^1.1.1: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== +state-toggle@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" + integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -11990,6 +14076,14 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" +stream-combiner@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.2.2.tgz#aec8cbac177b56b6f4fa479ced8c1912cee52858" + integrity sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg= + dependencies: + duplexer "~0.1.1" + through "~2.3.4" + stream-each@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" @@ -12055,6 +14149,15 @@ string-width@^2.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + string-width@^4.1.0, string-width@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" @@ -12064,6 +14167,19 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string.prototype.matchall@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.3.tgz#24243399bc31b0a49d19e2b74171a15653ec996a" + integrity sha512-OBxYDA2ifZQ2e13cP82dWFMaCV9CGF8GzmN4fljBVw5O5wep0lu4gacm1OL6MjROoUnB8VbkWRThqkV2YFLNxw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + has-symbols "^1.0.1" + internal-slot "^1.0.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.3" + string.prototype.trimend@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" @@ -12099,6 +14215,16 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +stringify-entities@^1.0.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-1.3.2.tgz#a98417e5471fd227b3e45d3db1861c11caf668f7" + integrity sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A== + dependencies: + character-entities-html4 "^1.0.0" + character-entities-legacy "^1.0.0" + is-alphanumerical "^1.0.0" + is-hexadecimal "^1.0.0" + stringify-object@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" @@ -12129,7 +14255,7 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.2.0: +strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -12161,6 +14287,18 @@ strip-indent@^2.0.0: resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + style-loader@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-2.0.0.tgz#9669602fd4690740eaaec137799a03addbbc393c" @@ -12169,6 +14307,11 @@ style-loader@2.0.0: loader-utils "^2.0.0" schema-utils "^3.0.0" +style-search@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" + integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI= + stylehacks@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" @@ -12178,6 +14321,184 @@ stylehacks@^4.0.0: postcss "^7.0.0" postcss-selector-parser "^3.0.0" +stylelint-config-css-modules@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/stylelint-config-css-modules/-/stylelint-config-css-modules-2.2.0.tgz#8ed2a54b1bdf637219e37cdeea1950405fd022ff" + integrity sha512-+zjcDbot+zbuxy1UA31k4G2lUG+nHUwnLyii3uT2F09B8kT2YrT9LZYNfMtAWlDidrxr7sFd5HX9EqPHGU3WKA== + +stylelint-config-prettier@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/stylelint-config-prettier/-/stylelint-config-prettier-8.0.2.tgz#da9de33da4c56893cbe7e26df239a7374045e14e" + integrity sha512-TN1l93iVTXpF9NJstlvP7nOu9zY2k+mN0NSFQ/VEGz15ZIP9ohdDZTtCWHs5LjctAhSAzaILULGbgiM0ItId3A== + +stylelint-config-rational-order@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/stylelint-config-rational-order/-/stylelint-config-rational-order-0.1.2.tgz#4e98e390783d437f0ec41fb73bc41992e78d02a0" + integrity sha512-Qo7ZQaihCwTqijfZg4sbdQQHtugOX/B1/fYh018EiDZHW+lkqH9uHOnsDwDPGZrYJuB6CoyI7MZh2ecw2dOkew== + dependencies: + stylelint "^9.10.1" + stylelint-order "^2.2.1" + +stylelint-config-recommended@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz#e0e547434016c5539fe2650afd58049a2fd1d657" + integrity sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ== + +stylelint-config-standard@^20.0.0: + version "20.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-20.0.0.tgz#06135090c9e064befee3d594289f50e295b5e20d" + integrity sha512-IB2iFdzOTA/zS4jSVav6z+wGtin08qfj+YyExHB3LF9lnouQht//YyB0KZq9gGz5HNPkddHOzcY8HsUey6ZUlA== + dependencies: + stylelint-config-recommended "^3.0.0" + +stylelint-declaration-block-no-ignored-properties@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/stylelint-declaration-block-no-ignored-properties/-/stylelint-declaration-block-no-ignored-properties-2.3.0.tgz#98a641a137bf057c97ef3d3c4a848cd339e736da" + integrity sha512-0Ly/mKc3prAhxBSY5TbmMMDAkUHYMOxdmUu/mNcFvB6A53C24x5Rsu1Vtrik9bKPKwgd75sZUhV9ZsWerPbuJQ== + dependencies: + postcss "^7.0.27" + +stylelint-no-unsupported-browser-features@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-4.1.4.tgz#14c58167ba101ab5f1d26b98dd1a0d75c9e0a423" + integrity sha512-GORR+/z4KkWP9SWO4fLmC5WAIjDClShSfwCYTuAB9cT8GE+rtOXeAqw5RyXuN9BLIBAPjeO2W7LFIrWUH8x7FA== + dependencies: + doiuse "^4.3.1" + lodash "^4.17.15" + postcss "^8.1.4" + +stylelint-order@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/stylelint-order/-/stylelint-order-2.2.1.tgz#cd2d4a0d81d91c705f1d275a58487e5ad5aa5828" + integrity sha512-019KBV9j8qp1MfBjJuotse6MgaZqGVtXMc91GU9MsS9Feb+jYUvUU3Z8XiClqPdqJZQ0ryXQJGg3U3PcEjXwfg== + dependencies: + lodash "^4.17.10" + postcss "^7.0.2" + postcss-sorting "^4.1.0" + +stylelint-order@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/stylelint-order/-/stylelint-order-4.1.0.tgz#692d05b7d0c235ac66fcf5ea1d9e5f08a76747f6" + integrity sha512-sVTikaDvMqg2aJjh4r48jsdfmqLT+nqB1MOsaBnvM3OwLx4S+WXcsxsgk5w18h/OZoxZCxuyXMh61iBHcj9Qiw== + dependencies: + lodash "^4.17.15" + postcss "^7.0.31" + postcss-sorting "^5.0.1" + +stylelint@^13.7.0: + version "13.8.0" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.8.0.tgz#446765dbe25e3617f819a0165956faf2563ddc23" + integrity sha512-iHH3dv3UI23SLDrH4zMQDjLT9/dDIz/IpoFeuNxZmEx86KtfpjDOscxLTFioQyv+2vQjPlRZnK0UoJtfxLICXQ== + dependencies: + "@stylelint/postcss-css-in-js" "^0.37.2" + "@stylelint/postcss-markdown" "^0.36.2" + autoprefixer "^9.8.6" + balanced-match "^1.0.0" + chalk "^4.1.0" + cosmiconfig "^7.0.0" + debug "^4.2.0" + execall "^2.0.0" + fast-glob "^3.2.4" + fastest-levenshtein "^1.0.12" + file-entry-cache "^6.0.0" + get-stdin "^8.0.0" + global-modules "^2.0.0" + globby "^11.0.1" + globjoin "^0.1.4" + html-tags "^3.1.0" + ignore "^5.1.8" + import-lazy "^4.0.0" + imurmurhash "^0.1.4" + known-css-properties "^0.20.0" + lodash "^4.17.20" + log-symbols "^4.0.0" + mathml-tag-names "^2.1.3" + meow "^8.0.0" + micromatch "^4.0.2" + normalize-selector "^0.2.0" + postcss "^7.0.35" + postcss-html "^0.36.0" + postcss-less "^3.1.4" + postcss-media-query-parser "^0.2.3" + postcss-resolve-nested-selector "^0.1.1" + postcss-safe-parser "^4.0.2" + postcss-sass "^0.4.4" + postcss-scss "^2.1.1" + postcss-selector-parser "^6.0.4" + postcss-syntax "^0.36.2" + postcss-value-parser "^4.1.0" + resolve-from "^5.0.0" + slash "^3.0.0" + specificity "^0.4.1" + string-width "^4.2.0" + strip-ansi "^6.0.0" + style-search "^0.1.0" + sugarss "^2.0.0" + svg-tags "^1.0.0" + table "^6.0.3" + v8-compile-cache "^2.2.0" + write-file-atomic "^3.0.3" + +stylelint@^9.10.1: + version "9.10.1" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-9.10.1.tgz#5f0ee3701461dff1d68284e1386efe8f0677a75d" + integrity sha512-9UiHxZhOAHEgeQ7oLGwrwoDR8vclBKlSX7r4fH0iuu0SfPwFaLkb1c7Q2j1cqg9P7IDXeAV2TvQML/fRQzGBBQ== + dependencies: + autoprefixer "^9.0.0" + balanced-match "^1.0.0" + chalk "^2.4.1" + cosmiconfig "^5.0.0" + debug "^4.0.0" + execall "^1.0.0" + file-entry-cache "^4.0.0" + get-stdin "^6.0.0" + global-modules "^2.0.0" + globby "^9.0.0" + globjoin "^0.1.4" + html-tags "^2.0.0" + ignore "^5.0.4" + import-lazy "^3.1.0" + imurmurhash "^0.1.4" + known-css-properties "^0.11.0" + leven "^2.1.0" + lodash "^4.17.4" + log-symbols "^2.0.0" + mathml-tag-names "^2.0.1" + meow "^5.0.0" + micromatch "^3.1.10" + normalize-selector "^0.2.0" + pify "^4.0.0" + postcss "^7.0.13" + postcss-html "^0.36.0" + postcss-jsx "^0.36.0" + postcss-less "^3.1.0" + postcss-markdown "^0.36.0" + postcss-media-query-parser "^0.2.3" + postcss-reporter "^6.0.0" + postcss-resolve-nested-selector "^0.1.1" + postcss-safe-parser "^4.0.0" + postcss-sass "^0.3.5" + postcss-scss "^2.0.0" + postcss-selector-parser "^3.1.0" + postcss-syntax "^0.36.2" + postcss-value-parser "^3.3.0" + resolve-from "^4.0.0" + signal-exit "^3.0.2" + slash "^2.0.0" + specificity "^0.4.1" + string-width "^3.0.0" + style-search "^0.1.0" + sugarss "^2.0.0" + svg-tags "^1.0.0" + table "^5.0.0" + +sugarss@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sugarss/-/sugarss-2.0.0.tgz#ddd76e0124b297d40bf3cca31c8b22ecb43bc61d" + integrity sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ== + dependencies: + postcss "^7.0.2" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -12217,6 +14538,11 @@ svg-parser@^2.0.0: resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== +svg-tags@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" + integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q= + svgo@^1.0.0, svgo@^1.2.2: version "1.3.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" @@ -12246,6 +14572,26 @@ symbol-tree@^3.2.2: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== +table@^5.0.0: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +table@^6.0.3, table@^6.0.4: + version "6.0.7" + resolved "https://registry.yarnpkg.com/table/-/table-6.0.7.tgz#e45897ffbcc1bcf9e8a87bf420f2c9e5a7a52a34" + integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== + dependencies: + ajv "^7.0.2" + lodash "^4.17.20" + slice-ansi "^4.0.0" + string-width "^4.2.0" + tapable@1.1.3, tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" @@ -12338,7 +14684,7 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -text-table@^0.2.0: +text-table@0.2.0, text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= @@ -12362,6 +14708,14 @@ throat@^5.0.0: resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== +through2@^0.6.1, through2@^0.6.3, through2@~0.6.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -12370,7 +14724,14 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.8: +through2@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "3" + +"through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -12405,6 +14766,13 @@ tiny-warning@^1.0.0, tiny-warning@^1.0.3: resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -12491,16 +14859,58 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +trim-newlines@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" + integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= + +trim-newlines@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" + integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== + +trim-trailing-lines@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" + integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + tryer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== -tslib@^1.10.0, tslib@^1.9.0: +tsconfig-paths@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" + integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + +tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tsutils@^3.17.1: + version "3.18.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.18.0.tgz#38add50a28ec97e988cb43c5b32e55d1ff4a222a" + integrity sha512-D9Tu8nE3E7D1Bsf/V29oMHceMf+gnVO+pDguk/A5YRo1cLpkiQ48ZnbbS57pvvHeY+OIeNQx1vf4ASPlEtRpcA== + dependencies: + tslib "^1.8.1" + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -12523,6 +14933,13 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -12540,6 +14957,11 @@ type-fest@^0.11.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + type-fest@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" @@ -12580,7 +15002,7 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^4.1.2: +typescript@^4.0.2, typescript@^4.1.2: version "4.1.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== @@ -12639,6 +15061,14 @@ umi@^3.3.3: react "^16.13.1" resolve-cwd "3.0.0" +unherit@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" + integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== + dependencies: + inherits "^2.0.0" + xtend "^4.0.0" + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -12662,6 +15092,44 @@ unicode-property-aliases-ecmascript@^1.0.4: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== +unified@^6.1.2: + version "6.2.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-6.2.0.tgz#7fbd630f719126d67d40c644b7e3f617035f6dba" + integrity sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-plain-obj "^1.1.0" + trough "^1.0.0" + vfile "^2.0.0" + x-is-string "^0.1.0" + +unified@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-7.1.0.tgz#5032f1c1ee3364bd09da12e27fdd4a7553c7be13" + integrity sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw== + dependencies: + "@types/unist" "^2.0.0" + "@types/vfile" "^3.0.0" + bail "^1.0.0" + extend "^3.0.0" + is-plain-obj "^1.1.0" + trough "^1.0.0" + vfile "^3.0.0" + x-is-string "^0.1.0" + +unified@^9.1.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + union-value@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" @@ -12696,6 +15164,63 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" +unist-util-find-all-after@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-1.0.5.tgz#5751a8608834f41d117ad9c577770c5f2f1b2899" + integrity sha512-lWgIc3rrTMTlK1Y0hEuL+k+ApzFk78h+lsaa2gHf63Gp5Ww+mt11huDniuaoq1H+XMK2lIIjjPkncxXcDp3QDw== + dependencies: + unist-util-is "^3.0.0" + +unist-util-find-all-after@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz#fdfecd14c5b7aea5e9ef38d5e0d5f774eeb561f6" + integrity sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ== + dependencies: + unist-util-is "^4.0.0" + +unist-util-is@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" + integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== + +unist-util-is@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.4.tgz#3e9e8de6af2eb0039a59f50c9b3e99698a924f50" + integrity sha512-3dF39j/u423v4BBQrk1AQ2Ve1FxY5W3JKwXxVFzBODQ6WEvccguhgp802qQLKSnxPODE6WuRZtV+ohlUg4meBA== + +unist-util-remove-position@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz#ec037348b6102c897703eee6d0294ca4755a2020" + integrity sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A== + dependencies: + unist-util-visit "^1.1.0" + +unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz#3f37fcf351279dcbca7480ab5889bb8a832ee1c6" + integrity sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ== + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz#25e43e55312166f3348cae6743588781d112c1e9" + integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g== + dependencies: + unist-util-is "^3.0.0" + +unist-util-visit@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" + integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== + dependencies: + unist-util-visit-parents "^2.0.0" + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -12846,6 +15371,11 @@ uuid@^3.3.2, uuid@^3.4.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" + integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== + v8-to-istanbul@^4.1.3: version "4.1.4" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz#b97936f21c0e2d9996d4985e5c5156e9d4e49cd6" @@ -12887,6 +15417,56 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +vfile-location@^2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.6.tgz#8a274f39411b8719ea5728802e10d9e0dff1519e" + integrity sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA== + +vfile-message@*, vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile-message@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-1.1.1.tgz#5833ae078a1dfa2d96e9647886cd32993ab313e1" + integrity sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA== + dependencies: + unist-util-stringify-position "^1.1.1" + +vfile@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-2.3.0.tgz#e62d8e72b20e83c324bc6c67278ee272488bf84a" + integrity sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w== + dependencies: + is-buffer "^1.1.4" + replace-ext "1.0.0" + unist-util-stringify-position "^1.0.0" + vfile-message "^1.0.0" + +vfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-3.0.1.tgz#47331d2abe3282424f4a4bb6acd20a44c4121803" + integrity sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ== + dependencies: + is-buffer "^2.0.0" + replace-ext "1.0.0" + unist-util-stringify-position "^1.0.0" + vfile-message "^1.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + vm-browserify@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" @@ -13111,7 +15691,7 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -word-wrap@~1.2.3: +word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== @@ -13123,6 +15703,13 @@ worker-farm@^1.7.0: dependencies: errno "~0.1.7" +worker-rpc@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" + integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== + dependencies: + microevent.ts "~0.1.1" + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -13155,7 +15742,7 @@ write-file-atomic@2.4.1: imurmurhash "^0.1.4" signal-exit "^3.0.2" -write-file-atomic@^3.0.0: +write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== @@ -13165,6 +15752,13 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + ws@^6.0.0, ws@^6.1.2: version "6.2.1" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" @@ -13177,6 +15771,11 @@ ws@^7.0.0: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.2.tgz#782100048e54eb36fe9843363ab1c68672b261dd" integrity sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA== +x-is-string@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82" + integrity sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI= + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" @@ -13187,7 +15786,7 @@ xmlchars@^2.1.1: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xtend@^4.0.0, xtend@~4.0.1: +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -13197,6 +15796,11 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== +y18n@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -13225,6 +15829,18 @@ yargs-parser@18.1.3, yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== + dependencies: + camelcase "^4.1.0" + +yargs-parser@^20.2.2, yargs-parser@^20.2.3: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + yargs@15.4.1, yargs@^15.3.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" @@ -13242,6 +15858,19 @@ yargs@15.4.1, yargs@^15.3.1: y18n "^4.0.0" yargs-parser "^18.1.2" +yargs@^16.1.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" @@ -13268,3 +15897,8 @@ zscroller@~0.4.0: integrity sha512-G5NiNLKx2+QhhvZi2yV1jjVXY50otktxkseX2hG2N/eixohOUk0AY8ZpbAxNqS9oJS/NxItCsowupy2tsXxAMw== dependencies: babel-runtime "6.x" + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== -- GitLab