sugarcube 2.12.3 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/lib/all/sugarcube-repl/repl.rb +191 -0
  4. data/lib/all/sugarcube/log.rb +2 -2
  5. data/lib/android/sugarcube-repl/repl.rb +42 -0
  6. data/lib/android/sugarcube/log.rb +8 -0
  7. data/lib/cocoa/sugarcube-repl/repl.rb +48 -214
  8. data/lib/cocoa/sugarcube/log.rb +1 -1
  9. data/lib/ios/sugarcube-568/uiimage.rb +3 -0
  10. data/lib/ios/sugarcube-repl/repl.rb +27 -30
  11. data/lib/osx/sugarcube-repl/repl.rb +14 -25
  12. data/lib/sugarcube-568.rb +2 -9
  13. data/lib/sugarcube-animations.rb +2 -12
  14. data/lib/sugarcube-anonymous.rb +2 -9
  15. data/lib/sugarcube-appkit.rb +3 -12
  16. data/lib/sugarcube-attributedstring.rb +3 -12
  17. data/lib/sugarcube-awesome.rb +2 -9
  18. data/lib/sugarcube-color.rb +2 -9
  19. data/lib/sugarcube-constants.rb +2 -9
  20. data/lib/sugarcube-coregraphics.rb +3 -9
  21. data/lib/sugarcube-corelocation.rb +6 -9
  22. data/lib/sugarcube-events.rb +2 -9
  23. data/lib/sugarcube-factories.rb +2 -9
  24. data/lib/sugarcube-files.rb +2 -9
  25. data/lib/sugarcube-foundation.rb +3 -9
  26. data/lib/sugarcube-gestures.rb +2 -9
  27. data/lib/sugarcube-image.rb +2 -9
  28. data/lib/sugarcube-indexpath.rb +2 -9
  29. data/lib/sugarcube-legacy.rb +2 -18
  30. data/lib/sugarcube-localized.rb +2 -9
  31. data/lib/sugarcube-modal.rb +2 -9
  32. data/lib/sugarcube-notifications.rb +2 -9
  33. data/lib/sugarcube-nscoder.rb +3 -9
  34. data/lib/sugarcube-nsdata.rb +3 -12
  35. data/lib/sugarcube-nsdate.rb +3 -14
  36. data/lib/sugarcube-nsuserdefaults.rb +3 -9
  37. data/lib/sugarcube-numbers.rb +2 -15
  38. data/lib/sugarcube-pipes.rb +2 -9
  39. data/lib/sugarcube-pointer.rb +2 -9
  40. data/lib/sugarcube-repl.rb +2 -16
  41. data/lib/sugarcube-spritekit.rb +6 -12
  42. data/lib/sugarcube-timer.rb +2 -14
  43. data/lib/sugarcube-to_s.rb +2 -15
  44. data/lib/sugarcube-uikit.rb +3 -12
  45. data/lib/sugarcube-unholy.rb +2 -9
  46. data/lib/sugarcube.rb +33 -19
  47. data/lib/sugarcube_pre_setup.rb +44 -0
  48. data/lib/version.rb +1 -1
  49. data/spec/cocoa/nsindexpath_spec.rb +12 -0
  50. metadata +9 -6
  51. data/lib/ios/sugarcube/sugarcube_cleanup.rb +0 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 752d7dc0ceb544310335899b60a7a0fe6318e67e
4
- data.tar.gz: d9b262efcddb013f30fbe2df46a16c82901917e3
3
+ metadata.gz: af8ff35d025712022d4072681b4e992bbdf35933
4
+ data.tar.gz: fa3313ebe914b87fc53dba1fefbbe7850b15f1c9
5
5
  SHA512:
