From cf0e4a7ad2584ad3cee8ce7f8b11e7ad81b1191d Mon Sep 17 00:00:00 2001 From: Tristan Yang Date: Tue, 27 Aug 2019 17:27:26 +0800 Subject: [PATCH] Initial commit --- .babelrc | 16 + .editorconfig | 19 + .eslintignore | 5 + .eslintrc | 32 + .gitignore | 23 + .huskyrc | 6 + .lintstagedrc | 3 + .npmrc | 2 + .prettierrc | 8 + CHANGELOG.md | 21 + README.md | 3 + README.zh.md | 29 + changelog.template.hbs | 36 + commitlint.config.js | 1 + config/env.js | 91 + config/paths.js | 53 + config/webpack.config.common.js | 118 + config/webpack.config.dev.js | 79 + config/webpack.config.prod.js | 77 + config/webpackDevServer.config.js | 75 + package-lock.json | 11922 ++++++++++++++++++ package.json | 80 + public/android-chrome-192x192.png | Bin 0 -> 15370 bytes public/android-chrome-512x512.png | Bin 0 -> 59323 bytes public/apple-launch-image.png | Bin 0 -> 14882 bytes public/apple-touch-icon.png | Bin 0 -> 13728 bytes public/favicon-16x16.png | Bin 0 -> 759 bytes public/favicon-32x32.png | Bin 0 -> 1564 bytes public/favicon.ico | Bin 0 -> 15406 bytes public/index.html | 123 + public/manifest.json | 15 + public/site.webmanifest | 1 + public/static/splash/ipad_splash.png | Bin 0 -> 9545 bytes public/static/splash/ipadpro1_splash.png | Bin 0 -> 10201 bytes public/static/splash/ipadpro2_splash.png | Bin 0 -> 12594 bytes public/static/splash/ipadpro3_splash.png | Bin 0 -> 10528 bytes public/static/splash/iphone5_splash.png | Bin 0 -> 6240 bytes public/static/splash/iphone6_splash.png | Bin 0 -> 6642 bytes public/static/splash/iphoneplus_splash.png | Bin 0 -> 8863 bytes public/static/splash/iphonex_splash.png | Bin 0 -> 8921 bytes public/static/splash/iphonexr_splash.png | Bin 0 -> 7296 bytes public/static/splash/iphonexsmax_splash.png | Bin 0 -> 9607 bytes public/sw.js | 3 + scripts/build.js | 145 + scripts/start.js | 114 + src/App.js | 17 + src/Global.style.js | 53 + src/assets/img/icon.png | Bin 0 -> 13728 bytes src/assets/img/weibo.png | Bin 0 -> 1745 bytes src/components/Footer.js | 11 + src/components/Header.js | 11 + src/index.js | 16 + src/registerServiceWorker.js | 113 + src/utils.js | 26 + 54 files changed, 13347 insertions(+) create mode 100644 .babelrc create mode 100644 .editorconfig create mode 100644 .eslintignore create mode 100644 .eslintrc create mode 100644 .gitignore create mode 100644 .huskyrc create mode 100644 .lintstagedrc create mode 100644 .npmrc create mode 100644 .prettierrc create mode 100644 CHANGELOG.md create mode 100644 README.md create mode 100644 README.zh.md create mode 100644 changelog.template.hbs create mode 100644 commitlint.config.js create mode 100644 config/env.js create mode 100644 config/paths.js create mode 100644 config/webpack.config.common.js create mode 100644 config/webpack.config.dev.js create mode 100644 config/webpack.config.prod.js create mode 100644 config/webpackDevServer.config.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100755 public/android-chrome-192x192.png create mode 100755 public/android-chrome-512x512.png create mode 100644 public/apple-launch-image.png create mode 100755 public/apple-touch-icon.png create mode 100755 public/favicon-16x16.png create mode 100755 public/favicon-32x32.png create mode 100755 public/favicon.ico create mode 100644 public/index.html create mode 100644 public/manifest.json create mode 100755 public/site.webmanifest create mode 100755 public/static/splash/ipad_splash.png create mode 100755 public/static/splash/ipadpro1_splash.png create mode 100755 public/static/splash/ipadpro2_splash.png create mode 100755 public/static/splash/ipadpro3_splash.png create mode 100755 public/static/splash/iphone5_splash.png create mode 100755 public/static/splash/iphone6_splash.png create mode 100755 public/static/splash/iphoneplus_splash.png create mode 100755 public/static/splash/iphonex_splash.png create mode 100755 public/static/splash/iphonexr_splash.png create mode 100755 public/static/splash/iphonexsmax_splash.png create mode 100644 public/sw.js create mode 100644 scripts/build.js create mode 100644 scripts/start.js create mode 100644 src/App.js create mode 100644 src/Global.style.js create mode 100755 src/assets/img/icon.png create mode 100644 src/assets/img/weibo.png create mode 100644 src/components/Footer.js create mode 100644 src/components/Header.js create mode 100644 src/index.js create mode 100644 src/registerServiceWorker.js create mode 100644 src/utils.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..5c8e82a --- /dev/null +++ b/.babelrc @@ -0,0 +1,16 @@ +{ + "presets": [ + [ + "@babel/preset-env", + { + "modules": false, + "corejs": 3, + "targets": { + "chrome": 60 + } + } + ], + "@babel/preset-react" + ], + "plugins": ["@babel/plugin-proposal-class-properties", "@babel/plugin-syntax-dynamic-import"] +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..93dd0d2 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,19 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*.md] +trim_trailing_whitespace = false + +[*.js] +trim_trailing_whitespace = true + +# Unix-style newlines with a newline ending every file +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +insert_final_newline = true +max_line_length = 100 \ No newline at end of file diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..f14c5c7 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,5 @@ +/scripts +/node_modules +/build +/.vscode +/public \ No newline at end of file diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..b302fea --- /dev/null +++ b/.eslintrc @@ -0,0 +1,32 @@ +{ + "extends": ["eslint:recommended", "plugin:react/recommended", "prettier"], + "plugins": ["react-hooks"], + "rules": { + "semi": 2, + "no-console": "off", + "react/prop-types": 0, + "no-unused-vars": ["error", { "ignoreRestSiblings": true }], + "react-hooks/rules-of-hooks": "error", + "react-hooks/exhaustive-deps": "warn", + "max-lines": ["warn", 400] + }, + "parser": "babel-eslint", + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module", + "ecmaFeatures": { + "jsx": true + } + }, + "env": { + "browser": true, + "node": true, + "es6": true, + "serviceworker": true + }, + "settings": { + "react": { + "version": "16.8" + } + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9507a83 --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +# dependencies +/node_modules +*/node_modules + +# testing +/coverage + +# production +/build +/dist + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +.idea diff --git a/.huskyrc b/.huskyrc new file mode 100644 index 0000000..5a1b2a8 --- /dev/null +++ b/.huskyrc @@ -0,0 +1,6 @@ +{ + "hooks": { + "commit-msg": "commitlint -E HUSKY_GIT_PARAMS", + "pre-commit": "lint-staged" + } +} diff --git a/.lintstagedrc b/.lintstagedrc new file mode 100644 index 0000000..4a920cc --- /dev/null +++ b/.lintstagedrc @@ -0,0 +1,3 @@ +{ + "src/**/*.{js,jsx}": ["eslint --fix", "git add"] +} diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..a2fc639 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +registry=https://registry.npm.taobao.org +engine-strict=true diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..a3c8d3b --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "printWidth": 100, + "singleQuote": true, + "bracketSpacing": true, + "jsxBracketSameLine": false, + "tabWidth": 2, + "semi": true +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..83067ad --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,21 @@ +# Changelog + +Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). + +## 1.0.1 - 2019-07-15 + +### Commits + +- docs: first blood [`649a8cb`](https://github.com/zerosoul/react-starter/commit/649a8cb3ffa064a8eb1d68b7b1baa4c3f07c0094) +- feat: add installedCheck and update packages [`8407a06`](https://github.com/zerosoul/react-starter/commit/8407a06048cacc90dca5699d57821c5a8e93d7cc) +- build: update packages [`da8ad8b`](https://github.com/zerosoul/react-starter/commit/da8ad8bc6e468538d300c35f5a51191cbfdb1507) +- chore: update packages [`626c164`](https://github.com/zerosoul/react-starter/commit/626c164b42184726fd4d16c782fad834ff7f98ab) +- fix: add installedCheck [`8a0ef02`](https://github.com/zerosoul/react-starter/commit/8a0ef028ecb74314fb4a8844bffab61eb23509a5) +- build: update packages [`4008cd2`](https://github.com/zerosoul/react-starter/commit/4008cd20d21c13fe1cc01ceb27c69482eea8604c) +- build: update packages [`180bd5c`](https://github.com/zerosoul/react-starter/commit/180bd5ca802265dff16a1f79e49f3df985697ded) +- feat: update packages [`33e927e`](https://github.com/zerosoul/react-starter/commit/33e927eab5e5b726413a240aa305b2b9bb589664) +- feat: disable AutoDllPlugin in dev [`eb72b1a`](https://github.com/zerosoul/react-starter/commit/eb72b1a3fd636c23c1b1d36d01e13bc3e1a6daa2) +- Initial commit [`c61a6fa`](https://github.com/zerosoul/react-starter/commit/c61a6faccb32fb7e30c9b198be4112dbcc49eee2) +- docs: readme [`086b511`](https://github.com/zerosoul/react-starter/commit/086b51158b96d7157454179585c2505469a26e5e) +- feat: remove pre push hooks [`9f4d9cc`](https://github.com/zerosoul/react-starter/commit/9f4d9ccf5d3a217b3f25594eabd3d96be7db4528) +- docs: remove image file [`e628e85`](https://github.com/zerosoul/react-starter/commit/e628e85e1b70db05cb911fe799183b245d792792) diff --git a/README.md b/README.md new file mode 100644 index 0000000..aa2de66 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# react-starter + +react webapp development scaffold for mobile and pc, with or without redux/router. diff --git a/README.zh.md b/README.zh.md new file mode 100644 index 0000000..841cd81 --- /dev/null +++ b/README.zh.md @@ -0,0 +1,29 @@ +# 项目名 + +[English Version](README.md) + +[项目名](https://xxx.com/) + +## 特性 + +### 功能 + +- [x] 已完成的 +- [ ] 未完成的 + +### 体验 + +- [x] 已具备的 + +## 技术栈 + +- [create-react-app](https://github.com/facebook/create-react-app): 大家都在用的 react 项目构建架子 +- [react](https://reactjs.org): 最流行的前端 UI 构建语言 +- redux + react-redux: 最流行的 react 状态管理解决方案 +- [styled-components](https://styled-components.com): react 中 css 解决方案,CSS-IN-JS 最佳实践 +- eslint + prettier: 为了更好地编码 +- husky + commitlint: 为了更好地 GIT 提交 + +## 更新日志 + +[更新日志](CHANGELOG.md) diff --git a/changelog.template.hbs b/changelog.template.hbs new file mode 100644 index 0000000..ec44184 --- /dev/null +++ b/changelog.template.hbs @@ -0,0 +1,36 @@ +# Changelog + +Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). + +{{#each releases}} +{{#if href}} +## [{{title}}]({{href}}){{#if tag}} - {{isoDate}}{{/if}} +{{else}} +## {{title}}{{#if tag}} - {{isoDate}}{{/if}} +{{/if}} + +{{#if summary}} +{{summary}} +{{/if}} + +{{#if merges}} +### Merged + +{{#each merges}} +- {{{message}}} {{#if href}}[`#{{id}}`]({{href}}){{/if}} +{{/each}} +{{/if}} + +{{#if fixes}} +### Fixed + +{{#each fixes}} +- {{{commit.subject}}}{{#each fixes}} {{#if href}}[`#{{id}}`]({{href}}){{/if}}{{/each}} +{{/each}} +{{/if}} + +{{#commit-list commits heading='### Commits'}} +- {{#if breaking}}**Breaking change:** {{/if}}{{{subject}}} {{#if href}}[`{{shorthash}}`]({{href}}){{/if}} +{{/commit-list}} + +{{/each}} diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000..422b194 --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1 @@ +module.exports = { extends: ['@commitlint/config-conventional'] }; diff --git a/config/env.js b/config/env.js new file mode 100644 index 0000000..905fb12 --- /dev/null +++ b/config/env.js @@ -0,0 +1,91 @@ +const fs = require("fs"); +const path = require("path"); +const paths = require("./paths"); + +// Make sure that including paths.js after env.js will read .env variables. +delete require.cache[require.resolve("./paths")]; + +const NODE_ENV = process.env.NODE_ENV; +if (!NODE_ENV) { + throw new Error( + "The NODE_ENV environment variable is required but was not specified." + ); +} + +// https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use +var dotenvFiles = [ + `${paths.dotenv}.${NODE_ENV}.local`, + `${paths.dotenv}.${NODE_ENV}`, + // Don't include `.env.local` for `test` environment + // since normally you expect tests to produce the same + // results for everyone + NODE_ENV !== "test" && `${paths.dotenv}.local`, + paths.dotenv +].filter(Boolean); + +// Load environment variables from .env* files. Suppress warnings using silent +// if this file is missing. dotenv will never modify any environment variables +// that have already been set. Variable expansion is supported in .env files. +// https://github.com/motdotla/dotenv +// https://github.com/motdotla/dotenv-expand +dotenvFiles.forEach(dotenvFile => { + if (fs.existsSync(dotenvFile)) { + require("dotenv-expand")( + require("dotenv").config({ + path: dotenvFile + }) + ); + } +}); + +// We support resolving modules according to `NODE_PATH`. +// This lets you use absolute paths in imports inside large monorepos: +// https://github.com/facebookincubator/create-react-app/issues/253. +// It works similar to `NODE_PATH` in Node itself: +// https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders +// Note that unlike in Node, only *relative* paths from `NODE_PATH` are honored. +// Otherwise, we risk importing Node.js core modules into an app instead of Webpack shims. +// https://github.com/facebookincubator/create-react-app/issues/1023#issuecomment-265344421 +// We also resolve them to make sure all tools using them work consistently. +const appDirectory = fs.realpathSync(process.cwd()); +process.env.NODE_PATH = (process.env.NODE_PATH || "") + .split(path.delimiter) + .filter(folder => folder && !path.isAbsolute(folder)) + .map(folder => path.resolve(appDirectory, folder)) + .join(path.delimiter); + +// Grab NODE_ENV and REACT_APP_* environment variables and prepare them to be +// injected into the application via DefinePlugin in Webpack configuration. +const REACT_APP = /^REACT_APP_/i; + +function getClientEnvironment(publicUrl) { + const raw = Object.keys(process.env) + .filter(key => REACT_APP.test(key)) + .reduce( + (env, key) => { + env[key] = process.env[key]; + return env; + }, + { + // Useful for determining whether we’re running in production mode. + // Most importantly, it switches React into the correct mode. + NODE_ENV: process.env.NODE_ENV || "development", + // Useful for resolving the correct path to static assets in `public`. + // For example, . + // This should only be used as an escape hatch. Normally you would put + // images into the `src` and `import` them in code to get their paths. + PUBLIC_URL: publicUrl + } + ); + // Stringify all values so we can feed into Webpack DefinePlugin + const stringified = { + "process.env": Object.keys(raw).reduce((env, key) => { + env[key] = JSON.stringify(raw[key]); + return env; + }, {}) + }; + + return { raw, stringified }; +} + +module.exports = getClientEnvironment; diff --git a/config/paths.js b/config/paths.js new file mode 100644 index 0000000..e4c7466 --- /dev/null +++ b/config/paths.js @@ -0,0 +1,53 @@ +const path = require("path"); +const fs = require("fs"); +const url = require("url"); + +// Make sure any symlinks in the project folder are resolved: +// https://github.com/facebookincubator/create-react-app/issues/637 +const appDirectory = fs.realpathSync(process.cwd()); +const resolveApp = relativePath => path.resolve(appDirectory, relativePath); + +const envPublicUrl = process.env.PUBLIC_URL; + +function ensureSlash(path, needsSlash) { + const hasSlash = path.endsWith("/"); + if (hasSlash && !needsSlash) { + return path.substr(path, path.length - 1); + } else if (!hasSlash && needsSlash) { + return `${path}/`; + } else { + return path; + } +} + +const getPublicUrl = appPackageJson => + envPublicUrl || require(appPackageJson).homepage; + +// We use `PUBLIC_URL` environment variable or "homepage" field to infer +// "public path" at which the app is served. +// Webpack needs to know it to put the right + diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 0000000..752b0cf --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "Memory Game", + "name": "Frontend Logo Memory Game", + "icons": [ + { + "src": "apple-touch-icon.png", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/png" + } + ], + "start_url": "./index.html", + "display": "standalone", + "theme_color": "#57647e", + "background_color": "#1fbcd2" +} diff --git a/public/site.webmanifest b/public/site.webmanifest new file mode 100755 index 0000000..45dc8a2 --- /dev/null +++ b/public/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/public/static/splash/ipad_splash.png b/public/static/splash/ipad_splash.png new file mode 100755 index 0000000000000000000000000000000000000000..c2e61b894b72ebb4e8cc929e067a089964588068 GIT binary patch literal 9545 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 literal 0 HcmV?d00001 diff --git a/public/static/splash/ipadpro2_splash.png b/public/static/splash/ipadpro2_splash.png new file mode 100755 index 0000000000000000000000000000000000000000..5f3fd05e8d836f775e96cb961b72717fbef7731e GIT binary patch literal 12594 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 F{y#pVP!<3H literal 0 HcmV?d00001 diff --git a/public/static/splash/ipadpro3_splash.png b/public/static/splash/ipadpro3_splash.png new file mode 100755 index 0000000000000000000000000000000000000000..c646854cc5d4296abe93d739289f3bd6f33ea591 GIT binary patch literal 10528 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 D2J&bI literal 0 HcmV?d00001 diff --git a/public/static/splash/iphone5_splash.png b/public/static/splash/iphone5_splash.png new file mode 100755 index 0000000000000000000000000000000000000000..a2863c453331427e536136195792c68e988eeee4 GIT binary patch literal 6240 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 XC~b38;B4gLKe-wYbngGShYI{JeeEce literal 0 HcmV?d00001 diff --git a/public/static/splash/iphone6_splash.png b/public/static/splash/iphone6_splash.png new file mode 100755 index 0000000000000000000000000000000000000000..f1955ca72f8bb3780e1b7bc59ec1104014820291 GIT binary patch literal 6642 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 RPyFkyhN`Yg>64f5{|C6RR5Jho literal 0 HcmV?d00001 diff --git a/public/static/splash/iphonex_splash.png b/public/static/splash/iphonex_splash.png new file mode 100755 index 0000000000000000000000000000000000000000..de56a34c14af9e6c97c13bfd831699a58bebf1a1 GIT binary patch literal 8921 zcmeI1WmHt%yTA`1BCUYpNJ)rv%#46aNymW1P}0aSAfSLqm!zaLgET7L4bmwiox>0g z-7Q_0_g(k%f8G1ukN15(oORYd&-2@B|IRu4!+wI*ROQJ@9*_V4K(44DqX7Un5CA~z ze~aLHBe&p)via2%R>I%3L1B%uF;KwlVW8~!G^6cVr`}Eu! zyF!$L5$>3zX&5E=F`PfYL0C6(vu@!0@{%ZZLJQ%eY4H)Se&q7I7XB* zL0C6T*)UqTipSQ9Ax*)|OVScI3_d7r)9K9-?#K_phHjsd&mWzVG>mv-ZRZZy56;NX zE(p$_;~$=1%pIPn+5~AJ{T{dFt6TYJt&rcW8SL8F)9L-q)Y9bbV*Bz2vc31VNR+H!7h=N zqIn{7w@%K9GBC>Tf;nOeU%18+ejg`J8N;g>C9EHz{oW}1A@V?+lnOOKo7K#aR{Pxh z%l_E~O>XPu)fHRz6vQiA+BsVOeT0hDCpBci?}HQkk}-n(F*a10PD;)kjQvs+;O@ZE zMYTV5O}~?l1+|Rx`4-8&i(EZE8~bzIw|n^1H(A^%Ny0szDZJ@XNF7IDB{V2Q${}uY z_k^isoG@oxFyyPUb!f^0XzB1&stiY;Jw;gG&mWexC2>1{m2i0HsBUEsHM{W{xBecp zq}GR{Y8s=jf0bOIDbSy?#zqy~ixD`0PYCXCjT=bi_U`FWYlt2ge zc4kkzrU+{O;i=e-qLrO=%y#C&R`k%O%&!@VUo%fSv1}3bntrM3{hrG&XnNNVTUP&6 ztnTJd?}iR+xMG*hn-+=lhV2Km!lwEAVBE7ZbRT=yow`>|hv(F)=ct-n9_H6@7Zu0{ z<%(3KDz^tEAuU|TmHn_1nTz*wmPxP&$DPXu@nf3?{W!9;Vd@Gre?&D?Q@KcYyl7o4 z!ZY@xbC`{jpLXX5M8D;@^22A{Qw&uYs$2|fZ0D2AJkj7h@Xs{uxCDp5SfAjq58m#s z7)STFc3I1${+LC<_Huc2u|i4_TYJ7*YQE=aoU@&iyOZ5lGrh?@fze%o^^@Bk2oga6 zU`kPxc>#C9ZnS*7{w)BX^ov~DT>QUo|5=zE;w1mB{CQP*2d?#xBS1{#_TQX6Z`&LH zn4+a+N=b3!FOJW-G2M&*0|(Y;nldD+CS&q{a4R_lJ~Ek|71t&Up@an^_04g z%CriQG^;Mg8b9%Z&8l#;K?xu=pA<~g)aVHBhU&T!mdSo`%#F!6)N5@m^NvE9b?;Za z^A=eq{ApNW}%{TS7-?*~43|?x>!%tX$;RZqo+q zgyGR87oCGWo^8N@pYERXS&-|Glo3P|(@Sz%yqhD2m#P0~wB)gsPri8v zZr#DTJHdXX^X(o{g60FXTZNbk|Mx6{9d=hC5mjS3#HVik0I%}Y;(Kid-|;S)nJ5nT zmnTHRyFUzhy%!O)A(1e}6-%$yOpT4p_pE!7^yW-c!XD#}_GaeJhx}3X@~>1GKL^a- zIA`J3-j_~f-@e!N)u~R+(kE@9W86t-%PB_xQ-+ZQnW&`?)83m=A?Df)k(pFlhnp^& zf@f6}Ru1}BwVoA8KB2R_(Dkl`!yyZ?!atznjk1nm9yTVn_)X7kWuoKyvKB|f&V@F| zHp@oAB;5WQgYg+7G(7zEw_&?1CAuc4CfN)sC7E{o49T3N5(OwfS6*ml{#M;8<%(Y71@ooEH z(lTm7LL_m z7GqPJmA3%O+7jD(7ad+%1tVq6GH1F|TUzifN{~Zz2yf}Rt1JPCEaLn9KERwnUh9LT zDz~6|vHRX-d(3X)RO$DQD59oX?5;2bliiW39VDT|-wr?-b$mk`{pDufZZ7uzE4nzRi-h1Ik^F z{ET#&9h|Jp7)j*3*5|keTa8uj9vBxB+!FUvFdr&{)k8|dUzYo4O+lZ`OVUYxrq>#d z_U&}pj$p)AAEj}(ku@Dhx`|7_tY(D(r|+{WdOALnZGyJe zg?+PYEFXgwocRx4ZCvSrI`>`oZP7hYA)E@ePaozBfeda}m8L7G@yZa?Nv*G^yvw5b zCa;y(1TZW;;C6ZV^r=@jTgVR$(9%k06f<+~IiEKLuoA>dwIrW~4BL!%DhAs;+ZU3x z@YUHJ10?0oRib@=q9$eR$GO^E?u{XXBmF(x0C#p^nxg&b3aXU@BlMt*Kt#di}yl3HMS`Qu|W(Tzk0*`o3@`U^_0xfkY?Wt%EYKcAp z1_-_N6coa1bliCpbI7RmU)FtzYTK-NLXb{i(b`F){jpN8W9bxdmT~RM>XCXzT!MJ@gdAh6D7M&uv#*zl21+sA2UkzYOjCwgQ z-3+`!@)F<5Rex7Bky?uu&}UlWXPPbEDf|8dfb_7J$~|8RDe@4Kd{`v5NZ5g z-5$X5%jUCfamGzX!QjL~GP+*T-h4&Tp6Dpb+;PgL-v)u2mEZ3}lfo4q z!apiQfCt)`4!VmWU$aouELxy+xv~%K4>75&C%Bf^>i|t4&AqezCe$zhUDDBm=Lea! zV~2+uTjCEC#7up*Q*!3llex<^A1u~C`Oa=^4lvZAKM*%cw%%E4@VZG`F~28z`fI0C6DXTO*VRfM(~#*$Klo?(2WQ zUNv$fcJ=vk$8QLAJ3o@Z@^fX{k#Dd}8fp?=&@*<1C6M6S?;;e-B^KVlE-VRl*uLNc z$=>CjpD@pcNi19lC1&ij}S@fNYvv!-ovJjkt`$Z+P((0AiZ@QQGN zM*h7dE_g;LPY<-T>yc_Y*+(c=mm(@^fj@B1TK1Dfd@Ta4fH)rac5ZKa%Id)?JclOp z$vV!?X?{Txp$9J_a~HHyhz3#J|A_~X&w2*OFi(5RX-bJ}C#q^b^MDk98H@VYD+47i zT*OxMnmMU`0(F(8@F`alf2r6k)l|ES3Nt{CzENk>xae3PhwdvGib5*xH1$%ZGY1UA zaV$mVY)bpXtb-ZUB=t`0Ibr4OsUWI$lbe##jb+Z+O@i(A^j*$N@)p%#7z&Y95dIRPK4DneLQE2+!h?jBPo4lZZ0AEnlDNnfP2Ykx1w_M(+Qw4_i; z6m@Z7A#HJ3eNunv<9XcIw|#s`!VUe{lFLv(IgXh&MW6J4g@6r7$RV@SCX|8$p6+FP z0^*54ji6mW{G;riQNi}>f=lftb%{=kx#cdr(s(NyVOH>UqU1}xfCd}jtpMd^mO^O` zU)J>N2Tw9|*xAFG2846Ki_<^2s9F6MrS~hiczOW4ug5&@LAkhSF_z@>jd*;WvG#EsAJ464qtcxgqN)*pNNtOaL0N zWAT=FzpL}6VWq4QT-gFg3|Y6fk^zrl24>ON%({cPJF9UM5!4VMnIpBB*im(x(|b%y zE>(XS0Qh)}y1yK+Z(uw7s?d>p1QY;H>O)-TvnXdYzlAZv<9W$BX>-ux_h`vQ8*8=A zoG{g5vWbA_HvtdbF02_z%9fH;{H8heoHcd@04NrU8PRT=n=evP(OTJi8Xl9SapcVb zFCOd0SzTR-Itfh+tOz;#5db1;6?&%Aole13aJkJoUd2-UI6NHwyp|$zrB8i23tj(B zCyV}iNNQIv;8JJln{q`in39!IN?kL^*#^($w(cqoM@3cOt0b zyR$p|04<3!C`QD3Gq0y$8O%ixNkH-|XW1(z&r%1mB`cakCP~4OtP~8p8h;`4| zv3fnfrYj(N3$D)f{;8!t!hqL4@pf_o9?sY#Jhl4E#n}hTU<|C6d^Ov}6A+S{k;Qz!=L$&2Pj; z6-=wSrnSyBzqZmC8GZr=&beQK;prTfo5J6^`XC2&T5*F&v7;y&*uo9m@8+j}IJLcl zAHnmvVw@#dsBgk(iE!;hN-gx9@f8K&Sqi3du=}nC3BVMepyiIq_}V}Fy| z0RSk+bS&Aq-`gh3u7llb{9JCeWQh7qsWo(Ncqdk+%f_k4=!o{9N1)FDAJUInsx8Tf z;`cVq&zL$AqoQ=^?ErxGCa?MpNOA_!)SBz7Fca(BR&aG69$@fOLU7aoL2~c7FgNVV zX-XP($Y}pp_7)$tn?PDwWhS`pOW3(lT+6rX`68Q&S`84dm~=H0zkc>?V)a`E15a5> zh71s=PjnqVcYoNg*Z-dRAPhir(2Mt6Dq0p8 z5mI)Em6pC57z`6}MhHy(EaszzsbRB^!~ZC1EuFQ)!Y)u%V7KF?4GHC@`@9s95d2@s z_(@Ki!}!w0q*>l{F;V<+rKFEK8I7W*+x@@D@%#dIUJqnu_!299ERFmY_A`vdY6d!U zWMI;22l7cStAJCXpxd`!8`(A|MS(cuq^!K&44WjPX02NTY=Bg_jun0=+>Yy6pTZyW zrsDA+U0S8Os{*lJH3LG4w%Hx%P|jTL z576;lf19ZD3j{mYaAtNfY}>myjM3|Ulvq1WE%6x!Fi5Pemol-hGP-?*L~ulz=AU%T zq|^)DA+)1+MoG(=3Rpf?e$5r(GN}CMkxYs19D(h=Rs8gm1#LVZ%f55`||EIG|~ zAJ#;M)To8f*yM(AjQD*Th{V)_JB^=oXNkaP;%Nkrb}HB~M1_xw3oCm0*snJL9UFhR z#P&ohD+JjcY?b_zK!9)2mOWz9bLlXX;HxxIzUi3eQs;&PgxJ9IE0P`k(hzzDthKp@e& ze)szHwK&X!M*4ce@1aD7WT3Yn{F)yW{-a`{lEa7%kK&+qMR+d z(1U%q25AjXQxk$6agvNa#5~p&koLSTbGc7mN-KIGqt1CPAPYyPBhX&6HcFlvg|3HL z)|>hu5dcre?^msn^YKhaunMrz$Bh8d^9Xzsij2B)r@WpD7k??lw|zHlxy~j+AZs?q z_|4aDn3uiW5n4ev7Ej>La#V1D(m-;n^1qHs%SDdd4OTyKMg(Y3H=X2gItbjGA_u!g{kdb%F zN-83p1SaAUr|IDt8lEpT5m{3j`C+Jukn3c2xCcrI^0EI{YI4>aZ z7%8%1W(mtK40A`HV|p98eVe&HS(F5kn`mF!5o%fBr&(^9|9IRLFS_M!SF5B}5Qh2v zQOpJyb_le#g}zSw%oeA}9y3i!Fn&+8(d$TQlrQy&BxLwI)W{tWC@-^%eEn(SH)S4s zR>gBckywVBBO#spW54n}+n9PEf`KLNswfsnRZw}1QoyRJtN;NdGL|TiH8~d z69|?7^z;qZ$BIJU8$G^yD$T{axm71IvcJFh6)qFv9zY-O??3$rAhn}smmoannLN`m zaU-2i*w{Iu{d~%*5lg$LE9F3)dO}!&-&IFGtdQW{#1{Sfo=M$JV`PvqxrfW8YDB30 zj3x(}px{syxiuJwzny1oxMB9G-g|mFsrc7LMn>xFKEY~ia@xbi(u#H(J_USTxzg<$ zvk!LWK1(!uc^;TO6c&sAZs}p}EAvumTh<)lX?LxOvK%wdCz}fG>TpS34#3xDttC!U z2F5h%w+xyQuW!Mt3;vW)w}sxR-z7D98nH*MtbEHD?=8y2VxdP}=4P`m`ipRE&Ce#w zA-95Y9~M^d*)Xb6L4VS zOmv=6rdOzOCS;KM(xa8Yi5!}+xccJ91Do)~!pWH4wygt~RP=q5?3e1;=X|RAin_n4 zAau`h7ESIAsF$py%FXZFUAMhPtPrLRj5oH&#NNJaEI!xNCl_p+=rD_RgX0@LRNc>? zocne3nP^jh%?yI&0h7GxHEn>pV5Wb!2k%c~eC2{~Ao87122ExOS{L>ob57%h4kB*Yk9#OOpa zg3(R%e!bti|L$7v`tE!0&+q(t);Z7F>)CrfXPvcnype$x4HY{T005xT(bg~q0Dxcs zfE+*pyvpz`G_nBz#D_+DrkWOZVSqO5<>e(MeERYdaH#~SS_1%3V*nKP`21q~~eFRy{C|k#bnO!(} z{`9FLuyU1%ziW!L^&4Bw*F{wp%JxxNba}!|V%Q91`-Fz74Qt{UiQ5<4KczW62ZGwh zKjLW)&dx1{N-c&Kgua%CK_QrpKL&2GhAz=&_TfC8pD7!L6Xta=+xx^QEP2y6mXDu7 zxma`Cu%-P|>be2iD$FD2*F>#Yndk!Y!YR^{N!q*#q9&}dV-$S_`aU%Mp=SbT@hoW@ zHeqI2-#PAD{uE{Ygz%e6k<>E9@Ep~^Og%`vky8v&{W$HXKCXghP2W_e($3w}a}o3m z{kv~`xec4gXTZvdh5h5}pC|a=)oOdeaC(BPN2eC~rNe{+w$4fBtReQaZlSnF$+*Hj zEuZAyhbOayt&BxRGtpC*=BT}TTaDjAEN$gaZe{)2a2@}B z3pvkOI$!jAE1+-Hc=)GM|2(L0u-8!X9qz`L&E43M4NBw~{pT*7=nr!BdCDPK3f-A5 z;Ti7VECVL=nyvKOEtHey#eS)Cj&2+dtQ~w=+G|)Me4N>F__F+B40kuB)glW1a46dN zbGXS!P}Gdd`z02<8e{1SRnN-)yZJSPCY=880&ivyPkIMeXR}~MlS+KWoob{wrZB=k zDKs|L%`fWNu-l{_k0ol6t8t3HY>K4>&5dl9E<&0PmRSrT%rmos+&zn&T+8iDr~ZhK z>fI?`Vq8*Xv>n1}^;h3$uh!1566mflf|pz5A-n=}pJ{{d$z3P|)94)5jU1EYVA!}K3{{!YCAH+i^%Fc1!^BEW5P zER}ZZH>!GoF|TSFFAp}(0g*zaBQn=psmo@*;tOS&ewxQi@tt2A*8>=FMs&PW{A)e@ zZ)3-KuvTAqfk`F9o+1}ba-{Ck6%y7l``N}|vd}d}zrii1k;8m)W%IMQq?gFJh>-LEf0)M51+H*hc`Js=fdEO!Ds9Nn{e zZJxDnD_`&hFPboWf?d|xn@q2N(#~}PBg4EKN<7~R99+lq=#L>$;QT0A;>C<;%;vWb zWB9OcuO|&7r(Ne?kL=FZ%aFyOvfZsEbEHR7p9rVl*V<&|yDG{R+m$>Wwfgm4$IZf zG4c!Yt=Mle`T?#B!r8SiMDTG$f%$eS;@r$CuA{x-T!ncqe)Qw3KM5e5U%{^KPBcJQ9 zgLq1X$9JvHG#DC5e~nHZt1eMQyFxOYB5(gF@%DVdcsts$G0Um9Q82QE!}Rsq37N`h zMzw=Ig|4h{SV$xGMEIB^X>^3umR|*{7(}}kaZlDO&?ax$Os|zWI~YIWXb)(|FV ziN4w2P+<9<+ZHHn%TTPNBG6KV9dF+pgf9*ayp_tHdr&;;cHA|1x$(3z=Qx~#BC zaxc38#_y#%1HvHLNpTPuHpFuX#cukd#Zc$(^61Y z3+$2+H0iZ?yr@3CR)%)Im65hucc$_Bph98ZuI9oU9PHz{z4l9F|A=_kYlNm>vp_*i zfUin&am+h1EIHPDt2IdH(Iro2jJ!g4tx>yx!E56n*_?fABHXVSn=rq)(zO1pU%0%Y8iEQzYfh( zHf!+5kBVjF5C*z=JD7U8m^;f6XnA6-7kpT>D%bkZ~4i?v<(m zNwc*=wYFJcI`XMd4)Z6Cy2sDvpht}>@gXkDuoU_)G>=kEZ1X6(4{|Edu-NrxzhPy2 z@|$dX=s~~-#wW4lV1)6wQ`GfLO+ne)a2s3+O@@12hrv)O_dw=l<&*iXP;bHK>nAR=ZL_MgSJV*wqMn5X%`2+O`#A@d5ceENP*7x5E6@2 z-nv)FBzQ!G^FJVui+k1o0RrZl6x@M!tncskU_O)H1g2`(q{ek0ur?&cqP&LPkJe5D zZk;~)BQkdnAfJ>CVekk@&XrDHIeT+A=Gl(y?+zFZF-!r#2AvS+Q!Rh+SSoqtVktXj zVg2!02{(JiBvJ2sX#)+Xm)WCvX}OrX?mUpc0ypB@Cq*!PVd`@-ja!|B2aqj^@{kEr zcV;>{IHT1}AB0+7s@Ntpb6THE!uQOYe3V4Oy^T{Nj$UUJ%Sco0?hmGox4JS;xt~PXIjh3jA=o=BbMyt{hie6D(YmxZeQXcTvg`ktFV^zuSikfw!VzV zW2;-$3$*tsG}q3+o}@qG)?8W%25mJ*z4)(23+^pKuN#-|CzNO)I^9<$#!=TdbZqBKfpvR{>N za3in^a*h*anA^g3a!pnZO?8{xa=idz-D>eeAmelK|M)oMsVY2VdMM1n zFTC#O5$Bo^vhKLsq;)|Gt{F#uM8#Q%_U^D8;nSFbn?R0B0|8)~?D?q1f|*>j0QZ9a zE|flwT&}3#^)6!?>be|y7hmrTe$)*Nj<(>)KwWQpoQG=(;pNYbdy&a_L}j@9t;+Z} zqv1gx)h^WhxvQ`z6ZgY>6Ym5}kj{kNn3-{2H(3?cNluv53RI>ViZeq7fKhZHPc!l9 zV1stG6(++!Rkw3{yy*x43(^o_Omz!-Y=csOdt-#CgNpAXin>4eaT~5hEe7IXdi4gT zJt=2|^NJmFH8i;C_E~LGej)GOx=9&it6M0I&mjOd*2;seh%sMa=9d`oM!>qJ6$(NhX5}K1P53f9)!^Kf!(!1g}EiAy{#A0Ao=u7J@9en?@sjw zssZp9D^C-RmxaIccNDItY~5U`X2U&B3?TB9tq`*U*S(czFx*BJv(2!zQwJdI7)jeL$K8zPP#1D7b$T``ES=<|sel}iQ8k&^wsO21P7c$3oO z(gqw@>ymq$VQQMpU0jGyLY!81z!0JKrpM!lZ*5V?GIZ~#@4CuI(jzC1I5BH{8b0CS zL9*VudaV0q#qm4IkjIC6IU5$z*=ifY7k|P53dsX$tgKw$?-(aFPOv_F^pvc6JoOB? zWlBQOj}sPI2M>)6n7p#G8q>Pfzhg3cj8KE^2=VIALk64swt zWoAh0+J=rd(pf2v7QbtVpokHAZu7k1SLA4%lbFtAsD^ zMl*jG-N-#96Y%bZCOGhHm`Ivm@{#{bBbt|Z>4s{J#q0)=fnlh&;?f5$8HtS{qDOnV zqfzW5k%@ji>da7sH-4-FI}>C@cm-vPBIoJ(9%!$3Yzx;*CI<*_67fkJr%Kn}bpk^&-Oy_!E zG0QV#sWW*Z_~-pjqU$qZ+$b_KLjNn>&C9&#uaHMge7S3-1{z!{0!3!F^e^4dftq6OvI9%%RkR*}S;BF1X!rQduEk z;QE&k!5o#qr1XrdoTJNK9`p+m&&n_KyIO`netbAQ9skh4@V$J|`B9}iA<4+zZ_Pj? zH8MOVmv#;eCp~rdFZe9c5P?6}U0rN5oV;t@?6We78pZ~-<^U&EJaJ19t9 zc&V+HOWq7c?qHZhvziw^-X&xt8xc~-t;O1UQU`@U>#_f~2&0IucNy785%RhQ;-)k9 zoU)5gbNtS$U!}P#7V6;-E(YO5h$(K1-_2@)cSfCE%n-m~PX6FTPa#koauVxIAEY!( zK9S%!xHK;Vx>h8I0ph6K)|?CB*+5tH?t25m8K>Ez@*U5noej=tr2;PC`Da|b%`{|N zVdTDb65xKWCL*lS65K~BsVuVb zpTvDm2cW~Rr9NiK?&mbO#+C#+oHVRKi()sDgldSzAiQl=Ur%nEudS+hzh5|j z7Lj{pGc~I|*WuS!sxQoCR;>Tt2*u_ztP?e>ewN~(ak2$kEk0s_^uT32qn|Q3GCoGG zoEkJKU`z~B9FHY9+sU%<(ui-V{I2S#{q^ATHYQ&M~e{dDcav-Jb_AAgr4Q?C)cZGrj;0qq1 zBfH{_b9zlH!&nGv&%Is`$~XTaX(>FjlyYJZs$3U~IO&gy|Gu3{AI7}+{<%a#^-$-B z7-{f$R+UPqq{K}MYsw3e9PD#>ePuB#=(~@|axv?+1_{CoJ5xH6v!6t$(cq_W0dNrZ z7XciMBAlEL;=@HI-zFu8(e2Y(rZ2nN;alQS>r38a`)=o+&XBEvUOd1;w|{=eeQP?E z>(fV7YW2XQ>JpEU)j*lH+A~N{sIQ4E3ulYH%Qkj6Xft4TRu$cbsc|#{Ek=38#;#; zZF0WU@Uaa>M$*VBa;#Dnw6=4cp3Ww^T9wPIA8IWv&V3pqKfPiAv@bkwj3O2bST1^W zzes~Q+0)T3sR4IJI~A1^y5+S)OQq#lI})3k?3LF-Hfv;~q!z#B)HQ%w(Mw6&{A$DV zT*v~vShJeOHhN;!)P!YxFDo^lf78ON0Baf*Iv>iC3-apqx z)|J>4-3i|E+=!Eiu_t%ag}|B~p;wgGCt!5#;xH7|m*IMrng{WJXkE!Pcm{GVx(cAm<|~iz3O3()JpI)>{c@eO)Wb+1&T}LT_5&x%&@=r0XdF z7q3uElVd(bvTu=~Kqcuc0Ubt7Nu6~5`P?zZd(j);us&gyUgehF0E5Me9BTtd*TBw6 zh7`<80@Tn^w^W|fKyZ{3@E&K*Sg9@X;tkn<+hJkq+n+Gk@ef-(^K;F(bLm2;u-t$szu#;c5pOLB#fPmO(i(Sv^~b}fcX)P= zXpc^ar*{u@oPv>mXnDUE7U}#UN2FHk2@bEsH>g#L=Y=Uykph zDeF{v^@+50@OE_G-th@Z!LT$US=&B@2sOkPQ>gGdjxudn?0tr+N3<3^lrgc764QJ6 zYt!)7K6%Cn+viHIlyXtOTs^z@_uV6x4vr>w4!FW=Zzh&aYw`4M?2=dX2?mxJr+t<5 z&X5R9yVZgxDITJz?B@-s*p{Q&Iy_$6KdxTdB>OUQ?Nh5zI8x3tWlxTRuz8?Z`s->F zj=p~QdQ>AvYPraVEWZ44_9oorhGB_!8LFGaN1RI~gNuf#VA*ofGn%6LcB9`n|qwx}x)nOpPmB1>+l; zv#Y+Hi{AKo(H{iHhGsdRgcp5=L3r6I6-dtXa`N=DbL+e%c3P)m`c70eM?s}P(Kp4A zd~_vROWTRFQGdav)b93Dh=KtT>|4}s$<`Jh5H2u zJ9!2g{qV5vwW~Lj?$_Y2p5DrvS=Q~JV#ADRr5B2Q$$!+9rxloN6qlgb8Kv_*hQ!=G_xAZG^imDEC0rWhcnqOLc`SKW@=>CShb$&wk6- zbek)HY0QKRuE!U`q*|k2Ld8tNAVe|UQ?BVBzELfZ=D?#q<%>c2AJn^((fzY){BH#@ zuB4lSlznz$LqH}$89@nTq1w`%hV@-X_iD450L_+n#lqZ4NjXODE1hG6&QnNr5ifX} zAUt5BmzRJa6>dm=DWhvYEtK?7GUpo3rO?=Aml|UqEe=q{%bqsXTk5k;DF5*26^OCI{FCEn+>LMHe7H1}_do2IcWlu<I^i+ceBmmhM6U5~=&f{~ADYtfb=qSwVVe+NYPWxw;MJ zKAUq*ofVK=Xq1q3sQ!{s*RX^uF@4yU;!z@#zIu{m$?mMRCyd?n&7csqI`x*!;>5!tWzviwX7#sPn*D3MF6> zsEaY|Z$`#L<-0BJuwU~K45&J3kMT11@!9bpRI2;8jgdVav)=mhQX3l&{X8LfmTxwQ zP8)giyCuwpm%RYKI5z08T?vLQLiPCzU7+Y8fL%(xBYV8xsj>0bgr)3Y+ElfeA*OHHJ2*+w0Jw{YafZH$tPD=m>-tF?VV|ci~Hrvfj%07#+m~8TJ2hZF*`UI4yyx3uC=CZ07bMexwT0llP z^KI8I58A_oYp?IA6LI(!HwxHmFaZ?e6rBr_@ zfAGw0b%`;_u3M^8fdxKulrjg+&*FhH(*(@#M(vxd0T5gk97I*tIHd zF-^o+5zyiqsHo|;2H-)GyKjha$bDxiiJncge({<^v3l;)F*3j}AiKzW7({vzKc4ge za{27b$vCrF1om8t71#dytv+-T%UBVciT17`Gjc!|Dn(9_P=M@~QF^XJ6}Otv?iW|p zA+x?aKI2pomDcPnpO}CFERyVl+|+)Y#+`@f2xWUc9m@-8qPT$q)ngB$FS^^>t`Cwl zAwzpb{)IojJemmL<_C!toLbwIO)zf8gnqR53~_nEAc2QueGLkP3x9DeS<97L`_m<~ zqxC1!ZPN`Gi7P^d<<8f8`?^w)u!{6G0~@RwclFvUGp{g}cmA}VjG!@fdPT(27cJ=N zepLr@*)A()$LiHJP`+M{`#nQF})%+5|MP3dLMNT&1pPQ~B)k zIwl3h37^;xtMy5z8+&vSVMPR3<{o#S+DXIOM?XTX@kn%`p|vQdNrXKFuo&0A^ETU4 zLRsC%f5izoPe`V9uJ_%LYESZD<3?I%-M~m_vZP))>4iwJ;KT3o*!uMH-D}#MAtG9 zi{C{=kO1MvQF;!VX9U^ydbIwAZMr4g@d^r8t_y>(IZ;84VNMT!w&CpS8=iV zHfz(w&5*Kyr)DfXw>QOt>+CgO3J45jA5Y%u;u~5NK3H%n<0oM) zs(6euJw77_w6;wbNR7dM=wNW@Ue7 z(aA=(?j$m0W64p!^Yp+;TxWJeJxgb;<1P&WD4g92aC&+rQ+@iL*8|%wR@)!TNvfA1 z<64ply;170&1xA+%Mmj0I#j5vbFQW;2z3um7paa{!6GB+#x96eMgt(#p&V55*(iQl zmyr40yO!**+K27^`CmIBC~#nQ!`2@kf1ZToJj*ZH69ah9bLo*_e9`aIV6@l(+Ma+B zJI^~2)Y;ANc-mLd`bRIZp1%y38(nr+S5=Y1biejfy$7y3qIG&wn^dGHrj=rCy73V{cN} z+Wf_lP8Zwx1K9@h=!St@{vbwUck2Y`b9)#7R?ypeb)oc&X~%pO=nvH}BH-$)kpHuI zE@1XNsmUSb!Gl5zq$5U2oVELD$#Nvaz?;e_px|&o+HJo3%q6(PXq8ap|TtImSK3eG`3@9s;3~5Vf#aQyomm-?k5CNq-kw&UFR^1_<~iNTdp!J9 zCLDB)aZ~e7SmfD^!o>D1_~nau+RR3j5coYjY}fOLoK;p6_E6U#4ztZaK&Ieua(mno zf5&@w$mY6Zlxk4jZ_Wu$QjT(XPohewS3R~E12Jd2!IZub z#*a1fzX#4&Qd~J%^oguFmauY6GHhS7QGy}yE#Po=Q75ciIO3iv-(3F;Ui5P|4C z8Mh`={B)SxM7H42D8nU>IdeR08ySj-2*>$kS zTZSjV8tvN%WI8RdrAA$77_DiTjQ;`4~M%Z=qV)0>7E2fA`1`k{Lk?#RXU z`>mJXxI7AI&0+^F;*2_1_E{CX;Uq_Ax0DlJBq~CH<;Mf_`K1k<8oxShDeLR+j0kNK z(Cj0?BbmE0=ErTH;^^Pad#59V77@-fZwXuPiAQ`wd$1y%XC!X`s(k`Z>LS6}<@ytS zeFm26m5pxF@JpLxIq;8}VPQy#BI=Bwlx*|0Oi^Q7Cs=}iwA-o+xr^4Dn3WaZq;4D0 zI|IxkoA>eieoPAO2VU?!I~|@#N$74cE-lP&fvR;HV|8XFZZFLjgRu*ZgMv@_ktAZg z>65I4aEoS3(Y2C8G`G-QJ7SJ@V~Z@xP3Rryj-}R&yM?~}%$`1Q*iT4fb|wV0X7;V4 zY58DHpD)_|?9latGXuZHCw z)%RtbYjDASxq`cB<&`ST{xzMY3$C_0TT0p{PoBg6M4?w6CP8nsQ^$g_&EoVN%B^9s zJ9H-+1koJ(uuUxp*vsFvXzz52WlqBMl;lx|Y$>vXJ%^M#J@F1O<+iTe?nR>{%*~oC z5IR-xdH$n4EUhjnLkez09qd8GR5NB%q3xD6817*kn^Pz?bngNP6`81y<)})^xCigQ zM-2y|hLF+9NBQuoZjy)A_~`@_J7PUFUUDlinWhGAAvn>$hKab}0(|4xw-iRx!sasnC?7}jE*+xwVe*CCOk zLv!m%v6ty3VDV_(RL~GnOjjtNxp1*=5%!u6Q40knI)E9g^0zv zE;XW%=!RSJuuEdISo!x3mqgC{?D+XYT_v2kn{6WRG~=5l_yG5DLCYGqOpngKw8QR$ zLUHMB%XRfz&aE_9B((-c4+=u}aZW4?)7!yp<@GM3nOD}x4zcYj9?cXVY`d8w)~@wR zL4ct{3dR}NQhO5H&MPQ>1AV3(a+H+-(y0A|)FePGC3X+q_H)7E5o+bRo z1#eHYR9QpKsmb-o>hpKK6`MXY;zONaZbC8oz}mpH!7_W_ae7sCMldBY`~qJBzU^&t z#{G3i1KbOgfjdhX5npb{VFW6`{3E97iEDw*+HWZtgvgev(Y+|9$FA5})fnkJqE^Iu ze)Vl-+*sA=;SnB5ez7k`i;R#gP>*sKFR)i3VnR^f8647kFD%^Z)u!>1^TStd%0c#^ zwh@zuC9HOwO?ppMjR#aw3y{IRKi`L5_N&4QO!L-#FTSYUORYjdHniQ0#)@1uWxwAV z`7uZQ)HdL;fV~=l$+@=;v-oU+!KqQFwNSTv`bX*Z&b;8ypypd6YQw}&aRHU$1>W=>>f^yrxcrY*=`WFoHL8cy2s)lkmj{3 z{@1*&jUY}KTV{{4jc(ZtIHKSy?gvWcciH6TNFXKt=A>0_6;En<)ErSO7Vlu0^|wai zv--4|Mqn@MWgw3m?4cSoedO$%MW^?@YYKShw^k9o=%BaF16po_*qTTxf2; z>R~Z&&QIMWqpy3Au$rk?Nnva_#CQ52%Tpw-PM54)!(F7^2BpuGrlt>trPk&_uQOw( zj*rSNy??vK>S`AtksvSWjXT=d(X2_kxw5;wSZ28TQtd_zk?WrTVVW6>=03Ck?JVzq z+8cHM-uL|5q3hox>3^g1_rB*}>HNj>7ti0T`2QmY{y)7`h}->z_~+$>Lf;wggyQo5 f+|~ZCbwoMnK>ZmC9JxjFPakzv9hD-brvd*3#fK+? literal 0 HcmV?d00001 diff --git a/public/sw.js b/public/sw.js new file mode 100644 index 0000000..4e4fe1e --- /dev/null +++ b/public/sw.js @@ -0,0 +1,3 @@ +self.addEventListener('fetch', function(event) { + event.respondWith(fetch(event.request)); +}); diff --git a/scripts/build.js b/scripts/build.js new file mode 100644 index 0000000..4e48156 --- /dev/null +++ b/scripts/build.js @@ -0,0 +1,145 @@ +// Do this as the first thing so that any code reading it knows the right env. +process.env.BABEL_ENV = process.env.NODE_ENV || "production"; +process.env.NODE_ENV = process.env.NODE_ENV || "production"; + +// Makes the script crash on unhandled rejections instead of silently +// ignoring them. In the future, promise rejections that are not handled will +// terminate the Node.js process with a non-zero exit code. +process.on("unhandledRejection", err => { + throw err; +}); + +// Ensure environment variables are read. +require("../config/env"); + +const path = require("path"); +const chalk = require("chalk"); +const fs = require("fs-extra"); +const webpack = require("webpack"); +const config = require("../config/webpack.config.prod"); +const paths = require("../config/paths"); +const checkRequiredFiles = require("react-dev-utils/checkRequiredFiles"); +const formatWebpackMessages = require("react-dev-utils/formatWebpackMessages"); +const printHostingInstructions = require("react-dev-utils/printHostingInstructions"); +const FileSizeReporter = require("react-dev-utils/FileSizeReporter"); +const printBuildError = require("react-dev-utils/printBuildError"); + +const measureFileSizesBeforeBuild = + FileSizeReporter.measureFileSizesBeforeBuild; +const printFileSizesAfterBuild = FileSizeReporter.printFileSizesAfterBuild; +const useYarn = fs.existsSync(paths.yarnLockFile); + +// 文件体积过大提示:gzip & chunk +const WARN_AFTER_BUNDLE_GZIP_SIZE = 512 * 1024; +const WARN_AFTER_CHUNK_GZIP_SIZE = 1024 * 1024; + +// Warn and crash if required files are missing +if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) { + process.exit(1); +} + +// 首先读取当前build目录下的文件大小,以便后面作比较 +measureFileSizesBeforeBuild(paths.appBuild) + .then(previousFileSizes => { + // Remove all content but keep the directory so that + // if you're in it, you don't end up in Trash + fs.emptyDirSync(paths.appBuild); + // Merge with the public folder + copyPublicFolder(); + // Start the webpack build + return build(previousFileSizes); + }) + .then( + ({ stats, previousFileSizes, warnings }) => { + if (warnings.length) { + console.log(chalk.yellow("Compiled with warnings.\n")); + console.log(warnings.join("\n\n")); + console.log( + "\nSearch for the " + + chalk.underline(chalk.yellow("keywords")) + + " to learn more about each warning." + ); + console.log( + "To ignore, add " + + chalk.cyan("// eslint-disable-next-line") + + " to the line before.\n" + ); + } else { + console.log(chalk.green("Compiled successfully.\n")); + } + + console.log("File sizes after gzip:\n"); + printFileSizesAfterBuild( + stats, + previousFileSizes, + paths.appBuild, + WARN_AFTER_BUNDLE_GZIP_SIZE, + WARN_AFTER_CHUNK_GZIP_SIZE + ); + const appPackage = require(paths.appPackageJson); + const publicUrl = paths.publicUrl; + const publicPath = config.output.publicPath; + const buildFolder = path.relative(process.cwd(), paths.appBuild); + printHostingInstructions( + appPackage, + publicUrl, + publicPath, + buildFolder, + useYarn + ); + }, + err => { + console.log(chalk.red("Failed to compile.\n")); + printBuildError(err); + process.exit(1); + } + ); + +// Create the production build and print the deployment instructions. +function build(previousFileSizes) { + console.log("Creating an optimized production build..."); + + let compiler = webpack(config); + return new Promise((resolve, reject) => { + compiler.run((err, stats) => { + if (err) { + return reject(err); + } + const messages = formatWebpackMessages(stats.toJson({}, true)); + if (messages.errors.length) { + // Only keep the first error. Others are often indicative + // of the same problem, but confuse the reader with noise. + if (messages.errors.length > 1) { + messages.errors.length = 1; + } + return reject(new Error(messages.errors.join("\n\n"))); + } + if ( + process.env.CI && + (typeof process.env.CI !== "string" || + process.env.CI.toLowerCase() !== "false") && + messages.warnings.length + ) { + console.log( + chalk.yellow( + "\nTreating warnings as errors because process.env.CI = true.\n" + + "Most CI servers set it automatically.\n" + ) + ); + return reject(new Error(messages.warnings.join("\n\n"))); + } + return resolve({ + stats, + previousFileSizes, + warnings: messages.warnings + }); + }); + }); +} + +function copyPublicFolder() { + fs.copySync(paths.appPublic, paths.appBuild, { + dereference: true, + filter: file => file !== paths.appHtml + }); +} diff --git a/scripts/start.js b/scripts/start.js new file mode 100644 index 0000000..ebbc554 --- /dev/null +++ b/scripts/start.js @@ -0,0 +1,114 @@ +// Do this as the first thing so that any code reading it knows the right env. +process.env.BABEL_ENV = 'development'; +process.env.NODE_ENV = 'development'; + +// Makes the script crash on unhandled rejections instead of silently +// ignoring them. In the future, promise rejections that are not handled will +// terminate the Node.js process with a non-zero exit code. +process.on('unhandledRejection', err => { + throw err; +}); + +// Ensure environment variables are read. +require('../config/env'); + +const fs = require('fs'); +const chalk = require('chalk'); +const webpack = require('webpack'); +const WebpackDevServer = require('webpack-dev-server'); +const clearConsole = require('react-dev-utils/clearConsole'); +const checkRequiredFiles = require('react-dev-utils/checkRequiredFiles'); +const { + choosePort, + createCompiler, + prepareProxy, + prepareUrls +} = require('react-dev-utils/WebpackDevServerUtils'); +const openBrowser = require('react-dev-utils/openBrowser'); +const paths = require('../config/paths'); +const config = require('../config/webpack.config.dev'); +const createDevServerConfig = require('../config/webpackDevServer.config'); + +const useYarn = fs.existsSync(paths.yarnLockFile); +const isInteractive = process.stdout.isTTY; +const installedCheck = require('installed-check-core'); + +// Warn and crash if required files are missing +if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) { + process.exit(1); +} + +// Tools like Cloud9 rely on this. +const DEFAULT_PORT = parseInt(process.env.PORT, 10) || 8088; +const HOST = process.env.HOST || '0.0.0.0'; +// 检查已安装的包和package.json中是否一致 +installedCheck({ versionCheck: true }).then(result => { + if (result.errors.length) { + let logStr = chalk.bgRed.bold( + 'Dependency check errors: \n\n' + result.errors.join('\n') + '\n' + ); + console.log(logStr); + let solveStr = chalk.bgGreenBright.bold( + 'try running: "npm install" to solve this error' + '\n' + ); + console.log(solveStr); + process.exit(1); + } +}); +if (process.env.HOST) { + console.log( + chalk.cyan( + `Attempting to bind to HOST environment variable: ${chalk.yellow( + chalk.bold(process.env.HOST) + )}` + ) + ); + console.log(`If this was unintentional, check that you haven't mistakenly set it in your shell.`); + console.log(`Learn more here: ${chalk.yellow('http://bit.ly/2mwWSwH')}`); + console.log(); +} + +// We attempt to use the default port but if it is busy, we offer the user to +// run on a different port. `choosePort()` Promise resolves to the next free port. +choosePort(HOST, DEFAULT_PORT) + .then(port => { + if (port == null) { + // We have not found a port. + return; + } + const protocol = process.env.HTTPS === 'true' ? 'https' : 'http'; + const appName = require(paths.appPackageJson).name; + const urls = prepareUrls(protocol, HOST, port); + // Create a webpack compiler that is configured with custom messages. + const compiler = createCompiler({ webpack, config, appName, urls, useYarn }); + // Load proxy config + const proxySetting = require(paths.appPackageJson).proxy; + const proxyConfig = prepareProxy(proxySetting, paths.appPublic); + // Serve webpack assets generated by the compiler over a web sever. + const serverConfig = createDevServerConfig(proxyConfig, urls.lanUrlForConfig); + const devServer = new WebpackDevServer(compiler, serverConfig); + // Launch WebpackDevServer. + devServer.listen(port, HOST, err => { + if (err) { + return console.log(err); + } + if (isInteractive) { + clearConsole(); + } + console.log(chalk.cyan('Starting the development server...\n')); + openBrowser(urls.localUrlForBrowser); + }); + + ['SIGINT', 'SIGTERM'].forEach(function(sig) { + process.on(sig, function() { + devServer.close(); + process.exit(); + }); + }); + }) + .catch(err => { + if (err && err.message) { + console.log(err.message); + } + process.exit(1); + }); diff --git a/src/App.js b/src/App.js new file mode 100644 index 0000000..87bec8d --- /dev/null +++ b/src/App.js @@ -0,0 +1,17 @@ +import React from 'react'; +import Header from './components/Header'; +import Footer from './components/Footer'; +import styled from 'styled-components'; +const StyledBody = styled.section` + height: 60vh; +`; +const App = () => { + return ( + <> +
+ body +