espressif / arduino-esp32

Arduino core for the ESP32
GNU Lesser General Public License v2.1
13.66k stars 7.41k forks source link

ESP32-S2 Webserver Library #6704

Closed asvith closed 2 years ago

asvith commented 2 years ago

Board

ESP32S2MINI1U

Device Description

esp32-s2-mini-1_esp32-s2-mini-1u_datasheet_en.pdf

Hardware Configuration

ESP32-S2-DevkitM-1 v1.0

Version

other

IDE Name

Arduino IDE

Operating System

Windows10

Flash frequency

80Mhz

PSRAM enabled

yes

Upload speed

115200

Description

We are facing one more issue with web server library that is as we are sending request in "jquery.js" format with more than 60kb web server library is not supporting for esp32s2 , where as with esp8266 web server library there is no limitation with size. we also tried to include esp8266 web server library to esp32s2 its not supporting .we also tried webserver with "spiffs" library but it is supporting only "esptool.py" tool we have library with big sur tool so we are unable to proceed further. Kindly support to resolve this issue to progress further. Issue

Sketch

webserver.h library is used for web server but it is limited upto 60kb ("jquery.js" file uploaded more than 60 kb) so we are facing issue.

Debug Message

This compiling and running but "jquery.js" is not accepting more than 60kb.

Other Steps to Reproduce

No response

I have checked existing issues, online documentation and the Troubleshooting Guide

SuGlider commented 2 years ago

@asvith - I need more information about it.

Where are the web files in the S2? In SPIFFS folders? What limitation is that about? SPIFSS? Could you describe what you need to achieve with more details, including how is it setup in the ESP8266? Is there any github with an example that we can try to reproduce and debug the issue?

lbernstone commented 2 years ago

I serve javascript files with esp32 without any issues. Here's some tricks. Use xxd -i <filename> to convert the file into a char array. Add that into your code directly, and then deliver it using send_P. By making it into a const char*, it will be delivered directly from flash and not use up precious RAM (like PROGMEM in esp8266). You can also gzip it first to make the file even smaller (in your code and on the wire). Here's an example:

// Where you define your WebServer config
  server.on("/files/jquery.min.js", []() {
    server.sendHeader("Content-Encoding", "gzip");
    server.send_P(200, "application/javascript", jquery_min_js_gz, jquery_min_js_gz_len); });

// Anywhere in your code
// jquery.js 3.6.0
const unsigned int jquery_min_js_gz_len = 30761;
const char jquery_min_js_gz[] = {
  0x1f, 0x8b, 0x08, 0x08, 0x8c, 0x8f, 0x58, 0x62, 0x02, 0x03, 0x6a, 0x71,
  0x75, 0x65, 0x72, 0x79, 0x2e, 0x6d, 0x69, 0x6e, 0x2e, 0x6a, 0x73, 0x00,
// The other 30k of data...
  0xbb, 0xc5, 0xe5, 0x64, 0xf2, 0xff, 0xfc, 0x1f, 0x84, 0x5b, 0x9a, 0x60,
  0x8f, 0x53, 0x01, 0x00
};
SuGlider commented 2 years ago

@lbernstone - In that case the JS files goes with the compiled blob, right? Is it possible that the issue that @asvith has is related to the default Partition model, which may not have enough space?

@asvith - Is there any error message in the console of you Arduino IDE?

lbernstone commented 2 years ago

His issue may certainly be about partitioning. More info needed.

My design philosophy is that if you are using a library (and javascipt like jquery is certainly a library in this case), it should be embedded in your code rather than a separate file. This means you know exactly what version is being delivered, and it gets replaced/updated with whatever code is calling the script. The file system should be reserved for use by user or sensor data that will be generated on the device. The file upload features may be handy for testing, but they get messy in any sort of long-term support situation where you want consistency in your end product. In practice, I put each javascript file into a separate header file, and include them from the code where I have my web server config. This makes it nearly as fast to replace as if it were a file in the /data folder.

asvith commented 2 years ago

@asvith - Is there any error message in the console of you Arduino IDE? @lbernstone - no error message in console

asvith commented 2 years ago

we are not using any files, directly in code we are using char array.

lbernstone commented 2 years ago

You are using a const char array?

asvith commented 2 years ago

yes

lbernstone commented 2 years ago

Please provide a minimal example that reproduces your error. Remove a large section of the 60k data like as in my example.

asvith commented 2 years ago

// Example code more than 60kb data....

include

include

include

include

const char ssid = "YOUR SSID"; const char password = "YOUR PASSWORD";