6
- metadata.gz: 987362220aa71265af8616f58eb50520f5b16438e67c6b527b829de9c334139d45f80ca4b6f9aa219841a7a16bfa057fbef6e946a2c58b2b787c3f355a18cf27
7
- data.tar.gz: 09470def3535035ddf877bff1e0977e9ce7e42a545e6c683053e741178d0986d09d86dc1dc607c284547bfef33ac9f4cb000d58d1ec8238441baed2b74b53c67
6
+ metadata.gz: 356bcc1d1b071d764f689f12a0b451e51923af1c45c58862c6a9bddff0fbec2b2c5ab9b4101dc9e2647ed35a3fcf714aab2faf45ac3b55626edca5ad498f2c2c
7
+ data.tar.gz: 3ebd09a8e365620ba204ed78ae0cc0f35c0af051b9f949cf095e407ff7b9bcec3cf72ba1dfd69eca62013b2ab369cf7382df367137f0e422e1f9f4b09f04746f
data/README.md CHANGED
@@ -1658,9 +1658,9 @@ Open up `CLLocationCoordinate2D` to provide handy-dandies
1658
1658
  ```ruby
1659
1659
  # distances
1660
1660
 
1661
- > denver_co = CLLocationCoordinate2D.new(39.739188,-104.985223)
1661
+ > denver_co = CLLocationCoordinate2D.new(39.739188, -104.985223)
1662
1662
  => #<CLLocationCoordinate2D latitude=39.7391815185547 longitude=-104.985198974609>
1663
- > loveland_oh = CLLocationCoordinate2D.new(39.268128,-84.257648)
1663
+ > loveland_oh = CLLocationCoordinate2D.new(39.268128, -84.257648)
1664
1664
  => #<CLLocationCoordinate2D latitude=39.2681274414062 longitude=-84.2576293945312>
1665
1665
  > denver_co.distance_to(loveland_oh)
1666
1666
  => 1773425.54893302 # in meters
@@ -0,0 +1,191 @@
1
+ module SugarCube
2
+ class Repl
3
+ class << self
4
+
5
+ @adjust_item = nil
6
+ @tree_items = nil
7
+ @collapsed_items = nil
8
+ @restore = nil
9
+
10
+ def adjust(item=nil)
11
+ return @adjust_item unless item
12
+
13
+ if item.is_a? Fixnum
14
+ @tree_items ||= build_default_tree
15
+ item = @tree_items[item]
16
+ end
17
+
18
+ # a/adjust will return this object
19
+ @adjust_item = item
20
+
21
+ adjust_init(item)
22
+
23
+ item
24
+ end
25
+
26
+ def collapse(item)
27
+ if item.is_a? Fixnum
28
+ @tree_items ||= build_default_tree
29
+ item = @tree_items[item]
30
+ end
31
+
32
+ @collapsed_items ||= []
33
+ if @collapsed_items.include?(item)
34
+ @collapsed_items.delete(item)
35
+ else
36
+ @collapsed_items << item
37
+ end
38
+
39
+ retval = tree
40
+
41
+ if @collapsed_items
42
+ @collapsed_items.keep_if { |v| @tree_items.include? v }
43
+ end
44
+
45
+ retval
46
+ end
47
+
48
+ def set_default(item)
49
+ @default = item
50
+ end
51
+
52
+ def clear_default
53
+ @default = nil
54
+ end
55
+
56
+ def register_tree_selector(klass, selector=nil, &sel_blk)
57
+ if selector && sel_blk
58
+ raise "You can't hand me a block AND a selector. I don't know what to do with both!"
59
+ end
60
+ tree_selectors[klass] = selector || sel_blk
61
+ end
62
+
63
+ def tree_selectors(klass=nil)
64
+ if ! @tree_selectors
65
+ @tree_selectors ||= {}
66
+ @tree_selectors[nil.class] = -> (foo) { nil }
67
+ register_default_tree_selectors
68
+ end
69
+
70
+ if klass
71
+ @tree_selectors[klass]
72
+ else
73
+ @tree_selectors
74
+ end
75
+ end
76
+
77
+ # @param item this can be a tree-like item (View, ViewController, CALayer,
78
+ # Menu) or an integer, in which case it will select that window. Defalt
79
+ # is to display the keyWindow
80
+ # @param selector If you pass an unsupported object to tree, you will need
81
+ # to pass a selector as well - this method should return an array of
82
+ # items which are passed recursively to tree
83
+ # @block sel_blk If a block is passed, it will be used to build the array of
84
+ # items that are called recursively
85
+ def tree(item=nil, selector=nil, &sel_blk)
86
+ item = get_tree_item(item)
87
+ if selector || sel_blk
88
+ register_tree_selector(item.class, selector, &sel_blk)
89
+ end
90
+
91
+ @tree_items = build_tree(item)
92
+ if @collapsed_items
93
+ @collapsed_items.keep_if { |v| @tree_items.include? v }
94
+ end
95
+
96
+ draw_tree(item)
97
+ puts ''
98
+
99
+ return item
100
+ end
101
+
102
+ def draw_tree(item, tab=nil, is_last=true, items_index=0)
103
+ space = ' '
104
+ if items_index < 10
105
+ print ' '
106
+ elsif items_index < 100
107
+ print ' '
108
+ elsif items_index > 999 # good god, man!
109
+ space = ''
110
+ end
111
+ print items_index.to_s + ":" + space
112
+
113
+ if tab
114
+ print tab
115
+ if @collapsed_items && @collapsed_items.include?(item)
116
+ print '<<< '
117
+ else
118
+ if is_last
119
+ print '`-- '
120
+ tab += ' '
121
+ else
122
+ print '+-- '
123
+ tab += '| '
124
+ end
125
+ end
126
+ else
127
+ print '. '
128
+ tab = ''
129
+ end
130
+
131
+ if self == item || @adjust_item == item
132
+ print "\033[1m"
133
+ end
134
+ print draw_tree_item(item)
135
+ if self == item || @adjust_item == item
136
+ print "\033[0m"
137
+ end
138
+ puts
139
+
140
+ items = call_item_selector(item)
141
+
142
+ unless @collapsed_items && @collapsed_items.include?(item)
143
+ items.each_with_index do |subitem, index|
144
+ items_index += 1
145
+ if self.respond_to? :draw_tree
146
+ items_index = draw_tree(subitem, tab, index == items.length - 1, items_index)
147
+ else
148
+ items_index = draw_tree(subitem, tab, index == items.length - 1, items_index)
149
+ end
150
+ end
151
+ end
152
+
153
+ return items_index
154
+ end
155
+
156
+ def build_tree(item)
157
+ items = call_item_selector(item)
158
+
159
+ ret = [item]
160
+ return ret if @collapsed_items && @collapsed_items.include?(item)
161
+
162
+ items.each_with_index do |subitem, index|
163
+ ret.concat build_tree(subitem)
164
+ end
165
+ ret
166
+ end
167
+
168
+ def call_item_selector(item)
169
+ selector = nil
170
+ klass = item.class
171
+ while klass && !selector
172
+ selector = tree_selectors(klass)
173
+ klass = klass.superclass
174
+ end
175
+
176
+ if !selector
177
+ raise "Unable to determine a SugarCube::Repl::tree selector for #{item.class.to_s}"
178
+ end
179
+
180
+ if selector.is_a? Proc
181
+ items = selector.call(item)
182
+ else
183
+ items = item.send(selector)
184
+ end
185
+
186
+ return items || []
187
+ end
188
+
189
+ end
190
+ end
191
+ end
@@ -11,7 +11,7 @@ module SugarCube
11
11
  if suppress?
