diff --git a/CHANGELOG.md b/CHANGELOG.md index c76418e45..f9ba8da18 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -134,7 +134,7 @@ Version 3.x is JDK17 LTS bytecode compatible, with Docker and JUnit / direct Jav * Version updates * TBD -## 3.7.3 - PLANNED +## 3.7.3 3.x is JDK17 LTS bytecode compatible, with Docker and JUnit / direct Java integration. * Features and fixes diff --git a/integration-tests/src/test/resources/sampleFile_large.txt b/integration-tests/src/test/resources/sampleFile_large.txt index 7becd3c05..a09c7a6de 100644 --- a/integration-tests/src/test/resources/sampleFile_large.txt +++ b/integration-tests/src/test/resources/sampleFile_large.txt @@ -40,3 +40,132 @@ Nullam ac tortor vitae purus. Ut sem nulla pharetra diam sit amet nisl suscipit Convallis a cras semper auctor neque vitae tempus quam. Consequat ac felis donec et odio pellentesque diam. Penatibus et magnis dis parturient montes nascetur. Vitae purus faucibus ornare suspendisse sed nisi. Nibh venenatis cras sed felis eget velit. Cursus vitae congue mauris rhoncus aenean vel elit. Elit at imperdiet dui accumsan sit amet. Ultrices eros in cursus turpis massa tincidunt. Molestie nunc non blandit massa. Ridiculus mus mauris vitae ultricies leo integer. Cras fermentum odio eu feugiat pretium nibh. Nulla facilisi etiam dignissim diam. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat est. Non quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Magna sit amet purus gravida quis blandit turpis cursus in. Non sodales neque sodales ut etiam sit amet. Morbi quis commodo odio aenean sed adipiscing diam. Ullamcorper velit sed ullamcorper morbi. Ipsum consequat nisl vel pretium. demo=content + +## sample test file ## +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. A scelerisque purus semper eget duis at tellus at. Tellus integer feugiat scelerisque varius morbi. Lacus laoreet non curabitur gravida arcu ac tortor. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Ut enim blandit volutpat maecenas. Ipsum dolor sit amet consectetur adipiscing elit. Id ornare arcu odio ut. Convallis tellus id interdum velit laoreet id. Enim ut tellus elementum sagittis vitae et leo duis ut. Eros in cursus turpis massa tincidunt dui ut. In massa tempor nec feugiat nisl pretium fusce id velit. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Eget nunc lobortis mattis aliquam faucibus purus in massa. Vitae suscipit tellus mauris a. Gravida quis blandit turpis cursus in hac. Amet dictum sit amet justo donec enim diam vulputate. Imperdiet massa tincidunt nunc pulvinar sapien et. + +Lacus sed viverra tellus in hac habitasse platea. Donec et odio pellentesque diam volutpat commodo sed egestas. Eget arcu dictum varius duis at consectetur. Arcu felis bibendum ut tristique et egestas. Tellus molestie nunc non blandit massa enim. Risus viverra adipiscing at in tellus integer feugiat scelerisque varius. Risus nec feugiat in fermentum posuere. Cursus sit amet dictum sit amet justo donec enim. Sem integer vitae justo eget magna fermentum iaculis eu. Feugiat vivamus at augue eget arcu dictum. Netus et malesuada fames ac turpis egestas. Aliquam ultrices sagittis orci a scelerisque purus semper. Duis at tellus at urna condimentum. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Volutpat consequat mauris nunc congue nisi vitae suscipit. Sem integer vitae justo eget magna fermentum iaculis eu non. Sagittis purus sit amet volutpat consequat mauris nunc congue. + +Id diam vel quam elementum pulvinar etiam non quam. Eget aliquet nibh praesent tristique magna sit amet purus. Sed euismod nisi porta lorem mollis aliquam ut porttitor. Urna neque viverra justo nec ultrices dui sapien eget mi. Aliquet eget sit amet tellus cras. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Faucibus et molestie ac feugiat sed lectus vestibulum. Semper eget duis at tellus at. Congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Congue nisi vitae suscipit tellus mauris a diam maecenas sed. Purus gravida quis blandit turpis cursus in. Risus nec feugiat in fermentum posuere urna nec tincidunt praesent. Enim eu turpis egestas pretium aenean pharetra magna. Duis convallis convallis tellus id interdum velit laoreet id. + +Eu consequat ac felis donec et odio pellentesque diam volutpat. Cursus eget nunc scelerisque viverra mauris in aliquam sem fringilla. Vitae turpis massa sed elementum tempus egestas sed sed. Ultrices in iaculis nunc sed augue lacus viverra vitae congue. Mauris pellentesque pulvinar pellentesque habitant morbi. Ullamcorper velit sed ullamcorper morbi tincidunt ornare. Sodales ut etiam sit amet nisl purus in mollis nunc. Arcu odio ut sem nulla pharetra diam. Id aliquet risus feugiat in ante. Nibh praesent tristique magna sit amet purus gravida. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis feugiat. + +Arcu vitae elementum curabitur vitae nunc. Et malesuada fames ac turpis egestas integer eget aliquet nibh. Cursus turpis massa tincidunt dui ut ornare lectus. Nulla posuere sollicitudin aliquam ultrices. Nibh praesent tristique magna sit amet. Arcu non sodales neque sodales ut etiam sit amet. Faucibus in ornare quam viverra orci sagittis eu volutpat odio. Eget mi proin sed libero enim sed. Suspendisse faucibus interdum posuere lorem. Congue quisque egestas diam in arcu. Vitae nunc sed velit dignissim. In mollis nunc sed id semper risus in hendrerit. Dictum at tempor commodo ullamcorper a lacus vestibulum. Volutpat lacus laoreet non curabitur gravida arcu ac tortor. Odio ut enim blandit volutpat maecenas. Eget sit amet tellus cras adipiscing enim eu turpis. + +Suspendisse interdum consectetur libero id faucibus nisl tincidunt eget nullam. Eget gravida cum sociis natoque penatibus et magnis. Praesent tristique magna sit amet purus gravida. Fringilla ut morbi tincidunt augue interdum velit euismod in pellentesque. Ipsum dolor sit amet consectetur adipiscing elit pellentesque habitant. Cum sociis natoque penatibus et magnis dis parturient. Sagittis orci a scelerisque purus. Arcu dui vivamus arcu felis bibendum ut. Nisl condimentum id venenatis a condimentum vitae sapien pellentesque habitant. Dolor magna eget est lorem ipsum dolor sit amet consectetur. Suspendisse ultrices gravida dictum fusce. Nec feugiat nisl pretium fusce id. Sit amet commodo nulla facilisi nullam vehicula ipsum. At imperdiet dui accumsan sit. Metus vulputate eu scelerisque felis imperdiet. + +Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper. Id semper risus in hendrerit gravida. Libero nunc consequat interdum varius sit amet mattis. Dui sapien eget mi proin sed libero. Integer feugiat scelerisque varius morbi enim nunc faucibus. At ultrices mi tempus imperdiet nulla malesuada pellentesque. Condimentum id venenatis a condimentum. Sit amet nulla facilisi morbi tempus. Sed sed risus pretium quam vulputate dignissim suspendisse in est. Nisl nunc mi ipsum faucibus vitae aliquet. Lorem ipsum dolor sit amet. Pharetra magna ac placerat vestibulum lectus. Semper risus in hendrerit gravida rutrum quisque non tellus orci. Pellentesque adipiscing commodo elit at imperdiet dui. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. Ac tincidunt vitae semper quis lectus nulla. + +Sit amet venenatis urna cursus eget nunc scelerisque viverra. Leo duis ut diam quam nulla. In ante metus dictum at tempor commodo ullamcorper a lacus. Faucibus vitae aliquet nec ullamcorper sit. Maecenas ultricies mi eget mauris pharetra et ultrices neque. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed risus ultricies tristique nulla aliquet enim tortor at. Cursus risus at ultrices mi tempus imperdiet nulla malesuada. Cras pulvinar mattis nunc sed. Lectus nulla at volutpat diam ut venenatis tellus in metus. Odio pellentesque diam volutpat commodo sed egestas egestas. Tempus urna et pharetra pharetra massa massa ultricies. Nec sagittis aliquam malesuada bibendum. Dui nunc mattis enim ut. Venenatis cras sed felis eget velit aliquet sagittis. Commodo elit at imperdiet dui accumsan sit amet nulla. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Tempus imperdiet nulla malesuada pellentesque elit. + +Diam in arcu cursus euismod. Placerat duis ultricies lacus sed turpis. Lorem ipsum dolor sit amet. Non arcu risus quis varius. Morbi quis commodo odio aenean sed adipiscing. Fusce ut placerat orci nulla pellentesque dignissim enim. Aenean sed adipiscing diam donec adipiscing. Porta non pulvinar neque laoreet suspendisse. Dui accumsan sit amet nulla. Ultrices dui sapien eget mi proin. Nisl suscipit adipiscing bibendum est ultricies integer. + +Vitae tempus quam pellentesque nec nam aliquam sem et. Cum sociis natoque penatibus et. Nisl condimentum id venenatis a. Libero justo laoreet sit amet cursus sit amet. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Nisi vitae suscipit tellus mauris a. Nec ultrices dui sapien eget. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Diam ut venenatis tellus in. Enim ut sem viverra aliquet eget sit amet tellus. Donec et odio pellentesque diam volutpat commodo. Sapien faucibus et molestie ac feugiat sed. Amet mattis vulputate enim nulla aliquet porttitor lacus. Enim nunc faucibus a pellentesque. + +At elementum eu facilisis sed odio morbi. Nisl rhoncus mattis rhoncus urna neque viverra justo. Lacus laoreet non curabitur gravida. Libero id faucibus nisl tincidunt eget nullam non nisi est. Aliquet risus feugiat in ante metus dictum at tempor. Montes nascetur ridiculus mus mauris vitae ultricies leo integer malesuada. Imperdiet nulla malesuada pellentesque elit eget. Tempus urna et pharetra pharetra. Nunc sed augue lacus viverra vitae congue. Viverra adipiscing at in tellus integer. Volutpat sed cras ornare arcu. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Turpis egestas maecenas pharetra convallis posuere morbi. + +Purus sit amet luctus venenatis lectus magna fringilla urna porttitor. Tellus in metus vulputate eu scelerisque felis imperdiet proin. Nibh ipsum consequat nisl vel pretium lectus quam. Metus dictum at tempor commodo. Ut tristique et egestas quis ipsum suspendisse ultrices gravida. Est ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Rutrum tellus pellentesque eu tincidunt tortor. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor. Sed libero enim sed faucibus turpis in eu. Pellentesque massa placerat duis ultricies. Ut venenatis tellus in metus vulputate. Urna duis convallis convallis tellus id interdum. Lectus sit amet est placerat in. Sem fringilla ut morbi tincidunt augue interdum velit euismod in. Velit dignissim sodales ut eu. Sit amet massa vitae tortor. Dignissim sodales ut eu sem integer vitae. + +Condimentum mattis pellentesque id nibh tortor id aliquet lectus proin. Amet venenatis urna cursus eget nunc scelerisque viverra. Quam elementum pulvinar etiam non quam lacus suspendisse. Aenean sed adipiscing diam donec adipiscing. Nibh cras pulvinar mattis nunc sed blandit libero. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor elit. Sit amet aliquam id diam maecenas ultricies mi eget mauris. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Quis ipsum suspendisse ultrices gravida dictum. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc. Semper viverra nam libero justo laoreet sit amet. Molestie a iaculis at erat pellentesque adipiscing commodo. Condimentum lacinia quis vel eros. Proin libero nunc consequat interdum varius sit. Eu volutpat odio facilisis mauris sit amet massa. Porttitor rhoncus dolor purus non enim praesent. Augue interdum velit euismod in pellentesque massa. + +Vitae nunc sed velit dignissim sodales ut eu. Sit amet facilisis magna etiam tempor. Cursus euismod quis viverra nibh. Neque volutpat ac tincidunt vitae semper quis lectus nulla at. Eu facilisis sed odio morbi quis commodo odio aenean. Sollicitudin nibh sit amet commodo nulla facilisi. Tincidunt lobortis feugiat vivamus at augue eget arcu dictum. Ipsum dolor sit amet consectetur. Sed risus pretium quam vulputate dignissim suspendisse in est ante. Feugiat nibh sed pulvinar proin. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. Varius quam quisque id diam vel quam elementum pulvinar. Enim sit amet venenatis urna cursus eget. Posuere urna nec tincidunt praesent semper. Facilisi nullam vehicula ipsum a arcu cursus vitae congue mauris. + +Et magnis dis parturient montes nascetur ridiculus mus mauris. Interdum varius sit amet mattis vulputate. Velit scelerisque in dictum non consectetur a. Ultrices vitae auctor eu augue ut. Donec ultrices tincidunt arcu non sodales neque. Enim praesent elementum facilisis leo vel fringilla est. Et magnis dis parturient montes nascetur ridiculus mus mauris. Tincidunt praesent semper feugiat nibh sed. Nulla pellentesque dignissim enim sit amet venenatis urna. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Imperdiet dui accumsan sit amet. Eget nulla facilisi etiam dignissim diam. Tempor orci eu lobortis elementum nibh tellus molestie. Eget nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. A cras semper auctor neque vitae tempus quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Quisque sagittis purus sit amet. In tellus integer feugiat scelerisque varius. Amet facilisis magna etiam tempor orci eu. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Ipsum dolor sit amet consectetur adipiscing elit pellentesque. Id venenatis a condimentum vitae sapien pellentesque habitant morbi. Vitae tempus quam pellentesque nec nam aliquam. Senectus et netus et malesuada fames. Pretium quam vulputate dignissim suspendisse in est ante in nibh. In iaculis nunc sed augue lacus viverra vitae congue eu. Rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt. Senectus et netus et malesuada fames ac turpis egestas. + +Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Ultrices sagittis orci a scelerisque purus semper. Aliquam purus sit amet luctus venenatis lectus magna fringilla urna. Duis convallis convallis tellus id interdum velit laoreet id. Diam vulputate ut pharetra sit amet aliquam id diam. Ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Ac feugiat sed lectus vestibulum mattis ullamcorper. Faucibus purus in massa tempor nec feugiat nisl pretium fusce. Cras ornare arcu dui vivamus arcu. Tempor orci eu lobortis elementum nibh tellus molestie nunc. Mi proin sed libero enim sed faucibus turpis. Elit duis tristique sollicitudin nibh sit. Sed adipiscing diam donec adipiscing tristique risus nec feugiat. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Mauris vitae ultricies leo integer. Consectetur lorem donec massa sapien faucibus. Lectus arcu bibendum at varius. + +Non quam lacus suspendisse faucibus. Morbi tincidunt ornare massa eget egestas purus viverra accumsan. Lorem sed risus ultricies tristique nulla aliquet. Tortor condimentum lacinia quis vel. Phasellus faucibus scelerisque eleifend donec pretium. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus est. Fermentum iaculis eu non diam phasellus vestibulum lorem sed. In cursus turpis massa tincidunt dui. Cum sociis natoque penatibus et. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Duis at consectetur lorem donec. Volutpat blandit aliquam etiam erat velit scelerisque. Elit duis tristique sollicitudin nibh sit amet. Quis viverra nibh cras pulvinar mattis nunc. Sapien pellentesque habitant morbi tristique senectus et netus et malesuada. Nibh cras pulvinar mattis nunc. Eleifend donec pretium vulputate sapien nec sagittis. + +Nullam ac tortor vitae purus. Ut sem nulla pharetra diam sit amet nisl suscipit adipiscing. Amet facilisis magna etiam tempor. Vitae nunc sed velit dignissim sodales ut eu sem integer. Sem fringilla ut morbi tincidunt augue interdum velit euismod. Morbi non arcu risus quis. Ut sem nulla pharetra diam. Est velit egestas dui id. Sed felis eget velit aliquet sagittis id consectetur purus ut. Sollicitudin aliquam ultrices sagittis orci a scelerisque. Scelerisque purus semper eget duis at tellus at urna. Ac placerat vestibulum lectus mauris ultrices eros in. Pulvinar pellentesque habitant morbi tristique senectus. + +Convallis a cras semper auctor neque vitae tempus quam. Consequat ac felis donec et odio pellentesque diam. Penatibus et magnis dis parturient montes nascetur. Vitae purus faucibus ornare suspendisse sed nisi. Nibh venenatis cras sed felis eget velit. Cursus vitae congue mauris rhoncus aenean vel elit. Elit at imperdiet dui accumsan sit amet. Ultrices eros in cursus turpis massa tincidunt. Molestie nunc non blandit massa. Ridiculus mus mauris vitae ultricies leo integer. Cras fermentum odio eu feugiat pretium nibh. Nulla facilisi etiam dignissim diam. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat est. Non quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Magna sit amet purus gravida quis blandit turpis cursus in. Non sodales neque sodales ut etiam sit amet. Morbi quis commodo odio aenean sed adipiscing diam. Ullamcorper velit sed ullamcorper morbi. Ipsum consequat nisl vel pretium. + +demo=content + +## sample test file ## +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. A scelerisque purus semper eget duis at tellus at. Tellus integer feugiat scelerisque varius morbi. Lacus laoreet non curabitur gravida arcu ac tortor. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Ut enim blandit volutpat maecenas. Ipsum dolor sit amet consectetur adipiscing elit. Id ornare arcu odio ut. Convallis tellus id interdum velit laoreet id. Enim ut tellus elementum sagittis vitae et leo duis ut. Eros in cursus turpis massa tincidunt dui ut. In massa tempor nec feugiat nisl pretium fusce id velit. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Eget nunc lobortis mattis aliquam faucibus purus in massa. Vitae suscipit tellus mauris a. Gravida quis blandit turpis cursus in hac. Amet dictum sit amet justo donec enim diam vulputate. Imperdiet massa tincidunt nunc pulvinar sapien et. + +Lacus sed viverra tellus in hac habitasse platea. Donec et odio pellentesque diam volutpat commodo sed egestas. Eget arcu dictum varius duis at consectetur. Arcu felis bibendum ut tristique et egestas. Tellus molestie nunc non blandit massa enim. Risus viverra adipiscing at in tellus integer feugiat scelerisque varius. Risus nec feugiat in fermentum posuere. Cursus sit amet dictum sit amet justo donec enim. Sem integer vitae justo eget magna fermentum iaculis eu. Feugiat vivamus at augue eget arcu dictum. Netus et malesuada fames ac turpis egestas. Aliquam ultrices sagittis orci a scelerisque purus semper. Duis at tellus at urna condimentum. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Volutpat consequat mauris nunc congue nisi vitae suscipit. Sem integer vitae justo eget magna fermentum iaculis eu non. Sagittis purus sit amet volutpat consequat mauris nunc congue. + +Id diam vel quam elementum pulvinar etiam non quam. Eget aliquet nibh praesent tristique magna sit amet purus. Sed euismod nisi porta lorem mollis aliquam ut porttitor. Urna neque viverra justo nec ultrices dui sapien eget mi. Aliquet eget sit amet tellus cras. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Faucibus et molestie ac feugiat sed lectus vestibulum. Semper eget duis at tellus at. Congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Congue nisi vitae suscipit tellus mauris a diam maecenas sed. Purus gravida quis blandit turpis cursus in. Risus nec feugiat in fermentum posuere urna nec tincidunt praesent. Enim eu turpis egestas pretium aenean pharetra magna. Duis convallis convallis tellus id interdum velit laoreet id. + +Eu consequat ac felis donec et odio pellentesque diam volutpat. Cursus eget nunc scelerisque viverra mauris in aliquam sem fringilla. Vitae turpis massa sed elementum tempus egestas sed sed. Ultrices in iaculis nunc sed augue lacus viverra vitae congue. Mauris pellentesque pulvinar pellentesque habitant morbi. Ullamcorper velit sed ullamcorper morbi tincidunt ornare. Sodales ut etiam sit amet nisl purus in mollis nunc. Arcu odio ut sem nulla pharetra diam. Id aliquet risus feugiat in ante. Nibh praesent tristique magna sit amet purus gravida. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis feugiat. + +Arcu vitae elementum curabitur vitae nunc. Et malesuada fames ac turpis egestas integer eget aliquet nibh. Cursus turpis massa tincidunt dui ut ornare lectus. Nulla posuere sollicitudin aliquam ultrices. Nibh praesent tristique magna sit amet. Arcu non sodales neque sodales ut etiam sit amet. Faucibus in ornare quam viverra orci sagittis eu volutpat odio. Eget mi proin sed libero enim sed. Suspendisse faucibus interdum posuere lorem. Congue quisque egestas diam in arcu. Vitae nunc sed velit dignissim. In mollis nunc sed id semper risus in hendrerit. Dictum at tempor commodo ullamcorper a lacus vestibulum. Volutpat lacus laoreet non curabitur gravida arcu ac tortor. Odio ut enim blandit volutpat maecenas. Eget sit amet tellus cras adipiscing enim eu turpis. + +Suspendisse interdum consectetur libero id faucibus nisl tincidunt eget nullam. Eget gravida cum sociis natoque penatibus et magnis. Praesent tristique magna sit amet purus gravida. Fringilla ut morbi tincidunt augue interdum velit euismod in pellentesque. Ipsum dolor sit amet consectetur adipiscing elit pellentesque habitant. Cum sociis natoque penatibus et magnis dis parturient. Sagittis orci a scelerisque purus. Arcu dui vivamus arcu felis bibendum ut. Nisl condimentum id venenatis a condimentum vitae sapien pellentesque habitant. Dolor magna eget est lorem ipsum dolor sit amet consectetur. Suspendisse ultrices gravida dictum fusce. Nec feugiat nisl pretium fusce id. Sit amet commodo nulla facilisi nullam vehicula ipsum. At imperdiet dui accumsan sit. Metus vulputate eu scelerisque felis imperdiet. + +Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper. Id semper risus in hendrerit gravida. Libero nunc consequat interdum varius sit amet mattis. Dui sapien eget mi proin sed libero. Integer feugiat scelerisque varius morbi enim nunc faucibus. At ultrices mi tempus imperdiet nulla malesuada pellentesque. Condimentum id venenatis a condimentum. Sit amet nulla facilisi morbi tempus. Sed sed risus pretium quam vulputate dignissim suspendisse in est. Nisl nunc mi ipsum faucibus vitae aliquet. Lorem ipsum dolor sit amet. Pharetra magna ac placerat vestibulum lectus. Semper risus in hendrerit gravida rutrum quisque non tellus orci. Pellentesque adipiscing commodo elit at imperdiet dui. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. Ac tincidunt vitae semper quis lectus nulla. + +Sit amet venenatis urna cursus eget nunc scelerisque viverra. Leo duis ut diam quam nulla. In ante metus dictum at tempor commodo ullamcorper a lacus. Faucibus vitae aliquet nec ullamcorper sit. Maecenas ultricies mi eget mauris pharetra et ultrices neque. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed risus ultricies tristique nulla aliquet enim tortor at. Cursus risus at ultrices mi tempus imperdiet nulla malesuada. Cras pulvinar mattis nunc sed. Lectus nulla at volutpat diam ut venenatis tellus in metus. Odio pellentesque diam volutpat commodo sed egestas egestas. Tempus urna et pharetra pharetra massa massa ultricies. Nec sagittis aliquam malesuada bibendum. Dui nunc mattis enim ut. Venenatis cras sed felis eget velit aliquet sagittis. Commodo elit at imperdiet dui accumsan sit amet nulla. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Tempus imperdiet nulla malesuada pellentesque elit. + +Diam in arcu cursus euismod. Placerat duis ultricies lacus sed turpis. Lorem ipsum dolor sit amet. Non arcu risus quis varius. Morbi quis commodo odio aenean sed adipiscing. Fusce ut placerat orci nulla pellentesque dignissim enim. Aenean sed adipiscing diam donec adipiscing. Porta non pulvinar neque laoreet suspendisse. Dui accumsan sit amet nulla. Ultrices dui sapien eget mi proin. Nisl suscipit adipiscing bibendum est ultricies integer. + +Vitae tempus quam pellentesque nec nam aliquam sem et. Cum sociis natoque penatibus et. Nisl condimentum id venenatis a. Libero justo laoreet sit amet cursus sit amet. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Nisi vitae suscipit tellus mauris a. Nec ultrices dui sapien eget. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Diam ut venenatis tellus in. Enim ut sem viverra aliquet eget sit amet tellus. Donec et odio pellentesque diam volutpat commodo. Sapien faucibus et molestie ac feugiat sed. Amet mattis vulputate enim nulla aliquet porttitor lacus. Enim nunc faucibus a pellentesque. + +At elementum eu facilisis sed odio morbi. Nisl rhoncus mattis rhoncus urna neque viverra justo. Lacus laoreet non curabitur gravida. Libero id faucibus nisl tincidunt eget nullam non nisi est. Aliquet risus feugiat in ante metus dictum at tempor. Montes nascetur ridiculus mus mauris vitae ultricies leo integer malesuada. Imperdiet nulla malesuada pellentesque elit eget. Tempus urna et pharetra pharetra. Nunc sed augue lacus viverra vitae congue. Viverra adipiscing at in tellus integer. Volutpat sed cras ornare arcu. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Turpis egestas maecenas pharetra convallis posuere morbi. + +Purus sit amet luctus venenatis lectus magna fringilla urna porttitor. Tellus in metus vulputate eu scelerisque felis imperdiet proin. Nibh ipsum consequat nisl vel pretium lectus quam. Metus dictum at tempor commodo. Ut tristique et egestas quis ipsum suspendisse ultrices gravida. Est ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Rutrum tellus pellentesque eu tincidunt tortor. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor. Sed libero enim sed faucibus turpis in eu. Pellentesque massa placerat duis ultricies. Ut venenatis tellus in metus vulputate. Urna duis convallis convallis tellus id interdum. Lectus sit amet est placerat in. Sem fringilla ut morbi tincidunt augue interdum velit euismod in. Velit dignissim sodales ut eu. Sit amet massa vitae tortor. Dignissim sodales ut eu sem integer vitae. + +Condimentum mattis pellentesque id nibh tortor id aliquet lectus proin. Amet venenatis urna cursus eget nunc scelerisque viverra. Quam elementum pulvinar etiam non quam lacus suspendisse. Aenean sed adipiscing diam donec adipiscing. Nibh cras pulvinar mattis nunc sed blandit libero. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor elit. Sit amet aliquam id diam maecenas ultricies mi eget mauris. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Quis ipsum suspendisse ultrices gravida dictum. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc. Semper viverra nam libero justo laoreet sit amet. Molestie a iaculis at erat pellentesque adipiscing commodo. Condimentum lacinia quis vel eros. Proin libero nunc consequat interdum varius sit. Eu volutpat odio facilisis mauris sit amet massa. Porttitor rhoncus dolor purus non enim praesent. Augue interdum velit euismod in pellentesque massa. + +Vitae nunc sed velit dignissim sodales ut eu. Sit amet facilisis magna etiam tempor. Cursus euismod quis viverra nibh. Neque volutpat ac tincidunt vitae semper quis lectus nulla at. Eu facilisis sed odio morbi quis commodo odio aenean. Sollicitudin nibh sit amet commodo nulla facilisi. Tincidunt lobortis feugiat vivamus at augue eget arcu dictum. Ipsum dolor sit amet consectetur. Sed risus pretium quam vulputate dignissim suspendisse in est ante. Feugiat nibh sed pulvinar proin. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. Varius quam quisque id diam vel quam elementum pulvinar. Enim sit amet venenatis urna cursus eget. Posuere urna nec tincidunt praesent semper. Facilisi nullam vehicula ipsum a arcu cursus vitae congue mauris. + +Et magnis dis parturient montes nascetur ridiculus mus mauris. Interdum varius sit amet mattis vulputate. Velit scelerisque in dictum non consectetur a. Ultrices vitae auctor eu augue ut. Donec ultrices tincidunt arcu non sodales neque. Enim praesent elementum facilisis leo vel fringilla est. Et magnis dis parturient montes nascetur ridiculus mus mauris. Tincidunt praesent semper feugiat nibh sed. Nulla pellentesque dignissim enim sit amet venenatis urna. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Imperdiet dui accumsan sit amet. Eget nulla facilisi etiam dignissim diam. Tempor orci eu lobortis elementum nibh tellus molestie. Eget nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. A cras semper auctor neque vitae tempus quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Quisque sagittis purus sit amet. In tellus integer feugiat scelerisque varius. Amet facilisis magna etiam tempor orci eu. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Ipsum dolor sit amet consectetur adipiscing elit pellentesque. Id venenatis a condimentum vitae sapien pellentesque habitant morbi. Vitae tempus quam pellentesque nec nam aliquam. Senectus et netus et malesuada fames. Pretium quam vulputate dignissim suspendisse in est ante in nibh. In iaculis nunc sed augue lacus viverra vitae congue eu. Rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt. Senectus et netus et malesuada fames ac turpis egestas. + +Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Ultrices sagittis orci a scelerisque purus semper. Aliquam purus sit amet luctus venenatis lectus magna fringilla urna. Duis convallis convallis tellus id interdum velit laoreet id. Diam vulputate ut pharetra sit amet aliquam id diam. Ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Ac feugiat sed lectus vestibulum mattis ullamcorper. Faucibus purus in massa tempor nec feugiat nisl pretium fusce. Cras ornare arcu dui vivamus arcu. Tempor orci eu lobortis elementum nibh tellus molestie nunc. Mi proin sed libero enim sed faucibus turpis. Elit duis tristique sollicitudin nibh sit. Sed adipiscing diam donec adipiscing tristique risus nec feugiat. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Mauris vitae ultricies leo integer. Consectetur lorem donec massa sapien faucibus. Lectus arcu bibendum at varius. + +Non quam lacus suspendisse faucibus. Morbi tincidunt ornare massa eget egestas purus viverra accumsan. Lorem sed risus ultricies tristique nulla aliquet. Tortor condimentum lacinia quis vel. Phasellus faucibus scelerisque eleifend donec pretium. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus est. Fermentum iaculis eu non diam phasellus vestibulum lorem sed. In cursus turpis massa tincidunt dui. Cum sociis natoque penatibus et. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Duis at consectetur lorem donec. Volutpat blandit aliquam etiam erat velit scelerisque. Elit duis tristique sollicitudin nibh sit amet. Quis viverra nibh cras pulvinar mattis nunc. Sapien pellentesque habitant morbi tristique senectus et netus et malesuada. Nibh cras pulvinar mattis nunc. Eleifend donec pretium vulputate sapien nec sagittis. + +Nullam ac tortor vitae purus. Ut sem nulla pharetra diam sit amet nisl suscipit adipiscing. Amet facilisis magna etiam tempor. Vitae nunc sed velit dignissim sodales ut eu sem integer. Sem fringilla ut morbi tincidunt augue interdum velit euismod. Morbi non arcu risus quis. Ut sem nulla pharetra diam. Est velit egestas dui id. Sed felis eget velit aliquet sagittis id consectetur purus ut. Sollicitudin aliquam ultrices sagittis orci a scelerisque. Scelerisque purus semper eget duis at tellus at urna. Ac placerat vestibulum lectus mauris ultrices eros in. Pulvinar pellentesque habitant morbi tristique senectus. + +Convallis a cras semper auctor neque vitae tempus quam. Consequat ac felis donec et odio pellentesque diam. Penatibus et magnis dis parturient montes nascetur. Vitae purus faucibus ornare suspendisse sed nisi. Nibh venenatis cras sed felis eget velit. Cursus vitae congue mauris rhoncus aenean vel elit. Elit at imperdiet dui accumsan sit amet. Ultrices eros in cursus turpis massa tincidunt. Molestie nunc non blandit massa. Ridiculus mus mauris vitae ultricies leo integer. Cras fermentum odio eu feugiat pretium nibh. Nulla facilisi etiam dignissim diam. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat est. Non quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Magna sit amet purus gravida quis blandit turpis cursus in. Non sodales neque sodales ut etiam sit amet. Morbi quis commodo odio aenean sed adipiscing diam. Ullamcorper velit sed ullamcorper morbi. Ipsum consequat nisl vel pretium. + +demo=content + +## sample test file ## +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. A scelerisque purus semper eget duis at tellus at. Tellus integer feugiat scelerisque varius morbi. Lacus laoreet non curabitur gravida arcu ac tortor. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Ut enim blandit volutpat maecenas. Ipsum dolor sit amet consectetur adipiscing elit. Id ornare arcu odio ut. Convallis tellus id interdum velit laoreet id. Enim ut tellus elementum sagittis vitae et leo duis ut. Eros in cursus turpis massa tincidunt dui ut. In massa tempor nec feugiat nisl pretium fusce id velit. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Eget nunc lobortis mattis aliquam faucibus purus in massa. Vitae suscipit tellus mauris a. Gravida quis blandit turpis cursus in hac. Amet dictum sit amet justo donec enim diam vulputate. Imperdiet massa tincidunt nunc pulvinar sapien et. + +Lacus sed viverra tellus in hac habitasse platea. Donec et odio pellentesque diam volutpat commodo sed egestas. Eget arcu dictum varius duis at consectetur. Arcu felis bibendum ut tristique et egestas. Tellus molestie nunc non blandit massa enim. Risus viverra adipiscing at in tellus integer feugiat scelerisque varius. Risus nec feugiat in fermentum posuere. Cursus sit amet dictum sit amet justo donec enim. Sem integer vitae justo eget magna fermentum iaculis eu. Feugiat vivamus at augue eget arcu dictum. Netus et malesuada fames ac turpis egestas. Aliquam ultrices sagittis orci a scelerisque purus semper. Duis at tellus at urna condimentum. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Volutpat consequat mauris nunc congue nisi vitae suscipit. Sem integer vitae justo eget magna fermentum iaculis eu non. Sagittis purus sit amet volutpat consequat mauris nunc congue. + +Id diam vel quam elementum pulvinar etiam non quam. Eget aliquet nibh praesent tristique magna sit amet purus. Sed euismod nisi porta lorem mollis aliquam ut porttitor. Urna neque viverra justo nec ultrices dui sapien eget mi. Aliquet eget sit amet tellus cras. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Faucibus et molestie ac feugiat sed lectus vestibulum. Semper eget duis at tellus at. Congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Congue nisi vitae suscipit tellus mauris a diam maecenas sed. Purus gravida quis blandit turpis cursus in. Risus nec feugiat in fermentum posuere urna nec tincidunt praesent. Enim eu turpis egestas pretium aenean pharetra magna. Duis convallis convallis tellus id interdum velit laoreet id. + +Eu consequat ac felis donec et odio pellentesque diam volutpat. Cursus eget nunc scelerisque viverra mauris in aliquam sem fringilla. Vitae turpis massa sed elementum tempus egestas sed sed. Ultrices in iaculis nunc sed augue lacus viverra vitae congue. Mauris pellentesque pulvinar pellentesque habitant morbi. Ullamcorper velit sed ullamcorper morbi tincidunt ornare. Sodales ut etiam sit amet nisl purus in mollis nunc. Arcu odio ut sem nulla pharetra diam. Id aliquet risus feugiat in ante. Nibh praesent tristique magna sit amet purus gravida. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis feugiat. + +Arcu vitae elementum curabitur vitae nunc. Et malesuada fames ac turpis egestas integer eget aliquet nibh. Cursus turpis massa tincidunt dui ut ornare lectus. Nulla posuere sollicitudin aliquam ultrices. Nibh praesent tristique magna sit amet. Arcu non sodales neque sodales ut etiam sit amet. Faucibus in ornare quam viverra orci sagittis eu volutpat odio. Eget mi proin sed libero enim sed. Suspendisse faucibus interdum posuere lorem. Congue quisque egestas diam in arcu. Vitae nunc sed velit dignissim. In mollis nunc sed id semper risus in hendrerit. Dictum at tempor commodo ullamcorper a lacus vestibulum. Volutpat lacus laoreet non curabitur gravida arcu ac tortor. Odio ut enim blandit volutpat maecenas. Eget sit amet tellus cras adipiscing enim eu turpis. + +Suspendisse interdum consectetur libero id faucibus nisl tincidunt eget nullam. Eget gravida cum sociis natoque penatibus et magnis. Praesent tristique magna sit amet purus gravida. Fringilla ut morbi tincidunt augue interdum velit euismod in pellentesque. Ipsum dolor sit amet consectetur adipiscing elit pellentesque habitant. Cum sociis natoque penatibus et magnis dis parturient. Sagittis orci a scelerisque purus. Arcu dui vivamus arcu felis bibendum ut. Nisl condimentum id venenatis a condimentum vitae sapien pellentesque habitant. Dolor magna eget est lorem ipsum dolor sit amet consectetur. Suspendisse ultrices gravida dictum fusce. Nec feugiat nisl pretium fusce id. Sit amet commodo nulla facilisi nullam vehicula ipsum. At imperdiet dui accumsan sit. Metus vulputate eu scelerisque felis imperdiet. + +Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper. Id semper risus in hendrerit gravida. Libero nunc consequat interdum varius sit amet mattis. Dui sapien eget mi proin sed libero. Integer feugiat scelerisque varius morbi enim nunc faucibus. At ultrices mi tempus imperdiet nulla malesuada pellentesque. Condimentum id venenatis a condimentum. Sit amet nulla facilisi morbi tempus. Sed sed risus pretium quam vulputate dignissim suspendisse in est. Nisl nunc mi ipsum faucibus vitae aliquet. Lorem ipsum dolor sit amet. Pharetra magna ac placerat vestibulum lectus. Semper risus in hendrerit gravida rutrum quisque non tellus orci. Pellentesque adipiscing commodo elit at imperdiet dui. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. Ac tincidunt vitae semper quis lectus nulla. + +Sit amet venenatis urna cursus eget nunc scelerisque viverra. Leo duis ut diam quam nulla. In ante metus dictum at tempor commodo ullamcorper a lacus. Faucibus vitae aliquet nec ullamcorper sit. Maecenas ultricies mi eget mauris pharetra et ultrices neque. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed risus ultricies tristique nulla aliquet enim tortor at. Cursus risus at ultrices mi tempus imperdiet nulla malesuada. Cras pulvinar mattis nunc sed. Lectus nulla at volutpat diam ut venenatis tellus in metus. Odio pellentesque diam volutpat commodo sed egestas egestas. Tempus urna et pharetra pharetra massa massa ultricies. Nec sagittis aliquam malesuada bibendum. Dui nunc mattis enim ut. Venenatis cras sed felis eget velit aliquet sagittis. Commodo elit at imperdiet dui accumsan sit amet nulla. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Tempus imperdiet nulla malesuada pellentesque elit. + +Diam in arcu cursus euismod. Placerat duis ultricies lacus sed turpis. Lorem ipsum dolor sit amet. Non arcu risus quis varius. Morbi quis commodo odio aenean sed adipiscing. Fusce ut placerat orci nulla pellentesque dignissim enim. Aenean sed adipiscing diam donec adipiscing. Porta non pulvinar neque laoreet suspendisse. Dui accumsan sit amet nulla. Ultrices dui sapien eget mi proin. Nisl suscipit adipiscing bibendum est ultricies integer. + +Vitae tempus quam pellentesque nec nam aliquam sem et. Cum sociis natoque penatibus et. Nisl condimentum id venenatis a. Libero justo laoreet sit amet cursus sit amet. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Nisi vitae suscipit tellus mauris a. Nec ultrices dui sapien eget. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Diam ut venenatis tellus in. Enim ut sem viverra aliquet eget sit amet tellus. Donec et odio pellentesque diam volutpat commodo. Sapien faucibus et molestie ac feugiat sed. Amet mattis vulputate enim nulla aliquet porttitor lacus. Enim nunc faucibus a pellentesque. + +At elementum eu facilisis sed odio morbi. Nisl rhoncus mattis rhoncus urna neque viverra justo. Lacus laoreet non curabitur gravida. Libero id faucibus nisl tincidunt eget nullam non nisi est. Aliquet risus feugiat in ante metus dictum at tempor. Montes nascetur ridiculus mus mauris vitae ultricies leo integer malesuada. Imperdiet nulla malesuada pellentesque elit eget. Tempus urna et pharetra pharetra. Nunc sed augue lacus viverra vitae congue. Viverra adipiscing at in tellus integer. Volutpat sed cras ornare arcu. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Turpis egestas maecenas pharetra convallis posuere morbi. + +Purus sit amet luctus venenatis lectus magna fringilla urna porttitor. Tellus in metus vulputate eu scelerisque felis imperdiet proin. Nibh ipsum consequat nisl vel pretium lectus quam. Metus dictum at tempor commodo. Ut tristique et egestas quis ipsum suspendisse ultrices gravida. Est ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Rutrum tellus pellentesque eu tincidunt tortor. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor. Sed libero enim sed faucibus turpis in eu. Pellentesque massa placerat duis ultricies. Ut venenatis tellus in metus vulputate. Urna duis convallis convallis tellus id interdum. Lectus sit amet est placerat in. Sem fringilla ut morbi tincidunt augue interdum velit euismod in. Velit dignissim sodales ut eu. Sit amet massa vitae tortor. Dignissim sodales ut eu sem integer vitae. + +Condimentum mattis pellentesque id nibh tortor id aliquet lectus proin. Amet venenatis urna cursus eget nunc scelerisque viverra. Quam elementum pulvinar etiam non quam lacus suspendisse. Aenean sed adipiscing diam donec adipiscing. Nibh cras pulvinar mattis nunc sed blandit libero. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor elit. Sit amet aliquam id diam maecenas ultricies mi eget mauris. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Quis ipsum suspendisse ultrices gravida dictum. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc. Semper viverra nam libero justo laoreet sit amet. Molestie a iaculis at erat pellentesque adipiscing commodo. Condimentum lacinia quis vel eros. Proin libero nunc consequat interdum varius sit. Eu volutpat odio facilisis mauris sit amet massa. Porttitor rhoncus dolor purus non enim praesent. Augue interdum velit euismod in pellentesque massa. + +Vitae nunc sed velit dignissim sodales ut eu. Sit amet facilisis magna etiam tempor. Cursus euismod quis viverra nibh. Neque volutpat ac tincidunt vitae semper quis lectus nulla at. Eu facilisis sed odio morbi quis commodo odio aenean. Sollicitudin nibh sit amet commodo nulla facilisi. Tincidunt lobortis feugiat vivamus at augue eget arcu dictum. Ipsum dolor sit amet consectetur. Sed risus pretium quam vulputate dignissim suspendisse in est ante. Feugiat nibh sed pulvinar proin. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. Varius quam quisque id diam vel quam elementum pulvinar. Enim sit amet venenatis urna cursus eget. Posuere urna nec tincidunt praesent semper. Facilisi nullam vehicula ipsum a arcu cursus vitae congue mauris. + +Et magnis dis parturient montes nascetur ridiculus mus mauris. Interdum varius sit amet mattis vulputate. Velit scelerisque in dictum non consectetur a. Ultrices vitae auctor eu augue ut. Donec ultrices tincidunt arcu non sodales neque. Enim praesent elementum facilisis leo vel fringilla est. Et magnis dis parturient montes nascetur ridiculus mus mauris. Tincidunt praesent semper feugiat nibh sed. Nulla pellentesque dignissim enim sit amet venenatis urna. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Imperdiet dui accumsan sit amet. Eget nulla facilisi etiam dignissim diam. Tempor orci eu lobortis elementum nibh tellus molestie. Eget nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. A cras semper auctor neque vitae tempus quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Quisque sagittis purus sit amet. In tellus integer feugiat scelerisque varius. Amet facilisis magna etiam tempor orci eu. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Ipsum dolor sit amet consectetur adipiscing elit pellentesque. Id venenatis a condimentum vitae sapien pellentesque habitant morbi. Vitae tempus quam pellentesque nec nam aliquam. Senectus et netus et malesuada fames. Pretium quam vulputate dignissim suspendisse in est ante in nibh. In iaculis nunc sed augue lacus viverra vitae congue eu. Rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt. Senectus et netus et malesuada fames ac turpis egestas. + +Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Ultrices sagittis orci a scelerisque purus semper. Aliquam purus sit amet luctus venenatis lectus magna fringilla urna. Duis convallis convallis tellus id interdum velit laoreet id. Diam vulputate ut pharetra sit amet aliquam id diam. Ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Ac feugiat sed lectus vestibulum mattis ullamcorper. Faucibus purus in massa tempor nec feugiat nisl pretium fusce. Cras ornare arcu dui vivamus arcu. Tempor orci eu lobortis elementum nibh tellus molestie nunc. Mi proin sed libero enim sed faucibus turpis. Elit duis tristique sollicitudin nibh sit. Sed adipiscing diam donec adipiscing tristique risus nec feugiat. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Mauris vitae ultricies leo integer. Consectetur lorem donec massa sapien faucibus. Lectus arcu bibendum at varius. + +Non quam lacus suspendisse faucibus. Morbi tincidunt ornare massa eget egestas purus viverra accumsan. Lorem sed risus ultricies tristique nulla aliquet. Tortor condimentum lacinia quis vel. Phasellus faucibus scelerisque eleifend donec pretium. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus est. Fermentum iaculis eu non diam phasellus vestibulum lorem sed. In cursus turpis massa tincidunt dui. Cum sociis natoque penatibus et. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Duis at consectetur lorem donec. Volutpat blandit aliquam etiam erat velit scelerisque. Elit duis tristique sollicitudin nibh sit amet. Quis viverra nibh cras pulvinar mattis nunc. Sapien pellentesque habitant morbi tristique senectus et netus et malesuada. Nibh cras pulvinar mattis nunc. Eleifend donec pretium vulputate sapien nec sagittis. + +Nullam ac tortor vitae purus. Ut sem nulla pharetra diam sit amet nisl suscipit adipiscing. Amet facilisis magna etiam tempor. Vitae nunc sed velit dignissim sodales ut eu sem integer. Sem fringilla ut morbi tincidunt augue interdum velit euismod. Morbi non arcu risus quis. Ut sem nulla pharetra diam. Est velit egestas dui id. Sed felis eget velit aliquet sagittis id consectetur purus ut. Sollicitudin aliquam ultrices sagittis orci a scelerisque. Scelerisque purus semper eget duis at tellus at urna. Ac placerat vestibulum lectus mauris ultrices eros in. Pulvinar pellentesque habitant morbi tristique senectus. + +Convallis a cras semper auctor neque vitae tempus quam. Consequat ac felis donec et odio pellentesque diam. Penatibus et magnis dis parturient montes nascetur. Vitae purus faucibus ornare suspendisse sed nisi. Nibh venenatis cras sed felis eget velit. Cursus vitae congue mauris rhoncus aenean vel elit. Elit at imperdiet dui accumsan sit amet. Ultrices eros in cursus turpis massa tincidunt. Molestie nunc non blandit massa. Ridiculus mus mauris vitae ultricies leo integer. Cras fermentum odio eu feugiat pretium nibh. Nulla facilisi etiam dignissim diam. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat est. Non quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Magna sit amet purus gravida quis blandit turpis cursus in. Non sodales neque sodales ut etiam sit amet. Morbi quis commodo odio aenean sed adipiscing diam. Ullamcorper velit sed ullamcorper morbi. Ipsum consequat nisl vel pretium. + +demo=content diff --git a/server/src/main/java/com/adobe/testing/s3mock/dto/ChecksumAlgorithm.java b/server/src/main/java/com/adobe/testing/s3mock/dto/ChecksumAlgorithm.java index 3f2a4aff8..a8fd3f793 100644 --- a/server/src/main/java/com/adobe/testing/s3mock/dto/ChecksumAlgorithm.java +++ b/server/src/main/java/com/adobe/testing/s3mock/dto/ChecksumAlgorithm.java @@ -43,6 +43,16 @@ public static ChecksumAlgorithm fromString(String value) { }; } + public static ChecksumAlgorithm fromHeader(String value) { + return switch (value) { + case "x-amz-checksum-sha256" -> SHA256; + case "x-amz-checksum-sha1" -> SHA1; + case "x-amz-checksum-crc32" -> CRC32; + case "x-amz-checksum-crc32c" -> CRC32C; + default -> null; + }; + } + public Algorithm toAlgorithm() { return switch (this) { case CRC32 -> Algorithm.CRC32; diff --git a/server/src/main/java/com/adobe/testing/s3mock/service/ObjectService.java b/server/src/main/java/com/adobe/testing/s3mock/service/ObjectService.java index 1974cf191..6ff403c6d 100644 --- a/server/src/main/java/com/adobe/testing/s3mock/service/ObjectService.java +++ b/server/src/main/java/com/adobe/testing/s3mock/service/ObjectService.java @@ -24,7 +24,9 @@ import static com.adobe.testing.s3mock.S3Exception.NOT_MODIFIED; import static com.adobe.testing.s3mock.S3Exception.NO_SUCH_KEY; import static com.adobe.testing.s3mock.S3Exception.PRECONDITION_FAILED; +import static com.adobe.testing.s3mock.util.AwsHttpHeaders.X_AMZ_CHECKSUM; import static com.adobe.testing.s3mock.util.AwsHttpHeaders.X_AMZ_DECODED_CONTENT_LENGTH; +import static com.adobe.testing.s3mock.util.AwsHttpHeaders.X_AMZ_TRAILER; import static com.adobe.testing.s3mock.util.HeaderUtil.checksumAlgorithmFromSdk; import static com.adobe.testing.s3mock.util.HeaderUtil.isChunked; import static com.adobe.testing.s3mock.util.HeaderUtil.isChunkedAndV4Signed; @@ -37,6 +39,7 @@ import com.adobe.testing.s3mock.dto.Delete; import com.adobe.testing.s3mock.dto.DeleteResult; import com.adobe.testing.s3mock.dto.DeletedS3Object; +import com.adobe.testing.s3mock.dto.Error; import com.adobe.testing.s3mock.dto.LegalHold; import com.adobe.testing.s3mock.dto.Owner; import com.adobe.testing.s3mock.dto.Retention; @@ -45,9 +48,7 @@ import com.adobe.testing.s3mock.store.BucketStore; import com.adobe.testing.s3mock.store.ObjectStore; import com.adobe.testing.s3mock.store.S3ObjectMetadata; -import com.adobe.testing.s3mock.util.AbstractAwsInputStream; -import com.adobe.testing.s3mock.util.AwsChunkedDecodingChecksumInputStream; -import com.adobe.testing.s3mock.util.AwsUnsignedChunkedDecodingChecksumInputStream; +import com.adobe.testing.s3mock.util.AwsChunkedInputStream; import com.adobe.testing.s3mock.util.DigestUtil; import java.io.IOException; import java.io.InputStream; @@ -161,7 +162,7 @@ public DeleteResult deleteObjects(String bucketName, Delete delete) { response.addDeletedObject(DeletedS3Object.from(object)); } catch (IllegalStateException e) { response.addError( - new com.adobe.testing.s3mock.dto.Error("InternalError", + new Error("InternalError", object.key(), "We encountered an internal error. Please try again.", object.versionId())); @@ -266,13 +267,13 @@ public void verifyRetention(Retention retention) { public Pair toTempFile(InputStream inputStream, HttpHeaders httpHeaders) { try { - var tempFile = Files.createTempFile("tempObject", ""); + var tempFile = Files.createTempFile("ObjectService", "toTempFile"); try (OutputStream os = Files.newOutputStream(tempFile)) { InputStream wrappedStream = wrapStream(inputStream, httpHeaders); wrappedStream.transferTo(os); ChecksumAlgorithm algorithmFromSdk = checksumAlgorithmFromSdk(httpHeaders); if (algorithmFromSdk != null - && wrappedStream instanceof AbstractAwsInputStream awsInputStream) { + && wrappedStream instanceof AwsChunkedInputStream awsInputStream) { return Pair.of(tempFile, awsInputStream.getChecksum()); } return Pair.of(tempFile, null); @@ -291,11 +292,11 @@ public void verifyChecksum(Path path, String checksum, ChecksumAlgorithm checksu InputStream wrapStream(InputStream dataStream, HttpHeaders headers) { var lengthHeader = headers.getFirst(X_AMZ_DECODED_CONTENT_LENGTH); + var trailHeader = headers.getOrEmpty(X_AMZ_TRAILER); + var hasChecksum = trailHeader.stream().anyMatch(h -> h.contains(X_AMZ_CHECKSUM)); var length = lengthHeader == null ? -1 : Long.parseLong(lengthHeader); - if (isChunkedAndV4Signed(headers)) { - return new AwsChunkedDecodingChecksumInputStream(dataStream, length); - } else if (isChunked(headers)) { - return new AwsUnsignedChunkedDecodingChecksumInputStream(dataStream, length); + if (isChunkedAndV4Signed(headers) || isChunked(headers)) { + return new AwsChunkedInputStream(dataStream, length, hasChecksum); } else { return dataStream; } diff --git a/server/src/main/java/com/adobe/testing/s3mock/util/AbstractAwsInputStream.java b/server/src/main/java/com/adobe/testing/s3mock/util/AbstractAwsInputStream.java deleted file mode 100644 index cbfb98238..000000000 --- a/server/src/main/java/com/adobe/testing/s3mock/util/AbstractAwsInputStream.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright 2017-2024 Adobe. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.adobe.testing.s3mock.util; - -import static java.nio.charset.StandardCharsets.UTF_8; - -import com.adobe.testing.s3mock.dto.ChecksumAlgorithm; -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.ByteBuffer; - -public abstract class AbstractAwsInputStream extends InputStream { - protected static final byte[] CRLF = "\r\n".getBytes(UTF_8); - protected static final byte[] DELIMITER = ";".getBytes(UTF_8); - protected static final byte[] CHECKSUM_HEADER = "x-amz-checksum-".getBytes(UTF_8); - protected long readDecodedLength = 0L; - protected final InputStream source; - protected long chunkLength = 0L; - protected String checksum; - protected ChecksumAlgorithm algorithm; - /** - * That's the max chunk buffer size used in the AWS implementation. - */ - private static final int MAX_CHUNK_SIZE = 256 * 1024; - private final ByteBuffer byteBuffer = ByteBuffer.allocate(MAX_CHUNK_SIZE); - protected final long decodedLength; - - protected AbstractAwsInputStream(InputStream source, long decodedLength) { - this.source = new BufferedInputStream(source); - this.decodedLength = decodedLength; - } - - @Override - public void close() throws IOException { - source.close(); - } - - /** - * Reads this stream until the byte sequence was found. - * - * @param endSequence The byte sequence to look for in the stream. The source stream is read - * until the last bytes read are equal to this sequence. - * - * @return The bytes read before the end sequence started. - */ - protected byte[] readUntil(final byte[] endSequence) throws IOException { - byteBuffer.clear(); - while (!endsWith(byteBuffer.asReadOnlyBuffer(), endSequence)) { - var c = source.read(); - if (c < 0) { - return new byte[0]; - } - - var unsigned = (byte) (c & 0xFF); - byteBuffer.put(unsigned); - } - - var result = new byte[byteBuffer.position() - endSequence.length]; - byteBuffer.rewind(); - byteBuffer.get(result); - return result; - } - - protected boolean endsWith(final ByteBuffer buffer, final byte[] endSequence) { - var pos = buffer.position(); - if (pos >= endSequence.length) { - for (var i = 0; i < endSequence.length; i++) { - if (buffer.get(pos - endSequence.length + i) != endSequence[i]) { - return false; - } - } - - return true; - } - - return false; - } - - protected void setChunkLength(byte[] hexLengthBytes) { - chunkLength = Long.parseLong(new String(hexLengthBytes, UTF_8).trim(), 16); - } - - protected void extractAlgorithmAndChecksum() throws IOException { - if (algorithm == null && checksum == null) { - readUntil(CHECKSUM_HEADER); - var typeAndChecksum = readUntil(CRLF); - var typeAndChecksumString = new String(typeAndChecksum); - if (!typeAndChecksumString.isBlank()) { - var split = typeAndChecksumString.split(":"); - var type = split[0]; - algorithm = ChecksumAlgorithm.fromString(type); - checksum = split[1]; - } - } - } - - public String getChecksum() { - return checksum; - } - - public ChecksumAlgorithm getAlgorithm() { - return algorithm; - } -} diff --git a/server/src/main/java/com/adobe/testing/s3mock/util/AwsChunkedDecodingChecksumInputStream.java b/server/src/main/java/com/adobe/testing/s3mock/util/AwsChunkedDecodingChecksumInputStream.java deleted file mode 100644 index 5126ce437..000000000 --- a/server/src/main/java/com/adobe/testing/s3mock/util/AwsChunkedDecodingChecksumInputStream.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2017-2024 Adobe. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.adobe.testing.s3mock.util; - -import java.io.IOException; -import java.io.InputStream; - -/** - * Merges chunks from AWS chunked AwsChunkedEncodingInputStream, skipping V4 style signing metadata. - *

