├── .babelrc ├── .editorconfig ├── .gitignore ├── .jshintrc ├── .vscode └── launch.json ├── LICENSE ├── README.md ├── config.js ├── data ├── data.js └── index.js ├── gulpfile.js ├── package.json ├── public ├── css │ └── main.css └── js │ └── index.js ├── sass ├── _config.scss ├── _global.sass ├── _mixins.scss ├── includes │ ├── _footer.scss │ └── _header.scss ├── main.scss └── pages │ └── index.scss ├── server.js └── views ├── error.pug ├── includes ├── footer.pug └── header.pug ├── index.pug └── layout └── layout.pug /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["es2015"] 3 | } 4 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | [*.md] 11 | trim_trailing_whitespace = false 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### Example user template template 2 | ### Example user template 3 | 4 | # IntelliJ project files 5 | .idea 6 | gen 7 | # Created by .ignore support plugin (hsz.mobi) 8 | node_modules 9 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | /* 3 | * ENVIRONMENTS 4 | * ================= 5 | */ 6 | 7 | // Define globals exposed by modern browsers. 8 | "browser": true, 9 | 10 | // Define globals exposed by jQuery. 11 | "jquery": true, 12 | 13 | // Define globals exposed by Node.js. 14 | "node": true, 15 | 16 | // Allow ES6. 17 | "esnext": true, 18 | 19 | /* 20 | * ENFORCING OPTIONS 21 | * ================= 22 | */ 23 | 24 | // Force all variable names to use either camelCase style or UPPER_CASE 25 | // with underscores. 26 | "camelcase": true, 27 | 28 | // Prohibit use of == and != in favor of === and !==. 29 | "eqeqeq": true, 30 | 31 | // Enforce tab width of 2 spaces. 32 | "indent": 2, 33 | 34 | // Prohibit use of a variable before it is defined. 35 | "latedef": true, 36 | 37 | // Enforce line length to 80 characters 38 | "maxlen": 80, 39 | 40 | // Require capitalized names for constructor functions. 41 | "newcap": true, 42 | 43 | // Enforce use of single quotation marks for strings. 44 | "quotmark": "single", 45 | 46 | // Enforce placing 'use strict' at the top function scope 47 | "strict": true, 48 | 49 | // Prohibit use of explicitly undeclared variables. 50 | "undef": true, 51 | 52 | // Warn when variables are defined but never used. 53 | "unused": true, 54 | 55 | /* 56 | * RELAXING OPTIONS 57 | * ================= 58 | */ 59 | 60 | // Suppress warnings about == null comparisons. 61 | "eqnull": true 62 | } 63 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Launch", 6 | "type": "node", 7 | "request": "launch", 8 | "program": "${workspaceRoot}/server.js", 9 | "stopOnEntry": false, 10 | "args": [], 11 | "cwd": "${workspaceRoot}", 12 | "preLaunchTask": null, 13 | "runtimeExecutable": null, 14 | "runtimeArgs": [ 15 | "--nolazy" 16 | ], 17 | "env": { 18 | "NODE_ENV": "development" 19 | }, 20 | "externalConsole": false, 21 | "sourceMaps": false, 22 | "outDir": null 23 | }, 24 | { 25 | "name": "Attach", 26 | "type": "node", 27 | "request": "attach", 28 | "port": 5858, 29 | "address": "localhost", 30 | "restart": false, 31 | "sourceMaps": false, 32 | "outDir": null, 33 | "localRoot": "${workspaceRoot}", 34 | "remoteRoot": null 35 | }, 36 | { 37 | "name": "Attach to Process", 38 | "type": "node", 39 | "request": "attach", 40 | "processId": "${command.PickProcess}", 41 | "port": 5858, 42 | "sourceMaps": false, 43 | "outDir": null 44 | } 45 | ] 46 | } 47 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 抹桥 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Express+BrowserSync+nodemon 2 | 3 | ## 使用(Use) 4 | ```bash 5 | npm install 6 | ``` 7 | 8 | ## 开发(dev) 9 | ```bash 10 | npm run dev 11 | ``` 12 | Express 会被 BrowserSync 代理到 5000 端口,同时提供本地 mock 功能, mock 数据存放在 data/data.js 里面,简单粗暴,就是一个 JSON 对象。当然也可以在 server 的 data/index.js 里面自定义更加详细的数据返回。 13 | ## 联调(dev api) 14 | ```bash 15 | npm run api 16 | ``` 17 | 在上一个命令的基础上,把 mock 数据由本地换为实际服务器地址,可以在 config.js 下面配置 18 | ```javascript 19 | module.exports = { 20 | 'port': 3000, 21 | 'remoteApi': '10.240.96.129:3008' //服务器地址 22 | } 23 | ``` 24 | ## 构建(dist) 25 | ```bash 26 | npm run dist 27 | ``` 28 | 打包压缩后的文件会存放在 public 文件夹下。 29 | 30 | Browser to localhost:5000 ,go dev! 31 | -------------------------------------------------------------------------------- /config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'port': 3000, 3 | 'remoteApi': '10.240.96.129:3008' 4 | } 5 | -------------------------------------------------------------------------------- /data/data.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '/loansss':{ 3 | 'name':'NetEase', 4 | 'age':'19', 5 | 'des':'HAHA' 6 | }, 7 | '/psddn': { 8 | "code": 0, 9 | "data": { 10 | "sss": true, 11 | }, 12 | "sss": "123", 13 | "redirect": 0 14 | }, 15 | '/loan/po': { 16 | 'pro': 'haha' 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /data/index.js: -------------------------------------------------------------------------------- 1 | var forceRequire = require('require-reload') 2 | 3 | module.exports = function (router) { 4 | var data = forceRequire('./data') 5 | //每隔1秒重新解析data,刷新data,新增的路由不会生效 6 | setInterval(function () { 7 | data = forceRequire('./data') 8 | }, 1000) 9 | 10 | for (var i in data) { 11 | (function (v) { 12 | router.get(v, function (req, res) { 13 | res.json( 14 | data[v] 15 | ) 16 | }) 17 | router.post(v, function (req, res) { 18 | res.json( 19 | data[v] 20 | ) 21 | }) 22 | })(i) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | // Modules dependencies 2 | var gulp = require('gulp') 3 | var sass = require('gulp-sass') 4 | var sourcemaps = require('gulp-sourcemaps') 5 | var browserSync = require('browser-sync') 6 | var bs = browserSync.create('My server') 7 | var nodemon = require('gulp-nodemon') 8 | var cssnano = require('gulp-cssnano') 9 | var uglify = require('gulp-uglify') 10 | var rename = require('gulp-rename') 11 | var config = require('./config') 12 | var path = require('path') 13 | 14 | // path 定义 15 | var basedir = './' 16 | var publicdir = './public' 17 | var filepath = { 18 | 'css': path.join(publicdir, 'css/**/*.css'), 19 | 'scss': path.join(basedir, 'sass/**/*.scss'), 20 | 'js': path.join(publicdir, 'js/**/*.js'), 21 | 'view': path.join(basedir,'views/**/*.pug') 22 | } 23 | 24 | // 编译 scss 25 | gulp.task('css', function () { 26 | return gulp.src(path.join(basedir,'sass/main.scss')) 27 | .pipe(sourcemaps.init()) 28 | .pipe(sass().on('error', sass.logError)) 29 | .pipe(sourcemaps.write()) 30 | .pipe(gulp.dest(path.join(publicdir,'css'))) 31 | .pipe(bs.stream()) 32 | }) 33 | 34 | // dev server 35 | // 启动 express 并添加 browserSync 支持 36 | gulp.task('dev:server', function () { 37 | nodemon({ 38 | script: 'server.js', 39 | ignore: ['.vscode', '.idea', 'node_modules'], 40 | env: { 41 | 'NODE_ENV': 'development' 42 | } 43 | }) 44 | bs.init(null, { 45 | proxy: 'http://localhost:' + config.port, 46 | files: [filepath.js, filepath.view], 47 | notify: false, 48 | open: true, 49 | port: 5000 50 | }) 51 | }) 52 | 53 | 54 | 55 | // 联调服务 56 | gulp.task('api:server', function () { 57 | nodemon({ 58 | script: 'server.js', 59 | ignore: ['.vscode', '.idea', 'node_modules'], 60 | env: { 61 | 'NODE_ENV': 'api', 62 | 'REMOTE_API': config.remoteApi 63 | } 64 | }) 65 | bs.init(null, { 66 | proxy: 'http://localhost:' + config.port, 67 | files: [filepath.js, filepath.view], 68 | notify: false, 69 | open: false, 70 | port: 5000 71 | }) 72 | }) 73 | 74 | gulp.task('cssmin', function () { 75 | return gulp.src(path.join(publicdir,'css/main.css')) 76 | .pipe(cssnano()) 77 | .pipe(rename({ 78 | suffix: '.min' 79 | })) 80 | .pipe(gulp.dest(path.join(publicdir,'css'))) 81 | }) 82 | 83 | gulp.task('jsmin', function () { 84 | return gulp.src(filepath.js) 85 | .pipe(uglify()) 86 | .pipe(rename({ 87 | suffix: '.min' 88 | })) 89 | .pipe(gulp.dest(path.join(publicdir,'js'))) 90 | }) 91 | 92 | gulp.task('build', ['cssmin', 'jsmin']) 93 | 94 | // watching 95 | gulp.task('watch', function () { 96 | gulp.watch(filepath.scss, ['css']) 97 | }) 98 | 99 | gulp.task('dev', ['dev:server', 'css', 'watch']) 100 | gulp.task('api', ['api:server', 'css', 'watch']) 101 | 102 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Express-Gulp-BrowserSync", 3 | "version": "0.1.1", 4 | "private": true, 5 | "scripts": { 6 | "dev": "gulp dev", 7 | "api": "gulp api", 8 | "dist": "gulp build" 9 | }, 10 | "author": { 11 | "name": "kisnows", 12 | "email": "yq12315@gmail.com", 13 | "url": "https://github.com/kisnows/Express-Gulp-BrowserSync" 14 | }, 15 | "devDependencies": { 16 | "browser-sync": "^2.13.0", 17 | "chalk": "^1.1.3", 18 | "express": "^4.14.0", 19 | "gulp": "^3.9.1", 20 | "gulp-cssnano": "^2.1.2", 21 | "gulp-nodemon": "^2.1.0", 22 | "gulp-rename": "^1.2.2", 23 | "gulp-sass": "^2.3.2", 24 | "gulp-sourcemaps": "^1.6.0", 25 | "gulp-uglify": "^1.5.4", 26 | "normalize.css": "^4.2.0", 27 | "pug": "^2.0.0-beta3", 28 | "request": "^2.73.0", 29 | "require-reload": "^0.2.2", 30 | "serve-favicon": "^2.3.0" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /public/css/main.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v3.0.2 | MIT License | git.io/normalize */ 2 | html { 3 | font-family: sans-serif; 4 | -ms-text-size-adjust: 100%; 5 | -webkit-text-size-adjust: 100%; } 6 | 7 | body { 8 | margin: 0; } 9 | 10 | article, 11 | aside, 12 | details, 13 | figcaption, 14 | figure, 15 | footer, 16 | header, 17 | hgroup, 18 | main, 19 | menu, 20 | nav, 21 | section, 22 | summary { 23 | display: block; } 24 | 25 | audio, 26 | canvas, 27 | progress, 28 | video { 29 | display: inline-block; 30 | vertical-align: baseline; } 31 | 32 | audio:not([controls]) { 33 | display: none; 34 | height: 0; } 35 | 36 | [hidden], 37 | template { 38 | display: none; } 39 | 40 | a { 41 | background-color: transparent; } 42 | 43 | a:active, 44 | a:hover { 45 | outline: 0; } 46 | 47 | abbr[title] { 48 | border-bottom: 1px dotted; } 49 | 50 | b, 51 | strong { 52 | font-weight: bold; } 53 | 54 | dfn { 55 | font-style: italic; } 56 | 57 | h1 { 58 | font-size: 2em; 59 | margin: 0.67em 0; } 60 | 61 | mark { 62 | background: #ff0; 63 | color: #000; } 64 | 65 | small { 66 | font-size: 80%; } 67 | 68 | sub, 69 | sup { 70 | font-size: 75%; 71 | line-height: 0; 72 | position: relative; 73 | vertical-align: baseline; } 74 | 75 | sup { 76 | top: -0.5em; } 77 | 78 | sub { 79 | bottom: -0.25em; } 80 | 81 | img { 82 | border: 0; } 83 | 84 | svg:not(:root) { 85 | overflow: hidden; } 86 | 87 | figure { 88 | margin: 1em 40px; } 89 | 90 | hr { 91 | -moz-box-sizing: content-box; 92 | box-sizing: content-box; 93 | height: 0; } 94 | 95 | pre { 96 | overflow: auto; } 97 | 98 | code, 99 | kbd, 100 | pre, 101 | samp { 102 | font-family: monospace, monospace; 103 | font-size: 1em; } 104 | 105 | button, 106 | input, 107 | optgroup, 108 | select, 109 | textarea { 110 | color: inherit; 111 | font: inherit; 112 | margin: 0; } 113 | 114 | button { 115 | overflow: visible; } 116 | 117 | button, 118 | select { 119 | text-transform: none; } 120 | 121 | button, 122 | html input[type="button"], 123 | input[type="reset"], 124 | input[type="submit"] { 125 | -webkit-appearance: button; 126 | cursor: pointer; } 127 | 128 | button[disabled], 129 | html input[disabled] { 130 | cursor: default; } 131 | 132 | button::-moz-focus-inner, 133 | input::-moz-focus-inner { 134 | border: 0; 135 | padding: 0; } 136 | 137 | input { 138 | line-height: normal; } 139 | 140 | input[type="checkbox"], 141 | input[type="radio"] { 142 | box-sizing: border-box; 143 | padding: 0; } 144 | 145 | input[type="number"]::-webkit-inner-spin-button, 146 | input[type="number"]::-webkit-outer-spin-button { 147 | height: auto; } 148 | 149 | input[type="search"] { 150 | -webkit-appearance: textfield; 151 | -moz-box-sizing: content-box; 152 | -webkit-box-sizing: content-box; 153 | box-sizing: content-box; } 154 | 155 | input[type="search"]::-webkit-search-cancel-button, 156 | input[type="search"]::-webkit-search-decoration { 157 | -webkit-appearance: none; } 158 | 159 | fieldset { 160 | border: 1px solid #c0c0c0; 161 | margin: 0 2px; 162 | padding: 0.35em 0.625em 0.75em; } 163 | 164 | legend { 165 | border: 0; 166 | padding: 0; } 167 | 168 | textarea { 169 | overflow: auto; } 170 | 171 | optgroup { 172 | font-weight: bold; } 173 | 174 | table { 175 | border-collapse: collapse; 176 | border-spacing: 0; } 177 | 178 | td, 179 | th { 180 | padding: 0; } 181 | 182 | body { 183 | line-height: 1.5; 184 | font-size: 14px; 185 | font-family: Tahoma, Arial, "Microsoft YaHei", sans-serif; 186 | color: #979798; } 187 | 188 | .content { 189 | width: 1200px; 190 | margin: 0 auto; } 191 | 192 | a { 193 | text-decoration: none; } 194 | 195 | li { 196 | list-style: none; } 197 | 198 | .page-index h1 { 199 | color: red; } 200 | 201 | /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5jc3MiLCJzb3VyY2VzIjpbIm1haW4uc2NzcyIsIl9ub3JtYWxpemUuc2NzcyIsIl9taXhpbnMuc2NzcyIsIl9jb25maWcuc2NzcyIsIl9nbG9iYWwuc2FzcyIsImluY2x1ZGVzL19oZWFkZXIuc2NzcyIsImluY2x1ZGVzL19mb290ZXIuc2NzcyIsInBhZ2VzL2luZGV4LnNjc3MiXSwic291cmNlc0NvbnRlbnQiOlsiQGltcG9ydCAnbm9ybWFsaXplJztcbkBpbXBvcnQgJ21peGlucyc7XG5AaW1wb3J0ICdjb25maWcnO1xuXG5AaW1wb3J0ICdnbG9iYWwnO1xuLy9pbmNsdWRlc1xuQGltcG9ydCAnaW5jbHVkZXMvX2hlYWRlcic7XG5AaW1wb3J0ICdpbmNsdWRlcy9fZm9vdGVyJztcblxuLy9wYWdlc1xuQGltcG9ydCAncGFnZXMvaW5kZXgnO1xuIiwiLyohIG5vcm1hbGl6ZS5jc3MgdjMuMC4yIHwgTUlUIExpY2Vuc2UgfCBnaXQuaW8vbm9ybWFsaXplICovXHJcblxyXG4vL1xyXG4vLyAxLiBTZXQgZGVmYXVsdCBmb250IGZhbWlseSB0byBzYW5zLXNlcmlmLlxyXG4vLyAyLiBQcmV2ZW50IGlPUyB0ZXh0IHNpemUgYWRqdXN0IGFmdGVyIG9yaWVudGF0aW9uIGNoYW5nZSwgd2l0aG91dCBkaXNhYmxpbmdcclxuLy8gICAgdXNlciB6b29tLlxyXG4vL1xyXG5cclxuaHRtbCB7XHJcbiAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7IC8vIDFcclxuICAtbXMtdGV4dC1zaXplLWFkanVzdDogMTAwJTsgLy8gMlxyXG4gIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTsgLy8gMlxyXG59XHJcblxyXG4vL1xyXG4vLyBSZW1vdmUgZGVmYXVsdCBtYXJnaW4uXHJcbi8vXHJcblxyXG5ib2R5IHtcclxuICBtYXJnaW46IDA7XHJcbn1cclxuXHJcbi8vIEhUTUw1IGRpc3BsYXkgZGVmaW5pdGlvbnNcclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuXHJcbi8vXHJcbi8vIENvcnJlY3QgYGJsb2NrYCBkaXNwbGF5IG5vdCBkZWZpbmVkIGZvciBhbnkgSFRNTDUgZWxlbWVudCBpbiBJRSA4LzkuXHJcbi8vIENvcnJlY3QgYGJsb2NrYCBkaXNwbGF5IG5vdCBkZWZpbmVkIGZvciBgZGV0YWlsc2Agb3IgYHN1bW1hcnlgIGluIElFIDEwLzExXHJcbi8vIGFuZCBGaXJlZm94LlxyXG4vLyBDb3JyZWN0IGBibG9ja2AgZGlzcGxheSBub3QgZGVmaW5lZCBmb3IgYG1haW5gIGluIElFIDExLlxyXG4vL1xyXG5cclxuLy9ub2luc3BlY3Rpb24gQUxMXHJcbmFydGljbGUsXHJcbmFzaWRlLFxyXG5kZXRhaWxzLFxyXG5maWdjYXB0aW9uLFxyXG5maWd1cmUsXHJcbmZvb3RlcixcclxuaGVhZGVyLFxyXG5oZ3JvdXAsXHJcbm1haW4sXHJcbm1lbnUsXHJcbm5hdixcclxuc2VjdGlvbixcclxuc3VtbWFyeSB7XHJcbiAgZGlzcGxheTogYmxvY2s7XHJcbn1cclxuXHJcbi8vXHJcbi8vIDEuIENvcnJlY3QgYGlubGluZS1ibG9ja2AgZGlzcGxheSBub3QgZGVmaW5lZCBpbiBJRSA4LzkuXHJcbi8vIDIuIE5vcm1hbGl6ZSB2ZXJ0aWNhbCBhbGlnbm1lbnQgb2YgYHByb2dyZXNzYCBpbiBDaHJvbWUsIEZpcmVmb3gsIGFuZCBPcGVyYS5cclxuLy9cclxuXHJcbmF1ZGlvLFxyXG5jYW52YXMsXHJcbnByb2dyZXNzLFxyXG52aWRlbyB7XHJcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrOyAvLyAxXHJcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOyAvLyAyXHJcbn1cclxuXHJcbi8vXHJcbi8vIFByZXZlbnQgbW9kZXJuIGJyb3dzZXJzIGZyb20gZGlzcGxheWluZyBgYXVkaW9gIHdpdGhvdXQgY29udHJvbHMuXHJcbi8vIFJlbW92ZSBleGNlc3MgaGVpZ2h0IGluIGlPUyA1IGRldmljZXMuXHJcbi8vXHJcblxyXG5hdWRpbzpub3QoW2NvbnRyb2xzXSkge1xyXG4gIGRpc3BsYXk6IG5vbmU7XHJcbiAgaGVpZ2h0OiAwO1xyXG59XHJcblxyXG4vL1xyXG4vLyBBZGRyZXNzIGBbaGlkZGVuXWAgc3R5bGluZyBub3QgcHJlc2VudCBpbiBJRSA4LzkvMTAuXHJcbi8vIEhpZGUgdGhlIGB0ZW1wbGF0ZWAgZWxlbWVudCBpbiBJRSA4LzkvMTEsIFNhZmFyaSwgYW5kIEZpcmVmb3ggPCAyMi5cclxuLy9cclxuXHJcbltoaWRkZW5dLFxyXG50ZW1wbGF0ZSB7XHJcbiAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuLy8gTGlua3NcclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuXHJcbi8vXHJcbi8vIFJlbW92ZSB0aGUgZ3JheSBiYWNrZ3JvdW5kIGNvbG9yIGZyb20gYWN0aXZlIGxpbmtzIGluIElFIDEwLlxyXG4vL1xyXG5cclxuYSB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XHJcbn1cclxuXHJcbi8vXHJcbi8vIEltcHJvdmUgcmVhZGFiaWxpdHkgd2hlbiBmb2N1c2VkIGFuZCBhbHNvIG1vdXNlIGhvdmVyZWQgaW4gYWxsIGJyb3dzZXJzLlxyXG4vL1xyXG5cclxuYTphY3RpdmUsXHJcbmE6aG92ZXIge1xyXG4gIG91dGxpbmU6IDA7XHJcbn1cclxuXHJcbi8vIFRleHQtbGV2ZWwgc2VtYW50aWNzXHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4vL1xyXG4vLyBBZGRyZXNzIHN0eWxpbmcgbm90IHByZXNlbnQgaW4gSUUgOC85LzEwLzExLCBTYWZhcmksIGFuZCBDaHJvbWUuXHJcbi8vXHJcblxyXG5hYmJyW3RpdGxlXSB7XHJcbiAgYm9yZGVyLWJvdHRvbTogMXB4IGRvdHRlZDtcclxufVxyXG5cclxuLy9cclxuLy8gQWRkcmVzcyBzdHlsZSBzZXQgdG8gYGJvbGRlcmAgaW4gRmlyZWZveCA0KywgU2FmYXJpLCBhbmQgQ2hyb21lLlxyXG4vL1xyXG5cclxuYixcclxuc3Ryb25nIHtcclxuICBmb250LXdlaWdodDogYm9sZDtcclxufVxyXG5cclxuLy9cclxuLy8gQWRkcmVzcyBzdHlsaW5nIG5vdCBwcmVzZW50IGluIFNhZmFyaSBhbmQgQ2hyb21lLlxyXG4vL1xyXG5cclxuZGZuIHtcclxuICBmb250LXN0eWxlOiBpdGFsaWM7XHJcbn1cclxuXHJcbi8vXHJcbi8vIEFkZHJlc3MgdmFyaWFibGUgYGgxYCBmb250LXNpemUgYW5kIG1hcmdpbiB3aXRoaW4gYHNlY3Rpb25gIGFuZCBgYXJ0aWNsZWBcclxuLy8gY29udGV4dHMgaW4gRmlyZWZveCA0KywgU2FmYXJpLCBhbmQgQ2hyb21lLlxyXG4vL1xyXG5cclxuaDEge1xyXG4gIGZvbnQtc2l6ZTogMmVtO1xyXG4gIG1hcmdpbjogMC42N2VtIDA7XHJcbn1cclxuXHJcbi8vXHJcbi8vIEFkZHJlc3Mgc3R5bGluZyBub3QgcHJlc2VudCBpbiBJRSA4LzkuXHJcbi8vXHJcblxyXG5tYXJrIHtcclxuICBiYWNrZ3JvdW5kOiAjZmYwO1xyXG4gIGNvbG9yOiAjMDAwO1xyXG59XHJcblxyXG4vL1xyXG4vLyBBZGRyZXNzIGluY29uc2lzdGVudCBhbmQgdmFyaWFibGUgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cclxuLy9cclxuXHJcbnNtYWxsIHtcclxuICBmb250LXNpemU6IDgwJTtcclxufVxyXG5cclxuLy9cclxuLy8gUHJldmVudCBgc3ViYCBhbmQgYHN1cGAgYWZmZWN0aW5nIGBsaW5lLWhlaWdodGAgaW4gYWxsIGJyb3dzZXJzLlxyXG4vL1xyXG5cclxuc3ViLFxyXG5zdXAge1xyXG4gIGZvbnQtc2l6ZTogNzUlO1xyXG4gIGxpbmUtaGVpZ2h0OiAwO1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XHJcbn1cclxuXHJcbnN1cCB7XHJcbiAgdG9wOiAtMC41ZW07XHJcbn1cclxuXHJcbnN1YiB7XHJcbiAgYm90dG9tOiAtMC4yNWVtO1xyXG59XHJcblxyXG4vLyBFbWJlZGRlZCBjb250ZW50XHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4vL1xyXG4vLyBSZW1vdmUgYm9yZGVyIHdoZW4gaW5zaWRlIGBhYCBlbGVtZW50IGluIElFIDgvOS8xMC5cclxuLy9cclxuXHJcbmltZyB7XHJcbiAgYm9yZGVyOiAwO1xyXG59XHJcblxyXG4vL1xyXG4vLyBDb3JyZWN0IG92ZXJmbG93IG5vdCBoaWRkZW4gaW4gSUUgOS8xMC8xMS5cclxuLy9cclxuXHJcbnN2Zzpub3QoOnJvb3QpIHtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG59XHJcblxyXG4vLyBHcm91cGluZyBjb250ZW50XHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4vL1xyXG4vLyBBZGRyZXNzIG1hcmdpbiBub3QgcHJlc2VudCBpbiBJRSA4LzkgYW5kIFNhZmFyaS5cclxuLy9cclxuXHJcbmZpZ3VyZSB7XHJcbiAgbWFyZ2luOiAxZW0gNDBweDtcclxufVxyXG5cclxuLy9cclxuLy8gQWRkcmVzcyBkaWZmZXJlbmNlcyBiZXR3ZWVuIEZpcmVmb3ggYW5kIG90aGVyIGJyb3dzZXJzLlxyXG4vL1xyXG5cclxuaHIge1xyXG4gIC1tb3otYm94LXNpemluZzogY29udGVudC1ib3g7XHJcbiAgYm94LXNpemluZzogY29udGVudC1ib3g7XHJcbiAgaGVpZ2h0OiAwO1xyXG59XHJcblxyXG4vL1xyXG4vLyBDb250YWluIG92ZXJmbG93IGluIGFsbCBicm93c2Vycy5cclxuLy9cclxuXHJcbnByZSB7XHJcbiAgb3ZlcmZsb3c6IGF1dG87XHJcbn1cclxuXHJcbi8vXHJcbi8vIEFkZHJlc3Mgb2RkIGBlbWAtdW5pdCBmb250IHNpemUgcmVuZGVyaW5nIGluIGFsbCBicm93c2Vycy5cclxuLy9cclxuXHJcbmNvZGUsXHJcbmtiZCxcclxucHJlLFxyXG5zYW1wIHtcclxuICBmb250LWZhbWlseTogbW9ub3NwYWNlLCBtb25vc3BhY2U7XHJcbiAgZm9udC1zaXplOiAxZW07XHJcbn1cclxuXHJcbi8vIEZvcm1zXHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4vL1xyXG4vLyBLbm93biBsaW1pdGF0aW9uOiBieSBkZWZhdWx0LCBDaHJvbWUgYW5kIFNhZmFyaSBvbiBPUyBYIGFsbG93IHZlcnkgbGltaXRlZFxyXG4vLyBzdHlsaW5nIG9mIGBzZWxlY3RgLCB1bmxlc3MgYSBgYm9yZGVyYCBwcm9wZXJ0eSBpcyBzZXQuXHJcbi8vXHJcblxyXG4vL1xyXG4vLyAxLiBDb3JyZWN0IGNvbG9yIG5vdCBiZWluZyBpbmhlcml0ZWQuXHJcbi8vICAgIEtub3duIGlzc3VlOiBhZmZlY3RzIGNvbG9yIG9mIGRpc2FibGVkIGVsZW1lbnRzLlxyXG4vLyAyLiBDb3JyZWN0IGZvbnQgcHJvcGVydGllcyBub3QgYmVpbmcgaW5oZXJpdGVkLlxyXG4vLyAzLiBBZGRyZXNzIG1hcmdpbnMgc2V0IGRpZmZlcmVudGx5IGluIEZpcmVmb3ggNCssIFNhZmFyaSwgYW5kIENocm9tZS5cclxuLy9cclxuXHJcbmJ1dHRvbixcclxuaW5wdXQsXHJcbm9wdGdyb3VwLFxyXG5zZWxlY3QsXHJcbnRleHRhcmVhIHtcclxuICBjb2xvcjogaW5oZXJpdDsgLy8gMVxyXG4gIGZvbnQ6IGluaGVyaXQ7IC8vIDJcclxuICBtYXJnaW46IDA7IC8vIDNcclxufVxyXG5cclxuLy9cclxuLy8gQWRkcmVzcyBgb3ZlcmZsb3dgIHNldCB0byBgaGlkZGVuYCBpbiBJRSA4LzkvMTAvMTEuXHJcbi8vXHJcblxyXG5idXR0b24ge1xyXG4gIG92ZXJmbG93OiB2aXNpYmxlO1xyXG59XHJcblxyXG4vL1xyXG4vLyBBZGRyZXNzIGluY29uc2lzdGVudCBgdGV4dC10cmFuc2Zvcm1gIGluaGVyaXRhbmNlIGZvciBgYnV0dG9uYCBhbmQgYHNlbGVjdGAuXHJcbi8vIEFsbCBvdGhlciBmb3JtIGNvbnRyb2wgZWxlbWVudHMgZG8gbm90IGluaGVyaXQgYHRleHQtdHJhbnNmb3JtYCB2YWx1ZXMuXHJcbi8vIENvcnJlY3QgYGJ1dHRvbmAgc3R5bGUgaW5oZXJpdGFuY2UgaW4gRmlyZWZveCwgSUUgOC85LzEwLzExLCBhbmQgT3BlcmEuXHJcbi8vIENvcnJlY3QgYHNlbGVjdGAgc3R5bGUgaW5oZXJpdGFuY2UgaW4gRmlyZWZveC5cclxuLy9cclxuXHJcbmJ1dHRvbixcclxuc2VsZWN0IHtcclxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcclxufVxyXG5cclxuLy9cclxuLy8gMS4gQXZvaWQgdGhlIFdlYktpdCBidWcgaW4gQW5kcm9pZCA0LjAuKiB3aGVyZSAoMikgZGVzdHJveXMgbmF0aXZlIGBhdWRpb2BcclxuLy8gICAgYW5kIGB2aWRlb2AgY29udHJvbHMuXHJcbi8vIDIuIENvcnJlY3QgaW5hYmlsaXR5IHRvIHN0eWxlIGNsaWNrYWJsZSBgaW5wdXRgIHR5cGVzIGluIGlPUy5cclxuLy8gMy4gSW1wcm92ZSB1c2FiaWxpdHkgYW5kIGNvbnNpc3RlbmN5IG9mIGN1cnNvciBzdHlsZSBiZXR3ZWVuIGltYWdlLXR5cGVcclxuLy8gICAgYGlucHV0YCBhbmQgb3RoZXJzLlxyXG4vL1xyXG5cclxuYnV0dG9uLFxyXG5odG1sIGlucHV0W3R5cGU9XCJidXR0b25cIl0sIC8vIDFcclxuaW5wdXRbdHlwZT1cInJlc2V0XCJdLFxyXG5pbnB1dFt0eXBlPVwic3VibWl0XCJdIHtcclxuICAtd2Via2l0LWFwcGVhcmFuY2U6IGJ1dHRvbjsgLy8gMlxyXG4gIGN1cnNvcjogcG9pbnRlcjsgLy8gM1xyXG59XHJcblxyXG4vL1xyXG4vLyBSZS1zZXQgZGVmYXVsdCBjdXJzb3IgZm9yIGRpc2FibGVkIGVsZW1lbnRzLlxyXG4vL1xyXG5cclxuYnV0dG9uW2Rpc2FibGVkXSxcclxuaHRtbCBpbnB1dFtkaXNhYmxlZF0ge1xyXG4gIGN1cnNvcjogZGVmYXVsdDtcclxufVxyXG5cclxuLy9cclxuLy8gUmVtb3ZlIGlubmVyIHBhZGRpbmcgYW5kIGJvcmRlciBpbiBGaXJlZm94IDQrLlxyXG4vL1xyXG5cclxuYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLFxyXG5pbnB1dDo6LW1vei1mb2N1cy1pbm5lciB7XHJcbiAgYm9yZGVyOiAwO1xyXG4gIHBhZGRpbmc6IDA7XHJcbn1cclxuXHJcbi8vXHJcbi8vIEFkZHJlc3MgRmlyZWZveCA0KyBzZXR0aW5nIGBsaW5lLWhlaWdodGAgb24gYGlucHV0YCB1c2luZyBgIWltcG9ydGFudGAgaW5cclxuLy8gdGhlIFVBIHN0eWxlc2hlZXQuXHJcbi8vXHJcblxyXG5pbnB1dCB7XHJcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcclxufVxyXG5cclxuLy9cclxuLy8gSXQncyByZWNvbW1lbmRlZCB0aGF0IHlvdSBkb24ndCBhdHRlbXB0IHRvIHN0eWxlIHRoZXNlIGVsZW1lbnRzLlxyXG4vLyBGaXJlZm94J3MgaW1wbGVtZW50YXRpb24gZG9lc24ndCByZXNwZWN0IGJveC1zaXppbmcsIHBhZGRpbmcsIG9yIHdpZHRoLlxyXG4vL1xyXG4vLyAxLiBBZGRyZXNzIGJveCBzaXppbmcgc2V0IHRvIGBjb250ZW50LWJveGAgaW4gSUUgOC85LzEwLlxyXG4vLyAyLiBSZW1vdmUgZXhjZXNzIHBhZGRpbmcgaW4gSUUgOC85LzEwLlxyXG4vL1xyXG5cclxuaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdLFxyXG5pbnB1dFt0eXBlPVwicmFkaW9cIl0ge1xyXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7IC8vIDFcclxuICBwYWRkaW5nOiAwOyAvLyAyXHJcbn1cclxuXHJcbi8vXHJcbi8vIEZpeCB0aGUgY3Vyc29yIHN0eWxlIGZvciBDaHJvbWUncyBpbmNyZW1lbnQvZGVjcmVtZW50IGJ1dHRvbnMuIEZvciBjZXJ0YWluXHJcbi8vIGBmb250LXNpemVgIHZhbHVlcyBvZiB0aGUgYGlucHV0YCwgaXQgY2F1c2VzIHRoZSBjdXJzb3Igc3R5bGUgb2YgdGhlXHJcbi8vIGRlY3JlbWVudCBidXR0b24gdG8gY2hhbmdlIGZyb20gYGRlZmF1bHRgIHRvIGB0ZXh0YC5cclxuLy9cclxuXHJcbmlucHV0W3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sXHJcbmlucHV0W3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xyXG4gIGhlaWdodDogYXV0bztcclxufVxyXG5cclxuLy9cclxuLy8gMS4gQWRkcmVzcyBgYXBwZWFyYW5jZWAgc2V0IHRvIGBzZWFyY2hmaWVsZGAgaW4gU2FmYXJpIGFuZCBDaHJvbWUuXHJcbi8vIDIuIEFkZHJlc3MgYGJveC1zaXppbmdgIHNldCB0byBgYm9yZGVyLWJveGAgaW4gU2FmYXJpIGFuZCBDaHJvbWVcclxuLy8gICAgKGluY2x1ZGUgYC1tb3pgIHRvIGZ1dHVyZS1wcm9vZikuXHJcbi8vXHJcblxyXG5pbnB1dFt0eXBlPVwic2VhcmNoXCJdIHtcclxuICAtd2Via2l0LWFwcGVhcmFuY2U6IHRleHRmaWVsZDsgLy8gMVxyXG4gIC1tb3otYm94LXNpemluZzogY29udGVudC1ib3g7XHJcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBjb250ZW50LWJveDsgLy8gMlxyXG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xyXG59XHJcblxyXG4vL1xyXG4vLyBSZW1vdmUgaW5uZXIgcGFkZGluZyBhbmQgc2VhcmNoIGNhbmNlbCBidXR0b24gaW4gU2FmYXJpIGFuZCBDaHJvbWUgb24gT1MgWC5cclxuLy8gU2FmYXJpIChidXQgbm90IENocm9tZSkgY2xpcHMgdGhlIGNhbmNlbCBidXR0b24gd2hlbiB0aGUgc2VhcmNoIGlucHV0IGhhc1xyXG4vLyBwYWRkaW5nIChhbmQgYHRleHRmaWVsZGAgYXBwZWFyYW5jZSkuXHJcbi8vXHJcblxyXG5pbnB1dFt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uLFxyXG5pbnB1dFt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uIHtcclxuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XHJcbn1cclxuXHJcbi8vXHJcbi8vIERlZmluZSBjb25zaXN0ZW50IGJvcmRlciwgbWFyZ2luLCBhbmQgcGFkZGluZy5cclxuLy9cclxuXHJcbmZpZWxkc2V0IHtcclxuICBib3JkZXI6IDFweCBzb2xpZCAjYzBjMGMwO1xyXG4gIG1hcmdpbjogMCAycHg7XHJcbiAgcGFkZGluZzogMC4zNWVtIDAuNjI1ZW0gMC43NWVtO1xyXG59XHJcblxyXG4vL1xyXG4vLyAxLiBDb3JyZWN0IGBjb2xvcmAgbm90IGJlaW5nIGluaGVyaXRlZCBpbiBJRSA4LzkvMTAvMTEuXHJcbi8vIDIuIFJlbW92ZSBwYWRkaW5nIHNvIHBlb3BsZSBhcmVuJ3QgY2F1Z2h0IG91dCBpZiB0aGV5IHplcm8gb3V0IGZpZWxkc2V0cy5cclxuLy9cclxuXHJcbmxlZ2VuZCB7XHJcbiAgYm9yZGVyOiAwOyAvLyAxXHJcbiAgcGFkZGluZzogMDsgLy8gMlxyXG59XHJcblxyXG4vL1xyXG4vLyBSZW1vdmUgZGVmYXVsdCB2ZXJ0aWNhbCBzY3JvbGxiYXIgaW4gSUUgOC85LzEwLzExLlxyXG4vL1xyXG5cclxudGV4dGFyZWEge1xyXG4gIG92ZXJmbG93OiBhdXRvO1xyXG59XHJcblxyXG4vL1xyXG4vLyBEb24ndCBpbmhlcml0IHRoZSBgZm9udC13ZWlnaHRgIChhcHBsaWVkIGJ5IGEgcnVsZSBhYm92ZSkuXHJcbi8vIE5PVEU6IHRoZSBkZWZhdWx0IGNhbm5vdCBzYWZlbHkgYmUgY2hhbmdlZCBpbiBDaHJvbWUgYW5kIFNhZmFyaSBvbiBPUyBYLlxyXG4vL1xyXG5cclxub3B0Z3JvdXAge1xyXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG59XHJcblxyXG4vLyBUYWJsZXNcclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuXHJcbi8vXHJcbi8vIFJlbW92ZSBtb3N0IHNwYWNpbmcgYmV0d2VlbiB0YWJsZSBjZWxscy5cclxuLy9cclxuXHJcbnRhYmxlIHtcclxuICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xyXG4gIGJvcmRlci1zcGFjaW5nOiAwO1xyXG59XHJcblxyXG50ZCxcclxudGgge1xyXG4gIHBhZGRpbmc6IDA7XHJcbn1cclxuIiwiQG1peGluIHNpemUoJHcsICRoKSB7XHJcbiAgd2lkdGg6ICR3O1xyXG4gIGhlaWdodDogJGg7XHJcbn1cclxuXHJcbkBtaXhpbiBpbWFnZS11cmwoJHBhdGgpIHtcclxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy4vaW1hZ2VzLyN7JHBhdGh9Jyk7XHJcbn1cclxuXHJcbkBtaXhpbiBjbGVhcmZpeCB7XHJcbiAgJjphZnRlciB7XHJcbiAgICBjb250ZW50OiBcIlwiO1xyXG4gICAgZGlzcGxheTogdGFibGU7XHJcbiAgICBjbGVhcjogYm90aDtcclxuICB9XHJcbiAgKnpvb206IDE7XHJcbn1cclxuXHJcbkBtaXhpbiBmbG9hdCgkZGlyZWN0aW9uKSB7XHJcbiAgZmxvYXQ6ICRkaXJlY3Rpb247XHJcbiAgKmRpc3BsYXk6IGlubGluZTtcclxufVxyXG5cclxuQG1peGluIG9wYWNpdHkoJG9wYWNpdHkpIHtcclxuICBmaWx0ZXI6IHVucXVvdGUoXCJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEoT3BhY2l0eT0je3JvdW5kKCRvcGFjaXR5ICogMTAwKX0pXCIpO1xyXG4gIG9wYWNpdHk6ICRvcGFjaXR5O1xyXG59XHJcblxyXG4vLyBNYWtlIGFuIGVsZW1lbnQgY29tcGxldGVseSB0cmFuc3BhcmVudC5cclxuQG1peGluIHRyYW5zcGFyZW50IHsgQGluY2x1ZGUgb3BhY2l0eSgwKTsgfVxyXG5cclxuQG1peGluIHRleHQtb3ZlcmZsb3cge1xyXG4gIG1heC13aWR0aCAgICAgOiAxMDAlO1xyXG4gIG92ZXJmbG93ICAgICAgOiBoaWRkZW47XHJcbiAgdGV4dC1vdmVyZmxvdyA6IGVsbGlwc2lzO1xyXG4gIHdoaXRlLXNwYWNlICAgOiBub3dyYXA7XHJcbn1cclxuXHJcbkBtaXhpbiB3b3JkLWJyZWFrIHtcclxuICB3b3JkLWJyZWFrICA6IGJyZWFrLWFsbDtcclxuICB3b3JkLXdyYXAgICA6IGJyZWFrLXdvcmQ7XHJcbiAgd2hpdGUtc3BhY2UgOiBub3JtYWw7XHJcbn1cclxuXHJcbkBtaXhpbiBib3JkZXItcmFkaXVzKCRyYWRpdXMpIHtcclxuICAtd2Via2l0LWJvcmRlci1yYWRpdXMgICA6ICRyYWRpdXM7XHJcbiAgLW1vei1ib3JkZXItcmFkaXVzICAgICAgOiAkcmFkaXVzO1xyXG4gIGJvcmRlci1yYWRpdXMgICAgICAgICAgIDogJHJhZGl1cztcclxufVxyXG5cclxuQG1peGluIGdyYWRpZW50KCRzdGFydDogIzAwMDAwMCwgJHN0b3A6ICNGRkZGRkYpIHtcclxuICBiYWNrZ3JvdW5kIDogKCRzdGFydCArICRzdG9wKS8yO1xyXG4gIGJhY2tncm91bmQgOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBjb2xvci1zdG9wKDAsICRzdGFydCksIGNvbG9yLXN0b3AoMSwgJHN0b3ApKTtcclxuICBiYWNrZ3JvdW5kIDogLW1vei1saW5lYXItZ3JhZGllbnQoY2VudGVyIHRvcCwgJHN0YXJ0IDAlLCAkc3RvcCAxMDAlKTtcclxuICBiYWNrZ3JvdW5kIDogLW1zLWxpbmVhci1ncmFkaWVudCh0b3AsICRzdGFydCwgJHN0b3ApO1xyXG4gIGZpbHRlciAgICAgOiB1bnF1b3RlKFwicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyN7JHN0YXJ0fScsIGVuZENvbG9yc3RyPScjeyRzdG9wfScsIEdyYWRpZW50VHlwZT0wKVwiKTtcclxufVxyXG4iLCIvLyBGb250PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuJGZvbnQ6IFRhaG9tYSwgQXJpYWwsIFwiTWljcm9zb2Z0IFlhSGVpXCIsIHNhbnMtc2VyaWYgIWRlZmF1bHQ7XG4kd2VzdGVybi1mb250OiBHZW9yZ2lhLCBDYW1icmlhLCBcIlRpbWVzIE5ldyBSb21hblwiLCBUaW1lcywgc2VyaWYgIWRlZmF1bHQ7XG5cbiRmb250LXNpemU6IDE0cHggIWRlZmF1bHQ7XG4kc21hbGwtZm9udC1zaXplOiAxMnB4ICFkZWZhdWx0O1xuJGgxLXNpemU6IDI0cHggIWRlZmF1bHQ7XG4kaDItc2l6ZTogMjBweCAhZGVmYXVsdDtcbiRoMy1zaXplOiAxOHB4ICFkZWZhdWx0O1xuJGg0LXNpemU6IDE2cHggIWRlZmF1bHQ7XG5cbi8vIENvbG9yPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4kdGV4dC1jb2xvcjogIzk3OTc5OCAhZGVmYXVsdDtcbiR0ZXh0LWRhcmstY29sb3I6ICMzMjMyMzIgIWRlZmF1bHQ7XG4kYm9keS1jb2xvcjogI2Y1ZjVmNSAhZGVmYXVsdDtcblxuJHdoaXRlOiAjZmZmO1xuJHJlZDogI2ViNjE2NTtcbiRncmF5OiAjZmJmYWY5O1xuJGRhcmstZ3JheTogI2Y3ZjZmNjtcbi8vb3RoZXI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4kY29udGVudC13aWR0aDogMTIwMHB4O1xuXG4vLyBNaXhpbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuQG1peGluIGlubGluZS1ibG9jaygkYWxpZ25tZW50OiBtaWRkbGUpIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBAaWYgJGFsaWdubWVudCBhbmQgJGFsaWdubWVudCAhPSBub25lIHtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogJGFsaWdubWVudDtcbiAgfVxuICB6b29tOiAxO1xuICAqICsgaHRtbCAmIHtcbiAgICBkaXNwbGF5OiBpbmxpbmU7XG4gIH1cbn1cbiIsImJvZHkge1xuICBsaW5lLWhlaWdodDogMS41O1xuICBmb250LXNpemU6ICRmb250LXNpemU7XG4gIGZvbnQtZmFtaWx5OiAkZm9udDtcbiAgY29sb3I6ICR0ZXh0LWNvbG9yOyB9XG4uY29udGVudCB7XG4gIHdpZHRoOiAxMjAwcHg7XG4gIG1hcmdpbjogMCBhdXRvOyB9XG5hIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9XG5saSB7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7IH1cbiIsIiIsIiIsIi5wYWdlLWluZGV4e1xuICBoMSB7XG4gICAgY29sb3I6IHJlZDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiQUNBQSw0REFBNEQ7QUFRNUQsQUFBQSxJQUFJLENBQUM7RUFDSCxXQUFXLEVBQUUsVUFBVztFQUN4QixvQkFBb0IsRUFBRSxJQUFLO0VBQzNCLHdCQUF3QixFQUFFLElBQUssR0FDaEM7O0FBTUQsQUFBQSxJQUFJLENBQUM7RUFDSCxNQUFNLEVBQUUsQ0FBRSxHQUNYOztBQWFELEFBQUEsT0FBTztBQUNQLEFBQUEsS0FBSztBQUNMLEFBQUEsT0FBTztBQUNQLEFBQUEsVUFBVTtBQUNWLEFBQUEsTUFBTTtBQUNOLEFBQUEsTUFB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 */ 202 | -------------------------------------------------------------------------------- /public/js/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by moqiao on 2016/7/19. 3 | */ 4 | window.onload = function(){ 5 | getData('/loansss') 6 | getData('/psddn') 7 | console.log('你早就该拒绝我') 8 | console.log('你早就该拒绝我') 9 | } 10 | 11 | function getData(url){ 12 | var xhr = new XMLHttpRequest 13 | xhr.responseType = 'json' 14 | xhr.onreadystatechange = function(){ 15 | if(this.readyState !== 4){ 16 | return 17 | } 18 | if(this.status === 200) { 19 | console.log(this.response) 20 | }else{ 21 | console.error(this.status) 22 | } 23 | } 24 | xhr.open('GET',url) 25 | xhr.send() 26 | } 27 | -------------------------------------------------------------------------------- /sass/_config.scss: -------------------------------------------------------------------------------- 1 | // Font================================================================================================= 2 | $font: Tahoma, Arial, "Microsoft YaHei", sans-serif !default; 3 | $western-font: Georgia, Cambria, "Times New Roman", Times, serif !default; 4 | 5 | $font-size: 14px !default; 6 | $small-font-size: 12px !default; 7 | $h1-size: 24px !default; 8 | $h2-size: 20px !default; 9 | $h3-size: 18px !default; 10 | $h4-size: 16px !default; 11 | 12 | // Color================================================================================================ 13 | $text-color: #979798 !default; 14 | $text-dark-color: #323232 !default; 15 | $body-color: #f5f5f5 !default; 16 | 17 | $white: #fff; 18 | $red: #eb6165; 19 | $gray: #fbfaf9; 20 | $dark-gray: #f7f6f6; 21 | //other================================================================================================= 22 | $content-width: 1200px; 23 | 24 | // Mixin================================================================================================ 25 | @mixin inline-block($alignment: middle) { 26 | display: inline-block; 27 | @if $alignment and $alignment != none { 28 | vertical-align: $alignment; 29 | } 30 | zoom: 1; 31 | * + html & { 32 | display: inline; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /sass/_global.sass: -------------------------------------------------------------------------------- 1 | body 2 | line-height: 1.5 3 | font-size: $font-size 4 | font-family: $font 5 | color: $text-color 6 | .content 7 | width: 1200px 8 | margin: 0 auto 9 | a 10 | text-decoration: none 11 | li 12 | list-style: none 13 | -------------------------------------------------------------------------------- /sass/_mixins.scss: -------------------------------------------------------------------------------- 1 | @mixin size($w, $h) { 2 | width: $w; 3 | height: $h; 4 | } 5 | 6 | @mixin image-url($path) { 7 | background-image: url('./images/#{$path}'); 8 | } 9 | 10 | @mixin clearfix { 11 | &:after { 12 | content: ""; 13 | display: table; 14 | clear: both; 15 | } 16 | *zoom: 1; 17 | } 18 | 19 | @mixin float($direction) { 20 | float: $direction; 21 | *display: inline; 22 | } 23 | 24 | @mixin opacity($opacity) { 25 | filter: unquote("progid:DXImageTransform.Microsoft.Alpha(Opacity=#{round($opacity * 100)})"); 26 | opacity: $opacity; 27 | } 28 | 29 | // Make an element completely transparent. 30 | @mixin transparent { @include opacity(0); } 31 | 32 | @mixin text-overflow { 33 | max-width : 100%; 34 | overflow : hidden; 35 | text-overflow : ellipsis; 36 | white-space : nowrap; 37 | } 38 | 39 | @mixin word-break { 40 | word-break : break-all; 41 | word-wrap : break-word; 42 | white-space : normal; 43 | } 44 | 45 | @mixin border-radius($radius) { 46 | -webkit-border-radius : $radius; 47 | -moz-border-radius : $radius; 48 | border-radius : $radius; 49 | } 50 | 51 | @mixin gradient($start: #000000, $stop: #FFFFFF) { 52 | background : ($start + $stop)/2; 53 | background : -webkit-gradient(linear, left top, left bottom, color-stop(0, $start), color-stop(1, $stop)); 54 | background : -moz-linear-gradient(center top, $start 0%, $stop 100%); 55 | background : -ms-linear-gradient(top, $start, $stop); 56 | filter : unquote("progid:DXImageTransform.Microsoft.gradient(startColorstr='#{$start}', endColorstr='#{$stop}', GradientType=0)"); 57 | } 58 | -------------------------------------------------------------------------------- /sass/includes/_footer.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kisnows/Express-Gulp-BrowserSync/b248c10f2f0c1a9d757de0fb1657c462a30434e4/sass/includes/_footer.scss -------------------------------------------------------------------------------- /sass/includes/_header.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kisnows/Express-Gulp-BrowserSync/b248c10f2f0c1a9d757de0fb1657c462a30434e4/sass/includes/_header.scss -------------------------------------------------------------------------------- /sass/main.scss: -------------------------------------------------------------------------------- 1 | @import 'mixins'; 2 | @import 'config'; 3 | 4 | @import 'global'; 5 | //includes 6 | @import 'includes/_header'; 7 | @import 'includes/_footer'; 8 | 9 | //pages 10 | @import 'pages/index'; 11 | -------------------------------------------------------------------------------- /sass/pages/index.scss: -------------------------------------------------------------------------------- 1 | .page-index{ 2 | h1 { 3 | color: red; 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const url = require('url') 3 | const chalk = require('chalk') 4 | const request = require('request') 5 | const express = require('express') 6 | 7 | const config = require('./config') 8 | const app = express() 9 | const router = express.Router() 10 | 11 | var viewPath = path.join(__dirname, 'views');`` 12 | // view engine setup 13 | app.set('views', path.join(viewPath)); 14 | app.set('view engine', 'pug'); 15 | 16 | // 静态资源 17 | app.use(express.static(path.join(__dirname, 'public'))) 18 | 19 | app.use('/', router); 20 | 21 | app.use(function (err, req, res, next) { 22 | err.status = err.status || 500 23 | res.status(err.status) 24 | res.send(err.message) 25 | }) 26 | 27 | //mock 28 | if (process.env.NODE_ENV === 'development') { 29 | console.log(chalk.yellow('dev server')) 30 | require('./data')(router) 31 | } else if (process.env.NODE_ENV === 'api') { 32 | router.use('/', function (req, res, next) { 33 | console.log(chalk.yellow(req.method + ' ' + req.url)) 34 | console.log('http://' + process.env.REMOTE_API + req.url) 35 | if (req.method.toUpperCase() === 'GET') { 36 | request({ 37 | qs: req.body, 38 | method: req.method, 39 | url: 'http://' + process.env.REMOTE_API + req.url, 40 | headers: req.headers 41 | }).pipe(res); 42 | } else if (req.method.toUpperCase() === 'POST') { 43 | request({ 44 | form: req.body, 45 | method: req.method, 46 | url: 'http://' + process.env.REMOTE_API + req.url, 47 | headers: req.headers 48 | }).pipe(res); 49 | } 50 | }); 51 | } 52 | router.get('/', function(req, res, next) { 53 | res.render('index', { title: 'Express' }); 54 | }); 55 | // 静态路由 56 | // router.use('/', function (req, res) { 57 | // var filePath = req.path 58 | // if (/\.jade$/.test(filePath)) { 59 | // var fileName = filePath.replace(/(\/|\.jade)/g, '') 60 | // console.log(fileName) 61 | // res.render(fileName) 62 | // } 63 | // }) 64 | 65 | const port = config.port || 3000 66 | 67 | app.listen(port) 68 | -------------------------------------------------------------------------------- /views/error.pug: -------------------------------------------------------------------------------- 1 | extends layout/layout 2 | 3 | block content 4 | h1= message 5 | h2= error.status 6 | pre #{error.stack} 7 | -------------------------------------------------------------------------------- /views/includes/footer.pug: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kisnows/Express-Gulp-BrowserSync/b248c10f2f0c1a9d757de0fb1657c462a30434e4/views/includes/footer.pug -------------------------------------------------------------------------------- /views/includes/header.pug: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kisnows/Express-Gulp-BrowserSync/b248c10f2f0c1a9d757de0fb1657c462a30434e4/views/includes/header.pug -------------------------------------------------------------------------------- /views/index.pug: -------------------------------------------------------------------------------- 1 | extends layout/layout 2 | 3 | block content 4 | div.page-index 5 | h1 Welcome 6 | ul 7 | li 你的微笑- 8 | li 是我最美的回忆 9 | li 啊 10 | -------------------------------------------------------------------------------- /views/layout/layout.pug: -------------------------------------------------------------------------------- 1 | doctype html 2 | html 3 | head 4 | title= title 5 | meta(http-equiv="X-UA-Compatible" content="IE=edge") 6 | link(rel='stylesheet', href='./css/main.css') 7 | body 8 | include ../includes/header 9 | block content 10 | include ../includes/footer 11 | script(src="./js/index.js") 12 | --------------------------------------------------------------------------------