12
12
  log << message
13
13
  elsif log?
14
- stderr(message)
14
+ SugarCube.stderr(message)
15
15
  end
16
16
 
17
17
  self
@@ -25,7 +25,7 @@ module SugarCube
25
25
  output << "\n"
26
26
  output << message
27
27
  end
28
- NSLog(output)
28
+ SugarCube.stderr(output)
29
29
  @log = nil
30
30
  end
31
31
 
@@ -0,0 +1,42 @@
1
+ module SugarCube
2
+ class << Repl
3
+
4
+ def build_default_tree
5
+ build_tree(@default)
6
+ end
7
+
8
+ def adjust_init(item)
9
+ if item.is_a?(Android::View)
10
+ @restore = {}
11
+ end
12
+ end
13
+
14
+ def register_default_tree_selectors
15
+ register_tree_selector(Android::ViewLayout) do |view|
16
+ views = []
17
+ item.getChildCount.times do |index|
18
+ views << item.getChildAt(index)
19
+ end
20
+ views
21
+ end
22
+ register_tree_selector(Android::View) { |view| [view] }
23
+ end
24
+
25
+ def draw_tree_item(item)
26
+ item.to_s
27
+ end
28
+
29
+ def get_tree_item(item)
30
+ if item.nil?
31
+ @default
32
+ else
33
+ item
34
+ end
35
+ end
36
+
37
+ def format_frame(frame)
38
+ "[[#{frame.origin.x}, #{frame.origin.y}], [#{frame.size.width}, #{frame.size.height}]]"
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,8 @@
1
+ module SugarCube
2
+ module_function
3
+
4
+ def stderr(message)
5
+ puts message
6
+ end
7
+
8
+ end
@@ -1,63 +1,23 @@
1
1
  module SugarCube
