lissio 0.1.0.beta3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,318 @@
1
+ require 'browser/http'
2
+ require 'browser/effects'
3
+
4
+ module Lissio; class Component
5
+
6
+ class Autocomplete < Lissio::Component
7
+ class Section < Lissio::Component
8
+ class Options
9
+ def initialize(&block)
10
+ @key = :id
11
+ @limit = 10
12
+
13
+ if block.arity.nonzero?
14
+ block.call(self)
15
+ else
16
+ instance_eval(&block)
17
+ end
18
+ end
19
+
20
+ def title(value = nil)
21
+ value ? @title = value : @title
22
+ end
23
+
24
+ def local(value = nil)
25
+ value ? @local = value : @local
26
+ end
27
+
28
+ def remote(value = nil)
29
+ value ? @remote = value : @remote
30
+ end
31
+
32
+ def key(value = nil)
33
+ value ? @key = value : @key
34
+ end
35
+
36
+ def limit(value = nil)
37
+ value ? @limit = value : @limit
38
+ end
39
+
40
+ def select(&block)
41
+ block ? @select = block : @select
42
+ end
43
+
44
+ def css(&block)
45
+ block ? @css = block : @css
46
+ end
47
+
48
+ def html(&block)
49
+ block ? @html = block : @html
50
+ end
51
+ end
52
+
53
+ tag class: :section
54
+
55
+ on 'mouse:down', '.result' do |e|
56
+ result = JSON.parse(e.target.child.data(:result))
57
+
58
+ @select.call(result)
59
+ end
60
+
61
+ def initialize(title, results, key, input, select)
62
+ @title = title
63
+ @results = results
64
+ @key = key
65
+ @input = input
66
+ @select = select
67
+ end
68
+ end
69
+
70
+ def initialize(&block)
71
+ @autocompleters = []
72
+
73
+ if block.arity.nonzero?
74
+ block.call(self)
75
+ else
76
+ instance_eval(&block)
77
+ end
78
+ end
79
+
80
+ def section(&block)
81
+ options = Section::Options.new(&block)
82
+
83
+ section = Class.new(Section) do
84
+ html do |_|
85
+ _.div.title @title
86
+
87
+ @results.each do |res|
88
+ _.div.result do |_|
89
+ _.div.data(result: res.to_json)
90
+
91
+ if options.html
92
+ instance_exec(_, res, &options.html)
93
+ else
94
+ _.div do
95
+ from = res[@key].index(@input)
96
+ to = from + @input.length
97
+
98
+ _.span res[@key][0 .. from - 1] if from.nonzero?
99
+ _.span.hl res[@key][from .. to - 1]
100
+ _.span res[@key][to .. -1]
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ css do
108
+ rule '.result' do
109
+ instance_eval(&options.css) if options.css
110
+ end
111
+ end
112
+ end
113
+
114
+ @autocompleters << {
115
+ title: options.title,
116
+ local: options.local,
117
+ remote: options.remote,
118
+ key: options.key,
119
+ limit: options.limit,
120
+ select: options.select,
121
+ section: section
122
+ }
123
+ end
124
+
125
+ def results
126
+ element.at_css(".results")
127
+ end
128
+
129
+ def hint
130
+ element.at_css(".hint")
131
+ end
132
+
133
+ def query
134
+ element.at_css(".query")
135
+ end
136
+
137
+ on 'input', '.query' do |e|
138
+ if query.value.empty?
139
+ hide_completions
140
+ next
141
+ end
142
+
143
+ remove_old_completions
144
+
145
+ comps = @autocompleters.map do |ac|
146
+ local_completions = get_local_completions(ac)
147
+
148
+ if local_completions.count < ac[:limit] and ac[:remote]
149
+ url = "#{ac[:remote]}?q=#{query.value}"
150
+
151
+ Browser::HTTP.get(url).then do |response|
152
+ [ac, local_completions, response]
153
+ end
154
+ else
155
+ [ac, local_completions, nil]
156
+ end
157
+ end
158
+
159
+ Promise.when(*comps).each do |ac, completions, response|
160
+ if response
161
+ completions += response.json.take(ac[:limit] - completions.size)
162
+ end
163
+
164
+ append_completions(ac, completions)
165
+ end
166
+ end
167
+
168
+ on 'key:down', '.query' do |e|
169
+ set_completion(@cur, @cur_ac) if e.key.eql?(:Tab)
170
+ end
171
+
172
+ on :blur, '.query' do
173
+ hide_completions
174
+ end
175
+
176
+ def set_completion(comp, ac)
177
+ key = ac[:key]
178
+ select = ac[:select]
179
+
180
+ query.value = comp[key]
181
+ select.call(comp)
182
+ end
183
+
184
+ def hide_completions
185
+ hint.value = ''
186
+ results.hide
187
+ end
188
+
189
+ def remove_old_completions
190
+ @some_results = false
191
+ @cur = nil
192
+ hint.value = ''
193
+
194
+ results.children.each do |child|
195
+ results.remove_child(child)
196
+ end
197
+ end
198
+
199
+ def set_hint(comps, ac)
200
+ return unless hint.value.empty?
201
+
202
+ key = ac[:key]
203
+
204
+ if comps.first[key].downcase.start_with?(query.value)
205
+ hint.value = query.value + comps.first[key][query.value.size .. -1]
206
+
207
+ @cur = comps.first
208
+ @cur_ac = ac
209
+ else
210
+ hint.value = ''
211
+ end
212
+ end
213
+
214
+ def get_local_completions(ac)
215
+ return [] unless ac[:local]
216
+
217
+ key = ac[:key]
218
+ q = query.value
219
+
220
+ ac[:local].select do |comp|
221
+ comp[key].match(q)
222
+ end.take(ac[:limit])
223
+ end
224
+
225
+ def append_completions(ac, comps)
226
+ if comps.empty?
227
+ hide_completions unless @some_results
228
+ return
229
+ end
230
+
231
+ title = ac[:title]
232
+ select = ac[:select]
233
+ section = ac[:section]
234
+ key = ac[:key]
235
+ input = query.value
236
+
237
+ @some_results = true
238
+
239
+ if @cur.nil?
240
+ @cur = comps.first
241
+ @cur_ac = ac
242
+ end
243
+
244
+ set_hint(comps, ac)
245
+
246
+ results << section.new(title, comps, key, input, select).render
247
+ results.show
248
+ end
249
+
250
+ tag class: :autocomplete
251
+
252
+ html do
253
+ input.hint
254
+ input.query
255
+
256
+ div.results
257
+ end
258
+
259
+ css do
260
+ position :relative
261
+ display :table
262
+ margin 0.px, :auto
263
+
264
+ rule '> *' do
265
+ font size: 16.px;
266
+ border 1.px, :solid, :black
267
+ width 400.px
268
+ end
269
+
270
+ rule '.hint' do
271
+ padding 6.px, 12.px
272
+ color :grey
273
+ display :block
274
+ end
275
+
276
+ rule '.query' do
277
+ position :absolute
278
+ top 0.px
279
+ padding 6.px, 12.px
280
+ background color: :transparent
281
+ end
282
+
283
+ rule '.results' do
284
+ position :absolute
285
+ top 32.px
286
+ display :none
287
+ border top: 0.px;
288
+ width 424.px;
289
+ background color: :white
290
+
291
+ rule '.title' do
292
+ padding 4.px
293
+ text align: :center
294
+ border top: [1.px, :solid, :black], bottom: [1.px, :solid, :black]
295
+ end
296
+
297
+ rule '.result' do
298
+ padding 4.px, 12.px
299
+ cursor :pointer
300
+
301
+ rule '*' do
302
+ pointer events: :none
303
+ end
304
+
305
+ rule 'span.hl' do
306
+ font weight: :bold
307
+ end
308
+ end
309
+
310
+ rule '.result:hover' do
311
+ background color: :black
312
+ color :white
313
+ end
314
+ end
315
+ end
316
+ end
317
+ end; end
318
+
@@ -21,9 +21,7 @@ class Container < Component
21
21
  end
