├── .babelrc
├── .gitignore
├── .netlify
└── state.json
├── README.md
├── content
├── blog
│ ├── how-to-share-a-screenshot-of-the-page.md
│ ├── visiting-goa.md
│ └── wanderlust.md
└── images
│ ├── cyclist.md
│ └── lighthouse.md
├── netlify.toml
├── package.json
├── preact.config.js
├── prerender-urls.js
├── src
├── assets
│ ├── brett-jordan-1329359-unsplash.jpg
│ ├── cody-black-nm89mzvar5i-unsplash.jpg
│ ├── favicon.ico
│ ├── icons
│ │ ├── android-chrome-192x192.png
│ │ ├── android-chrome-512x512.png
│ │ ├── apple-touch-icon.png
│ │ ├── favicon-16x16.png
│ │ ├── favicon-32x32.png
│ │ └── mstile-150x150.png
│ ├── lucas-ludwig-dh2ztme9kni-unsplash.jpg
│ ├── profile.jpg
│ └── quotes.svg
├── components
│ ├── app.js
│ └── header
│ │ ├── index.js
│ │ └── style.css
├── crawler
│ └── index.js
├── index.js
├── manifest.json
├── routes
│ ├── blog
│ │ ├── formatted-code-block.js
│ │ ├── index.js
│ │ └── style.css
│ ├── blogs
│ │ ├── index.js
│ │ └── style.css
│ ├── contact-success
│ │ ├── index.js
│ │ └── style.css
│ ├── contact
│ │ ├── index.js
│ │ └── style.css
│ ├── home
│ │ ├── index.js
│ │ └── style.css
│ └── notfound
│ │ ├── index.js
│ │ └── style.css
├── static
│ ├── admin.html
│ ├── config.yml
│ └── preview.css
├── style
│ └── index.css
└── template.html
├── tests
├── __mocks__
│ ├── browserMocks.js
│ └── fileMocks.js
└── header.test.js
└── yarn.lock
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "test": {
4 | "presets": [
5 | ["preact-cli/babel", { "modules": "commonjs" }]
6 | ]
7 | }
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | /build
3 | /*.log
4 |
5 | package-lock.json
--------------------------------------------------------------------------------
/.netlify/state.json:
--------------------------------------------------------------------------------
1 | {
2 | "siteId": "7ae42434-edff-45ba-ba1d-ffbf86110acd"
3 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # blog
2 |
3 | ## CLI Commands
4 |
5 | ``` bash
6 | # install dependencies
7 | yarn
8 |
9 | # serve with hot reload at localhost:8080
10 | yarn dev
11 |
12 | # build for production with minification
13 | yarn build
14 |
15 | # run tests with jest and preact-render-spy
16 | yarn test
17 | ```
18 |
19 | For detailed explanation on how things work, checkout the [CLI Readme](https://github.com/developit/preact-cli/blob/master/README.md).
20 |
21 | Note: When pre-rendering, your module as components are executed in a Node.js environment, where most Web APIs are not available. To account for this, wrap that code in a check like `if (typeof window !== 'undefined')`.
22 | Do not add `preact build --no-prerender` to the build command as it will prevent blog posts from rendering.
23 |
--------------------------------------------------------------------------------
/content/blog/how-to-share-a-screenshot-of-the-page.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: How to share a screenshot of the page
3 | date: 2019-09-07T05:42:28.441Z
4 | subtitle: If you have ever built an application which needs to take a screenshot of itself, then this blog tells you how to do the same for web.
5 | cover: /assets/cody-black-nm89mzvar5i-unsplash.jpg
6 | tags: 'technology, javascript'
7 | ---
8 | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sodales neque sodales ut etiam sit amet nisl purus in. Nunc sed augue lacus viverra vitae congue eu. At augue eget arcu dictum varius. Et ligula ullamcorper malesuada proin. Aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices sagittis. Mauris in aliquam sem fringilla ut morbi tincidunt. In vitae turpis massa sed elementum tempus egestas. Neque gravida in fermentum et sollicitudin ac orci phasellus. Nibh praesent tristique magna sit amet purus gravida. Nibh sed pulvinar proin gravida hendrerit. Nibh tortor id aliquet lectus proin nibh nisl condimentum id. A iaculis at erat pellentesque adipiscing commodo elit at. At varius vel pharetra vel turpis nunc eget lorem. Ultrices in iaculis nunc sed augue. Senectus et netus et malesuada fames ac turpis egestas.
9 |
10 | Neque vitae tempus quam pellentesque nec nam aliquam sem. Praesent tristique magna sit amet. Blandit massa enim nec dui nunc. Ultrices vitae auctor eu augue ut lectus arcu bibendum at. Mauris augue neque gravida in fermentum et sollicitudin ac. Arcu risus quis varius quam quisque id diam vel. Tortor aliquam nulla facilisi cras fermentum. Sit amet tellus cras adipiscing. Convallis aenean et tortor at risus viverra adipiscing. Porttitor eget dolor morbi non. Cras pulvinar mattis nunc sed blandit libero volutpat sed. Et leo duis ut diam quam. Accumsan sit amet nulla facilisi. Leo urna molestie at elementum eu facilisis sed odio morbi. Metus dictum at tempor commodo ullamcorper a lacus vestibulum sed. Eros in cursus turpis massa tincidunt dui ut ornare. Vel fringilla est ullamcorper eget nulla facilisi. Nec nam aliquam sem et tortor. Eu consequat ac felis donec.
11 |
12 | Quis enim lobortis scelerisque fermentum dui faucibus. Pulvinar sapien et ligula ullamcorper malesuada proin. Commodo nulla facilisi nullam vehicula ipsum. Facilisis gravida neque convallis a cras semper. Duis convallis convallis tellus id interdum velit laoreet id donec. Eget mauris pharetra et ultrices neque ornare aenean euismod elementum. Justo donec enim diam vulputate ut pharetra. Elementum integer enim neque volutpat. Est velit egestas dui id ornare. Dis parturient montes nascetur ridiculus mus mauris vitae ultricies leo. Tincidunt vitae semper quis lectus nulla at volutpat diam ut. Justo nec ultrices dui sapien eget mi proin sed libero. Egestas erat imperdiet sed euismod nisi porta. Facilisis mauris sit amet massa vitae tortor condimentum lacinia. Cursus in hac habitasse platea dictumst quisque sagittis. Amet consectetur adipiscing elit pellentesque habitant morbi.
13 |
14 | Morbi tempus iaculis urna id volutpat lacus. Sit amet venenatis urna cursus eget nunc scelerisque viverra. Amet risus nullam eget felis. Sit amet purus gravida quis blandit. Malesuada bibendum arcu vitae elementum curabitur vitae nunc sed. Ut lectus arcu bibendum at varius vel pharetra vel turpis. Scelerisque viverra mauris in aliquam sem fringilla ut. Fringilla urna porttitor rhoncus dolor purus. Id velit ut tortor pretium viverra suspendisse potenti nullam. Dignissim convallis aenean et tortor at risus viverra adipiscing at. Donec enim diam vulputate ut. Mauris a diam maecenas sed enim ut sem.
15 |
16 | Fames ac turpis egestas integer eget aliquet nibh praesent. Magna fringilla urna porttitor rhoncus dolor. Mauris commodo quis imperdiet massa tincidunt nunc. Enim sed faucibus turpis in eu mi bibendum. Bibendum enim facilisis gravida neque convallis. Proin fermentum leo vel orci. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Nunc consequat interdum varius sit amet mattis vulputate enim nulla. Ac felis donec et odio. Mauris a diam maecenas sed enim ut sem viverra aliquet. Sollicitudin nibh sit amet commodo nulla facilisi.
17 |
--------------------------------------------------------------------------------
/content/blog/visiting-goa.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Visiting Goa
3 | date: 2019-09-07T05:43:53.681Z
4 | tags: 'travel, india, goa'
5 | ---
6 | Lorem ipsum dolor sit amet, mei in iracundia comprehensam, dicit phaedrum ea vis. Ei purto iusto quo, nonumy honestatis usu no. Eam at lorem audire eligendi. Modus iriure dignissim has in, sed ut liber dicit mediocritatem. Et sed harum graecis, vitae admodum mel et, iracundia referrentur an sea.
7 |
8 | At usu tale everti philosophia, consequat gloriatur voluptatum mel cu. Ea quo tota modus debet, ad vitae consetetur conclusionemque usu. Nam cu eripuit luptatum. At posse nemore persequeris per. Mea ut aeterno vivendo, quodsi aeterno dissentiunt te cum.
9 |
10 | Vim id expetenda instructior, eu dolorem temporibus vis. Delenit voluptua id eum, nobis accumsan complectitur pri ut. Eu est enim quaeque lobortis, et tale essent fabulas cum. Eu ornatus debitis nec, paulo dicam dicunt pro ea, ad eam posse nusquam. Ne quis interesset comprehensam has, ex aperiam verterem tincidunt eum. Modus vitae viderer vim cu, id nec ferri fastidii.
11 |
12 | Ex legendos mandamus periculis vim, suscipit fabellas ne vim. At adhuc dicant mea, vix ea quidam voluptatum ullamcorper. Ex sea dicit theophrastus, ne sint offendit sit, wisi consequat sit ne. Sed labores utroque consectetuer no, an his inani expetenda ocurreret. Quaestio efficiantur mea ne.
13 |
14 | Tale noster timeam mea ut, etiam mnesarchum usu ne, cu sit quot ridens vulputate. Minim error qui ne, causae eruditi senserit pro ex. Epicurei qualisque ea duo, pro ei posse offendit, ad nam habeo melius. An nam brute vivendum, at vim amet sonet cotidieque. Cu debitis abhorreant nam, mel ut quot explicari.
15 |
--------------------------------------------------------------------------------
/content/blog/wanderlust.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Wanderlust
3 | date: 2019-08-27T18:44:24.217Z
4 | tags: 'travel, philosophy, hobby'
5 | ---
6 | Sed ut perspiciatis unde omnis iste natus error sit voluptatem #accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.
7 |
8 | ## Heading 1
9 |
10 | 
11 |
12 | ## Heading 2
13 |
14 | Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.
15 |
16 | ```js
17 | navigator.serviceWorker.register('/sw.js').then(reg => {
18 | reg.onupdatefound = () => {
19 | const w = reg.installing;
20 | w.onstatechange = () => {
21 | if (w.state === 'installed' && navigator.serviceWorker.controller) {
22 | // probably best to avoid reloading if someone has clicked
23 | if (hasInteracted) showUpdateToast();
24 |
25 | location.reload();
26 | }
27 | };
28 | };
29 | });
30 |
31 | // if you want the bit on line 7
32 | let hasInteracted = false;
33 | addEventListener('click', () => { hasInteracted = true; });
34 | ```
35 |
36 | Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
37 |
--------------------------------------------------------------------------------
/content/images/cyclist.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Cyclist
3 | date: 2019-08-27T18:55:16.273Z
4 | photo: /assets/brett-jordan-1329359-unsplash.jpg
5 | ---
6 | Cyclist through a city
7 |
--------------------------------------------------------------------------------
/content/images/lighthouse.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Lighthouse
3 | date: 2019-10-10T23:57:09.340Z
4 | photo: /assets/lucas-ludwig-dh2ztme9kni-unsplash.jpg
5 | ---
6 | A light house captured from the shore
7 |
--------------------------------------------------------------------------------
/netlify.toml:
--------------------------------------------------------------------------------
1 |
2 | [build]
3 | command = "yarn build"
4 | publish = "build"
5 | [build.environment]
6 | YARN_VERSION = "1.9.4"
7 | YARN_FLAGS = "--no-ignore-optional"
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "private": true,
3 | "name": "blog",
4 | "description": "Preact's netlify CMS template",
5 | "version": "0.1.3",
6 | "license": "MIT",
7 | "scripts": {
8 | "start": "per-env",
9 | "start:production": "npm run -s serve",
10 | "start:development": "npm run -s dev",
11 | "build": "preact build --prerenderUrls ./prerender-urls.js",
12 | "dev": "preact watch --prerender --prerenderUrls ./prerender-urls.js",
13 | "lint": "eslint src",
14 | "test": "jest"
15 | },
16 | "eslintConfig": {
17 | "extends": "eslint-config-synacor"
18 | },
19 | "eslintIgnore": [
20 | "build/*"
21 | ],
22 | "devDependencies": {
23 | "eslint": "^4.9.0",
24 | "eslint-config-synacor": "^2.0.2",
25 | "esm": "^3.2.25",
26 | "glob": "^7.1.4",
27 | "jest": "^21.2.1",
28 | "jest-preset-preact": "^1.0.0",
29 | "markdown": "^0.5.0",
30 | "per-env": "^1.0.2",
31 | "preact-cli": "^3.0.1",
32 | "preact-render-spy": "^1.2.1",
33 | "react-syntax-highlighter": "^12.2.1",
34 | "webpack-bundle-analyzer": "^3.4.1"
35 | },
36 | "dependencies": {
37 | "@preact/prerender-data-provider": "^3.0.1",
38 | "imagemin-mozjpeg": "^8.0.0",
39 | "imagemin-webpack-plugin": "^2.4.2",
40 | "markdown-to-jsx": "^6.11.4",
41 | "preact": "^10.4.6",
42 | "preact-cli-plugin-netlify": "^1.6.0",
43 | "preact-render-to-string": "^5.1.10",
44 | "preact-router": "^3.0.1",
45 | "parse-md": "^2.0.4"
46 | },
47 | "jest": {
48 | "preset": "jest-preset-preact"
49 | },
50 | "bugs": {
51 | "url": "https://github.com/preactjs/preact-netlify/issues"
52 | },
53 | "homepage": "https://github.com/preactjs/preact-netlify#readme",
54 | "keywords": [
55 | "preact",
56 | "netlify"
57 | ],
58 | "repository": {
59 | "type": "git",
60 | "url": "git+https://github.com/preactjs/preact-netlify.git"
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/preact.config.js:
--------------------------------------------------------------------------------
1 | const netlifyPlugin = require('preact-cli-plugin-netlify');
2 | const ImageminPlugin = require('imagemin-webpack-plugin').default;
3 | const imageminMozjpeg = require('imagemin-mozjpeg');
4 |
5 | module.exports = (config, env) => {
6 | netlifyPlugin(config);
7 | env.production && !env.ssr && config.plugins.push(new ImageminPlugin({
8 | from: './build/assets/**',
9 | pngquant: {
10 | quality: '60'
11 | },
12 | plugins: [
13 | imageminMozjpeg({
14 | quality: 50,
15 | progressive: true
16 | })
17 | ]
18 | }));
19 | return config;
20 | };
21 |
--------------------------------------------------------------------------------
/prerender-urls.js:
--------------------------------------------------------------------------------
1 | const { generateFileList } = require('./src/crawler');
2 | const { join } = require('path');
3 | const fs = require('fs');
4 | const parseMD = require('parse-md').default;
5 |
6 | const [blogs] = generateFileList(join(__dirname, 'content')).nodes;
7 | module.exports = () => {
8 | const pages = [
9 | {
10 | url: '/',
11 | seo: {
12 | cover: '/assets/profile.jpg'
13 | }
14 | },
15 | { url: '/contact/' },
16 | { url: '/contact/success' }
17 | ];
18 |
19 | // adding blogs list posts page
20 | pages.push({
21 | url: '/blogs/',
22 | data: blogs
23 | });
24 |
25 | // adding all blog pages
26 | pages.push(...blogs.edges.map(blog => {
27 | let data;
28 | if (blog.format === 'md') {
29 | const { content } = parseMD(fs.readFileSync(join('content', 'blog', blog.id), 'utf-8'));
30 | data = content;
31 | } else {
32 | data = fs.readFileSync(join('content', 'blog', blog.id), 'utf-8').replace(/---(.*(\r)?\n)*---/, '');
33 | }
34 | return {
35 | url: `/blog/${blog.id}`,
36 | seo: blog.details,
37 | data: {
38 | details: blog.details,
39 | content: data
40 | }
41 | };
42 | }));
43 |
44 | return pages;
45 | };
46 |
--------------------------------------------------------------------------------
/src/assets/brett-jordan-1329359-unsplash.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/preactjs/preact-netlify/4170cbbd05d0d5c3f1ddc497473c15ca82dcffda/src/assets/brett-jordan-1329359-unsplash.jpg
--------------------------------------------------------------------------------
/src/assets/cody-black-nm89mzvar5i-unsplash.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/preactjs/preact-netlify/4170cbbd05d0d5c3f1ddc497473c15ca82dcffda/src/assets/cody-black-nm89mzvar5i-unsplash.jpg
--------------------------------------------------------------------------------
/src/assets/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/preactjs/preact-netlify/4170cbbd05d0d5c3f1ddc497473c15ca82dcffda/src/assets/favicon.ico
--------------------------------------------------------------------------------
/src/assets/icons/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/preactjs/preact-netlify/4170cbbd05d0d5c3f1ddc497473c15ca82dcffda/src/assets/icons/android-chrome-192x192.png
--------------------------------------------------------------------------------
/src/assets/icons/android-chrome-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/preactjs/preact-netlify/4170cbbd05d0d5c3f1ddc497473c15ca82dcffda/src/assets/icons/android-chrome-512x512.png
--------------------------------------------------------------------------------
/src/assets/icons/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/preactjs/preact-netlify/4170cbbd05d0d5c3f1ddc497473c15ca82dcffda/src/assets/icons/apple-touch-icon.png
--------------------------------------------------------------------------------
/src/assets/icons/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/preactjs/preact-netlify/4170cbbd05d0d5c3f1ddc497473c15ca82dcffda/src/assets/icons/favicon-16x16.png
--------------------------------------------------------------------------------
/src/assets/icons/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/preactjs/preact-netlify/4170cbbd05d0d5c3f1ddc497473c15ca82dcffda/src/assets/icons/favicon-32x32.png
--------------------------------------------------------------------------------
/src/assets/icons/mstile-150x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/preactjs/preact-netlify/4170cbbd05d0d5c3f1ddc497473c15ca82dcffda/src/assets/icons/mstile-150x150.png
--------------------------------------------------------------------------------
/src/assets/lucas-ludwig-dh2ztme9kni-unsplash.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/preactjs/preact-netlify/4170cbbd05d0d5c3f1ddc497473c15ca82dcffda/src/assets/lucas-ludwig-dh2ztme9kni-unsplash.jpg
--------------------------------------------------------------------------------
/src/assets/profile.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/preactjs/preact-netlify/4170cbbd05d0d5c3f1ddc497473c15ca82dcffda/src/assets/profile.jpg
--------------------------------------------------------------------------------
/src/assets/quotes.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/components/app.js:
--------------------------------------------------------------------------------
1 | import { h, Component } from 'preact';
2 | import { Router } from 'preact-router';
3 | import { Provider } from '@preact/prerender-data-provider';
4 | import Header from './header';
5 |
6 | // Code-splitting is automated for routes
7 | import Home from '../routes/home';
8 | import Blogs from '../routes/blogs';
9 | import Blog from '../routes/blog';
10 | import Contact from '../routes/contact';
11 | import ContactSuccess from '../routes/contact-success';
12 | import NotFoundPage from '../routes/notfound';
13 |
14 | export default class App extends Component {
15 |
16 | /** Gets fired when the route changes.
17 | * @param {Object} event "change" event from [preact-router](https://github.com/preactjs/preact-router)
18 | * @param {string} event.url The newly routed URL
19 | */
20 | handleRoute = e => {
21 | this.currentUrl = e.url;
22 | };
23 |
24 | render(props) {
25 | return (
26 | Jane Doe
8 |
12 | {props.children}
);
14 | }
15 | throw new Promise(resolve => {
16 | let language = null;
17 | const highlighter = import('react-syntax-highlighter/dist/esm/prism-light');
18 | let languageSyntax;
19 | switch (props.class) {
20 | case 'lang-js':
21 | language = 'javascript';
22 | languageSyntax = import('react-syntax-highlighter/dist/esm/languages/prism/javascript');
23 | break;
24 | case 'lang-html':
25 | language = 'html';
26 | languageSyntax = import('react-syntax-highlighter/dist/esm/languages/prism/markup');
27 | break;
28 | case 'lang-css':
29 | language = 'css';
30 | languageSyntax = import('react-syntax-highlighter/dist/esm/languages/prism/css');
31 | break;
32 | case 'lang-ts':
33 | language = 'typescript';
34 | languageSyntax = import('react-syntax-highlighter/dist/esm/languages/prism/typescript');
35 | break;
36 | default:
37 | language = 'markdown';
38 | languageSyntax = import('react-syntax-highlighter/dist/esm/languages/prism/markdown');
39 | break;
40 | }
41 | Promise.all([highlighter, languageSyntax]).then(values => {
42 | const [SyntaxHighlighter, languageHighlighter] = values.map(m => m ? m.default: null);
43 | getFormattedCodeBlock(SyntaxHighlighter, languageHighlighter, language, setComponent, resolve, props);
44 | });
45 | });
46 | }
47 |
48 | function getFormattedCodeBlock(SyntaxHighlighter, languageHighlighter, language, setState, resolve, props) {
49 | language && SyntaxHighlighter.registerLanguage(language, languageHighlighter);
50 | setState(
51 |
{props.children}
;
20 | if (typeof window === 'undefined') {
21 | return (fallback);
22 | }
23 | return (
24 | 41 | {blog.preview} 42 |
43 |10 |
36 | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do 37 | eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad 38 | minim veniam, quis nostrud exercitation ullamco laboris nisi ut 39 | aliquip ex ea commodo consequat. Duis aute irure dolor in 40 | reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla 41 | pariatur. Excepteur sint occaecat cupidatat non proident, sunt in 42 | culpa qui officia deserunt mollit anim id est laborum. 43 |
44 |45 | Sed ut perspiciatis unde omnis iste natus error sit voluptatem 46 | accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae 47 | ab illo inventore veritatis et quasi architecto beatae vitae dicta 48 | sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit 49 | aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos 50 | qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui 51 | dolorem ipsum quia dolor sit amet, consectetur. 52 |
53 |That page doesn't exist.
11 |