2
- module Repl
3
- module_function
2
+ class << Repl
4
3
 
5
- @sugarcube_view = nil
6
- @sugarcube_items = nil
7
- @sugarcube_collapsed_items = nil
8
- @sugarcube_restore = nil
9
-
10
- def adjust(view=nil)
11
- return @sugarcube_view unless view
12
-
13
- if view.is_a? Fixnum
14
- @sugarcube_items ||= SugarCube::Repl::build_tree(window, :subviews)
15
- view = @sugarcube_items[view]
16
- end
17
-
18
- # a/adjust will return this object
19
- @sugarcube_view = view
20
-
21
- adjust_init(view)
22
-
23
- view
24
- end
25
- alias a adjust
26
-
27
- def collapse(view)
28
- if view.is_a? Fixnum
29
- @sugarcube_items ||= SugarCube::Repl::build_tree(window, :subviews)
30
- view = @sugarcube_items[view]
31
- end
32
-
33
- @sugarcube_collapsed_items ||= []
34
- if @sugarcube_collapsed_items.include?(view)
35
- @sugarcube_collapsed_items.delete(view)
36
- else
37
- @sugarcube_collapsed_items << view
38
- end
39
-
40
- retval = tree
41
-
42
- if @sugarcube_collapsed_items
43
- @sugarcube_collapsed_items.keep_if { |v| @sugarcube_items.include? v }
44
- end
45
-
46
- retval
4
+ def build_default_tree
5
+ build_tree(window)
47
6
  end
48
- alias coll collapse
49
7
 
50
8
  ##| FRAME
51
9
  def frame(f=nil)
52
10
  return unless check_sugarcube_view
53
11
 
54
- return @sugarcube_view.frame unless f
12
+ return @adjust_item.frame unless f
55
13
 
56
- f = SugarCube::CoreGraphics::Rect(f)
57
- @sugarcube_view.frame = f
14
+ if defined?(SugarCube::CoreGraphics)
15
+ f = SugarCube::CoreGraphics::Rect(f)
16
+ end
17
+ @adjust_item.frame = f
58
18
  puts format_frame(f)
59
19
 
60
- @sugarcube_view
20
+ @adjust_item
61
21
  end
62
22
  alias f frame
63
23
 
@@ -70,12 +30,12 @@ module SugarCube
70
30
  def right(val=1)
71
31
  return unless check_sugarcube_view
72
32
 
73
- f = @sugarcube_view.frame
33
+ f = @adjust_item.frame
74
34
  f.origin.x += val
75
- @sugarcube_view.frame = f
35
+ @adjust_item.frame = f
76
36
  puts format_frame(f)
77
37
 
78
- @sugarcube_view
38
+ @adjust_item
79
39
  end
80
40
  alias r right
81
41
 
@@ -87,31 +47,35 @@ module SugarCube
87
47
  def down(val=1)
88
48
  return unless check_sugarcube_view
89
49
 
90
- f = @sugarcube_view.frame
50
+ f = @adjust_item.frame
91
51
  f.origin.y += val
92
- @sugarcube_view.frame = f
52
+ @adjust_item.frame = f
93
53
  puts format_frame(f)
94
54
 
95
- @sugarcube_view
55
+ @adjust_item
96
56
  end
97
57
  alias d down
98
58
 
99
59
  def origin x=nil, y=nil
100
60
  return unless check_sugarcube_view
101
61
 
102
- f = @sugarcube_view.frame
62
+ f = @adjust_item.frame
103
63
  return f.origin unless x
104
64
 
105
65
  if y
106
66
  f.origin.x = x
107
67
  f.origin.y = y
108
68
  else
109
- f.origin = SugarCube::CoreGraphics::Point(x)
69
+ if defined?(SugarCube::CoreGraphics)
70
+ f.origin = SugarCube::CoreGraphics::Point(x)
71
+ else
72
+ f.origin = x
73
+ end
110
74
  end
