htmlgrid 1.1.7 → 1.2.2
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.
- checksums.yaml +4 -4
- data/lib/htmlgrid/booleanvalue.rb +14 -14
- data/lib/htmlgrid/button.rb +9 -9
- data/lib/htmlgrid/centeredcomposite.rb +21 -20
- data/lib/htmlgrid/component.rb +214 -197
- data/lib/htmlgrid/composite.rb +332 -301
- data/lib/htmlgrid/datevalue.rb +12 -12
- data/lib/htmlgrid/div.rb +9 -9
- data/lib/htmlgrid/divcomposite.rb +44 -43
- data/lib/htmlgrid/divform.rb +8 -8
- data/lib/htmlgrid/divlist.rb +17 -19
- data/lib/htmlgrid/divtemplate.rb +6 -6
- data/lib/htmlgrid/dojotoolkit.rb +54 -48
- data/lib/htmlgrid/errormessage.rb +47 -43
- data/lib/htmlgrid/form.rb +70 -62
- data/lib/htmlgrid/formlist.rb +14 -14
- data/lib/htmlgrid/grid.rb +111 -67
- data/lib/htmlgrid/image.rb +17 -16
- data/lib/htmlgrid/infomessage.rb +15 -14
- data/lib/htmlgrid/input.rb +34 -32
- data/lib/htmlgrid/inputcheckbox.rb +13 -13
- data/lib/htmlgrid/inputcurrency.rb +9 -9
- data/lib/htmlgrid/inputdate.rb +11 -11
- data/lib/htmlgrid/inputfile.rb +13 -12
- data/lib/htmlgrid/inputradio.rb +9 -9
- data/lib/htmlgrid/inputtext.rb +10 -10
- data/lib/htmlgrid/javascript.rb +17 -16
- data/lib/htmlgrid/label.rb +53 -49
- data/lib/htmlgrid/labeltext.rb +8 -8
- data/lib/htmlgrid/link.rb +31 -27
- data/lib/htmlgrid/list.rb +121 -110
- data/lib/htmlgrid/namedcomponent.rb +28 -25
- data/lib/htmlgrid/pass.rb +11 -11
- data/lib/htmlgrid/passthru.rb +20 -17
- data/lib/htmlgrid/popuplink.rb +41 -39
- data/lib/htmlgrid/reset.rb +8 -8
- data/lib/htmlgrid/richtext.rb +22 -20
- data/lib/htmlgrid/select.rb +28 -26
- data/lib/htmlgrid/span.rb +9 -9
- data/lib/htmlgrid/spancomposite.rb +18 -18
- data/lib/htmlgrid/spanlist.rb +9 -9
- data/lib/htmlgrid/staticinput.rb +14 -13
- data/lib/htmlgrid/submit.rb +9 -9
- data/lib/htmlgrid/template.rb +121 -105
- data/lib/htmlgrid/text.rb +9 -9
- data/lib/htmlgrid/textarea.rb +19 -17
- data/lib/htmlgrid/ulcomposite.rb +22 -22
- data/lib/htmlgrid/ullist.rb +9 -9
- data/lib/htmlgrid/urllink.rb +38 -36
- data/lib/htmlgrid/value.rb +9 -9
- data/lib/htmlgrid/version.rb +2 -2
- data/test/stub/cgi.rb +10 -7
- data/test/suite.rb +3 -3
- data/test/test_add_row.rb +12 -13
- data/test/test_component.rb +141 -91
- data/test/test_composite.rb +85 -46
- data/test/test_datevalue.rb +28 -24
- data/test/test_divlist.rb +126 -0
- data/test/test_dojotoolkit.rb +41 -26
- data/test/test_form.rb +89 -73
- data/test/test_formlist.rb +77 -65
- data/test/test_grid.rb +256 -208
- data/test/test_input.rb +37 -31
- data/test/test_interaction_list.rb +106 -70
- data/test/test_label.rb +91 -77
- data/test/test_list.rb +110 -95
- data/test/test_select.rb +35 -30
- data/test/test_template.rb +66 -55
- data/test/test_text.rb +36 -31
- metadata +17 -4
- data/TooltipDialog.txt +0 -73
- data/interaction_no_inline.txt +0 -1216
data/test/test_input.rb
CHANGED
@@ -21,51 +21,57 @@
|
|
21
21
|
# ywesee - intellectual capital connected, Winterthurerstrasse 52, CH-8006 Zuerich, Switzerland
|
22
22
|
# htmlgrid@ywesee.com, www.ywesee.com/htmlgrid
|
23
23
|
#
|
24
|
-
# TestInput -- htmlgrid -- 18.11.2002 -- hwyss@ywesee.com
|
24
|
+
# TestInput -- htmlgrid -- 18.11.2002 -- hwyss@ywesee.com
|
25
25
|
|
26
26
|
$LOAD_PATH << File.expand_path("../lib", File.dirname(__FILE__))
|
27
27
|
$LOAD_PATH << File.dirname(__FILE__)
|
28
28
|
|
29
|
-
require
|
30
|
-
require
|
31
|
-
require
|
32
|
-
require
|
29
|
+
require "minitest/autorun"
|
30
|
+
require "stub/cgi"
|
31
|
+
require "htmlgrid/button"
|
32
|
+
require "htmlgrid/inputcurrency"
|
33
33
|
|
34
34
|
class StubInputLookandfeel
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
35
|
+
def attributes(key)
|
36
|
+
{
|
37
|
+
"bar" => "roz"
|
38
|
+
}
|
39
|
+
end
|
40
|
+
|
41
|
+
def lookup(key)
|
42
|
+
"Foo"
|
43
|
+
end
|
44
|
+
|
45
|
+
def lookandfeel
|
46
|
+
self
|
47
|
+
end
|
48
|
+
|
49
|
+
def format_price(price)
|
50
|
+
sprintf("%.2f", price.to_f / 100.0) if price.to_i > 0
|
51
|
+
end
|
49
52
|
end
|
53
|
+
|
50
54
|
class StubInputModel
|
51
|
-
|
52
|
-
|
53
|
-
|
55
|
+
def foo
|
56
|
+
1234
|
57
|
+
end
|
54
58
|
end
|
55
59
|
|
56
60
|
class TestInput < Minitest::Test
|
57
|
-
|
58
|
-
|
61
|
+
def test_input
|
62
|
+
input = HtmlGrid::Input.new(:foo, nil, StubInputLookandfeel.new)
|
59
63
|
assert_equal('<INPUT bar="roz" name="foo" value="">', input.to_html(CGI.new))
|
60
|
-
|
61
|
-
|
62
|
-
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_button
|
67
|
+
input = HtmlGrid::Button.new(:foo, nil, StubInputLookandfeel.new)
|
63
68
|
assert_equal('<INPUT bar="roz" value="Foo" type="button" name="foo">', input.to_html(CGI.new))
|
64
|
-
|
69
|
+
end
|
65
70
|
end
|
71
|
+
|
66
72
|
class TestInputCurrency < Minitest::Test
|
67
|
-
|
68
|
-
|
73
|
+
def test_to_html
|
74
|
+
input = HtmlGrid::InputCurrency.new(:foo, StubInputModel.new, StubInputLookandfeel.new)
|
69
75
|
assert_equal('<INPUT bar="roz" name="foo" value="12.34" type="text">', input.to_html(CGI.new))
|
70
|
-
|
76
|
+
end
|
71
77
|
end
|
@@ -1,20 +1,20 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
2
|
+
|
3
3
|
# A little bit more elaborated test of the list, where we add different lines
|
4
4
|
# Constructing can be a little tricky.
|
5
5
|
# Also shows one can choose a differnt background color for a line
|
6
6
|
# Added by Niklaus Giger who had to some improvemnts for the interaction_chooser
|
7
|
-
$: << File.expand_path(
|
7
|
+
$: << File.expand_path("../lib", File.dirname(__FILE__))
|
8
8
|
$: << File.dirname(__FILE__)
|
9
9
|
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
10
|
+
require "minitest"
|
11
|
+
require "minitest/autorun"
|
12
|
+
require "stub/cgi"
|
13
|
+
require "htmlgrid/composite"
|
14
|
+
require "htmlgrid/inputtext"
|
15
|
+
require "htmlgrid/form"
|
16
|
+
require "htmlgrid/list"
|
17
|
+
require "htmlgrid/div"
|
18
18
|
|
19
19
|
module InteractionTest
|
20
20
|
class StubComposite < HtmlGrid::Composite
|
@@ -24,130 +24,151 @@ module InteractionTest
|
|
24
24
|
[0, 0, 1] => :foo,
|
25
25
|
[0, 0, 2] => :baz,
|
26
26
|
[0, 1, 0] => :baz,
|
27
|
-
[0, 1, 1] => :baz
|
27
|
+
[0, 1, 1] => :baz
|
28
28
|
}
|
29
29
|
LABELS = true
|
30
30
|
SYMBOL_MAP = {
|
31
|
-
:
|
31
|
+
bar: HtmlGrid::InputText
|
32
32
|
}
|
33
33
|
attr_reader :model, :session
|
34
34
|
public :resolve_offset, :labels?
|
35
35
|
def initialize(first, second, third = nil)
|
36
36
|
super(first, second)
|
37
37
|
end
|
38
|
+
|
38
39
|
def init
|
39
|
-
@barcount=0
|
40
|
+
@barcount = 0
|
40
41
|
super
|
41
42
|
end
|
42
|
-
|
43
|
+
|
44
|
+
def foo(model, session = @session)
|
43
45
|
"Foo"
|
44
46
|
end
|
45
|
-
|
47
|
+
|
48
|
+
def baz(model, session = @session)
|
46
49
|
@barcount += 1
|
47
50
|
"Baz#{@barcount}"
|
48
51
|
end
|
49
52
|
end
|
53
|
+
|
50
54
|
class StubCompositeComponent < HtmlGrid::Component
|
51
55
|
def to_html(context)
|
52
|
-
context.a(@attributes) {
|
56
|
+
context.a(@attributes) { "brafoo" }
|
53
57
|
end
|
54
58
|
end
|
59
|
+
|
55
60
|
class StubComposite2 < HtmlGrid::Composite
|
56
61
|
COMPONENTS = {
|
57
|
-
[0, 0] => StubCompositeComponent
|
62
|
+
[0, 0] => StubCompositeComponent
|
58
63
|
}
|
59
64
|
end
|
65
|
+
|
60
66
|
class StubComposite3 < StubComposite2
|
61
|
-
COMPONENT_CSS_MAP = {[0, 0, 4, 4] =>
|
67
|
+
COMPONENT_CSS_MAP = {[0, 0, 4, 4] => "standard"}
|
62
68
|
end
|
69
|
+
|
63
70
|
class StubComposite4 < StubComposite3
|
64
|
-
CSS_MAP = {[0, 0] =>
|
65
|
-
COMPONENT_CSS_MAP = {[0, 0, 4, 4] =>
|
71
|
+
CSS_MAP = {[0, 0] => "dradnats"}
|
72
|
+
COMPONENT_CSS_MAP = {[0, 0, 4, 4] => "standard"}
|
66
73
|
end
|
74
|
+
|
67
75
|
class StubCompositeNoLabel < HtmlGrid::Composite
|
68
76
|
LABELS = false
|
69
77
|
COMPONENTS = {}
|
70
78
|
public :labels?
|
71
79
|
end
|
80
|
+
|
72
81
|
class StubCompositeModel
|
73
82
|
end
|
83
|
+
|
74
84
|
class StubCompositeLookandfeel
|
75
85
|
def attributes(key)
|
76
86
|
{}
|
77
87
|
end
|
88
|
+
|
78
89
|
def lookup(key)
|
79
90
|
end
|
91
|
+
|
80
92
|
def base_url
|
81
|
-
|
93
|
+
"http://www.oddb.org/de/gcc"
|
82
94
|
end
|
83
95
|
end
|
96
|
+
|
84
97
|
class StubCompositeSession
|
85
98
|
attr_accessor :event
|
86
99
|
def lookandfeel
|
87
100
|
StubCompositeLookandfeel.new
|
88
101
|
end
|
102
|
+
|
89
103
|
def error(key)
|
90
104
|
end
|
105
|
+
|
91
106
|
def user_agent
|
92
|
-
|
107
|
+
"user_agent"
|
93
108
|
end
|
94
109
|
end
|
110
|
+
|
95
111
|
class StubCompositeForm < HtmlGrid::Form
|
96
112
|
COMPONENTS = {
|
97
113
|
[0, 0] => StubComposite
|
98
114
|
}
|
99
115
|
EVENT = :foo
|
100
116
|
end
|
117
|
+
|
101
118
|
class StubCompositeColspan1 < HtmlGrid::Composite
|
102
119
|
COMPONENTS = {}
|
103
120
|
end
|
121
|
+
|
104
122
|
class StubCompositeColspan2 < HtmlGrid::Composite
|
105
123
|
COMPONENTS = {
|
106
|
-
[0, 0] => :foo
|
124
|
+
[0, 0] => :foo
|
107
125
|
}
|
108
126
|
end
|
127
|
+
|
109
128
|
class StubCompositeColspan3 < HtmlGrid::Composite
|
110
129
|
COMPONENTS = {
|
111
130
|
[0, 0] => :foo,
|
112
|
-
[1, 0] => :bar
|
131
|
+
[1, 0] => :bar
|
113
132
|
}
|
114
133
|
end
|
134
|
+
|
115
135
|
class StubCompositeColspan4 < HtmlGrid::Composite
|
116
136
|
COMPONENTS = {
|
117
137
|
[0, 0] => :foo,
|
118
|
-
[2, 0] => :bar
|
138
|
+
[2, 0] => :bar
|
119
139
|
}
|
120
140
|
end
|
121
141
|
|
122
142
|
class StubInteractionChooserDrugList < HtmlGrid::List
|
123
143
|
attr_reader :model, :value
|
124
144
|
COMPONENTS = {
|
125
|
-
[0, 0] => :info_drug
|
145
|
+
[0, 0] => :info_drug
|
126
146
|
}
|
127
147
|
CSS_MAP = {
|
128
|
-
[0, 0] =>
|
148
|
+
[0, 0] => "css.info"
|
129
149
|
}
|
130
150
|
SORT_HEADER = false
|
131
151
|
SORT_DEFAULT = :foo
|
132
|
-
def initialize(models, session
|
152
|
+
def initialize(models, session = @session)
|
133
153
|
@drugs = nil
|
134
154
|
super # must come first or it will overwrite @value
|
135
155
|
@value = []
|
136
|
-
models.each{ |model|
|
156
|
+
models.each { |model|
|
137
157
|
@value << StubInteractionChooserDrug.new(model, session)
|
138
158
|
}
|
139
159
|
end
|
160
|
+
|
140
161
|
def to_html(context)
|
141
162
|
div = HtmlGrid::Div.new(@model, @session, self)
|
142
|
-
if @drugs
|
163
|
+
if @drugs && !@drugs.empty?
|
143
164
|
link = HtmlGrid::Link.new(:delete, @model, @session, self)
|
144
|
-
link.href
|
165
|
+
link.href = @lookandfeel._event_url(:delete_all, [])
|
145
166
|
link.value = @lookandfeel.lookup(:interaction_chooser_delete_all)
|
146
|
-
link.css_class =
|
167
|
+
link.css_class = "list"
|
147
168
|
div.value = link
|
148
169
|
end
|
149
|
-
div.set_attribute(
|
150
|
-
@value << div unless @value.find{ |v| v.attributes[
|
170
|
+
div.set_attribute("id", "drugs")
|
171
|
+
@value << div unless @value.find { |v| v.attributes["id"].eql?("drugs") }
|
151
172
|
super
|
152
173
|
end
|
153
174
|
end
|
@@ -157,11 +178,13 @@ module InteractionTest
|
|
157
178
|
def initialize(foo)
|
158
179
|
@foo = foo
|
159
180
|
end
|
181
|
+
|
160
182
|
def fachinfo
|
161
183
|
@foo
|
162
184
|
end
|
185
|
+
|
163
186
|
def drug
|
164
|
-
|
187
|
+
"Drug"
|
165
188
|
end
|
166
189
|
end
|
167
190
|
|
@@ -169,87 +192,100 @@ module InteractionTest
|
|
169
192
|
COMPONENTS = {
|
170
193
|
[0, 0] => :fachinfo,
|
171
194
|
[1, 0] => :atc,
|
172
|
-
[2, 0] => :delete
|
195
|
+
[2, 0] => :delete
|
173
196
|
}
|
174
197
|
CSS_MAP = {
|
175
|
-
[0, 0] =>
|
176
|
-
[1, 0] =>
|
177
|
-
[2, 0] =>
|
198
|
+
[0, 0] => "small",
|
199
|
+
[1, 0] => "interaction-atc",
|
200
|
+
[2, 0] => "small"
|
178
201
|
}
|
179
202
|
HTML_ATTRIBUTES = {
|
180
|
-
|
203
|
+
"style" => "background-color:greenyellow"
|
181
204
|
}
|
182
205
|
def init
|
183
206
|
super
|
184
207
|
end
|
185
|
-
|
208
|
+
|
209
|
+
def fachinfo(model, session = @session)
|
186
210
|
"fachinfo-#{model.foo}"
|
187
211
|
end
|
188
|
-
|
189
|
-
|
212
|
+
|
213
|
+
def atc(model, session = @session)
|
214
|
+
"atc"
|
190
215
|
end
|
191
|
-
|
192
|
-
|
216
|
+
|
217
|
+
def delete(model, session = @session)
|
218
|
+
"delete"
|
193
219
|
end
|
194
220
|
end
|
221
|
+
|
195
222
|
class StubInteractionChooserDrug < HtmlGrid::Composite
|
196
223
|
COMPONENTS = {
|
197
|
-
|
224
|
+
}
|
198
225
|
CSS_MAP = {}
|
199
|
-
CSS_CLASS =
|
226
|
+
CSS_CLASS = "composite"
|
200
227
|
@@barcode ||= 0
|
201
228
|
def init
|
202
229
|
@@barcode += 1
|
203
|
-
components.store([0,0], :header_info)
|
204
|
-
css_map.store([0,0],
|
230
|
+
components.store([0, 0], :header_info)
|
231
|
+
css_map.store([0, 0], "subheading")
|
205
232
|
1.upto(@@barcode) { |idx|
|
206
|
-
components.store([0,idx], :text_info)
|
233
|
+
components.store([0, idx], :text_info)
|
207
234
|
}
|
208
|
-
@attributes.store(
|
235
|
+
@attributes.store("id", "drugs_" + @@barcode.to_s)
|
209
236
|
super
|
210
237
|
end
|
211
|
-
|
238
|
+
|
239
|
+
def header_info(model, session = @session)
|
212
240
|
StubInteractionChooserDrugHeader.new(model, session, self)
|
213
241
|
end
|
214
|
-
|
242
|
+
|
243
|
+
def text_info(model, session = @session)
|
215
244
|
"interaction for #{model.foo}"
|
216
245
|
end
|
217
246
|
end
|
247
|
+
|
218
248
|
class TestComposite < Minitest::Test
|
219
249
|
def setup
|
220
250
|
@composite = StubComposite.new(
|
221
|
-
StubCompositeModel.new, StubCompositeSession.new
|
251
|
+
StubCompositeModel.new, StubCompositeSession.new
|
252
|
+
)
|
222
253
|
end
|
254
|
+
|
223
255
|
def test_create_method
|
224
|
-
foo = nil
|
225
256
|
foo = @composite.create(:foo, @composite.model)
|
226
257
|
assert_equal("Foo", foo)
|
227
258
|
end
|
259
|
+
|
228
260
|
def test_to_html
|
229
|
-
assert_equal(<<-EXP.gsub(/\n|^\s*/,
|
261
|
+
assert_equal(<<-EXP.gsub(/\n|^\s*/, ""), @composite.to_html(CGI.new))
|
230
262
|
<TABLE cellspacing="0">
|
231
263
|
<TR><TD>Baz1FooBaz2</TD></TR><TR><TD>Baz3Baz4</TD></TR>
|
232
264
|
</TABLE>
|
233
265
|
EXP
|
234
266
|
end
|
267
|
+
|
235
268
|
def test_component_css_map
|
236
269
|
table = StubComposite2.new(
|
237
|
-
StubCompositeModel.new, StubCompositeSession.new
|
238
|
-
|
270
|
+
StubCompositeModel.new, StubCompositeSession.new
|
271
|
+
)
|
272
|
+
assert_equal(<<-EXP.gsub(/\n|^\s*/, ""), table.to_html(CGI.new))
|
239
273
|
<TABLE cellspacing="0">
|
240
274
|
<TR><TD><A>brafoo</A></TD></TR>
|
241
275
|
</TABLE>
|
242
276
|
EXP
|
243
277
|
table = StubComposite3.new(
|
244
|
-
StubCompositeModel.new, StubCompositeSession.new
|
245
|
-
|
278
|
+
StubCompositeModel.new, StubCompositeSession.new
|
279
|
+
)
|
280
|
+
assert_equal(<<-EXP.gsub(/\n|^\s*/, ""), table.to_html(CGI.new))
|
246
281
|
<TABLE cellspacing="0">
|
247
282
|
<TR><TD><A class="standard">brafoo</A></TD></TR>
|
248
283
|
</TABLE>
|
249
284
|
EXP
|
250
285
|
table = StubComposite4.new(
|
251
|
-
StubCompositeModel.new, StubCompositeSession.new
|
252
|
-
|
286
|
+
StubCompositeModel.new, StubCompositeSession.new
|
287
|
+
)
|
288
|
+
assert_equal(<<-EXP.gsub(/\n|^\s*/, ""), table.to_html(CGI.new))
|
253
289
|
<TABLE cellspacing=\"0\"><TR><TD class=\"dradnats\"><A class=\"standard\">brafoo</A></TD></TR></TABLE>
|
254
290
|
EXP
|
255
291
|
end
|
@@ -258,11 +294,12 @@ module InteractionTest
|
|
258
294
|
# Spruce up lines in expectation
|
259
295
|
def test_interaction_list_to_html
|
260
296
|
models = [
|
261
|
-
StubDrugModel.new(
|
262
|
-
StubDrugModel.new(
|
297
|
+
StubDrugModel.new("Aspirin"),
|
298
|
+
StubDrugModel.new("Marcoumar")
|
263
299
|
]
|
264
300
|
composite = StubInteractionChooserDrugList.new(
|
265
|
-
models, StubCompositeSession.new
|
301
|
+
models, StubCompositeSession.new
|
302
|
+
)
|
266
303
|
expected = [
|
267
304
|
'<TABLE cellspacing="0" class="composite" id="drugs_1">',
|
268
305
|
'<TR><TD class="subheading"><TABLE cellspacing="0" style="background-color:greenyellow">',
|
@@ -270,17 +307,16 @@ module InteractionTest
|
|
270
307
|
'<TR><TD>interaction for Aspirin</TD></TR></TABLE> <TABLE cellspacing="0" class="composite" id="drugs_2">',
|
271
308
|
'<TR><TD class="subheading"><TABLE cellspacing="0" style="background-color:greenyellow">',
|
272
309
|
'<TR><TD class="small">fachinfo-Marcoumar</TD><TD class="interaction-atc">atc</TD><TD class="small">delete</TD></TR></TABLE></TD></TR>',
|
273
|
-
|
310
|
+
"<TR><TD>interaction for Marcoumar</TD></TR>",
|
274
311
|
'<TR><TD>interaction for Marcoumar</TD></TR></TABLE> <DIV id="drugs"></DIV><TABLE cellspacing="0">',
|
275
|
-
|
312
|
+
"<TR><TH> </TH></TR>",
|
276
313
|
'<TR><TD class="css.info"> </TD></TR>',
|
277
|
-
'<TR><TD class="css.info-bg"> </TD></TR></TABLE>'
|
314
|
+
'<TR><TD class="css.info-bg"> </TD></TR></TABLE>'
|
278
315
|
]
|
279
316
|
html = composite.to_html(CGI.new)
|
280
317
|
expected.each_with_index do |line, idx|
|
281
|
-
assert(html.index(line),
|
318
|
+
assert(html.index(line), "#{idx}: missing #{line} in #{html}")
|
282
319
|
end
|
283
320
|
end
|
284
321
|
end
|
285
322
|
end
|
286
|
-
|