ign-mongo_mapper 0.8.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +20 -0
- data/README.rdoc +33 -0
- data/UPGRADES +7 -0
- data/bin/mmconsole +60 -0
- data/examples/attr_accessible.rb +22 -0
- data/examples/attr_protected.rb +22 -0
- data/examples/cache_key.rb +24 -0
- data/examples/custom_types.rb +24 -0
- data/examples/identity_map.rb +33 -0
- data/examples/identity_map/automatic.rb +8 -0
- data/examples/keys.rb +40 -0
- data/examples/modifiers/set.rb +25 -0
- data/examples/plugins.rb +41 -0
- data/examples/querying.rb +35 -0
- data/examples/safe.rb +43 -0
- data/examples/scopes.rb +52 -0
- data/examples/validating/embedded_docs.rb +29 -0
- data/lib/mongo_mapper.rb +83 -0
- data/lib/mongo_mapper/connection.rb +83 -0
- data/lib/mongo_mapper/document.rb +41 -0
- data/lib/mongo_mapper/embedded_document.rb +31 -0
- data/lib/mongo_mapper/exceptions.rb +27 -0
- data/lib/mongo_mapper/extensions/array.rb +19 -0
- data/lib/mongo_mapper/extensions/binary.rb +22 -0
- data/lib/mongo_mapper/extensions/boolean.rb +44 -0
- data/lib/mongo_mapper/extensions/date.rb +25 -0
- data/lib/mongo_mapper/extensions/float.rb +14 -0
- data/lib/mongo_mapper/extensions/hash.rb +14 -0
- data/lib/mongo_mapper/extensions/integer.rb +19 -0
- data/lib/mongo_mapper/extensions/kernel.rb +9 -0
- data/lib/mongo_mapper/extensions/nil_class.rb +18 -0
- data/lib/mongo_mapper/extensions/object.rb +27 -0
- data/lib/mongo_mapper/extensions/object_id.rb +30 -0
- data/lib/mongo_mapper/extensions/set.rb +20 -0
- data/lib/mongo_mapper/extensions/string.rb +18 -0
- data/lib/mongo_mapper/extensions/time.rb +29 -0
- data/lib/mongo_mapper/middleware/identity_map.rb +16 -0
- data/lib/mongo_mapper/plugins.rb +15 -0
- data/lib/mongo_mapper/plugins/accessible.rb +44 -0
- data/lib/mongo_mapper/plugins/associations.rb +134 -0
- data/lib/mongo_mapper/plugins/associations/base.rb +124 -0
- data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +29 -0
- data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +24 -0
- data/lib/mongo_mapper/plugins/associations/collection.rb +27 -0
- data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +40 -0
- data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +151 -0
- data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +28 -0
- data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +109 -0
- data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +32 -0
- data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +24 -0
- data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +14 -0
- data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +41 -0
- data/lib/mongo_mapper/plugins/associations/one_proxy.rb +68 -0
- data/lib/mongo_mapper/plugins/associations/proxy.rb +139 -0
- data/lib/mongo_mapper/plugins/caching.rb +21 -0
- data/lib/mongo_mapper/plugins/callbacks.rb +243 -0
- data/lib/mongo_mapper/plugins/clone.rb +22 -0
- data/lib/mongo_mapper/plugins/descendants.rb +17 -0
- data/lib/mongo_mapper/plugins/dirty.rb +124 -0
- data/lib/mongo_mapper/plugins/document.rb +41 -0
- data/lib/mongo_mapper/plugins/dynamic_querying.rb +43 -0
- data/lib/mongo_mapper/plugins/dynamic_querying/dynamic_finder.rb +44 -0
- data/lib/mongo_mapper/plugins/embedded_document.rb +48 -0
- data/lib/mongo_mapper/plugins/equality.rb +17 -0
- data/lib/mongo_mapper/plugins/identity_map.rb +128 -0
- data/lib/mongo_mapper/plugins/indexes.rb +12 -0
- data/lib/mongo_mapper/plugins/inspect.rb +15 -0
- data/lib/mongo_mapper/plugins/keys.rb +311 -0
- data/lib/mongo_mapper/plugins/keys/key.rb +65 -0
- data/lib/mongo_mapper/plugins/logger.rb +18 -0
- data/lib/mongo_mapper/plugins/modifiers.rb +112 -0
- data/lib/mongo_mapper/plugins/pagination.rb +14 -0
- data/lib/mongo_mapper/plugins/persistence.rb +69 -0
- data/lib/mongo_mapper/plugins/protected.rb +53 -0
- data/lib/mongo_mapper/plugins/querying.rb +176 -0
- data/lib/mongo_mapper/plugins/querying/decorator.rb +46 -0
- data/lib/mongo_mapper/plugins/querying/plucky_methods.rb +15 -0
- data/lib/mongo_mapper/plugins/rails.rb +58 -0
- data/lib/mongo_mapper/plugins/safe.rb +28 -0
- data/lib/mongo_mapper/plugins/sci.rb +32 -0
- data/lib/mongo_mapper/plugins/scopes.rb +21 -0
- data/lib/mongo_mapper/plugins/serialization.rb +76 -0
- data/lib/mongo_mapper/plugins/timestamps.rb +22 -0
- data/lib/mongo_mapper/plugins/userstamps.rb +15 -0
- data/lib/mongo_mapper/plugins/validations.rb +50 -0
- data/lib/mongo_mapper/support/descendant_appends.rb +45 -0
- data/lib/mongo_mapper/version.rb +4 -0
- data/rails/init.rb +15 -0
- data/test/_NOTE_ON_TESTING +1 -0
- data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +64 -0
- data/test/functional/associations/test_belongs_to_proxy.rb +117 -0
- data/test/functional/associations/test_in_array_proxy.rb +349 -0
- data/test/functional/associations/test_many_documents_as_proxy.rb +229 -0
- data/test/functional/associations/test_many_documents_proxy.rb +615 -0
- data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +176 -0
- data/test/functional/associations/test_many_embedded_proxy.rb +256 -0
- data/test/functional/associations/test_many_polymorphic_proxy.rb +303 -0
- data/test/functional/associations/test_one_embedded_proxy.rb +100 -0
- data/test/functional/associations/test_one_proxy.rb +206 -0
- data/test/functional/test_accessible.rb +168 -0
- data/test/functional/test_associations.rb +46 -0
- data/test/functional/test_binary.rb +27 -0
- data/test/functional/test_caching.rb +76 -0
- data/test/functional/test_callbacks.rb +151 -0
- data/test/functional/test_dirty.rb +163 -0
- data/test/functional/test_document.rb +272 -0
- data/test/functional/test_dynamic_querying.rb +75 -0
- data/test/functional/test_embedded_document.rb +210 -0
- data/test/functional/test_identity_map.rb +513 -0
- data/test/functional/test_indexes.rb +42 -0
- data/test/functional/test_logger.rb +20 -0
- data/test/functional/test_modifiers.rb +416 -0
- data/test/functional/test_pagination.rb +91 -0
- data/test/functional/test_protected.rb +175 -0
- data/test/functional/test_querying.rb +873 -0
- data/test/functional/test_safe.rb +76 -0
- data/test/functional/test_sci.rb +230 -0
- data/test/functional/test_scopes.rb +171 -0
- data/test/functional/test_string_id_compatibility.rb +67 -0
- data/test/functional/test_timestamps.rb +62 -0
- data/test/functional/test_userstamps.rb +27 -0
- data/test/functional/test_validations.rb +342 -0
- data/test/models.rb +233 -0
- data/test/test_active_model_lint.rb +13 -0
- data/test/test_helper.rb +102 -0
- data/test/unit/associations/test_base.rb +212 -0
- data/test/unit/associations/test_proxy.rb +105 -0
- data/test/unit/serializers/test_json_serializer.rb +217 -0
- data/test/unit/test_clone.rb +69 -0
- data/test/unit/test_descendant_appends.rb +71 -0
- data/test/unit/test_document.rb +208 -0
- data/test/unit/test_dynamic_finder.rb +125 -0
- data/test/unit/test_embedded_document.rb +639 -0
- data/test/unit/test_extensions.rb +376 -0
- data/test/unit/test_identity_map_middleware.rb +34 -0
- data/test/unit/test_inspect.rb +22 -0
- data/test/unit/test_key.rb +205 -0
- data/test/unit/test_keys.rb +89 -0
- data/test/unit/test_mongo_mapper.rb +110 -0
- data/test/unit/test_pagination.rb +11 -0
- data/test/unit/test_plugins.rb +50 -0
- data/test/unit/test_rails.rb +181 -0
- data/test/unit/test_rails_compatibility.rb +52 -0
- data/test/unit/test_serialization.rb +51 -0
- data/test/unit/test_time_zones.rb +39 -0
- data/test/unit/test_validations.rb +564 -0
- metadata +385 -0
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module MongoMapper
|
3
|
+
module Extensions
|
4
|
+
module Date
|
5
|
+
def to_mongo(value)
|
6
|
+
if value.nil? || value == ''
|
7
|
+
nil
|
8
|
+
else
|
9
|
+
date = value.is_a?(::Date) || value.is_a?(::Time) ? value : ::Date.parse(value.to_s)
|
10
|
+
::Time.utc(date.year, date.month, date.day)
|
11
|
+
end
|
12
|
+
rescue
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def from_mongo(value)
|
17
|
+
value.to_date if value.present?
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class Date
|
24
|
+
extend MongoMapper::Extensions::Date
|
25
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module MongoMapper
|
3
|
+
module Extensions
|
4
|
+
module Integer
|
5
|
+
def to_mongo(value)
|
6
|
+
value_to_i = value.to_i
|
7
|
+
if value_to_i == 0 && value != value_to_i
|
8
|
+
value.to_s =~ /^(0x|0b)?0+/ ? 0 : nil
|
9
|
+
else
|
10
|
+
value_to_i
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Integer
|
18
|
+
extend MongoMapper::Extensions::Integer
|
19
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module MongoMapper
|
3
|
+
module Extensions
|
4
|
+
module NilClass
|
5
|
+
def to_mongo(value)
|
6
|
+
value
|
7
|
+
end
|
8
|
+
|
9
|
+
def from_mongo(value)
|
10
|
+
value
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class NilClass
|
17
|
+
include MongoMapper::Extensions::NilClass
|
18
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module MongoMapper
|
3
|
+
module Extensions
|
4
|
+
module Object
|
5
|
+
module ClassMethods
|
6
|
+
def to_mongo(value)
|
7
|
+
value
|
8
|
+
end
|
9
|
+
|
10
|
+
def from_mongo(value)
|
11
|
+
value
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module InstanceMethods
|
16
|
+
def to_mongo
|
17
|
+
self.class.to_mongo(self)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class Object
|
25
|
+
extend MongoMapper::Extensions::Object::ClassMethods
|
26
|
+
include MongoMapper::Extensions::Object::InstanceMethods
|
27
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module MongoMapper
|
3
|
+
module Extensions
|
4
|
+
module ObjectId
|
5
|
+
def to_mongo(value)
|
6
|
+
Plucky.to_object_id(value)
|
7
|
+
end
|
8
|
+
|
9
|
+
def from_mongo(value)
|
10
|
+
value
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class ObjectId
|
17
|
+
extend MongoMapper::Extensions::ObjectId
|
18
|
+
end
|
19
|
+
|
20
|
+
class BSON::ObjectId
|
21
|
+
alias_method :original_to_json, :to_json
|
22
|
+
|
23
|
+
def as_json(options=nil)
|
24
|
+
to_s
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_json(options = nil)
|
28
|
+
as_json.to_json
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'set'
|
3
|
+
|
4
|
+
module MongoMapper
|
5
|
+
module Extensions
|
6
|
+
module Set
|
7
|
+
def to_mongo(value)
|
8
|
+
value.to_a
|
9
|
+
end
|
10
|
+
|
11
|
+
def from_mongo(value)
|
12
|
+
(value || []).to_set
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Set
|
19
|
+
extend MongoMapper::Extensions::Set
|
20
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module MongoMapper
|
3
|
+
module Extensions
|
4
|
+
module String
|
5
|
+
def to_mongo(value)
|
6
|
+
value.nil? ? nil : value.to_s
|
7
|
+
end
|
8
|
+
|
9
|
+
def from_mongo(value)
|
10
|
+
value.nil? ? nil : value.to_s
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class String
|
17
|
+
extend MongoMapper::Extensions::String
|
18
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module MongoMapper
|
3
|
+
module Extensions
|
4
|
+
module Time
|
5
|
+
def to_mongo(value)
|
6
|
+
if value.nil? || value == ''
|
7
|
+
nil
|
8
|
+
else
|
9
|
+
time_class = ::Time.try(:zone).present? ? ::Time.zone : ::Time
|
10
|
+
time = value.is_a?(::Time) ? value : time_class.parse(value.to_s)
|
11
|
+
# strip milliseconds as Ruby does micro and bson does milli and rounding rounded wrong
|
12
|
+
at(time.to_i).utc if time
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def from_mongo(value)
|
17
|
+
if ::Time.try(:zone).present? && value.present?
|
18
|
+
value.in_time_zone(::Time.zone)
|
19
|
+
else
|
20
|
+
value
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class Time
|
28
|
+
extend MongoMapper::Extensions::Time
|
29
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module MongoMapper
|
2
|
+
module Middleware
|
3
|
+
class IdentityMap
|
4
|
+
def initialize(app)
|
5
|
+
@app = app
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(env)
|
9
|
+
MongoMapper::Plugins::IdentityMap.clear
|
10
|
+
@app.call(env)
|
11
|
+
ensure
|
12
|
+
MongoMapper::Plugins::IdentityMap.clear
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module MongoMapper
|
3
|
+
module Plugins
|
4
|
+
def plugins
|
5
|
+
@plugins ||= []
|
6
|
+
end
|
7
|
+
|
8
|
+
def plugin(mod)
|
9
|
+
extend mod::ClassMethods if mod.const_defined?(:ClassMethods)
|
10
|
+
include mod::InstanceMethods if mod.const_defined?(:InstanceMethods)
|
11
|
+
mod.configure(self) if mod.respond_to?(:configure)
|
12
|
+
plugins << mod
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module MongoMapper
|
2
|
+
module Plugins
|
3
|
+
module Accessible
|
4
|
+
module ClassMethods
|
5
|
+
def attr_accessible(*attrs)
|
6
|
+
raise AccessibleOrProtected.new(name) if try(:protected_attributes?)
|
7
|
+
self.write_inheritable_attribute(:attr_accessible, Set.new(attrs) + (accessible_attributes || []))
|
8
|
+
end
|
9
|
+
|
10
|
+
def accessible_attributes?
|
11
|
+
!accessible_attributes.nil?
|
12
|
+
end
|
13
|
+
|
14
|
+
def accessible_attributes
|
15
|
+
self.read_inheritable_attribute(:attr_accessible)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module InstanceMethods
|
20
|
+
def assign(attrs={})
|
21
|
+
super(filter_inaccessible_attrs(attrs))
|
22
|
+
end
|
23
|
+
|
24
|
+
def update_attributes(attrs={})
|
25
|
+
super(filter_inaccessible_attrs(attrs))
|
26
|
+
end
|
27
|
+
|
28
|
+
def update_attributes!(attrs={})
|
29
|
+
super(filter_inaccessible_attrs(attrs))
|
30
|
+
end
|
31
|
+
|
32
|
+
def accessible_attributes
|
33
|
+
self.class.accessible_attributes
|
34
|
+
end
|
35
|
+
|
36
|
+
protected
|
37
|
+
def filter_inaccessible_attrs(attrs)
|
38
|
+
return attrs if accessible_attributes.blank? || attrs.blank?
|
39
|
+
attrs.dup.delete_if { |key, val| !accessible_attributes.include?(key.to_sym) }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module MongoMapper
|
3
|
+
module Plugins
|
4
|
+
module Associations
|
5
|
+
module ClassMethods
|
6
|
+
def inherited(subclass)
|
7
|
+
subclass.associations = associations.dup
|
8
|
+
super
|
9
|
+
end
|
10
|
+
|
11
|
+
def belongs_to(association_id, options={}, &extension)
|
12
|
+
create_association(:belongs_to, association_id, options, &extension)
|
13
|
+
end
|
14
|
+
|
15
|
+
def many(association_id, options={}, &extension)
|
16
|
+
create_association(:many, association_id, options, &extension)
|
17
|
+
end
|
18
|
+
|
19
|
+
def one(association_id, options={}, &extension)
|
20
|
+
create_association(:one, association_id, options, &extension)
|
21
|
+
end
|
22
|
+
|
23
|
+
def associations
|
24
|
+
@associations ||= HashWithIndifferentAccess.new
|
25
|
+
end
|
26
|
+
|
27
|
+
def associations=(hash)
|
28
|
+
@associations = hash
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
def create_association(type, name, options, &extension)
|
33
|
+
association = Associations::Base.new(type, name, options, &extension)
|
34
|
+
associations[association.name] = association
|
35
|
+
|
36
|
+
if association.one? || association.belongs_to?
|
37
|
+
define_method(association.name) do
|
38
|
+
proxy = get_proxy(association)
|
39
|
+
proxy.nil? ? nil : proxy
|
40
|
+
end
|
41
|
+
|
42
|
+
define_method("#{association.name}=") do |value|
|
43
|
+
proxy = get_proxy(association)
|
44
|
+
|
45
|
+
if proxy.nil? || proxy.target != value
|
46
|
+
proxy = build_proxy(association)
|
47
|
+
end
|
48
|
+
|
49
|
+
proxy.replace(value)
|
50
|
+
value
|
51
|
+
end
|
52
|
+
|
53
|
+
define_method("#{association.name}?") do
|
54
|
+
get_proxy(association).present?
|
55
|
+
end
|
56
|
+
|
57
|
+
if association.one?
|
58
|
+
define_method("build_#{association.name}") do |*args|
|
59
|
+
get_proxy(association).build(*args)
|
60
|
+
end
|
61
|
+
|
62
|
+
define_method("create_#{association.name}") do |*args|
|
63
|
+
get_proxy(association).create(*args)
|
64
|
+
end
|
65
|
+
|
66
|
+
define_method("create_#{association.name}!") do |*args|
|
67
|
+
get_proxy(association).create!(*args)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
else
|
71
|
+
define_method(association.name) do
|
72
|
+
get_proxy(association)
|
73
|
+
end
|
74
|
+
|
75
|
+
define_method("#{association.name}=") do |value|
|
76
|
+
get_proxy(association).replace(value)
|
77
|
+
value
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
if association.options[:dependent] && association.many? && !association.embeddable?
|
83
|
+
after_destroy do |doc|
|
84
|
+
case association.options[:dependent]
|
85
|
+
when :destroy
|
86
|
+
doc.get_proxy(association).destroy_all
|
87
|
+
when :delete_all
|
88
|
+
doc.get_proxy(association).delete_all
|
89
|
+
when :nullify
|
90
|
+
doc.get_proxy(association).nullify
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
module InstanceMethods
|
98
|
+
def associations
|
99
|
+
self.class.associations
|
100
|
+
end
|
101
|
+
|
102
|
+
def embedded_associations
|
103
|
+
associations.select do |name, association|
|
104
|
+
association.embeddable?
|
105
|
+
end.map do |name, association|
|
106
|
+
association
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def build_proxy(association)
|
111
|
+
proxy = association.proxy_class.new(self, association)
|
112
|
+
self.instance_variable_set(association.ivar, proxy)
|
113
|
+
|
114
|
+
proxy
|
115
|
+
end
|
116
|
+
|
117
|
+
def get_proxy(association)
|
118
|
+
unless proxy = self.instance_variable_get(association.ivar)
|
119
|
+
proxy = build_proxy(association)
|
120
|
+
end
|
121
|
+
proxy
|
122
|
+
end
|
123
|
+
|
124
|
+
def save_to_collection(options={})
|
125
|
+
super
|
126
|
+
associations.each do |association_name, association|
|
127
|
+
proxy = get_proxy(association)
|
128
|
+
proxy.save_to_collection(options) if proxy.proxy_respond_to?(:save_to_collection)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|