connie 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +23 -0
- data/Gemfile +4 -0
- data/LICENSE +20 -0
- data/README.rdoc +68 -0
- data/Rakefile +45 -0
- data/VERSION +1 -0
- data/lib/connie/connie.rb +54 -0
- data/lib/connie/dictionary.rb +65 -0
- data/lib/connie/generators/dictionary.rb +0 -0
- data/lib/connie/generators.rb +9 -0
- data/lib/connie/parser.rb +64 -0
- data/lib/connie.rb +59 -0
- data/lib/dictionaries/creative.color +19 -0
- data/lib/dictionaries/creative.lorem_ipsum +151 -0
- data/lib/dictionaries/geo/city +478 -0
- data/lib/dictionaries/geo/country +249 -0
- data/lib/dictionaries/geo/language +97 -0
- data/lib/dictionaries/geo/province +13 -0
- data/lib/dictionaries/geo/province_short +13 -0
- data/lib/dictionaries/geo/race +93 -0
- data/lib/dictionaries/geo/state +50 -0
- data/lib/dictionaries/geo/state_short +50 -0
- data/lib/dictionaries/geo/street +500 -0
- data/lib/dictionaries/geo/street_suffix +21 -0
- data/lib/dictionaries/language/frequency +8 -0
- data/lib/dictionaries/names/company +400 -0
- data/lib/dictionaries/names/female +102 -0
- data/lib/dictionaries/names/last +250 -0
- data/lib/dictionaries/names/male +100 -0
- data/lib/dictionaries/names/suffix +5 -0
- data/lib/dictionaries/names/title +6 -0
- data/lib/dictionaries/names.rb +16 -0
- data/lib/dictionaries/net/top_level_domain +9 -0
- data/lib/dictionaries/shopping.shirt_size +7 -0
- data/spec/connie_spec.rb +99 -0
- data/spec/spec_helper.rb +12 -0
- data/spec/test_dictionaries/names/male +1 -0
- metadata +120 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 ilpoldo
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
= Connie
|
2
|
+
==== Little compact library to synthesise data that does not load big files in memory.
|
3
|
+
|
4
|
+
Heavily based on Forgery[http://github.com/sevenwire/forgery.git] it uses the same word sources. It's built to be a bit more customisable and allows you to define new strategies and styles both using ruby modules or big text lists.
|
5
|
+
|
6
|
+
== Install
|
7
|
+
|
8
|
+
On the console:
|
9
|
+
>> gem install connie
|
10
|
+
|
11
|
+
In your Gemfile
|
12
|
+
gem 'connie'
|
13
|
+
|
14
|
+
== Usage
|
15
|
+
|
16
|
+
Connie offers four exciting functionalities:
|
17
|
+
|
18
|
+
* Dictionaries
|
19
|
+
* Shorthand to pick a random element from an array
|
20
|
+
* Interpolating strings
|
21
|
+
|
22
|
+
===Dictionaries
|
23
|
+
|
24
|
+
A dictionary is a vast source of words for a subject, Connie has 4 dictionaries built in:
|
25
|
+
|
26
|
+
* Names
|
27
|
+
* Geo
|
28
|
+
* Net
|
29
|
+
* Creative
|
30
|
+
* Shopping
|
31
|
+
|
32
|
+
For example inspecting the names dictionary:
|
33
|
+
Connie[:names].inspect # Shorthand to access a dictionary
|
34
|
+
<Connie::Dictionary - Connie::Names - company last female suffix title male first gender>
|
35
|
+
You receive a quick overview of what this dictionary can generate. To have the dictionary generate something simply:
|
36
|
+
Connie[:names].first
|
37
|
+
|
38
|
+
== Extending
|
39
|
+
You can extend Dictionaries in two ways:
|
40
|
+
|
41
|
+
* Providing word list files either by putting the _word_name_ file into the _dictionary_name_ folder in a folder registered with connie
|
42
|
+
* Anywhere in your code by adding instance methods to the Connie::_DictionaryName_ module
|
43
|
+
|
44
|
+
The first way will ensure that calling the word type a line is randomly picked from the list; the second is useful to aggregate different words from the lists and present the in different ways:
|
45
|
+
|
46
|
+
# e.g. Extending the names dictionary to return a full name
|
47
|
+
module Connie
|
48
|
+
module Names
|
49
|
+
# Returns a full name
|
50
|
+
def full
|
51
|
+
"#{first} #{last}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
== Note on Patches/Pull Requests
|
57
|
+
|
58
|
+
* Fork the project.
|
59
|
+
* Make your feature addition or bug fix.
|
60
|
+
* Add tests for it. This is important so I don't break it in a
|
61
|
+
future version unintentionally.
|
62
|
+
* Commit, do not mess with rakefile, version, or history.
|
63
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
64
|
+
* Send me a pull request. Bonus points for topic branches.
|
65
|
+
|
66
|
+
== Copyright
|
67
|
+
|
68
|
+
Copyright (c) 2010 Leandro Pedroni. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "connie"
|
8
|
+
gem.summary = %Q{Little compact library to synthesise data that does not load big files in memory}
|
9
|
+
gem.description = %Q{Heavily based on Forgery it uses the same word sources. It's built to be a bit more customisable and allows you to define new strategies and styles both using ruby modules or big text lists.}
|
10
|
+
gem.email = "ilpoldo@gmail.com"
|
11
|
+
gem.homepage = "http://github.com/ilpoldo@gmail.com/connie"
|
12
|
+
gem.authors = ["Leandro Pedroni"]
|
13
|
+
gem.add_development_dependency "rspec", ">= 1.2.9"
|
14
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
15
|
+
end
|
16
|
+
Jeweler::GemcutterTasks.new
|
17
|
+
rescue LoadError
|
18
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
19
|
+
end
|
20
|
+
|
21
|
+
require 'spec/rake/spectask'
|
22
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
23
|
+
spec.libs << 'lib' << 'spec'
|
24
|
+
spec.spec_files = FileList['spec/**/*_spec.rb']
|
25
|
+
end
|
26
|
+
|
27
|
+
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
28
|
+
spec.libs << 'lib' << 'spec'
|
29
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
30
|
+
spec.rcov = true
|
31
|
+
end
|
32
|
+
|
33
|
+
task :spec => :check_dependencies
|
34
|
+
|
35
|
+
task :default => :spec
|
36
|
+
|
37
|
+
require 'rake/rdoctask'
|
38
|
+
Rake::RDocTask.new do |rdoc|
|
39
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
40
|
+
|
41
|
+
rdoc.rdoc_dir = 'rdoc'
|
42
|
+
rdoc.title = "connie #{version}"
|
43
|
+
rdoc.rdoc_files.include('README*')
|
44
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
45
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Connie
|
2
|
+
|
3
|
+
class DictionaryNotFound < StandardError; end
|
4
|
+
class DictionaryNameNotAllowed < StandardError; end
|
5
|
+
|
6
|
+
@dictionaries = {}
|
7
|
+
@alphabet = %w(a A b B c C d D e E f F g G h H i I j J k K l L m M n N o O p P q Q r R s S t T u U v V w W x X y Y z Z)
|
8
|
+
|
9
|
+
def self.dictionaries_paths;@dictionaries_paths;end
|
10
|
+
def self.dictionaries;@dictionaries;end
|
11
|
+
|
12
|
+
def self.[] dictionary_name
|
13
|
+
@dictionaries[dictionary_name.to_sym] or Dictionary.new(dictionary_name.to_s)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.register_dictionary(dictionary)
|
17
|
+
@dictionaries[dictionary.name.to_sym] = dictionary
|
18
|
+
end
|
19
|
+
|
20
|
+
# Picks a random line from a text file
|
21
|
+
def self.pick_a_line_from(file_path)
|
22
|
+
File.open file_path, 'r' do |file|
|
23
|
+
file.inject { |choice, line| rand < 1/file.lineno.to_f ? line.gsub(%r{\s$},'') : choice }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.reload_dictionaries
|
28
|
+
@dictionaries = {}
|
29
|
+
end
|
30
|
+
|
31
|
+
# Returns a random letter
|
32
|
+
def self.letter(variant=nil)
|
33
|
+
index = rand(26)*2
|
34
|
+
index +=1 if variant == :uppercase
|
35
|
+
@alphabet[index]
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.digit
|
39
|
+
rand(9)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.formats format, min = 1, max = 0
|
43
|
+
array = max > 0 ? Array.new(rand(max-min)+min) : Array.new(min)
|
44
|
+
|
45
|
+
generator = case format
|
46
|
+
when :W then lambda {Connie.letter(:uppercase)}
|
47
|
+
when :w then lambda {Connie.letter}
|
48
|
+
when :d then lambda {Connie.digit.to_s}
|
49
|
+
end
|
50
|
+
|
51
|
+
array.map{generator.call}.join
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Connie
|
2
|
+
class Dictionary
|
3
|
+
|
4
|
+
attr_accessor :name, :module_name
|
5
|
+
|
6
|
+
def initialize(dictionary_name)
|
7
|
+
@name = dictionary_name
|
8
|
+
@module_name = dictionary_name.gsub(%r{(?:^|_)([a-z])?}) { $1.upcase }
|
9
|
+
|
10
|
+
#TODO: Check the format of the dictionary name
|
11
|
+
raise DictionaryNameNotAllowed if %w(Dictionary Parser).include? @module_name
|
12
|
+
|
13
|
+
load_dictionary_files_and_modules
|
14
|
+
|
15
|
+
Connie.register_dictionary self
|
16
|
+
end
|
17
|
+
|
18
|
+
def inspect
|
19
|
+
from_the_module = Connie.const_defined?(@module_name) ? Connie.const_get(@module_name).instance_methods : []
|
20
|
+
|
21
|
+
all_the_methods = @word_lists.keys.concat from_the_module
|
22
|
+
|
23
|
+
"#{}<#{self.class} - Connie::#{@module_name} - #{all_the_methods.join(' ')}>"
|
24
|
+
end
|
25
|
+
|
26
|
+
def interpolate string
|
27
|
+
Connie::Parser.process string, self
|
28
|
+
end
|
29
|
+
|
30
|
+
alias :i :interpolate
|
31
|
+
|
32
|
+
def load_dictionary_files_and_modules
|
33
|
+
@word_lists = []
|
34
|
+
|
35
|
+
Connie.dictionaries_paths.each do |dictionaries_path|
|
36
|
+
@word_lists.concat Dir[File.join dictionaries_path, @name, '*']
|
37
|
+
@word_lists.concat Dir[File.join(dictionaries_path, "#{@name}.*")]
|
38
|
+
end
|
39
|
+
|
40
|
+
# Indexes the dictionary files into an array
|
41
|
+
@word_lists = @word_lists.inject({}) {|a,f| a[f.split(%r{[./]}).last.to_sym]=f; a}
|
42
|
+
|
43
|
+
@word_lists.delete :rb
|
44
|
+
|
45
|
+
# Defines methods based on word lists
|
46
|
+
@word_lists.keys.each do |list|
|
47
|
+
instance_eval <<-LIST
|
48
|
+
def #{list} options={}
|
49
|
+
interpolate Connie.pick_a_line_from @word_lists[:#{list}]
|
50
|
+
end
|
51
|
+
LIST
|
52
|
+
end
|
53
|
+
|
54
|
+
# Find and load modules
|
55
|
+
modules = []
|
56
|
+
Connie.dictionaries_paths.each do |dictionaries_path|
|
57
|
+
modules.concat Dir[File.join dictionaries_path, "#{@name}.rb"]
|
58
|
+
end
|
59
|
+
modules.each {|m| require m}
|
60
|
+
|
61
|
+
extend Connie.const_get(@module_name) if Connie.const_defined?(@module_name)
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
File without changes
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Connie
|
2
|
+
class Parser
|
3
|
+
|
4
|
+
#TODO: implement negative lookahead to allow escaping \: and escaping the escaping symbol itself \\
|
5
|
+
attr_accessor :dictionary
|
6
|
+
|
7
|
+
@syntax = {# :method or :dictionary.method
|
8
|
+
%r{((?:[\\]+)?\:\w\w+(?:.\w+)?)} => lambda do |dictionary_and_method|
|
9
|
+
arguments = dictionary_and_method[1..-1].split('.').map &:to_sym
|
10
|
+
case arguments.size
|
11
|
+
when 2 then Connie[arguments[0]].send arguments[1]
|
12
|
+
when 1 then dictionary.send arguments[0]
|
13
|
+
end
|
14
|
+
end,
|
15
|
+
# :d - one digit
|
16
|
+
%r{((?:[\\]+)?\:[wWd])(?:[^\w\{])} => lambda do |letter_or_digit|
|
17
|
+
Connie.formats letter_or_digit[1].to_sym
|
18
|
+
end,
|
19
|
+
# :w{2,4} - two to four letters
|
20
|
+
%r{((?:[\\]+)?\:[wWd](?:\{\d+(?:,\d+)?\}))} => lambda do |character_and_frequency|
|
21
|
+
character, f_min, f_max = character_and_frequency[1..-1].match(%r{(\w)(?:\{(\d+)(?:,(\d+))?\})})[1..-1]
|
22
|
+
Connie.formats character.to_sym, f_min.to_i, f_max.to_i
|
23
|
+
end
|
24
|
+
|
25
|
+
}
|
26
|
+
|
27
|
+
def self.process string_to_parse, dictionary = Connie[:names]
|
28
|
+
tokenized = string_to_parse.split Regexp.union(@syntax.keys)
|
29
|
+
|
30
|
+
Connie::Parser.new(dictionary).apply_syntax(tokenized).join
|
31
|
+
end
|
32
|
+
|
33
|
+
def initialize(dictionary)
|
34
|
+
@dictionary = dictionary
|
35
|
+
end
|
36
|
+
|
37
|
+
# calls trasform on the tokens marked for interpolation and deals with escaping
|
38
|
+
def apply_syntax tokens
|
39
|
+
tokens.map do |t|
|
40
|
+
if t[0] && t[0].chr == ':'
|
41
|
+
transform t
|
42
|
+
elsif t[0] && t[0].chr == '\\' # some level of escaping is present
|
43
|
+
raise 'I don\' speak escapeese yet!'
|
44
|
+
else
|
45
|
+
t
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Interpolates a syntax token
|
51
|
+
def transform string
|
52
|
+
result = nil
|
53
|
+
syntax.each_pair { |k,func| result = instance_exec(string, &func) if string.match(k) }
|
54
|
+
return result
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def syntax
|
60
|
+
@rebound_syntax ||= self.class.instance_variable_get('@syntax')
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
data/lib/connie.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'connie/connie'
|
2
|
+
require 'connie/dictionary'
|
3
|
+
require 'connie/parser'
|
4
|
+
|
5
|
+
|
6
|
+
module Connie
|
7
|
+
# class Railtie < Rails::Railtie
|
8
|
+
# config.tabelle = ActiveSupport::OrderedOptions.new
|
9
|
+
#
|
10
|
+
# initializer "tabelle.tabelle" do |app|
|
11
|
+
# ActiveSupport.on_load(:action_view) do
|
12
|
+
# include Tabelle::Helper
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# ActiveSupport.on_load(:action_controller) do
|
16
|
+
# include Tabelle::Controller
|
17
|
+
# append_view_path File.expand_path('views',File.dirname(__FILE__))
|
18
|
+
# end
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# end
|
22
|
+
@dictionaries_paths = [File.expand_path('dictionaries',File.dirname(__FILE__))]
|
23
|
+
VERSION = File.exist?('VERSION') ? File.read('VERSION') : ""
|
24
|
+
end
|
25
|
+
|
26
|
+
# The shorthand method to use connie
|
27
|
+
# Accepts three kinds of arguments:
|
28
|
+
#
|
29
|
+
# 1) String
|
30
|
+
# Connie parses the string replacing the :dictionary.format bits of string with random
|
31
|
+
# results from it's dictionaries
|
32
|
+
#
|
33
|
+
# 2) Symbols
|
34
|
+
# Uses the symbol to pick the dictionary to return and eventually calls the format on
|
35
|
+
# it.
|
36
|
+
#
|
37
|
+
# 3) Arrays
|
38
|
+
# As a form of convenience Connie picks a random element out of the array passed
|
39
|
+
#
|
40
|
+
def Connie(argument, options={})
|
41
|
+
case argument
|
42
|
+
when String
|
43
|
+
Connie::Parser.process(argument)
|
44
|
+
when Symbol
|
45
|
+
argument = argument.to_s.split('.').map &:to_sym
|
46
|
+
|
47
|
+
dictionary = Connie[argument.first]
|
48
|
+
|
49
|
+
if argument[1]
|
50
|
+
dictionary.send argument[1], options
|
51
|
+
else
|
52
|
+
dictionary
|
53
|
+
end
|
54
|
+
when Array
|
55
|
+
argument[rand(argument.size)]
|
56
|
+
else
|
57
|
+
raise ArgumentError, 'Connie\'s shorthand expects a string to parse or a symbol or an array'
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,151 @@
|
|
1
|
+
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
|
2
|
+
Proin risus.
|
3
|
+
Praesent lectus.
|
4
|
+
Vestibulum quam sapien, varius ut, blandit non, interdum in, ante.
|
5
|
+
Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio.
|
6
|
+
Curabitur convallis.
|
7
|
+
Duis consequat dui nec nisi volutpat eleifend.
|
8
|
+
Donec ut dolor.
|
9
|
+
Morbi vel lectus in quam fringilla rhoncus.
|
10
|
+
Mauris enim leo, rhoncus sed, vestibulum sit amet, cursus id, turpis.
|
11
|
+
Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci.
|
12
|
+
Mauris lacinia sapien quis libero.
|
13
|
+
Nullam sit amet turpis elementum ligula vehicula consequat.
|
14
|
+
Morbi a ipsum.
|
15
|
+
Integer a nibh.
|
16
|
+
In quis justo.
|
17
|
+
Maecenas rhoncus aliquam lacus.
|
18
|
+
Morbi quis tortor id nulla ultrices aliquet.
|
19
|
+
Maecenas leo odio, condimentum id, luctus nec, molestie sed, justo.
|
20
|
+
Pellentesque viverra pede ac diam.
|
21
|
+
Cras pellentesque volutpat dui.
|
22
|
+
Maecenas tristique, est et tempus semper, est quam pharetra magna, ac consequat metus sapien ut nunc.
|
23
|
+
Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam.
|
24
|
+
Suspendisse potenti.
|
25
|
+
Nullam porttitor lacus at turpis.
|
26
|
+
Donec posuere metus vitae ipsum.
|
27
|
+
Aliquam non mauris.
|
28
|
+
Morbi non lectus.
|
29
|
+
Aliquam sit amet diam in magna bibendum imperdiet.
|
30
|
+
Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.
|
31
|
+
Fusce posuere felis sed lacus.
|
32
|
+
Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl.
|
33
|
+
Nunc rhoncus dui vel sem.
|
34
|
+
Sed sagittis.
|
35
|
+
Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci.
|
36
|
+
Nullam molestie nibh in lectus.
|
37
|
+
Pellentesque at nulla.
|
38
|
+
Suspendisse potenti.
|
39
|
+
Cras in purus eu magna vulputate luctus.
|
40
|
+
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
|
41
|
+
Vivamus vestibulum sagittis sapien.
|
42
|
+
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
|
43
|
+
Etiam vel augue.
|
44
|
+
Vestibulum rutrum rutrum neque.
|
45
|
+
Aenean auctor gravida sem.
|
46
|
+
Praesent id massa id nisl venenatis lacinia.
|
47
|
+
Aenean sit amet justo.
|
48
|
+
Morbi ut odio.
|
49
|
+
Cras mi pede, malesuada in, imperdiet et, commodo vulputate, justo.
|
50
|
+
In blandit ultrices enim.
|
51
|
+
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
|
52
|
+
Proin interdum mauris non ligula pellentesque ultrices.
|
53
|
+
Phasellus id sapien in sapien iaculis congue.
|
54
|
+
Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.
|
55
|
+
Aenean lectus.
|
56
|
+
Pellentesque eget nunc.
|
57
|
+
Donec quis orci eget orci vehicula condimentum.
|
58
|
+
Curabitur in libero ut massa volutpat convallis.
|
59
|
+
Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo.
|
60
|
+
Maecenas pulvinar lobortis est.
|
61
|
+
Phasellus sit amet erat.
|
62
|
+
Nulla tempus.
|
63
|
+
Vivamus in felis eu sapien cursus vestibulum.
|
64
|
+
Proin eu mi.
|
65
|
+
Nulla ac enim.
|
66
|
+
In tempor, turpis nec euismod scelerisque, quam turpis adipiscing lorem, vitae mattis nibh ligula nec sem.
|
67
|
+
Duis aliquam convallis nunc.
|
68
|
+
Proin at turpis a pede posuere nonummy.
|
69
|
+
Integer non velit.
|
70
|
+
Donec diam neque, vestibulum eget, vulputate ut, ultrices vel, augue.
|
71
|
+
Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec pharetra, magna vestibulum aliquet ultrices, erat tortor sollicitudin mi, sit amet lobortis sapien sapien non mi.
|
72
|
+
Integer ac neque.
|
73
|
+
Duis bibendum.
|
74
|
+
Morbi non quam nec dui luctus rutrum.
|
75
|
+
Nulla tellus.
|
76
|
+
In sagittis dui vel nisl.
|
77
|
+
Duis ac nibh.
|
78
|
+
Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.
|
79
|
+
Suspendisse potenti.
|
80
|
+
In eleifend quam a odio.
|
81
|
+
In hac habitasse platea dictumst.
|
82
|
+
Maecenas ut massa quis augue luctus tincidunt.
|
83
|
+
Nulla mollis molestie lorem.
|
84
|
+
Quisque ut erat.
|
85
|
+
Curabitur gravida nisi at nibh.
|
86
|
+
In hac habitasse platea dictumst.
|
87
|
+
Aliquam augue quam, sollicitudin vitae, consectetuer eget, rutrum at, lorem.
|
88
|
+
Integer tincidunt ante vel ipsum.
|
89
|
+
Praesent blandit lacinia erat.
|
90
|
+
Vestibulum sed magna at nunc commodo placerat.
|
91
|
+
Praesent blandit.
|
92
|
+
Nam nulla.
|
93
|
+
Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede.
|
94
|
+
Morbi porttitor lorem id ligula.
|
95
|
+
Suspendisse ornare consequat lectus.
|
96
|
+
In est risus, auctor sed, tristique in, tempus sit amet, sem.
|
97
|
+
Fusce consequat.
|
98
|
+
Nulla nisl.
|
99
|
+
Nunc nisl.
|
100
|
+
Duis bibendum, felis sed interdum venenatis, turpis enim blandit mi, in porttitor pede justo eu massa.
|
101
|
+
Donec dapibus.
|
102
|
+
Duis at velit eu est congue elementum.
|
103
|
+
In hac habitasse platea dictumst.
|
104
|
+
Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante.
|
105
|
+
Nulla justo.
|
106
|
+
Aliquam quis turpis eget elit sodales scelerisque.
|
107
|
+
Mauris sit amet eros.
|
108
|
+
Suspendisse accumsan tortor quis turpis.
|
109
|
+
Sed ante.
|
110
|
+
Vivamus tortor.
|
111
|
+
Duis mattis egestas metus.
|
112
|
+
Aenean fermentum.
|
113
|
+
Donec ut mauris eget massa tempor convallis.
|
114
|
+
Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.
|
115
|
+
Quisque id justo sit amet sapien dignissim vestibulum.
|
116
|
+
Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla dapibus dolor vel est.
|
117
|
+
Donec odio justo, sollicitudin ut, suscipit a, feugiat et, eros.
|
118
|
+
Vestibulum ac est lacinia nisi venenatis tristique.
|
119
|
+
Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue.
|
120
|
+
Aliquam erat volutpat.
|
121
|
+
In congue.
|
122
|
+
Etiam justo.
|
123
|
+
Etiam pretium iaculis justo.
|
124
|
+
In hac habitasse platea dictumst.
|
125
|
+
Etiam faucibus cursus urna.
|
126
|
+
Ut tellus.
|
127
|
+
Nulla ut erat id mauris vulputate elementum.
|
128
|
+
Nullam varius.
|
129
|
+
Nulla facilisi.
|
130
|
+
Cras non velit nec nisi vulputate nonummy.
|
131
|
+
Maecenas tincidunt lacus at velit.
|
132
|
+
Vivamus vel nulla eget eros elementum pellentesque.
|
133
|
+
Quisque porta volutpat erat.
|
134
|
+
Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla.
|
135
|
+
Nunc purus.
|
136
|
+
Phasellus in felis.
|
137
|
+
Donec semper sapien a libero.
|
138
|
+
Nam dui.
|
139
|
+
Proin leo odio, porttitor id, consequat in, consequat ut, nulla.
|
140
|
+
Sed accumsan felis.
|
141
|
+
Ut at dolor quis odio consequat varius.
|
142
|
+
Integer ac leo.
|
143
|
+
Pellentesque ultrices mattis odio.
|
144
|
+
Donec vitae nisi.
|
145
|
+
Nam ultrices, libero non mattis pulvinar, nulla pede ullamcorper augue, a suscipit nulla elit ac nulla.
|
146
|
+
Sed vel enim sit amet nunc viverra dapibus.
|
147
|
+
Nulla suscipit ligula in lacus.
|
148
|
+
Curabitur at ipsum ac tellus semper interdum.
|
149
|
+
Mauris ullamcorper purus sit amet nulla.
|
150
|
+
Quisque arcu libero, rutrum ac, lobortis vel, dapibus at, diam.
|
151
|
+
Nam tristique tortor eu pede.
|