22
22
  end
23
23
 
24
- def initialize(parent, &block)
25
- super(parent)
26
-
24
+ def initialize(&block)
27
25
  if block
28
26
  @content = Definer.new(&block).to_a
29
27
  else
@@ -38,10 +36,10 @@ class Container < Component
38
36
  element.clear
39
37
 
40
38
  content.each {|c|
41
- if String === c
42
- element << c
43
- else
39
+ if Component === c
44
40
  element << c.render
41
+ else
42
+ element << c.to_s
45
43
  end
46
44
  }
47
45
 
@@ -4,13 +4,21 @@ module Lissio; class Component
4
4
 
5
5
  class Markdown < Component
6
6
  def self.render(string, options = {}, &block)
7
- `marked(#{@string.to_n}, #{@options.to_n}, #{@block.to_n})`
7
+ `marked(#{string.to_n}, #{options.to_n}, #{block.to_n})`
8
8
  end
9
9
 
10
- def initialize(string, options = {}, &block)
11
- @string = string
10
+ def self.content(string = nil)
11
+ string ? @content = string : @content
12
+ end
13
+
14
+ def initialize(string = nil, options = {}, &block)
15
+ @string = string || self.class.content
12
16
  @options = options
13
17
  @block = block
18
+
19
+ unless @string
20
+ raise ArgumentError, 'missing text to render'
21
+ end
14
22
  end
15
23
 
16
24
  def render
@@ -207,126 +215,139 @@ KHRoaXMuc21hcnR5cGFudHMoY2FwWzBdKSk7Y29udGludWV9aWYoc3JjKXt0aHJvdyBuZXcgRXJy
207
215
  b3IoIkluZmluaXRlIGxvb3Agb24gYnl0ZTogIitzcmMuY2hhckNvZGVBdCgwKSl9fXJldHVybiBv
208
216
  dXR9O0lubGluZUxleGVyLnByb3RvdHlwZS5vdXRwdXRMaW5rPWZ1bmN0aW9uKGNhcCxsaW5rKXt2
209
217
  YXIgaHJlZj1lc2NhcGUobGluay5ocmVmKSx0aXRsZT1saW5rLnRpdGxlP2VzY2FwZShsaW5rLnRp
210
- dGxlKTpudWxsO2lmKGNhcFswXS5jaGFyQXQoMCkhPT0iISIpe3JldHVybiB0aGlzLnJlbmRlcmVy
211
- LmxpbmsoaHJlZix0aXRsZSx0aGlzLm91dHB1dChjYXBbMV0pKX1lbHNle3JldHVybiB0aGlzLnJl
212
- bmRlcmVyLmltYWdlKGhyZWYsdGl0bGUsZXNjYXBlKGNhcFsxXSkpfX07SW5saW5lTGV4ZXIucHJv
213
- dG90eXBlLnNtYXJ0eXBhbnRzPWZ1bmN0aW9uKHRleHQpe2lmKCF0aGlzLm9wdGlvbnMuc21hcnR5
214
- cGFudHMpcmV0dXJuIHRleHQ7cmV0dXJuIHRleHQucmVwbGFjZSgvLS0vZywi4oCUIikucmVwbGFj
215
- ZSgvKF58Wy1cdTIwMTQvKFxbeyJcc10pJy9nLCIkMeKAmCIpLnJlcGxhY2UoLycvZywi4oCZIiku
216
- cmVwbGFjZSgvKF58Wy1cdTIwMTQvKFxbe1x1MjAxOFxzXSkiL2csIiQx4oCcIikucmVwbGFjZSgv
217
- Ii9nLCLigJ0iKS5yZXBsYWNlKC9cLnszfS9nLCLigKYiKX07SW5saW5lTGV4ZXIucHJvdG90eXBl
218
- Lm1hbmdsZT1mdW5jdGlvbih0ZXh0KXt2YXIgb3V0PSIiLGw9dGV4dC5sZW5ndGgsaT0wLGNoO2Zv
219
- cig7aTxsO2krKyl7Y2g9dGV4dC5jaGFyQ29kZUF0KGkpO2lmKE1hdGgucmFuZG9tKCk+LjUpe2No
220
- PSJ4IitjaC50b1N0cmluZygxNil9b3V0Kz0iJiMiK2NoKyI7In1yZXR1cm4gb3V0fTtmdW5jdGlv
221
- biBSZW5kZXJlcigpe31SZW5kZXJlci5wcm90b3R5cGUuY29kZT1mdW5jdGlvbihjb2RlLGxhbmcp
222
- e2lmKCFsYW5nKXtyZXR1cm4iPHByZT48Y29kZT4iK2VzY2FwZShjb2RlLHRydWUpKyJcbjwvY29k
223
- ZT48L3ByZT4ifXJldHVybic8cHJlPjxjb2RlIGNsYXNzPSInKyJsYW5nLSIrbGFuZysnIj4nK2Vz
224
- Y2FwZShjb2RlKSsiXG48L2NvZGU+PC9wcmU+XG4ifTtSZW5kZXJlci5wcm90b3R5cGUuYmxvY2tx
225
- dW90ZT1mdW5jdGlvbihxdW90ZSl7cmV0dXJuIjxibG9ja3F1b3RlPlxuIitxdW90ZSsiPC9ibG9j
226
- a3F1b3RlPlxuIn07UmVuZGVyZXIucHJvdG90eXBlLmh0bWw9ZnVuY3Rpb24oaHRtbCl7cmV0dXJu
227
- IGh0bWx9O1JlbmRlcmVyLnByb3RvdHlwZS5oZWFkaW5nPWZ1bmN0aW9uKHRleHQsbGV2ZWwscmF3
228
- LG9wdGlvbnMpe3JldHVybiI8aCIrbGV2ZWwrIj4iK3RleHQrIjwvaCIrbGV2ZWwrIj5cbiJ9O1Jl
229
- bmRlcmVyLnByb3RvdHlwZS5ocj1mdW5jdGlvbigpe3JldHVybiI8aHI+XG4ifTtSZW5kZXJlci5w
230
- cm90b3R5cGUubGlzdD1mdW5jdGlvbihib2R5LG9yZGVyZWQpe3ZhciB0eXBlPW9yZGVyZWQ/Im9s
231
- IjoidWwiO3JldHVybiI8Iit0eXBlKyI+XG4iK2JvZHkrIjwvIit0eXBlKyI+XG4ifTtSZW5kZXJl
232
- ci5wcm90b3R5cGUubGlzdGl0ZW09ZnVuY3Rpb24odGV4dCl7cmV0dXJuIjxsaT4iK3RleHQrIjwv
233
- bGk+XG4ifTtSZW5kZXJlci5wcm90b3R5cGUucGFyYWdyYXBoPWZ1bmN0aW9uKHRleHQpe3JldHVy
234
- biI8cD4iK3RleHQrIjwvcD5cbiJ9O1JlbmRlcmVyLnByb3RvdHlwZS50YWJsZT1mdW5jdGlvbiho
235
- ZWFkZXIsYm9keSl7cmV0dXJuIjx0YWJsZT5cbiIrIjx0aGVhZD5cbiIraGVhZGVyKyI8L3RoZWFk
236
- PlxuIisiPHRib2R5PlxuIitib2R5KyI8L3Rib2R5PlxuIisiPC90YWJsZT5cbiJ9O1JlbmRlcmVy
237
- LnByb3RvdHlwZS50YWJsZXJvdz1mdW5jdGlvbihjb250ZW50KXtyZXR1cm4iPHRyPlxuIitjb250
238
- ZW50KyI8L3RyPlxuIn07UmVuZGVyZXIucHJvdG90eXBlLnRhYmxlY2VsbD1mdW5jdGlvbihjb250
239
- ZW50LGZsYWdzKXt2YXIgdHlwZT1mbGFncy5oZWFkZXI/InRoIjoidGQiO3ZhciB0YWc9ZmxhZ3Mu
240
- YWxpZ24/IjwiK3R5cGUrJyBzdHlsZT0idGV4dC1hbGlnbjonK2ZsYWdzLmFsaWduKyciPic6Ijwi
241
- K3R5cGUrIj4iO3JldHVybiB0YWcrY29udGVudCsiPC8iK3R5cGUrIj5cbiJ9O1JlbmRlcmVyLnBy
242
- b3RvdHlwZS5zdHJvbmc9ZnVuY3Rpb24odGV4dCl7cmV0dXJuIjxzdHJvbmc+Iit0ZXh0KyI8L3N0
243
- cm9uZz4ifTtSZW5kZXJlci5wcm90b3R5cGUuZW09ZnVuY3Rpb24odGV4dCl7cmV0dXJuIjxlbT4i
244
- K3RleHQrIjwvZW0+In07UmVuZGVyZXIucHJvdG90eXBlLmNvZGVzcGFuPWZ1bmN0aW9uKHRleHQp
245
- e3JldHVybiI8Y29kZT4iK3RleHQrIjwvY29kZT4ifTtSZW5kZXJlci5wcm90b3R5cGUuYnI9ZnVu
246
- Y3Rpb24oKXtyZXR1cm4iPGJyPiJ9O1JlbmRlcmVyLnByb3RvdHlwZS5kZWw9ZnVuY3Rpb24odGV4
247
- dCl7cmV0dXJuIjxkZWw+Iit0ZXh0KyI8L2RlbD4ifTtSZW5kZXJlci5wcm90b3R5cGUubGluaz1m
248
- dW5jdGlvbihocmVmLHRpdGxlLHRleHQpe3ZhciBvdXQ9JzxhIGhyZWY9IicraHJlZisnIic7aWYo
249
- dGl0bGUpe291dCs9JyB0aXRsZT0iJyt0aXRsZSsnIid9b3V0Kz0iPiIrdGV4dCsiPC9hPiI7cmV0
250
- dXJuIG91dH07UmVuZGVyZXIucHJvdG90eXBlLmltYWdlPWZ1bmN0aW9uKGhyZWYsdGl0bGUsdGV4
251
- dCl7dmFyIG91dD0nPGltZyBzcmM9IicraHJlZisnIiBhbHQ9IicrdGV4dCsnIic7aWYodGl0bGUp
252
- e291dCs9JyB0aXRsZT0iJyt0aXRsZSsnIid9b3V0Kz0iPiI7cmV0dXJuIG91dH07ZnVuY3Rpb24g
253
- UGFyc2VyKG9wdGlvbnMpe3RoaXMudG9rZW5zPVtdO3RoaXMudG9rZW49bnVsbDt0aGlzLm9wdGlv
254
- bnM9b3B0aW9uc3x8bWFya2VkLmRlZmF1bHRzO3RoaXMub3B0aW9ucy5yZW5kZXJlcj10aGlzLm9w
255
- dGlvbnMucmVuZGVyZXJ8fG5ldyBSZW5kZXJlcjt0aGlzLnJlbmRlcmVyPXRoaXMub3B0aW9ucy5y
256
- ZW5kZXJlcn1QYXJzZXIucGFyc2U9ZnVuY3Rpb24oc3JjLG9wdGlvbnMscmVuZGVyZXIpe3ZhciBw
257
- YXJzZXI9bmV3IFBhcnNlcihvcHRpb25zLHJlbmRlcmVyKTtyZXR1cm4gcGFyc2VyLnBhcnNlKHNy
258
- Yyl9O1BhcnNlci5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oc3JjKXt0aGlzLmlubGluZT1uZXcg
259
- SW5saW5lTGV4ZXIoc3JjLmxpbmtzLHRoaXMub3B0aW9ucyx0aGlzLnJlbmRlcmVyKTt0aGlzLnRv
260
- a2Vucz1zcmMucmV2ZXJzZSgpO3ZhciBvdXQ9IiI7d2hpbGUodGhpcy5uZXh0KCkpe291dCs9dGhp
261
- cy50b2soKX1yZXR1cm4gb3V0fTtQYXJzZXIucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtyZXR1
262
- cm4gdGhpcy50b2tlbj10aGlzLnRva2Vucy5wb3AoKX07UGFyc2VyLnByb3RvdHlwZS5wZWVrPWZ1
263
- bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9rZW5zW3RoaXMudG9rZW5zLmxlbmd0aC0xXXx8MH07UGFy
264
- c2VyLnByb3RvdHlwZS5wYXJzZVRleHQ9ZnVuY3Rpb24oKXt2YXIgYm9keT10aGlzLnRva2VuLnRl
265
- eHQ7d2hpbGUodGhpcy5wZWVrKCkudHlwZT09PSJ0ZXh0Iil7Ym9keSs9IlxuIit0aGlzLm5leHQo
266
- KS50ZXh0fXJldHVybiB0aGlzLmlubGluZS5vdXRwdXQoYm9keSl9O1BhcnNlci5wcm90b3R5cGUu
267
- dG9rPWZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMudG9rZW4udHlwZSl7Y2FzZSJzcGFjZSI6e3JldHVy
268
- biIifWNhc2UiaHIiOntyZXR1cm4gdGhpcy5yZW5kZXJlci5ocigpfWNhc2UiaGVhZGluZyI6e3Jl
269
- dHVybiB0aGlzLnJlbmRlcmVyLmhlYWRpbmcodGhpcy5pbmxpbmUub3V0cHV0KHRoaXMudG9rZW4u
270
- dGV4dCksdGhpcy50b2tlbi5kZXB0aCl9Y2FzZSJjb2RlIjp7cmV0dXJuIHRoaXMucmVuZGVyZXIu
271
- Y29kZSh0aGlzLnRva2VuLnRleHQsdGhpcy50b2tlbi5sYW5nKX1jYXNlInRhYmxlIjp7dmFyIGhl
272
- YWRlcj0iIixib2R5PSIiLGkscm93LGNlbGwsZmxhZ3MsajtjZWxsPSIiO2ZvcihpPTA7aTx0aGlz
273
- LnRva2VuLmhlYWRlci5sZW5ndGg7aSsrKXtmbGFncz17aGVhZGVyOnRydWUsYWxpZ246dGhpcy50
274
- b2tlbi5hbGlnbltpXX07Y2VsbCs9dGhpcy5yZW5kZXJlci50YWJsZWNlbGwodGhpcy5pbmxpbmUu
275
- b3V0cHV0KHRoaXMudG9rZW4uaGVhZGVyW2ldKSx7aGVhZGVyOnRydWUsYWxpZ246dGhpcy50b2tl
276
- bi5hbGlnbltpXX0pfWhlYWRlcis9dGhpcy5yZW5kZXJlci50YWJsZXJvdyhjZWxsKTtmb3IoaT0w
277
- O2k8dGhpcy50b2tlbi5jZWxscy5sZW5ndGg7aSsrKXtyb3c9dGhpcy50b2tlbi5jZWxsc1tpXTtj
278
- ZWxsPSIiO2ZvcihqPTA7ajxyb3cubGVuZ3RoO2orKyl7Y2VsbCs9dGhpcy5yZW5kZXJlci50YWJs
279
- ZWNlbGwodGhpcy5pbmxpbmUub3V0cHV0KHJvd1tqXSkse2hlYWRlcjpmYWxzZSxhbGlnbjp0aGlz
280
- LnRva2VuLmFsaWduW2pdfSl9Ym9keSs9dGhpcy5yZW5kZXJlci50YWJsZXJvdyhjZWxsKX1yZXR1
281
- cm4gdGhpcy5yZW5kZXJlci50YWJsZShoZWFkZXIsYm9keSl9Y2FzZSJibG9ja3F1b3RlX3N0YXJ0
282
- Ijp7dmFyIGJvZHk9IiI7d2hpbGUodGhpcy5uZXh0KCkudHlwZSE9PSJibG9ja3F1b3RlX2VuZCIp
283
- e2JvZHkrPXRoaXMudG9rKCl9cmV0dXJuIHRoaXMucmVuZGVyZXIuYmxvY2txdW90ZShib2R5KX1j
284
- YXNlImxpc3Rfc3RhcnQiOnt2YXIgYm9keT0iIixvcmRlcmVkPXRoaXMudG9rZW4ub3JkZXJlZDt3
285
- aGlsZSh0aGlzLm5leHQoKS50eXBlIT09Imxpc3RfZW5kIil7Ym9keSs9dGhpcy50b2soKX1yZXR1
286
- cm4gdGhpcy5yZW5kZXJlci5saXN0KGJvZHksb3JkZXJlZCl9Y2FzZSJsaXN0X2l0ZW1fc3RhcnQi
287
- Ont2YXIgYm9keT0iIjt3aGlsZSh0aGlzLm5leHQoKS50eXBlIT09Imxpc3RfaXRlbV9lbmQiKXti
288
- b2R5Kz10aGlzLnRva2VuLnR5cGU9PT0idGV4dCI/dGhpcy5wYXJzZVRleHQoKTp0aGlzLnRvaygp
289
- fXJldHVybiB0aGlzLnJlbmRlcmVyLmxpc3RpdGVtKGJvZHkpfWNhc2UibG9vc2VfaXRlbV9zdGFy
290
- dCI6e3ZhciBib2R5PSIiO3doaWxlKHRoaXMubmV4dCgpLnR5cGUhPT0ibGlzdF9pdGVtX2VuZCIp
291
- e2JvZHkrPXRoaXMudG9rKCl9cmV0dXJuIHRoaXMucmVuZGVyZXIubGlzdGl0ZW0oYm9keSl9Y2Fz
292
- ZSJodG1sIjp7dmFyIGh0bWw9IXRoaXMudG9rZW4ucHJlJiYhdGhpcy5vcHRpb25zLnBlZGFudGlj
293
- P3RoaXMuaW5saW5lLm91dHB1dCh0aGlzLnRva2VuLnRleHQpOnRoaXMudG9rZW4udGV4dDtyZXR1
294
- cm4gdGhpcy5yZW5kZXJlci5odG1sKGh0bWwpfWNhc2UicGFyYWdyYXBoIjp7cmV0dXJuIHRoaXMu
295
- cmVuZGVyZXIucGFyYWdyYXBoKHRoaXMuaW5saW5lLm91dHB1dCh0aGlzLnRva2VuLnRleHQpKX1j
296
- YXNlInRleHQiOntyZXR1cm4gdGhpcy5yZW5kZXJlci5wYXJhZ3JhcGgodGhpcy5wYXJzZVRleHQo
297
- KSl9fX07ZnVuY3Rpb24gZXNjYXBlKGh0bWwsZW5jb2RlKXtyZXR1cm4gaHRtbC5yZXBsYWNlKCFl
298
- bmNvZGU/LyYoPyEjP1x3KzspL2c6LyYvZywiJmFtcDsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5y
299
- ZXBsYWNlKC8+L2csIiZndDsiKS5yZXBsYWNlKC8iL2csIiZxdW90OyIpLnJlcGxhY2UoLycvZywi
300
- JiMzOTsiKX1mdW5jdGlvbiByZXBsYWNlKHJlZ2V4LG9wdCl7cmVnZXg9cmVnZXguc291cmNlO29w
301
- dD1vcHR8fCIiO3JldHVybiBmdW5jdGlvbiBzZWxmKG5hbWUsdmFsKXtpZighbmFtZSlyZXR1cm4g
302
- bmV3IFJlZ0V4cChyZWdleCxvcHQpO3ZhbD12YWwuc291cmNlfHx2YWw7dmFsPXZhbC5yZXBsYWNl
303
- KC8oXnxbXlxbXSlcXi9nLCIkMSIpO3JlZ2V4PXJlZ2V4LnJlcGxhY2UobmFtZSx2YWwpO3JldHVy
304
- biBzZWxmfX1mdW5jdGlvbiBub29wKCl7fW5vb3AuZXhlYz1ub29wO2Z1bmN0aW9uIG1lcmdlKG9i
305
- ail7dmFyIGk9MSx0YXJnZXQsa2V5O2Zvcig7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dGFyZ2V0
306
- PWFyZ3VtZW50c1tpXTtmb3Ioa2V5IGluIHRhcmdldCl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNP
307
- d25Qcm9wZXJ0eS5jYWxsKHRhcmdldCxrZXkpKXtvYmpba2V5XT10YXJnZXRba2V5XX19fXJldHVy
308
- biBvYmp9ZnVuY3Rpb24gbWFya2VkKHNyYyxvcHQsY2FsbGJhY2spe2lmKGNhbGxiYWNrfHx0eXBl
309
- b2Ygb3B0PT09ImZ1bmN0aW9uIil7aWYoIWNhbGxiYWNrKXtjYWxsYmFjaz1vcHQ7b3B0PW51bGx9
310
- b3B0PW1lcmdlKHt9LG1hcmtlZC5kZWZhdWx0cyxvcHR8fHt9KTt2YXIgaGlnaGxpZ2h0PW9wdC5o
311
- aWdobGlnaHQsdG9rZW5zLHBlbmRpbmcsaT0wO3RyeXt0b2tlbnM9TGV4ZXIubGV4KHNyYyxvcHQp
312
- fWNhdGNoKGUpe3JldHVybiBjYWxsYmFjayhlKX1wZW5kaW5nPXRva2Vucy5sZW5ndGg7dmFyIGRv
313
- bmU9ZnVuY3Rpb24oKXt2YXIgb3V0LGVycjt0cnl7b3V0PVBhcnNlci5wYXJzZSh0b2tlbnMsb3B0
314
- KX1jYXRjaChlKXtlcnI9ZX1vcHQuaGlnaGxpZ2h0PWhpZ2hsaWdodDtyZXR1cm4gZXJyP2NhbGxi
315
- YWNrKGVycik6Y2FsbGJhY2sobnVsbCxvdXQpfTtyZXR1cm4gZG9uZSgpfXRyeXtpZihvcHQpb3B0
316
- PW1lcmdlKHt9LG1hcmtlZC5kZWZhdWx0cyxvcHQpO3JldHVybiBQYXJzZXIucGFyc2UoTGV4ZXIu
317
- bGV4KHNyYyxvcHQpLG9wdCl9Y2F0Y2goZSl7ZS5tZXNzYWdlKz0iXG5QbGVhc2UgcmVwb3J0IHRo
318
- aXMgdG8gaHR0cHM6Ly9naXRodWIuY29tL2NoamovbWFya2VkLiI7aWYoKG9wdHx8bWFya2VkLmRl
319
- ZmF1bHRzKS5zaWxlbnQpe3JldHVybiI8cD5BbiBlcnJvciBvY2N1cmVkOjwvcD48cHJlPiIrZXNj
320
- YXBlKGUubWVzc2FnZSsiIix0cnVlKSsiPC9wcmU+In10aHJvdyBlfX1tYXJrZWQub3B0aW9ucz1t
321
- YXJrZWQuc2V0T3B0aW9ucz1mdW5jdGlvbihvcHQpe21lcmdlKG1hcmtlZC5kZWZhdWx0cyxvcHQp
322
- O3JldHVybiBtYXJrZWR9O21hcmtlZC5kZWZhdWx0cz17Z2ZtOnRydWUsdGFibGVzOnRydWUsYnJl
323
- YWtzOmZhbHNlLHBlZGFudGljOmZhbHNlLHNhbml0aXplOmZhbHNlLHNtYXJ0TGlzdHM6ZmFsc2Us
324
- c2lsZW50OmZhbHNlLHNtYXJ0eXBhbnRzOmZhbHNlLHJlbmRlcmVyOm5ldyBSZW5kZXJlcn07bWFy
325
- a2VkLlBhcnNlcj1QYXJzZXI7bWFya2VkLnBhcnNlcj1QYXJzZXIucGFyc2U7bWFya2VkLlJlbmRl
326
- cmVyPVJlbmRlcmVyO21hcmtlZC5MZXhlcj1MZXhlcjttYXJrZWQubGV4ZXI9TGV4ZXIubGV4O21h
327
- cmtlZC5JbmxpbmVMZXhlcj1JbmxpbmVMZXhlcjttYXJrZWQuaW5saW5lTGV4ZXI9SW5saW5lTGV4
328
- ZXIub3V0cHV0O21hcmtlZC5wYXJzZT1tYXJrZWQ7aWYodHlwZW9mIGV4cG9ydHM9PT0ib2JqZWN0
329
- Iil7bW9kdWxlLmV4cG9ydHM9bWFya2VkfWVsc2UgaWYodHlwZW9mIGRlZmluZT09PSJmdW5jdGlv
330
- biImJmRlZmluZS5hbWQpe2RlZmluZShmdW5jdGlvbigpe3JldHVybiBtYXJrZWR9KX1lbHNle3Ro
331
- aXMubWFya2VkPW1hcmtlZH19KS5jYWxsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN8fCh0eXBlb2Yg
332
- d2luZG93IT09InVuZGVmaW5lZCI/d2luZG93Omdsb2JhbCl9KCkpOw==
218
+ dGxlKTpudWxsO3JldHVybiBjYXBbMF0uY2hhckF0KDApIT09IiEiP3RoaXMucmVuZGVyZXIubGlu
219
+ ayhocmVmLHRpdGxlLHRoaXMub3V0cHV0KGNhcFsxXSkpOnRoaXMucmVuZGVyZXIuaW1hZ2UoaHJl
220
+ Zix0aXRsZSxlc2NhcGUoY2FwWzFdKSl9O0lubGluZUxleGVyLnByb3RvdHlwZS5zbWFydHlwYW50
221
+ cz1mdW5jdGlvbih0ZXh0KXtpZighdGhpcy5vcHRpb25zLnNtYXJ0eXBhbnRzKXJldHVybiB0ZXh0
222
+ O3JldHVybiB0ZXh0LnJlcGxhY2UoLy0tL2csIuKAlCIpLnJlcGxhY2UoLyhefFstXHUyMDE0Lyhc
223
+ W3siXHNdKScvZywiJDHigJgiKS5yZXBsYWNlKC8nL2csIuKAmSIpLnJlcGxhY2UoLyhefFstXHUy
224
+ MDE0LyhcW3tcdTIwMThcc10pIi9nLCIkMeKAnCIpLnJlcGxhY2UoLyIvZywi4oCdIikucmVwbGFj
225
+ ZSgvXC57M30vZywi4oCmIil9O0lubGluZUxleGVyLnByb3RvdHlwZS5tYW5nbGU9ZnVuY3Rpb24o
226
+ dGV4dCl7dmFyIG91dD0iIixsPXRleHQubGVuZ3RoLGk9MCxjaDtmb3IoO2k8bDtpKyspe2NoPXRl
227
+ eHQuY2hhckNvZGVBdChpKTtpZihNYXRoLnJhbmRvbSgpPi41KXtjaD0ieCIrY2gudG9TdHJpbmco
228
+ MTYpfW91dCs9IiYjIitjaCsiOyJ9cmV0dXJuIG91dH07ZnVuY3Rpb24gUmVuZGVyZXIoKXt9UmVu
229
+ ZGVyZXIucHJvdG90eXBlLmNvZGU9ZnVuY3Rpb24oY29kZSxsYW5nLGVzY2FwZWQsb3B0aW9ucyl7
230
+ b3B0aW9ucz1vcHRpb25zfHx7fTtpZihvcHRpb25zLmhpZ2hsaWdodCl7dmFyIG91dD1vcHRpb25z
231
+ LmhpZ2hsaWdodChjb2RlLGxhbmcpO2lmKG91dCE9bnVsbCYmb3V0IT09Y29kZSl7ZXNjYXBlZD10
232
+ cnVlO2NvZGU9b3V0fX1pZighbGFuZyl7cmV0dXJuIjxwcmU+PGNvZGU+IisoZXNjYXBlZD9jb2Rl
233
+ OmVzY2FwZShjb2RlLHRydWUpKSsiXG48L2NvZGU+PC9wcmU+In1yZXR1cm4nPHByZT48Y29kZSBj
234
+ bGFzcz0iJytvcHRpb25zLmxhbmdQcmVmaXgrbGFuZysnIj4nKyhlc2NhcGVkP2NvZGU6ZXNjYXBl
235
+ KGNvZGUpKSsiXG48L2NvZGU+PC9wcmU+XG4ifTtSZW5kZXJlci5wcm90b3R5cGUuYmxvY2txdW90
236
+ ZT1mdW5jdGlvbihxdW90ZSl7cmV0dXJuIjxibG9ja3F1b3RlPlxuIitxdW90ZSsiPC9ibG9ja3F1
237
+ b3RlPlxuIn07UmVuZGVyZXIucHJvdG90eXBlLmh0bWw9ZnVuY3Rpb24oaHRtbCl7cmV0dXJuIGh0
238
+ bWx9O1JlbmRlcmVyLnByb3RvdHlwZS5oZWFkaW5nPWZ1bmN0aW9uKHRleHQsbGV2ZWwscmF3LG9w
239
+ dGlvbnMpe3JldHVybiI8aCIrbGV2ZWwrJyBpZD0iJytvcHRpb25zLmhlYWRlclByZWZpeCtyYXcu
240
+ dG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXlx3XSsvZywiLSIpKyciPicrdGV4dCsiPC9oIitsZXZl
241
+ bCsiPlxuIn07UmVuZGVyZXIucHJvdG90eXBlLmhyPWZ1bmN0aW9uKCl7cmV0dXJuIjxocj5cbiJ9
242
+ O1JlbmRlcmVyLnByb3RvdHlwZS5saXN0PWZ1bmN0aW9uKGJvZHksb3JkZXJlZCl7dmFyIHR5cGU9
243
+ b3JkZXJlZD8ib2wiOiJ1bCI7cmV0dXJuIjwiK3R5cGUrIj5cbiIrYm9keSsiPC8iK3R5cGUrIj5c
244
+ biJ9O1JlbmRlcmVyLnByb3RvdHlwZS5saXN0aXRlbT1mdW5jdGlvbih0ZXh0KXtyZXR1cm4iPGxp
245
+ PiIrdGV4dCsiPC9saT5cbiJ9O1JlbmRlcmVyLnByb3RvdHlwZS5wYXJhZ3JhcGg9ZnVuY3Rpb24o
246
+ dGV4dCl7cmV0dXJuIjxwPiIrdGV4dCsiPC9wPlxuIn07UmVuZGVyZXIucHJvdG90eXBlLnRhYmxl
247
+ PWZ1bmN0aW9uKGhlYWRlcixib2R5KXtyZXR1cm4iPHRhYmxlPlxuIisiPHRoZWFkPlxuIitoZWFk
248
+ ZXIrIjwvdGhlYWQ+XG4iKyI8dGJvZHk+XG4iK2JvZHkrIjwvdGJvZHk+XG4iKyI8L3RhYmxlPlxu
249
+ In07UmVuZGVyZXIucHJvdG90eXBlLnRhYmxlcm93PWZ1bmN0aW9uKGNvbnRlbnQpe3JldHVybiI8
250
+ dHI+XG4iK2NvbnRlbnQrIjwvdHI+XG4ifTtSZW5kZXJlci5wcm90b3R5cGUudGFibGVjZWxsPWZ1
251
+ bmN0aW9uKGNvbnRlbnQsZmxhZ3Mpe3ZhciB0eXBlPWZsYWdzLmhlYWRlcj8idGgiOiJ0ZCI7dmFy
252
+ IHRhZz1mbGFncy5hbGlnbj8iPCIrdHlwZSsnIHN0eWxlPSJ0ZXh0LWFsaWduOicrZmxhZ3MuYWxp
253
+ Z24rJyI+JzoiPCIrdHlwZSsiPiI7cmV0dXJuIHRhZytjb250ZW50KyI8LyIrdHlwZSsiPlxuIn07
254
+ UmVuZGVyZXIucHJvdG90eXBlLnN0cm9uZz1mdW5jdGlvbih0ZXh0KXtyZXR1cm4iPHN0cm9uZz4i
255
+ K3RleHQrIjwvc3Ryb25nPiJ9O1JlbmRlcmVyLnByb3RvdHlwZS5lbT1mdW5jdGlvbih0ZXh0KXty
256
+ ZXR1cm4iPGVtPiIrdGV4dCsiPC9lbT4ifTtSZW5kZXJlci5wcm90b3R5cGUuY29kZXNwYW49ZnVu
257
+ Y3Rpb24odGV4dCl7cmV0dXJuIjxjb2RlPiIrdGV4dCsiPC9jb2RlPiJ9O1JlbmRlcmVyLnByb3Rv
258
+ dHlwZS5icj1mdW5jdGlvbigpe3JldHVybiI8YnI+In07UmVuZGVyZXIucHJvdG90eXBlLmRlbD1m
259
+ dW5jdGlvbih0ZXh0KXtyZXR1cm4iPGRlbD4iK3RleHQrIjwvZGVsPiJ9O1JlbmRlcmVyLnByb3Rv
260
+ dHlwZS5saW5rPWZ1bmN0aW9uKGhyZWYsdGl0bGUsdGV4dCl7dmFyIG91dD0nPGEgaHJlZj0iJyto
261
+ cmVmKyciJztpZih0aXRsZSl7b3V0Kz0nIHRpdGxlPSInK3RpdGxlKyciJ31vdXQrPSI+Iit0ZXh0
262
+ KyI8L2E+IjtyZXR1cm4gb3V0fTtSZW5kZXJlci5wcm90b3R5cGUuaW1hZ2U9ZnVuY3Rpb24oaHJl
263
+ Zix0aXRsZSx0ZXh0KXt2YXIgb3V0PSc8aW1nIHNyYz0iJytocmVmKyciIGFsdD0iJyt0ZXh0Kyci
264
+ JztpZih0aXRsZSl7b3V0Kz0nIHRpdGxlPSInK3RpdGxlKyciJ31vdXQrPSI+IjtyZXR1cm4gb3V0
265
+ fTtmdW5jdGlvbiBQYXJzZXIob3B0aW9ucyl7dGhpcy50b2tlbnM9W107dGhpcy50b2tlbj1udWxs
266
+ O3RoaXMub3B0aW9ucz1vcHRpb25zfHxtYXJrZWQuZGVmYXVsdHM7dGhpcy5vcHRpb25zLnJlbmRl
267
+ cmVyPXRoaXMub3B0aW9ucy5yZW5kZXJlcnx8bmV3IFJlbmRlcmVyO3RoaXMucmVuZGVyZXI9dGhp
268
+ cy5vcHRpb25zLnJlbmRlcmVyfVBhcnNlci5wYXJzZT1mdW5jdGlvbihzcmMsb3B0aW9ucyxyZW5k
269
+ ZXJlcil7dmFyIHBhcnNlcj1uZXcgUGFyc2VyKG9wdGlvbnMscmVuZGVyZXIpO3JldHVybiBwYXJz
270
+ ZXIucGFyc2Uoc3JjKX07UGFyc2VyLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihzcmMpe3RoaXMu
271
+ aW5saW5lPW5ldyBJbmxpbmVMZXhlcihzcmMubGlua3MsdGhpcy5vcHRpb25zLHRoaXMucmVuZGVy
272
+ ZXIpO3RoaXMudG9rZW5zPXNyYy5yZXZlcnNlKCk7dmFyIG91dD0iIjt3aGlsZSh0aGlzLm5leHQo
273
+ KSl7b3V0Kz10aGlzLnRvaygpfXJldHVybiBvdXR9O1BhcnNlci5wcm90b3R5cGUubmV4dD1mdW5j
274
+ dGlvbigpe3JldHVybiB0aGlzLnRva2VuPXRoaXMudG9rZW5zLnBvcCgpfTtQYXJzZXIucHJvdG90
275
+ eXBlLnBlZWs9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b2tlbnNbdGhpcy50b2tlbnMubGVuZ3Ro
276
+ LTFdfHwwfTtQYXJzZXIucHJvdG90eXBlLnBhcnNlVGV4dD1mdW5jdGlvbigpe3ZhciBib2R5PXRo
277
+ aXMudG9rZW4udGV4dDt3aGlsZSh0aGlzLnBlZWsoKS50eXBlPT09InRleHQiKXtib2R5Kz0iXG4i
278
+ K3RoaXMubmV4dCgpLnRleHR9cmV0dXJuIHRoaXMuaW5saW5lLm91dHB1dChib2R5KX07UGFyc2Vy
279
+ LnByb3RvdHlwZS50b2s9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy50b2tlbi50eXBlKXtjYXNlInNw
280
+ YWNlIjp7cmV0dXJuIiJ9Y2FzZSJociI6e3JldHVybiB0aGlzLnJlbmRlcmVyLmhyKCl9Y2FzZSJo
281
+ ZWFkaW5nIjp7cmV0dXJuIHRoaXMucmVuZGVyZXIuaGVhZGluZyh0aGlzLmlubGluZS5vdXRwdXQo
282
+ dGhpcy50b2tlbi50ZXh0KSx0aGlzLnRva2VuLmRlcHRoLHRoaXMudG9rZW4udGV4dCx0aGlzLm9w
283
+ dGlvbnMpfWNhc2UiY29kZSI6e3JldHVybiB0aGlzLnJlbmRlcmVyLmNvZGUodGhpcy50b2tlbi50
284
+ ZXh0LHRoaXMudG9rZW4ubGFuZyx0aGlzLnRva2VuLmVzY2FwZWQsdGhpcy5vcHRpb25zKX1jYXNl
285
+ InRhYmxlIjp7dmFyIGhlYWRlcj0iIixib2R5PSIiLGkscm93LGNlbGwsZmxhZ3MsajtjZWxsPSIi
286
+ O2ZvcihpPTA7aTx0aGlzLnRva2VuLmhlYWRlci5sZW5ndGg7aSsrKXtmbGFncz17aGVhZGVyOnRy
287
+ dWUsYWxpZ246dGhpcy50b2tlbi5hbGlnbltpXX07Y2VsbCs9dGhpcy5yZW5kZXJlci50YWJsZWNl
288
+ bGwodGhpcy5pbmxpbmUub3V0cHV0KHRoaXMudG9rZW4uaGVhZGVyW2ldKSx7aGVhZGVyOnRydWUs
289
+ YWxpZ246dGhpcy50b2tlbi5hbGlnbltpXX0pfWhlYWRlcis9dGhpcy5yZW5kZXJlci50YWJsZXJv
290
+ dyhjZWxsKTtmb3IoaT0wO2k8dGhpcy50b2tlbi5jZWxscy5sZW5ndGg7aSsrKXtyb3c9dGhpcy50
291
+ b2tlbi5jZWxsc1tpXTtjZWxsPSIiO2ZvcihqPTA7ajxyb3cubGVuZ3RoO2orKyl7Y2VsbCs9dGhp
292
+ cy5yZW5kZXJlci50YWJsZWNlbGwodGhpcy5pbmxpbmUub3V0cHV0KHJvd1tqXSkse2hlYWRlcjpm
293
+ YWxzZSxhbGlnbjp0aGlzLnRva2VuLmFsaWduW2pdfSl9Ym9keSs9dGhpcy5yZW5kZXJlci50YWJs
294
+ ZXJvdyhjZWxsKX1yZXR1cm4gdGhpcy5yZW5kZXJlci50YWJsZShoZWFkZXIsYm9keSl9Y2FzZSJi
295
+ bG9ja3F1b3RlX3N0YXJ0Ijp7dmFyIGJvZHk9IiI7d2hpbGUodGhpcy5uZXh0KCkudHlwZSE9PSJi
296
+ bG9ja3F1b3RlX2VuZCIpe2JvZHkrPXRoaXMudG9rKCl9cmV0dXJuIHRoaXMucmVuZGVyZXIuYmxv
297
+ Y2txdW90ZShib2R5KX1jYXNlImxpc3Rfc3RhcnQiOnt2YXIgYm9keT0iIixvcmRlcmVkPXRoaXMu
298
+ dG9rZW4ub3JkZXJlZDt3aGlsZSh0aGlzLm5leHQoKS50eXBlIT09Imxpc3RfZW5kIil7Ym9keSs9
299
+ dGhpcy50b2soKX1yZXR1cm4gdGhpcy5yZW5kZXJlci5saXN0KGJvZHksb3JkZXJlZCl9Y2FzZSJs
300
+ aXN0X2l0ZW1fc3RhcnQiOnt2YXIgYm9keT0iIjt3aGlsZSh0aGlzLm5leHQoKS50eXBlIT09Imxp
301
+ c3RfaXRlbV9lbmQiKXtib2R5Kz10aGlzLnRva2VuLnR5cGU9PT0idGV4dCI/dGhpcy5wYXJzZVRl
302
+ eHQoKTp0aGlzLnRvaygpfXJldHVybiB0aGlzLnJlbmRlcmVyLmxpc3RpdGVtKGJvZHkpfWNhc2Ui
303
+ bG9vc2VfaXRlbV9zdGFydCI6e3ZhciBib2R5PSIiO3doaWxlKHRoaXMubmV4dCgpLnR5cGUhPT0i
304
+ bGlzdF9pdGVtX2VuZCIpe2JvZHkrPXRoaXMudG9rKCl9cmV0dXJuIHRoaXMucmVuZGVyZXIubGlz
305
+ dGl0ZW0oYm9keSl9Y2FzZSJodG1sIjp7dmFyIGh0bWw9IXRoaXMudG9rZW4ucHJlJiYhdGhpcy5v
306
+ cHRpb25zLnBlZGFudGljP3RoaXMuaW5saW5lLm91dHB1dCh0aGlzLnRva2VuLnRleHQpOnRoaXMu
307
+ dG9rZW4udGV4dDtyZXR1cm4gdGhpcy5yZW5kZXJlci5odG1sKGh0bWwpfWNhc2UicGFyYWdyYXBo
308
+ Ijp7cmV0dXJuIHRoaXMucmVuZGVyZXIucGFyYWdyYXBoKHRoaXMuaW5saW5lLm91dHB1dCh0aGlz
309
+ LnRva2VuLnRleHQpKX1jYXNlInRleHQiOntyZXR1cm4gdGhpcy5yZW5kZXJlci5wYXJhZ3JhcGgo
310
+ dGhpcy5wYXJzZVRleHQoKSl9fX07ZnVuY3Rpb24gZXNjYXBlKGh0bWwsZW5jb2RlKXtyZXR1cm4g
311
+ aHRtbC5yZXBsYWNlKCFlbmNvZGU/LyYoPyEjP1x3KzspL2c6LyYvZywiJmFtcDsiKS5yZXBsYWNl
312
+ KC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKS5yZXBsYWNlKC8iL2csIiZxdW90OyIp
313
+ LnJlcGxhY2UoLycvZywiJiMzOTsiKX1mdW5jdGlvbiByZXBsYWNlKHJlZ2V4LG9wdCl7cmVnZXg9
314
+ cmVnZXguc291cmNlO29wdD1vcHR8fCIiO3JldHVybiBmdW5jdGlvbiBzZWxmKG5hbWUsdmFsKXtp
315
+ ZighbmFtZSlyZXR1cm4gbmV3IFJlZ0V4cChyZWdleCxvcHQpO3ZhbD12YWwuc291cmNlfHx2YWw7
316
+ dmFsPXZhbC5yZXBsYWNlKC8oXnxbXlxbXSlcXi9nLCIkMSIpO3JlZ2V4PXJlZ2V4LnJlcGxhY2Uo
317
+ bmFtZSx2YWwpO3JldHVybiBzZWxmfX1mdW5jdGlvbiBub29wKCl7fW5vb3AuZXhlYz1ub29wO2Z1
318
+ bmN0aW9uIG1lcmdlKG9iail7dmFyIGk9MSx0YXJnZXQsa2V5O2Zvcig7aTxhcmd1bWVudHMubGVu
319
+ Z3RoO2krKyl7dGFyZ2V0PWFyZ3VtZW50c1tpXTtmb3Ioa2V5IGluIHRhcmdldCl7aWYoT2JqZWN0
320
+ LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCxrZXkpKXtvYmpba2V5XT10YXJn
321
+ ZXRba2V5XX19fXJldHVybiBvYmp9ZnVuY3Rpb24gbWFya2VkKHNyYyxvcHQsY2FsbGJhY2spe2lm
322
+ KGNhbGxiYWNrfHx0eXBlb2Ygb3B0PT09ImZ1bmN0aW9uIil7aWYoIWNhbGxiYWNrKXtjYWxsYmFj
323
+ az1vcHQ7b3B0PW51bGx9b3B0PW1lcmdlKHt9LG1hcmtlZC5kZWZhdWx0cyxvcHR8fHt9KTt2YXIg
324
+ aGlnaGxpZ2h0PW9wdC5oaWdobGlnaHQsdG9rZW5zLHBlbmRpbmcsaT0wO3RyeXt0b2tlbnM9TGV4
325
+ ZXIubGV4KHNyYyxvcHQpfWNhdGNoKGUpe3JldHVybiBjYWxsYmFjayhlKX1wZW5kaW5nPXRva2Vu
326
+ cy5sZW5ndGg7dmFyIGRvbmU9ZnVuY3Rpb24oKXt2YXIgb3V0LGVycjt0cnl7b3V0PVBhcnNlci5w
327
+ YXJzZSh0b2tlbnMsb3B0KX1jYXRjaChlKXtlcnI9ZX1vcHQuaGlnaGxpZ2h0PWhpZ2hsaWdodDty
328
+ ZXR1cm4gZXJyP2NhbGxiYWNrKGVycik6Y2FsbGJhY2sobnVsbCxvdXQpfTtpZighaGlnaGxpZ2h0
329
+ fHxoaWdobGlnaHQubGVuZ3RoPDMpe3JldHVybiBkb25lKCl9ZGVsZXRlIG9wdC5oaWdobGlnaHQ7
330
+ aWYoIXBlbmRpbmcpcmV0dXJuIGRvbmUoKTtmb3IoO2k8dG9rZW5zLmxlbmd0aDtpKyspeyhmdW5j
331
+ dGlvbih0b2tlbil7aWYodG9rZW4udHlwZSE9PSJjb2RlIil7cmV0dXJuLS1wZW5kaW5nfHxkb25l
332
+ KCl9cmV0dXJuIGhpZ2hsaWdodCh0b2tlbi50ZXh0LHRva2VuLmxhbmcsZnVuY3Rpb24oZXJyLGNv
333
+ ZGUpe2lmKGNvZGU9PW51bGx8fGNvZGU9PT10b2tlbi50ZXh0KXtyZXR1cm4tLXBlbmRpbmd8fGRv
334
+ bmUoKX10b2tlbi50ZXh0PWNvZGU7dG9rZW4uZXNjYXBlZD10cnVlOy0tcGVuZGluZ3x8ZG9uZSgp
335
+ fSl9KSh0b2tlbnNbaV0pfXJldHVybn10cnl7aWYob3B0KW9wdD1tZXJnZSh7fSxtYXJrZWQuZGVm
336
+ YXVsdHMsb3B0KTtyZXR1cm4gUGFyc2VyLnBhcnNlKExleGVyLmxleChzcmMsb3B0KSxvcHQpfWNh
337
+ dGNoKGUpe2UubWVzc2FnZSs9IlxuUGxlYXNlIHJlcG9ydCB0aGlzIHRvIGh0dHBzOi8vZ2l0aHVi
338
+ LmNvbS9jaGpqL21hcmtlZC4iO2lmKChvcHR8fG1hcmtlZC5kZWZhdWx0cykuc2lsZW50KXtyZXR1
339
+ cm4iPHA+QW4gZXJyb3Igb2NjdXJlZDo8L3A+PHByZT4iK2VzY2FwZShlLm1lc3NhZ2UrIiIsdHJ1
340
+ ZSkrIjwvcHJlPiJ9dGhyb3cgZX19bWFya2VkLm9wdGlvbnM9bWFya2VkLnNldE9wdGlvbnM9ZnVu
341
+ Y3Rpb24ob3B0KXttZXJnZShtYXJrZWQuZGVmYXVsdHMsb3B0KTtyZXR1cm4gbWFya2VkfTttYXJr
342
+ ZWQuZGVmYXVsdHM9e2dmbTp0cnVlLHRhYmxlczp0cnVlLGJyZWFrczpmYWxzZSxwZWRhbnRpYzpm
343
+ YWxzZSxzYW5pdGl6ZTpmYWxzZSxzbWFydExpc3RzOmZhbHNlLHNpbGVudDpmYWxzZSxoaWdobGln
344
+ aHQ6bnVsbCxsYW5nUHJlZml4OiJsYW5nLSIsc21hcnR5cGFudHM6ZmFsc2UsaGVhZGVyUHJlZml4
345
+ OiIiLHJlbmRlcmVyOm5ldyBSZW5kZXJlcn07bWFya2VkLlBhcnNlcj1QYXJzZXI7bWFya2VkLnBh
346
+ cnNlcj1QYXJzZXIucGFyc2U7bWFya2VkLlJlbmRlcmVyPVJlbmRlcmVyO21hcmtlZC5MZXhlcj1M
347
+ ZXhlcjttYXJrZWQubGV4ZXI9TGV4ZXIubGV4O21hcmtlZC5JbmxpbmVMZXhlcj1JbmxpbmVMZXhl
348
+ cjttYXJrZWQuaW5saW5lTGV4ZXI9SW5saW5lTGV4ZXIub3V0cHV0O21hcmtlZC5wYXJzZT1tYXJr
349
+ ZWQ7aWYodHlwZW9mIGV4cG9ydHM9PT0ib2JqZWN0Iil7bW9kdWxlLmV4cG9ydHM9bWFya2VkfWVs
350
+ c2UgaWYodHlwZW9mIGRlZmluZT09PSJmdW5jdGlvbiImJmRlZmluZS5hbWQpe2RlZmluZShmdW5j
351
+ dGlvbigpe3JldHVybiBtYXJrZWR9KX1lbHNle3RoaXMubWFya2VkPW1hcmtlZH19KS5jYWxsKGZ1
352
+ bmN0aW9uKCl7cmV0dXJuIHRoaXN8fCh0eXBlb2Ygd2luZG93IT09InVuZGVmaW5lZCI/d2luZG93
353
+ Omdsb2JhbCl9KCkpOw==