111
- @sugarcube_view.frame = f
75
+ @adjust_item.frame = f
112
76
  puts format_frame(f)
113
77
 
114
- @sugarcube_view
78
+ @adjust_item
115
79
  end
116
80
  alias o origin
117
81
 
@@ -124,12 +88,12 @@ module SugarCube
124
88
  def wider(val=1)
125
89
  return unless check_sugarcube_view
126
90
 
127
- f = @sugarcube_view.frame
91
+ f = @adjust_item.frame
128
92
  f.size.width += val
129
- @sugarcube_view.frame = f
93
+ @adjust_item.frame = f
130
94
  puts format_frame(f)
131
95
 
132
- @sugarcube_view
96
+ @adjust_item
133
97
  end
134
98
  alias w wider
135
99
 
@@ -141,31 +105,35 @@ module SugarCube
141
105
  def taller(val=1)
142
106
  return unless check_sugarcube_view
143
107
 
144
- f = @sugarcube_view.frame
108
+ f = @adjust_item.frame
145
109
  f.size.height += val
146
- @sugarcube_view.frame = f
110
+ @adjust_item.frame = f
147
111
  puts format_frame(f)
148
112
 
149
- @sugarcube_view
113
+ @adjust_item
150
114
  end
151
115
  alias t taller
152
116
 
153
117
  def size(w=nil, h=nil)
154
118
  return unless check_sugarcube_view
155
119
 
156
- f = @sugarcube_view.frame
120
+ f = @adjust_item.frame
157
121
  return f.size unless w
158
122
 
159
123
  if h
160
124
  f.size.width = w
161
125
  f.size.height = h
162
126
  else
163
- f.size = SugarCube::CoreGraphics::Size(w)
127
+ if defined?(SugarCube::CoreGraphics)
128
+ f.size = SugarCube::CoreGraphics::Size(w)
129
+ else
130
+ f.size = w
131
+ end
164
132
  end
165
- @sugarcube_view.frame = f
133
+ @adjust_item.frame = f
166
134
  puts format_frame(f)
167
135
 
168
- @sugarcube_view
136
+ @adjust_item
169
137
  end
170
138
  alias z size
171
139
 
@@ -173,7 +141,7 @@ module SugarCube
173
141
  def restore
174
142
  return unless check_sugarcube_view
175
143
 
176
- @sugarcube_restore.each do |msg, value|
144
+ @restore.each do |msg, value|
177
145
  SugarCube::Repl.send(msg, value)
178
146
  end
179
147
  end
@@ -203,7 +171,7 @@ module SugarCube
203
171
  element = 1 unless element
204
172
  total = 1 unless total
205
173
 
206
- view = @sugarcube_view
174
+ view = @adjust_item
207
175
 
208
176
  left = view.origin.x
209
177
  top = view.origin.y
@@ -223,17 +191,17 @@ module SugarCube
223
191
  end
224
192
  alias c center
225
193
 
226
- def set_default(item)
227
- @sugarcube_default_item = item
228
- end
229
-
230
- def clear_default
231
- @sugarcube_default_item = nil
194
+ def register_default_tree_selectors
195
+ register_tree_selector(CALayer, :sublayers)
196
+ if defined?(SKNode)
197
+ register_tree_selector(SKNode, :children)
198
+ end
199
+ register_platform_tree_selectors
232
200
  end
233
201
 
234
202
  def get_tree_item(item)
235
- if item.nil? && @sugarcube_default_item
236
- @sugarcube_default_item
203
+ if item.nil? && @default
204
+ @default
237
205
  elsif item.nil? || item.is_a?(Fixnum)
238
206
  window(item)
239
207
  else
@@ -241,142 +209,8 @@ module SugarCube
241
209
  end
242
210
  end
243
211
 