const char test[]PROGMEM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus condimentum sagittis lacus, laoreet luctus ligula laoreet ut. Vestibulum ullamcorper accumsan velit vel vehicula. Proin tempor lacus arcu. Nunc at elit condimentum, semper nisi et, condimentum mi. In venenatis blandit nibh at sollicitudin. Vestibulum dapibus mauris at orci maximus pellentesque. Nullam id elementum ipsum. Suspendisse cursus lobortis viverra. Proin et erat at mauris tincidunt porttitor vitae ac dui.Donec vulputate lorem tortor, nec fermentum nibh bibendum vel. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent dictum luctus massa, non euismod lacus. Pellentesque condimentum dolor est, ut dapibus lectus luctus ac. Ut sagittis commodo arcu. Integer nisi nulla, facilisis sit amet nulla quis, eleifend suscipit purus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam euismod ultrices lorem, sit amet imperdiet est tincidunt vel. Phasellus dictum justo sit amet ligula varius aliquet auctor et metus. Fusce vitae tortor et nisi pulvinar vestibulum eget in risus. Donec ante ex, placerat a lorem eget, ultricies bibendum purus. Nam sit amet neque non ante laoreet rutrum. Nullam aliquet commodo urna, sed ullamcorper odio feugiat id. Mauris nisi sapien, porttitor in condimentum nec, venenatis eu urna. Pellentesque feugiat diam est, at rhoncus orci porttitor non.Nulla luctus sem sit amet nisi consequat, id ornare ipsum dignissim. Sed elementum elit nibh, eu condimentum orci viverra quis. Aenean suscipit vitae felis non suscipit. Suspendisse pharetra turpis non eros semper dictum. Etiam tincidunt venenatis venenatis. Praesent eget gravida lorem, ut congue diam. Etiam facilisis elit at porttitor egestas. Praesent consequat, velit non vulputate convallis, ligula diam sagittis urna, in venenatis nisi justo ut mauris. Vestibulum posuere sollicitudin mi, et vulputate nisl fringilla non. Nulla ornare pretium velit a euismod. Nunc sagittis venenatis vestibulum. Nunc sodales libero a est ornare ultricies. Sed sed leo sed orci pellentesque ultrices. Mauris sollicitudin, sem quis placerat ornare, velit arcu convallis ligula, pretium finibus nisl sapien vel sem. Vivamus sit amet tortor id lorem consequat hendrerit. Nullam at dui risus.Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed feugiat semper velit consequat facilisis. Etiam facilisis justo non iaculis dictum. Fusce turpis neque, pharetra ut odio eu, hendrerit rhoncus lacus. Nunc orci felis, imperdiet vel interdum quis, porta eu ipsum. Pellentesque dictum sem lacinia, auctor dui in, malesuada nunc. Maecenas sit amet mollis eros. Proin fringilla viverra ligula, sollicitudin viverra ante sollicitudin congue. Donec mollis felis eu libero malesuada, et lacinia risus interdum.Etiam vitae accumsan augue. Ut urna orci, malesuada ut nisi a, condimentum gravida magna. Nulla bibendum ex in vulputate sagittis. Nulla facilisi. Nullam faucibus et metus ac consequat. Quisque tempor eros velit, id mattis nibh aliquet a. Aenean tempor elit ut finibus auctor. Sed at imperdiet mauris. Vestibulum pharetra non lacus sed pulvinar. Sed pellentesque magna a eros volutpat ullamcorper. In hac habitasse platea dictumst. Donec ipsum mi, feugiat in eros sed, varius lacinia turpis. Donec vulputate tincidunt dui ac laoreet. Sed in eros dui. Pellentesque placerat tristique ligula eu finibus. Proin nec faucibus felis, eu commodo ipsum.Integer eu hendrerit diam, sed consectetur nunc. Aliquam a sem vitae leo fermentum faucibus quis at sem. Etiam blandit, quam quis fermentum varius, ante urna ultricies lectus, vel pellentesque ligula arcu nec elit. Donec placerat ante in enim scelerisque pretium. Donec et rhoncus erat. Aenean tempor nisi vitae augue tincidunt luctus. Nam condimentum dictum ante, et laoreet neque pellentesque id. Curabitur consectetur cursus neque aliquam porta. Ut interdum nunc nec nibh vestibulum, in sagittis metus facilisis. Pellentesque feugiat condimentum metus. Etiam venenatis quam at ante rhoncus vestibulum. Maecenas suscipit congue pellentesque. Vestibulum suscipit scelerisque fermentum. Nulla iaculis risus ac vulputate porttitor.Mauris nec metus vel dolor blandit faucibus et vel magna. Ut tincidunt ipsum non nunc dapibus, sed blandit mi condimentum. Quisque pharetra interdum quam nec feugiat. Sed pellentesque nulla et turpis blandit interdum. Curabitur at metus vitae augue elementum viverra. Sed mattis lorem non enim fermentum finibus. Sed at dui in magna dignissim accumsan. Proin tincidunt ultricies cursus. Maecenas tincidunt magna at urna faucibus lacinia.Quisque venenatis justo sit amet tortor condimentum, nec tincidunt tellus viverra. Morbi risus ipsum, consequat convallis malesuada non, fermentum non velit. Nulla facilisis orci eget ligula mattis fermentum. Aliquam vel velit ultricies, sollicitudin nibh eu, congue velit. Donec nulla lorem, euismod id cursus at, sollicitudin et arcu. Proin vitae tincidunt ipsum. Vivamus elementum eleifend justo, placerat interdum nulla rutrum id.Phasellus fringilla luctus magna, a finibus justo dapibus a. Nam risus felis, rhoncus eget diam sit amet, congue facilisis nibh. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent consequat euismod diam, eget volutpat magna convallis at. Mauris placerat pellentesque imperdiet. Nulla porta scelerisque enim, et scelerisque neque bibendum in. Proin eget turpis nisi. Suspendisse ut est a erat egestas eleifend at euismod arcu. Donec aliquet, nisi sed faucibus condimentum, nisi metus dictum eros, nec dignissim justo odio id nulla. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas sollicitudin, justo id elementum eleifend, justo neque aliquet nibh, finibus malesuada metus erat eget neque. Suspendisse nec auctor orci. Aenean et vestibulum nulla. Nullam hendrerit augue tristique, commodo metus id, sodales lorem. Etiam feugiat dui est, vitae auctor risus convallis non.Maecenas turpis enim, consectetur eget lectus eu, hendrerit posuere lacus. Praesent efficitur, felis eget dapibus consectetur, nisi massa dignissim enim, nec semper dolor est eu urna. Nullam ut sodales lorem. Aliquam dapibus faucibus diam. Vestibulum vel magna et dolor gravida imperdiet ut sit amet sem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur elementum metus tincidunt nulla euismod ultricies. Duis elementum nec neque in porttitor. Nulla sagittis lorem elit, et consectetur ante laoreet eu. Maecenas nulla tellus, scelerisque ac erat sed, fermentum dapibus metus. Donec tincidunt fermentum molestie.Sed consequat mi at maximus faucibus. Pellentesque aliquet tincidunt sapien vel auctor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Praesent accumsan nunc eget leo aliquam, facilisis hendrerit turpis egestas. Morbi in ultricies mauris, a eleifend turpis. Quisque fringilla massa iaculis risus ultrices, sit amet tincidunt dui varius. Quisque maximus porta tristique. Proin tincidunt, turpis ut tempor pretium, lectus ipsum ullamcorper leo, ac tincidunt felis dui non leo. Aenean porta augue ligula, non consequat ipsum aliquet et. Suspendisse ut suscipit ex. Pellentesque vitae lacinia arcu. Curabitur eget tincidunt nulla, non bibendum metus. Nullam mi ipsum, eleifend vitae tortor pulvinar, facilisis sollicitudin ipsum.Vestibulum molestie risus lorem, at feugiat lorem congue sed. Phasellus ullamcorper laoreet enim, nec aliquam turpis scelerisque et. Etiam dictum metus in elit aliquam dapibus. Vivamus vel lectus velit. Nam sed purus luctus, commodo dui quis, malesuada dui. Nulla porttitor aliquet elit sit amet viverra. Proin tempor nulla urna, non aliquet metus maximus quis. Aliquam ac lectus nec mi aliquam sagittis. Quisque venenatis quam eget nisl tempor, egestas rutrum eros eleifend. Nullam venenatis commodo velit, non tempor mauris fermentum ut. In a metus quis erat cursus sagittis. Donec congue nisl in viverra egestas.Vestibulum facilisis ligula magna, eu ornare lectus varius et. Mauris facilisis faucibus quam, quis mollis eros convallis non. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent sit amet rutrum erat. Suspendisse potenti. Donec lorem mi, sagittis a fringilla sit amet, sagittis bibendum mauris. In in diam et lorem rutrum eleifend a et felis. Sed ac magna quis enim faucibus dictum. Suspendisse blandit enim eu ex laoreet gravida.Suspendisse sed semper felis. Etiam mattis magna mi, suscipit ullamcorper tellus euismod sed. Aenean congue scelerisque ligula id sodales. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nunc sem lectus, gravida ac dui non, pharetra posuere leo. Maecenas lacus libero, facilisis et elit vitae, commodo facilisis sem. Vivamus id nisl nulla. Integer at maximus dui. Ut a tincidunt lorem. Vivamus vitae ligula vel lacus cursus condimentum. Phasellus quis mauris lobortis, finibus lorem in, vulputate ex. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed faucibus aliquam metus, quis varius elit porttitor id. Vivamus dignissim sollicitudin scelerisque. Morbi tincidunt, dolor quis vehicula consequat, dui diam condimentum nunc, vitae scelerisque odio libero nec ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;Curabitur dui nisi, iaculis at cursus a, aliquam in odio. Sed mattis eget mauris non pretium. Cras faucibus eros id finibus vulputate. Curabitur imperdiet varius cursus. Aliquam vel felis quis risus mattis lobortis. Vivamus non libero at dolor elementum maximus a sit amet quam. Nullam quis turpis rhoncus, sagittis urna eu, pellentesque dui. Ut at sem eros. Curabitur a lectus dui. Vivamus sit amet lacus quis nunc lobortis ultricies quis aliquet ex. Proin sit amet ex magna. Duis accumsan suscipit facilisis. Aenean quis eros pretium, varius sem sit amet, placerat est. Fusce leo ex, viverra quis quam a, faucibus porttitor ipsum. Maecenas tempus turpis ac est porta sollicitudin vitae sit amet metus. Etiam mattis euismod malesuada.In consequat dui nibh, ut pellentesque odio tempus sed. Nullam consectetur augue non blandit fermentum. Nullam finibus massa non sem suscipit, non hendrerit turpis posuere. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean vitae vestibulum orci. Quisque est ipsum, viverra a libero eget, tristique maximus tellus. Sed finibus et purus quis pretium. Suspendisse non malesuada erat. Aliquam erat volutpat. Sed id sem purus. Donec ut sollicitudin nisl. In fermentum ut est vel finibus.Curabitur vel viverra enim. Mauris in mi efficitur felis sagittis lobortis. Duis ac felis a nibh gravida hendrerit. Integer eu sodales augue, a commodo sapien. Nam sed lorem libero. Nam convallis egestas aliquet. Nam neque sem, sodales at luctus sed, iaculis at urna. Vestibulum egestas turpis ut vulputate tempor. Morbi diam est, vulputate porta orci quis, rhoncus tristique felis. Etiam dapibus venenatis massa et lacinia. Suspendisse mollis metus in eleifend tincidunt. Praesent fermentum dui mi, nec ullamcorper nibh accumsan in. Phasellus lacus est, pharetra sed orci eu, vehicula semper nunc. Sed maximus, dolor nec ultricies volutpat, elit sem elementum urna, in condimentum risus augue ac mauris. In id tortor velit. Pellentesque eget felis tellus.Sed dui ligula, hendrerit eget fringilla vel, suscipit sit amet sapien. Cras mattis enim eget lorem gravida efficitur vel eget ligula. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed nisl massa, hendrerit eget fringilla quis, consequat nec ligula. Pellentesque maximus risus vitae feugiat aliquet. Cras vel auctor quam, dignissim lobortis velit. Nulla porttitor elit vitae ante gravida ultrices. Nulla congue tortor sem, at efficitur dui eleifend et. Praesent lacinia tellus non nulla iaculis rhoncus. Maecenas fringilla diam et tellus fringilla, finibus iaculis magna commodo. Mauris maximus est sit amet iaculis porttitor. In et lorem aliquet, ultricies erat a, vehicula eros. Vestibulum faucibus ligula dapibus orci malesuada, a pharetra dolor imperdiet. Integer id tortor nulla.Curabitur tincidunt nisi eget maximus consectetur. Phasellus felis eros, mollis sed aliquet a, pharetra at sem. Cras a facilisis libero. Mauris dui ligula, bibendum quis ullamcorper sed, condimentum sit amet erat. Nam tincidunt tortor tellus, ac porttitor sapien varius non. Morbi convallis, augue et tincidunt porttitor, urna justo convallis ipsum, sed laoreet mi elit a purus. Curabitur commodo vel ligula vel facilisis. Integer vitae vehicula lectus. Nulla luctus efficitur tortor, vel tempor nulla cursus in. Nulla gravida risus sed tellus tristique, id accumsan augue lobortis. Integer quam tellus, bibendum id augue nec, venenatis ullamcorper ipsum.Curabitur pulvinar pellentesque enim, at varius libero laoreet et. Donec vestibulum sapien nec felis venenatis congue. Duis eget tellus malesuada, vulputate mauris non, varius neque. Donec ut risus a libero vestibulum pharetra at in nibh. Nunc cursus, ex sed dignissim condimentum, mauris felis gravida ex, sit amet efficitur eros orci in arcu. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur vestibulum consectetur dapibus. Nulla egestas dolor diam. Praesent gravida vitae neque sed iaculis. In at est sit amet ante malesuada volutpat id pretium libero.Vivamus imperdiet suscipit tortor in ultricies. Aenean a dolor at odio viverra pulvinar. Vestibulum porta urna non nulla fermentum, non fringilla ante elementum. Curabitur interdum mauris a nisl placerat, ac commodo lectus sagittis. In finibus ante nec lorem pulvinar convallis. Mauris lacinia, felis vitae imperdiet pretium, ipsum lorem ornare nisi, sed venenatis est dui nec augue. Vestibulum a est convallis, vulputate lectus et, aliquam nunc. Nullam pellentesque diam a nulla porta fermentum.Etiam risus libero, lacinia at tempor sit amet, iaculis quis magna. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer pharetra fringilla imperdiet. Praesent varius fringilla libero, sed accumsan nibh dignissim eu. Suspendisse ultricies dictum nisl et dignissim. Nunc eleifend nulla tellus, a feugiat massa varius blandit. Donec ornare risus at augue dapibus bibendum.Aliquam condimentum id turpis vel faucibus. Nam ligula nulla, rhoncus eget tempus et, pellentesque ac augue. Suspendisse ultricies blandit arcu, quis pretium dui pellentesque vitae. Nunc imperdiet ipsum mauris, ut porttitor felis rutrum quis. Vestibulum porttitor vulputate nisi, non egestas eros euismod sit amet. Curabitur quis rhoncus ex. Nam consectetur libero eu tortor sagittis, quis rhoncus ex efficitur. Sed sagittis, ligula in mollis posuere, tortor quam condimentum tellus, in varius elit est imperdiet ipsum. Donec eget arcu eu tortor porta posuere. Proin non ex fermentum, porta tortor ac, porttitor nibh. Integer sed egestas leo, in scelerisque felis. Duis auctor nulla quis turpis pretium, nec lacinia velit convallis.Maecenas ut nisl dictum, porta nisi id, bibendum tellus. Nullam interdum metus eget cursus sollicitudin. Suspendisse rhoncus sodales ullamcorper. Aliquam nisi orci, dignissim eu lacinia vel, consectetur eget enim. Nam nec magna justo. Sed lacus erat, varius et eros in, viverra vehicula nisi. Aenean sit amet libero vel tortor tempus interdum. Donec pharetra mi ut enim vestibulum, et tempor tellus cursus. In venenatis vitae quam at tempor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam condimentum vehicula mauris. Nunc ut porta ipsum. Mauris mattis molestie mi sed sodales. Nunc sodales mauris eu accumsan pharetra.Phasellus vel leo nec ligula dignissim vestibulum quis sit amet nibh. Cras auctor vestibulum congue. Maecenas mattis pulvinar eros, quis egestas eros auctor sit amet. Etiam sed lacus quis lectus dignissim aliquet id vitae dui. Nulla ac elementum libero. Curabitur aliquet est vel molestie ultrices. Proin pellentesque iaculis felis et tincidunt.In et eros tellus. Maecenas tincidunt neque tellus, quis aliquam lorem volutpat vitae. Vestibulum porttitor, urna ac blandit blandit, erat sapien vulputate quam, ut tempor velit leo quis nibh. Sed ultrices lectus ut urna maximus congue. Donec tempor felis vel aliquet lobortis. Proin sodales consectetur est faucibus tempus. Vestibulum vulputate nulla et consectetur placerat. Maecenas id sodales urna. In purus tortor, mattis ut nisl id, maximus cursus leo. Duis suscipit id erat in ornare. Nulla quis convallis tortor, id efficitur tellus. Aliquam ac rutrum nunc. Nulla nulla lectus, molestie sed dictum viverra, sollicitudin et nisi. Proin porttitor scelerisque mi id porta. In interdum pellentesque orci, ac convallis purus.Pellentesque iaculis ac elit at semper. Morbi laoreet tellus nec nibh posuere fringilla. In facilisis arcu eu feugiat hendrerit. Pellentesque cursus ante eros, a maximus metus lobortis sed. In tempor quam quis urna egestas, a vulputate mauris tempus. Fusce non commodo urna, ut molestie eros. Integer cursus vitae neque vitae tincidunt. Morbi et augue consequat, sodales risus in, tempus nunc. In at mollis nisi. Phasellus tempor dui eu eros auctor, id congue tellus vestibulum.Phasellus dignissim egestas lorem sed sodales. Nullam varius nunc sed justo dictum, nec commodo ipsum facilisis. Vestibulum mauris nisi, facilisis ac elementum quis, finibus eu sem. Ut placerat eros sit amet nibh luctus, vitae tincidunt mi convallis. Curabitur ut lacus felis. Vivamus pulvinar quis risus vitae aliquam. Integer dignissim sapien massa, nec cursus urna fermentum eu. Ut et tristique sapien. Phasellus nunc augue, commodo fermentum semper quis, bibendum a magna. Duis a sapien sed ex gravida imperdiet in vitae lectus. Vivamus vestibulum lectus ligula. Phasellus sapien erat, imperdiet in hendrerit sed, aliquam sit amet erat. Proin felis augue, mattis sed quam vitae, cursus tristique risus. Praesent ullamcorper euismod sem auctor tincidunt. Sed vulputate sagittis diam. Aliquam erat volutpat.Sed orci justo, pretium ac scelerisque nec, euismod et augue. Sed commodo massa sit amet odio posuere efficitur quis ut nunc. Morbi posuere enim ante, eget dignissim erat viverra nec. In lobortis non enim in dapibus. Cras fringilla cursus purus id vehicula. In scelerisque augue eu tristique congue. Vestibulum at vehicula urna. Donec a rhoncus metus, in dictum tellus. Mauris ac sagittis odio. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec nibh tellus, laoreet vel mollis vel, dictum non lorem. Suspendisse potenti. Curabitur erat risus, lacinia quis odio ultrices, imperdiet dignissim eros.Curabitur pellentesque purus ipsum, eu semper nibh varius quis. Nunc ex eros, mollis ac bibendum et, tincidunt id turpis. Maecenas ultricies purus vitae quam rhoncus, ac finibus augue lobortis. Proin molestie tristique felis id molestie. Maecenas nec dui sed lectus tincidunt rhoncus. Morbi ut sapien rhoncus ante posuere elementum. Nulla dignissim libero et libero suscipit, non ullamcorper quam finibus. Vestibulum accumsan aliquet tortor sed consequat. Morbi vel sem vel felis ultricies sollicitudin in eget enim. Ut quis lorem et leo semper accumsan at sed elit. Cras risus felis, imperdiet quis facilisis a, maximus vitae tortor. Aliquam erat volutpat. Pellentesque lacinia aliquet tincidunt. Ut venenatis lacus nec neque blandit hendrerit at a nisi.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus condimentum sagittis lacus, laoreet luctus ligula laoreet ut. Vestibulum ullamcorper accumsan velit vel vehicula. Proin tempor lacus arcu. Nunc at elit condimentum, semper nisi et, condimentum mi. In venenatis blandit nibh at sollicitudin. Vestibulum dapibus mauris at orci maximus pellentesque. Nullam id elementum ipsum. Suspendisse cursus lobortis viverra. Proin et erat at mauris tincidunt porttitor vitae ac dui.Donec vulputate lorem tortor, nec fermentum nibh bibendum vel. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent dictum luctus massa, non euismod lacus. Pellentesque condimentum dolor est, ut dapibus lectus luctus ac. Ut sagittis commodo arcu. Integer nisi nulla, facilisis sit amet nulla quis, eleifend suscipit purus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam euismod ultrices lorem, sit amet imperdiet est tincidunt vel. Phasellus dictum justo sit amet ligula varius aliquet auctor et metus. Fusce vitae tortor et nisi pulvinar vestibulum eget in risus. Donec ante ex, placerat a lorem eget, ultricies bibendum purus. Nam sit amet neque non ante laoreet rutrum. Nullam aliquet commodo urna, sed ullamcorper odio feugiat id. Mauris nisi sapien, porttitor in condimentum nec, venenatis eu urna. Pellentesque feugiat diam est, at rhoncus orci porttitor non.Nulla luctus sem sit amet nisi consequat, id ornare ipsum dignissim. Sed elementum elit nibh, eu condimentum orci viverra quis. Aenean suscipit vitae felis non suscipit. Suspendisse pharetra turpis non eros semper dictum. Etiam tincidunt venenatis venenatis. Praesent eget gravida lorem, ut congue diam. Etiam facilisis elit at porttitor egestas. Praesent consequat, velit non vulputate convallis, ligula diam sagittis urna, in venenatis nisi justo ut mauris. Vestibulum posuere sollicitudin mi, et vulputate nisl fringilla non. Nulla ornare pretium velit a euismod. Nunc sagittis venenatis vestibulum. Nunc sodales libero a est ornare ultricies. Sed sed leo sed orci pellentesque ultrices. Mauris sollicitudin, sem quis placerat ornare, velit arcu convallis ligula, pretium finibus nisl sapien vel sem. Vivamus sit amet tortor id lorem consequat hendrerit. Nullam at dui risus.Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed feugiat semper velit consequat facilisis. Etiam facilisis justo non iaculis dictum. Fusce turpis neque, pharetra ut odio eu, hendrerit rhoncus lacus. Nunc orci felis, imperdiet vel interdum quis, porta eu ipsum. Pellentesque dictum sem lacinia, auctor dui in, malesuada nunc. Maecenas sit amet mollis eros. Proin fringilla viverra ligula, sollicitudin viverra ante sollicitudin congue. Donec mollis felis eu libero malesuada, et lacinia risus interdum.Etiam vitae accumsan augue. Ut urna orci, malesuada ut nisi a, condimentum gravida magna. Nulla bibendum ex in vulputate sagittis. Nulla facilisi. Nullam faucibus et metus ac consequat. Quisque tempor eros velit, id mattis nibh aliquet a. Aenean tempor elit ut finibus auctor. Sed at imperdiet mauris. Vestibulum pharetra non lacus sed pulvinar. Sed pellentesque magna a eros volutpat ullamcorper. In hac habitasse platea dictumst. Donec ipsum mi, feugiat in eros sed, varius lacinia turpis. Donec vulputate tincidunt dui ac laoreet. Sed in eros dui. Pellentesque placerat tristique ligula eu finibus. Proin nec faucibus felis, eu commodo ipsum.Integer eu hendrerit diam, sed consectetur nunc. Aliquam a sem vitae leo fermentum faucibus quis at sem. Etiam blandit, quam quis fermentum varius, ante urna ultricies lectus, vel pellentesque ligula arcu nec elit. Donec placerat ante in enim scelerisque pretium. Donec et rhoncus erat. Aenean tempor nisi vitae augue tincidunt luctus. Nam condimentum dictum ante, et laoreet neque pellentesque id. Curabitur consectetur cursus neque aliquam porta. Ut interdum nunc nec nibh vestibulum, in sagittis metus facilisis. Pellentesque feugiat condimentum metus. Etiam venenatis quam at ante rhoncus vestibulum. Maecenas suscipit congue pellentesque. Vestibulum suscipit scelerisque fermentum. Nulla iaculis risus ac vulputate porttitor.Mauris nec metus vel dolor blandit faucibus et vel magna. Ut tincidunt ipsum non nunc dapibus, sed blandit mi condimentum. Quisque pharetra interdum quam nec feugiat. Sed pellentesque nulla et turpis blandit interdum. Curabitur at metus vitae augue elementum viverra. Sed mattis lorem non enim fermentum finibus. Sed at dui in magna dignissim accumsan. Proin tincidunt ultricies cursus. Maecenas tincidunt magna at urna faucibus lacinia.Quisque venenatis justo sit amet tortor condimentum, nec tincidunt tellus viverra. Morbi risus ipsum, consequat convallis malesuada non, fermentum non velit. Nulla facilisis orci eget ligula mattis fermentum. Aliquam vel velit ultricies, sollicitudin nibh eu, congue velit. Donec nulla lorem, euismod id cursus at, sollicitudin et arcu. Proin vitae tincidunt ipsum. Vivamus elementum eleifend justo, placerat interdum nulla rutrum id.Phasellus fringilla luctus magna, a finibus justo dapibus a. Nam risus felis, rhoncus eget diam sit amet, congue facilisis nibh. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent consequat euismod diam, eget volutpat magna convallis at. Mauris placerat pellentesque imperdiet. Nulla porta scelerisque enim, et scelerisque neque bibendum in. Proin eget turpis nisi. Suspendisse ut est a erat egestas eleifend at euismod arcu. Donec aliquet, nisi sed faucibus condimentum, nisi metus dictum eros, nec dignissim justo odio id nulla. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas sollicitudin, justo id elementum eleifend, justo neque aliquet nibh, finibus malesuada metus erat eget neque. Suspendisse nec auctor orci. Aenean et vestibulum nulla. Nullam hendrerit augue tristique, commodo metus id, sodales lorem. Etiam feugiat dui est, vitae auctor risus convallis non.Maecenas turpis enim, consectetur eget lectus eu, hendrerit posuere lacus. Praesent efficitur, felis eget dapibus consectetur, nisi massa dignissim enim, nec semper dolor est eu urna. Nullam ut sodales lorem. Aliquam dapibus faucibus diam. Vestibulum vel magna et dolor gravida imperdiet ut sit amet sem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur elementum metus tincidunt nulla euismod ultricies. Duis elementum nec neque in porttitor. Nulla sagittis lorem elit, et consectetur ante laoreet eu. Maecenas nulla tellus, scelerisque ac erat sed, fermentum dapibus metus. Donec tincidunt fermentum molestie.Sed consequat mi at maximus faucibus. Pellentesque aliquet tincidunt sapien vel auctor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Praesent accumsan nunc eget leo aliquam, facilisis hendrerit turpis egestas. Morbi in ultricies mauris, a eleifend turpis. Quisque fringilla massa iaculis risus ultrices, sit amet tincidunt dui varius. Quisque maximus porta tristique. Proin tincidunt, turpis ut tempor pretium, lectus ipsum ullamcorper leo, ac tincidunt felis dui non leo. Aenean porta augue ligula, non consequat ipsum aliquet et. Suspendisse ut suscipit ex. Pellentesque vitae lacinia arcu. Curabitur eget tincidunt nulla, non bibendum metus. Nullam mi ipsum, eleifend vitae tortor pulvinar, facilisis sollicitudin ipsum.Vestibulum molestie risus lorem, at feugiat lorem congue sed. Phasellus ullamcorper laoreet enim, nec aliquam turpis scelerisque et. Etiam dictum metus in elit aliquam dapibus. Vivamus vel lectus velit. Nam sed purus luctus, commodo dui quis, malesuada dui. Nulla porttitor aliquet elit sit amet viverra. Proin tempor nulla urna, non aliquet metus maximus quis. Aliquam ac lectus nec mi aliquam sagittis. Quisque venenatis quam eget nisl tempor, egestas rutrum eros eleifend. Nullam venenatis commodo velit, non tempor mauris fermentum ut. In a metus quis erat cursus sagittis. Donec congue nisl in viverra egestas.Vestibulum facilisis ligula magna, eu ornare lectus varius et. Mauris facilisis faucibus quam, quis mollis eros convallis non. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent sit amet rutrum erat. Suspendisse potenti. Donec lorem mi, sagittis a fringilla sit amet, sagittis bibendum mauris. In in diam et lorem rutrum eleifend a et felis. Sed ac magna quis enim faucibus dictum. Suspendisse blandit enim eu ex laoreet gravida.Suspendisse sed semper felis. Etiam mattis magna mi, suscipit ullamcorper tellus euismod sed. Aenean congue scelerisque ligula id sodales. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nunc sem lectus, gravida ac dui non, pharetra posuere leo. Maecenas lacus libero, facilisis et elit vitae, commodo facilisis sem. Vivamus id nisl nulla. Integer at maximus dui. Ut a tincidunt lorem. Vivamus vitae ligula vel lacus cursus condimentum. Phasellus quis mauris lobortis, finibus lorem in, vulputate ex. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed faucibus aliquam metus, quis varius elit porttitor id. Vivamus dignissim sollicitudin scelerisque. Morbi tincidunt, dolor quis vehicula consequat, dui diam condimentum nunc, vitae scelerisque odio libero nec ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;Curabitur dui nisi, iaculis at cursus a, aliquam in odio. Sed mattis eget mauris non pretium. Cras faucibus eros id finibus vulputate. Curabitur imperdiet varius cursus. Aliquam vel felis quis risus mattis lobortis. Vivamus non libero at dolor elementum maximus a sit amet quam. Nullam quis turpis rhoncus, sagittis urna eu, pellentesque dui. Ut at sem eros. Curabitur a lectus dui. Vivamus sit amet lacus quis nunc lobortis ultricies quis aliquet ex. Proin sit amet ex magna. Duis accumsan suscipit facilisis. Aenean quis eros pretium, varius sem sit amet, placerat est. Fusce leo ex, viverra quis quam a, faucibus porttitor ipsum. Maecenas tempus turpis ac est porta sollicitudin vitae sit amet metus. Etiam mattis euismod malesuada.In consequat dui nibh, ut pellentesque odio tempus sed. Nullam consectetur augue non blandit fermentum. Nullam finibus massa non sem suscipit, non hendrerit turpis posuere. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean vitae vestibulum orci. Quisque est ipsum, viverra a libero eget, tristique maximus tellus. Sed finibus et purus quis pretium. Suspendisse non malesuada erat. Aliquam erat volutpat. Sed id sem purus. Donec ut sollicitudin nisl. In fermentum ut est vel finibus.Curabitur vel viverra enim. Mauris in mi efficitur felis sagittis lobortis. Duis ac felis a nibh gravida hendrerit. Integer eu sodales augue, a commodo sapien. Nam sed lorem libero. Nam convallis egestas aliquet. Nam neque sem, sodales at luctus sed, iaculis at urna. Vestibulum egestas turpis ut vulputate tempor. Morbi diam est, vulputate porta orci quis, rhoncus tristique felis. Etiam dapibus venenatis massa et lacinia. Suspendisse mollis metus in eleifend tincidunt. Praesent fermentum dui mi, nec ullamcorper nibh accumsan in. Phasellus lacus est, pharetra sed orci eu, vehicula semper nunc. Sed maximus, dolor nec ultricies volutpat, elit sem elementum urna, in condimentum risus augue ac mauris. In id tortor velit. Pellentesque eget felis tellus.Sed dui ligula, hendrerit eget fringilla vel, suscipit sit amet sapien. Cras mattis enim eget lorem gravida efficitur vel eget ligula. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed nisl massa, hendrerit eget fringilla quis, consequat nec ligula. Pellentesque maximus risus vitae feugiat aliquet. Cras vel auctor quam, dignissim lobortis velit. Nulla porttitor elit vitae ante gravida ultrices. Nulla congue tortor sem, at efficitur dui eleifend et. Praesent lacinia tellus non nulla iaculis rhoncus. Maecenas fringilla diam et tellus fringilla, finibus iaculis magna commodo. Mauris maximus est sit amet iaculis porttitor. In et lorem aliquet, ultricies erat a, vehicula eros. Vestibulum faucibus ligula dapibus orci malesuada, a pharetra dolor imperdiet. Integer id tortor nulla.Curabitur tincidunt nisi eget maximus consectetur. Phasellus felis eros, mollis sed aliquet a, pharetra at sem. Cras a facilisis libero. Mauris dui ligula, bibendum quis ullamcorper sed, condimentum sit amet erat. Nam tincidunt tortor tellus, ac porttitor sapien varius non. Morbi convallis, augue et tincidunt porttitor, urna justo convallis ipsum, sed laoreet mi elit a purus. Curabitur commodo vel ligula vel facilisis. Integer vitae vehicula lectus. Nulla luctus efficitur tortor, vel tempor nulla cursus in. Nulla gravida risus sed tellus tristique, id accumsan augue lobortis. Integer quam tellus, bibendum id augue nec, venenatis ullamcorper ipsum.Curabitur pulvinar pellentesque enim, at varius libero laoreet et. Donec vestibulum sapien nec felis venenatis congue. Duis eget tellus malesuada, vulputate mauris non, varius neque. Donec ut risus a libero vestibulum pharetra at in nibh. Nunc cursus, ex sed dignissim condimentum, mauris felis gravida ex, sit amet efficitur eros orci in arcu. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur vestibulum consectetur dapibus. Nulla egestas dolor diam. Praesent gravida vitae neque sed iaculis. In at est sit amet ante malesuada volutpat id pretium libero.Vivamus imperdiet suscipit tortor in ultricies. Aenean a dolor at odio viverra pulvinar. Vestibulum porta urna non nulla fermentum, non fringilla ante elementum. Curabitur interdum mauris a nisl placerat, ac commodo lectus sagittis. In finibus ante nec lorem pulvinar convallis. Mauris lacinia, felis vitae imperdiet pretium, ipsum lorem ornare nisi, sed venenatis est dui nec augue. Vestibulum a est convallis, vulputate lectus et, aliquam nunc. Nullam pellentesque diam a nulla porta fermentum.Etiam risus libero, lacinia at tempor sit amet, iaculis quis magna. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer pharetra fringilla imperdiet. Praesent varius fringilla libero, sed accumsan nibh dignissim eu. Suspendisse ultricies dictum nisl et dignissim. Nunc eleifend nulla tellus, a feugiat massa varius blandit. Donec ornare risus at augue dapibus bibendum.Aliquam condimentum id turpis vel faucibus. Nam ligula nulla, rhoncus eget tempus et, pellentesque ac augue. Suspendisse ultricies blandit arcu, quis pretium dui pellentesque vitae. Nunc imperdiet ipsum mauris, ut porttitor felis rutrum quis. Vestibulum porttitor vulputate nisi, non egestas eros euismod sit amet. Curabitur quis rhoncus ex. Nam consectetur libero eu tortor sagittis, quis rhoncus ex efficitur. Sed sagittis, ligula in mollis posuere, tortor quam condimentum tellus, in varius elit est imperdiet ipsum. Donec eget arcu eu tortor porta posuere. Proin non ex fermentum, porta tortor ac, porttitor nibh. Integer sed egestas leo, in scelerisque felis. Duis auctor nulla quis turpis pretium, nec lacinia velit convallis.Maecenas ut nisl dictum, porta nisi id, bibendum tellus. Nullam interdum metus eget cursus sollicitudin. Suspendisse rhoncus sodales ullamcorper. Aliquam nisi orci, dignissim eu lacinia vel, consectetur eget enim. Nam nec magna justo. Sed lacus erat, varius et eros in, viverra vehicula nisi. Aenean sit amet libero vel tortor tempus interdum. Donec pharetra mi ut enim vestibulum, et tempor tellus cursus. In venenatis vitae quam at tempor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam condimentum vehicula mauris. Nunc ut porta ipsum. Mauris mattis molestie mi sed sodales. Nunc sodales mauris eu accumsan pharetra.Phasellus vel leo nec ligula dignissim vestibulum quis sit amet nibh. Cras auctor vestibulum congue. Maecenas mattis pulvinar eros, quis egestas eros auctor sit amet. Etiam sed lacus quis lectus dignissim aliquet id vitae dui. Nulla ac elementum libero. Curabitur aliquet est vel molestie ultrices. Proin pellentesque iaculis felis et tincidunt.In et eros tellus. Maecenas tincidunt neque tellus, quis aliquam lorem volutpat vitae. Vestibulum porttitor, urna ac blandit blandit, erat sapien vulputate quam, ut tempor velit leo quis nibh. Sed ultrices lectus ut urna maximus congue. Donec tempor felis vel aliquet lobortis. Proin sodales consectetur est faucibus tempus. Vestibulum vulputate nulla et consectetur placerat. Maecenas id sodales urna. In purus tortor, mattis ut nisl id, maximus cursus leo. Duis suscipit id erat in ornare. Nulla quis convallis tortor, id efficitur tellus. Aliquam ac rutrum nunc. Nulla nulla lectus, molestie sed dictum viverra, sollicitudin et nisi. Proin porttitor scelerisque mi id porta. In interdum pellentesque orci, ac convallis purus.Pellentesque iaculis ac elit at semper. Morbi laoreet tellus nec nibh posuere fringilla. In facilisis arcu eu feugiat hendrerit. Pellentesque cursus ante eros, a maximus metus lobortis sed. In tempor quam quis urna egestas, a vulputate mauris tempus. Fusce non commodo urna, ut molestie eros. Integer cursus vitae neque vitae tincidunt. Morbi et augue consequat, sodales risus in, tempus nunc. In at mollis nisi. Phasellus tempor dui eu eros auctor, id congue tellus vestibulum.Phasellus dignissim egestas lorem sed sodales. Nullam varius nunc sed justo dictum, nec commodo ipsum facilisis. Vestibulum mauris nisi, facilisis ac elementum quis, finibus eu sem. Ut placerat eros sit amet nibh luctus, vitae tincidunt mi convallis. Curabitur ut lacus felis. Vivamus pulvinar quis risus vitae aliquam. Integer dignissim sapien massa, nec cursus urna fermentum eu. Ut et tristique sapien. Phasellus nunc augue, commodo fermentum semper quis, bibendum a magna. Duis a sapien sed ex gravida imperdiet in vitae lectus. Vivamus vestibulum lectus ligula. Phasellus sapien erat, imperdiet in hendrerit sed, aliquam sit amet erat. Proin felis augue, mattis sed quam vitae, cursus tristique risus. Praesent ullamcorper euismod sem auctor tincidunt. Sed vulputate sagittis diam. Aliquam erat volutpat.Sed orci justo, pretium ac scelerisque nec, euismod et augue. Sed commodo massa sit amet odio posuere efficitur quis ut nunc. Morbi posuere enim ante, eget dignissim erat viverra nec. In lobortis non enim in dapibus. Cras fringilla cursus purus id vehicula. In scelerisque augue eu tristique congue. Vestibulum at vehicula urna. Donec a rhoncus metus, in dictum tellus. Mauris ac sagittis odio. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec nibh tellus, laoreet vel mollis vel, dictum non lorem. Suspendisse potenti. Curabitur erat risus, lacinia quis odio ultrices, imperdiet dignissim eros.Curabitur pellentesque purus ipsum, eu semper nibh varius quis. Nunc ex eros, mollis ac bibendum et, tincidunt id turpis. Maecenas ultricies purus vitae quam rhoncus, ac finibus augue lobortis. Proin molestie tristique felis id molestie. Maecenas nec dui sed lectus tincidunt rhoncus. Morbi ut sapien rhoncus ante posuere elementum. Nulla dignissim libero et libero suscipit, non ullamcorper quam finibus. Vestibulum accumsan aliquet tortor sed consequat. Morbi vel sem vel felis ultricies sollicitudin in eget enim. Ut quis lorem et leo semper accumsan at sed elit. Cras risus felis, imperdiet quis facilisis a, maximus vitae tortor. Aliquam erat volutpat. Pellentesque lacinia aliquet tincidunt. Ut venenatis lacus nec neque blandit hendrerit at a nisi.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus condimentum sagittis lacus, laoreet luctus ligula laoreet ut. Vestibulum ullamcorper accumsan velit vel vehicula. Proin tempor lacus arcu. Nunc at elit condimentum, semper nisi et, condimentum mi. In venenatis blandit nibh at sollicitudin. Vestibulum dapibus mauris at orci maximus pellentesque. Nullam id elementum ipsum. Suspendisse cursus lobortis viverra. Proin et erat at mauris tincidunt porttitor vitae ac dui.Donec vulputate lorem tortor, nec fermentum nibh bibendum vel. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent dictum luctus massa, non euismod lacus. Pellentesque condimentum dolor est, ut dapibus lectus luctus ac. Ut sagittis commodo arcu. Integer nisi nulla, facilisis sit amet nulla quis, eleifend suscipit purus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam euismod ultrices lorem, sit amet imperdiet est tincidunt vel. Phasellus dictum justo sit amet ligula varius aliquet auctor et metus. Fusce vitae tortor et nisi pulvinar vestibulum eget in risus. Donec ante ex, placerat a lorem eget, ultricies bibendum purus. Nam sit amet neque non ante laoreet rutrum. Nullam aliquet commodo urna, sed ullamcorper odio feugiat id. Mauris nisi sapien, porttitor in condimentum nec, venenatis eu urna. Pellentesque feugiat diam est, at rhoncus orci porttitor non.Nulla luctus sem sit amet nisi consequat, id ornare ipsum dignissim. Sed elementum elit nibh, eu condimentum orci viverra quis. Aenean suscipit vitae felis non suscipit. Suspendisse pharetra turpis non eros semper dictum. Etiam tincidunt venenatis venenatis. Praesent eget gravida lorem, ut congue diam. Etiam facilisis elit at porttitor egestas. Praesent consequat, velit non vulputate convallis, ligula diam sagittis urna, in venenatis nisi justo ut mauris. Vestibulum posuere sollicitudin mi, et vulputate nisl fringilla non. Nulla ornare pretium velit a euismod. Nunc sagittis venenatis vestibulum. Nunc sodales libero a est ornare ultricies. Sed sed leo sed orci pellentesque ultrices. Mauris sollicitudin, sem quis placerat ornare, velit arcu convallis ligula, pretium finibus nisl sapien vel sem. Vivamus sit amet tortor id lorem consequat hendrerit. Nullam at dui risus.Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed feugiat semper velit consequat facilisis. Etiam facilisis justo non iaculis dictum. Fusce turpis neque, pharetra ut odio eu, hendrerit rhoncus lacus. Nunc orci felis, imperdiet vel interdum quis, porta eu ipsum. Pellentesque dictum sem lacinia, auctor dui in, malesuada nunc. Maecenas sit amet mollis eros. Proin fringilla viverra ligula, sollicitudin viverra ante sollicitudin congue. Donec mollis felis eu libero malesuada, et lacinia risus interdum.Etiam vitae accumsan augue. Ut urna orci, malesuada ut nisi a, condimentum gravida magna. Nulla bibendum ex in vulputate sagittis. Nulla facilisi. Nullam faucibus et metus ac consequat. Quisque tempor eros velit, id mattis nibh aliquet a. Aenean tempor elit ut finibus auctor. Sed at imperdiet mauris. Vestibulum pharetra non lacus sed pulvinar. Sed pellentesque magna a eros volutpat ullamcorper. In hac habitasse platea dictumst. Donec ipsum mi, feugiat in eros sed, varius lacinia turpis. Donec vulputate tincidunt dui ac laoreet. Sed in eros dui. Pellentesque placerat tristique ligula eu finibus. Proin nec faucibus felis, eu commodo ipsum.Integer eu hendrerit diam, sed consectetur nunc. Aliquam a sem vitae leo fermentum faucibus quis at sem. Etiam blandit, quam quis fermentum varius, ante urna ultricies lectus, vel pellentesque ligula arcu nec elit. Donec placerat ante in enim scelerisque pretium. Donec et rhoncus erat. Aenean tempor nisi vitae augue tincidunt luctus. Nam condimentum dictum ante, et laoreet neque pellentesque id. Curabitur consectetur cursus neque aliquam porta. Ut interdum nunc nec nibh vestibulum, in sagittis metus facilisis. Pellentesque feugiat condimentum metus. Etiam venenatis quam at ante rhoncus vestibulum. Maecenas suscipit congue pellentesque. Vestibulum suscipit scelerisque fermentum. Nulla iaculis risus ac vulputate porttitor.Mauris nec metus vel dolor blandit faucibus et vel magna. Ut tincidunt ipsum non nunc dapibus, sed blandit mi condimentum. Quisque pharetra interdum quam nec feugiat. Sed pellentesque nulla et turpis blandit interdum. Curabitur at metus vitae augue elementum viverra. Sed mattis lorem non enim fermentum finibus. Sed at dui in magna dignissim accumsan. Proin tincidunt ultricies cursus. Maecenas tincidunt magna at urna faucibus lacinia.Quisque venenatis justo sit amet tortor condimentum, nec tincidunt tellus viverra. Morbi risus ipsum, consequat convallis malesuada non, fermentum non velit. Nulla facilisis orci eget ligula mattis fermentum. Aliquam vel velit ultricies, sollicitudin nibh eu, congue velit. Donec nulla lorem, euismod id cursus at, sollicitudin et arcu. Proin vitae tincidunt ipsum. Vivamus elementum eleifend justo, placerat interdum nulla rutrum id.Phasellus fringilla luctus magna, a finibus justo dapibus a. Nam risus felis, rhoncus eget diam sit amet, congue facilisis nibh. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent consequat euismod diam, eget volutpat magna convallis at. Mauris placerat pellentesque imperdiet. Nulla porta scelerisque enim, et scelerisque neque bibendum in. Proin eget turpis nisi. Suspendisse ut est a erat egestas eleifend at euismod arcu. Donec aliquet, nisi sed faucibus condimentum, nisi metus dictum eros, nec dignissim justo odio id nulla. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas sollicitudin, justo id elementum eleifend, justo neque aliquet nibh, finibus malesuada metus erat eget neque. Suspendisse nec auctor orci. Aenean et vestibulum nulla. Nullam hendrerit augue tristique, commodo metus id, sodales lorem. Etiam feugiat dui est, vitae auctor risus convallis non.Maecenas turpis enim, consectetur eget lectus eu, hendrerit posuere lacus. Praesent efficitur, felis eget dapibus consectetur, nisi massa dignissim enim, nec semper dolor est eu urna. Nullam ut sodales lorem. Aliquam dapibus faucibus diam. Vestibulum vel magna et dolor gravida imperdiet ut sit amet sem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur elementum metus tincidunt nulla euismod ultricies. Duis elementum nec neque in porttitor. Nulla sagittis lorem elit, et consectetur ante laoreet eu. Maecenas nulla tellus, scelerisque ac erat sed, fermentum dapibus metus. Donec tincidunt fermentum molestie.Sed consequat mi at maximus faucibus. Pellentesque aliquet tincidunt sapien vel auctor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Praesent accumsan nunc eget leo aliquam, facilisis hendrerit turpis egestas. Morbi in ultricies mauris, a eleifend turpis. Quisque fringilla massa iaculis risus ultrices, sit amet tincidunt dui varius. Quisque maximus porta tristique. Proin tincidunt, turpis ut tempor pretium, lectus ipsum ullamcorper leo, ac tincidunt felis dui non leo. Aenean porta augue ligula, non consequat ipsum aliquet et. Suspendisse ut suscipit ex. Pellentesque vitae lacinia arcu. Curabitur eget tincidunt nulla, non bibendum metus. Nullam mi ipsum, eleifend vitae tortor pulvinar, facilisis sollicitudin ipsum.Vestibulum molestie risus lorem, at feugiat lorem congue sed. Phasellus ullamcorper laoreet enim, nec aliquam turpis scelerisque et. Etiam dictum metus in elit aliquam dapibus. Vivamus vel lectus velit. Nam sed purus luctus, commodo dui quis, malesuada dui. Nulla porttitor aliquet elit sit amet viverra. Proin tempor nulla urna, non aliquet metus maximus quis. Aliquam ac lectus nec mi aliquam sagittis. Quisque venenatis quam eget nisl tempor, egestas rutrum eros eleifend. Nullam venenatis commodo velit, non tempor mauris fermentum ut. In a metus quis erat cursus sagittis. Donec congue nisl in viverra egestas.Vestibulum facilisis ligula magna, eu ornare lectus varius et. Mauris facilisis faucibus quam, quis mollis eros convallis non. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent sit amet rutrum erat. Suspendisse potenti. Donec lorem mi, sagittis a fringilla sit amet, sagittis bibendum mauris. In in diam et lorem rutrum eleifend a et felis. Sed ac magna quis enim faucibus dictum. Suspendisse blandit enim eu ex laoreet gravida.Suspendisse sed semper felis. Etiam mattis magna mi, suscipit ullamcorper tellus euismod sed. Aenean congue scelerisque ligula id sodales. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nunc sem lectus, gravida ac dui non, pharetra posuere leo. Maecenas lacus libero, facilisis et elit vitae, commodo facilisis sem. Vivamus id nisl nulla. Integer at maximus dui. Ut a tincidunt lorem. Vivamus vitae ligula vel lacus cursus condimentum. Phasellus quis mauris lobortis, finibus lorem in, vulputate ex. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed faucibus aliquam metus, quis varius elit porttitor id. Vivamus dignissim sollicitudin scelerisque. Morbi tincidunt, dolor quis vehicula consequat, dui diam condimentum nunc, vitae scelerisque odio libero nec ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;Curabitur dui nisi, iaculis at cursus a, aliquam in odio. Sed mattis eget mauris non pretium. Cras faucibus eros id finibus vulputate. Curabitur imperdiet varius cursus. Aliquam vel felis quis risus mattis lobortis. Vivamus non libero at dolor elementum maximus a sit amet quam. Nullam quis turpis rhoncus, sagittis urna eu, pellentesque dui. Ut at sem eros. Curabitur a lectus dui. Vivamus sit amet lacus quis nunc lobortis ultricies quis aliquet ex. Proin sit amet ex magna. Duis accumsan suscipit facilisis. Aenean quis eros pretium, varius sem sit amet, placerat est. Fusce leo ex, viverra quis quam a, faucibus porttitor ipsum. Maecenas tempus turpis ac est porta sollicitudin vitae sit amet metus. Etiam mattis euismod malesuada.In consequat dui nibh, ut pellentesque odio tempus sed. Nullam consectetur augue non blandit fermentum. Nullam finibus massa non sem suscipit, non hendrerit turpis posuere. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean vitae vestibulum orci. Quisque est ipsum, viverra a libero eget, tristique maximus tellus. Sed finibus et purus quis pretium. Suspendisse non malesuada erat. Aliquam erat volutpat. Sed id sem purus. Donec ut sollicitudin nisl. In fermentum ut est vel finibus.Curabitur vel viverra enim. Mauris in mi efficitur felis sagittis lobortis. Duis ac felis a nibh gravida hendrerit. Integer eu sodales augue, a commodo sapien. Nam sed lorem libero. Nam convallis egestas aliquet. Nam neque sem, sodales at luctus sed, iaculis at urna. Vestibulum egestas turpis ut vulputate tempor. Morbi diam est, vulputate porta orci quis, rhoncus tristique felis. Etiam dapibus venenatis massa et lacinia. Suspendisse mollis metus in eleifend tincidunt. Praesent fermentum dui mi, nec ullamcorper nibh accumsan in. Phasellus lacus est, pharetra sed orci eu, vehicula semper nunc. Sed maximus, dolor nec ultricies volutpat, elit sem elementum urna, in condimentum risus augue ac mauris. In id tortor velit. Pellentesque eget felis tellus.Sed dui ligula, hendrerit eget fringilla vel, suscipit sit amet sapien. Cras mattis enim eget lorem gravida efficitur vel eget ligula. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed nisl massa, hendrerit eget fringilla quis, consequat nec ligula. Pellentesque maximus risus vitae feugiat aliquet. Cras vel auctor quam, dignissim lobortis velit. Nulla porttitor elit vitae ante gravida ultrices. Nulla congue tortor sem, at efficitur dui eleifend et. Praesent lacinia tellus non nulla iaculis rhoncus. Maecenas fringilla diam et tellus fringilla, finibus iaculis magna commodo. Mauris maximus est sit amet iaculis porttitor. In et lorem aliquet, ultricies erat a, vehicula eros. Vestibulum faucibus ligula dapibus orci malesuada, a pharetra dolor imperdiet. Integer id tortor nulla.Curabitur tincidunt nisi eget maximus consectetur. Phasellus felis eros, mollis sed aliquet a, pharetra at sem. Cras a facilisis libero. Mauris dui ligula, bibendum quis ullamcorper sed, condimentum sit amet erat. Nam tincidunt tortor tellus, ac porttitor sapien varius non. Morbi convallis, augue et tincidunt porttitor, urna justo convallis ipsum, sed laoreet mi elit a purus. Curabitur commodo vel ligula vel facilisis. Integer vitae vehicula lectus. Nulla luctus efficitur tortor, vel tempor nulla cursus in. Nulla gravida risus sed tellus tristique, id accumsan augue lobortis. Integer quam tellus, bibendum id augue nec, venenatis ullamcorper ipsum.Curabitur pulvinar pellentesque enim, at varius libero laoreet et. Donec vestibulum sapien nec felis venenatis congue. Duis eget tellus malesuada, vulputate mauris non, varius neque. Donec ut risus a libero vestibulum pharetra at in nibh. Nunc cursus, ex sed dignissim condimentum, mauris felis gravida ex, sit amet efficitur eros orci in arcu. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur vestibulum consectetur dapibus. Nulla egestas dolor diam. Praesent gravida vitae neque sed iaculis. In at est sit amet ante malesuada volutpat id pretium libero.Vivamus imperdiet suscipit tortor in ultricies. Aenean a dolor at odio viverra pulvinar. Vestibulum porta urna non nulla fermentum, non fringilla ante elementum. Curabitur interdum mauris a nisl placerat, ac commodo lectus sagittis. In finibus ante nec lorem pulvinar convallis. Mauris lacinia, felis vitae imperdiet pretium, ipsum lorem ornare nisi, sed venenatis est dui nec augue. Vestibulum a est convallis, vulputate lectus et, aliquam nunc. Nullam pellentesque diam a nulla porta fermentum.Etiam risus libero, lacinia at tempor sit amet, iaculis quis magna. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer pharetra fringilla imperdiet. Praesent varius fringilla libero, sed accumsan nibh dignissim eu. Suspendisse ultricies dictum nisl et dignissim. Nunc eleifend nulla tellus, a feugiat massa varius blandit. Donec ornare risus at augue dapibus bibendum.Aliquam condimentum id turpis vel faucibus. Nam ligula nulla, rhoncus eget tempus et, pellentesque ac augue. Suspendisse ultricies blandit arcu, quis pretium dui pellentesque vitae. Nunc imperdiet ipsum mauris, ut porttitor felis rutrum quis. Vestibulum porttitor vulputate nisi, non egestas eros euismod sit amet. Curabitur quis rhoncus ex. Nam consectetur libero eu tortor sagittis, quis rhoncus ex efficitur. Sed sagittis, ligula in mollis posuere, tortor quam condimentum tellus, in varius elit est imperdiet ipsum. Donec eget arcu eu tortor porta posuere. Proin non ex fermentum, porta tortor ac, porttitor nibh. Integer sed egestas leo, in scelerisque felis. Duis auctor nulla quis turpis pretium, nec lacinia velit convallis.Maecenas ut nisl dictum, porta nisi id, bibendum tellus. Nullam interdum metus eget cursus sollicitudin. Suspendisse rhoncus sodales ullamcorper. Aliquam nisi orci, dignissim eu lacinia vel, consectetur eget enim. Nam nec magna justo. Sed lacus erat, varius et eros in, viverra vehicula nisi. Aenean sit amet libero vel tortor tempus interdum. Donec pharetra mi ut enim vestibulum, et tempor tellus cursus. In venenatis vitae quam at tempor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam condimentum vehicula mauris. Nunc ut porta ipsum. Mauris mattis molestie mi sed sodales. Nunc sodales mauris eu accumsan pharetra.Phasellus vel leo nec ligula dignissim vestibulum quis sit amet nibh. Cras auctor vestibulum congue. Maecenas mattis pulvinar eros, quis egestas eros auctor sit amet. Etiam sed lacus quis lectus dignissim aliquet id vitae dui. Nulla ac elementum libero. Curabitur aliquet est vel molestie ultrices. Proin pellentesque iaculis felis et tincidunt.In et eros tellus. Maecenas tincidunt neque tellus, quis aliquam lorem volutpat vitae. Vestibulum porttitor, urna ac blandit blandit, erat sapien vulputate quam, ut tempor velit leo quis nibh. Sed ultrices lectus ut urna maximus congue. Donec tempor felis vel aliquet lobortis. Proin sodales consectetur est faucibus tempus. Vestibulum vulputate nulla et consectetur placerat. Maecenas id sodales urna. In purus tortor, mattis ut nisl id, maximus cursus leo. Duis suscipit id erat in ornare. Nulla quis convallis tortor, id efficitur tellus. Aliquam ac rutrum nunc. Nulla nulla lectus, molestie sed dictum viverra, sollicitudin et nisi. Proin porttitor scelerisque mi id porta. In interdum pellentesque orci, ac convallis purus.Pellentesque iaculis ac elit at semper. Morbi laoreet tellus nec nibh posuere fringilla. In facilisis arcu eu feugiat hendrerit. Pellentesque cursus ante eros, a maximus metus lobortis sed. In tempor quam quis urna egestas, a vulputate mauris tempus. Fusce non commodo urna, ut molestie eros. Integer cursus vitae neque vitae tincidunt. Morbi et augue consequat, sodales risus in, tempus nunc. In at mollis nisi. Phasellus tempor dui eu eros auctor, id congue tellus vestibulum.Phasellus dignissim egestas lorem sed sodales. Nullam varius nunc sed justo dictum, nec commodo ipsum facilisis. Vestibulum mauris nisi, facilisis ac elementum quis, finibus eu sem. Ut placerat eros sit amet nibh luctus, vitae tincidunt mi convallis. Curabitur ut lacus felis. Vivamus pulvinar quis risus vitae aliquam. Integer dignissim sapien massa, nec cursus urna fermentum eu. Ut et tristique sapien. Phasellus nunc augue, commodo fermentum semper quis, bibendum a magna. Duis a sapien sed ex gravida imperdiet in vitae lectus. Vivamus vestibulum lectus ligula. Phasellus sapien erat, imperdiet in hendrerit sed, aliquam sit amet erat. Proin felis augue, mattis sed quam vitae, cursus tristique risus. Praesent ullamcorper euismod sem auctor tincidunt. Sed vulputate sagittis diam. Aliquam erat volutpat.Sed orci justo, pretium ac scelerisque nec, euismod et augue. Sed commodo massa sit amet odio posuere efficitur quis ut nunc. Morbi posuere enim ante, eget dignissim erat viverra nec. In lobortis non enim in dapibus. Cras fringilla cursus purus id vehicula. In scelerisque augue eu tristique congue. Vestibulum at vehicula urna. Donec a rhoncus metus, in dictum tellus. Mauris ac sagittis odio. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec nibh tellus, laoreet vel mollis vel, dictum non lorem. Suspendisse potenti. Curabitur erat risus, lacinia quis odio ultrices, imperdiet dignissim eros.Curabitur pellentesque purus ipsum, eu semper nibh varius quis. Nunc ex eros, mollis ac bibendum et, tincidunt id turpis. Maecenas ultricies purus vitae quam rhoncus, ac finibus augue lobortis. Proin molestie tristique felis id molestie. Maecenas nec dui sed lectus tincidunt rhoncus. Morbi ut sapien rhoncus ante posuere elementum. Nulla dignissim libero et libero suscipit, non ullamcorper quam finibus. Vestibulum accumsan aliquet tortor sed consequat. Morbi vel sem vel felis ultricies sollicitudin in eget enim. Ut quis lorem et leo semper accumsan at sed elit. Cras risus felis, imperdiet quis facilisis a, maximus vitae tortor. Aliquam erat volutpat. Pellentesque lacinia aliquet tincidunt. Ut venenatis lacus nec neque blandit hendrerit at a nisi.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus condimentum sagittis lacus, laoreet luctus ligula laoreet ut. Vestibulum ullamcorper accumsan velit vel vehicula. Proin tempor lacus arcu. Nunc at elit condimentum, semper nisi et, condimentum mi. In venenatis blandit nibh at sollicitudin. Vestibulum dapibus mauris at orci maximus pellentesque. Nullam id elementum ipsum. Suspendisse cursus lobortis viverra. Proin et erat at mauris tincidunt porttitor vitae ac dui.Donec vulputate lorem tortor, nec fermentum nibh bibendum vel. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent dictum luctus massa, non euismod lacus. Pellentesque condimentum dolor est, ut dapibus lectus luctus ac. Ut sagittis commodo arcu. Integer nisi nulla, facilisis sit amet nulla quis, eleifend suscipit purus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam euismod ultrices lorem, sit amet imperdiet est tincidunt vel. Phasellus dictum justo sit amet ligula varius aliquet auctor et metus. Fusce vitae tortor et nisi pulvinar vestibulum eget in risus. Donec ante ex, placerat a lorem eget, ultricies bibendum purus. Nam sit amet neque non ante laoreet rutrum. Nullam aliquet commodo urna, sed ullamcorper odio feugiat id. Mauris nisi sapien, porttitor in condimentum nec, venenatis eu urna. Pellentesque feugiat diam est, at rhoncus orci porttitor non.Nulla luctus sem sit amet nisi consequat, id ornare ipsum dignissim. Sed elementum elit nibh, eu condimentum orci viverra quis. Aenean suscipit vitae felis non suscipit. Suspendisse pharetra turpis non eros semper dictum. Etiam tincidunt venenatis venenatis. Praesent eget gravida lorem, ut congue diam. Etiam facilisis elit at porttitor egestas. Praesent consequat, velit non vulputate convallis, ligula diam sagittis urna, in venenatis nisi justo ut mauris. Vestibulum posuere sollicitudin mi, et vulputate nisl fringilla non. Nulla ornare pretium velit a euismod. Nunc sagittis venenatis vestibulum. Nunc sodales libero a est ornare ultricies. Sed sed leo sed orci pellentesque ultrices. Mauris sollicitudin, sem quis placerat ornare, velit arcu convallis ligula, pretium finibus nisl sapien vel sem. Vivamus sit amet tortor id lorem consequat hendrerit. Nullam at dui risus.estibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed feugiat semper velit consequat facilisis. Etiam facilisis justo non iaculis dictum. Fusce turpis neque, pharetra ut odio eu, hendrerit rhoncus lacus. Nunc orci felis, imperdiet vel interdum quis, porta eu ipsum. Pellentesque dictum sem lacinia, auctor dui in, malesuada nunc. Maecenas sit amet mollis eros. Proin fringilla viverra ligula, sollicitudin viverra ante sollicitudin congue. Donec mollis felis eu libero malesuada, et lacinia risus interdum.Etiam vitae accumsan augue. Ut urna orci, malesuada ut nisi a, condimentum gravida magna. Nulla bibendum ex in vulputate sagittis. Nulla facilisi. Nullam faucibus et metus ac consequat. Quisque tempor eros velit, id mattis nibh aliquet a. Aenean tempor elit ut finibus auctor. Sed at imperdiet mauris. Vestibulum pharetra non lacus sed pulvinar. Sed pellentesque magna a eros volutpat ullamcorper. In hac habitasse platea dictumst. Donec ipsum mi, feugiat in eros sed, varius lacinia turpis. Donec vulputate tincidunt dui ac laoreet. Sed in eros dui. Pellentesque placerat tristique ligula eu finibus. Proin nec faucibus felis, eu commodo ipsum.Integer eu hendrerit diam, sed consectetur nunc. Aliquam a sem vitae leo fermentum faucibus quis at sem. Etiam blandit, quam quis fermentum varius, ante urna ultricies lectus, vel pellentesque ligula arcu nec elit. Donec placerat ante in enim scelerisque pretium. Donec et rhoncus erat. Aenean tempor nisi vitae augue tincidunt luctus. Nam condimentum dictum ante, et laoreet neque pellentesque id. Curabitur consectetur cursus neque aliquam porta. Ut interdum nunc nec nibh vestibulum, in sagittis metus facilisis. Pellentesque feugiat condimentum metus. Etiam venenatis quam at ante rhoncus vestibulum. Maecenas suscipit congue pellentesque. Vestibulum suscipit scelerisque fermentum. Nulla iaculis risus ac vulputate porttitor.Mauris nec metus vel dolor blandit faucibus et vel magna. Ut tincidunt ipsum non nunc dapibus, sed blandit mi condimentum. Quisque pharetra interdum quam nec feugiat. Sed pellentesque nulla et turpis blandit interdum. Curabitur at metus vitae augue elementum viverra. Sed mattis lorem non enim fermentum finibus. Sed at dui in magna dignissim accumsan. Proin tincidunt ultricies cursus. Maecenas tincidunt magna at urna faucibus lacinia.Quisque venenatis justo sit amet tortor condimentum, nec tincidunt tellus viverra. Morbi risus ipsum, consequat convallis malesuada non, fermentum non velit. Nulla facilisis orci eget ligula mattis fermentum. Aliquam vel velit ultricies, sollicitudin nibh eu, congue velit. Donec nulla lorem, euismod id cursus at, sollicitudin et arcu. Proin vitae tincidunt ipsum. Vivamus elementum eleifend justo, placerat interdum nulla rutrum id.Phasellus fringilla luctus magna, a finibus justo dapibus a. Nam risus felis, rhoncus eget diam sit amet, congue facilisis nibh. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent consequat euismod diam, eget volutpat magna convallis at. Mauris placerat pellentesque imperdiet. Nulla porta scelerisque enim, et scelerisque neque bibendum in. Proin eget turpis nisi. Suspendisse ut est a erat egestas eleifend at euismod arcu. Donec aliquet, nisi sed faucibus condimentum, nisi metus dictum eros, nec dignissim justo odio id nulla. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas sollicitudin, justo id elementum eleifend, justo neque aliquet nibh, finibus malesuada metus erat eget neque. Suspendisse nec auctor orci. Aenean et vestibulum nulla. Nullam hendrerit augue tristique, commodo metus id, sodales lorem. Etiam feugiat dui est, vitae auctor risus convallis non.Maecenas turpis enim, consectetur eget lectus eu, hendrerit posuere lacus. Praesent efficitur, felis eget dapibus consectetur, nisi massa dignissim enim, nec semper dolor est eu urna. Nullam ut sodales lorem. Aliquam dapibus faucibus diam. Vestibulum vel magna et dolor gravida imperdiet ut sit amet sem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur elementum metus tincidunt nulla euismod ultricies. Duis elementum nec neque in porttitor. Nulla sagittis lorem elit, et consectetur ante laoreet eu. Maecenas nulla tellus, scelerisque ac erat sed, fermentum dapibus metus. Donec tincidunt fermentum molestie.Sed consequat mi at maximus faucibus. Pellentesque aliquet tincidunt sapien vel auctor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Praesent accumsan nunc eget leo aliquam, facilisis hendrerit turpis egestas. Morbi in ultricies mauris, a eleifend turpis. Quisque fringilla massa iaculis risus ultrices, sit amet tincidunt dui varius. Quisque maximus porta tristique. Proin tincidunt, turpis ut tempor pretium, lectus ipsum ullamcorper leo, ac tincidunt felis dui non leo. Aenean porta augue ligula, non consequat ipsum aliquet et. Suspendisse ut suscipit ex. Pellentesque vitae lacinia arcu. Curabitur eget tincidunt nulla, non bibendum metus. Nullam mi ipsum, eleifend vitae tortor pulvinar, facilisis sollicitudin ipsum.Vestibulum molestie risus lorem, at feugiat lorem congue sed. Phasellus ullamcorper laoreet enim, nec aliquam turpis scelerisque et. Etiam dictum metus in elit aliquam dapibus. Vivamus vel lectus velit. Nam sed purus luctus, commodo dui quis, malesuada dui. Nulla porttitor aliquet elit sit amet viverra. Proin tempor nulla urna, non aliquet metus maximus quis. Aliquam ac lectus nec mi aliquam sagittis. Quisque venenatis quam eget nisl tempor, egestas rutrum eros eleifend. Nullam venenatis commodo velit, non tempor mauris fermentum ut. In a metus quis erat cursus sagittis. Donec congue nisl in viverra egestas.Vestibulum facilisis ligula magna, eu ornare lectus varius et. Mauris facilisis faucibus quam, quis mollis eros convallis non. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent sit amet rutrum erat. Suspendisse potenti. Donec lorem mi, sagittis a fringilla sit amet, sagittis bibendum mauris. In in diam et lorem rutrum eleifend a et felis. Sed ac magna quis enim faucibus dictum. Suspendisse blandit enim eu ex laoreet gravida.Suspendisse sed semper felis. Etiam mattis magna mi, suscipit ullamcorper tellus euismod sed. Aenean congue scelerisque ligula id sodales. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nunc sem lectus, gravida ac dui non, pharetra posuere leo. Maecenas lacus libero, facilisis et elit vitae, commodo facilisis sem. Vivamus id nisl nulla. Integer at maximus dui. Ut a tincidunt lorem. Vivamus vitae ligula vel lacus cursus condimentum. Phasellus quis mauris lobortis, finibus lorem in, vulputate ex. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed faucibus aliquam metus, quis varius elit porttitor id. Vivamus dignissim sollicitudin scelerisque. Morbi tincidunt, dolor quis vehicula consequat, dui diam condimentum nunc, vitae scelerisque odio libero nec ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;";

