├── _config.yml ├── .gitignore ├── .github └── ISSUE_TEMPLATE │ ├── other.md │ └── bug_report.md ├── dist ├── toast.min.css └── toast.min.js ├── package.json ├── LICENSE ├── src ├── css │ └── toast.css └── js │ └── toast.js ├── README.md └── example └── index.html /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-minimal 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | build 3 | .idea 4 | .github 5 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/other.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Other 3 | about: For any other issues/questions 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | Please be as clear and concise as possible to make life easier for everybody involved 11 | -------------------------------------------------------------------------------- /dist/toast.min.css: -------------------------------------------------------------------------------- 1 | .toast-container{position:fixed;z-index:1055;margin:5px}.top-right{top:0;right:0}.top-left{top:0;left:0}.top-center{transform:translateX(-50%);top:0;left:50%}.bottom-right{right:0;bottom:0}.bottom-left{left:0;bottom:0}.bottom-center{transform:translateX(-50%);bottom:0;left:50%}.toast-container>.toast{min-width:150px;background:0 0;border:none}.toast-container>.toast>.toast-header{border:none}.toast-container>.toast>.toast-header strong{padding-right:20px}.toast-container>.toast>.toast-body{background:#fff} 2 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bs4-toast", 3 | "version": "1.2.0", 4 | "description": "Toast - A Bootstrap 4.2+ jQuery plugin for the toast component", 5 | "main": "dist/toast.min.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "git+https://github.com/Script47/Toast.git" 9 | }, 10 | "keywords": [ 11 | "bootstrap-4", 12 | "bootstrap", 13 | "toast", 14 | "toast-notifications", 15 | "snack", 16 | "jquery-plugin" 17 | ], 18 | "author": "Script47 ", 19 | "license": "MIT", 20 | "bugs": { 21 | "url": "https://github.com/Script47/Toast/issues" 22 | }, 23 | "homepage": "https://github.com/Script47/Toast", 24 | "dependencies": { 25 | "bootstrap": ">=4.2.0", 26 | "jquery": ">=1.9.1" 27 | }, 28 | "devDependencies": {} 29 | } 30 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Found something that's broken? Let's us know about it 4 | title: '' 5 | labels: Bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **What went wrong?** 11 | 12 | A clear and concise description of what the bug is. 13 | 14 | **What was the console output?** 15 | 16 | N/A if no console output was recorded 17 | 18 | **How can we reproduce this bug?** 19 | 20 | The Steps to reproduce this behavior: 21 | 22 | 1. Go to '...' 23 | 2. Click on '....' 24 | 3. Scroll down to '....' 25 | 4. See error 26 | 27 | **What should've happened?** 28 | 29 | A clear and concise description of what you expected to happen. 30 | 31 | **Screenshots** 32 | 33 | If applicable, add screenshots to help explain your problem. 34 | 35 | **Miscellaneous (please complete the following information):** 36 | 37 | - Browser and Version [e.g. stock browser, safari] 38 | - Bootstrap Version [e.g. 4.3] 39 | - Plugin Version [e.g. 0.7.1] 40 | 41 | Add any other context about the problem here. 42 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Script47 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/css/toast.css: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Script47 (https://github.com/Script47/Toast) 3 | * @description Toast - A Bootstrap 4.2+ jQuery plugin for the toast component 4 | * @version 1.2.0 5 | **/ 6 | .toast-container { 7 | position: fixed; 8 | z-index: 1055; 9 | margin: 5px; 10 | } 11 | 12 | .top-right { 13 | top: 0; 14 | right: 0; 15 | } 16 | 17 | .top-left { 18 | top: 0; 19 | left: 0; 20 | } 21 | 22 | .top-center { 23 | transform: translateX(-50%); 24 | top: 0; 25 | left: 50%; 26 | } 27 | 28 | .bottom-right { 29 | right: 0; 30 | bottom: 0; 31 | } 32 | 33 | .bottom-left { 34 | left: 0; 35 | bottom: 0; 36 | } 37 | 38 | .bottom-center { 39 | transform: translateX(-50%); 40 | bottom: 0; 41 | left: 50%; 42 | } 43 | 44 | .toast-container > .toast { 45 | min-width: 150px; 46 | background: transparent; 47 | border: none; 48 | } 49 | 50 | .toast-container > .toast > .toast-header { 51 | border: none; 52 | } 53 | 54 | .toast-container > .toast > .toast-header strong { 55 | padding-right: 20px; 56 | } 57 | 58 | .toast-container > .toast > .toast-body { 59 | background: white; 60 | } 61 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Toast - A Bootstrap 4.2+ jQuery plugin 2 | 3 | * [About](#about) 4 | * [Usage](#usage) 5 | * [Live Example](https://jsfiddle.net/47n5ygth/) 6 | * [Contributing](#contributing) 7 | 8 | ### About 9 | 10 | As of Bootstrap 4.2, [toasts](https://getbootstrap.com/docs/4.2/components/toasts/) have been introduced and the aim of this plugin is to make them easier to use. 11 | 12 | ### Usage 13 | 14 | #### Gloabls 15 | 16 | Modify the global variables to apply specific rules/styles to all your toasts. 17 | 18 | ```javascript 19 | $.toastDefaults = { 20 | position: 'top-right', /** top-left/top-right/top-center/bottom-left/bottom-right/bottom-center - Where the toast will show up **/ 21 | dismissible: true, /** true/false - If you want to show the button to dismiss the toast manually **/ 22 | stackable: true, /** true/false - If you want the toasts to be stackable **/ 23 | pauseDelayOnHover: true, /** true/false - If you want to pause the delay of toast when hovering over the toast **/ 24 | style: { 25 | toast: '', /** Classes you want to apply separated my a space to each created toast element (.toast) **/ 26 | info: '', /** Classes you want to apply separated my a space to modify the "info" type style **/ 27 | success: '', /** Classes you want to apply separated my a space to modify the "success" type style **/ 28 | warning: '', /** Classes you want to apply separated my a space to modify the "warning" type style **/ 29 | error: '', /** Classes you want to apply separated my a space to modify the "error" type style **/ 30 | } 31 | }; 32 | ``` 33 | 34 | #### Snack 35 | 36 | A "snack" is a bitesized "toast". 37 | 38 | ```javascript 39 | $.snack(type, title, delay) 40 | ``` 41 | 42 | 43 | **Note:** The final argument `delay` is omitable. If omitted, the toast will remain forever. 44 | 45 | #### Toast 46 | 47 | ```javascript 48 | $.toast({ 49 | type: 'info', 50 | title: 'Notice!', 51 | subtitle: '11 mins ago', 52 | content: 'Hello, world! This is a toast message.', 53 | delay: 5000, 54 | img: { 55 | src: 'https://via.placeholder.com/20', 56 | class: 'rounded-0', /** Classes you want to apply separated my a space to modify the image **/ 57 | alt: 'Image' 58 | } 59 | }); 60 | ``` 61 | 62 | 63 | 64 | ### Contributing 65 | 66 | Feel free to contribute in any of the ways outlined: 67 | 68 | - Submit issues/pull requests 69 | - Tell us how you're using this plugin in *your* project 70 | -------------------------------------------------------------------------------- /dist/toast.min.js: -------------------------------------------------------------------------------- 1 | (function(a){function f(b){if(!a("#toast-container").length){var d="top-right top-left top-center bottom-right bottom-left bottom-center".split(" ").includes(a.toastDefaults.position)?a.toastDefaults.position:"top-right";a("body").prepend('
');a("#toast-container").addClass(d)}d=a("#toast-container");var c="",e=c="",g=b.id||"toast-"+l,t=b.type,u=b.title,m=b.subtitle,n=b.content,h=b.img,p=b.delay?'data-delay="'+ 2 | b.delay+'"':'data-autohide="false"',q="",r=a.toastDefaults.dismissible,v=a.toastDefaults.style.toast,k=!1;"undefined"!==typeof b.dismissible&&(r=b.dismissible);switch(t){case "info":e=a.toastDefaults.style.info||"bg-info";c=a.toastDefaults.style.info||"text-white";break;case "success":e=a.toastDefaults.style.success||"bg-success";c=a.toastDefaults.style.info||"text-white";break;case "warning":e=a.toastDefaults.style.warning||"bg-warning";c=a.toastDefaults.style.warning||"text-white";break;case "error":e= 3 | a.toastDefaults.style.error||"bg-danger",c=a.toastDefaults.style.error||"text-white"}a.toastDefaults.pauseDelayOnHover&&b.delay&&(p='data-autohide="false"',q='data-hide-after="'+(Math.floor(Date.now()/1E3)+b.delay/1E3)+'"');c='";a.toastDefaults.stackable||d.find(".toast").each(function(){a(this).remove()});d.append(c);d.find(".toast:last").toast("show"); 5 | a.toastDefaults.pauseDelayOnHover&&(setTimeout(function(){k||a("#"+g).toast("hide")},b.delay),a("body").on("mouseover","#"+g,function(){k=!0}),a(document).on("mouseleave","#"+g,function(){var w=Math.floor(Date.now()/1E3),x=parseInt(a(this).data("hideAfter"));k=!1;w>=x&&a(this).toast("hide")}));l++}a.toastDefaults={position:"top-right",dismissible:!0,stackable:!0,pauseDelayOnHover:!0,style:{toast:"",info:"",success:"",warning:"",error:""}};a("body").on("hidden.bs.toast",".toast",function(){a(this).remove()}); 6 | var l=1;a.snack=function(b,d,c){return f({type:b,title:d,delay:c})};a.toast=function(b){return f(b)}})(jQuery); 7 | -------------------------------------------------------------------------------- /src/js/toast.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Script47 (https://github.com/Script47/Toast) 3 | * @description Toast - A Bootstrap 4.2+ jQuery plugin for the toast component 4 | * @version 1.2.0 5 | **/ 6 | (function ($) { 7 | const TOAST_CONTAINER_HTML = `
`; 8 | 9 | $.toastDefaults = { 10 | position: 'top-right', 11 | dismissible: true, 12 | stackable: true, 13 | pauseDelayOnHover: true, 14 | style: { 15 | toast: '', 16 | info: '', 17 | success: '', 18 | warning: '', 19 | error: '', 20 | } 21 | }; 22 | 23 | $('body').on('hidden.bs.toast', '.toast', function () { 24 | $(this).remove(); 25 | }); 26 | 27 | let toastRunningCount = 1; 28 | 29 | function render(opts) { 30 | /** No container, create our own **/ 31 | if (!$('#toast-container').length) { 32 | const position = ['top-right', 'top-left', 'top-center', 'bottom-right', 'bottom-left', 'bottom-center'].includes($.toastDefaults.position) ? $.toastDefaults.position : 'top-right'; 33 | 34 | $('body').prepend(TOAST_CONTAINER_HTML); 35 | $('#toast-container').addClass(position); 36 | } 37 | 38 | let toastContainer = $('#toast-container'); 39 | let html = ''; 40 | let classes = { 41 | header: { 42 | fg: '', 43 | bg: '' 44 | }, 45 | subtitle: 'text-white', 46 | dismiss: 'text-white' 47 | }; 48 | let id = opts.id || `toast-${toastRunningCount}`; 49 | let type = opts.type; 50 | let title = opts.title; 51 | let subtitle = opts.subtitle; 52 | let content = opts.content; 53 | let img = opts.img; 54 | let delayOrAutohide = opts.delay ? `data-delay="${opts.delay}"` : `data-autohide="false"`; 55 | let hideAfter = ``; 56 | let dismissible = $.toastDefaults.dismissible; 57 | let globalToastStyles = $.toastDefaults.style.toast; 58 | let paused = false; 59 | 60 | if (typeof opts.dismissible !== 'undefined') { 61 | dismissible = opts.dismissible; 62 | } 63 | 64 | switch (type) { 65 | case 'info': 66 | classes.header.bg = $.toastDefaults.style.info || 'bg-info'; 67 | classes.header.fg = $.toastDefaults.style.info || 'text-white'; 68 | break; 69 | 70 | case 'success': 71 | classes.header.bg = $.toastDefaults.style.success || 'bg-success'; 72 | classes.header.fg = $.toastDefaults.style.info || 'text-white'; 73 | break; 74 | 75 | case 'warning': 76 | classes.header.bg = $.toastDefaults.style.warning || 'bg-warning'; 77 | classes.header.fg = $.toastDefaults.style.warning || 'text-white'; 78 | break; 79 | 80 | case 'error': 81 | classes.header.bg = $.toastDefaults.style.error || 'bg-danger'; 82 | classes.header.fg = $.toastDefaults.style.error || 'text-white'; 83 | break; 84 | } 85 | 86 | if ($.toastDefaults.pauseDelayOnHover && opts.delay) { 87 | delayOrAutohide = `data-autohide="false"`; 88 | hideAfter = `data-hide-after="${Math.floor(Date.now() / 1000) + (opts.delay / 1000)}"`; 89 | } 90 | 91 | html = ``; 119 | 120 | if (!$.toastDefaults.stackable) { 121 | toastContainer.find('.toast').each(function () { 122 | $(this).remove(); 123 | }); 124 | 125 | toastContainer.append(html); 126 | toastContainer.find('.toast:last').toast('show'); 127 | } else { 128 | toastContainer.append(html); 129 | toastContainer.find('.toast:last').toast('show'); 130 | } 131 | 132 | if ($.toastDefaults.pauseDelayOnHover) { 133 | setTimeout(function () { 134 | if (!paused) { 135 | $(`#${id}`).toast('hide'); 136 | } 137 | }, opts.delay); 138 | 139 | $('body').on('mouseover', `#${id}`, function () { 140 | paused = true; 141 | }); 142 | 143 | $(document).on('mouseleave', '#' + id, function () { 144 | const current = Math.floor(Date.now() / 1000), 145 | future = parseInt($(this).data('hideAfter')); 146 | 147 | paused = false; 148 | 149 | if (current >= future) { 150 | $(this).toast('hide'); 151 | } 152 | }); 153 | } 154 | 155 | toastRunningCount++; 156 | } 157 | 158 | /** 159 | * Show a snack 160 | * @param type 161 | * @param title 162 | * @param delay 163 | */ 164 | $.snack = function (type, title, delay) { 165 | return render({ 166 | type, 167 | title, 168 | delay 169 | }); 170 | } 171 | 172 | /** 173 | * Show a toast 174 | * @param opts 175 | */ 176 | $.toast = function (opts) { 177 | return render(opts); 178 | } 179 | }(jQuery)); 180 | -------------------------------------------------------------------------------- /example/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | Toast 13 | 14 | 15 | 16 |
17 |
18 |

Toast

19 |

A jQuery plugin for Bootstrap 4.2+

20 |
21 |
22 | 23 |
24 | 25 | 26 |
27 | 28 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec ac malesuada ipsum. Vestibulum in nunc sed erat 29 | facilisis lacinia in vitae lacus. Curabitur ornare nulla non urna posuere cursus. Aliquam in molestie augue, ac 30 | vehicula est. Pellentesque eget massa nibh. Nulla maximus quam laoreet finibus dictum. Aliquam pretium porta 31 | malesuada. Cras pretium odio massa, non blandit ligula maximus at. Proin sollicitudin felis sollicitudin turpis 32 | mattis ultricies.

33 | 34 |

Donec rutrum, magna ut lacinia aliquam, dui justo consequat eros, non feugiat lectus ligula non lacus. Donec 35 | consequat pharetra posuere. Pellentesque malesuada sodales erat bibendum condimentum. Ut porttitor dignissim semper. 36 | Quisque sed urna venenatis, sollicitudin tellus vitae, ultricies justo. Suspendisse potenti. Donec in sapien 37 | molestie, pharetra nisl sit amet, pulvinar erat. Donec ultricies mauris enim, non vehicula sapien malesuada eget. 38 | Aliquam tristique accumsan magna, eget facilisis nulla convallis sed. Fusce malesuada ipsum sem, eget finibus arcu 39 | euismod id. Mauris fringilla libero felis, vitae iaculis ante vehicula vitae. Pellentesque ullamcorper semper 40 | vestibulum. In rutrum at sapien et tincidunt.

41 | 42 |

Aliquam mauris arcu, euismod vel porta in, consequat in augue. Integer volutpat tincidunt arcu, et iaculis est 43 | egestas in. Nam nibh neque, consequat quis dolor et, mollis viverra erat. Duis dapibus lacus et pharetra rutrum. 44 | Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut tempor nibh sit amet eros 45 | commodo tristique. Maecenas maximus nisi sit amet tempus venenatis.

46 | 47 |

Mauris hendrerit neque eget sapien efficitur, ac hendrerit lorem ultrices. Praesent nec lorem ac tellus viverra 48 | sollicitudin posuere in mauris. Cras vulputate arcu at ligula condimentum semper. Fusce erat justo, luctus non 49 | interdum vitae, rhoncus sed lorem. Pellentesque et nisi vel felis finibus efficitur eu tristique ex. Aenean ac 50 | lacinia lectus. Vestibulum augue ante, maximus at nisi vel, eleifend convallis nunc. Vivamus tempor arcu neque, non 51 | auctor enim vehicula et. Integer viverra faucibus consectetur. Maecenas id vestibulum velit, a mollis nulla. Cras 52 | vitae velit orci. Nunc volutpat urna quam, non aliquet nisl placerat ac.

53 | 54 |

Nunc porta eu mi eget dignissim. Pellentesque hendrerit odio nec risus facilisis pulvinar. Nam laoreet a libero id 55 | commodo. Vivamus elementum enim nec tincidunt suscipit. Vestibulum a neque molestie, imperdiet turpis sed, 56 | ullamcorper ex. Integer et pharetra nulla. Maecenas egestas ut augue non sodales. Nunc aliquet a mauris id 57 | consectetur. Integer tristique ligula eu pellentesque vulputate. Nunc pellentesque eros a ipsum mattis, finibus 58 | maximus libero commodo. Cras in posuere lorem, non porttitor diam. Phasellus lacus augue, tempus at turpis ac, 59 | malesuada eleifend orci. Etiam commodo elementum vehicula. Sed et enim at urna pretium porttitor vel at lectus. 60 | Nulla consectetur nisl vitae nisl iaculis vulputate. Donec ac nisi cursus, pharetra augue id, eleifend augue.

61 | 62 |

Nunc porta eu mi eget dignissim. Pellentesque hendrerit odio nec risus facilisis pulvinar. Nam laoreet a libero id 63 | commodo. Vivamus elementum enim nec tincidunt suscipit. Vestibulum a neque molestie, imperdiet turpis sed, 64 | ullamcorper ex. Integer et pharetra nulla. Maecenas egestas ut augue non sodales. Nunc aliquet a mauris id 65 | consectetur. Integer tristique ligula eu pellentesque vulputate. Nunc pellentesque eros a ipsum mattis, finibus 66 | maximus libero commodo. Cras in posuere lorem, non porttitor diam. Phasellus lacus augue, tempus at turpis ac, 67 | malesuada eleifend orci. Etiam commodo elementum vehicula. Sed et enim at urna pretium porttitor vel at lectus. 68 | Nulla consectetur nisl vitae nisl iaculis vulputate. Donec ac nisi cursus, pharetra augue id, eleifend augue.

69 | 70 |

Nunc porta eu mi eget dignissim. Pellentesque hendrerit odio nec risus facilisis pulvinar. Nam laoreet a libero id 71 | commodo. Vivamus elementum enim nec tincidunt suscipit. Vestibulum a neque molestie, imperdiet turpis sed, 72 | ullamcorper ex. Integer et pharetra nulla. Maecenas egestas ut augue non sodales. Nunc aliquet a mauris id 73 | consectetur. Integer tristique ligula eu pellentesque vulputate. Nunc pellentesque eros a ipsum mattis, finibus 74 | maximus libero commodo. Cras in posuere lorem, non porttitor diam. Phasellus lacus augue, tempus at turpis ac, 75 | malesuada eleifend orci. Etiam commodo elementum vehicula. Sed et enim at urna pretium porttitor vel at lectus. 76 | Nulla consectetur nisl vitae nisl iaculis vulputate. Donec ac nisi cursus, pharetra augue id, eleifend augue.

77 | 78 |

Nunc porta eu mi eget dignissim. Pellentesque hendrerit odio nec risus facilisis pulvinar. Nam laoreet a libero id 79 | commodo. Vivamus elementum enim nec tincidunt suscipit. Vestibulum a neque molestie, imperdiet turpis sed, 80 | ullamcorper ex. Integer et pharetra nulla. Maecenas egestas ut augue non sodales. Nunc aliquet a mauris id 81 | consectetur. Integer tristique ligula eu pellentesque vulputate. Nunc pellentesque eros a ipsum mattis, finibus 82 | maximus libero commodo. Cras in posuere lorem, non porttitor diam. Phasellus lacus augue, tempus at turpis ac, 83 | malesuada eleifend orci. Etiam commodo elementum vehicula. Sed et enim at urna pretium porttitor vel at lectus. 84 | Nulla consectetur nisl vitae nisl iaculis vulputate. Donec ac nisi cursus, pharetra augue id, eleifend augue.

85 | 86 |

Nunc porta eu mi eget dignissim. Pellentesque hendrerit odio nec risus facilisis pulvinar. Nam laoreet a libero id 87 | commodo. Vivamus elementum enim nec tincidunt suscipit. Vestibulum a neque molestie, imperdiet turpis sed, 88 | ullamcorper ex. Integer et pharetra nulla. Maecenas egestas ut augue non sodales. Nunc aliquet a mauris id 89 | consectetur. Integer tristique ligula eu pellentesque vulputate. Nunc pellentesque eros a ipsum mattis, finibus 90 | maximus libero commodo. Cras in posuere lorem, non porttitor diam. Phasellus lacus augue, tempus at turpis ac, 91 | malesuada eleifend orci. Etiam commodo elementum vehicula. Sed et enim at urna pretium porttitor vel at lectus. 92 | Nulla consectetur nisl vitae nisl iaculis vulputate. Donec ac nisi cursus, pharetra augue id, eleifend augue.

93 | 94 |

Nunc porta eu mi eget dignissim. Pellentesque hendrerit odio nec risus facilisis pulvinar. Nam laoreet a libero id 95 | commodo. Vivamus elementum enim nec tincidunt suscipit. Vestibulum a neque molestie, imperdiet turpis sed, 96 | ullamcorper ex. Integer et pharetra nulla. Maecenas egestas ut augue non sodales. Nunc aliquet a mauris id 97 | consectetur. Integer tristique ligula eu pellentesque vulputate. Nunc pellentesque eros a ipsum mattis, finibus 98 | maximus libero commodo. Cras in posuere lorem, non porttitor diam. Phasellus lacus augue, tempus at turpis ac, 99 | malesuada eleifend orci. Etiam commodo elementum vehicula. Sed et enim at urna pretium porttitor vel at lectus. 100 | Nulla consectetur nisl vitae nisl iaculis vulputate. Donec ac nisi cursus, pharetra augue id, eleifend augue.

101 | 102 |

Nunc porta eu mi eget dignissim. Pellentesque hendrerit odio nec risus facilisis pulvinar. Nam laoreet a libero id 103 | commodo. Vivamus elementum enim nec tincidunt suscipit. Vestibulum a neque molestie, imperdiet turpis sed, 104 | ullamcorper ex. Integer et pharetra nulla. Maecenas egestas ut augue non sodales. Nunc aliquet a mauris id 105 | consectetur. Integer tristique ligula eu pellentesque vulputate. Nunc pellentesque eros a ipsum mattis, finibus 106 | maximus libero commodo. Cras in posuere lorem, non porttitor diam. Phasellus lacus augue, tempus at turpis ac, 107 | malesuada eleifend orci. Etiam commodo elementum vehicula. Sed et enim at urna pretium porttitor vel at lectus. 108 | Nulla consectetur nisl vitae nisl iaculis vulputate. Donec ac nisi cursus, pharetra augue id, eleifend augue.

109 | 110 |

Nunc porta eu mi eget dignissim. Pellentesque hendrerit odio nec risus facilisis pulvinar. Nam laoreet a libero id 111 | commodo. Vivamus elementum enim nec tincidunt suscipit. Vestibulum a neque molestie, imperdiet turpis sed, 112 | ullamcorper ex. Integer et pharetra nulla. Maecenas egestas ut augue non sodales. Nunc aliquet a mauris id 113 | consectetur. Integer tristique ligula eu pellentesque vulputate. Nunc pellentesque eros a ipsum mattis, finibus 114 | maximus libero commodo. Cras in posuere lorem, non porttitor diam. Phasellus lacus augue, tempus at turpis ac, 115 | malesuada eleifend orci. Etiam commodo elementum vehicula. Sed et enim at urna pretium porttitor vel at lectus. 116 | Nulla consectetur nisl vitae nisl iaculis vulputate. Donec ac nisi cursus, pharetra augue id, eleifend augue.

117 | 118 |

Nunc porta eu mi eget dignissim. Pellentesque hendrerit odio nec risus facilisis pulvinar. Nam laoreet a libero id 119 | commodo. Vivamus elementum enim nec tincidunt suscipit. Vestibulum a neque molestie, imperdiet turpis sed, 120 | ullamcorper ex. Integer et pharetra nulla. Maecenas egestas ut augue non sodales. Nunc aliquet a mauris id 121 | consectetur. Integer tristique ligula eu pellentesque vulputate. Nunc pellentesque eros a ipsum mattis, finibus 122 | maximus libero commodo. Cras in posuere lorem, non porttitor diam. Phasellus lacus augue, tempus at turpis ac, 123 | malesuada eleifend orci. Etiam commodo elementum vehicula. Sed et enim at urna pretium porttitor vel at lectus. 124 | Nulla consectetur nisl vitae nisl iaculis vulputate. Donec ac nisi cursus, pharetra augue id, eleifend augue.

125 | 126 |

Nunc porta eu mi eget dignissim. Pellentesque hendrerit odio nec risus facilisis pulvinar. Nam laoreet a libero id 127 | commodo. Vivamus elementum enim nec tincidunt suscipit. Vestibulum a neque molestie, imperdiet turpis sed, 128 | ullamcorper ex. Integer et pharetra nulla. Maecenas egestas ut augue non sodales. Nunc aliquet a mauris id 129 | consectetur. Integer tristique ligula eu pellentesque vulputate. Nunc pellentesque eros a ipsum mattis, finibus 130 | maximus libero commodo. Cras in posuere lorem, non porttitor diam. Phasellus lacus augue, tempus at turpis ac, 131 | malesuada eleifend orci. Etiam commodo elementum vehicula. Sed et enim at urna pretium porttitor vel at lectus. 132 | Nulla consectetur nisl vitae nisl iaculis vulputate. Donec ac nisi cursus, pharetra augue id, eleifend augue.

133 | 134 |

Nunc porta eu mi eget dignissim. Pellentesque hendrerit odio nec risus facilisis pulvinar. Nam laoreet a libero id 135 | commodo. Vivamus elementum enim nec tincidunt suscipit. Vestibulum a neque molestie, imperdiet turpis sed, 136 | ullamcorper ex. Integer et pharetra nulla. Maecenas egestas ut augue non sodales. Nunc aliquet a mauris id 137 | consectetur. Integer tristique ligula eu pellentesque vulputate. Nunc pellentesque eros a ipsum mattis, finibus 138 | maximus libero commodo. Cras in posuere lorem, non porttitor diam. Phasellus lacus augue, tempus at turpis ac, 139 | malesuada eleifend orci. Etiam commodo elementum vehicula. Sed et enim at urna pretium porttitor vel at lectus. 140 | Nulla consectetur nisl vitae nisl iaculis vulputate. Donec ac nisi cursus, pharetra augue id, eleifend augue.

141 | 142 |
143 | 144 | 145 |
146 | 147 | 148 | 149 | 150 | 151 | 152 | 209 | 210 | 211 | 212 | --------------------------------------------------------------------------------