├── .babelrc ├── .editorconfig ├── .eslintrc.js ├── .firebaserc ├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── .gitignore ├── .stylelintrc ├── .travis.yml ├── .vscode ├── launch.json ├── settings.json └── tasks.json ├── API_PLAYGROUND.http ├── LICENSE ├── LICENSE-exercises ├── Procfile ├── README.md ├── banana.png ├── client ├── App.jsx ├── components │ ├── app-footer │ │ ├── index.jsx │ │ └── styles.scss │ ├── app-header │ │ ├── index.jsx │ │ └── styles.scss │ ├── cart │ │ ├── cart-item │ │ │ ├── index.jsx │ │ │ └── styles.scss │ │ ├── index.jsx │ │ └── styles.scss │ ├── grocery-item │ │ ├── index.jsx │ │ └── styles.scss │ ├── orders │ │ ├── index.jsx │ │ └── styles.scss │ └── side-drawer │ │ ├── index.jsx │ │ └── styles.scss ├── data │ ├── cart-store.js │ ├── grocery-item-store.js │ ├── listener-support.js │ └── order-store.js ├── img │ ├── apple-touch-icon-114x114.png │ ├── apple-touch-icon-120x120.png │ ├── apple-touch-icon-144x144.png │ ├── apple-touch-icon-152x152.png │ ├── apple-touch-icon-180x180.png │ ├── apple-touch-icon-57x57.png │ ├── apple-touch-icon-60x60.png │ ├── apple-touch-icon-72x72.png │ ├── apple-touch-icon-76x76.png │ ├── launcher-icon-1x.png │ ├── launcher-icon-2x.png │ ├── launcher-icon-4x.png │ ├── launcher-icon-512.png │ └── launcher-icon.psd ├── index.ejs ├── index.js ├── index.scss ├── routes │ ├── category-details │ │ ├── index.jsx │ │ └── styles.scss │ ├── home │ │ ├── category-row │ │ │ ├── index.jsx │ │ │ └── styles.scss │ │ ├── index.jsx │ │ └── styles.scss │ └── order-details │ │ ├── index.jsx │ │ └── styles.scss ├── sass │ ├── _mixins.scss │ ├── _variables.scss │ └── content-wrapper.scss ├── sw │ └── caches.js └── utils │ ├── __tests__ │ └── only.test.js │ ├── api.js │ └── qrcode.js ├── db ├── master.sqlite └── seeds.csv ├── docs └── Slides.pdf ├── firebase.json ├── jest.config.js ├── nodemon.json ├── package.json ├── private └── README.md ├── renovate.json ├── run ├── server ├── .eslintrc.js ├── api-server │ ├── db.js │ ├── index.js │ ├── models │ │ ├── cart-item.js │ │ ├── grocery-item.js │ │ ├── index.js │ │ ├── order-item.js │ │ ├── order.js │ │ └── push-subscription.js │ ├── router.js │ ├── routes │ │ ├── cart │ │ │ ├── list-items.js │ │ │ └── update-items.js │ │ ├── grocery-categories.js │ │ ├── grocery-items.js │ │ ├── index.js │ │ ├── order │ │ │ ├── create.js │ │ │ ├── list.js │ │ │ └── show.js │ │ └── push-subscription │ │ │ └── create.js │ ├── seed.js │ ├── seeds.csv │ └── utils │ │ └── notification.js ├── asset-server │ └── index.js ├── gen-certs.js └── images │ ├── 0.jpg │ ├── 1.jpg │ ├── 10.jpg │ ├── 100.jpg │ ├── 101.jpg │ ├── 102.jpg │ ├── 103.jpg │ ├── 104.jpg │ ├── 105.jpg │ ├── 106.jpg │ ├── 107.jpg │ ├── 108.jpg │ ├── 109.jpg │ ├── 11.jpg │ ├── 110.jpg │ ├── 111.jpg │ ├── 112.jpg │ ├── 113.jpg │ ├── 114.jpg │ ├── 115.jpg │ ├── 116.jpg │ ├── 117.jpg │ ├── 118.jpg │ ├── 119.jpg │ ├── 12.jpg │ ├── 120.jpg │ ├── 121.jpg │ ├── 122.jpg │ ├── 123.jpg │ ├── 124.jpg │ ├── 125.jpg │ ├── 126.jpg │ ├── 127.jpg │ ├── 128.jpg │ ├── 129.jpg │ ├── 13.jpg │ ├── 130.jpg │ ├── 131.jpg │ ├── 132.jpg │ ├── 133.jpg │ ├── 134.jpg │ ├── 135.jpg │ ├── 136.jpg │ ├── 137.jpg │ ├── 138.jpg │ ├── 139.jpg │ ├── 14.jpg │ ├── 140.jpg │ ├── 141.jpg │ ├── 142.jpg │ ├── 143.jpg │ ├── 144.jpg │ ├── 145.jpg │ ├── 146.jpg │ ├── 147.jpg │ ├── 148.jpg │ ├── 149.jpg │ ├── 15.jpg │ ├── 150.jpg │ ├── 151.jpg │ ├── 152.jpg │ ├── 153.jpg │ ├── 154.jpg │ ├── 155.jpg │ ├── 156.jpg │ ├── 157.jpg │ ├── 158.jpg │ ├── 159.jpg │ ├── 16.jpg │ ├── 160.jpg │ ├── 161.jpg │ ├── 162.jpg │ ├── 163.jpg │ ├── 164.jpg │ ├── 165.jpg │ ├── 166.jpg │ ├── 167.jpg │ ├── 168.jpg │ ├── 169.jpg │ ├── 17.jpg │ ├── 170.jpg │ ├── 171.jpg │ ├── 172.jpg │ ├── 173.jpg │ ├── 174.jpg │ ├── 175.jpg │ ├── 176.jpg │ ├── 177.jpg │ ├── 178.jpg │ ├── 179.jpg │ ├── 18.jpg │ ├── 180.jpg │ ├── 181.jpg │ ├── 182.jpg │ ├── 183.jpg │ ├── 184.jpg │ ├── 185.jpg │ ├── 186.jpg │ ├── 187.jpg │ ├── 188.jpg │ ├── 189.jpg │ ├── 19.jpg │ ├── 190.jpg │ ├── 191.jpg │ ├── 192.jpg │ ├── 193.jpg │ ├── 194.jpg │ ├── 195.jpg │ ├── 196.jpg │ ├── 197.jpg │ ├── 198.jpg │ ├── 199.jpg │ ├── 2.jpg │ ├── 20.jpg │ ├── 200.jpg │ ├── 201.jpg │ ├── 202.jpg │ ├── 203.jpg │ ├── 204.jpg │ ├── 205.jpg │ ├── 206.jpg │ ├── 207.jpg │ ├── 208.jpg │ ├── 209.jpg │ ├── 21.jpg │ ├── 210.jpg │ ├── 211.jpg │ ├── 212.jpg │ ├── 213.jpg │ ├── 214.jpg │ ├── 215.jpg │ ├── 216.jpg │ ├── 217.jpg │ ├── 218.jpg │ ├── 219.jpg │ ├── 22.jpg │ ├── 220.jpg │ ├── 221.jpg │ ├── 222.jpg │ ├── 223.jpg │ ├── 224.jpg │ ├── 225.jpg │ ├── 226.jpg │ ├── 227.jpg │ ├── 228.jpg │ ├── 229.jpg │ ├── 23.jpg │ ├── 230.jpg │ ├── 231.jpg │ ├── 232.jpg │ ├── 233.jpg │ ├── 234.jpg │ ├── 235.jpg │ ├── 236.jpg │ ├── 237.jpg │ ├── 238.jpg │ ├── 239.jpg │ ├── 24.jpg │ ├── 240.jpg │ ├── 241.jpg │ ├── 242.jpg │ ├── 243.jpg │ ├── 244.jpg │ ├── 245.jpg │ ├── 246.jpg │ ├── 247.jpg │ ├── 248.jpg │ ├── 249.jpg │ ├── 25.jpg │ ├── 250.jpg │ ├── 251.jpg │ ├── 252.jpg │ ├── 253.jpg │ ├── 254.jpg │ ├── 255.jpg │ ├── 256.jpg │ ├── 257.jpg │ ├── 258.jpg │ ├── 259.jpg │ ├── 26.jpg │ ├── 260.jpg │ ├── 261.jpg │ ├── 262.jpg │ ├── 263.jpg │ ├── 264.jpg │ ├── 265.jpg │ ├── 266.jpg │ ├── 267.jpg │ ├── 268.jpg │ ├── 269.jpg │ ├── 27.jpg │ ├── 270.jpg │ ├── 271.jpg │ ├── 272.jpg │ ├── 273.jpg │ ├── 274.jpg │ ├── 275.jpg │ ├── 276.jpg │ ├── 277.jpg │ ├── 278.jpg │ ├── 279.jpg │ ├── 28.jpg │ ├── 280.jpg │ ├── 281.jpg │ ├── 282.jpg │ ├── 283.jpg │ ├── 284.jpg │ ├── 285.jpg │ ├── 286.jpg │ ├── 287.jpg │ ├── 288.jpg │ ├── 289.jpg │ ├── 29.jpg │ ├── 290.jpg │ ├── 291.jpg │ ├── 292.jpg │ ├── 293.jpg │ ├── 294.jpg │ ├── 295.jpg │ ├── 296.jpg │ ├── 297.jpg │ ├── 298.jpg │ ├── 299.jpg │ ├── 3.jpg │ ├── 30.jpg │ ├── 300.jpg │ ├── 301.jpg │ ├── 302.jpg │ ├── 303.jpg │ ├── 304.jpg │ ├── 305.jpg │ ├── 306.jpg │ ├── 307.jpg │ ├── 308.jpg │ ├── 309.jpg │ ├── 31.jpg │ ├── 310.jpg │ ├── 311.jpg │ ├── 312.jpg │ ├── 313.jpg │ ├── 314.jpg │ ├── 315.jpg │ ├── 316.jpg │ ├── 317.jpg │ ├── 318.jpg │ ├── 319.jpg │ ├── 32.jpg │ ├── 320.jpg │ ├── 321.jpg │ ├── 322.jpg │ ├── 323.jpg │ ├── 324.jpg │ ├── 325.jpg │ ├── 326.jpg │ ├── 327.jpg │ ├── 328.jpg │ ├── 329.jpg │ ├── 33.jpg │ ├── 330.jpg │ ├── 331.jpg │ ├── 332.jpg │ ├── 333.jpg │ ├── 334.jpg │ ├── 335.jpg │ ├── 336.jpg │ ├── 337.jpg │ ├── 338.jpg │ ├── 339.jpg │ ├── 34.jpg │ ├── 340.jpg │ ├── 341.jpg │ ├── 342.jpg │ ├── 343.jpg │ ├── 344.jpg │ ├── 345.jpg │ ├── 346.jpg │ ├── 347.jpg │ ├── 348.jpg │ ├── 349.jpg │ ├── 35.jpg │ ├── 350.jpg │ ├── 351.jpg │ ├── 352.jpg │ ├── 353.jpg │ ├── 354.jpg │ ├── 355.jpg │ ├── 356.jpg │ ├── 357.jpg │ ├── 358.jpg │ ├── 359.jpg │ ├── 36.jpg │ ├── 360.jpg │ ├── 361.jpg │ ├── 362.jpg │ ├── 363.jpg │ ├── 364.jpg │ ├── 365.jpg │ ├── 366.jpg │ ├── 367.jpg │ ├── 368.jpg │ ├── 369.jpg │ ├── 37.jpg │ ├── 370.jpg │ ├── 371.jpg │ ├── 372.jpg │ ├── 373.jpg │ ├── 374.jpg │ ├── 375.jpg │ ├── 376.jpg │ ├── 377.jpg │ ├── 378.jpg │ ├── 379.jpg │ ├── 38.jpg │ ├── 380.jpg │ ├── 381.jpg │ ├── 382.jpg │ ├── 383.jpg │ ├── 384.jpg │ ├── 385.jpg │ ├── 386.jpg │ ├── 387.jpg │ ├── 388.jpg │ ├── 389.jpg │ ├── 39.jpg │ ├── 390.jpg │ ├── 391.jpg │ ├── 392.jpg │ ├── 393.jpg │ ├── 394.jpg │ ├── 395.jpg │ ├── 396.jpg │ ├── 397.jpg │ ├── 398.jpg │ ├── 399.jpg │ ├── 4.jpg │ ├── 40.jpg │ ├── 400.jpg │ ├── 401.jpg │ ├── 402.jpg │ ├── 403.jpg │ ├── 404.jpg │ ├── 405.jpg │ ├── 406.jpg │ ├── 407.jpg │ ├── 408.jpg │ ├── 409.jpg │ ├── 41.jpg │ ├── 410.jpg │ ├── 411.jpg │ ├── 412.jpg │ ├── 413.jpg │ ├── 414.jpg │ ├── 415.jpg │ ├── 416.jpg │ ├── 417.jpg │ ├── 418.jpg │ ├── 419.jpg │ ├── 42.jpg │ ├── 420.jpg │ ├── 421.jpg │ ├── 422.jpg │ ├── 423.jpg │ ├── 424.jpg │ ├── 425.jpg │ ├── 426.jpg │ ├── 427.jpg │ ├── 428.jpg │ ├── 429.jpg │ ├── 43.jpg │ ├── 430.jpg │ ├── 431.jpg │ ├── 432.jpg │ ├── 433.jpg │ ├── 434.jpg │ ├── 435.jpg │ ├── 436.jpg │ ├── 437.jpg │ ├── 438.jpg │ ├── 439.jpg │ ├── 44.jpg │ ├── 440.jpg │ ├── 441.jpg │ ├── 442.jpg │ ├── 443.jpg │ ├── 444.jpg │ ├── 445.jpg │ ├── 446.jpg │ ├── 447.jpg │ ├── 448.jpg │ ├── 449.jpg │ ├── 45.jpg │ ├── 450.jpg │ ├── 451.jpg │ ├── 452.jpg │ ├── 453.jpg │ ├── 454.jpg │ ├── 455.jpg │ ├── 456.jpg │ ├── 457.jpg │ ├── 458.jpg │ ├── 459.jpg │ ├── 46.jpg │ ├── 460.jpg │ ├── 461.jpg │ ├── 462.jpg │ ├── 463.jpg │ ├── 464.jpg │ ├── 465.jpg │ ├── 466.jpg │ ├── 467.jpg │ ├── 468.jpg │ ├── 469.jpg │ ├── 47.jpg │ ├── 470.jpg │ ├── 471.jpg │ ├── 472.jpg │ ├── 473.jpg │ ├── 474.jpg │ ├── 475.jpg │ ├── 476.jpg │ ├── 477.jpg │ ├── 478.jpg │ ├── 479.jpg │ ├── 48.jpg │ ├── 480.jpg │ ├── 481.jpg │ ├── 482.jpg │ ├── 483.jpg │ ├── 484.jpg │ ├── 485.jpg │ ├── 486.jpg │ ├── 487.jpg │ ├── 488.jpg │ ├── 489.jpg │ ├── 49.jpg │ ├── 490.jpg │ ├── 491.jpg │ ├── 492.jpg │ ├── 493.jpg │ ├── 494.jpg │ ├── 495.jpg │ ├── 496.jpg │ ├── 497.jpg │ ├── 498.jpg │ ├── 499.jpg │ ├── 5.jpg │ ├── 50.jpg │ ├── 500.jpg │ ├── 501.jpg │ ├── 502.jpg │ ├── 503.jpg │ ├── 504.jpg │ ├── 505.jpg │ ├── 506.jpg │ ├── 507.jpg │ ├── 508.jpg │ ├── 509.jpg │ ├── 51.jpg │ ├── 510.jpg │ ├── 511.jpg │ ├── 512.jpg │ ├── 513.jpg │ ├── 514.jpg │ ├── 515.jpg │ ├── 516.jpg │ ├── 517.jpg │ ├── 518.jpg │ ├── 519.jpg │ ├── 52.jpg │ ├── 520.jpg │ ├── 521.jpg │ ├── 522.jpg │ ├── 523.jpg │ ├── 524.jpg │ ├── 525.jpg │ ├── 526.jpg │ ├── 527.jpg │ ├── 528.jpg │ ├── 529.jpg │ ├── 53.jpg │ ├── 530.jpg │ ├── 531.jpg │ ├── 532.jpg │ ├── 533.jpg │ ├── 534.jpg │ ├── 535.jpg │ ├── 536.jpg │ ├── 537.jpg │ ├── 538.jpg │ ├── 539.jpg │ ├── 54.jpg │ ├── 55.jpg │ ├── 56.jpg │ ├── 57.jpg │ ├── 58.jpg │ ├── 59.jpg │ ├── 6.jpg │ ├── 60.jpg │ ├── 61.jpg │ ├── 62.jpg │ ├── 63.jpg │ ├── 64.jpg │ ├── 65.jpg │ ├── 66.jpg │ ├── 67.jpg │ ├── 68.jpg │ ├── 69.jpg │ ├── 7.jpg │ ├── 70.jpg │ ├── 71.jpg │ ├── 72.jpg │ ├── 73.jpg │ ├── 74.jpg │ ├── 75.jpg │ ├── 76.jpg │ ├── 77.jpg │ ├── 78.jpg │ ├── 79.jpg │ ├── 8.jpg │ ├── 80.jpg │ ├── 81.jpg │ ├── 82.jpg │ ├── 83.jpg │ ├── 84.jpg │ ├── 85.jpg │ ├── 86.jpg │ ├── 87.jpg │ ├── 88.jpg │ ├── 89.jpg │ ├── 9.jpg │ ├── 90.jpg │ ├── 91.jpg │ ├── 92.jpg │ ├── 93.jpg │ ├── 94.jpg │ ├── 95.jpg │ ├── 96.jpg │ ├── 97.jpg │ ├── 98.jpg │ ├── 99.jpg │ ├── fallback-bakery.png │ ├── fallback-dairy.png │ ├── fallback-frozen.png │ ├── fallback-fruit.png │ ├── fallback-grocery.png │ ├── fallback-herbs.png │ ├── fallback-meat.png │ └── fallback-vegetables.png ├── tools ├── SCSSStub.js └── rebase-exercise-branches.js ├── webpack.config.js ├── webpack ├── devserver.config.js ├── extract-sass.js ├── html.config.js ├── module.config.js └── plugins.config.js └── yarn.lock /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": ["react-hot-loader/babel"], 3 | "presets": ["@babel/preset-env", "@babel/preset-react"] 4 | } 5 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | insert_final_newline = true 6 | indent_style = space 7 | indent_size = 2 -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | parser: "babel-eslint", 4 | parserOptions: { 5 | ecmaVersion: 2017, 6 | sourceType: 'module', 7 | ecmaFeatures: { 8 | "jsx": true 9 | } 10 | }, 11 | extends: [ 12 | 'eslint:recommended', 13 | 'plugin:react/recommended' 14 | ], 15 | env: { 16 | browser: true, 17 | es6: true, 18 | "jest/globals": true 19 | }, 20 | plugins: ['babel', 'react', 'jest'], 21 | rules: { 22 | "quotes": [2, "single", "avoid-escape"], 23 | "indent": [2, 2], 24 | "no-console": 0, 25 | "strict": 0, 26 | "no-unused-vars": 0, 27 | "no-debugger": 0, 28 | 'no-fallthrough': 0, 29 | "react/prop-types": 0 30 | } 31 | }; -------------------------------------------------------------------------------- /.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "default": "pwa-workshop-6da13" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Something broke while you were progressing through the workshop 4 | 5 | --- 6 | 7 | 8 | 11 | 12 | - [ ] **System Information** 13 | - [ ] Browser type and version 14 | - [ ] OS type and version 15 | - [ ] WINDOWS: be sure to indicate which terminal you're using -- (i.e., cmd.exe, powershell, git- bash, cygwin, Ubuntu via windows subsystem for linux, etc...) 16 | - [ ] Node version 17 | - [ ] Any error messages that may be in the console where you ran npm start 18 | - [ ] Any error messages in the JS console 19 | 20 | - [ ] **Describe the bug** 21 | 22 | 23 | - [ ] **To Reproduce** 24 | Steps to reproduce the behavior: 25 | 1. Go to '...' 26 | 2. Click on '....' 27 | 3. Scroll down to '....' 28 | 4. See error 29 | 30 | - [ ] **Expected behavior** 31 | A clear and concise description of what you expected to happen. 32 | 33 | - [ ] **Screenshots (optional)** 34 | If applicable, add screenshots to help explain your problem. 35 | 36 | - [ ] **Additional context (optional)** 37 | Add any other context about the problem here. 38 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | 5 | --- 6 | 7 | **Is your feature request related to a problem? Please describe.** 8 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 9 | 10 | **Describe the solution you'd like** 11 | A clear and concise description of what you want to happen. 12 | 13 | **Describe alternatives you've considered** 14 | A clear and concise description of any alternative solutions or features you've considered. 15 | 16 | **Additional context** 17 | Add any other context or screenshots about the feature request here. 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | yarn-error* 4 | key.pem 5 | cert.pem 6 | tmp 7 | db/development.sqlite 8 | .DS_Store 9 | private/* 10 | !private/README.md 11 | -------------------------------------------------------------------------------- /.stylelintrc: -------------------------------------------------------------------------------- 1 | { 2 | extends: "stylelint-config-standard", 3 | "plugins": [ 4 | "stylelint-scss" 5 | ], 6 | rules: { 7 | "at-rule-no-unknown": [true, {"ignoreAtRules": ["mixin", "include", "content"]}], 8 | "length-zero-no-unit": true, 9 | "time-min-milliseconds": 1, 10 | "unit-no-unknown": true, 11 | "scss/media-feature-value-dollar-variable": "always", 12 | "scss/operator-no-unspaced": true 13 | } 14 | } -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | cache: 3 | yarn: true 4 | yarn: true 5 | notifications: 6 | email: false 7 | install: yarn install --no-lockfile --non-interactive 8 | node_js: 9 | - '10.24.1' 10 | - '8.17.0' 11 | script: 12 | - yarn test && yarn travis-deploy-once "npm run semantic-release" 13 | branches: 14 | except: 15 | - /^v\d+\.\d+\.\d+$/ 16 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible Node.js debug attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "node", 9 | "request": "attach", 10 | "name": "Attach", 11 | "port": 5858 12 | }, 13 | { 14 | "type": "node", 15 | "request": "launch", 16 | "name": "Launch Program", 17 | "program": "${workspaceRoot}/server/index.js" 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "files.exclude": { 4 | "node_modules/**": true 5 | }, 6 | "search.exclude": { 7 | "**/node_modules": true, 8 | "**/bower_components": true 9 | }, 10 | "vsicons.associations.folders": [ 11 | { "icon": "binary", "extensions": ["db"], "format": "svg" } 12 | ], 13 | "vsicons.associations.files": [ 14 | { "icon": "license", "extensions": ["license-exercises"], "filename": true, "format": "svg" }, 15 | { "icon": "bat", "extensions": ["run"], "filename": true, "format": "svg" }, 16 | { "icon": "bat", "extensions": ["rest"], "format": "svg" } 17 | ] 18 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "type": "npm", 8 | "script": "watch", 9 | "group": { 10 | "kind": "build", 11 | "isDefault": true 12 | } 13 | }, 14 | { 15 | "type": "npm", 16 | "script": "build:dev", 17 | "problemMatcher": [] 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017, Mike Works, Inc. and Steve Kinney 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | * Redistributions of source code must retain the above copyright 7 | notice, this list of conditions and the following disclaimer. 8 | * Redistributions in binary form must reproduce the above copyright 9 | notice, this list of conditions and the following disclaimer in the 10 | documentation and/or other materials provided with the distribution. 11 | * Neither the name of the nor the 12 | names of its contributors may be used to endorse or promote products 13 | derived from this software without specific prior written permission. 14 | 15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 16 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 | DISCLAIMED. IN NO EVENT SHALL MIKE WORKS, INC. OR MIKE NORTH BE LIABLE FOR ANY 19 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 22 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 24 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 | -------------------------------------------------------------------------------- /LICENSE-exercises: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017, Mike Works, Inc. and Steve Kinney, All rights reserved. 2 | 3 | This training material (all exercises and accompanying tests) is licensed to 4 | the individual who purchased it. We don't copy-protect it because that would 5 | limit your ability to use it for your own purposes. Please don't break this 6 | trust - don't allow others to use these exercises without purchasing their own 7 | license. Thanks. 8 | 9 | Redistribution and use in source and binary forms, with or without 10 | modification, are not permitted provided without an individual license. It may 11 | not be used to create training material, courses, books, articles, and the like. 12 | Contact us if you are in doubt. We make no guarantees that this code is 13 | fit for any purpose. 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 18 | FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 19 | ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: $(which node) ./server/cli/cli.js -- serve --api-port $PORT --insecure 2 | -------------------------------------------------------------------------------- /banana.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/banana.png -------------------------------------------------------------------------------- /client/components/app-footer/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import './styles.scss'; 4 | 5 | const AppFooter = () => ( 6 | 11 | ); 12 | 13 | export default AppFooter; -------------------------------------------------------------------------------- /client/components/app-footer/styles.scss: -------------------------------------------------------------------------------- 1 | @import './../../sass/variables'; 2 | @import './../../sass/mixins'; 3 | 4 | .footer { 5 | background-color: $theme-background; 6 | bottom: 0; 7 | color: #fff; 8 | height: 20px; 9 | left: 0; 10 | position: fixed; 11 | transition: transform 0.2s; 12 | width: 100%; 13 | 14 | a { 15 | color: #fff; 16 | text-decoration: underline; 17 | } 18 | 19 | @include large-screens { 20 | transform: translateX(0); 21 | 22 | .frontend-grocer.show-left-sidedrawer & { 23 | transform: translateX($sidedrawer-width); 24 | } 25 | 26 | .frontend-grocer.show-right-sidedrawer & { 27 | transform: translateX(-$sidedrawer-width); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /client/components/cart/cart-item/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import './styles.scss'; 4 | 5 | const CartItem = ({cartItem, cartStore}) => { 6 | let itemImgUrl = `https://localhost:3100${cartItem.groceryItem.imageUrl}`; 7 | let totalPrice = cartItem.qty * cartItem.groceryItem.price; 8 | function formatPrice(price) { 9 | return `$${price.toFixed(2)}`; 10 | } 11 | return ( 12 | 13 | 14 | 17 |
{cartItem.qty}
18 | 21 | 22 | 23 | {cartItem.groceryItem.name}/ 24 | 25 | 26 |
{cartItem.groceryItem.name}
27 |
{formatPrice(cartItem.groceryItem.price)} / {cartItem.groceryItem.unit || 'each'}
28 | 29 | 30 | 31 | {formatPrice(totalPrice)} 32 | 33 | 34 | ); 35 | } 36 | 37 | export default CartItem; -------------------------------------------------------------------------------- /client/components/cart/cart-item/styles.scss: -------------------------------------------------------------------------------- 1 | $cart-item-qty-width: 30px; 2 | $cart-item-price-width: 30px; 3 | $cart-item-img-width: 46px; 4 | 5 | .cart-item { 6 | overflow: hidden; 7 | position: relative; 8 | width: 90%; 9 | 10 | .cart-item__qty, 11 | .cart-item__img, 12 | .cart-item__description, 13 | .cart-item__price { 14 | display: table-cell; 15 | padding-bottom: 15px; 16 | } 17 | 18 | .cart-item__img { 19 | width: $cart-item-img-width; 20 | vertical-align: top; 21 | 22 | img { 23 | vertical-align: top; 24 | width: 100%; 25 | } 26 | } 27 | 28 | .cart-item__description { 29 | .cart-item__name { 30 | color: #333; 31 | } 32 | 33 | .cart-item__unit { 34 | color: #999; 35 | } 36 | } 37 | 38 | .cart-item__qty { 39 | vertical-align: top; 40 | width: $cart-item-qty-width; 41 | font-size: 2.5rem; 42 | text-align: center; 43 | line-height: 2.2rem; 44 | 45 | .amt { 46 | position: relative; 47 | top: -12px; 48 | } 49 | 50 | .qty-down, 51 | .qty-up { 52 | position: relative; 53 | font-size: 2rem; 54 | border: none; 55 | background: transparent; 56 | color: lightgray; 57 | } 58 | 59 | .qty-up { 60 | top: -10px; 61 | } 62 | } 63 | 64 | .cart-item__price { 65 | padding-left: 8px; 66 | font-weight: bolder; 67 | vertical-align: top; 68 | font-size: 1.6rem; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /client/components/cart/styles.scss: -------------------------------------------------------------------------------- 1 | .cart { 2 | .cart-items { 3 | width: 100%; 4 | padding: 10px; 5 | } 6 | 7 | .checkout-btn-container { 8 | margin: 10px; 9 | 10 | .confirm-btn, 11 | .cancel-btn { 12 | width: calc(50% - 5px); 13 | } 14 | } 15 | 16 | .checkout-btn { 17 | background: green; 18 | width: calc(100%); 19 | font-weight: bolder; 20 | 21 | .amt { 22 | padding: 2px 5px; 23 | border-radius: 2px; 24 | border: 1px solid lightgreen; 25 | background: darken(desaturate(green, 20%), 10%); 26 | } 27 | } 28 | 29 | .checkout-confirm { 30 | max-height: 0; 31 | overflow: hidden; 32 | 33 | &.open { 34 | max-height: none; 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /client/components/grocery-item/index.jsx: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | 3 | import React from 'react'; 4 | import { endpoint as API_ENDPOINT } from '../../utils/api'; 5 | 6 | import './styles.scss'; 7 | 8 | function formatPrice(rawPrice) { 9 | return `$${rawPrice.toFixed(2)}`; 10 | } 11 | 12 | const GroceryItem = ({ item, cartStore }) => { 13 | let itemUrl = `${API_ENDPOINT}${item.imageUrl.substring(1)}`; 14 | let price = formatPrice(item.price); 15 | 16 | let unit = item.unit; 17 | return ( 18 |
  • 19 | {item.name} 20 |

    {item.name}

    21 | 22 | {price} 23 | {unit ? {unit} : ''} 24 | 25 | 28 |
  • 29 | ) 30 | }; 31 | 32 | export default GroceryItem; -------------------------------------------------------------------------------- /client/components/grocery-item/styles.scss: -------------------------------------------------------------------------------- 1 | @import '../../sass/variables'; 2 | 3 | $bottom-tile-height: 36px; 4 | 5 | .GroceryItem { 6 | display: inline-block; 7 | height: $grocery-item-tile-height; 8 | width: $grocery-item-tile-width; 9 | overflow: hidden; 10 | margin: 10px; 11 | position: relative; 12 | 13 | &:first-child { 14 | margin-left: -20px; 15 | } 16 | 17 | .item-image { 18 | position: absolute; 19 | bottom: 5%; 20 | left: 5%; 21 | max-width: 90%; 22 | } 23 | 24 | .bottom-tile { 25 | position: absolute; 26 | bottom: 0; 27 | height: $bottom-tile-height; 28 | line-height: $bottom-tile-height; 29 | opacity: 0.6; 30 | transition: opacity 0.2s; 31 | 32 | &.bottom-tile--right { 33 | right: 0; 34 | border-top-left-radius: 3px; 35 | } 36 | 37 | &.bottom-tile--left { 38 | left: 0; 39 | border-top-right-radius: 3px; 40 | } 41 | } 42 | 43 | &:hover .bottom-tile { 44 | opacity: 1; 45 | } 46 | 47 | .item-price { 48 | background: green; 49 | color: white; 50 | font-weight: bold; 51 | font-size: 1.4rem; 52 | padding: 0 5px; 53 | 54 | .item-unit { 55 | font-size: 1rem; 56 | text-transform: uppercase; 57 | margin-left: 4px; 58 | } 59 | } 60 | 61 | .item-name { 62 | position: absolute; 63 | font-size: 1.8rem; 64 | top: 0; 65 | background: rgba(255, 255, 255, 0.8); 66 | width: 90%; 67 | white-space: normal; 68 | } 69 | 70 | .add-item-to-cart { 71 | margin-bottom: 0; 72 | padding: 0 10px; 73 | font-size: $bottom-tile-height; 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /client/components/orders/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Link } from 'react-router-dom'; 3 | 4 | import './styles.scss'; 5 | 6 | const Orders = ({ orders }) => { 7 | let orderItems = orders.map((o) => { 8 | return ( 9 |
  • 10 | 11 |

    {o.name}

    12 |

    13 | 14 | 15 | {o.status} 16 | 17 | 18 | ${o.totalPrice} 19 |

    20 | 21 |
  • 22 | ); 23 | }) 24 | return ( 25 | 30 | ); 31 | } 32 | 33 | export default Orders; -------------------------------------------------------------------------------- /client/components/orders/styles.scss: -------------------------------------------------------------------------------- 1 | .orders-list { 2 | .orders-list-item.sidedrawer-list__item { 3 | border-bottom: 1px solid #aaa; 4 | padding-bottom: 5px; 5 | 6 | &:hover { 7 | background: lightyellow; 8 | } 9 | 10 | .price { 11 | color: green; 12 | } 13 | 14 | & > a, 15 | & > a:hover { 16 | text-decoration: none; 17 | color: black; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /client/components/side-drawer/index.jsx: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | 3 | import React from 'react'; 4 | 5 | import './styles.scss'; 6 | 7 | const SideDrawer = ({ drawerShowing, children, side}) => { 8 | let topClasses = ['sidedrawer', 'mui--no-user-select', (side || 'left')]; 9 | if (drawerShowing) { 10 | topClasses.push('active'); 11 | } 12 | return ( 13 |
    14 | {children} 15 |
    16 | ); 17 | } 18 | export default SideDrawer; -------------------------------------------------------------------------------- /client/components/side-drawer/styles.scss: -------------------------------------------------------------------------------- 1 | @import './../../sass/_variables'; 2 | @import './../../sass/_mixins'; 3 | 4 | .sidedrawer { 5 | position: fixed; 6 | top: 0; 7 | bottom: 0; 8 | width: $sidedrawer-width; 9 | overflow: auto; 10 | background-color: #fff; 11 | transition: transform 0.2s; 12 | z-index: 100000000; 13 | 14 | &.left { 15 | transform: translateX(-$sidedrawer-width); 16 | 17 | &.active { 18 | transform: translate(0); 19 | } 20 | 21 | @include large-screens { 22 | transform: translateX(-$sidedrawer-width); 23 | } 24 | } 25 | 26 | &.right { 27 | right: -$sidedrawer-width; 28 | 29 | &.active { 30 | transform: translateX(-$sidedrawer-width); 31 | } 32 | } 33 | 34 | .sidedrawer-list { 35 | list-style: none; 36 | padding-left: 0; 37 | 38 | .sidedrawer-list__item { 39 | padding: 15px 22px; 40 | 41 | &:first-child { 42 | padding-top: 15px; 43 | } 44 | } 45 | } 46 | 47 | .brand { 48 | padding-left: 20px; 49 | } 50 | 51 | @include large-screens { 52 | .frontend-grocer.hide-sidedrawer & { 53 | transform: translate(0); 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /client/data/listener-support.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | 3 | /** 4 | * A class for things we can register listeners to and fire events 5 | * @author Mike North 6 | * @public 7 | */ 8 | export default class ListenerSupport { 9 | constructor() { 10 | this._listeners = [] 11 | } 12 | 13 | /** 14 | * Register a listener 15 | * @param {function} listener callback to invoke whenever listeners need to be notified 16 | * @return {void} 17 | */ 18 | register(listener) { 19 | this._listeners.push(listener); 20 | } 21 | 22 | /** 23 | * Un-register a listener 24 | * @param {function} listener callback that should no longer be invoked when events are fired 25 | * @return {void} 26 | */ 27 | unregister(listener) { 28 | let idx = this._listeners.findIndex((x) => x === listener); 29 | this._listeners.splice(idx, 1); 30 | } 31 | 32 | /** 33 | * Fire an event, synchronously invoking all listener callbacks that have been registered 34 | * @see #register 35 | * @param {any} payload 36 | */ 37 | fire(payload) { 38 | this._listeners.forEach((x) => x(payload)); 39 | } 40 | } -------------------------------------------------------------------------------- /client/data/order-store.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | 3 | import ListenerSupport from './listener-support'; 4 | import { endpoint as API_ENDPOINT } from '../utils/api'; 5 | 6 | /** 7 | * A class for keeping track of order state 8 | * @public 9 | */ 10 | export default class OrderStore { 11 | /** 12 | * Create a new OrderStore instance. 13 | * There's usually only one of these per app 14 | * @public 15 | * @return {OrderStore} 16 | */ 17 | constructor() { 18 | this._items = []; 19 | this.refresh(); 20 | this.orderListeners = new ListenerSupport(); 21 | } 22 | 23 | /** 24 | * Get the list of orders in the store 25 | * This is a read-only array 26 | * 27 | * @public 28 | * @return {ReadonlyArray} 29 | */ 30 | get orders() { 31 | return Object.freeze(this._items); 32 | } 33 | 34 | /** 35 | * Fetch fresh data, and refresh the list of orders in memory. 36 | * This will result in any appropriate listeners being notified 37 | * 38 | * @public 39 | * @return {Promise>} 40 | */ 41 | refresh() { 42 | return fetch(`${API_ENDPOINT}api/orders?status=pending`) 43 | .then((resp) => resp.json()) 44 | .then((jsonData) => { 45 | this._items = [...(jsonData.data || [])]; 46 | this._onOrdersUpdated(); 47 | return this.orders; 48 | }); 49 | } 50 | 51 | /** 52 | * Get an individual order by id 53 | * This will result a new API request being made 54 | * 55 | * @public 56 | * @param {Number|String} id 57 | * @return {Promise} the order 58 | */ 59 | getOrderById(id) { 60 | return fetch(`${API_ENDPOINT}api/orders/${id}`) 61 | .then((resp) => resp.json()) 62 | .then((jsonData) => jsonData.data); 63 | } 64 | 65 | /** 66 | * Notify any appropriate observers that the orders have changed 67 | * 68 | * @private 69 | * @return {void} 70 | */ 71 | _onOrdersUpdated() { 72 | this.orderListeners.fire(this.orders); 73 | } 74 | } -------------------------------------------------------------------------------- /client/img/apple-touch-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/client/img/apple-touch-icon-114x114.png -------------------------------------------------------------------------------- /client/img/apple-touch-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/client/img/apple-touch-icon-120x120.png -------------------------------------------------------------------------------- /client/img/apple-touch-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/client/img/apple-touch-icon-144x144.png -------------------------------------------------------------------------------- /client/img/apple-touch-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/client/img/apple-touch-icon-152x152.png -------------------------------------------------------------------------------- /client/img/apple-touch-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/client/img/apple-touch-icon-180x180.png -------------------------------------------------------------------------------- /client/img/apple-touch-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/client/img/apple-touch-icon-57x57.png -------------------------------------------------------------------------------- /client/img/apple-touch-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/client/img/apple-touch-icon-60x60.png -------------------------------------------------------------------------------- /client/img/apple-touch-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/client/img/apple-touch-icon-72x72.png -------------------------------------------------------------------------------- /client/img/apple-touch-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/client/img/apple-touch-icon-76x76.png -------------------------------------------------------------------------------- /client/img/launcher-icon-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/client/img/launcher-icon-1x.png -------------------------------------------------------------------------------- /client/img/launcher-icon-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/client/img/launcher-icon-2x.png -------------------------------------------------------------------------------- /client/img/launcher-icon-4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/client/img/launcher-icon-4x.png -------------------------------------------------------------------------------- /client/img/launcher-icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/client/img/launcher-icon-512.png -------------------------------------------------------------------------------- /client/img/launcher-icon.psd: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:10e08f01d714b05cc44433a6754d89c631a65a1d21080c0cc3c3c62868c4a094 3 | size 124147 4 | -------------------------------------------------------------------------------- /client/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | <%= htmlWebpackPlugin.options.title %> 11 | 12 | 13 | 14 | 15 | 16 | 17 |
    18 | 19 | 20 | -------------------------------------------------------------------------------- /client/index.js: -------------------------------------------------------------------------------- 1 | /* global module: true */ 2 | import React from 'react'; 3 | import ReactDOM from 'react-dom'; 4 | import './index.scss'; 5 | import App from './App'; 6 | import VAPID from './../private/vapid.json'; 7 | 8 | import 'file-loader?name=./img/launcher-icon-1x.png!./img/launcher-icon-1x.png'; 9 | import 'file-loader?name=./img/launcher-icon-2x.png!./img/launcher-icon-2x.png'; 10 | import 'file-loader?name=./img/launcher-icon-4x.png!./img/launcher-icon-4x.png'; 11 | import 'file-loader?name=./apple-touch-icon-57x57.png!./img/apple-touch-icon-57x57.png'; 12 | import 'file-loader?name=./apple-touch-icon-60x60.png!./img/apple-touch-icon-60x60.png'; 13 | import 'file-loader?name=./apple-touch-icon-72x72.png!./img/apple-touch-icon-72x72.png'; 14 | import 'file-loader?name=./apple-touch-icon-76x76.png!./img/apple-touch-icon-76x76.png'; 15 | import 'file-loader?name=./apple-touch-icon-114x114.png!./img/apple-touch-icon-114x114.png'; 16 | import 'file-loader?name=./apple-touch-icon-120x120.png!./img/apple-touch-icon-120x120.png'; 17 | import 'file-loader?name=./apple-touch-icon-144x144.png!./img/apple-touch-icon-144x144.png'; 18 | import 'file-loader?name=./apple-touch-icon-152x152.png!./img/apple-touch-icon-152x152.png'; 19 | import 'file-loader?name=./apple-touch-icon-180x180.png!./img/apple-touch-icon-180x180.png'; 20 | 21 | ReactDOM.render((), document.getElementById('root')); 22 | 23 | if (module.hot) { 24 | module.hot.accept(function () { 25 | console.log('Accepting the updated printMe module!'); 26 | }); 27 | } -------------------------------------------------------------------------------- /client/index.scss: -------------------------------------------------------------------------------- 1 | @import 'mui'; 2 | @import 'sass/variables'; 3 | 4 | html, 5 | body { 6 | background-color: $offwhite; 7 | height: 100%; 8 | } 9 | 10 | html, 11 | body, 12 | input, 13 | textarea, 14 | button { 15 | -moz-osx-font-smoothing: grayscale; 16 | -webkit-font-smoothing: antialiased; 17 | } 18 | 19 | .pull-right { 20 | float: right; 21 | } 22 | 23 | .pull-left { 24 | float: left; 25 | } 26 | 27 | .badge { 28 | padding: 3px 5px; 29 | background: slategray; 30 | color: white; 31 | font-weight: bolder; 32 | text-transform: uppercase; 33 | border-radius: 3px; 34 | line-height: 0.8rem; 35 | } 36 | -------------------------------------------------------------------------------- /client/routes/category-details/index.jsx: -------------------------------------------------------------------------------- 1 | import './styles.scss'; 2 | import GroceryItem from '../../components/grocery-item'; 3 | 4 | import React, { Component } from 'react'; 5 | 6 | class CategoryDetails extends Component { 7 | constructor(props) { 8 | super(props); 9 | this.state = { 10 | groceryItems: [] 11 | }; 12 | } 13 | _updateGroceryItems() { 14 | this.props.groceryItemStore.itemsForCategory(this.props.match.params.id).then((groceryItems) => { 15 | this.setState({ groceryItems }); 16 | }); 17 | } 18 | componentDidMount() { 19 | this._itemUpdateListener = () => { 20 | this._updateGroceryItems(); 21 | }; 22 | this.props.groceryItemStore.itemListeners.register(this._itemUpdateListener); 23 | this.props.groceryItemStore.updateItemsForCategory(this.props.match.params.id, 100); 24 | } 25 | 26 | componentWillUnmount() { 27 | this.props.groceryItemStore.itemListeners.unregister(this._itemUpdateListener); 28 | } 29 | 30 | render() { 31 | let itemComponents = this.state.groceryItems.map((item) => ) 32 | 33 | return ( 34 |
    35 |

    {this.props.match.params.id}

    36 | {itemComponents.length ? itemComponents :
    Loading...
    } 37 |
    38 | ) 39 | } 40 | } 41 | 42 | 43 | 44 | export default CategoryDetails; -------------------------------------------------------------------------------- /client/routes/category-details/styles.scss: -------------------------------------------------------------------------------- 1 | .CategoryDetails { 2 | .category-name { 3 | margin-left: 15px; 4 | font-size: 3rem; 5 | } 6 | } 7 | 8 | .loading { 9 | text-align: center; 10 | font-size: 5rem; 11 | font-weight: lighter; 12 | margin-top: 30px; 13 | color: #999; 14 | } 15 | -------------------------------------------------------------------------------- /client/routes/home/category-row/index.jsx: -------------------------------------------------------------------------------- 1 | import './styles.scss'; 2 | 3 | import React, { Component } from 'react'; 4 | import { Link } from 'react-router-dom'; 5 | import GroceryItem from '../../../components/grocery-item'; 6 | 7 | class CategoryRow extends Component { 8 | constructor(props) { 9 | super(props); 10 | this.state = { 11 | groceryItems: [] 12 | }; 13 | } 14 | _updateGroceryItems() { 15 | this.props.groceryItemStore.itemsForCategory(this.props.categoryName).then((groceryItems) => { 16 | this.setState({ groceryItems }); 17 | }); 18 | } 19 | componentDidMount() { 20 | this._updateGroceryItems(); 21 | this._itemUpdateListener = () => { 22 | this._updateGroceryItems(); 23 | }; 24 | this.props.groceryItemStore.itemListeners.register(this._itemUpdateListener); 25 | this.props.groceryItemStore.updateItemsForCategory(this.props.categoryName, 10); 26 | } 27 | 28 | componentWillUnmount() { 29 | this.props.groceryItemStore.itemListeners.unregister(this._itemUpdateListener); 30 | } 31 | 32 | render() { 33 | let itemComponents = this.state.groceryItems.map((item) => ( 34 | 38 | )); 39 | return ( 40 |
  • 41 | 42 | See More {this.props.categoryName} > 43 | 44 |

    {this.props.categoryName}

    45 |
      46 | {itemComponents} 47 |
    48 |
  • 49 | ) 50 | } 51 | } 52 | 53 | export default CategoryRow; -------------------------------------------------------------------------------- /client/routes/home/category-row/styles.scss: -------------------------------------------------------------------------------- 1 | @import '../../../sass/variables'; 2 | 3 | .CategoryRow { 4 | height: $category-row-height; 5 | margin-right: -15px; 6 | margin-left: -15px; 7 | 8 | .category-name { 9 | line-height: $category-row-header-height; 10 | margin-top: 0; 11 | margin-bottom: 0; 12 | margin-left: 20px; 13 | } 14 | 15 | .grocery-item-list { 16 | padding-left: 40px; 17 | overflow: auto; 18 | white-space: nowrap; 19 | margin-top: 0; 20 | margin-bottom: 0; 21 | } 22 | 23 | .category-details-link a { 24 | line-height: $category-row-header-height; 25 | margin-right: 5px; 26 | display: inline-block; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /client/routes/home/index.jsx: -------------------------------------------------------------------------------- 1 | import './styles.scss'; 2 | 3 | import React, { Component } from 'react'; 4 | import CategoryRow from './category-row'; 5 | 6 | class Home extends Component { 7 | constructor(props) { 8 | super(props); 9 | this.state = { categories: this.props.groceryItemStore.categories }; 10 | } 11 | componentDidMount() { 12 | this.props.groceryItemStore.categoryListeners.register((newCategories) => { 13 | this.setState({categories: newCategories}); 14 | }) 15 | this.props.groceryItemStore.updateCategories(); 16 | } 17 | 18 | render() { 19 | let categoryRows = this.state.categories.map((c) => ( 20 | 26 | )); 27 | return ( 28 |
    29 |
      30 | {categoryRows} 31 |
    32 |
    33 | ) 34 | } 35 | } 36 | 37 | 38 | 39 | export default Home; -------------------------------------------------------------------------------- /client/routes/home/styles.scss: -------------------------------------------------------------------------------- 1 | .category-list { 2 | list-style: none; 3 | margin: 0; 4 | padding: 0; 5 | } 6 | -------------------------------------------------------------------------------- /client/routes/order-details/styles.scss: -------------------------------------------------------------------------------- 1 | .order-details { 2 | .order-items { 3 | margin-top: 20px; 4 | 5 | .order-item { 6 | .mui-panel { 7 | height: 200px; 8 | position: relative; 9 | 10 | .item-name { 11 | position: absolute; 12 | top: 0; 13 | left: 0; 14 | right: 0; 15 | background: rgba(255, 255, 255, 0.9); 16 | padding: 15px; 17 | margin-top: 0; 18 | } 19 | 20 | .bottom { 21 | position: absolute; 22 | bottom: 0; 23 | font-size: 2rem; 24 | 25 | .item-qty { 26 | font-weight: bolder; 27 | } 28 | 29 | .item-price { 30 | color: green; 31 | margin-left: 5px; 32 | } 33 | } 34 | 35 | .item-img { 36 | max-height: 100%; 37 | max-width: 100%; 38 | margin-left: -15px; 39 | margin-right: -15px; 40 | } 41 | } 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /client/sass/_mixins.scss: -------------------------------------------------------------------------------- 1 | @import '_variables'; 2 | 3 | @mixin large-screens() { 4 | @media (min-width: $small-screen-width) { 5 | @content; 6 | } 7 | } 8 | 9 | @mixin small-screens() { 10 | @media (max-width: $small-screen-width) { 11 | @content; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /client/sass/_variables.scss: -------------------------------------------------------------------------------- 1 | $offwhite: #eee; 2 | $theme-background: #0288d1; 3 | $small-screen-width: 768px; 4 | 5 | $grocery-item-tile-height: 180px; 6 | $grocery-item-tile-width: 120px; 7 | $grocery-item-tile-padding: 15px; 8 | $grocery-item-tile-margin: 10px; 9 | 10 | $category-row-header-height: 32px; 11 | 12 | $category-row-height: $category-row-header-height + $grocery-item-tile-height + (2 * $grocery-item-tile-margin) + (2 * $grocery-item-tile-padding); 13 | 14 | $sidedrawer-width: 320px; 15 | -------------------------------------------------------------------------------- /client/sass/content-wrapper.scss: -------------------------------------------------------------------------------- 1 | @import "mixins"; 2 | 3 | .content-wrapper { 4 | margin-bottom: -160px; 5 | margin-left: 0; 6 | min-height: 100vh; 7 | overflow-x: hidden; 8 | padding-bottom: 160px; 9 | transition: margin-left 0.2s; 10 | 11 | @include large-screens { 12 | transform: translateX(0); 13 | 14 | .frontend-grocer.show-left-sidedrawer & { 15 | transform: translateX($sidedrawer-width); 16 | } 17 | 18 | .frontend-grocer.show-right-sidedrawer & { 19 | transform: translateX(-$sidedrawer-width); 20 | } 21 | } 22 | } 23 | 24 | .bg-white { 25 | background: #fff; 26 | border: 1px solid #e0e0e0; 27 | } 28 | -------------------------------------------------------------------------------- /client/utils/__tests__/only.test.js: -------------------------------------------------------------------------------- 1 | 2 | describe('dummy test', () => { 3 | it('should add two numbers', () => { 4 | expect(3).toBe(3); 5 | }); 6 | }); -------------------------------------------------------------------------------- /client/utils/api.js: -------------------------------------------------------------------------------- 1 | let metaContents = document.head.querySelector('meta[name="fegrocer-api-endpoint"]').content; 2 | let apiEndpoint = new URL(metaContents); 3 | apiEndpoint.protocol = window.location.protocol; 4 | 5 | export const endpoint = apiEndpoint.toString(); -------------------------------------------------------------------------------- /db/master.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/db/master.sqlite -------------------------------------------------------------------------------- /docs/Slides.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/docs/Slides.pdf -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "hosting": { 3 | "public": "dist", 4 | "rewrites": [{ 5 | "source" : "/", 6 | "destination" : "/dist/index.html" 7 | }] 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | /* eslint-env node */ 2 | module.exports = { 3 | verbose: true, 4 | testURL: 'http://localhost', 5 | roots: ['/client', '/server'], 6 | moduleNameMapper: { 7 | '.scss$': '/tools/SCSSStub.js' 8 | } 9 | }; 10 | -------------------------------------------------------------------------------- /nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "ignore": [ 3 | "/node_modules/*", 4 | "/db/*", 5 | "./package.json", 6 | "/.vscode/*", 7 | "/dist/*", 8 | "/docs/*", 9 | "/private/*", 10 | "/client/*" 11 | ] 12 | } -------------------------------------------------------------------------------- /private/README.md: -------------------------------------------------------------------------------- 1 | We may place secrets (i.e., SSL certificates) in this folder. Please ensure they don't end up getting committed to your git repository -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["@mike-works/js-lib-renovate-config"] 3 | } 4 | -------------------------------------------------------------------------------- /run: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | YELLOW='\033[0;33m' 3 | NC='\033[0m' # No Color 4 | 5 | if [ $1 = "serve" ] 6 | then 7 | echo -e "⛔️ ERROR: ./run serve is deprectated" 8 | echo -e " Please use '${YELLOW}npm run watch${NC}' instead" 9 | fi 10 | 11 | if [ $1 = "gen-certs" ] 12 | then 13 | echo -e "⛔️ ERROR: ./run gen-certs is deprectated" 14 | echo -e " Please use '${YELLOW}npm run gen-certs${NC}' instead" 15 | fi 16 | -------------------------------------------------------------------------------- /server/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: false, 3 | parser: "babel-eslint", 4 | parserOptions: { 5 | ecmaVersion: 2017, 6 | sourceType: 'module' 7 | }, 8 | extends: [ 9 | 'eslint:recommended' 10 | ], 11 | env: { 12 | node: true, 13 | es6: true 14 | }, 15 | plugins: ['babel'], 16 | rules: { 17 | "quotes": [2, "single", "avoid-escape"], 18 | "indent": [2, 2], 19 | "strict": 0, 20 | "no-console": 0, 21 | 'no-fallthrough': 0 22 | } 23 | }; -------------------------------------------------------------------------------- /server/api-server/models/cart-item.js: -------------------------------------------------------------------------------- 1 | module.exports = function (sequelize, DataTypes) { 2 | const GroceryItem = require('./grocery-item')(sequelize, DataTypes); 3 | 4 | const CartItem = sequelize.define('cart-item', { 5 | qty: { 6 | type: DataTypes.INTEGER, 7 | allowNull: true, 8 | defaultValue: 1, 9 | validate: { min: 1, max: 999 } 10 | } 11 | }, { 12 | indexes: [{ 13 | unique: true, 14 | fields: ['groceryItemId'] 15 | }] 16 | 17 | }); 18 | CartItem.belongsTo(GroceryItem, { as: 'groceryItem'}); 19 | return CartItem; 20 | } -------------------------------------------------------------------------------- /server/api-server/models/grocery-item.js: -------------------------------------------------------------------------------- 1 | let _model = null; 2 | module.exports = function (sequelize, DataTypes) { 3 | if (!_model) { 4 | _model = sequelize.define('grocery-item', { 5 | name: { type: DataTypes.STRING }, 6 | category: { type: DataTypes.STRING }, 7 | imageUrl: { type: DataTypes.STRING }, 8 | price: { type: DataTypes.DOUBLE }, 9 | unit: { type: DataTypes.STRING } 10 | }, { 11 | indexes: [{ 12 | fields: ['category'] 13 | }] 14 | }); 15 | } 16 | return _model; 17 | } -------------------------------------------------------------------------------- /server/api-server/models/index.js: -------------------------------------------------------------------------------- 1 | let fs = require('fs'); 2 | let path = require('path'); 3 | let Sequelize = require('sequelize'); 4 | 5 | module.exports = function (sequelize) { 6 | 7 | let db = {}; 8 | 9 | let modelFiles = fs.readdirSync(__dirname) 10 | .filter(function (file) { 11 | return (file.indexOf('.') !== 0) && (file !== 'index.js'); 12 | }); 13 | 14 | modelFiles.forEach((file) => { 15 | let model = sequelize.import(path.join(__dirname, file)); 16 | db[model.name] = model; 17 | }); 18 | 19 | Object.keys(db).forEach((modelName) => { 20 | if ('associate' in db[modelName]) { 21 | db[modelName].associate(db); 22 | } 23 | db[modelName].sync(); 24 | }); 25 | 26 | db.sequelize = sequelize; 27 | db.Sequelize = Sequelize; 28 | return db; 29 | } -------------------------------------------------------------------------------- /server/api-server/models/order-item.js: -------------------------------------------------------------------------------- 1 | let OrderItem = null; 2 | module.exports = function (sequelize, DataTypes) { 3 | if (!OrderItem) { 4 | const GroceryItem = require('./grocery-item')(sequelize, DataTypes); 5 | const Order = require('./order')(sequelize, DataTypes); 6 | 7 | OrderItem = sequelize.define('order-item', { 8 | qty: { 9 | type: DataTypes.INTEGER, 10 | allowNull: true, 11 | validate: { min: 1, max: 999 } 12 | }, 13 | retrieved: { 14 | type: DataTypes.BOOLEAN, 15 | allowNull: false, 16 | defaultValue: false 17 | } 18 | }, { 19 | indexes: [{ 20 | fields: ['orderId'] 21 | }, { 22 | unique: true, 23 | fields: ['orderId', 'groceryItemId'] 24 | }] 25 | }); 26 | OrderItem.belongsTo(GroceryItem, {as: 'groceryItem', allowNull: false }); 27 | OrderItem.belongsTo(Order, {as: 'order', allowNull: false }); 28 | Order.hasMany(OrderItem, {as: 'orderItems'}); 29 | return OrderItem; 30 | } 31 | return OrderItem; 32 | } -------------------------------------------------------------------------------- /server/api-server/models/order.js: -------------------------------------------------------------------------------- 1 | let Order = null; 2 | module.exports = function (sequelize, DataTypes) { 3 | if (!Order) { 4 | Order = sequelize.define('order', { 5 | name: { 6 | type: DataTypes.STRING, 7 | allowNull: false 8 | }, 9 | totalPrice: { 10 | type: DataTypes.DOUBLE, 11 | allowNull: false, 12 | validate: { min: 0, max: 1000000.00 } 13 | }, 14 | status: { 15 | type: DataTypes.STRING, 16 | allowNull: false, 17 | defaultValue: 'pending' 18 | } 19 | }, { 20 | indexes: [{ 21 | fields: ['status'] 22 | }] 23 | }); 24 | } 25 | return Order; 26 | } -------------------------------------------------------------------------------- /server/api-server/models/push-subscription.js: -------------------------------------------------------------------------------- 1 | let PushSubscription = null; 2 | module.exports = function (sequelize, DataTypes) { 3 | if (!PushSubscription) { 4 | PushSubscription = sequelize.define('push-subscription', { 5 | endpoint: { 6 | type: DataTypes.STRING, 7 | allowNull: false 8 | }, 9 | keys: { 10 | type: DataTypes.STRING, 11 | allowNull: false 12 | } 13 | }); 14 | } 15 | return PushSubscription; 16 | } -------------------------------------------------------------------------------- /server/api-server/router.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | 3 | const groceryItemsRoute = require('./routes/grocery-items'); 4 | const groceryCategoriesRoute = require('./routes/grocery-categories'); 5 | 6 | const getCartItemsRoute = require('./routes/cart/list-items'); 7 | const updateCartItemsRoute = require('./routes/cart/update-items'); 8 | 9 | const createOrderRoute = require('./routes/order/create'); 10 | const getOrdersRoute = require('./routes/order/list'); 11 | const getOrderRoute = require('./routes/order/show'); 12 | const indexRoute = require('./routes/index'); 13 | 14 | const createPushSubscriptionRoute = require('./routes/push-subscription/create'); 15 | 16 | module.exports = function (api) { 17 | let router = express.Router(); 18 | router.get('/grocery/categories', groceryCategoriesRoute(api)); 19 | router.get('/grocery/items', groceryItemsRoute(api)); 20 | 21 | router.get('/cart/items', getCartItemsRoute(api)); 22 | router.put('/cart/items', updateCartItemsRoute(api)); 23 | 24 | router.get('/orders', getOrdersRoute(api)); 25 | router.get('/orders/:id', getOrderRoute(api)); 26 | router.post('/order', createOrderRoute(api)); 27 | 28 | router.post('/push-subscription', createPushSubscriptionRoute(api)); 29 | 30 | router.get('/', indexRoute()); 31 | return router; 32 | } 33 | 34 | -------------------------------------------------------------------------------- /server/api-server/routes/cart/list-items.js: -------------------------------------------------------------------------------- 1 | module.exports = function (api) { 2 | // const GroceryItem = api.db.models['grocery-item']; 3 | const CartItem = api.db.models['cart-item']; 4 | const GroceryItem = api.db.models['grocery-item']; 5 | 6 | let handler = function (req, res) { 7 | // let queryOptions = prepareQuery(req.query || {}); 8 | 9 | return CartItem.findAll({ include: [{model: GroceryItem, as: 'groceryItem'}] }) 10 | .then((results) => { 11 | let plainResults = results.map((x) => x.get({plain: true})) 12 | res.json({data: plainResults}); 13 | return plainResults; 14 | }) 15 | .catch((err) => { 16 | res.status(500); 17 | res.json({ error: `Problem fetching data: ${err}` }); 18 | throw err; 19 | }); 20 | } 21 | return handler; 22 | } -------------------------------------------------------------------------------- /server/api-server/routes/grocery-categories.js: -------------------------------------------------------------------------------- 1 | module.exports = function (api) { 2 | const GroceryItem = api.db.models['grocery-item']; 3 | 4 | let _cachedResults = null; 5 | 6 | return function (req, res) { 7 | if (_cachedResults) { 8 | res.json({ data: _cachedResults }); 9 | return Promise.resolve(_cachedResults); 10 | } 11 | return GroceryItem.count({ attributes: ['category'], group: 'category' }) 12 | .then((results) => { 13 | _cachedResults = results; 14 | res.json({ data: results }); 15 | return _cachedResults; 16 | }) 17 | .catch((err) => { 18 | res.json({ error: `Problem fetching data: ${err}` }); 19 | }); 20 | } 21 | } -------------------------------------------------------------------------------- /server/api-server/routes/grocery-items.js: -------------------------------------------------------------------------------- 1 | 2 | const QUERY_DEFAULTS = Object.freeze({ limit: 10, offset: 0 }); 3 | 4 | function capitalize(str) { 5 | return `${str[0].toUpperCase()}${str.substring(1)}`; 6 | } 7 | 8 | function toTitleCase(rawStr) { 9 | return rawStr 10 | .split(/[\s-]+/g) 11 | .map((s) => capitalize(s)) 12 | .join(' ') 13 | } 14 | 15 | function prepareQuery(rawQuery) { 16 | let queryParams = Object.assign(Object.assign({}, QUERY_DEFAULTS), rawQuery); 17 | let { limit, offset, category } = queryParams; 18 | let safeQuery = { limit, offset }; 19 | if (category) { 20 | safeQuery.where = { 21 | category: toTitleCase(category) 22 | }; 23 | } 24 | return safeQuery; 25 | } 26 | 27 | module.exports = function (api) { 28 | const GroceryItem = api.db.models['grocery-item']; 29 | 30 | return function (req, res) { 31 | let queryOptions = prepareQuery(req.query || {}); 32 | 33 | return GroceryItem.findAll(queryOptions) 34 | .then((results) => { 35 | let plainResults = results.map((x) => x.get({plain: true})) 36 | res.json({data: plainResults}); 37 | return plainResults; 38 | }) 39 | .catch((err) => { 40 | res.json({ error: `Problem fetching data: ${err}` }); 41 | }); 42 | } 43 | } -------------------------------------------------------------------------------- /server/api-server/routes/index.js: -------------------------------------------------------------------------------- 1 | module.exports = function () { 2 | return function (req, res) { 3 | res.json({ 4 | routes: { 5 | get: { 6 | '/grocery/categories': 'Grocery category list', 7 | '/grocery/items': 'Grocery item list', 8 | '/cart/items': 'Cart items list', 9 | '/orders': 'Orders list', 10 | '/orders/:id': 'Order details', 11 | '/': 'This page' 12 | }, 13 | put: { 14 | '/cart/items': 'Update cart contents' 15 | }, 16 | post: { 17 | '/order': 'Create an order (check out)', 18 | '/push-subscription': 'Create WebPush subscription' 19 | } 20 | } 21 | }); 22 | } 23 | } -------------------------------------------------------------------------------- /server/api-server/routes/order/list.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | 3 | module.exports = function (api) { 4 | const Order = api.db.models['order']; 5 | const OrderItem = api.db.models['order-item']; 6 | const GroceryItem = api.db.models['grocery-item']; 7 | 8 | return function (req, res) { 9 | let queryOptions = { 10 | include: [{ 11 | model: OrderItem, 12 | as: 'orderItems', 13 | include: [{ 14 | model: GroceryItem, 15 | as: 'groceryItem' 16 | }] 17 | }] 18 | }; 19 | 20 | 21 | let status = (req.query || {}).status; 22 | switch ((status || '').toLowerCase()) { 23 | case 'all': break; 24 | case undefined: 25 | case '': 26 | queryOptions.where = { 27 | status: 'pending' 28 | }; 29 | break; 30 | case 'pending': 31 | case 'inprogress': 32 | case 'complete': 33 | queryOptions.where = { 34 | status 35 | }; 36 | break; 37 | default: 38 | throw `Invalid status filter: ${status}`; 39 | } 40 | 41 | 42 | return Order.findAll(queryOptions).then((results) => { 43 | let plainResults = results.map((x) => x.get({plain: true})) 44 | res.json({data: plainResults}); 45 | return plainResults; 46 | }).catch((err) => { 47 | res.json({ error: `Problem fetching data: ${err}` }); 48 | }); 49 | } 50 | } -------------------------------------------------------------------------------- /server/api-server/routes/order/show.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | 3 | module.exports = function (api) { 4 | const Order = api.db.models['order']; 5 | const OrderItem = api.db.models['order-item']; 6 | const GroceryItem = api.db.models['grocery-item']; 7 | 8 | return function (req, res) { 9 | let queryOptions = { 10 | where: { 11 | id: req.params.id 12 | }, 13 | include: [{ 14 | model: OrderItem, 15 | as: 'orderItems', 16 | include: [{ 17 | model: GroceryItem, 18 | as: 'groceryItem' 19 | }] 20 | }] 21 | }; 22 | 23 | return Order.findOne(queryOptions).then((result) => { 24 | let plainResult = result.get({plain: true}) 25 | res.json({data: plainResult}); 26 | return plainResult; 27 | }).catch((err) => { 28 | res.json({ error: `Problem fetching data: ${err}` }); 29 | }); 30 | } 31 | } -------------------------------------------------------------------------------- /server/api-server/routes/push-subscription/create.js: -------------------------------------------------------------------------------- 1 | module.exports = function (api) { 2 | const PushSubscription = api.db.models['push-subscription']; 3 | 4 | return function (req, res) { 5 | let { endpoint, keys } = req.body; 6 | PushSubscription.destroy({ 7 | truncate: true 8 | }).then(() => { 9 | return PushSubscription.create({endpoint, keys: JSON.stringify(keys)}).then((ps) => { 10 | let record = ps.get({plain: true}); 11 | record.keys = JSON.parse(record.keys); 12 | res.json(record); 13 | }).catch((err) => { 14 | res.json({ error: `Problem saving data: ${err}` }); 15 | }); 16 | }); 17 | } 18 | } -------------------------------------------------------------------------------- /server/api-server/seed.js: -------------------------------------------------------------------------------- 1 | const Db = require('./db'); 2 | const csvParse = require('csv-parse'); 3 | const fs = require('fs'); 4 | const path = require('path'); 5 | const https = require('https'); 6 | 7 | const db = new Db(); 8 | 9 | const PRICE_REGEX = /\$([0-9]+.[0-9]{0,2})/; 10 | 11 | function processPrice(rawPrice) { 12 | let [, unitPrice] = PRICE_REGEX.exec(rawPrice); 13 | let unit = rawPrice.replace(unitPrice, '').replace(/[^A-Za-z]/g, '').trim(); 14 | return { unitPrice: parseFloat(unitPrice), unit }; 15 | } 16 | 17 | async function seedDb() { 18 | await db.start(); 19 | 20 | let contents = fs.readFileSync(path.join(__dirname, 'seeds.csv')); 21 | 22 | const GroceryItem = db.models['grocery-item']; 23 | await GroceryItem.sync({ force: false }); 24 | 25 | csvParse(contents, (err, items) => { 26 | items.forEach((item, idx) => { 27 | let [name, category, price, imageUrl] = item; 28 | https.get(imageUrl, (response) => { 29 | var file = fs.createWriteStream(path.join(__dirname, '..', 'images', `${idx+1}.jpg`)); 30 | response.pipe(file); 31 | let {unit, unitPrice} = processPrice(price); 32 | return GroceryItem.create({ 33 | name, 34 | category, 35 | price: unitPrice, 36 | unit, 37 | imageUrl: `/images/${idx+1}.jpg` 38 | }); 39 | }); 40 | }); 41 | }); 42 | } 43 | 44 | seedDb(); -------------------------------------------------------------------------------- /server/gen-certs.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk'); 2 | const getDevelopmentCertificate = require('devcert-with-localhost').default; 3 | 4 | const fs = require('fs'); 5 | const path = require('path'); 6 | 7 | const PRIVATE_FOLDER_PATH = path.join(__dirname, '..', 'private'); 8 | const CERT_KEY_PATH = path.join(PRIVATE_FOLDER_PATH, 'key.pem'); 9 | const CERT_PATH = path.join(PRIVATE_FOLDER_PATH, 'cert.pem'); 10 | 11 | if (fs.existsSync(CERT_PATH)) { 12 | process.stdout.write(chalk.yellow.bold('📄 Existing certificate found.') + chalk.dim(' It will be replaced with a new one\n')); 13 | fs.unlinkSync(CERT_PATH); 14 | } 15 | if (fs.existsSync(CERT_KEY_PATH)) { 16 | process.stdout.write(chalk.yellow.bold('🔑 Existing private key found.') + chalk.dim(' It will be replaced with a new one\n')); 17 | fs.unlinkSync(CERT_KEY_PATH); 18 | } 19 | 20 | process.stdout.write(chalk.blue('🔐 Attempting to automatically generate X.509 certificate and private key\n')) 21 | getDevelopmentCertificate('frontend-grocer', { installCertutil: true }) 22 | .then(({key, cert}) => { 23 | process.stdout.write(chalk.green.bold(' ↪ ✅ Success!\n')) 24 | 25 | fs.writeFileSync(CERT_PATH, cert); 26 | fs.writeFileSync(CERT_KEY_PATH, key); 27 | 28 | fs.chmodSync(CERT_PATH, '0400'); 29 | fs.chmodSync(CERT_KEY_PATH, '0400'); 30 | process.exit(0); 31 | }).catch((err) => { 32 | process.stderr.write(chalk.red(` ↪ There was a problem automatically generating X.509 certificates for HTTPS! You may want to consult the "Manually Generating Certificates" section of the README\n${err}\n`)); 33 | process.exit(1); 34 | }); -------------------------------------------------------------------------------- /server/images/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/0.jpg -------------------------------------------------------------------------------- /server/images/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/1.jpg -------------------------------------------------------------------------------- /server/images/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/10.jpg -------------------------------------------------------------------------------- /server/images/100.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/100.jpg -------------------------------------------------------------------------------- /server/images/101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/101.jpg -------------------------------------------------------------------------------- /server/images/102.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/102.jpg -------------------------------------------------------------------------------- /server/images/103.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/103.jpg -------------------------------------------------------------------------------- /server/images/104.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/104.jpg -------------------------------------------------------------------------------- /server/images/105.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/105.jpg -------------------------------------------------------------------------------- /server/images/106.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/106.jpg -------------------------------------------------------------------------------- /server/images/107.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/107.jpg -------------------------------------------------------------------------------- /server/images/108.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/108.jpg -------------------------------------------------------------------------------- /server/images/109.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/109.jpg -------------------------------------------------------------------------------- /server/images/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/11.jpg -------------------------------------------------------------------------------- /server/images/110.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/110.jpg -------------------------------------------------------------------------------- /server/images/111.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/111.jpg -------------------------------------------------------------------------------- /server/images/112.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/112.jpg -------------------------------------------------------------------------------- /server/images/113.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/113.jpg -------------------------------------------------------------------------------- /server/images/114.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/114.jpg -------------------------------------------------------------------------------- /server/images/115.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/115.jpg -------------------------------------------------------------------------------- /server/images/116.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/116.jpg -------------------------------------------------------------------------------- /server/images/117.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/117.jpg -------------------------------------------------------------------------------- /server/images/118.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/118.jpg -------------------------------------------------------------------------------- /server/images/119.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/119.jpg -------------------------------------------------------------------------------- /server/images/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/12.jpg -------------------------------------------------------------------------------- /server/images/120.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/120.jpg -------------------------------------------------------------------------------- /server/images/121.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/121.jpg -------------------------------------------------------------------------------- /server/images/122.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/122.jpg -------------------------------------------------------------------------------- /server/images/123.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/123.jpg -------------------------------------------------------------------------------- /server/images/124.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/124.jpg -------------------------------------------------------------------------------- /server/images/125.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/125.jpg -------------------------------------------------------------------------------- /server/images/126.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/126.jpg -------------------------------------------------------------------------------- /server/images/127.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/127.jpg -------------------------------------------------------------------------------- /server/images/128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/128.jpg -------------------------------------------------------------------------------- /server/images/129.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/129.jpg -------------------------------------------------------------------------------- /server/images/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/13.jpg -------------------------------------------------------------------------------- /server/images/130.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/130.jpg -------------------------------------------------------------------------------- /server/images/131.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/131.jpg -------------------------------------------------------------------------------- /server/images/132.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/132.jpg -------------------------------------------------------------------------------- /server/images/133.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/133.jpg -------------------------------------------------------------------------------- /server/images/134.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/134.jpg -------------------------------------------------------------------------------- /server/images/135.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/135.jpg -------------------------------------------------------------------------------- /server/images/136.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/136.jpg -------------------------------------------------------------------------------- /server/images/137.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/137.jpg -------------------------------------------------------------------------------- /server/images/138.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/138.jpg -------------------------------------------------------------------------------- /server/images/139.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/139.jpg -------------------------------------------------------------------------------- /server/images/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/14.jpg -------------------------------------------------------------------------------- /server/images/140.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/140.jpg -------------------------------------------------------------------------------- /server/images/141.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/141.jpg -------------------------------------------------------------------------------- /server/images/142.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/142.jpg -------------------------------------------------------------------------------- /server/images/143.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/143.jpg -------------------------------------------------------------------------------- /server/images/144.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/144.jpg -------------------------------------------------------------------------------- /server/images/145.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/145.jpg -------------------------------------------------------------------------------- /server/images/146.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/146.jpg -------------------------------------------------------------------------------- /server/images/147.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/147.jpg -------------------------------------------------------------------------------- /server/images/148.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/148.jpg -------------------------------------------------------------------------------- /server/images/149.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/149.jpg -------------------------------------------------------------------------------- /server/images/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/15.jpg -------------------------------------------------------------------------------- /server/images/150.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/150.jpg -------------------------------------------------------------------------------- /server/images/151.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/151.jpg -------------------------------------------------------------------------------- /server/images/152.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/152.jpg -------------------------------------------------------------------------------- /server/images/153.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/153.jpg -------------------------------------------------------------------------------- /server/images/154.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/154.jpg -------------------------------------------------------------------------------- /server/images/155.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/155.jpg -------------------------------------------------------------------------------- /server/images/156.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/156.jpg -------------------------------------------------------------------------------- /server/images/157.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/157.jpg -------------------------------------------------------------------------------- /server/images/158.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/158.jpg -------------------------------------------------------------------------------- /server/images/159.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/159.jpg -------------------------------------------------------------------------------- /server/images/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/16.jpg -------------------------------------------------------------------------------- /server/images/160.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/160.jpg -------------------------------------------------------------------------------- /server/images/161.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/161.jpg -------------------------------------------------------------------------------- /server/images/162.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/162.jpg -------------------------------------------------------------------------------- /server/images/163.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/163.jpg -------------------------------------------------------------------------------- /server/images/164.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/164.jpg -------------------------------------------------------------------------------- /server/images/165.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/165.jpg -------------------------------------------------------------------------------- /server/images/166.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/166.jpg -------------------------------------------------------------------------------- /server/images/167.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/167.jpg -------------------------------------------------------------------------------- /server/images/168.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/168.jpg -------------------------------------------------------------------------------- /server/images/169.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/169.jpg -------------------------------------------------------------------------------- /server/images/17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/17.jpg -------------------------------------------------------------------------------- /server/images/170.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/170.jpg -------------------------------------------------------------------------------- /server/images/171.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/171.jpg -------------------------------------------------------------------------------- /server/images/172.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/172.jpg -------------------------------------------------------------------------------- /server/images/173.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/173.jpg -------------------------------------------------------------------------------- /server/images/174.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/174.jpg -------------------------------------------------------------------------------- /server/images/175.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/175.jpg -------------------------------------------------------------------------------- /server/images/176.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/176.jpg -------------------------------------------------------------------------------- /server/images/177.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/177.jpg -------------------------------------------------------------------------------- /server/images/178.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/178.jpg -------------------------------------------------------------------------------- /server/images/179.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/179.jpg -------------------------------------------------------------------------------- /server/images/18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/18.jpg -------------------------------------------------------------------------------- /server/images/180.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/180.jpg -------------------------------------------------------------------------------- /server/images/181.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/181.jpg -------------------------------------------------------------------------------- /server/images/182.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/182.jpg -------------------------------------------------------------------------------- /server/images/183.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/183.jpg -------------------------------------------------------------------------------- /server/images/184.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/184.jpg -------------------------------------------------------------------------------- /server/images/185.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/185.jpg -------------------------------------------------------------------------------- /server/images/186.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/186.jpg -------------------------------------------------------------------------------- /server/images/187.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/187.jpg -------------------------------------------------------------------------------- /server/images/188.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/188.jpg -------------------------------------------------------------------------------- /server/images/189.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/189.jpg -------------------------------------------------------------------------------- /server/images/19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/19.jpg -------------------------------------------------------------------------------- /server/images/190.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/190.jpg -------------------------------------------------------------------------------- /server/images/191.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/191.jpg -------------------------------------------------------------------------------- /server/images/192.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/192.jpg -------------------------------------------------------------------------------- /server/images/193.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/193.jpg -------------------------------------------------------------------------------- /server/images/194.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/194.jpg -------------------------------------------------------------------------------- /server/images/195.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/195.jpg -------------------------------------------------------------------------------- /server/images/196.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/196.jpg -------------------------------------------------------------------------------- /server/images/197.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/197.jpg -------------------------------------------------------------------------------- /server/images/198.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/198.jpg -------------------------------------------------------------------------------- /server/images/199.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/199.jpg -------------------------------------------------------------------------------- /server/images/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/2.jpg -------------------------------------------------------------------------------- /server/images/20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/20.jpg -------------------------------------------------------------------------------- /server/images/200.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/200.jpg -------------------------------------------------------------------------------- /server/images/201.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/201.jpg -------------------------------------------------------------------------------- /server/images/202.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/202.jpg -------------------------------------------------------------------------------- /server/images/203.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/203.jpg -------------------------------------------------------------------------------- /server/images/204.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/204.jpg -------------------------------------------------------------------------------- /server/images/205.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/205.jpg -------------------------------------------------------------------------------- /server/images/206.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/206.jpg -------------------------------------------------------------------------------- /server/images/207.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/207.jpg -------------------------------------------------------------------------------- /server/images/208.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/208.jpg -------------------------------------------------------------------------------- /server/images/209.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/209.jpg -------------------------------------------------------------------------------- /server/images/21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/21.jpg -------------------------------------------------------------------------------- /server/images/210.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/210.jpg -------------------------------------------------------------------------------- /server/images/211.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/211.jpg -------------------------------------------------------------------------------- /server/images/212.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/212.jpg -------------------------------------------------------------------------------- /server/images/213.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/213.jpg -------------------------------------------------------------------------------- /server/images/214.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/214.jpg -------------------------------------------------------------------------------- /server/images/215.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/215.jpg -------------------------------------------------------------------------------- /server/images/216.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/216.jpg -------------------------------------------------------------------------------- /server/images/217.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/217.jpg -------------------------------------------------------------------------------- /server/images/218.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/218.jpg -------------------------------------------------------------------------------- /server/images/219.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/219.jpg -------------------------------------------------------------------------------- /server/images/22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/22.jpg -------------------------------------------------------------------------------- /server/images/220.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/220.jpg -------------------------------------------------------------------------------- /server/images/221.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/221.jpg -------------------------------------------------------------------------------- /server/images/222.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/222.jpg -------------------------------------------------------------------------------- /server/images/223.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/223.jpg -------------------------------------------------------------------------------- /server/images/224.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/224.jpg -------------------------------------------------------------------------------- /server/images/225.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/225.jpg -------------------------------------------------------------------------------- /server/images/226.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/226.jpg -------------------------------------------------------------------------------- /server/images/227.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/227.jpg -------------------------------------------------------------------------------- /server/images/228.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/228.jpg -------------------------------------------------------------------------------- /server/images/229.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/229.jpg -------------------------------------------------------------------------------- /server/images/23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/23.jpg -------------------------------------------------------------------------------- /server/images/230.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/230.jpg -------------------------------------------------------------------------------- /server/images/231.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/231.jpg -------------------------------------------------------------------------------- /server/images/232.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/232.jpg -------------------------------------------------------------------------------- /server/images/233.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/233.jpg -------------------------------------------------------------------------------- /server/images/234.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/234.jpg -------------------------------------------------------------------------------- /server/images/235.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/235.jpg -------------------------------------------------------------------------------- /server/images/236.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/236.jpg -------------------------------------------------------------------------------- /server/images/237.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/237.jpg -------------------------------------------------------------------------------- /server/images/238.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/238.jpg -------------------------------------------------------------------------------- /server/images/239.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/239.jpg -------------------------------------------------------------------------------- /server/images/24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/24.jpg -------------------------------------------------------------------------------- /server/images/240.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/240.jpg -------------------------------------------------------------------------------- /server/images/241.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/241.jpg -------------------------------------------------------------------------------- /server/images/242.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/242.jpg -------------------------------------------------------------------------------- /server/images/243.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/243.jpg -------------------------------------------------------------------------------- /server/images/244.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/244.jpg -------------------------------------------------------------------------------- /server/images/245.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/245.jpg -------------------------------------------------------------------------------- /server/images/246.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/246.jpg -------------------------------------------------------------------------------- /server/images/247.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/247.jpg -------------------------------------------------------------------------------- /server/images/248.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/248.jpg -------------------------------------------------------------------------------- /server/images/249.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/249.jpg -------------------------------------------------------------------------------- /server/images/25.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/25.jpg -------------------------------------------------------------------------------- /server/images/250.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/250.jpg -------------------------------------------------------------------------------- /server/images/251.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/251.jpg -------------------------------------------------------------------------------- /server/images/252.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/252.jpg -------------------------------------------------------------------------------- /server/images/253.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/253.jpg -------------------------------------------------------------------------------- /server/images/254.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/254.jpg -------------------------------------------------------------------------------- /server/images/255.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/255.jpg -------------------------------------------------------------------------------- /server/images/256.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/256.jpg -------------------------------------------------------------------------------- /server/images/257.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/257.jpg -------------------------------------------------------------------------------- /server/images/258.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/258.jpg -------------------------------------------------------------------------------- /server/images/259.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/259.jpg -------------------------------------------------------------------------------- /server/images/26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/26.jpg -------------------------------------------------------------------------------- /server/images/260.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/260.jpg -------------------------------------------------------------------------------- /server/images/261.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/261.jpg -------------------------------------------------------------------------------- /server/images/262.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/262.jpg -------------------------------------------------------------------------------- /server/images/263.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/263.jpg -------------------------------------------------------------------------------- /server/images/264.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/264.jpg -------------------------------------------------------------------------------- /server/images/265.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/265.jpg -------------------------------------------------------------------------------- /server/images/266.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/266.jpg -------------------------------------------------------------------------------- /server/images/267.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/267.jpg -------------------------------------------------------------------------------- /server/images/268.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/268.jpg -------------------------------------------------------------------------------- /server/images/269.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/269.jpg -------------------------------------------------------------------------------- /server/images/27.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/27.jpg -------------------------------------------------------------------------------- /server/images/270.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/270.jpg -------------------------------------------------------------------------------- /server/images/271.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/271.jpg -------------------------------------------------------------------------------- /server/images/272.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/272.jpg -------------------------------------------------------------------------------- /server/images/273.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/273.jpg -------------------------------------------------------------------------------- /server/images/274.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/274.jpg -------------------------------------------------------------------------------- /server/images/275.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/275.jpg -------------------------------------------------------------------------------- /server/images/276.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/276.jpg -------------------------------------------------------------------------------- /server/images/277.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/277.jpg -------------------------------------------------------------------------------- /server/images/278.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/278.jpg -------------------------------------------------------------------------------- /server/images/279.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/279.jpg -------------------------------------------------------------------------------- /server/images/28.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/28.jpg -------------------------------------------------------------------------------- /server/images/280.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/280.jpg -------------------------------------------------------------------------------- /server/images/281.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/281.jpg -------------------------------------------------------------------------------- /server/images/282.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/282.jpg -------------------------------------------------------------------------------- /server/images/283.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/283.jpg -------------------------------------------------------------------------------- /server/images/284.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/284.jpg -------------------------------------------------------------------------------- /server/images/285.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/285.jpg -------------------------------------------------------------------------------- /server/images/286.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/286.jpg -------------------------------------------------------------------------------- /server/images/287.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/287.jpg -------------------------------------------------------------------------------- /server/images/288.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/288.jpg -------------------------------------------------------------------------------- /server/images/289.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/289.jpg -------------------------------------------------------------------------------- /server/images/29.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/29.jpg -------------------------------------------------------------------------------- /server/images/290.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/290.jpg -------------------------------------------------------------------------------- /server/images/291.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/291.jpg -------------------------------------------------------------------------------- /server/images/292.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/292.jpg -------------------------------------------------------------------------------- /server/images/293.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/293.jpg -------------------------------------------------------------------------------- /server/images/294.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/294.jpg -------------------------------------------------------------------------------- /server/images/295.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/295.jpg -------------------------------------------------------------------------------- /server/images/296.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/296.jpg -------------------------------------------------------------------------------- /server/images/297.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/297.jpg -------------------------------------------------------------------------------- /server/images/298.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/298.jpg -------------------------------------------------------------------------------- /server/images/299.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/299.jpg -------------------------------------------------------------------------------- /server/images/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/3.jpg -------------------------------------------------------------------------------- /server/images/30.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/30.jpg -------------------------------------------------------------------------------- /server/images/300.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/300.jpg -------------------------------------------------------------------------------- /server/images/301.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/301.jpg -------------------------------------------------------------------------------- /server/images/302.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/302.jpg -------------------------------------------------------------------------------- /server/images/303.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/303.jpg -------------------------------------------------------------------------------- /server/images/304.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/304.jpg -------------------------------------------------------------------------------- /server/images/305.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/305.jpg -------------------------------------------------------------------------------- /server/images/306.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/306.jpg -------------------------------------------------------------------------------- /server/images/307.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/307.jpg -------------------------------------------------------------------------------- /server/images/308.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/308.jpg -------------------------------------------------------------------------------- /server/images/309.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/309.jpg -------------------------------------------------------------------------------- /server/images/31.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/31.jpg -------------------------------------------------------------------------------- /server/images/310.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/310.jpg -------------------------------------------------------------------------------- /server/images/311.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/311.jpg -------------------------------------------------------------------------------- /server/images/312.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/312.jpg -------------------------------------------------------------------------------- /server/images/313.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/313.jpg -------------------------------------------------------------------------------- /server/images/314.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/314.jpg -------------------------------------------------------------------------------- /server/images/315.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/315.jpg -------------------------------------------------------------------------------- /server/images/316.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/316.jpg -------------------------------------------------------------------------------- /server/images/317.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/317.jpg -------------------------------------------------------------------------------- /server/images/318.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/318.jpg -------------------------------------------------------------------------------- /server/images/319.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/319.jpg -------------------------------------------------------------------------------- /server/images/32.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/32.jpg -------------------------------------------------------------------------------- /server/images/320.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/320.jpg -------------------------------------------------------------------------------- /server/images/321.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/321.jpg -------------------------------------------------------------------------------- /server/images/322.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/322.jpg -------------------------------------------------------------------------------- /server/images/323.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/323.jpg -------------------------------------------------------------------------------- /server/images/324.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/324.jpg -------------------------------------------------------------------------------- /server/images/325.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/325.jpg -------------------------------------------------------------------------------- /server/images/326.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/326.jpg -------------------------------------------------------------------------------- /server/images/327.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/327.jpg -------------------------------------------------------------------------------- /server/images/328.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/328.jpg -------------------------------------------------------------------------------- /server/images/329.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/329.jpg -------------------------------------------------------------------------------- /server/images/33.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/33.jpg -------------------------------------------------------------------------------- /server/images/330.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/330.jpg -------------------------------------------------------------------------------- /server/images/331.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/331.jpg -------------------------------------------------------------------------------- /server/images/332.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/332.jpg -------------------------------------------------------------------------------- /server/images/333.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/333.jpg -------------------------------------------------------------------------------- /server/images/334.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/334.jpg -------------------------------------------------------------------------------- /server/images/335.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/335.jpg -------------------------------------------------------------------------------- /server/images/336.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/336.jpg -------------------------------------------------------------------------------- /server/images/337.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/337.jpg -------------------------------------------------------------------------------- /server/images/338.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/338.jpg -------------------------------------------------------------------------------- /server/images/339.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/339.jpg -------------------------------------------------------------------------------- /server/images/34.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/34.jpg -------------------------------------------------------------------------------- /server/images/340.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/340.jpg -------------------------------------------------------------------------------- /server/images/341.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/341.jpg -------------------------------------------------------------------------------- /server/images/342.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/342.jpg -------------------------------------------------------------------------------- /server/images/343.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/343.jpg -------------------------------------------------------------------------------- /server/images/344.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/344.jpg -------------------------------------------------------------------------------- /server/images/345.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/345.jpg -------------------------------------------------------------------------------- /server/images/346.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/346.jpg -------------------------------------------------------------------------------- /server/images/347.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/347.jpg -------------------------------------------------------------------------------- /server/images/348.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/348.jpg -------------------------------------------------------------------------------- /server/images/349.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/349.jpg -------------------------------------------------------------------------------- /server/images/35.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/35.jpg -------------------------------------------------------------------------------- /server/images/350.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/350.jpg -------------------------------------------------------------------------------- /server/images/351.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/351.jpg -------------------------------------------------------------------------------- /server/images/352.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/352.jpg -------------------------------------------------------------------------------- /server/images/353.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/353.jpg -------------------------------------------------------------------------------- /server/images/354.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/354.jpg -------------------------------------------------------------------------------- /server/images/355.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/355.jpg -------------------------------------------------------------------------------- /server/images/356.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/356.jpg -------------------------------------------------------------------------------- /server/images/357.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/357.jpg -------------------------------------------------------------------------------- /server/images/358.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/358.jpg -------------------------------------------------------------------------------- /server/images/359.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/359.jpg -------------------------------------------------------------------------------- /server/images/36.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/36.jpg -------------------------------------------------------------------------------- /server/images/360.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/360.jpg -------------------------------------------------------------------------------- /server/images/361.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/361.jpg -------------------------------------------------------------------------------- /server/images/362.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/362.jpg -------------------------------------------------------------------------------- /server/images/363.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/363.jpg -------------------------------------------------------------------------------- /server/images/364.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/364.jpg -------------------------------------------------------------------------------- /server/images/365.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/365.jpg -------------------------------------------------------------------------------- /server/images/366.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/366.jpg -------------------------------------------------------------------------------- /server/images/367.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/367.jpg -------------------------------------------------------------------------------- /server/images/368.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/368.jpg -------------------------------------------------------------------------------- /server/images/369.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/369.jpg -------------------------------------------------------------------------------- /server/images/37.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/37.jpg -------------------------------------------------------------------------------- /server/images/370.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/370.jpg -------------------------------------------------------------------------------- /server/images/371.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/371.jpg -------------------------------------------------------------------------------- /server/images/372.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/372.jpg -------------------------------------------------------------------------------- /server/images/373.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/373.jpg -------------------------------------------------------------------------------- /server/images/374.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/374.jpg -------------------------------------------------------------------------------- /server/images/375.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/375.jpg -------------------------------------------------------------------------------- /server/images/376.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/376.jpg -------------------------------------------------------------------------------- /server/images/377.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/377.jpg -------------------------------------------------------------------------------- /server/images/378.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/378.jpg -------------------------------------------------------------------------------- /server/images/379.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/379.jpg -------------------------------------------------------------------------------- /server/images/38.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/38.jpg -------------------------------------------------------------------------------- /server/images/380.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/380.jpg -------------------------------------------------------------------------------- /server/images/381.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/381.jpg -------------------------------------------------------------------------------- /server/images/382.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/382.jpg -------------------------------------------------------------------------------- /server/images/383.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/383.jpg -------------------------------------------------------------------------------- /server/images/384.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/384.jpg -------------------------------------------------------------------------------- /server/images/385.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/385.jpg -------------------------------------------------------------------------------- /server/images/386.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/386.jpg -------------------------------------------------------------------------------- /server/images/387.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/387.jpg -------------------------------------------------------------------------------- /server/images/388.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/388.jpg -------------------------------------------------------------------------------- /server/images/389.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/389.jpg -------------------------------------------------------------------------------- /server/images/39.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/39.jpg -------------------------------------------------------------------------------- /server/images/390.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/390.jpg -------------------------------------------------------------------------------- /server/images/391.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/391.jpg -------------------------------------------------------------------------------- /server/images/392.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/392.jpg -------------------------------------------------------------------------------- /server/images/393.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/393.jpg -------------------------------------------------------------------------------- /server/images/394.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/394.jpg -------------------------------------------------------------------------------- /server/images/395.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/395.jpg -------------------------------------------------------------------------------- /server/images/396.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/396.jpg -------------------------------------------------------------------------------- /server/images/397.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/397.jpg -------------------------------------------------------------------------------- /server/images/398.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/398.jpg -------------------------------------------------------------------------------- /server/images/399.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/399.jpg -------------------------------------------------------------------------------- /server/images/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/4.jpg -------------------------------------------------------------------------------- /server/images/40.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/40.jpg -------------------------------------------------------------------------------- /server/images/400.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/400.jpg -------------------------------------------------------------------------------- /server/images/401.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/401.jpg -------------------------------------------------------------------------------- /server/images/402.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/402.jpg -------------------------------------------------------------------------------- /server/images/403.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/403.jpg -------------------------------------------------------------------------------- /server/images/404.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/404.jpg -------------------------------------------------------------------------------- /server/images/405.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/405.jpg -------------------------------------------------------------------------------- /server/images/406.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/406.jpg -------------------------------------------------------------------------------- /server/images/407.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/407.jpg -------------------------------------------------------------------------------- /server/images/408.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/408.jpg -------------------------------------------------------------------------------- /server/images/409.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/409.jpg -------------------------------------------------------------------------------- /server/images/41.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/41.jpg -------------------------------------------------------------------------------- /server/images/410.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/410.jpg -------------------------------------------------------------------------------- /server/images/411.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/411.jpg -------------------------------------------------------------------------------- /server/images/412.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/412.jpg -------------------------------------------------------------------------------- /server/images/413.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/413.jpg -------------------------------------------------------------------------------- /server/images/414.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/414.jpg -------------------------------------------------------------------------------- /server/images/415.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/415.jpg -------------------------------------------------------------------------------- /server/images/416.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/416.jpg -------------------------------------------------------------------------------- /server/images/417.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/417.jpg -------------------------------------------------------------------------------- /server/images/418.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/418.jpg -------------------------------------------------------------------------------- /server/images/419.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/419.jpg -------------------------------------------------------------------------------- /server/images/42.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/42.jpg -------------------------------------------------------------------------------- /server/images/420.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/420.jpg -------------------------------------------------------------------------------- /server/images/421.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/421.jpg -------------------------------------------------------------------------------- /server/images/422.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/422.jpg -------------------------------------------------------------------------------- /server/images/423.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/423.jpg -------------------------------------------------------------------------------- /server/images/424.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/424.jpg -------------------------------------------------------------------------------- /server/images/425.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/425.jpg -------------------------------------------------------------------------------- /server/images/426.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/426.jpg -------------------------------------------------------------------------------- /server/images/427.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/427.jpg -------------------------------------------------------------------------------- /server/images/428.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/428.jpg -------------------------------------------------------------------------------- /server/images/429.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/429.jpg -------------------------------------------------------------------------------- /server/images/43.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/43.jpg -------------------------------------------------------------------------------- /server/images/430.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/430.jpg -------------------------------------------------------------------------------- /server/images/431.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/431.jpg -------------------------------------------------------------------------------- /server/images/432.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/432.jpg -------------------------------------------------------------------------------- /server/images/433.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/433.jpg -------------------------------------------------------------------------------- /server/images/434.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/434.jpg -------------------------------------------------------------------------------- /server/images/435.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/435.jpg -------------------------------------------------------------------------------- /server/images/436.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/436.jpg -------------------------------------------------------------------------------- /server/images/437.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/437.jpg -------------------------------------------------------------------------------- /server/images/438.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/438.jpg -------------------------------------------------------------------------------- /server/images/439.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/439.jpg -------------------------------------------------------------------------------- /server/images/44.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/44.jpg -------------------------------------------------------------------------------- /server/images/440.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/440.jpg -------------------------------------------------------------------------------- /server/images/441.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/441.jpg -------------------------------------------------------------------------------- /server/images/442.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/442.jpg -------------------------------------------------------------------------------- /server/images/443.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/443.jpg -------------------------------------------------------------------------------- /server/images/444.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/444.jpg -------------------------------------------------------------------------------- /server/images/445.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/445.jpg -------------------------------------------------------------------------------- /server/images/446.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/446.jpg -------------------------------------------------------------------------------- /server/images/447.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/447.jpg -------------------------------------------------------------------------------- /server/images/448.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/448.jpg -------------------------------------------------------------------------------- /server/images/449.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/449.jpg -------------------------------------------------------------------------------- /server/images/45.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/45.jpg -------------------------------------------------------------------------------- /server/images/450.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/450.jpg -------------------------------------------------------------------------------- /server/images/451.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/451.jpg -------------------------------------------------------------------------------- /server/images/452.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/452.jpg -------------------------------------------------------------------------------- /server/images/453.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/453.jpg -------------------------------------------------------------------------------- /server/images/454.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/454.jpg -------------------------------------------------------------------------------- /server/images/455.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/455.jpg -------------------------------------------------------------------------------- /server/images/456.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/456.jpg -------------------------------------------------------------------------------- /server/images/457.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/457.jpg -------------------------------------------------------------------------------- /server/images/458.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/458.jpg -------------------------------------------------------------------------------- /server/images/459.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/459.jpg -------------------------------------------------------------------------------- /server/images/46.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/46.jpg -------------------------------------------------------------------------------- /server/images/460.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/460.jpg -------------------------------------------------------------------------------- /server/images/461.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/461.jpg -------------------------------------------------------------------------------- /server/images/462.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/462.jpg -------------------------------------------------------------------------------- /server/images/463.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/463.jpg -------------------------------------------------------------------------------- /server/images/464.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/464.jpg -------------------------------------------------------------------------------- /server/images/465.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/465.jpg -------------------------------------------------------------------------------- /server/images/466.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/466.jpg -------------------------------------------------------------------------------- /server/images/467.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/467.jpg -------------------------------------------------------------------------------- /server/images/468.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/468.jpg -------------------------------------------------------------------------------- /server/images/469.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/469.jpg -------------------------------------------------------------------------------- /server/images/47.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/47.jpg -------------------------------------------------------------------------------- /server/images/470.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/470.jpg -------------------------------------------------------------------------------- /server/images/471.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/471.jpg -------------------------------------------------------------------------------- /server/images/472.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/472.jpg -------------------------------------------------------------------------------- /server/images/473.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/473.jpg -------------------------------------------------------------------------------- /server/images/474.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/474.jpg -------------------------------------------------------------------------------- /server/images/475.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/475.jpg -------------------------------------------------------------------------------- /server/images/476.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/476.jpg -------------------------------------------------------------------------------- /server/images/477.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/477.jpg -------------------------------------------------------------------------------- /server/images/478.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/478.jpg -------------------------------------------------------------------------------- /server/images/479.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/479.jpg -------------------------------------------------------------------------------- /server/images/48.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/48.jpg -------------------------------------------------------------------------------- /server/images/480.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/480.jpg -------------------------------------------------------------------------------- /server/images/481.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/481.jpg -------------------------------------------------------------------------------- /server/images/482.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/482.jpg -------------------------------------------------------------------------------- /server/images/483.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/483.jpg -------------------------------------------------------------------------------- /server/images/484.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/484.jpg -------------------------------------------------------------------------------- /server/images/485.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/485.jpg -------------------------------------------------------------------------------- /server/images/486.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/486.jpg -------------------------------------------------------------------------------- /server/images/487.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/487.jpg -------------------------------------------------------------------------------- /server/images/488.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/488.jpg -------------------------------------------------------------------------------- /server/images/489.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/489.jpg -------------------------------------------------------------------------------- /server/images/49.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/49.jpg -------------------------------------------------------------------------------- /server/images/490.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/490.jpg -------------------------------------------------------------------------------- /server/images/491.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/491.jpg -------------------------------------------------------------------------------- /server/images/492.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/492.jpg -------------------------------------------------------------------------------- /server/images/493.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/493.jpg -------------------------------------------------------------------------------- /server/images/494.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/494.jpg -------------------------------------------------------------------------------- /server/images/495.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/495.jpg -------------------------------------------------------------------------------- /server/images/496.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/496.jpg -------------------------------------------------------------------------------- /server/images/497.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/497.jpg -------------------------------------------------------------------------------- /server/images/498.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/498.jpg -------------------------------------------------------------------------------- /server/images/499.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/499.jpg -------------------------------------------------------------------------------- /server/images/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/5.jpg -------------------------------------------------------------------------------- /server/images/50.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/50.jpg -------------------------------------------------------------------------------- /server/images/500.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/500.jpg -------------------------------------------------------------------------------- /server/images/501.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/501.jpg -------------------------------------------------------------------------------- /server/images/502.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/502.jpg -------------------------------------------------------------------------------- /server/images/503.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/503.jpg -------------------------------------------------------------------------------- /server/images/504.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/504.jpg -------------------------------------------------------------------------------- /server/images/505.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/505.jpg -------------------------------------------------------------------------------- /server/images/506.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/506.jpg -------------------------------------------------------------------------------- /server/images/507.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/507.jpg -------------------------------------------------------------------------------- /server/images/508.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/508.jpg -------------------------------------------------------------------------------- /server/images/509.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/509.jpg -------------------------------------------------------------------------------- /server/images/51.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/51.jpg -------------------------------------------------------------------------------- /server/images/510.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/510.jpg -------------------------------------------------------------------------------- /server/images/511.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/511.jpg -------------------------------------------------------------------------------- /server/images/512.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/512.jpg -------------------------------------------------------------------------------- /server/images/513.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/513.jpg -------------------------------------------------------------------------------- /server/images/514.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/514.jpg -------------------------------------------------------------------------------- /server/images/515.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/515.jpg -------------------------------------------------------------------------------- /server/images/516.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/516.jpg -------------------------------------------------------------------------------- /server/images/517.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/517.jpg -------------------------------------------------------------------------------- /server/images/518.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/518.jpg -------------------------------------------------------------------------------- /server/images/519.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/519.jpg -------------------------------------------------------------------------------- /server/images/52.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/52.jpg -------------------------------------------------------------------------------- /server/images/520.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/520.jpg -------------------------------------------------------------------------------- /server/images/521.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/521.jpg -------------------------------------------------------------------------------- /server/images/522.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/522.jpg -------------------------------------------------------------------------------- /server/images/523.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/523.jpg -------------------------------------------------------------------------------- /server/images/524.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/524.jpg -------------------------------------------------------------------------------- /server/images/525.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/525.jpg -------------------------------------------------------------------------------- /server/images/526.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/526.jpg -------------------------------------------------------------------------------- /server/images/527.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/527.jpg -------------------------------------------------------------------------------- /server/images/528.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/528.jpg -------------------------------------------------------------------------------- /server/images/529.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/529.jpg -------------------------------------------------------------------------------- /server/images/53.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/53.jpg -------------------------------------------------------------------------------- /server/images/530.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/530.jpg -------------------------------------------------------------------------------- /server/images/531.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/531.jpg -------------------------------------------------------------------------------- /server/images/532.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/532.jpg -------------------------------------------------------------------------------- /server/images/533.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/533.jpg -------------------------------------------------------------------------------- /server/images/534.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/534.jpg -------------------------------------------------------------------------------- /server/images/535.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/535.jpg -------------------------------------------------------------------------------- /server/images/536.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/536.jpg -------------------------------------------------------------------------------- /server/images/537.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/537.jpg -------------------------------------------------------------------------------- /server/images/538.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/538.jpg -------------------------------------------------------------------------------- /server/images/539.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/539.jpg -------------------------------------------------------------------------------- /server/images/54.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/54.jpg -------------------------------------------------------------------------------- /server/images/55.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/55.jpg -------------------------------------------------------------------------------- /server/images/56.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/56.jpg -------------------------------------------------------------------------------- /server/images/57.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/57.jpg -------------------------------------------------------------------------------- /server/images/58.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/58.jpg -------------------------------------------------------------------------------- /server/images/59.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/59.jpg -------------------------------------------------------------------------------- /server/images/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/6.jpg -------------------------------------------------------------------------------- /server/images/60.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/60.jpg -------------------------------------------------------------------------------- /server/images/61.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/61.jpg -------------------------------------------------------------------------------- /server/images/62.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/62.jpg -------------------------------------------------------------------------------- /server/images/63.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/63.jpg -------------------------------------------------------------------------------- /server/images/64.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/64.jpg -------------------------------------------------------------------------------- /server/images/65.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/65.jpg -------------------------------------------------------------------------------- /server/images/66.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/66.jpg -------------------------------------------------------------------------------- /server/images/67.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/67.jpg -------------------------------------------------------------------------------- /server/images/68.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/68.jpg -------------------------------------------------------------------------------- /server/images/69.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/69.jpg -------------------------------------------------------------------------------- /server/images/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/7.jpg -------------------------------------------------------------------------------- /server/images/70.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/70.jpg -------------------------------------------------------------------------------- /server/images/71.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/71.jpg -------------------------------------------------------------------------------- /server/images/72.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/72.jpg -------------------------------------------------------------------------------- /server/images/73.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/73.jpg -------------------------------------------------------------------------------- /server/images/74.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/74.jpg -------------------------------------------------------------------------------- /server/images/75.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/75.jpg -------------------------------------------------------------------------------- /server/images/76.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/76.jpg -------------------------------------------------------------------------------- /server/images/77.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/77.jpg -------------------------------------------------------------------------------- /server/images/78.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/78.jpg -------------------------------------------------------------------------------- /server/images/79.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/79.jpg -------------------------------------------------------------------------------- /server/images/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/8.jpg -------------------------------------------------------------------------------- /server/images/80.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/80.jpg -------------------------------------------------------------------------------- /server/images/81.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/81.jpg -------------------------------------------------------------------------------- /server/images/82.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/82.jpg -------------------------------------------------------------------------------- /server/images/83.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/83.jpg -------------------------------------------------------------------------------- /server/images/84.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/84.jpg -------------------------------------------------------------------------------- /server/images/85.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/85.jpg -------------------------------------------------------------------------------- /server/images/86.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/86.jpg -------------------------------------------------------------------------------- /server/images/87.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/87.jpg -------------------------------------------------------------------------------- /server/images/88.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/88.jpg -------------------------------------------------------------------------------- /server/images/89.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/89.jpg -------------------------------------------------------------------------------- /server/images/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/9.jpg -------------------------------------------------------------------------------- /server/images/90.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/90.jpg -------------------------------------------------------------------------------- /server/images/91.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/91.jpg -------------------------------------------------------------------------------- /server/images/92.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/92.jpg -------------------------------------------------------------------------------- /server/images/93.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/93.jpg -------------------------------------------------------------------------------- /server/images/94.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/94.jpg -------------------------------------------------------------------------------- /server/images/95.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/95.jpg -------------------------------------------------------------------------------- /server/images/96.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/96.jpg -------------------------------------------------------------------------------- /server/images/97.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/97.jpg -------------------------------------------------------------------------------- /server/images/98.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/98.jpg -------------------------------------------------------------------------------- /server/images/99.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/99.jpg -------------------------------------------------------------------------------- /server/images/fallback-bakery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/fallback-bakery.png -------------------------------------------------------------------------------- /server/images/fallback-dairy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/fallback-dairy.png -------------------------------------------------------------------------------- /server/images/fallback-frozen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/fallback-frozen.png -------------------------------------------------------------------------------- /server/images/fallback-fruit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/fallback-fruit.png -------------------------------------------------------------------------------- /server/images/fallback-grocery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/fallback-grocery.png -------------------------------------------------------------------------------- /server/images/fallback-herbs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/fallback-herbs.png -------------------------------------------------------------------------------- /server/images/fallback-meat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/fallback-meat.png -------------------------------------------------------------------------------- /server/images/fallback-vegetables.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mike-works/pwa-fundamentals/7ca6111c220f03bf0bf34c5746b442d08341b2a1/server/images/fallback-vegetables.png -------------------------------------------------------------------------------- /tools/SCSSStub.js: -------------------------------------------------------------------------------- 1 | /* eslint-env node */ 2 | module.exports = {}; 3 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | /* eslint-env node */ 2 | const path = require('path'); 3 | 4 | const moduleConfig = require('./webpack/module.config'); 5 | const plugins = require('./webpack/plugins.config'); 6 | const devServer = require('./webpack/devserver.config'); 7 | 8 | module.exports = function(env) { 9 | const mode = (env === 'dev') ? 'development' : 'production'; 10 | 11 | return { 12 | entry: ['webpack-hot-middleware/client', './client/index.js'], 13 | stats: { 14 | colors: true 15 | }, 16 | mode, 17 | resolve: { 18 | extensions: ['.js', '.jsx'] 19 | }, 20 | devServer: devServer(...arguments), 21 | devtool: 'cheap-module-source-map', 22 | output: { 23 | filename: '[name]-[hash].js', 24 | publicPath: '/', 25 | path: path.resolve(__dirname, 'dist') 26 | }, 27 | module: moduleConfig(...arguments), 28 | plugins: plugins(...arguments) 29 | }; 30 | }; 31 | -------------------------------------------------------------------------------- /webpack/devserver.config.js: -------------------------------------------------------------------------------- 1 | /* eslint-env node */ 2 | 3 | module.exports = function(/*env*/) { 4 | return { 5 | port: 3000, 6 | host: 'localhost', 7 | historyApiFallback: true, 8 | compress: true, 9 | debug: true, 10 | disableHostCheck: true, 11 | stats: { 12 | colors: true 13 | } 14 | }; 15 | }; 16 | -------------------------------------------------------------------------------- /webpack/extract-sass.js: -------------------------------------------------------------------------------- 1 | /* eslint-env node */ 2 | const ExtractTextPlugin = require('extract-text-webpack-plugin'); 3 | 4 | module.exports = new ExtractTextPlugin({ 5 | filename: '[name]-[hash].css', 6 | disable: process.env.NODE_ENV === 'development' 7 | }); 8 | -------------------------------------------------------------------------------- /webpack/html.config.js: -------------------------------------------------------------------------------- 1 | /* eslint-env node */ 2 | module.exports = { 3 | title: 'Frontend Grocers', 4 | template: 'client/index.ejs', 5 | apiEndpoint: process.env.API_ENDPOINT || 'https://localhost:3100' 6 | }; -------------------------------------------------------------------------------- /webpack/module.config.js: -------------------------------------------------------------------------------- 1 | /* eslint-env node */ 2 | 3 | const extractSass = require('./extract-sass'); 4 | 5 | module.exports = function() { 6 | return { 7 | rules: [ 8 | { 9 | test: /\.jsx?$/, 10 | exclude: /node_modules/, 11 | use: [ 12 | { 13 | loader: 'babel-loader' 14 | }, 15 | { 16 | loader: 'eslint-loader', 17 | options: { 18 | emitError: true 19 | } 20 | } 21 | ] 22 | }, 23 | { 24 | test: /\.scss$/, 25 | use: [ 26 | 'style-loader', // creates style nodes from JS strings 27 | 'css-loader', // translates CSS into CommonJS 28 | { 29 | loader: 'sass-loader', 30 | options: { 31 | includePaths: ['node_modules/muicss/lib/sass'] 32 | } 33 | } 34 | ] 35 | } 36 | ] 37 | }; 38 | }; 39 | -------------------------------------------------------------------------------- /webpack/plugins.config.js: -------------------------------------------------------------------------------- 1 | /* eslint-env node */ 2 | const webpack = require('webpack'); 3 | 4 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 5 | const CompressionPlugin = require('compression-webpack-plugin'); 6 | const StyleExtHtmlWebpackPlugin = require('style-ext-html-webpack-plugin'); 7 | var ManifestPlugin = require('webpack-manifest-plugin'); 8 | var BundleAnalyzerPlugin = require('webpack-bundle-analyzer') 9 | .BundleAnalyzerPlugin; 10 | 11 | const extractSass = require('./extract-sass'); 12 | const html = require('./html.config'); 13 | 14 | module.exports = function(env, options) { 15 | let plugins = [ 16 | // extractSass, 17 | new HtmlWebpackPlugin(html), 18 | new ManifestPlugin({ 19 | fileName: 'asset-manifest.json' 20 | }) 21 | ]; 22 | if (process.env.ANALYZE) { 23 | plugins.push(new BundleAnalyzerPlugin()); 24 | } 25 | if (env === 'prod') { 26 | plugins.push( 27 | new webpack.LoaderOptionsPlugin({ 28 | minimize: true, 29 | debug: false 30 | }) 31 | ); 32 | plugins.push( 33 | new webpack.DefinePlugin({ 34 | 'process.env.NODE_ENV': JSON.stringify('production') 35 | }) 36 | ); 37 | plugins.push( 38 | new CompressionPlugin({ 39 | filename: '[path].gz', 40 | algorithm: 'gzip', 41 | test: /\.(js|html)$/, 42 | threshold: 10240, 43 | minRatio: 0.8, 44 | }) 45 | ); 46 | } else { 47 | plugins.push(new webpack.NamedModulesPlugin()); 48 | plugins.push(new webpack.HotModuleReplacementPlugin()); 49 | } 50 | // plugins.push(new StyleExtHtmlWebpackPlugin()); 51 | return plugins; 52 | }; 53 | --------------------------------------------------------------------------------