WebServer server(80);

const int led = 13;

void handleRoot() { digitalWrite(led, 1); server.send(200, "text/plain", test); //more than 60kb data digitalWrite(led, 0); }

void handleNotFound() { digitalWrite(led, 1); String message = "File Not Found\n\n"; message += "URI: "; message += server.uri(); message += "\nMethod: "; message += (server.method() == HTTP_GET) ? "GET" : "POST"; message += "\nArguments: "; message += server.args(); message += "\n"; for (uint8_t i = 0; i < server.args(); i++) { message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; } server.send(404, "text/plain", message); digitalWrite(led, 0); }

void setup(void) { pinMode(led, OUTPUT); digitalWrite(led, 0); Serial.begin(115200); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); Serial.println("");

// Wait for connection while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP());

if (MDNS.begin("esp32")) { Serial.println("MDNS responder started"); }

server.on("/", handleRoot);

server.on("/inline", []() { server.send(200, "text/plain", "this works as well"); });

server.onNotFound(handleNotFound);

server.begin(); Serial.println("HTTP server started"); }

void loop(void) { server.handleClient(); delay(2);//allow the cpu to switch to other tasks }

check the output....

SuGlider commented 2 years ago

@asvith - it didn't compile.... I had to change it here:

server.on("/inline", {
server.send(200, "text/plain", "this works as well");
});

I changed it to use an external function:

void handlePlain() {
  server.send(200, "text/plain", "this works as well");
}

...

  server.on("/inline", handlePlain);

Results:

I was able to retrive 68,262 bytes from the WebServer... It worked fine in a ESP32 WROVER board.

guestisp commented 2 years ago

I serve javascript files with esp32 without any issues. Here's some tricks. Use xxd -i <filename> to convert the file into a char array. Add that into your code directly, and then deliver it using send_P. By making it into a const char*, it will be delivered directly from flash and not use up precious RAM (like PROGMEM in esp8266). You can also gzip it first to make the file even smaller (in your code and on the wire). Here's an example:

// Where you define your WebServer config
  server.on("/files/jquery.min.js", []() {
    server.sendHeader("Content-Encoding", "gzip");
    server.send_P(200, "application/javascript", jquery_min_js_gz, jquery_min_js_gz_len); });

// Anywhere in your code
// jquery.js 3.6.0
const unsigned int jquery_min_js_gz_len = 30761;
const char jquery_min_js_gz[] = {
  0x1f, 0x8b, 0x08, 0x08, 0x8c, 0x8f, 0x58, 0x62, 0x02, 0x03, 0x6a, 0x71,
  0x75, 0x65, 0x72, 0x79, 0x2e, 0x6d, 0x69, 0x6e, 0x2e, 0x6a, 0x73, 0x00,
// The other 30k of data...
  0xbb, 0xc5, 0xe5, 0x64, 0xf2, 0xff, 0xfc, 0x1f, 0x84, 0x5b, 0x9a, 0x60,
  0x8f, 0x53, 0x01, 0x00
};

Trying this. Works for small files, but bigger files trigger an net::ERR CONTENT LENGTH MISMATCH error on the browser because the trnasfer is interrupted (i had the same even serving files from SPIFFS).

A workaround for SPIFF was to send chunked data, but how to send chunked data from const char array ?

lbernstone commented 2 years ago

server.send and server.send_P are different functions. send_P requires you to include the string length, because it does not assume you are sending \0x0 terminated strings. send() is not appropriate for binary text, and for long strings like this, I would recommend using send_P and knowing the length of your strings. Here's my example derived from yours. Note that strlen only works for zero terminated strings- you need to know the length of your strings in C code!.

#include <WebServer.h>

const char* test1 = R"literal(
Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Vivamus condimentum sagittis lacus, laoreet luctus ligula laoreet ut. 
Vestibulum ullamcorper accumsan velit vel vehicula. 
Proin tempor lacus arcu. 
Nunc at elit condimentum, semper nisi et, condimentum mi. 
In venenatis blandit nibh at sollicitudin. 
Vestibulum dapibus mauris at orci maximus pellentesque. 
Nullam id elementum ipsum. 
Suspendisse cursus lobortis viverra. 
Proin et erat at mauris tincidunt porttitor vitae ac dui.
... //repeat many times
Donec vulputate lorem tortor, nec fermentum nibh bibendum vel. 
)literal";
const char* test2 = "this is a short test";