The original stream looks like this (newlines are CRLF):

- * - *
- * 24;chunk-signature=312a41de690364ad6d17629d1e026c448e78abd328f1602276fdd2c3f928d100
- * ## sample test file ##
- *
- * demo=content
- * 0;chunk-signature=4d2b448448f29b473beb81340f5a3d6c9468e4fbb9ac761cfab63846919011fb
- * 
- * - *

The format of each chunk of data is:

- * - *
- * [hex-encoded-number-of-bytes-in-chunk];chunk-signature=[sha256-signature][crlf]
- * [payload-bytes-of-this-chunk][crlf]
- * 0;chunk-signature=[sha256-signature][crlf]
- * x-amz-checksum-[checksum-algoritm]:[checksum]
- * 
- * - * @see - * - * AwsChunkedEncodingInputStream - */ -public class AwsChunkedDecodingChecksumInputStream extends AbstractAwsInputStream { - - public AwsChunkedDecodingChecksumInputStream(InputStream source, long decodedLength) { - super(source, decodedLength); - } - - @Override - public int read() throws IOException { - if (chunkLength == 0L) { - //try to read chunk length - var hexLengthBytes = readUntil(DELIMITER); - if (hexLengthBytes.length == 0) { - return -1; - } - - setChunkLength(hexLengthBytes); - - if (chunkLength == 0L) { - extractAlgorithmAndChecksum(); - return -1; - } - - readUntil(CRLF); - } - - readDecodedLength++; - chunkLength--; - - return source.read(); - } -} diff --git a/server/src/main/java/com/adobe/testing/s3mock/util/AwsChunkedInputStream.java b/server/src/main/java/com/adobe/testing/s3mock/util/AwsChunkedInputStream.java new file mode 100644 index 000000000..df52323b2 --- /dev/null +++ b/server/src/main/java/com/adobe/testing/s3mock/util/AwsChunkedInputStream.java @@ -0,0 +1,197 @@ +/* + * Copyright 2017-2024 Adobe. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.adobe.testing.s3mock.util; + +import static java.nio.charset.StandardCharsets.UTF_8; + +import com.adobe.testing.s3mock.dto.ChecksumAlgorithm; +import java.io.BufferedInputStream; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +/** + * This handles both signed and unsigned chunked encodings. + * + *

SIGNED:

+ * Merges chunks from AWS chunked AwsChunkedEncodingInputStream, skipping V4 style signing metadata. + * The checksum is optionally included in the stream as part of the "trail headers" + * after the last chunk. + * + *

The original stream looks like this:

+ * + *
+ * 24;chunk-signature=312a41de690364ad6d17629d1e026c448e78abd328f1602276fdd2c3f928d100
+ * ## sample test file ##
+ *
+ * demo=content
+ * 0;chunk-signature=4d2b448448f29b473beb81340f5a3d6c9468e4fbb9ac761cfab63846919011fb
+ * x-amz-checksum-sha256:1VcEifAruhjVvjzul4sC0B1EmlUdzqvsp6BP0KSVdTE=
+ * 
+ * + *

The format of each chunk of data is:

+ * + *
+ * [hex-encoded-number-of-bytes-in-chunk];chunk-signature=[sha256-signature][EOL]
+ * [payload-bytes-of-this-chunk][EOL]
+ * 
+ * + *

The format of the full payload is:

+ * + *
+ * [hex-encoded-number-of-bytes-in-chunk];chunk-signature=[sha256-signature][EOL]
+ * [payload-bytes-of-this-chunk][EOL]
+ * 0;chunk-signature=[sha256-signature][EOL]
+ * x-amz-checksum-[checksum-algorithm]:[checksum][EOL]
+ * [other trail headers]
+ * 
+ * + *

UNSIGNED:

+ * Merges chunks from AWS chunked AwsUnsignedChunkedEncodingInputStream. + * The checksum is optionally included in the stream as part of the "trail headers" + * after the last chunk. + * + *

The original stream looks like this:

+ * + *
+ * 24
+ * ## sample test file ##
+ *
+ * demo=content
+ * 0
+ * x-amz-checksum-sha256:1VcEifAruhjVvjzul4sC0B1EmlUdzqvsp6BP0KSVdTE=
+ * 
+ * + *

The format of each chunk of data is:

+ * + *
+ * [hex-encoded-number-of-bytes-in-chunk][EOL]
+ * [payload-bytes-of-this-chunk][EOL]
+ * 
+ * + *

The format of the full payload is:

+ * + *
+ * [hex-encoded-number-of-bytes-in-chunk][EOL]
+ * [payload-bytes-of-this-chunk][EOL]
+ * 0[EOL]
+ * x-amz-checksum-[checksum-algoritm]:[checksum][EOL]
+ * [other trail headers]
+ * 
+ * + * @see + * + * AwsUnsignedChunkedEncodingInputStream + * + * @see + * + * AwsChunkedEncodingInputStream + */ +public class AwsChunkedInputStream extends InputStream { + protected long readDecodedLength = 0L; + protected BufferedInputStream source; + protected BufferedReader reader; + protected long chunkLength = 0L; + protected int chunks = 0; + protected String checksum; + protected ChecksumAlgorithm algorithm; + protected final boolean hasChecksum; + protected final long decodedLength; + + public AwsChunkedInputStream(InputStream source, long decodedLength, boolean hasChecksum) { + this.reader = new BufferedReader(new InputStreamReader(source, UTF_8)); + this.decodedLength = decodedLength; + this.hasChecksum = hasChecksum; + } + + @Override + public int read() throws IOException { + if (chunkLength == -1L) { + //stream end was marked after last chunk was read. + // See below. + // Always return -1. + return -1; + } + if (chunkLength == 0L) { + //try to read chunk length + var hexLength = readHexLength(); + if (hexLength == null) { + return -1; + } + setChunkLength(hexLength); + + if (chunkLength == 0L) { + //chunk length found, but was "0". + // This marks the end of the payload and the beginning of the trail headers. + // Extract checksum, if available. + extractAlgorithmAndChecksum(); + // make sure that no more bytes are read from the stream, see first line. + chunkLength = -1L; + return -1; + } + chunks++; + } + + readDecodedLength++; + chunkLength--; + + return reader.read(); + } + + @Override + public void close() throws IOException { + reader.close(); + } + + public String getChecksum() { + return checksum; + } + + public ChecksumAlgorithm getAlgorithm() { + return algorithm; + } + + private void setChunkLength(String hexLength) { + chunkLength = Long.parseLong(hexLength.trim(), 16); + } + + private void extractAlgorithmAndChecksum() throws IOException { + if (hasChecksum) { + var typeAndChecksumString = reader.readLine(); + if (typeAndChecksumString != null && !typeAndChecksumString.isBlank()) { + var split = typeAndChecksumString.split(":"); + var type = split[0]; + algorithm = ChecksumAlgorithm.fromHeader(type); + checksum = split[1]; + } + } + } + + private String readHexLength() throws IOException { + var hexLength = reader.readLine(); + if (hexLength != null && hexLength.isBlank()) { + //skip empty line if present + hexLength = reader.readLine(); + } + if (hexLength != null && !hexLength.isBlank()) { + //remove chunk signature, if present + hexLength = hexLength.split(";")[0]; + } + return hexLength; + } +} diff --git a/server/src/main/java/com/adobe/testing/s3mock/util/AwsHttpHeaders.java b/server/src/main/java/com/adobe/testing/s3mock/util/AwsHttpHeaders.java index 87c6a5723..c1e29e734 100644 --- a/server/src/main/java/com/adobe/testing/s3mock/util/AwsHttpHeaders.java +++ b/server/src/main/java/com/adobe/testing/s3mock/util/AwsHttpHeaders.java @@ -55,6 +55,7 @@ public final class AwsHttpHeaders { public static final String X_AMZ_BUCKET_OBJECT_LOCK_ENABLED = "x-amz-bucket-object-lock-enabled"; public static final String X_AMZ_OBJECT_ATTRIBUTES = "x-amz-object-attributes"; public static final String X_AMZ_SDK_CHECKSUM_ALGORITHM = "x-amz-sdk-checksum-algorithm"; + public static final String X_AMZ_CHECKSUM = "x-amz-checksum"; public static final String X_AMZ_CHECKSUM_CRC32 = "x-amz-checksum-crc32"; public static final String X_AMZ_CHECKSUM_CRC32C = "x-amz-checksum-crc32c"; public static final String X_AMZ_CHECKSUM_SHA1 = "x-amz-checksum-sha1"; @@ -62,6 +63,7 @@ public final class AwsHttpHeaders { public static final String X_AMZ_STORAGE_CLASS = "x-amz-storage-class"; public static final String X_AMZ_ACL = "x-amz-acl"; public static final String X_AMZ_DECODED_CONTENT_LENGTH = "x-amz-decoded-content-length"; + public static final String X_AMZ_TRAILER = "x-amz-trailer"; public static final String AWS_CHUNKED = "aws-chunked"; private AwsHttpHeaders() { diff --git a/server/src/main/java/com/adobe/testing/s3mock/util/AwsUnsignedChunkedDecodingChecksumInputStream.java b/server/src/main/java/com/adobe/testing/s3mock/util/AwsUnsignedChunkedDecodingChecksumInputStream.java deleted file mode 100644 index 5fccbe4b8..000000000 --- a/server/src/main/java/com/adobe/testing/s3mock/util/AwsUnsignedChunkedDecodingChecksumInputStream.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2017-2024 Adobe. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.adobe.testing.s3mock.util; - -import java.io.IOException; -import java.io.InputStream; - -/** - * Merges chunks from AWS chunked AwsUnsignedChunkedEncodingInputStream. - *

The original stream looks like this (newlines are CRLF):

- * - *
- * 24
- * ## sample test file ##
- *
- * demo=content
- * 0
- * x-amz-checksum-sha256:1VcEifAruhjVvjzul4sC0B1EmlUdzqvsp6BP0KSVdTE=
- * 
- * - *

The format of each chunk of data is:

- * - *
- * [hex-encoded-number-of-bytes-in-chunk][crlf]
- * [payload-bytes-of-this-chunk][crlf]
- * 0
- * x-amz-checksum-[checksum-algoritm]:[checksum]
- * 
- * - * @see - * - * AwsUnsignedChunkedEncodingInputStream - */ -public class AwsUnsignedChunkedDecodingChecksumInputStream extends AbstractAwsInputStream { - - public AwsUnsignedChunkedDecodingChecksumInputStream(InputStream source, long decodedLength) { - super(source, decodedLength); - } - - @Override - public int read() throws IOException { - if (chunkLength == 0L) { - //try to read chunk length - var hexLengthBytes = readUntil(CRLF); - if (hexLengthBytes.length == 0) { - return -1; - } - - setChunkLength(hexLengthBytes); - - if (chunkLength == 0L) { - //chunk length found, but was "0". Try and find the checksum. - extractAlgorithmAndChecksum(); - return -1; - } - } - - readDecodedLength++; - chunkLength--; - - return source.read(); - } -} diff --git a/server/src/main/java/com/adobe/testing/s3mock/util/HeaderUtil.java b/server/src/main/java/com/adobe/testing/s3mock/util/HeaderUtil.java index 7a900d969..113145bf8 100644 --- a/server/src/main/java/com/adobe/testing/s3mock/util/HeaderUtil.java +++ b/server/src/main/java/com/adobe/testing/s3mock/util/HeaderUtil.java @@ -224,7 +224,7 @@ public static String checksumFrom(HttpHeaders headers) { return null; } - private static String mapChecksumToHeader(ChecksumAlgorithm checksumAlgorithm) { + public static String mapChecksumToHeader(ChecksumAlgorithm checksumAlgorithm) { return switch (checksumAlgorithm) { case SHA256 -> X_AMZ_CHECKSUM_SHA256; case SHA1 -> X_AMZ_CHECKSUM_SHA1; diff --git a/server/src/test/java/com/adobe/testing/s3mock/ObjectControllerTest.java b/server/src/test/java/com/adobe/testing/s3mock/ObjectControllerTest.java index f4b27c747..b28e15c8e 100644 --- a/server/src/test/java/com/adobe/testing/s3mock/ObjectControllerTest.java +++ b/server/src/test/java/com/adobe/testing/s3mock/ObjectControllerTest.java @@ -102,10 +102,10 @@ class ObjectControllerTest extends BaseControllerTest { @Test void testPutObject_Ok() throws Exception { givenBucket(); - var key = "sampleFile.txt"; + final var key = "sampleFile.txt"; var testFile = new File(UPLOAD_FILE_NAME); - var digest = DigestUtil.hexDigest(FileUtils.openInputStream(testFile)); + final var digest = DigestUtil.hexDigest(FileUtils.openInputStream(testFile)); Path tempFile = Files.createTempFile("", ""); FileUtils.copyFile(testFile, tempFile.toFile()); when(objectService.toTempFile(any(InputStream.class), any(HttpHeaders.class))) @@ -144,10 +144,10 @@ void testPutObject_Ok() throws Exception { @Test void testPutObject_Options() throws Exception { givenBucket(); - var key = "sampleFile.txt"; + final var key = "sampleFile.txt"; var testFile = new File(UPLOAD_FILE_NAME); - var digest = DigestUtil.hexDigest(FileUtils.openInputStream(testFile)); + final var digest = DigestUtil.hexDigest(FileUtils.openInputStream(testFile)); Path tempFile = Files.createTempFile("", ""); FileUtils.copyFile(testFile, tempFile.toFile()); when(objectService.toTempFile(any(InputStream.class), any(HttpHeaders.class))) @@ -192,10 +192,10 @@ void testPutObject_Options() throws Exception { @Test void testPutObject_md5_Ok() throws Exception { givenBucket(); - var key = "sampleFile.txt"; + final var key = "sampleFile.txt"; var testFile = new File(UPLOAD_FILE_NAME); - var hexDigest = DigestUtil.hexDigest(FileUtils.openInputStream(testFile)); + final var hexDigest = DigestUtil.hexDigest(FileUtils.openInputStream(testFile)); Path tempFile = Files.createTempFile("", ""); FileUtils.copyFile(testFile, tempFile.toFile()); when(objectService.toTempFile(any(InputStream.class), any(HttpHeaders.class))) diff --git a/server/src/test/java/com/adobe/testing/s3mock/service/ObjectServiceTest.java b/server/src/test/java/com/adobe/testing/s3mock/service/ObjectServiceTest.java index 6e42040cb..5e689927c 100644 --- a/server/src/test/java/com/adobe/testing/s3mock/service/ObjectServiceTest.java +++ b/server/src/test/java/com/adobe/testing/s3mock/service/ObjectServiceTest.java @@ -23,6 +23,10 @@ import static com.adobe.testing.s3mock.S3Exception.NO_SUCH_KEY; import static com.adobe.testing.s3mock.S3Exception.PRECONDITION_FAILED; import static com.adobe.testing.s3mock.service.ObjectService.WILDCARD_ETAG; +import static com.adobe.testing.s3mock.util.AwsHttpHeaders.AWS_CHUNKED; +import static com.adobe.testing.s3mock.util.AwsHttpHeaders.X_AMZ_CHECKSUM_SHA256; +import static com.adobe.testing.s3mock.util.AwsHttpHeaders.X_AMZ_SDK_CHECKSUM_ALGORITHM; +import static com.adobe.testing.s3mock.util.AwsHttpHeaders.X_AMZ_TRAILER; import static com.adobe.testing.s3mock.util.DigestUtil.base64Digest; import static java.time.Instant.now; import static java.time.temporal.ChronoUnit.MINUTES; @@ -32,6 +36,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; +import com.adobe.testing.s3mock.dto.ChecksumAlgorithm; import com.adobe.testing.s3mock.dto.Delete; import com.adobe.testing.s3mock.dto.Mode; import com.adobe.testing.s3mock.dto.Retention; @@ -40,13 +45,24 @@ import com.adobe.testing.s3mock.store.MultipartStore; import java.io.File; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.nio.file.Files; +import java.nio.file.Path; import java.util.Arrays; +import java.util.List; +import java.util.Map; import java.util.UUID; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.HttpHeaders; +import org.springframework.util.MultiValueMapAdapter; +import software.amazon.awssdk.core.checksums.Algorithm; +import software.amazon.awssdk.core.checksums.SdkChecksum; +import software.amazon.awssdk.core.internal.chunked.AwsChunkedEncodingConfig; +import software.amazon.awssdk.core.internal.io.AwsUnsignedChunkedEncodingInputStream; @SpringBootTest(classes = {ServiceConfiguration.class}, webEnvironment = SpringBootTest.WebEnvironment.NONE) @@ -226,4 +242,38 @@ void testVerifyObjectExists_failure() { givenBucket(bucketName); assertThatThrownBy(() -> iut.verifyObjectExists(bucketName, key)).isEqualTo(NO_SUCH_KEY); } + + @Test + void test_toTempFile() throws IOException { + File file = new File("src/test/resources/sampleFile_large.txt"); + Path tempFile = toTempFile(file.toPath(), Algorithm.SHA256, X_AMZ_CHECKSUM_SHA256); + var tempFileAndChecksum = iut.toTempFile(Files.newInputStream(tempFile), + new HttpHeaders(new MultiValueMapAdapter<>( + Map.of(X_AMZ_SDK_CHECKSUM_ALGORITHM, List.of(ChecksumAlgorithm.SHA256.toString()), + HttpHeaders.CONTENT_ENCODING, List.of(AWS_CHUNKED), + X_AMZ_TRAILER, List.of(X_AMZ_CHECKSUM_SHA256)) + ))); + assertThat(tempFileAndChecksum.getLeft().getFileName().toString()).contains("toTempFile"); + assertThat(tempFileAndChecksum.getRight()) + .contains("Y8S4/uAGut7vjdFZQjLKZ7P28V9EPWb4BIoeniuM0mY="); + } + + private Path toTempFile(Path path, Algorithm algorithm, String header) throws IOException { + AwsUnsignedChunkedEncodingInputStream.Builder builder = AwsUnsignedChunkedEncodingInputStream + .builder() + .inputStream(Files.newInputStream(path)); + if (algorithm != null) { + builder.sdkChecksum(SdkChecksum.forAlgorithm(algorithm)); + } + Path tempFile = Files.createTempFile("temp", ""); + try (InputStream chunkedEncodingInputStream = builder + .checksumHeaderForTrailer(header) + //force chunks in the inputstream + .awsChunkedEncodingConfig(AwsChunkedEncodingConfig.builder().chunkSize(4000).build()) + .build(); + OutputStream outputStream = Files.newOutputStream(tempFile)) { + chunkedEncodingInputStream.transferTo(outputStream); + } + return tempFile; + } } diff --git a/server/src/test/java/com/adobe/testing/s3mock/util/AwsChunkedDecodingChecksumInputStreamTest.java b/server/src/test/java/com/adobe/testing/s3mock/util/AwsChunkedDecodingChecksumInputStreamTest.java deleted file mode 100644 index 88849fb0a..000000000 --- a/server/src/test/java/com/adobe/testing/s3mock/util/AwsChunkedDecodingChecksumInputStreamTest.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2017-2024 Adobe. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.adobe.testing.s3mock.util; - -import static com.adobe.testing.s3mock.dto.ChecksumAlgorithm.SHA256; -import static com.adobe.testing.s3mock.util.AwsHttpHeaders.X_AMZ_CHECKSUM_SHA256; -import static com.adobe.testing.s3mock.util.TestUtil.getFileFromClasspath; -import static org.assertj.core.api.Assertions.assertThat; - -import com.adobe.testing.s3mock.dto.ChecksumAlgorithm; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInfo; -import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsS3V4ChunkSigner; -import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsSignedChunkedEncodingInputStream; -import software.amazon.awssdk.core.checksums.Algorithm; -import software.amazon.awssdk.core.checksums.SdkChecksum; -import software.amazon.awssdk.core.internal.chunked.AwsChunkedEncodingConfig; - -class AwsChunkedDecodingChecksumInputStreamTest { - - @Test - void testDecode_checksum(TestInfo testInfo) throws IOException { - doTest(testInfo, "sampleFile.txt", X_AMZ_CHECKSUM_SHA256, Algorithm.SHA256, - "1VcEifAruhjVvjzul4sC0B1EmlUdzqvsp6BP0KSVdTE=", SHA256); - doTest(testInfo, "sampleFile_large.txt", X_AMZ_CHECKSUM_SHA256, Algorithm.SHA256, - "BNNY15scjxN9jPa+AEJ6p08Cfm4BhYOXkhladr4QSTs=", SHA256); - } - - @Test - void testDecode_noChecksum(TestInfo testInfo) throws IOException { - doTest(testInfo, "sampleFile.txt"); - doTest(testInfo, "sampleFile_large.txt"); - } - - void doTest(TestInfo testInfo, String fileName) throws IOException { - doTest(testInfo, fileName, null, null, null, null); - } - - void doTest(TestInfo testInfo, String fileName, String header, Algorithm algorithm, - String checksum, ChecksumAlgorithm checksumAlgorithm) throws IOException { - File sampleFile = getFileFromClasspath(testInfo, fileName); - AwsSignedChunkedEncodingInputStream.Builder builder = AwsSignedChunkedEncodingInputStream - .builder() - .inputStream(Files.newInputStream(sampleFile.toPath())); - if (algorithm != null) { - builder.sdkChecksum(SdkChecksum.forAlgorithm(algorithm)); - } - InputStream chunkedEncodingInputStream = builder - .checksumHeaderForTrailer(header) - //force chunks in the inputstream - .awsChunkedEncodingConfig(AwsChunkedEncodingConfig.builder().chunkSize(4000).build()) - .awsChunkSigner(new AwsS3V4ChunkSigner("signingKey".getBytes(), - "dateTime", - "keyPath")) - .build(); - - long decodedLength = sampleFile.length(); - AwsChunkedDecodingChecksumInputStream iut = new - AwsChunkedDecodingChecksumInputStream(chunkedEncodingInputStream, decodedLength); - assertThat(iut).hasSameContentAs(Files.newInputStream(sampleFile.toPath())); - assertThat(iut.getAlgorithm()).isEqualTo(checksumAlgorithm); - assertThat(iut.getChecksum()).isEqualTo(checksum); - assertThat(iut.decodedLength).isEqualTo(decodedLength); - assertThat(iut.readDecodedLength).isEqualTo(decodedLength); - } -} diff --git a/server/src/test/java/com/adobe/testing/s3mock/util/AwsChunkedInputStreamTest.java b/server/src/test/java/com/adobe/testing/s3mock/util/AwsChunkedInputStreamTest.java new file mode 100644 index 000000000..78604c290 --- /dev/null +++ b/server/src/test/java/com/adobe/testing/s3mock/util/AwsChunkedInputStreamTest.java @@ -0,0 +1,165 @@ +/* + * Copyright 2017-2024 Adobe. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.adobe.testing.s3mock.util; + +import static com.adobe.testing.s3mock.util.DigestUtil.checksumFor; +import static com.adobe.testing.s3mock.util.TestUtil.getFileFromClasspath; +import static java.nio.file.Files.newInputStream; +import static org.assertj.core.api.Assertions.assertThat; + +import com.adobe.testing.s3mock.dto.ChecksumAlgorithm; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.stream.Stream; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsS3V4ChunkSigner; +import software.amazon.awssdk.auth.signer.internal.chunkedencoding.AwsSignedChunkedEncodingInputStream; +import software.amazon.awssdk.core.checksums.Algorithm; +import software.amazon.awssdk.core.checksums.SdkChecksum; +import software.amazon.awssdk.core.internal.chunked.AwsChunkedEncodingConfig; +import software.amazon.awssdk.core.internal.io.AwsUnsignedChunkedEncodingInputStream; + +class AwsChunkedInputStreamTest { + + @ParameterizedTest + @MethodSource("algorithms") + void testDecode_unsigned_checksum(Algorithm algorithm, TestInfo testInfo) throws IOException { + ChecksumAlgorithm checksumAlgorithm = ChecksumAlgorithm.fromString(algorithm.toString()); + String header = HeaderUtil.mapChecksumToHeader(checksumAlgorithm); + doTestUnsigned(getFileFromClasspath(testInfo, "sampleFile.txt"), + 1, + header, + SdkChecksum.forAlgorithm(algorithm), + checksumFor( + getFileFromClasspath(testInfo, "sampleFile.txt").toPath(), algorithm), + checksumAlgorithm + ); + doTestUnsigned(getFileFromClasspath(testInfo, "sampleFile_large.txt"), + 16, + header, + SdkChecksum.forAlgorithm(algorithm), + checksumFor( + getFileFromClasspath(testInfo, "sampleFile_large.txt").toPath(), algorithm), + checksumAlgorithm + ); + } + + @Test + void testDecode_unsigned_noChecksum(TestInfo testInfo) throws IOException { + doTestUnsigned(getFileFromClasspath(testInfo, "sampleFile.txt"), 1); + doTestUnsigned(getFileFromClasspath(testInfo, "sampleFile_large.txt"), 16); + } + + void doTestUnsigned(File input, int chunks) throws IOException { + doTestUnsigned(input, chunks, null, null, null, null); + } + + void doTestUnsigned(File input, int chunks, String header, SdkChecksum algorithm, + String checksum, ChecksumAlgorithm checksumAlgorithm) throws IOException { + InputStream chunkedEncodingInputStream = AwsUnsignedChunkedEncodingInputStream + .builder() + .inputStream(newInputStream(input.toPath())) + .sdkChecksum(algorithm) + .checksumHeaderForTrailer(header) + //force chunks in the inputstream + .awsChunkedEncodingConfig(AwsChunkedEncodingConfig.builder().chunkSize(4000).build()) + .build(); + + long decodedLength = input.length(); + AwsChunkedInputStream iut = new AwsChunkedInputStream(chunkedEncodingInputStream, + decodedLength, + checksumAlgorithm != null); + + assertThat(iut).hasSameContentAs(newInputStream(input.toPath())); + assertThat(iut.getAlgorithm()).isEqualTo(checksumAlgorithm); + assertThat(iut.getChecksum()).isEqualTo(checksum); + assertThat(iut.decodedLength).isEqualTo(decodedLength); + assertThat(iut.readDecodedLength).isEqualTo(decodedLength); + assertThat(iut.chunks).isEqualTo(chunks); + } + + @ParameterizedTest + @MethodSource("algorithms") + void testDecode_signed_checksum(Algorithm algorithm, TestInfo testInfo) throws IOException { + ChecksumAlgorithm checksumAlgorithm = ChecksumAlgorithm.fromString(algorithm.toString()); + String header = HeaderUtil.mapChecksumToHeader(checksumAlgorithm); + doTestSigned(getFileFromClasspath(testInfo, "sampleFile.txt"), + 1, + header, + SdkChecksum.forAlgorithm(algorithm), + checksumFor( + getFileFromClasspath(testInfo, "sampleFile.txt").toPath(), algorithm), + checksumAlgorithm + ); + doTestSigned(getFileFromClasspath(testInfo, "sampleFile_large.txt"), + 16, + header, + SdkChecksum.forAlgorithm(algorithm), + checksumFor( + getFileFromClasspath(testInfo, "sampleFile_large.txt").toPath(), algorithm), + checksumAlgorithm + ); + } + + @Test + void testDecode_signed_noChecksum(TestInfo testInfo) throws IOException { + doTestSigned(getFileFromClasspath(testInfo, "sampleFile.txt"), 1); + doTestSigned(getFileFromClasspath(testInfo, "sampleFile_large.txt"), 16); + } + + void doTestSigned(File input, int chunks) throws IOException { + doTestSigned(input, chunks, null, null, null, null); + } + + void doTestSigned(File input, int chunks, String header, SdkChecksum algorithm, + String checksum, ChecksumAlgorithm checksumAlgorithm) throws IOException { + InputStream chunkedEncodingInputStream = AwsSignedChunkedEncodingInputStream + .builder() + .inputStream(newInputStream(input.toPath())) + .sdkChecksum(algorithm) + .checksumHeaderForTrailer(header) + //force chunks in the inputstream + .awsChunkedEncodingConfig(AwsChunkedEncodingConfig.builder().chunkSize(4000).build()) + .awsChunkSigner(new AwsS3V4ChunkSigner("signingKey".getBytes(), + "dateTime", + "keyPath")) + .build(); + + long decodedLength = input.length(); + AwsChunkedInputStream iut = new AwsChunkedInputStream(chunkedEncodingInputStream, decodedLength, + checksumAlgorithm != null); + + assertThat(iut).hasSameContentAs(newInputStream(input.toPath())); + assertThat(iut.getAlgorithm()).isEqualTo(checksumAlgorithm); + assertThat(iut.getChecksum()).isEqualTo(checksum); + assertThat(iut.decodedLength).isEqualTo(decodedLength); + assertThat(iut.readDecodedLength).isEqualTo(decodedLength); + assertThat(iut.chunks).isEqualTo(chunks); + } + + private static Stream algorithms() { + return Arrays.stream(Algorithm.values()); + } +} diff --git a/server/src/test/java/com/adobe/testing/s3mock/util/AwsUnsignedChunkedDecodingChecksumInputStreamTest.java b/server/src/test/java/com/adobe/testing/s3mock/util/AwsUnsignedChunkedDecodingChecksumInputStreamTest.java deleted file mode 100644 index c136526fd..000000000 --- a/server/src/test/java/com/adobe/testing/s3mock/util/AwsUnsignedChunkedDecodingChecksumInputStreamTest.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2017-2024 Adobe. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.adobe.testing.s3mock.util; - -import static com.adobe.testing.s3mock.dto.ChecksumAlgorithm.SHA256; -import static com.adobe.testing.s3mock.util.AwsHttpHeaders.X_AMZ_CHECKSUM_SHA256; -import static com.adobe.testing.s3mock.util.TestUtil.getFileFromClasspath; -import static org.assertj.core.api.Assertions.assertThat; - -import com.adobe.testing.s3mock.dto.ChecksumAlgorithm; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInfo; -import software.amazon.awssdk.core.checksums.Algorithm; -import software.amazon.awssdk.core.checksums.SdkChecksum; -import software.amazon.awssdk.core.internal.chunked.AwsChunkedEncodingConfig; -import software.amazon.awssdk.core.internal.io.AwsUnsignedChunkedEncodingInputStream; - -class AwsUnsignedChunkedDecodingChecksumInputStreamTest { - - @Test - void testDecode_checksum(TestInfo testInfo) throws IOException { - doTest(testInfo, "sampleFile.txt", X_AMZ_CHECKSUM_SHA256, Algorithm.SHA256, - "1VcEifAruhjVvjzul4sC0B1EmlUdzqvsp6BP0KSVdTE=", SHA256); - doTest(testInfo, "sampleFile_large.txt", X_AMZ_CHECKSUM_SHA256, Algorithm.SHA256, - "BNNY15scjxN9jPa+AEJ6p08Cfm4BhYOXkhladr4QSTs=", SHA256); - } - - @Test - void testDecode_noChecksum(TestInfo testInfo) throws IOException { - doTest(testInfo, "sampleFile.txt"); - doTest(testInfo, "sampleFile_large.txt"); - } - - void doTest(TestInfo testInfo, String fileName) throws IOException { - doTest(testInfo, fileName, null, null, null, null); - } - - void doTest(TestInfo testInfo, String fileName, String header, Algorithm algorithm, - String checksum, ChecksumAlgorithm checksumAlgorithm) throws IOException { - File sampleFile = getFileFromClasspath(testInfo, fileName); - AwsUnsignedChunkedEncodingInputStream.Builder builder = AwsUnsignedChunkedEncodingInputStream - .builder() - .inputStream(Files.newInputStream(sampleFile.toPath())); - if (algorithm != null) { - builder.sdkChecksum(SdkChecksum.forAlgorithm(algorithm)); - } - InputStream chunkedEncodingInputStream = builder - .checksumHeaderForTrailer(header) - //force chunks in the inputstream - .awsChunkedEncodingConfig(AwsChunkedEncodingConfig.builder().chunkSize(4000).build()) - .build(); - - long decodedLength = sampleFile.length(); - AwsUnsignedChunkedDecodingChecksumInputStream iut = new - AwsUnsignedChunkedDecodingChecksumInputStream(chunkedEncodingInputStream, decodedLength); - - assertThat(iut).hasSameContentAs(Files.newInputStream(sampleFile.toPath())); - assertThat(iut.getAlgorithm()).isEqualTo(checksumAlgorithm); - assertThat(iut.getChecksum()).isEqualTo(checksum); - assertThat(iut.decodedLength).isEqualTo(decodedLength); - assertThat(iut.readDecodedLength).isEqualTo(decodedLength); - } -} diff --git a/server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_large_chunkedEncoded b/server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_large_signed_chunked similarity index 100% rename from server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_large_chunkedEncoded rename to server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_large_signed_chunked diff --git a/server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_larger_unsigned_chunked_checksumCrc32 b/server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_larger_unsigned_chunked_checksumCrc32 new file mode 100644 index 000000000..51a2e2671 --- /dev/null +++ b/server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_larger_unsigned_chunked_checksumCrc32 @@ -0,0 +1,206 @@ +fa0 +## sample test file ## +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. A scelerisque purus semper eget duis at tellus at. Tellus integer feugiat scelerisque varius morbi. Lacus laoreet non curabitur gravida arcu ac tortor. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Ut enim blandit volutpat maecenas. Ipsum dolor sit amet consectetur adipiscing elit. Id ornare arcu odio ut. Convallis tellus id interdum velit laoreet id. Enim ut tellus elementum sagittis vitae et leo duis ut. Eros in cursus turpis massa tincidunt dui ut. In massa tempor nec feugiat nisl pretium fusce id velit. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Eget nunc lobortis mattis aliquam faucibus purus in massa. Vitae suscipit tellus mauris a. Gravida quis blandit turpis cursus in hac. Amet dictum sit amet justo donec enim diam vulputate. Imperdiet massa tincidunt nunc pulvinar sapien et. + +Lacus sed viverra tellus in hac habitasse platea. Donec et odio pellentesque diam volutpat commodo sed egestas. Eget arcu dictum varius duis at consectetur. Arcu felis bibendum ut tristique et egestas. Tellus molestie nunc non blandit massa enim. Risus viverra adipiscing at in tellus integer feugiat scelerisque varius. Risus nec feugiat in fermentum posuere. Cursus sit amet dictum sit amet justo donec enim. Sem integer vitae justo eget magna fermentum iaculis eu. Feugiat vivamus at augue eget arcu dictum. Netus et malesuada fames ac turpis egestas. Aliquam ultrices sagittis orci a scelerisque purus semper. Duis at tellus at urna condimentum. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Volutpat consequat mauris nunc congue nisi vitae suscipit. Sem integer vitae justo eget magna fermentum iaculis eu non. Sagittis purus sit amet volutpat consequat mauris nunc congue. + +Id diam vel quam elementum pulvinar etiam non quam. Eget aliquet nibh praesent tristique magna sit amet purus. Sed euismod nisi porta lorem mollis aliquam ut porttitor. Urna neque viverra justo nec ultrices dui sapien eget mi. Aliquet eget sit amet tellus cras. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Faucibus et molestie ac feugiat sed lectus vestibulum. Semper eget duis at tellus at. Congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Congue nisi vitae suscipit tellus mauris a diam maecenas sed. Purus gravida quis blandit turpis cursus in. Risus nec feugiat in fermentum posuere urna nec tincidunt praesent. Enim eu turpis egestas pretium aenean pharetra magna. Duis convallis convallis tellus id interdum velit laoreet id. + +Eu consequat ac felis donec et odio pellentesque diam volutpat. Cursus eget nunc scelerisque viverra mauris in aliquam sem fringilla. Vitae turpis massa sed elementum tempus egestas sed sed. Ultrices in iaculis nunc sed augue lacus viverra vitae congue. Mauris pellentesque pulvinar pellentesque habitant morbi. Ullamcorper velit sed ullamcorper morbi tincidunt ornare. Sodales ut etiam sit amet nisl purus in mollis nunc. Arcu odio ut sem nulla pharetra diam. Id aliquet risus feugiat in ante. Nibh praesent tristique magna sit amet purus gravida. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis feugiat. + +Arcu vitae elementum curabitur vitae nunc. Et malesuada fames ac turpis egestas integer eget aliquet nibh. Cursus turpis massa tincidunt dui ut ornare lectus. Nulla posuere sollicitudin aliquam ultrices. Nibh praesent tristique magna sit amet. Arcu non sodales neque sodales ut etiam sit amet. Faucibus in ornare quam viverra orci sagittis eu volutpat odio. Eget mi proin sed libero enim sed. Suspendisse faucibus interdum posuere lorem. Congue quisque egestas diam in arcu. Vitae nunc sed velit dignissim. In mollis nunc sed id semper risus in hendrerit. Dictum at tempor commodo ullamcorper a lacus vestibulum. Volutpat lacus laoreet non curabitur gravida arcu ac tortor. Odio ut enim blandit volutpat maecenas. Eget sit +fa0 +amet tellus cras adipiscing enim eu turpis. + +Suspendisse interdum consectetur libero id faucibus nisl tincidunt eget nullam. Eget gravida cum sociis natoque penatibus et magnis. Praesent tristique magna sit amet purus gravida. Fringilla ut morbi tincidunt augue interdum velit euismod in pellentesque. Ipsum dolor sit amet consectetur adipiscing elit pellentesque habitant. Cum sociis natoque penatibus et magnis dis parturient. Sagittis orci a scelerisque purus. Arcu dui vivamus arcu felis bibendum ut. Nisl condimentum id venenatis a condimentum vitae sapien pellentesque habitant. Dolor magna eget est lorem ipsum dolor sit amet consectetur. Suspendisse ultrices gravida dictum fusce. Nec feugiat nisl pretium fusce id. Sit amet commodo nulla facilisi nullam vehicula ipsum. At imperdiet dui accumsan sit. Metus vulputate eu scelerisque felis imperdiet. + +Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper. Id semper risus in hendrerit gravida. Libero nunc consequat interdum varius sit amet mattis. Dui sapien eget mi proin sed libero. Integer feugiat scelerisque varius morbi enim nunc faucibus. At ultrices mi tempus imperdiet nulla malesuada pellentesque. Condimentum id venenatis a condimentum. Sit amet nulla facilisi morbi tempus. Sed sed risus pretium quam vulputate dignissim suspendisse in est. Nisl nunc mi ipsum faucibus vitae aliquet. Lorem ipsum dolor sit amet. Pharetra magna ac placerat vestibulum lectus. Semper risus in hendrerit gravida rutrum quisque non tellus orci. Pellentesque adipiscing commodo elit at imperdiet dui. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. Ac tincidunt vitae semper quis lectus nulla. + +Sit amet venenatis urna cursus eget nunc scelerisque viverra. Leo duis ut diam quam nulla. In ante metus dictum at tempor commodo ullamcorper a lacus. Faucibus vitae aliquet nec ullamcorper sit. Maecenas ultricies mi eget mauris pharetra et ultrices neque. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed risus ultricies tristique nulla aliquet enim tortor at. Cursus risus at ultrices mi tempus imperdiet nulla malesuada. Cras pulvinar mattis nunc sed. Lectus nulla at volutpat diam ut venenatis tellus in metus. Odio pellentesque diam volutpat commodo sed egestas egestas. Tempus urna et pharetra pharetra massa massa ultricies. Nec sagittis aliquam malesuada bibendum. Dui nunc mattis enim ut. Venenatis cras sed felis eget velit aliquet sagittis. Commodo elit at imperdiet dui accumsan sit amet nulla. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Tempus imperdiet nulla malesuada pellentesque elit. + +Diam in arcu cursus euismod. Placerat duis ultricies lacus sed turpis. Lorem ipsum dolor sit amet. Non arcu risus quis varius. Morbi quis commodo odio aenean sed adipiscing. Fusce ut placerat orci nulla pellentesque dignissim enim. Aenean sed adipiscing diam donec adipiscing. Porta non pulvinar neque laoreet suspendisse. Dui accumsan sit amet nulla. Ultrices dui sapien eget mi proin. Nisl suscipit adipiscing bibendum est ultricies integer. + +Vitae tempus quam pellentesque nec nam aliquam sem et. Cum sociis natoque penatibus et. Nisl condimentum id venenatis a. Libero justo laoreet sit amet cursus sit amet. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Nisi vitae suscipit tellus mauris a. Nec ultrices dui sapien eget. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Diam ut venenatis tellus in. Enim ut sem viverra aliquet eget sit amet tellus. Donec et odio pellentesque diam volutpat commodo. Sapien faucibus et molestie ac feugiat sed. Amet mattis vulputate enim nulla aliquet porttitor lacus. Enim nunc faucibus a pellentesque. + +At elementum eu facilisis sed odio morbi. Nisl rhoncus mattis rhoncus urna neque +fa0 + viverra justo. Lacus laoreet non curabitur gravida. Libero id faucibus nisl tincidunt eget nullam non nisi est. Aliquet risus feugiat in ante metus dictum at tempor. Montes nascetur ridiculus mus mauris vitae ultricies leo integer malesuada. Imperdiet nulla malesuada pellentesque elit eget. Tempus urna et pharetra pharetra. Nunc sed augue lacus viverra vitae congue. Viverra adipiscing at in tellus integer. Volutpat sed cras ornare arcu. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Turpis egestas maecenas pharetra convallis posuere morbi. + +Purus sit amet luctus venenatis lectus magna fringilla urna porttitor. Tellus in metus vulputate eu scelerisque felis imperdiet proin. Nibh ipsum consequat nisl vel pretium lectus quam. Metus dictum at tempor commodo. Ut tristique et egestas quis ipsum suspendisse ultrices gravida. Est ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Rutrum tellus pellentesque eu tincidunt tortor. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor. Sed libero enim sed faucibus turpis in eu. Pellentesque massa placerat duis ultricies. Ut venenatis tellus in metus vulputate. Urna duis convallis convallis tellus id interdum. Lectus sit amet est placerat in. Sem fringilla ut morbi tincidunt augue interdum velit euismod in. Velit dignissim sodales ut eu. Sit amet massa vitae tortor. Dignissim sodales ut eu sem integer vitae. + +Condimentum mattis pellentesque id nibh tortor id aliquet lectus proin. Amet venenatis urna cursus eget nunc scelerisque viverra. Quam elementum pulvinar etiam non quam lacus suspendisse. Aenean sed adipiscing diam donec adipiscing. Nibh cras pulvinar mattis nunc sed blandit libero. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor elit. Sit amet aliquam id diam maecenas ultricies mi eget mauris. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Quis ipsum suspendisse ultrices gravida dictum. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc. Semper viverra nam libero justo laoreet sit amet. Molestie a iaculis at erat pellentesque adipiscing commodo. Condimentum lacinia quis vel eros. Proin libero nunc consequat interdum varius sit. Eu volutpat odio facilisis mauris sit amet massa. Porttitor rhoncus dolor purus non enim praesent. Augue interdum velit euismod in pellentesque massa. + +Vitae nunc sed velit dignissim sodales ut eu. Sit amet facilisis magna etiam tempor. Cursus euismod quis viverra nibh. Neque volutpat ac tincidunt vitae semper quis lectus nulla at. Eu facilisis sed odio morbi quis commodo odio aenean. Sollicitudin nibh sit amet commodo nulla facilisi. Tincidunt lobortis feugiat vivamus at augue eget arcu dictum. Ipsum dolor sit amet consectetur. Sed risus pretium quam vulputate dignissim suspendisse in est ante. Feugiat nibh sed pulvinar proin. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. Varius quam quisque id diam vel quam elementum pulvinar. Enim sit amet venenatis urna cursus eget. Posuere urna nec tincidunt praesent semper. Facilisi nullam vehicula ipsum a arcu cursus vitae congue mauris. + +Et magnis dis parturient montes nascetur ridiculus mus mauris. Interdum varius sit amet mattis vulputate. Velit scelerisque in dictum non consectetur a. Ultrices vitae auctor eu augue ut. Donec ultrices tincidunt arcu non sodales neque. Enim praesent elementum facilisis leo vel fringilla est. Et magnis dis parturient montes nascetur ridiculus mus mauris. Tincidunt praesent semper feugiat nibh sed. Nulla pellentesque dignissim enim sit amet venenatis urna. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Imperdiet dui accumsan sit amet. Eget nulla facilisi etiam dignissim diam. Tempor orci eu lobortis elementum nibh tellus molestie. Eget nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. A cras semper auctor neque vitae tempus quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Quisque sagittis purus sit amet. In t +fa0 +ellus integer feugiat scelerisque varius. Amet facilisis magna etiam tempor orci eu. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Ipsum dolor sit amet consectetur adipiscing elit pellentesque. Id venenatis a condimentum vitae sapien pellentesque habitant morbi. Vitae tempus quam pellentesque nec nam aliquam. Senectus et netus et malesuada fames. Pretium quam vulputate dignissim suspendisse in est ante in nibh. In iaculis nunc sed augue lacus viverra vitae congue eu. Rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt. Senectus et netus et malesuada fames ac turpis egestas. + +Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Ultrices sagittis orci a scelerisque purus semper. Aliquam purus sit amet luctus venenatis lectus magna fringilla urna. Duis convallis convallis tellus id interdum velit laoreet id. Diam vulputate ut pharetra sit amet aliquam id diam. Ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Ac feugiat sed lectus vestibulum mattis ullamcorper. Faucibus purus in massa tempor nec feugiat nisl pretium fusce. Cras ornare arcu dui vivamus arcu. Tempor orci eu lobortis elementum nibh tellus molestie nunc. Mi proin sed libero enim sed faucibus turpis. Elit duis tristique sollicitudin nibh sit. Sed adipiscing diam donec adipiscing tristique risus nec feugiat. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Mauris vitae ultricies leo integer. Consectetur lorem donec massa sapien faucibus. Lectus arcu bibendum at varius. + +Non quam lacus suspendisse faucibus. Morbi tincidunt ornare massa eget egestas purus viverra accumsan. Lorem sed risus ultricies tristique nulla aliquet. Tortor condimentum lacinia quis vel. Phasellus faucibus scelerisque eleifend donec pretium. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus est. Fermentum iaculis eu non diam phasellus vestibulum lorem sed. In cursus turpis massa tincidunt dui. Cum sociis natoque penatibus et. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Duis at consectetur lorem donec. Volutpat blandit aliquam etiam erat velit scelerisque. Elit duis tristique sollicitudin nibh sit amet. Quis viverra nibh cras pulvinar mattis nunc. Sapien pellentesque habitant morbi tristique senectus et netus et malesuada. Nibh cras pulvinar mattis nunc. Eleifend donec pretium vulputate sapien nec sagittis. + +Nullam ac tortor vitae purus. Ut sem nulla pharetra diam sit amet nisl suscipit adipiscing. Amet facilisis magna etiam tempor. Vitae nunc sed velit dignissim sodales ut eu sem integer. Sem fringilla ut morbi tincidunt augue interdum velit euismod. Morbi non arcu risus quis. Ut sem nulla pharetra diam. Est velit egestas dui id. Sed felis eget velit aliquet sagittis id consectetur purus ut. Sollicitudin aliquam ultrices sagittis orci a scelerisque. Scelerisque purus semper eget duis at tellus at urna. Ac placerat vestibulum lectus mauris ultrices eros in. Pulvinar pellentesque habitant morbi tristique senectus. + +Convallis a cras semper auctor neque vitae tempus quam. Consequat ac felis donec et odio pellentesque diam. Penatibus et magnis dis parturient montes nascetur. Vitae purus faucibus ornare suspendisse sed nisi. Nibh venenatis cras sed felis eget velit. Cursus vitae congue mauris rhoncus aenean vel elit. Elit at imperdiet dui accumsan sit amet. Ultrices eros in cursus turpis massa tincidunt. Molestie nunc non blandit massa. Ridiculus mus mauris vitae ultricies leo integer. Cras fermentum odio eu feugiat pretium nibh. Nulla facilisi etiam dignissim diam. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat est. Non quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Magna sit amet purus gravida quis blandit turpis cursus in. Non sodales neque sodales ut etiam sit amet. Morbi quis commodo odio aenean sed adipiscing diam. Ullamcorper velit sed ullamcorper morbi. Ipsum consequat nisl vel pretium. + +demo=content + +## sample test file ## +Lorem ipsum dolor +fa0 + sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. A scelerisque purus semper eget duis at tellus at. Tellus integer feugiat scelerisque varius morbi. Lacus laoreet non curabitur gravida arcu ac tortor. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Ut enim blandit volutpat maecenas. Ipsum dolor sit amet consectetur adipiscing elit. Id ornare arcu odio ut. Convallis tellus id interdum velit laoreet id. Enim ut tellus elementum sagittis vitae et leo duis ut. Eros in cursus turpis massa tincidunt dui ut. In massa tempor nec feugiat nisl pretium fusce id velit. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Eget nunc lobortis mattis aliquam faucibus purus in massa. Vitae suscipit tellus mauris a. Gravida quis blandit turpis cursus in hac. Amet dictum sit amet justo donec enim diam vulputate. Imperdiet massa tincidunt nunc pulvinar sapien et. + +Lacus sed viverra tellus in hac habitasse platea. Donec et odio pellentesque diam volutpat commodo sed egestas. Eget arcu dictum varius duis at consectetur. Arcu felis bibendum ut tristique et egestas. Tellus molestie nunc non blandit massa enim. Risus viverra adipiscing at in tellus integer feugiat scelerisque varius. Risus nec feugiat in fermentum posuere. Cursus sit amet dictum sit amet justo donec enim. Sem integer vitae justo eget magna fermentum iaculis eu. Feugiat vivamus at augue eget arcu dictum. Netus et malesuada fames ac turpis egestas. Aliquam ultrices sagittis orci a scelerisque purus semper. Duis at tellus at urna condimentum. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Volutpat consequat mauris nunc congue nisi vitae suscipit. Sem integer vitae justo eget magna fermentum iaculis eu non. Sagittis purus sit amet volutpat consequat mauris nunc congue. + +Id diam vel quam elementum pulvinar etiam non quam. Eget aliquet nibh praesent tristique magna sit amet purus. Sed euismod nisi porta lorem mollis aliquam ut porttitor. Urna neque viverra justo nec ultrices dui sapien eget mi. Aliquet eget sit amet tellus cras. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Faucibus et molestie ac feugiat sed lectus vestibulum. Semper eget duis at tellus at. Congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Congue nisi vitae suscipit tellus mauris a diam maecenas sed. Purus gravida quis blandit turpis cursus in. Risus nec feugiat in fermentum posuere urna nec tincidunt praesent. Enim eu turpis egestas pretium aenean pharetra magna. Duis convallis convallis tellus id interdum velit laoreet id. + +Eu consequat ac felis donec et odio pellentesque diam volutpat. Cursus eget nunc scelerisque viverra mauris in aliquam sem fringilla. Vitae turpis massa sed elementum tempus egestas sed sed. Ultrices in iaculis nunc sed augue lacus viverra vitae congue. Mauris pellentesque pulvinar pellentesque habitant morbi. Ullamcorper velit sed ullamcorper morbi tincidunt ornare. Sodales ut etiam sit amet nisl purus in mollis nunc. Arcu odio ut sem nulla pharetra diam. Id aliquet risus feugiat in ante. Nibh praesent tristique magna sit amet purus gravida. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis feugiat. + +Arcu vitae elementum curabitur vitae nunc. Et malesuada fames ac turpis egestas integer eget aliquet nibh. Cursus turpis massa tincidunt dui ut ornare lectus. Nulla posuere sollicitudin aliquam ultrices. Nibh praesent tristique magna sit amet. Arcu non sodales neque sodales ut etiam sit amet. Faucibus in ornare quam viverra orci sagittis eu volutpat odio. Eget mi proin sed libero enim sed. Suspendisse faucibus interdum posuere lorem. Congue quisque egestas diam in arcu. Vitae nunc sed velit dignissim. In mollis nunc sed id semper risus in hendrerit. Dictum at tempor commodo ullamcorper a lacus vestibulum. Volutpat lacus laoreet non curabitur gravida arcu ac tortor. Odio ut enim blandit volutpat maecenas. Eget sit amet tellus cras adipiscing enim eu turp +fa0 +is. + +Suspendisse interdum consectetur libero id faucibus nisl tincidunt eget nullam. Eget gravida cum sociis natoque penatibus et magnis. Praesent tristique magna sit amet purus gravida. Fringilla ut morbi tincidunt augue interdum velit euismod in pellentesque. Ipsum dolor sit amet consectetur adipiscing elit pellentesque habitant. Cum sociis natoque penatibus et magnis dis parturient. Sagittis orci a scelerisque purus. Arcu dui vivamus arcu felis bibendum ut. Nisl condimentum id venenatis a condimentum vitae sapien pellentesque habitant. Dolor magna eget est lorem ipsum dolor sit amet consectetur. Suspendisse ultrices gravida dictum fusce. Nec feugiat nisl pretium fusce id. Sit amet commodo nulla facilisi nullam vehicula ipsum. At imperdiet dui accumsan sit. Metus vulputate eu scelerisque felis imperdiet. + +Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper. Id semper risus in hendrerit gravida. Libero nunc consequat interdum varius sit amet mattis. Dui sapien eget mi proin sed libero. Integer feugiat scelerisque varius morbi enim nunc faucibus. At ultrices mi tempus imperdiet nulla malesuada pellentesque. Condimentum id venenatis a condimentum. Sit amet nulla facilisi morbi tempus. Sed sed risus pretium quam vulputate dignissim suspendisse in est. Nisl nunc mi ipsum faucibus vitae aliquet. Lorem ipsum dolor sit amet. Pharetra magna ac placerat vestibulum lectus. Semper risus in hendrerit gravida rutrum quisque non tellus orci. Pellentesque adipiscing commodo elit at imperdiet dui. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. Ac tincidunt vitae semper quis lectus nulla. + +Sit amet venenatis urna cursus eget nunc scelerisque viverra. Leo duis ut diam quam nulla. In ante metus dictum at tempor commodo ullamcorper a lacus. Faucibus vitae aliquet nec ullamcorper sit. Maecenas ultricies mi eget mauris pharetra et ultrices neque. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed risus ultricies tristique nulla aliquet enim tortor at. Cursus risus at ultrices mi tempus imperdiet nulla malesuada. Cras pulvinar mattis nunc sed. Lectus nulla at volutpat diam ut venenatis tellus in metus. Odio pellentesque diam volutpat commodo sed egestas egestas. Tempus urna et pharetra pharetra massa massa ultricies. Nec sagittis aliquam malesuada bibendum. Dui nunc mattis enim ut. Venenatis cras sed felis eget velit aliquet sagittis. Commodo elit at imperdiet dui accumsan sit amet nulla. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Tempus imperdiet nulla malesuada pellentesque elit. + +Diam in arcu cursus euismod. Placerat duis ultricies lacus sed turpis. Lorem ipsum dolor sit amet. Non arcu risus quis varius. Morbi quis commodo odio aenean sed adipiscing. Fusce ut placerat orci nulla pellentesque dignissim enim. Aenean sed adipiscing diam donec adipiscing. Porta non pulvinar neque laoreet suspendisse. Dui accumsan sit amet nulla. Ultrices dui sapien eget mi proin. Nisl suscipit adipiscing bibendum est ultricies integer. + +Vitae tempus quam pellentesque nec nam aliquam sem et. Cum sociis natoque penatibus et. Nisl condimentum id venenatis a. Libero justo laoreet sit amet cursus sit amet. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Nisi vitae suscipit tellus mauris a. Nec ultrices dui sapien eget. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Diam ut venenatis tellus in. Enim ut sem viverra aliquet eget sit amet tellus. Donec et odio pellentesque diam volutpat commodo. Sapien faucibus et molestie ac feugiat sed. Amet mattis vulputate enim nulla aliquet porttitor lacus. Enim nunc faucibus a pellentesque. + +At elementum eu facilisis sed odio morbi. Nisl rhoncus mattis rhoncus urna neque viverra justo. Lacus laoreet non curabi +fa0 +tur gravida. Libero id faucibus nisl tincidunt eget nullam non nisi est. Aliquet risus feugiat in ante metus dictum at tempor. Montes nascetur ridiculus mus mauris vitae ultricies leo integer malesuada. Imperdiet nulla malesuada pellentesque elit eget. Tempus urna et pharetra pharetra. Nunc sed augue lacus viverra vitae congue. Viverra adipiscing at in tellus integer. Volutpat sed cras ornare arcu. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Turpis egestas maecenas pharetra convallis posuere morbi. + +Purus sit amet luctus venenatis lectus magna fringilla urna porttitor. Tellus in metus vulputate eu scelerisque felis imperdiet proin. Nibh ipsum consequat nisl vel pretium lectus quam. Metus dictum at tempor commodo. Ut tristique et egestas quis ipsum suspendisse ultrices gravida. Est ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Rutrum tellus pellentesque eu tincidunt tortor. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor. Sed libero enim sed faucibus turpis in eu. Pellentesque massa placerat duis ultricies. Ut venenatis tellus in metus vulputate. Urna duis convallis convallis tellus id interdum. Lectus sit amet est placerat in. Sem fringilla ut morbi tincidunt augue interdum velit euismod in. Velit dignissim sodales ut eu. Sit amet massa vitae tortor. Dignissim sodales ut eu sem integer vitae. + +Condimentum mattis pellentesque id nibh tortor id aliquet lectus proin. Amet venenatis urna cursus eget nunc scelerisque viverra. Quam elementum pulvinar etiam non quam lacus suspendisse. Aenean sed adipiscing diam donec adipiscing. Nibh cras pulvinar mattis nunc sed blandit libero. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor elit. Sit amet aliquam id diam maecenas ultricies mi eget mauris. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Quis ipsum suspendisse ultrices gravida dictum. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc. Semper viverra nam libero justo laoreet sit amet. Molestie a iaculis at erat pellentesque adipiscing commodo. Condimentum lacinia quis vel eros. Proin libero nunc consequat interdum varius sit. Eu volutpat odio facilisis mauris sit amet massa. Porttitor rhoncus dolor purus non enim praesent. Augue interdum velit euismod in pellentesque massa. + +Vitae nunc sed velit dignissim sodales ut eu. Sit amet facilisis magna etiam tempor. Cursus euismod quis viverra nibh. Neque volutpat ac tincidunt vitae semper quis lectus nulla at. Eu facilisis sed odio morbi quis commodo odio aenean. Sollicitudin nibh sit amet commodo nulla facilisi. Tincidunt lobortis feugiat vivamus at augue eget arcu dictum. Ipsum dolor sit amet consectetur. Sed risus pretium quam vulputate dignissim suspendisse in est ante. Feugiat nibh sed pulvinar proin. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. Varius quam quisque id diam vel quam elementum pulvinar. Enim sit amet venenatis urna cursus eget. Posuere urna nec tincidunt praesent semper. Facilisi nullam vehicula ipsum a arcu cursus vitae congue mauris. + +Et magnis dis parturient montes nascetur ridiculus mus mauris. Interdum varius sit amet mattis vulputate. Velit scelerisque in dictum non consectetur a. Ultrices vitae auctor eu augue ut. Donec ultrices tincidunt arcu non sodales neque. Enim praesent elementum facilisis leo vel fringilla est. Et magnis dis parturient montes nascetur ridiculus mus mauris. Tincidunt praesent semper feugiat nibh sed. Nulla pellentesque dignissim enim sit amet venenatis urna. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Imperdiet dui accumsan sit amet. Eget nulla facilisi etiam dignissim diam. Tempor orci eu lobortis elementum nibh tellus molestie. Eget nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. A cras semper auctor neque vitae tempus quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Quisque sagittis purus sit amet. In tellus integer feugiat scelerisque varius +fa0 +. Amet facilisis magna etiam tempor orci eu. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Ipsum dolor sit amet consectetur adipiscing elit pellentesque. Id venenatis a condimentum vitae sapien pellentesque habitant morbi. Vitae tempus quam pellentesque nec nam aliquam. Senectus et netus et malesuada fames. Pretium quam vulputate dignissim suspendisse in est ante in nibh. In iaculis nunc sed augue lacus viverra vitae congue eu. Rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt. Senectus et netus et malesuada fames ac turpis egestas. + +Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Ultrices sagittis orci a scelerisque purus semper. Aliquam purus sit amet luctus venenatis lectus magna fringilla urna. Duis convallis convallis tellus id interdum velit laoreet id. Diam vulputate ut pharetra sit amet aliquam id diam. Ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Ac feugiat sed lectus vestibulum mattis ullamcorper. Faucibus purus in massa tempor nec feugiat nisl pretium fusce. Cras ornare arcu dui vivamus arcu. Tempor orci eu lobortis elementum nibh tellus molestie nunc. Mi proin sed libero enim sed faucibus turpis. Elit duis tristique sollicitudin nibh sit. Sed adipiscing diam donec adipiscing tristique risus nec feugiat. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Mauris vitae ultricies leo integer. Consectetur lorem donec massa sapien faucibus. Lectus arcu bibendum at varius. + +Non quam lacus suspendisse faucibus. Morbi tincidunt ornare massa eget egestas purus viverra accumsan. Lorem sed risus ultricies tristique nulla aliquet. Tortor condimentum lacinia quis vel. Phasellus faucibus scelerisque eleifend donec pretium. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus est. Fermentum iaculis eu non diam phasellus vestibulum lorem sed. In cursus turpis massa tincidunt dui. Cum sociis natoque penatibus et. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Duis at consectetur lorem donec. Volutpat blandit aliquam etiam erat velit scelerisque. Elit duis tristique sollicitudin nibh sit amet. Quis viverra nibh cras pulvinar mattis nunc. Sapien pellentesque habitant morbi tristique senectus et netus et malesuada. Nibh cras pulvinar mattis nunc. Eleifend donec pretium vulputate sapien nec sagittis. + +Nullam ac tortor vitae purus. Ut sem nulla pharetra diam sit amet nisl suscipit adipiscing. Amet facilisis magna etiam tempor. Vitae nunc sed velit dignissim sodales ut eu sem integer. Sem fringilla ut morbi tincidunt augue interdum velit euismod. Morbi non arcu risus quis. Ut sem nulla pharetra diam. Est velit egestas dui id. Sed felis eget velit aliquet sagittis id consectetur purus ut. Sollicitudin aliquam ultrices sagittis orci a scelerisque. Scelerisque purus semper eget duis at tellus at urna. Ac placerat vestibulum lectus mauris ultrices eros in. Pulvinar pellentesque habitant morbi tristique senectus. + +Convallis a cras semper auctor neque vitae tempus quam. Consequat ac felis donec et odio pellentesque diam. Penatibus et magnis dis parturient montes nascetur. Vitae purus faucibus ornare suspendisse sed nisi. Nibh venenatis cras sed felis eget velit. Cursus vitae congue mauris rhoncus aenean vel elit. Elit at imperdiet dui accumsan sit amet. Ultrices eros in cursus turpis massa tincidunt. Molestie nunc non blandit massa. Ridiculus mus mauris vitae ultricies leo integer. Cras fermentum odio eu feugiat pretium nibh. Nulla facilisi etiam dignissim diam. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat est. Non quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Magna sit amet purus gravida quis blandit turpis cursus in. Non sodales neque sodales ut etiam sit amet. Morbi quis commodo odio aenean sed adipiscing diam. Ullamcorper velit sed ullamcorper morbi. Ipsum consequat nisl vel pretium. + +demo=content + +## sample test file ## +Lorem ipsum dolor sit amet, consectetur adipiscing elit, +fa0 +sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. A scelerisque purus semper eget duis at tellus at. Tellus integer feugiat scelerisque varius morbi. Lacus laoreet non curabitur gravida arcu ac tortor. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Ut enim blandit volutpat maecenas. Ipsum dolor sit amet consectetur adipiscing elit. Id ornare arcu odio ut. Convallis tellus id interdum velit laoreet id. Enim ut tellus elementum sagittis vitae et leo duis ut. Eros in cursus turpis massa tincidunt dui ut. In massa tempor nec feugiat nisl pretium fusce id velit. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Eget nunc lobortis mattis aliquam faucibus purus in massa. Vitae suscipit tellus mauris a. Gravida quis blandit turpis cursus in hac. Amet dictum sit amet justo donec enim diam vulputate. Imperdiet massa tincidunt nunc pulvinar sapien et. + +Lacus sed viverra tellus in hac habitasse platea. Donec et odio pellentesque diam volutpat commodo sed egestas. Eget arcu dictum varius duis at consectetur. Arcu felis bibendum ut tristique et egestas. Tellus molestie nunc non blandit massa enim. Risus viverra adipiscing at in tellus integer feugiat scelerisque varius. Risus nec feugiat in fermentum posuere. Cursus sit amet dictum sit amet justo donec enim. Sem integer vitae justo eget magna fermentum iaculis eu. Feugiat vivamus at augue eget arcu dictum. Netus et malesuada fames ac turpis egestas. Aliquam ultrices sagittis orci a scelerisque purus semper. Duis at tellus at urna condimentum. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Volutpat consequat mauris nunc congue nisi vitae suscipit. Sem integer vitae justo eget magna fermentum iaculis eu non. Sagittis purus sit amet volutpat consequat mauris nunc congue. + +Id diam vel quam elementum pulvinar etiam non quam. Eget aliquet nibh praesent tristique magna sit amet purus. Sed euismod nisi porta lorem mollis aliquam ut porttitor. Urna neque viverra justo nec ultrices dui sapien eget mi. Aliquet eget sit amet tellus cras. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Faucibus et molestie ac feugiat sed lectus vestibulum. Semper eget duis at tellus at. Congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Congue nisi vitae suscipit tellus mauris a diam maecenas sed. Purus gravida quis blandit turpis cursus in. Risus nec feugiat in fermentum posuere urna nec tincidunt praesent. Enim eu turpis egestas pretium aenean pharetra magna. Duis convallis convallis tellus id interdum velit laoreet id. + +Eu consequat ac felis donec et odio pellentesque diam volutpat. Cursus eget nunc scelerisque viverra mauris in aliquam sem fringilla. Vitae turpis massa sed elementum tempus egestas sed sed. Ultrices in iaculis nunc sed augue lacus viverra vitae congue. Mauris pellentesque pulvinar pellentesque habitant morbi. Ullamcorper velit sed ullamcorper morbi tincidunt ornare. Sodales ut etiam sit amet nisl purus in mollis nunc. Arcu odio ut sem nulla pharetra diam. Id aliquet risus feugiat in ante. Nibh praesent tristique magna sit amet purus gravida. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis feugiat. + +Arcu vitae elementum curabitur vitae nunc. Et malesuada fames ac turpis egestas integer eget aliquet nibh. Cursus turpis massa tincidunt dui ut ornare lectus. Nulla posuere sollicitudin aliquam ultrices. Nibh praesent tristique magna sit amet. Arcu non sodales neque sodales ut etiam sit amet. Faucibus in ornare quam viverra orci sagittis eu volutpat odio. Eget mi proin sed libero enim sed. Suspendisse faucibus interdum posuere lorem. Congue quisque egestas diam in arcu. Vitae nunc sed velit dignissim. In mollis nunc sed id semper risus in hendrerit. Dictum at tempor commodo ullamcorper a lacus vestibulum. Volutpat lacus laoreet non curabitur gravida arcu ac tortor. Odio ut enim blandit volutpat maecenas. Eget sit amet tellus cras adipiscing enim eu turpis. + +Suspendisse interdum consectetur li +fa0 +bero id faucibus nisl tincidunt eget nullam. Eget gravida cum sociis natoque penatibus et magnis. Praesent tristique magna sit amet purus gravida. Fringilla ut morbi tincidunt augue interdum velit euismod in pellentesque. Ipsum dolor sit amet consectetur adipiscing elit pellentesque habitant. Cum sociis natoque penatibus et magnis dis parturient. Sagittis orci a scelerisque purus. Arcu dui vivamus arcu felis bibendum ut. Nisl condimentum id venenatis a condimentum vitae sapien pellentesque habitant. Dolor magna eget est lorem ipsum dolor sit amet consectetur. Suspendisse ultrices gravida dictum fusce. Nec feugiat nisl pretium fusce id. Sit amet commodo nulla facilisi nullam vehicula ipsum. At imperdiet dui accumsan sit. Metus vulputate eu scelerisque felis imperdiet. + +Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper. Id semper risus in hendrerit gravida. Libero nunc consequat interdum varius sit amet mattis. Dui sapien eget mi proin sed libero. Integer feugiat scelerisque varius morbi enim nunc faucibus. At ultrices mi tempus imperdiet nulla malesuada pellentesque. Condimentum id venenatis a condimentum. Sit amet nulla facilisi morbi tempus. Sed sed risus pretium quam vulputate dignissim suspendisse in est. Nisl nunc mi ipsum faucibus vitae aliquet. Lorem ipsum dolor sit amet. Pharetra magna ac placerat vestibulum lectus. Semper risus in hendrerit gravida rutrum quisque non tellus orci. Pellentesque adipiscing commodo elit at imperdiet dui. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. Ac tincidunt vitae semper quis lectus nulla. + +Sit amet venenatis urna cursus eget nunc scelerisque viverra. Leo duis ut diam quam nulla. In ante metus dictum at tempor commodo ullamcorper a lacus. Faucibus vitae aliquet nec ullamcorper sit. Maecenas ultricies mi eget mauris pharetra et ultrices neque. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed risus ultricies tristique nulla aliquet enim tortor at. Cursus risus at ultrices mi tempus imperdiet nulla malesuada. Cras pulvinar mattis nunc sed. Lectus nulla at volutpat diam ut venenatis tellus in metus. Odio pellentesque diam volutpat commodo sed egestas egestas. Tempus urna et pharetra pharetra massa massa ultricies. Nec sagittis aliquam malesuada bibendum. Dui nunc mattis enim ut. Venenatis cras sed felis eget velit aliquet sagittis. Commodo elit at imperdiet dui accumsan sit amet nulla. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Tempus imperdiet nulla malesuada pellentesque elit. + +Diam in arcu cursus euismod. Placerat duis ultricies lacus sed turpis. Lorem ipsum dolor sit amet. Non arcu risus quis varius. Morbi quis commodo odio aenean sed adipiscing. Fusce ut placerat orci nulla pellentesque dignissim enim. Aenean sed adipiscing diam donec adipiscing. Porta non pulvinar neque laoreet suspendisse. Dui accumsan sit amet nulla. Ultrices dui sapien eget mi proin. Nisl suscipit adipiscing bibendum est ultricies integer. + +Vitae tempus quam pellentesque nec nam aliquam sem et. Cum sociis natoque penatibus et. Nisl condimentum id venenatis a. Libero justo laoreet sit amet cursus sit amet. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Nisi vitae suscipit tellus mauris a. Nec ultrices dui sapien eget. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Diam ut venenatis tellus in. Enim ut sem viverra aliquet eget sit amet tellus. Donec et odio pellentesque diam volutpat commodo. Sapien faucibus et molestie ac feugiat sed. Amet mattis vulputate enim nulla aliquet porttitor lacus. Enim nunc faucibus a pellentesque. + +At elementum eu facilisis sed odio morbi. Nisl rhoncus mattis rhoncus urna neque viverra justo. Lacus laoreet non curabitur gravida. Libero id faucibus nisl tin +fa0 +cidunt eget nullam non nisi est. Aliquet risus feugiat in ante metus dictum at tempor. Montes nascetur ridiculus mus mauris vitae ultricies leo integer malesuada. Imperdiet nulla malesuada pellentesque elit eget. Tempus urna et pharetra pharetra. Nunc sed augue lacus viverra vitae congue. Viverra adipiscing at in tellus integer. Volutpat sed cras ornare arcu. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Turpis egestas maecenas pharetra convallis posuere morbi. + +Purus sit amet luctus venenatis lectus magna fringilla urna porttitor. Tellus in metus vulputate eu scelerisque felis imperdiet proin. Nibh ipsum consequat nisl vel pretium lectus quam. Metus dictum at tempor commodo. Ut tristique et egestas quis ipsum suspendisse ultrices gravida. Est ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Rutrum tellus pellentesque eu tincidunt tortor. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor. Sed libero enim sed faucibus turpis in eu. Pellentesque massa placerat duis ultricies. Ut venenatis tellus in metus vulputate. Urna duis convallis convallis tellus id interdum. Lectus sit amet est placerat in. Sem fringilla ut morbi tincidunt augue interdum velit euismod in. Velit dignissim sodales ut eu. Sit amet massa vitae tortor. Dignissim sodales ut eu sem integer vitae. + +Condimentum mattis pellentesque id nibh tortor id aliquet lectus proin. Amet venenatis urna cursus eget nunc scelerisque viverra. Quam elementum pulvinar etiam non quam lacus suspendisse. Aenean sed adipiscing diam donec adipiscing. Nibh cras pulvinar mattis nunc sed blandit libero. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor elit. Sit amet aliquam id diam maecenas ultricies mi eget mauris. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Quis ipsum suspendisse ultrices gravida dictum. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc. Semper viverra nam libero justo laoreet sit amet. Molestie a iaculis at erat pellentesque adipiscing commodo. Condimentum lacinia quis vel eros. Proin libero nunc consequat interdum varius sit. Eu volutpat odio facilisis mauris sit amet massa. Porttitor rhoncus dolor purus non enim praesent. Augue interdum velit euismod in pellentesque massa. + +Vitae nunc sed velit dignissim sodales ut eu. Sit amet facilisis magna etiam tempor. Cursus euismod quis viverra nibh. Neque volutpat ac tincidunt vitae semper quis lectus nulla at. Eu facilisis sed odio morbi quis commodo odio aenean. Sollicitudin nibh sit amet commodo nulla facilisi. Tincidunt lobortis feugiat vivamus at augue eget arcu dictum. Ipsum dolor sit amet consectetur. Sed risus pretium quam vulputate dignissim suspendisse in est ante. Feugiat nibh sed pulvinar proin. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. Varius quam quisque id diam vel quam elementum pulvinar. Enim sit amet venenatis urna cursus eget. Posuere urna nec tincidunt praesent semper. Facilisi nullam vehicula ipsum a arcu cursus vitae congue mauris. + +Et magnis dis parturient montes nascetur ridiculus mus mauris. Interdum varius sit amet mattis vulputate. Velit scelerisque in dictum non consectetur a. Ultrices vitae auctor eu augue ut. Donec ultrices tincidunt arcu non sodales neque. Enim praesent elementum facilisis leo vel fringilla est. Et magnis dis parturient montes nascetur ridiculus mus mauris. Tincidunt praesent semper feugiat nibh sed. Nulla pellentesque dignissim enim sit amet venenatis urna. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Imperdiet dui accumsan sit amet. Eget nulla facilisi etiam dignissim diam. Tempor orci eu lobortis elementum nibh tellus molestie. Eget nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. A cras semper auctor neque vitae tempus quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Quisque sagittis purus sit amet. In tellus integer feugiat scelerisque varius. Amet facilisis magna etiam tempor orci +fa0 + eu. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Ipsum dolor sit amet consectetur adipiscing elit pellentesque. Id venenatis a condimentum vitae sapien pellentesque habitant morbi. Vitae tempus quam pellentesque nec nam aliquam. Senectus et netus et malesuada fames. Pretium quam vulputate dignissim suspendisse in est ante in nibh. In iaculis nunc sed augue lacus viverra vitae congue eu. Rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt. Senectus et netus et malesuada fames ac turpis egestas. + +Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Ultrices sagittis orci a scelerisque purus semper. Aliquam purus sit amet luctus venenatis lectus magna fringilla urna. Duis convallis convallis tellus id interdum velit laoreet id. Diam vulputate ut pharetra sit amet aliquam id diam. Ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Ac feugiat sed lectus vestibulum mattis ullamcorper. Faucibus purus in massa tempor nec feugiat nisl pretium fusce. Cras ornare arcu dui vivamus arcu. Tempor orci eu lobortis elementum nibh tellus molestie nunc. Mi proin sed libero enim sed faucibus turpis. Elit duis tristique sollicitudin nibh sit. Sed adipiscing diam donec adipiscing tristique risus nec feugiat. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Mauris vitae ultricies leo integer. Consectetur lorem donec massa sapien faucibus. Lectus arcu bibendum at varius. + +Non quam lacus suspendisse faucibus. Morbi tincidunt ornare massa eget egestas purus viverra accumsan. Lorem sed risus ultricies tristique nulla aliquet. Tortor condimentum lacinia quis vel. Phasellus faucibus scelerisque eleifend donec pretium. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus est. Fermentum iaculis eu non diam phasellus vestibulum lorem sed. In cursus turpis massa tincidunt dui. Cum sociis natoque penatibus et. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Duis at consectetur lorem donec. Volutpat blandit aliquam etiam erat velit scelerisque. Elit duis tristique sollicitudin nibh sit amet. Quis viverra nibh cras pulvinar mattis nunc. Sapien pellentesque habitant morbi tristique senectus et netus et malesuada. Nibh cras pulvinar mattis nunc. Eleifend donec pretium vulputate sapien nec sagittis. + +Nullam ac tortor vitae purus. Ut sem nulla pharetra diam sit amet nisl suscipit adipiscing. Amet facilisis magna etiam tempor. Vitae nunc sed velit dignissim sodales ut eu sem integer. Sem fringilla ut morbi tincidunt augue interdum velit euismod. Morbi non arcu risus quis. Ut sem nulla pharetra diam. Est velit egestas dui id. Sed felis eget velit aliquet sagittis id consectetur purus ut. Sollicitudin aliquam ultrices sagittis orci a scelerisque. Scelerisque purus semper eget duis at tellus at urna. Ac placerat vestibulum lectus mauris ultrices eros in. Pulvinar pellentesque habitant morbi tristique senectus. + +Convallis a cras semper auctor neque vitae tempus quam. Consequat ac felis donec et odio pellentesque diam. Penatibus et magnis dis parturient montes nascetur. Vitae purus faucibus ornare suspendisse sed nisi. Nibh venenatis cras sed felis eget velit. Cursus vitae congue mauris rhoncus aenean vel elit. Elit at imperdiet dui accumsan sit amet. Ultrices eros in cursus turpis massa tincidunt. Molestie nunc non blandit massa. Ridiculus mus mauris vitae ultricies leo integer. Cras fermentum odio eu feugiat pretium nibh. Nulla facilisi etiam dignissim diam. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat est. Non quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Magna sit amet purus gravida quis blandit turpis cursus in. Non sodales neque sodales ut etiam sit amet. Morbi quis commodo odio aenean sed adipiscing diam. Ullamcorper velit sed ullamcorper morbi. Ipsum consequat nisl vel pretium. + +demo=content + +## sample test file ## +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labo +fa0 +re et dolore magna aliqua. A scelerisque purus semper eget duis at tellus at. Tellus integer feugiat scelerisque varius morbi. Lacus laoreet non curabitur gravida arcu ac tortor. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Ut enim blandit volutpat maecenas. Ipsum dolor sit amet consectetur adipiscing elit. Id ornare arcu odio ut. Convallis tellus id interdum velit laoreet id. Enim ut tellus elementum sagittis vitae et leo duis ut. Eros in cursus turpis massa tincidunt dui ut. In massa tempor nec feugiat nisl pretium fusce id velit. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Eget nunc lobortis mattis aliquam faucibus purus in massa. Vitae suscipit tellus mauris a. Gravida quis blandit turpis cursus in hac. Amet dictum sit amet justo donec enim diam vulputate. Imperdiet massa tincidunt nunc pulvinar sapien et. + +Lacus sed viverra tellus in hac habitasse platea. Donec et odio pellentesque diam volutpat commodo sed egestas. Eget arcu dictum varius duis at consectetur. Arcu felis bibendum ut tristique et egestas. Tellus molestie nunc non blandit massa enim. Risus viverra adipiscing at in tellus integer feugiat scelerisque varius. Risus nec feugiat in fermentum posuere. Cursus sit amet dictum sit amet justo donec enim. Sem integer vitae justo eget magna fermentum iaculis eu. Feugiat vivamus at augue eget arcu dictum. Netus et malesuada fames ac turpis egestas. Aliquam ultrices sagittis orci a scelerisque purus semper. Duis at tellus at urna condimentum. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Volutpat consequat mauris nunc congue nisi vitae suscipit. Sem integer vitae justo eget magna fermentum iaculis eu non. Sagittis purus sit amet volutpat consequat mauris nunc congue. + +Id diam vel quam elementum pulvinar etiam non quam. Eget aliquet nibh praesent tristique magna sit amet purus. Sed euismod nisi porta lorem mollis aliquam ut porttitor. Urna neque viverra justo nec ultrices dui sapien eget mi. Aliquet eget sit amet tellus cras. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Faucibus et molestie ac feugiat sed lectus vestibulum. Semper eget duis at tellus at. Congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Congue nisi vitae suscipit tellus mauris a diam maecenas sed. Purus gravida quis blandit turpis cursus in. Risus nec feugiat in fermentum posuere urna nec tincidunt praesent. Enim eu turpis egestas pretium aenean pharetra magna. Duis convallis convallis tellus id interdum velit laoreet id. + +Eu consequat ac felis donec et odio pellentesque diam volutpat. Cursus eget nunc scelerisque viverra mauris in aliquam sem fringilla. Vitae turpis massa sed elementum tempus egestas sed sed. Ultrices in iaculis nunc sed augue lacus viverra vitae congue. Mauris pellentesque pulvinar pellentesque habitant morbi. Ullamcorper velit sed ullamcorper morbi tincidunt ornare. Sodales ut etiam sit amet nisl purus in mollis nunc. Arcu odio ut sem nulla pharetra diam. Id aliquet risus feugiat in ante. Nibh praesent tristique magna sit amet purus gravida. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis feugiat. + +Arcu vitae elementum curabitur vitae nunc. Et malesuada fames ac turpis egestas integer eget aliquet nibh. Cursus turpis massa tincidunt dui ut ornare lectus. Nulla posuere sollicitudin aliquam ultrices. Nibh praesent tristique magna sit amet. Arcu non sodales neque sodales ut etiam sit amet. Faucibus in ornare quam viverra orci sagittis eu volutpat odio. Eget mi proin sed libero enim sed. Suspendisse faucibus interdum posuere lorem. Congue quisque egestas diam in arcu. Vitae nunc sed velit dignissim. In mollis nunc sed id semper risus in hendrerit. Dictum at tempor commodo ullamcorper a lacus vestibulum. Volutpat lacus laoreet non curabitur gravida arcu ac tortor. Odio ut enim blandit volutpat maecenas. Eget sit amet tellus cras adipiscing enim eu turpis. + +Suspendisse interdum consectetur libero id faucibus nisl tincidunt eget nul +fa0 +lam. Eget gravida cum sociis natoque penatibus et magnis. Praesent tristique magna sit amet purus gravida. Fringilla ut morbi tincidunt augue interdum velit euismod in pellentesque. Ipsum dolor sit amet consectetur adipiscing elit pellentesque habitant. Cum sociis natoque penatibus et magnis dis parturient. Sagittis orci a scelerisque purus. Arcu dui vivamus arcu felis bibendum ut. Nisl condimentum id venenatis a condimentum vitae sapien pellentesque habitant. Dolor magna eget est lorem ipsum dolor sit amet consectetur. Suspendisse ultrices gravida dictum fusce. Nec feugiat nisl pretium fusce id. Sit amet commodo nulla facilisi nullam vehicula ipsum. At imperdiet dui accumsan sit. Metus vulputate eu scelerisque felis imperdiet. + +Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper. Id semper risus in hendrerit gravida. Libero nunc consequat interdum varius sit amet mattis. Dui sapien eget mi proin sed libero. Integer feugiat scelerisque varius morbi enim nunc faucibus. At ultrices mi tempus imperdiet nulla malesuada pellentesque. Condimentum id venenatis a condimentum. Sit amet nulla facilisi morbi tempus. Sed sed risus pretium quam vulputate dignissim suspendisse in est. Nisl nunc mi ipsum faucibus vitae aliquet. Lorem ipsum dolor sit amet. Pharetra magna ac placerat vestibulum lectus. Semper risus in hendrerit gravida rutrum quisque non tellus orci. Pellentesque adipiscing commodo elit at imperdiet dui. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. Ac tincidunt vitae semper quis lectus nulla. + +Sit amet venenatis urna cursus eget nunc scelerisque viverra. Leo duis ut diam quam nulla. In ante metus dictum at tempor commodo ullamcorper a lacus. Faucibus vitae aliquet nec ullamcorper sit. Maecenas ultricies mi eget mauris pharetra et ultrices neque. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed risus ultricies tristique nulla aliquet enim tortor at. Cursus risus at ultrices mi tempus imperdiet nulla malesuada. Cras pulvinar mattis nunc sed. Lectus nulla at volutpat diam ut venenatis tellus in metus. Odio pellentesque diam volutpat commodo sed egestas egestas. Tempus urna et pharetra pharetra massa massa ultricies. Nec sagittis aliquam malesuada bibendum. Dui nunc mattis enim ut. Venenatis cras sed felis eget velit aliquet sagittis. Commodo elit at imperdiet dui accumsan sit amet nulla. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Tempus imperdiet nulla malesuada pellentesque elit. + +Diam in arcu cursus euismod. Placerat duis ultricies lacus sed turpis. Lorem ipsum dolor sit amet. Non arcu risus quis varius. Morbi quis commodo odio aenean sed adipiscing. Fusce ut placerat orci nulla pellentesque dignissim enim. Aenean sed adipiscing diam donec adipiscing. Porta non pulvinar neque laoreet suspendisse. Dui accumsan sit amet nulla. Ultrices dui sapien eget mi proin. Nisl suscipit adipiscing bibendum est ultricies integer. + +Vitae tempus quam pellentesque nec nam aliquam sem et. Cum sociis natoque penatibus et. Nisl condimentum id venenatis a. Libero justo laoreet sit amet cursus sit amet. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Nisi vitae suscipit tellus mauris a. Nec ultrices dui sapien eget. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Diam ut venenatis tellus in. Enim ut sem viverra aliquet eget sit amet tellus. Donec et odio pellentesque diam volutpat commodo. Sapien faucibus et molestie ac feugiat sed. Amet mattis vulputate enim nulla aliquet porttitor lacus. Enim nunc faucibus a pellentesque. + +At elementum eu facilisis sed odio morbi. Nisl rhoncus mattis rhoncus urna neque viverra justo. Lacus laoreet non curabitur gravida. Libero id faucibus nisl tincidunt eget nullam non nisi est. Aliquet +fa0 + risus feugiat in ante metus dictum at tempor. Montes nascetur ridiculus mus mauris vitae ultricies leo integer malesuada. Imperdiet nulla malesuada pellentesque elit eget. Tempus urna et pharetra pharetra. Nunc sed augue lacus viverra vitae congue. Viverra adipiscing at in tellus integer. Volutpat sed cras ornare arcu. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Turpis egestas maecenas pharetra convallis posuere morbi. + +Purus sit amet luctus venenatis lectus magna fringilla urna porttitor. Tellus in metus vulputate eu scelerisque felis imperdiet proin. Nibh ipsum consequat nisl vel pretium lectus quam. Metus dictum at tempor commodo. Ut tristique et egestas quis ipsum suspendisse ultrices gravida. Est ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Rutrum tellus pellentesque eu tincidunt tortor. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor. Sed libero enim sed faucibus turpis in eu. Pellentesque massa placerat duis ultricies. Ut venenatis tellus in metus vulputate. Urna duis convallis convallis tellus id interdum. Lectus sit amet est placerat in. Sem fringilla ut morbi tincidunt augue interdum velit euismod in. Velit dignissim sodales ut eu. Sit amet massa vitae tortor. Dignissim sodales ut eu sem integer vitae. + +Condimentum mattis pellentesque id nibh tortor id aliquet lectus proin. Amet venenatis urna cursus eget nunc scelerisque viverra. Quam elementum pulvinar etiam non quam lacus suspendisse. Aenean sed adipiscing diam donec adipiscing. Nibh cras pulvinar mattis nunc sed blandit libero. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor elit. Sit amet aliquam id diam maecenas ultricies mi eget mauris. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Quis ipsum suspendisse ultrices gravida dictum. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc. Semper viverra nam libero justo laoreet sit amet. Molestie a iaculis at erat pellentesque adipiscing commodo. Condimentum lacinia quis vel eros. Proin libero nunc consequat interdum varius sit. Eu volutpat odio facilisis mauris sit amet massa. Porttitor rhoncus dolor purus non enim praesent. Augue interdum velit euismod in pellentesque massa. + +Vitae nunc sed velit dignissim sodales ut eu. Sit amet facilisis magna etiam tempor. Cursus euismod quis viverra nibh. Neque volutpat ac tincidunt vitae semper quis lectus nulla at. Eu facilisis sed odio morbi quis commodo odio aenean. Sollicitudin nibh sit amet commodo nulla facilisi. Tincidunt lobortis feugiat vivamus at augue eget arcu dictum. Ipsum dolor sit amet consectetur. Sed risus pretium quam vulputate dignissim suspendisse in est ante. Feugiat nibh sed pulvinar proin. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. Varius quam quisque id diam vel quam elementum pulvinar. Enim sit amet venenatis urna cursus eget. Posuere urna nec tincidunt praesent semper. Facilisi nullam vehicula ipsum a arcu cursus vitae congue mauris. + +Et magnis dis parturient montes nascetur ridiculus mus mauris. Interdum varius sit amet mattis vulputate. Velit scelerisque in dictum non consectetur a. Ultrices vitae auctor eu augue ut. Donec ultrices tincidunt arcu non sodales neque. Enim praesent elementum facilisis leo vel fringilla est. Et magnis dis parturient montes nascetur ridiculus mus mauris. Tincidunt praesent semper feugiat nibh sed. Nulla pellentesque dignissim enim sit amet venenatis urna. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Imperdiet dui accumsan sit amet. Eget nulla facilisi etiam dignissim diam. Tempor orci eu lobortis elementum nibh tellus molestie. Eget nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. A cras semper auctor neque vitae tempus quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Quisque sagittis purus sit amet. In tellus integer feugiat scelerisque varius. Amet facilisis magna etiam tempor orci eu. Ac tortor vitae purus faucibus orna +eff +re suspendisse sed nisi. Ipsum dolor sit amet consectetur adipiscing elit pellentesque. Id venenatis a condimentum vitae sapien pellentesque habitant morbi. Vitae tempus quam pellentesque nec nam aliquam. Senectus et netus et malesuada fames. Pretium quam vulputate dignissim suspendisse in est ante in nibh. In iaculis nunc sed augue lacus viverra vitae congue eu. Rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt. Senectus et netus et malesuada fames ac turpis egestas. + +Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Ultrices sagittis orci a scelerisque purus semper. Aliquam purus sit amet luctus venenatis lectus magna fringilla urna. Duis convallis convallis tellus id interdum velit laoreet id. Diam vulputate ut pharetra sit amet aliquam id diam. Ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Ac feugiat sed lectus vestibulum mattis ullamcorper. Faucibus purus in massa tempor nec feugiat nisl pretium fusce. Cras ornare arcu dui vivamus arcu. Tempor orci eu lobortis elementum nibh tellus molestie nunc. Mi proin sed libero enim sed faucibus turpis. Elit duis tristique sollicitudin nibh sit. Sed adipiscing diam donec adipiscing tristique risus nec feugiat. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Mauris vitae ultricies leo integer. Consectetur lorem donec massa sapien faucibus. Lectus arcu bibendum at varius. + +Non quam lacus suspendisse faucibus. Morbi tincidunt ornare massa eget egestas purus viverra accumsan. Lorem sed risus ultricies tristique nulla aliquet. Tortor condimentum lacinia quis vel. Phasellus faucibus scelerisque eleifend donec pretium. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus est. Fermentum iaculis eu non diam phasellus vestibulum lorem sed. In cursus turpis massa tincidunt dui. Cum sociis natoque penatibus et. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Duis at consectetur lorem donec. Volutpat blandit aliquam etiam erat velit scelerisque. Elit duis tristique sollicitudin nibh sit amet. Quis viverra nibh cras pulvinar mattis nunc. Sapien pellentesque habitant morbi tristique senectus et netus et malesuada. Nibh cras pulvinar mattis nunc. Eleifend donec pretium vulputate sapien nec sagittis. + +Nullam ac tortor vitae purus. Ut sem nulla pharetra diam sit amet nisl suscipit adipiscing. Amet facilisis magna etiam tempor. Vitae nunc sed velit dignissim sodales ut eu sem integer. Sem fringilla ut morbi tincidunt augue interdum velit euismod. Morbi non arcu risus quis. Ut sem nulla pharetra diam. Est velit egestas dui id. Sed felis eget velit aliquet sagittis id consectetur purus ut. Sollicitudin aliquam ultrices sagittis orci a scelerisque. Scelerisque purus semper eget duis at tellus at urna. Ac placerat vestibulum lectus mauris ultrices eros in. Pulvinar pellentesque habitant morbi tristique senectus. + +Convallis a cras semper auctor neque vitae tempus quam. Consequat ac felis donec et odio pellentesque diam. Penatibus et magnis dis parturient montes nascetur. Vitae purus faucibus ornare suspendisse sed nisi. Nibh venenatis cras sed felis eget velit. Cursus vitae congue mauris rhoncus aenean vel elit. Elit at imperdiet dui accumsan sit amet. Ultrices eros in cursus turpis massa tincidunt. Molestie nunc non blandit massa. Ridiculus mus mauris vitae ultricies leo integer. Cras fermentum odio eu feugiat pretium nibh. Nulla facilisi etiam dignissim diam. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat est. Non quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Magna sit amet purus gravida quis blandit turpis cursus in. Non sodales neque sodales ut etiam sit amet. Morbi quis commodo odio aenean sed adipiscing diam. Ullamcorper velit sed ullamcorper morbi. Ipsum consequat nisl vel pretium. + +demo=content + +0 +x-amz-checksum-crc32:yv9pNA== + diff --git a/server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_chunkedEncoded b/server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_signed_chunked similarity index 100% rename from server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_chunkedEncoded rename to server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_signed_chunked diff --git a/server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_chunkedEncoded_checksumSha256 b/server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_signed_chunked_checksumSha256 similarity index 100% rename from server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_chunkedEncoded_checksumSha256 rename to server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_signed_chunked_checksumSha256 diff --git a/server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_checksumCrc32 b/server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_unsigned_chunked_checksumCrc32 similarity index 100% rename from server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_checksumCrc32 rename to server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_unsigned_chunked_checksumCrc32 diff --git a/server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_checksumCrc32c b/server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_unsigned_chunked_checksumCrc32c similarity index 100% rename from server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_checksumCrc32c rename to server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_unsigned_chunked_checksumCrc32c diff --git a/server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_checksumSha1 b/server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_unsigned_chunked_checksumSha1 similarity index 100% rename from server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_checksumSha1 rename to server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_unsigned_chunked_checksumSha1 diff --git a/server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_checksumSha256 b/server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_unsigned_chunked_checksumSha256 similarity index 100% rename from server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_checksumSha256 rename to server/src/test/resources/com/adobe/testing/s3mock/util/sampleFile_unsigned_chunked_checksumSha256 diff --git a/server/src/test/resources/sampleFile_large.txt b/server/src/test/resources/sampleFile_large.txt index 7becd3c05..a09c7a6de 100644 --- a/server/src/test/resources/sampleFile_large.txt +++ b/server/src/test/resources/sampleFile_large.txt @@ -40,3 +40,132 @@ Nullam ac tortor vitae purus. Ut sem nulla pharetra diam sit amet nisl suscipit Convallis a cras semper auctor neque vitae tempus quam. Consequat ac felis donec et odio pellentesque diam. Penatibus et magnis dis parturient montes nascetur. Vitae purus faucibus ornare suspendisse sed nisi. Nibh venenatis cras sed felis eget velit. Cursus vitae congue mauris rhoncus aenean vel elit. Elit at imperdiet dui accumsan sit amet. Ultrices eros in cursus turpis massa tincidunt. Molestie nunc non blandit massa. Ridiculus mus mauris vitae ultricies leo integer. Cras fermentum odio eu feugiat pretium nibh. Nulla facilisi etiam dignissim diam. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat est. Non quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Magna sit amet purus gravida quis blandit turpis cursus in. Non sodales neque sodales ut etiam sit amet. Morbi quis commodo odio aenean sed adipiscing diam. Ullamcorper velit sed ullamcorper morbi. Ipsum consequat nisl vel pretium. demo=content + +## sample test file ## +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. A scelerisque purus semper eget duis at tellus at. Tellus integer feugiat scelerisque varius morbi. Lacus laoreet non curabitur gravida arcu ac tortor. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Ut enim blandit volutpat maecenas. Ipsum dolor sit amet consectetur adipiscing elit. Id ornare arcu odio ut. Convallis tellus id interdum velit laoreet id. Enim ut tellus elementum sagittis vitae et leo duis ut. Eros in cursus turpis massa tincidunt dui ut. In massa tempor nec feugiat nisl pretium fusce id velit. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Eget nunc lobortis mattis aliquam faucibus purus in massa. Vitae suscipit tellus mauris a. Gravida quis blandit turpis cursus in hac. Amet dictum sit amet justo donec enim diam vulputate. Imperdiet massa tincidunt nunc pulvinar sapien et. + +Lacus sed viverra tellus in hac habitasse platea. Donec et odio pellentesque diam volutpat commodo sed egestas. Eget arcu dictum varius duis at consectetur. Arcu felis bibendum ut tristique et egestas. Tellus molestie nunc non blandit massa enim. Risus viverra adipiscing at in tellus integer feugiat scelerisque varius. Risus nec feugiat in fermentum posuere. Cursus sit amet dictum sit amet justo donec enim. Sem integer vitae justo eget magna fermentum iaculis eu. Feugiat vivamus at augue eget arcu dictum. Netus et malesuada fames ac turpis egestas. Aliquam ultrices sagittis orci a scelerisque purus semper. Duis at tellus at urna condimentum. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Volutpat consequat mauris nunc congue nisi vitae suscipit. Sem integer vitae justo eget magna fermentum iaculis eu non. Sagittis purus sit amet volutpat consequat mauris nunc congue. + +Id diam vel quam elementum pulvinar etiam non quam. Eget aliquet nibh praesent tristique magna sit amet purus. Sed euismod nisi porta lorem mollis aliquam ut porttitor. Urna neque viverra justo nec ultrices dui sapien eget mi. Aliquet eget sit amet tellus cras. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Faucibus et molestie ac feugiat sed lectus vestibulum. Semper eget duis at tellus at. Congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Congue nisi vitae suscipit tellus mauris a diam maecenas sed. Purus gravida quis blandit turpis cursus in. Risus nec feugiat in fermentum posuere urna nec tincidunt praesent. Enim eu turpis egestas pretium aenean pharetra magna. Duis convallis convallis tellus id interdum velit laoreet id. + +Eu consequat ac felis donec et odio pellentesque diam volutpat. Cursus eget nunc scelerisque viverra mauris in aliquam sem fringilla. Vitae turpis massa sed elementum tempus egestas sed sed. Ultrices in iaculis nunc sed augue lacus viverra vitae congue. Mauris pellentesque pulvinar pellentesque habitant morbi. Ullamcorper velit sed ullamcorper morbi tincidunt ornare. Sodales ut etiam sit amet nisl purus in mollis nunc. Arcu odio ut sem nulla pharetra diam. Id aliquet risus feugiat in ante. Nibh praesent tristique magna sit amet purus gravida. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis feugiat. + +Arcu vitae elementum curabitur vitae nunc. Et malesuada fames ac turpis egestas integer eget aliquet nibh. Cursus turpis massa tincidunt dui ut ornare lectus. Nulla posuere sollicitudin aliquam ultrices. Nibh praesent tristique magna sit amet. Arcu non sodales neque sodales ut etiam sit amet. Faucibus in ornare quam viverra orci sagittis eu volutpat odio. Eget mi proin sed libero enim sed. Suspendisse faucibus interdum posuere lorem. Congue quisque egestas diam in arcu. Vitae nunc sed velit dignissim. In mollis nunc sed id semper risus in hendrerit. Dictum at tempor commodo ullamcorper a lacus vestibulum. Volutpat lacus laoreet non curabitur gravida arcu ac tortor. Odio ut enim blandit volutpat maecenas. Eget sit amet tellus cras adipiscing enim eu turpis. + +Suspendisse interdum consectetur libero id faucibus nisl tincidunt eget nullam. Eget gravida cum sociis natoque penatibus et magnis. Praesent tristique magna sit amet purus gravida. Fringilla ut morbi tincidunt augue interdum velit euismod in pellentesque. Ipsum dolor sit amet consectetur adipiscing elit pellentesque habitant. Cum sociis natoque penatibus et magnis dis parturient. Sagittis orci a scelerisque purus. Arcu dui vivamus arcu felis bibendum ut. Nisl condimentum id venenatis a condimentum vitae sapien pellentesque habitant. Dolor magna eget est lorem ipsum dolor sit amet consectetur. Suspendisse ultrices gravida dictum fusce. Nec feugiat nisl pretium fusce id. Sit amet commodo nulla facilisi nullam vehicula ipsum. At imperdiet dui accumsan sit. Metus vulputate eu scelerisque felis imperdiet. + +Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper. Id semper risus in hendrerit gravida. Libero nunc consequat interdum varius sit amet mattis. Dui sapien eget mi proin sed libero. Integer feugiat scelerisque varius morbi enim nunc faucibus. At ultrices mi tempus imperdiet nulla malesuada pellentesque. Condimentum id venenatis a condimentum. Sit amet nulla facilisi morbi tempus. Sed sed risus pretium quam vulputate dignissim suspendisse in est. Nisl nunc mi ipsum faucibus vitae aliquet. Lorem ipsum dolor sit amet. Pharetra magna ac placerat vestibulum lectus. Semper risus in hendrerit gravida rutrum quisque non tellus orci. Pellentesque adipiscing commodo elit at imperdiet dui. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. Ac tincidunt vitae semper quis lectus nulla. + +Sit amet venenatis urna cursus eget nunc scelerisque viverra. Leo duis ut diam quam nulla. In ante metus dictum at tempor commodo ullamcorper a lacus. Faucibus vitae aliquet nec ullamcorper sit. Maecenas ultricies mi eget mauris pharetra et ultrices neque. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed risus ultricies tristique nulla aliquet enim tortor at. Cursus risus at ultrices mi tempus imperdiet nulla malesuada. Cras pulvinar mattis nunc sed. Lectus nulla at volutpat diam ut venenatis tellus in metus. Odio pellentesque diam volutpat commodo sed egestas egestas. Tempus urna et pharetra pharetra massa massa ultricies. Nec sagittis aliquam malesuada bibendum. Dui nunc mattis enim ut. Venenatis cras sed felis eget velit aliquet sagittis. Commodo elit at imperdiet dui accumsan sit amet nulla. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Tempus imperdiet nulla malesuada pellentesque elit. + +Diam in arcu cursus euismod. Placerat duis ultricies lacus sed turpis. Lorem ipsum dolor sit amet. Non arcu risus quis varius. Morbi quis commodo odio aenean sed adipiscing. Fusce ut placerat orci nulla pellentesque dignissim enim. Aenean sed adipiscing diam donec adipiscing. Porta non pulvinar neque laoreet suspendisse. Dui accumsan sit amet nulla. Ultrices dui sapien eget mi proin. Nisl suscipit adipiscing bibendum est ultricies integer. + +Vitae tempus quam pellentesque nec nam aliquam sem et. Cum sociis natoque penatibus et. Nisl condimentum id venenatis a. Libero justo laoreet sit amet cursus sit amet. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Nisi vitae suscipit tellus mauris a. Nec ultrices dui sapien eget. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Diam ut venenatis tellus in. Enim ut sem viverra aliquet eget sit amet tellus. Donec et odio pellentesque diam volutpat commodo. Sapien faucibus et molestie ac feugiat sed. Amet mattis vulputate enim nulla aliquet porttitor lacus. Enim nunc faucibus a pellentesque. + +At elementum eu facilisis sed odio morbi. Nisl rhoncus mattis rhoncus urna neque viverra justo. Lacus laoreet non curabitur gravida. Libero id faucibus nisl tincidunt eget nullam non nisi est. Aliquet risus feugiat in ante metus dictum at tempor. Montes nascetur ridiculus mus mauris vitae ultricies leo integer malesuada. Imperdiet nulla malesuada pellentesque elit eget. Tempus urna et pharetra pharetra. Nunc sed augue lacus viverra vitae congue. Viverra adipiscing at in tellus integer. Volutpat sed cras ornare arcu. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Turpis egestas maecenas pharetra convallis posuere morbi. + +Purus sit amet luctus venenatis lectus magna fringilla urna porttitor. Tellus in metus vulputate eu scelerisque felis imperdiet proin. Nibh ipsum consequat nisl vel pretium lectus quam. Metus dictum at tempor commodo. Ut tristique et egestas quis ipsum suspendisse ultrices gravida. Est ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Rutrum tellus pellentesque eu tincidunt tortor. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor. Sed libero enim sed faucibus turpis in eu. Pellentesque massa placerat duis ultricies. Ut venenatis tellus in metus vulputate. Urna duis convallis convallis tellus id interdum. Lectus sit amet est placerat in. Sem fringilla ut morbi tincidunt augue interdum velit euismod in. Velit dignissim sodales ut eu. Sit amet massa vitae tortor. Dignissim sodales ut eu sem integer vitae. + +Condimentum mattis pellentesque id nibh tortor id aliquet lectus proin. Amet venenatis urna cursus eget nunc scelerisque viverra. Quam elementum pulvinar etiam non quam lacus suspendisse. Aenean sed adipiscing diam donec adipiscing. Nibh cras pulvinar mattis nunc sed blandit libero. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor elit. Sit amet aliquam id diam maecenas ultricies mi eget mauris. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Quis ipsum suspendisse ultrices gravida dictum. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc. Semper viverra nam libero justo laoreet sit amet. Molestie a iaculis at erat pellentesque adipiscing commodo. Condimentum lacinia quis vel eros. Proin libero nunc consequat interdum varius sit. Eu volutpat odio facilisis mauris sit amet massa. Porttitor rhoncus dolor purus non enim praesent. Augue interdum velit euismod in pellentesque massa. + +Vitae nunc sed velit dignissim sodales ut eu. Sit amet facilisis magna etiam tempor. Cursus euismod quis viverra nibh. Neque volutpat ac tincidunt vitae semper quis lectus nulla at. Eu facilisis sed odio morbi quis commodo odio aenean. Sollicitudin nibh sit amet commodo nulla facilisi. Tincidunt lobortis feugiat vivamus at augue eget arcu dictum. Ipsum dolor sit amet consectetur. Sed risus pretium quam vulputate dignissim suspendisse in est ante. Feugiat nibh sed pulvinar proin. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. Varius quam quisque id diam vel quam elementum pulvinar. Enim sit amet venenatis urna cursus eget. Posuere urna nec tincidunt praesent semper. Facilisi nullam vehicula ipsum a arcu cursus vitae congue mauris. + +Et magnis dis parturient montes nascetur ridiculus mus mauris. Interdum varius sit amet mattis vulputate. Velit scelerisque in dictum non consectetur a. Ultrices vitae auctor eu augue ut. Donec ultrices tincidunt arcu non sodales neque. Enim praesent elementum facilisis leo vel fringilla est. Et magnis dis parturient montes nascetur ridiculus mus mauris. Tincidunt praesent semper feugiat nibh sed. Nulla pellentesque dignissim enim sit amet venenatis urna. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Imperdiet dui accumsan sit amet. Eget nulla facilisi etiam dignissim diam. Tempor orci eu lobortis elementum nibh tellus molestie. Eget nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. A cras semper auctor neque vitae tempus quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Quisque sagittis purus sit amet. In tellus integer feugiat scelerisque varius. Amet facilisis magna etiam tempor orci eu. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Ipsum dolor sit amet consectetur adipiscing elit pellentesque. Id venenatis a condimentum vitae sapien pellentesque habitant morbi. Vitae tempus quam pellentesque nec nam aliquam. Senectus et netus et malesuada fames. Pretium quam vulputate dignissim suspendisse in est ante in nibh. In iaculis nunc sed augue lacus viverra vitae congue eu. Rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt. Senectus et netus et malesuada fames ac turpis egestas. + +Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Ultrices sagittis orci a scelerisque purus semper. Aliquam purus sit amet luctus venenatis lectus magna fringilla urna. Duis convallis convallis tellus id interdum velit laoreet id. Diam vulputate ut pharetra sit amet aliquam id diam. Ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Ac feugiat sed lectus vestibulum mattis ullamcorper. Faucibus purus in massa tempor nec feugiat nisl pretium fusce. Cras ornare arcu dui vivamus arcu. Tempor orci eu lobortis elementum nibh tellus molestie nunc. Mi proin sed libero enim sed faucibus turpis. Elit duis tristique sollicitudin nibh sit. Sed adipiscing diam donec adipiscing tristique risus nec feugiat. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Mauris vitae ultricies leo integer. Consectetur lorem donec massa sapien faucibus. Lectus arcu bibendum at varius. + +Non quam lacus suspendisse faucibus. Morbi tincidunt ornare massa eget egestas purus viverra accumsan. Lorem sed risus ultricies tristique nulla aliquet. Tortor condimentum lacinia quis vel. Phasellus faucibus scelerisque eleifend donec pretium. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus est. Fermentum iaculis eu non diam phasellus vestibulum lorem sed. In cursus turpis massa tincidunt dui. Cum sociis natoque penatibus et. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Duis at consectetur lorem donec. Volutpat blandit aliquam etiam erat velit scelerisque. Elit duis tristique sollicitudin nibh sit amet. Quis viverra nibh cras pulvinar mattis nunc. Sapien pellentesque habitant morbi tristique senectus et netus et malesuada. Nibh cras pulvinar mattis nunc. Eleifend donec pretium vulputate sapien nec sagittis. + +Nullam ac tortor vitae purus. Ut sem nulla pharetra diam sit amet nisl suscipit adipiscing. Amet facilisis magna etiam tempor. Vitae nunc sed velit dignissim sodales ut eu sem integer. Sem fringilla ut morbi tincidunt augue interdum velit euismod. Morbi non arcu risus quis. Ut sem nulla pharetra diam. Est velit egestas dui id. Sed felis eget velit aliquet sagittis id consectetur purus ut. Sollicitudin aliquam ultrices sagittis orci a scelerisque. Scelerisque purus semper eget duis at tellus at urna. Ac placerat vestibulum lectus mauris ultrices eros in. Pulvinar pellentesque habitant morbi tristique senectus. + +Convallis a cras semper auctor neque vitae tempus quam. Consequat ac felis donec et odio pellentesque diam. Penatibus et magnis dis parturient montes nascetur. Vitae purus faucibus ornare suspendisse sed nisi. Nibh venenatis cras sed felis eget velit. Cursus vitae congue mauris rhoncus aenean vel elit. Elit at imperdiet dui accumsan sit amet. Ultrices eros in cursus turpis massa tincidunt. Molestie nunc non blandit massa. Ridiculus mus mauris vitae ultricies leo integer. Cras fermentum odio eu feugiat pretium nibh. Nulla facilisi etiam dignissim diam. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat est. Non quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Magna sit amet purus gravida quis blandit turpis cursus in. Non sodales neque sodales ut etiam sit amet. Morbi quis commodo odio aenean sed adipiscing diam. Ullamcorper velit sed ullamcorper morbi. Ipsum consequat nisl vel pretium. + +demo=content + +## sample test file ## +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. A scelerisque purus semper eget duis at tellus at. Tellus integer feugiat scelerisque varius morbi. Lacus laoreet non curabitur gravida arcu ac tortor. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Ut enim blandit volutpat maecenas. Ipsum dolor sit amet consectetur adipiscing elit. Id ornare arcu odio ut. Convallis tellus id interdum velit laoreet id. Enim ut tellus elementum sagittis vitae et leo duis ut. Eros in cursus turpis massa tincidunt dui ut. In massa tempor nec feugiat nisl pretium fusce id velit. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Eget nunc lobortis mattis aliquam faucibus purus in massa. Vitae suscipit tellus mauris a. Gravida quis blandit turpis cursus in hac. Amet dictum sit amet justo donec enim diam vulputate. Imperdiet massa tincidunt nunc pulvinar sapien et. + +Lacus sed viverra tellus in hac habitasse platea. Donec et odio pellentesque diam volutpat commodo sed egestas. Eget arcu dictum varius duis at consectetur. Arcu felis bibendum ut tristique et egestas. Tellus molestie nunc non blandit massa enim. Risus viverra adipiscing at in tellus integer feugiat scelerisque varius. Risus nec feugiat in fermentum posuere. Cursus sit amet dictum sit amet justo donec enim. Sem integer vitae justo eget magna fermentum iaculis eu. Feugiat vivamus at augue eget arcu dictum. Netus et malesuada fames ac turpis egestas. Aliquam ultrices sagittis orci a scelerisque purus semper. Duis at tellus at urna condimentum. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Volutpat consequat mauris nunc congue nisi vitae suscipit. Sem integer vitae justo eget magna fermentum iaculis eu non. Sagittis purus sit amet volutpat consequat mauris nunc congue. + +Id diam vel quam elementum pulvinar etiam non quam. Eget aliquet nibh praesent tristique magna sit amet purus. Sed euismod nisi porta lorem mollis aliquam ut porttitor. Urna neque viverra justo nec ultrices dui sapien eget mi. Aliquet eget sit amet tellus cras. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Faucibus et molestie ac feugiat sed lectus vestibulum. Semper eget duis at tellus at. Congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Congue nisi vitae suscipit tellus mauris a diam maecenas sed. Purus gravida quis blandit turpis cursus in. Risus nec feugiat in fermentum posuere urna nec tincidunt praesent. Enim eu turpis egestas pretium aenean pharetra magna. Duis convallis convallis tellus id interdum velit laoreet id. + +Eu consequat ac felis donec et odio pellentesque diam volutpat. Cursus eget nunc scelerisque viverra mauris in aliquam sem fringilla. Vitae turpis massa sed elementum tempus egestas sed sed. Ultrices in iaculis nunc sed augue lacus viverra vitae congue. Mauris pellentesque pulvinar pellentesque habitant morbi. Ullamcorper velit sed ullamcorper morbi tincidunt ornare. Sodales ut etiam sit amet nisl purus in mollis nunc. Arcu odio ut sem nulla pharetra diam. Id aliquet risus feugiat in ante. Nibh praesent tristique magna sit amet purus gravida. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis feugiat. + +Arcu vitae elementum curabitur vitae nunc. Et malesuada fames ac turpis egestas integer eget aliquet nibh. Cursus turpis massa tincidunt dui ut ornare lectus. Nulla posuere sollicitudin aliquam ultrices. Nibh praesent tristique magna sit amet. Arcu non sodales neque sodales ut etiam sit amet. Faucibus in ornare quam viverra orci sagittis eu volutpat odio. Eget mi proin sed libero enim sed. Suspendisse faucibus interdum posuere lorem. Congue quisque egestas diam in arcu. Vitae nunc sed velit dignissim. In mollis nunc sed id semper risus in hendrerit. Dictum at tempor commodo ullamcorper a lacus vestibulum. Volutpat lacus laoreet non curabitur gravida arcu ac tortor. Odio ut enim blandit volutpat maecenas. Eget sit amet tellus cras adipiscing enim eu turpis. + +Suspendisse interdum consectetur libero id faucibus nisl tincidunt eget nullam. Eget gravida cum sociis natoque penatibus et magnis. Praesent tristique magna sit amet purus gravida. Fringilla ut morbi tincidunt augue interdum velit euismod in pellentesque. Ipsum dolor sit amet consectetur adipiscing elit pellentesque habitant. Cum sociis natoque penatibus et magnis dis parturient. Sagittis orci a scelerisque purus. Arcu dui vivamus arcu felis bibendum ut. Nisl condimentum id venenatis a condimentum vitae sapien pellentesque habitant. Dolor magna eget est lorem ipsum dolor sit amet consectetur. Suspendisse ultrices gravida dictum fusce. Nec feugiat nisl pretium fusce id. Sit amet commodo nulla facilisi nullam vehicula ipsum. At imperdiet dui accumsan sit. Metus vulputate eu scelerisque felis imperdiet. + +Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper. Id semper risus in hendrerit gravida. Libero nunc consequat interdum varius sit amet mattis. Dui sapien eget mi proin sed libero. Integer feugiat scelerisque varius morbi enim nunc faucibus. At ultrices mi tempus imperdiet nulla malesuada pellentesque. Condimentum id venenatis a condimentum. Sit amet nulla facilisi morbi tempus. Sed sed risus pretium quam vulputate dignissim suspendisse in est. Nisl nunc mi ipsum faucibus vitae aliquet. Lorem ipsum dolor sit amet. Pharetra magna ac placerat vestibulum lectus. Semper risus in hendrerit gravida rutrum quisque non tellus orci. Pellentesque adipiscing commodo elit at imperdiet dui. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. Ac tincidunt vitae semper quis lectus nulla. + +Sit amet venenatis urna cursus eget nunc scelerisque viverra. Leo duis ut diam quam nulla. In ante metus dictum at tempor commodo ullamcorper a lacus. Faucibus vitae aliquet nec ullamcorper sit. Maecenas ultricies mi eget mauris pharetra et ultrices neque. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed risus ultricies tristique nulla aliquet enim tortor at. Cursus risus at ultrices mi tempus imperdiet nulla malesuada. Cras pulvinar mattis nunc sed. Lectus nulla at volutpat diam ut venenatis tellus in metus. Odio pellentesque diam volutpat commodo sed egestas egestas. Tempus urna et pharetra pharetra massa massa ultricies. Nec sagittis aliquam malesuada bibendum. Dui nunc mattis enim ut. Venenatis cras sed felis eget velit aliquet sagittis. Commodo elit at imperdiet dui accumsan sit amet nulla. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Tempus imperdiet nulla malesuada pellentesque elit. + +Diam in arcu cursus euismod. Placerat duis ultricies lacus sed turpis. Lorem ipsum dolor sit amet. Non arcu risus quis varius. Morbi quis commodo odio aenean sed adipiscing. Fusce ut placerat orci nulla pellentesque dignissim enim. Aenean sed adipiscing diam donec adipiscing. Porta non pulvinar neque laoreet suspendisse. Dui accumsan sit amet nulla. Ultrices dui sapien eget mi proin. Nisl suscipit adipiscing bibendum est ultricies integer. + +Vitae tempus quam pellentesque nec nam aliquam sem et. Cum sociis natoque penatibus et. Nisl condimentum id venenatis a. Libero justo laoreet sit amet cursus sit amet. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Nisi vitae suscipit tellus mauris a. Nec ultrices dui sapien eget. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Diam ut venenatis tellus in. Enim ut sem viverra aliquet eget sit amet tellus. Donec et odio pellentesque diam volutpat commodo. Sapien faucibus et molestie ac feugiat sed. Amet mattis vulputate enim nulla aliquet porttitor lacus. Enim nunc faucibus a pellentesque. + +At elementum eu facilisis sed odio morbi. Nisl rhoncus mattis rhoncus urna neque viverra justo. Lacus laoreet non curabitur gravida. Libero id faucibus nisl tincidunt eget nullam non nisi est. Aliquet risus feugiat in ante metus dictum at tempor. Montes nascetur ridiculus mus mauris vitae ultricies leo integer malesuada. Imperdiet nulla malesuada pellentesque elit eget. Tempus urna et pharetra pharetra. Nunc sed augue lacus viverra vitae congue. Viverra adipiscing at in tellus integer. Volutpat sed cras ornare arcu. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Turpis egestas maecenas pharetra convallis posuere morbi. + +Purus sit amet luctus venenatis lectus magna fringilla urna porttitor. Tellus in metus vulputate eu scelerisque felis imperdiet proin. Nibh ipsum consequat nisl vel pretium lectus quam. Metus dictum at tempor commodo. Ut tristique et egestas quis ipsum suspendisse ultrices gravida. Est ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Rutrum tellus pellentesque eu tincidunt tortor. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor. Sed libero enim sed faucibus turpis in eu. Pellentesque massa placerat duis ultricies. Ut venenatis tellus in metus vulputate. Urna duis convallis convallis tellus id interdum. Lectus sit amet est placerat in. Sem fringilla ut morbi tincidunt augue interdum velit euismod in. Velit dignissim sodales ut eu. Sit amet massa vitae tortor. Dignissim sodales ut eu sem integer vitae. + +Condimentum mattis pellentesque id nibh tortor id aliquet lectus proin. Amet venenatis urna cursus eget nunc scelerisque viverra. Quam elementum pulvinar etiam non quam lacus suspendisse. Aenean sed adipiscing diam donec adipiscing. Nibh cras pulvinar mattis nunc sed blandit libero. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor elit. Sit amet aliquam id diam maecenas ultricies mi eget mauris. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Quis ipsum suspendisse ultrices gravida dictum. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc. Semper viverra nam libero justo laoreet sit amet. Molestie a iaculis at erat pellentesque adipiscing commodo. Condimentum lacinia quis vel eros. Proin libero nunc consequat interdum varius sit. Eu volutpat odio facilisis mauris sit amet massa. Porttitor rhoncus dolor purus non enim praesent. Augue interdum velit euismod in pellentesque massa. + +Vitae nunc sed velit dignissim sodales ut eu. Sit amet facilisis magna etiam tempor. Cursus euismod quis viverra nibh. Neque volutpat ac tincidunt vitae semper quis lectus nulla at. Eu facilisis sed odio morbi quis commodo odio aenean. Sollicitudin nibh sit amet commodo nulla facilisi. Tincidunt lobortis feugiat vivamus at augue eget arcu dictum. Ipsum dolor sit amet consectetur. Sed risus pretium quam vulputate dignissim suspendisse in est ante. Feugiat nibh sed pulvinar proin. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. Varius quam quisque id diam vel quam elementum pulvinar. Enim sit amet venenatis urna cursus eget. Posuere urna nec tincidunt praesent semper. Facilisi nullam vehicula ipsum a arcu cursus vitae congue mauris. + +Et magnis dis parturient montes nascetur ridiculus mus mauris. Interdum varius sit amet mattis vulputate. Velit scelerisque in dictum non consectetur a. Ultrices vitae auctor eu augue ut. Donec ultrices tincidunt arcu non sodales neque. Enim praesent elementum facilisis leo vel fringilla est. Et magnis dis parturient montes nascetur ridiculus mus mauris. Tincidunt praesent semper feugiat nibh sed. Nulla pellentesque dignissim enim sit amet venenatis urna. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Imperdiet dui accumsan sit amet. Eget nulla facilisi etiam dignissim diam. Tempor orci eu lobortis elementum nibh tellus molestie. Eget nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. A cras semper auctor neque vitae tempus quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Quisque sagittis purus sit amet. In tellus integer feugiat scelerisque varius. Amet facilisis magna etiam tempor orci eu. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Ipsum dolor sit amet consectetur adipiscing elit pellentesque. Id venenatis a condimentum vitae sapien pellentesque habitant morbi. Vitae tempus quam pellentesque nec nam aliquam. Senectus et netus et malesuada fames. Pretium quam vulputate dignissim suspendisse in est ante in nibh. In iaculis nunc sed augue lacus viverra vitae congue eu. Rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt. Senectus et netus et malesuada fames ac turpis egestas. + +Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Ultrices sagittis orci a scelerisque purus semper. Aliquam purus sit amet luctus venenatis lectus magna fringilla urna. Duis convallis convallis tellus id interdum velit laoreet id. Diam vulputate ut pharetra sit amet aliquam id diam. Ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Ac feugiat sed lectus vestibulum mattis ullamcorper. Faucibus purus in massa tempor nec feugiat nisl pretium fusce. Cras ornare arcu dui vivamus arcu. Tempor orci eu lobortis elementum nibh tellus molestie nunc. Mi proin sed libero enim sed faucibus turpis. Elit duis tristique sollicitudin nibh sit. Sed adipiscing diam donec adipiscing tristique risus nec feugiat. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Mauris vitae ultricies leo integer. Consectetur lorem donec massa sapien faucibus. Lectus arcu bibendum at varius. + +Non quam lacus suspendisse faucibus. Morbi tincidunt ornare massa eget egestas purus viverra accumsan. Lorem sed risus ultricies tristique nulla aliquet. Tortor condimentum lacinia quis vel. Phasellus faucibus scelerisque eleifend donec pretium. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus est. Fermentum iaculis eu non diam phasellus vestibulum lorem sed. In cursus turpis massa tincidunt dui. Cum sociis natoque penatibus et. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Duis at consectetur lorem donec. Volutpat blandit aliquam etiam erat velit scelerisque. Elit duis tristique sollicitudin nibh sit amet. Quis viverra nibh cras pulvinar mattis nunc. Sapien pellentesque habitant morbi tristique senectus et netus et malesuada. Nibh cras pulvinar mattis nunc. Eleifend donec pretium vulputate sapien nec sagittis. + +Nullam ac tortor vitae purus. Ut sem nulla pharetra diam sit amet nisl suscipit adipiscing. Amet facilisis magna etiam tempor. Vitae nunc sed velit dignissim sodales ut eu sem integer. Sem fringilla ut morbi tincidunt augue interdum velit euismod. Morbi non arcu risus quis. Ut sem nulla pharetra diam. Est velit egestas dui id. Sed felis eget velit aliquet sagittis id consectetur purus ut. Sollicitudin aliquam ultrices sagittis orci a scelerisque. Scelerisque purus semper eget duis at tellus at urna. Ac placerat vestibulum lectus mauris ultrices eros in. Pulvinar pellentesque habitant morbi tristique senectus. + +Convallis a cras semper auctor neque vitae tempus quam. Consequat ac felis donec et odio pellentesque diam. Penatibus et magnis dis parturient montes nascetur. Vitae purus faucibus ornare suspendisse sed nisi. Nibh venenatis cras sed felis eget velit. Cursus vitae congue mauris rhoncus aenean vel elit. Elit at imperdiet dui accumsan sit amet. Ultrices eros in cursus turpis massa tincidunt. Molestie nunc non blandit massa. Ridiculus mus mauris vitae ultricies leo integer. Cras fermentum odio eu feugiat pretium nibh. Nulla facilisi etiam dignissim diam. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat est. Non quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Magna sit amet purus gravida quis blandit turpis cursus in. Non sodales neque sodales ut etiam sit amet. Morbi quis commodo odio aenean sed adipiscing diam. Ullamcorper velit sed ullamcorper morbi. Ipsum consequat nisl vel pretium. + +demo=content + +## sample test file ## +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. A scelerisque purus semper eget duis at tellus at. Tellus integer feugiat scelerisque varius morbi. Lacus laoreet non curabitur gravida arcu ac tortor. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Ut enim blandit volutpat maecenas. Ipsum dolor sit amet consectetur adipiscing elit. Id ornare arcu odio ut. Convallis tellus id interdum velit laoreet id. Enim ut tellus elementum sagittis vitae et leo duis ut. Eros in cursus turpis massa tincidunt dui ut. In massa tempor nec feugiat nisl pretium fusce id velit. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Eget nunc lobortis mattis aliquam faucibus purus in massa. Vitae suscipit tellus mauris a. Gravida quis blandit turpis cursus in hac. Amet dictum sit amet justo donec enim diam vulputate. Imperdiet massa tincidunt nunc pulvinar sapien et. + +Lacus sed viverra tellus in hac habitasse platea. Donec et odio pellentesque diam volutpat commodo sed egestas. Eget arcu dictum varius duis at consectetur. Arcu felis bibendum ut tristique et egestas. Tellus molestie nunc non blandit massa enim. Risus viverra adipiscing at in tellus integer feugiat scelerisque varius. Risus nec feugiat in fermentum posuere. Cursus sit amet dictum sit amet justo donec enim. Sem integer vitae justo eget magna fermentum iaculis eu. Feugiat vivamus at augue eget arcu dictum. Netus et malesuada fames ac turpis egestas. Aliquam ultrices sagittis orci a scelerisque purus semper. Duis at tellus at urna condimentum. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum. Volutpat consequat mauris nunc congue nisi vitae suscipit. Sem integer vitae justo eget magna fermentum iaculis eu non. Sagittis purus sit amet volutpat consequat mauris nunc congue. + +Id diam vel quam elementum pulvinar etiam non quam. Eget aliquet nibh praesent tristique magna sit amet purus. Sed euismod nisi porta lorem mollis aliquam ut porttitor. Urna neque viverra justo nec ultrices dui sapien eget mi. Aliquet eget sit amet tellus cras. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Faucibus et molestie ac feugiat sed lectus vestibulum. Semper eget duis at tellus at. Congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Congue nisi vitae suscipit tellus mauris a diam maecenas sed. Purus gravida quis blandit turpis cursus in. Risus nec feugiat in fermentum posuere urna nec tincidunt praesent. Enim eu turpis egestas pretium aenean pharetra magna. Duis convallis convallis tellus id interdum velit laoreet id. + +Eu consequat ac felis donec et odio pellentesque diam volutpat. Cursus eget nunc scelerisque viverra mauris in aliquam sem fringilla. Vitae turpis massa sed elementum tempus egestas sed sed. Ultrices in iaculis nunc sed augue lacus viverra vitae congue. Mauris pellentesque pulvinar pellentesque habitant morbi. Ullamcorper velit sed ullamcorper morbi tincidunt ornare. Sodales ut etiam sit amet nisl purus in mollis nunc. Arcu odio ut sem nulla pharetra diam. Id aliquet risus feugiat in ante. Nibh praesent tristique magna sit amet purus gravida. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis feugiat. + +Arcu vitae elementum curabitur vitae nunc. Et malesuada fames ac turpis egestas integer eget aliquet nibh. Cursus turpis massa tincidunt dui ut ornare lectus. Nulla posuere sollicitudin aliquam ultrices. Nibh praesent tristique magna sit amet. Arcu non sodales neque sodales ut etiam sit amet. Faucibus in ornare quam viverra orci sagittis eu volutpat odio. Eget mi proin sed libero enim sed. Suspendisse faucibus interdum posuere lorem. Congue quisque egestas diam in arcu. Vitae nunc sed velit dignissim. In mollis nunc sed id semper risus in hendrerit. Dictum at tempor commodo ullamcorper a lacus vestibulum. Volutpat lacus laoreet non curabitur gravida arcu ac tortor. Odio ut enim blandit volutpat maecenas. Eget sit amet tellus cras adipiscing enim eu turpis. + +Suspendisse interdum consectetur libero id faucibus nisl tincidunt eget nullam. Eget gravida cum sociis natoque penatibus et magnis. Praesent tristique magna sit amet purus gravida. Fringilla ut morbi tincidunt augue interdum velit euismod in pellentesque. Ipsum dolor sit amet consectetur adipiscing elit pellentesque habitant. Cum sociis natoque penatibus et magnis dis parturient. Sagittis orci a scelerisque purus. Arcu dui vivamus arcu felis bibendum ut. Nisl condimentum id venenatis a condimentum vitae sapien pellentesque habitant. Dolor magna eget est lorem ipsum dolor sit amet consectetur. Suspendisse ultrices gravida dictum fusce. Nec feugiat nisl pretium fusce id. Sit amet commodo nulla facilisi nullam vehicula ipsum. At imperdiet dui accumsan sit. Metus vulputate eu scelerisque felis imperdiet. + +Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper. Id semper risus in hendrerit gravida. Libero nunc consequat interdum varius sit amet mattis. Dui sapien eget mi proin sed libero. Integer feugiat scelerisque varius morbi enim nunc faucibus. At ultrices mi tempus imperdiet nulla malesuada pellentesque. Condimentum id venenatis a condimentum. Sit amet nulla facilisi morbi tempus. Sed sed risus pretium quam vulputate dignissim suspendisse in est. Nisl nunc mi ipsum faucibus vitae aliquet. Lorem ipsum dolor sit amet. Pharetra magna ac placerat vestibulum lectus. Semper risus in hendrerit gravida rutrum quisque non tellus orci. Pellentesque adipiscing commodo elit at imperdiet dui. Suscipit adipiscing bibendum est ultricies integer quis auctor elit sed. Ac tincidunt vitae semper quis lectus nulla. + +Sit amet venenatis urna cursus eget nunc scelerisque viverra. Leo duis ut diam quam nulla. In ante metus dictum at tempor commodo ullamcorper a lacus. Faucibus vitae aliquet nec ullamcorper sit. Maecenas ultricies mi eget mauris pharetra et ultrices neque. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Sed risus ultricies tristique nulla aliquet enim tortor at. Cursus risus at ultrices mi tempus imperdiet nulla malesuada. Cras pulvinar mattis nunc sed. Lectus nulla at volutpat diam ut venenatis tellus in metus. Odio pellentesque diam volutpat commodo sed egestas egestas. Tempus urna et pharetra pharetra massa massa ultricies. Nec sagittis aliquam malesuada bibendum. Dui nunc mattis enim ut. Venenatis cras sed felis eget velit aliquet sagittis. Commodo elit at imperdiet dui accumsan sit amet nulla. Euismod quis viverra nibh cras pulvinar mattis nunc sed blandit. Tempus imperdiet nulla malesuada pellentesque elit. + +Diam in arcu cursus euismod. Placerat duis ultricies lacus sed turpis. Lorem ipsum dolor sit amet. Non arcu risus quis varius. Morbi quis commodo odio aenean sed adipiscing. Fusce ut placerat orci nulla pellentesque dignissim enim. Aenean sed adipiscing diam donec adipiscing. Porta non pulvinar neque laoreet suspendisse. Dui accumsan sit amet nulla. Ultrices dui sapien eget mi proin. Nisl suscipit adipiscing bibendum est ultricies integer. + +Vitae tempus quam pellentesque nec nam aliquam sem et. Cum sociis natoque penatibus et. Nisl condimentum id venenatis a. Libero justo laoreet sit amet cursus sit amet. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Nisi vitae suscipit tellus mauris a. Nec ultrices dui sapien eget. Pretium nibh ipsum consequat nisl vel pretium lectus quam id. Eu scelerisque felis imperdiet proin fermentum leo vel orci porta. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Diam ut venenatis tellus in. Enim ut sem viverra aliquet eget sit amet tellus. Donec et odio pellentesque diam volutpat commodo. Sapien faucibus et molestie ac feugiat sed. Amet mattis vulputate enim nulla aliquet porttitor lacus. Enim nunc faucibus a pellentesque. + +At elementum eu facilisis sed odio morbi. Nisl rhoncus mattis rhoncus urna neque viverra justo. Lacus laoreet non curabitur gravida. Libero id faucibus nisl tincidunt eget nullam non nisi est. Aliquet risus feugiat in ante metus dictum at tempor. Montes nascetur ridiculus mus mauris vitae ultricies leo integer malesuada. Imperdiet nulla malesuada pellentesque elit eget. Tempus urna et pharetra pharetra. Nunc sed augue lacus viverra vitae congue. Viverra adipiscing at in tellus integer. Volutpat sed cras ornare arcu. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Turpis egestas maecenas pharetra convallis posuere morbi. + +Purus sit amet luctus venenatis lectus magna fringilla urna porttitor. Tellus in metus vulputate eu scelerisque felis imperdiet proin. Nibh ipsum consequat nisl vel pretium lectus quam. Metus dictum at tempor commodo. Ut tristique et egestas quis ipsum suspendisse ultrices gravida. Est ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Rutrum tellus pellentesque eu tincidunt tortor. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor. Sed libero enim sed faucibus turpis in eu. Pellentesque massa placerat duis ultricies. Ut venenatis tellus in metus vulputate. Urna duis convallis convallis tellus id interdum. Lectus sit amet est placerat in. Sem fringilla ut morbi tincidunt augue interdum velit euismod in. Velit dignissim sodales ut eu. Sit amet massa vitae tortor. Dignissim sodales ut eu sem integer vitae. + +Condimentum mattis pellentesque id nibh tortor id aliquet lectus proin. Amet venenatis urna cursus eget nunc scelerisque viverra. Quam elementum pulvinar etiam non quam lacus suspendisse. Aenean sed adipiscing diam donec adipiscing. Nibh cras pulvinar mattis nunc sed blandit libero. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor elit. Sit amet aliquam id diam maecenas ultricies mi eget mauris. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Quis ipsum suspendisse ultrices gravida dictum. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc. Semper viverra nam libero justo laoreet sit amet. Molestie a iaculis at erat pellentesque adipiscing commodo. Condimentum lacinia quis vel eros. Proin libero nunc consequat interdum varius sit. Eu volutpat odio facilisis mauris sit amet massa. Porttitor rhoncus dolor purus non enim praesent. Augue interdum velit euismod in pellentesque massa. + +Vitae nunc sed velit dignissim sodales ut eu. Sit amet facilisis magna etiam tempor. Cursus euismod quis viverra nibh. Neque volutpat ac tincidunt vitae semper quis lectus nulla at. Eu facilisis sed odio morbi quis commodo odio aenean. Sollicitudin nibh sit amet commodo nulla facilisi. Tincidunt lobortis feugiat vivamus at augue eget arcu dictum. Ipsum dolor sit amet consectetur. Sed risus pretium quam vulputate dignissim suspendisse in est ante. Feugiat nibh sed pulvinar proin. Pellentesque pulvinar pellentesque habitant morbi tristique senectus. Varius quam quisque id diam vel quam elementum pulvinar. Enim sit amet venenatis urna cursus eget. Posuere urna nec tincidunt praesent semper. Facilisi nullam vehicula ipsum a arcu cursus vitae congue mauris. + +Et magnis dis parturient montes nascetur ridiculus mus mauris. Interdum varius sit amet mattis vulputate. Velit scelerisque in dictum non consectetur a. Ultrices vitae auctor eu augue ut. Donec ultrices tincidunt arcu non sodales neque. Enim praesent elementum facilisis leo vel fringilla est. Et magnis dis parturient montes nascetur ridiculus mus mauris. Tincidunt praesent semper feugiat nibh sed. Nulla pellentesque dignissim enim sit amet venenatis urna. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Imperdiet dui accumsan sit amet. Eget nulla facilisi etiam dignissim diam. Tempor orci eu lobortis elementum nibh tellus molestie. Eget nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. A cras semper auctor neque vitae tempus quam. Facilisis magna etiam tempor orci eu lobortis elementum. + +Quisque sagittis purus sit amet. In tellus integer feugiat scelerisque varius. Amet facilisis magna etiam tempor orci eu. Ac tortor vitae purus faucibus ornare suspendisse sed nisi. Ipsum dolor sit amet consectetur adipiscing elit pellentesque. Id venenatis a condimentum vitae sapien pellentesque habitant morbi. Vitae tempus quam pellentesque nec nam aliquam. Senectus et netus et malesuada fames. Pretium quam vulputate dignissim suspendisse in est ante in nibh. In iaculis nunc sed augue lacus viverra vitae congue eu. Rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt. Senectus et netus et malesuada fames ac turpis egestas. + +Tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Ultrices sagittis orci a scelerisque purus semper. Aliquam purus sit amet luctus venenatis lectus magna fringilla urna. Duis convallis convallis tellus id interdum velit laoreet id. Diam vulputate ut pharetra sit amet aliquam id diam. Ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Ac feugiat sed lectus vestibulum mattis ullamcorper. Faucibus purus in massa tempor nec feugiat nisl pretium fusce. Cras ornare arcu dui vivamus arcu. Tempor orci eu lobortis elementum nibh tellus molestie nunc. Mi proin sed libero enim sed faucibus turpis. Elit duis tristique sollicitudin nibh sit. Sed adipiscing diam donec adipiscing tristique risus nec feugiat. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Mauris vitae ultricies leo integer. Consectetur lorem donec massa sapien faucibus. Lectus arcu bibendum at varius. + +Non quam lacus suspendisse faucibus. Morbi tincidunt ornare massa eget egestas purus viverra accumsan. Lorem sed risus ultricies tristique nulla aliquet. Tortor condimentum lacinia quis vel. Phasellus faucibus scelerisque eleifend donec pretium. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus est. Fermentum iaculis eu non diam phasellus vestibulum lorem sed. In cursus turpis massa tincidunt dui. Cum sociis natoque penatibus et. Varius vel pharetra vel turpis nunc eget lorem dolor sed. Duis at consectetur lorem donec. Volutpat blandit aliquam etiam erat velit scelerisque. Elit duis tristique sollicitudin nibh sit amet. Quis viverra nibh cras pulvinar mattis nunc. Sapien pellentesque habitant morbi tristique senectus et netus et malesuada. Nibh cras pulvinar mattis nunc. Eleifend donec pretium vulputate sapien nec sagittis. + +Nullam ac tortor vitae purus. Ut sem nulla pharetra diam sit amet nisl suscipit adipiscing. Amet facilisis magna etiam tempor. Vitae nunc sed velit dignissim sodales ut eu sem integer. Sem fringilla ut morbi tincidunt augue interdum velit euismod. Morbi non arcu risus quis. Ut sem nulla pharetra diam. Est velit egestas dui id. Sed felis eget velit aliquet sagittis id consectetur purus ut. Sollicitudin aliquam ultrices sagittis orci a scelerisque. Scelerisque purus semper eget duis at tellus at urna. Ac placerat vestibulum lectus mauris ultrices eros in. Pulvinar pellentesque habitant morbi tristique senectus. + +Convallis a cras semper auctor neque vitae tempus quam. Consequat ac felis donec et odio pellentesque diam. Penatibus et magnis dis parturient montes nascetur. Vitae purus faucibus ornare suspendisse sed nisi. Nibh venenatis cras sed felis eget velit. Cursus vitae congue mauris rhoncus aenean vel elit. Elit at imperdiet dui accumsan sit amet. Ultrices eros in cursus turpis massa tincidunt. Molestie nunc non blandit massa. Ridiculus mus mauris vitae ultricies leo integer. Cras fermentum odio eu feugiat pretium nibh. Nulla facilisi etiam dignissim diam. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat est. Non quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Magna sit amet purus gravida quis blandit turpis cursus in. Non sodales neque sodales ut etiam sit amet. Morbi quis commodo odio aenean sed adipiscing diam. Ullamcorper velit sed ullamcorper morbi. Ipsum consequat nisl vel pretium. + +demo=content