244
- # @param item this can be a tree-like item (View, ViewController, CALayer,
245
- # Menu) or an integer, in which case it will select that window. Defalt
246
- # is to display the keyWindow
247
- # @param selector If you pass an unsupported object to tree, you will need
248
- # to pass a selector as well - this method should return an array of
249
- # items which are passed recursively to tree
250
- # @block sel_blk If a block is passed, it will be used to build the array of
251
- # items that are called recursively
252
- def tree(item=nil, selector=nil, &sel_blk)
253
- item = get_tree_item(item)
254
-
255
- if sel_blk && selector
256
- raise "You can't hand me a block AND a selector. I don't know what to do with them!"
257
- elsif sel_blk
258
- selector = sel_blk
259
- elsif ! selector
260
- if item.is_a? CALayer
261
- selector = :sublayers
262
- elsif defined?(SKNode) && item.is_a?(SKNode)
263
- selector = :children
264
- else
265
- selector = get_tree_selector(item)
266
- end
267
-
268
- if !selector && @sugarcube_tree_selectors
269
- klass = item.class
270
- while klass && !selector
271
- selector = @sugarcube_tree_selectors[klass]
272
- klass = klass.superclass
273
- end
274
- end
275
-
276
- unless selector
277
- raise "Unable to determine a SugarCube::Repl::tree selector for #{item.class.to_s}"
278
- end
279
- end
280
-
281
- @sugarcube_items = SugarCube::Repl::build_tree(item, selector)
282
- if @sugarcube_collapsed_items
283
- @sugarcube_collapsed_items.keep_if { |v| @sugarcube_items.include? v }
284
- end
285
- if self.respond_to? :draw_tree
286
- draw_tree(item, selector)
287
- else
288
- SugarCube::Repl::draw_tree(item, selector)
289
- end
290
- puts ''
291
-
292
- return item
293
- end
294
-
295
- def register_tree_selector(klass, selector=nil, &sel_blk)
296
- @sugarcube_tree_selectors ||= {}
297
- @sugarcube_tree_selectors[klass] = selector || sel_blk
298
- end
299
-
300
- # Draws the tree items
301
- def draw_tree(item, selector, tab=nil, is_last=true, items_index=0)
302
- space = ' '
303
- if items_index < 10
304
- print ' '
305
- elsif items_index < 100
306
- print ' '
307
- elsif items_index > 999 # good god, man!
308
- space = ''
309
- end
310
- print items_index.to_s + ":" + space
311
-
312
- if tab
313
- print tab
314
- if @sugarcube_collapsed_items && @sugarcube_collapsed_items.include?(item)
315
- print '<<< '
316
- else
317
- if is_last
318
- print '`-- '
319
- tab += ' '
320
- else
321
- print '+-- '
322
- tab += '| '
323
- end
324
- end
325
- else
326
- print '. '
327
- tab = ''
328
- end
329
-
330
- if self == item || @sugarcube_view == item
331
- print "\033[1m"
332
- end
333
- print draw_tree_item(item)
334
- if self == item || @sugarcube_view == item
335
- print "\033[0m"
336
- end
337
- puts
338
-
339
- if selector.is_a? Proc
340
- items = selector.call(item)
341
- else
342
- items = item.send(selector)
343
- end
344
- items ||= []
345
-
346
- unless @sugarcube_collapsed_items && @sugarcube_collapsed_items.include?(item)
347
- items.each_with_index do |subview, index|
348
- items_index += 1
349
- if self.respond_to? :draw_tree
350
- items_index = draw_tree(subview, selector, tab, index == items.length - 1, items_index)
351
- else
352
- items_index = SugarCube::Repl::draw_tree(subview, selector, tab, index == items.length - 1, items_index)
353
- end
354
- end
355
- end
356
-
357
- return items_index
358
- end
359
-
360
- def build_tree(item, selector)
361
-
362
- if selector.is_a? Proc
363
- items = selector.call(item)
364
- else
365
- items = item.send(selector)
366
- end
367
- items ||= []
368
-
369
- ret = [item]
370
- return ret if @sugarcube_collapsed_items && @sugarcube_collapsed_items.include?(item)
371
-
372
- items.each_with_index do |subview, index|
373
- ret.concat SugarCube::Repl::build_tree(subview, selector)
374
- end
375
- ret
376
- end
377
-
378
212
  def check_sugarcube_view
379
- raise 'no view has been assigned to SugarCube::Repl::adjust' unless @sugarcube_view
213
+ raise 'no view has been assigned to SugarCube::Repl::adjust' unless @adjust_item
380
214
 
381
215
  true
382
216
  end