WebServer server(80);

void setup(void) {
  Serial.begin(115200);
  WiFi.begin("ssid", "password");
  WiFi.waitForConnectResult();

  Serial.printf("Connected to %s\nIP address: ",ssid);
  Serial.println(WiFi.localIP());
  Serial.printf("test data is %d bytes\n", strlen(test1));
  server.on("/", [](){server.send_P(200, "text/plain", test1, strlen(test1));});
  server.on("/test2", [](){server.send(200, "text/plain", test2);});
  server.onNotFound([](){server.send(404,"text/plain", "File not found");});
  server.begin();
}

void loop(void) {
  server.handleClient();
  delay(150);//allow the cpu to switch to other tasks
}

output:
07:30:41.397 -> Connected to TP-Link_1404
07:30:41.397 -> IP address: 192.168.0.120
07:30:41.397 -> test data is 80065 bytes

lbernstone@ideapad:/~$ curl http://192.168.0.120/ | wc -c
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 80065  100 80065    0     0  27164      0  0:00:02  0:00:02 --:--:-- 27168
80065
lbernstone commented 2 years ago

@SuGlider Note, this is a bug in WebServer::send(). It should at least give some error as to why it is failing. I'm taking a look.

lbernstone commented 2 years ago

Heh. https://github.com/espressif/arduino-esp32/blob/master/libraries/WebServer/src/WebServer.cpp#L430-L432 I'll submit a PR with a warning there. I think an empty response is still the right behavior, but at least you will know why :smile: