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.
- checksums.yaml +4 -4
- data/Gemfile +0 -1
- data/README.md +20 -22
- data/bin/lissio +112 -37
- data/lib/lissio.rb +2 -0
- data/lib/lissio/builder.rb +54 -0
- data/lib/lissio/server.rb +10 -5
- data/lissio.gemspec +3 -6
- data/opal/lissio/adapter/rest.rb +132 -60
- data/opal/lissio/adapter/storage.rb +30 -34
- data/opal/lissio/application.rb +5 -4
- data/opal/lissio/collection.rb +12 -8
- data/opal/lissio/component.rb +151 -38
- data/opal/lissio/component/alert.rb +39 -49
- data/opal/lissio/component/autocomplete.rb +318 -0
- data/opal/lissio/component/container.rb +4 -6
- data/opal/lissio/component/markdown.rb +147 -126
- data/opal/lissio/component/tooltip.rb +136 -148
- data/opal/lissio/model.rb +65 -25
- data/opal/lissio/router.rb +12 -2
- data/opal/lissio/version.rb +1 -1
- metadata +14 -26
@@ -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(
|
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
|
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(#{
|
7
|
+
`marked(#{string.to_n}, #{options.to_n}, #{block.to_n})`
|
8
8
|
end
|
9
9
|
|
10
|
-
def
|
11
|
-
@
|
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
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
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==
|