GET
H2
|
200
|
EQWgQUtcoG
Show response
t.co/
|
392 B
451 B
|
171ms
171ms
|
Document
text/html |
104.244.42.133
TWITTER
|
|
|
GET
H/1.1
|
200
OK
|
Primary Request
Cookie set
search
Show response
tower.jp/search/advanced/item/
|
74 KB
22 KB
|
2421ms
509ms
|
Document
text/html |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H2
|
200
|
all.css
use.fontawesome.com/releases/v5.6.3/css/
|
52 KB
13 KB
|
145ms
48ms
|
Stylesheet
text/css |
23.111.9.35
HIGHWINDS2
|
|
|
GET
H/1.1
|
200
OK
|
09common.css
tower.jp/style/
|
160 KB
26 KB
|
881ms
323ms
|
Stylesheet
text/css |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
12common.css
tower.jp/style/
|
69 KB
11 KB
|
1262ms
396ms
|
Stylesheet
text/css |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
lab.css
tower.jp/style/
|
16 KB
3 KB
|
1253ms
376ms
|
Stylesheet
text/css |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H2
|
200
|
jquery.min.js
Show response
ajax.googleapis.com/ajax/libs/jquery/1.7.2/
|
93 KB
33 KB
|
28ms
6ms
|
Script
text/javascript |
2a00:1450:4001:809::200a
GOOGLE
|
|
|
GET
H/1.1
|
200
OK
|
jquery-1.7.2.js
Show response
tower.jp/javascript/
|
257 KB
73 KB
|
1330ms
412ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
common.js
Show response
tower.jp/javascript/
|
7 KB
2 KB
|
1324ms
399ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
dayChecker.js
Show response
tower.jp/javascript/
|
5 KB
1 KB
|
1492ms
329ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
towerrecords.js
Show response
tower.jp/javascript/
|
63 KB
15 KB
|
1849ms
321ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
jquery.lightbox-0.5.min.js
Show response
tower.jp/javascript/
|
10 KB
3 KB
|
1845ms
313ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H2
|
200
|
jplayer.js
Show response
web-cache.chocomaru.com/
|
2 KB
2 KB
|
1515ms
297ms
|
Script
application/x-javascript |
202.79.240.62
J-STREAM J-Stream...
|
|
|
GET
H/1.1
|
200
OK
|
heightLine.js
Show response
tower.jp/javascript/
|
15 KB
2 KB
|
1943ms
328ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
iMAWebCookie.js
Show response
www.sc.pages07.net/lp/static/js/
|
14 KB
14 KB
|
955ms
233ms
|
Script
application/javascript |
18.140.152.123
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
navigationContents.js
Show response
tower.jp/javascript/
|
1 KB
1013 B
|
1945ms
327ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
search.css
tower.jp/style/
|
55 KB
10 KB
|
1333ms
424ms
|
Stylesheet
text/css |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
osusume.js
Show response
tower.jp/javascript/
|
3 KB
1 KB
|
2128ms
313ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
right_navi_btn.js
Show response
tower.jp/javascript/
|
1 KB
1 KB
|
2425ms
309ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
helptab.js
Show response
tower.jp/javascript/
|
562 B
595 B
|
2440ms
318ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
search.js
Show response
tower.jp/javascript/
|
2 KB
971 B
|
2519ms
324ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
jPages.js
Show response
tower.jp/javascript/
|
22 KB
5 KB
|
2554ms
324ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
jquery.readmore.js
Show response
tower.jp/javascript/
|
2 KB
1 KB
|
2562ms
329ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
jquery.readmoreDetail.js
Show response
tower.jp/javascript/
|
15 KB
5 KB
|
2745ms
337ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
VisitorIdentification.js
Show response
tower.jp/layouts/system/
|
2 KB
1 KB
|
3048ms
311ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
headerNav_logo_01.gif
cdfront.tower.jp/img12/common/
|
4 KB
5 KB
|
915ms
59ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
suggest.css
tower.jp/style/
|
9 KB
2 KB
|
319ms
318ms
|
Stylesheet
text/css |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
suggest.js
Show response
tower.jp/javascript/
|
18 KB
3 KB
|
305ms
304ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
suggest_search.js
Show response
tower.jp/javascript/
|
26 KB
4 KB
|
328ms
324ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
headerNav_bt_12.png
cdfront.tower.jp/img12/common/
|
3 KB
3 KB
|
913ms
57ms
|
Image
image/png |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
headerNav_bt_13.png
cdfront.tower.jp/img12/common/
|
3 KB
4 KB
|
917ms
56ms
|
Image
image/png |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
close_btn.jpg
tower.jp/img12/search/common/
|
840 B
1 KB
|
328ms
328ms
|
Image
image/jpeg |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
bt_01_a.png
cdfront.tower.jp/img12/common/
|
5 KB
6 KB
|
924ms
63ms
|
Image
image/png |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
WebResource.axd
Show response
tower.jp/
|
23 KB
6 KB
|
324ms
321ms
|
Script
application/x-javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
ScriptResource.axd
Show response
tower.jp/
|
27 KB
5 KB
|
325ms
322ms
|
Script
application/x-javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
ScriptResource.axd
Show response
tower.jp/
|
86 KB
27 KB
|
319ms
316ms
|
Script
application/x-javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
ScriptResource.axd
Show response
tower.jp/
|
36 KB
10 KB
|
310ms
309ms
|
Script
application/x-javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
mdb_search.js
Show response
tower.jp/javascript/
|
10 KB
2 KB
|
312ms
312ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
mdb_search_parts.css
tower.jp/style/
|
1 KB
1 KB
|
327ms
327ms
|
Stylesheet
text/css |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
mainLeft_h2_01.gif
tower.jp/img12/search/common/
|
2 KB
2 KB
|
312ms
311ms
|
Image
image/gif |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
15.jpg
cdfront.tower.jp/~/media/Images/Tol/pc/article/campaign/2021/067/
|
26 KB
27 KB
|
1353ms
338ms
|
Image
image/jpeg |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
107.jpg
cdfront.tower.jp/~/media/Images/Tol/pc/bnr/genre/books/192x69/
|
50 KB
51 KB
|
2150ms
1123ms
|
Image
image/jpeg |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
15.jpg
cdfront.tower.jp/~/media/Images/Tol/pc/article/campaign/2020/252/
|
20 KB
21 KB
|
1544ms
310ms
|
Image
image/jpeg |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
15.jpg
cdfront.tower.jp/~/media/Images/Tol/pc/article/campaign/2020/387/
|
43 KB
43 KB
|
2405ms
1177ms
|
Image
image/jpeg |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
15.gif
cdfront.tower.jp/~/media/Images/Tol/pc/article/campaign/2021/001/
|
30 KB
31 KB
|
1597ms
360ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
15.jpg
cdfront.tower.jp/~/media/Images/Tol/pc/article/campaign/2020/114/
|
29 KB
29 KB
|
323ms
323ms
|
Image
image/jpeg |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
tab.js
Show response
tower.jp/javascript/
|
1 KB
811 B
|
324ms
324ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
jqueryAutoHeight.js
Show response
tower.jp/javascript/
|
2 KB
1 KB
|
327ms
326ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
jquery.query.js
Show response
tower.jp/javascript/
|
4 KB
2 KB
|
317ms
317ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
jQselectable.js
Show response
tower.jp/javascript/
|
14 KB
4 KB
|
312ms
311ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
jquery-ui-1.9.1.custom.min.js
Show response
tower.jp/javascript/
|
41 KB
13 KB
|
323ms
323ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
jquery.ui.datepicker-ja.min.js
Show response
tower.jp/javascript/
|
869 B
961 B
|
332ms
332ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
jquery-ui-1.9.1.custom.min.css
tower.jp/style/
|
19 KB
4 KB
|
324ms
323ms
|
Stylesheet
text/css |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
4562494353476.jpg
cdn.tower.jp/za/m/76/
|
21 KB
22 KB
|
1832ms
1084ms
|
Image
image/jpeg |
65.9.58.40
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
ico_jpop_01.gif
tower.jp/img12/common/
|
1 KB
2 KB
|
328ms
327ms
|
Image
image/gif |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
ico_benefits_01.gif
cdfront.tower.jp/img12/common/
|
1 KB
2 KB
|
1589ms
1148ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
bt_10_s2.png
cdfront.tower.jp/img12/common/
|
3 KB
3 KB
|
916ms
298ms
|
Image
image/png |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
bt_02_s2.png
cdfront.tower.jp/img12/common/
|
3 KB
3 KB
|
1576ms
1216ms
|
Image
image/png |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
zaP2_G6437501W.JPG
cdn.tower.jp/za/m/1W/
|
24 KB
25 KB
|
1818ms
1070ms
|
Image
image/jpeg |
65.9.58.40
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
mainLeft_btn_02_off.gif
cdfront.tower.jp/img12/search/common/
|
4 KB
4 KB
|
1022ms
337ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
mainLeft_btn_03_off.gif
cdfront.tower.jp/img12/search/common/
|
4 KB
4 KB
|
2056ms
1139ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
newslide.js
Show response
tower.jp/javascript/
|
7 KB
1 KB
|
318ms
318ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
recommend.js
Show response
tower.jp/javascript/
|
67 KB
12 KB
|
311ms
310ms
|
Script
text/javascript |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H2
|
200
|
gtm.js
Show response
www.googletagmanager.com/
|
186 KB
56 KB
|
35ms
34ms
|
Script
application/javascript |
2a00:1450:4001:827::2008
GOOGLE
|
|
|
GET
H/1.1
|
200
OK
|
headerContents
Show response
tower.jp/ajax/
|
749 B
1 KB
|
634ms
330ms
|
XHR
text/html |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
headerNav_bg_01.gif
cdfront.tower.jp/img12/common/
|
2 KB
3 KB
|
820ms
65ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
headerNav_bg_10.gif
cdfront.tower.jp/img12/common/
|
1 KB
2 KB
|
816ms
61ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
headerNav_ic_03.gif
cdfront.tower.jp/img12/common/
|
1 KB
2 KB
|
60ms
60ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
icon-online.png
cdfront.tower.jp/img12/common/
|
2 KB
3 KB
|
769ms
66ms
|
Image
image/png |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
icon-music_black.png
cdfront.tower.jp/img12/common/
|
2 KB
3 KB
|
768ms
65ms
|
Image
image/png |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
icon-tenpo_black.png
cdfront.tower.jp/img12/common/
|
2 KB
3 KB
|
764ms
61ms
|
Image
image/png |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
headerNav_bg_03.gif
cdfront.tower.jp/img12/common/
|
3 KB
3 KB
|
240ms
70ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H2
|
200
|
uwt.js
Show response
static.ads-twitter.com/
|
5 KB
2 KB
|
43ms
43ms
|
Script
application/javascript |
151.101.12.157
FASTLY
|
|
|
GET
H2
|
200
|
conversion_async.js
Show response
www.googleadservices.com/pagead/
|
31 KB
13 KB
|
154ms
56ms
|
Script
text/javascript |
142.250.185.66
GOOGLE
|
|
|
GET
H2
|
200
|
analytics.js
Show response
www.google-analytics.com/
|
46 KB
19 KB
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:803::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/analytics.js
- Requested by
- Host: www.googletagmanager.com
URL: https://www.googletagmanager.com/gtm.js?id=GTM-SZF9
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:803::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 0f3be44690ae9914ae3e47b7752e1bdea316f09938e9094f99e0de19ccd8987a
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
analytics.js
Show response
ec-concier.com/webpack/
Redirect Chain
-
https://ec-concier.com/0168cd9aadcd65e1/analytics.js
-
https://ec-concier.com/webpack/analytics.js?3dfb56a20cbebce37074cdfdbe425f67ab096d306d3e449dd16c24da13adb847
|
0
152 B
|
298ms
298ms
|
Script
application/javascript |
54.199.47.219
AMAZON-02
|
|
|
GET
H2
|
200
|
fbevents.js
Show response
connect.facebook.net/en_US/
|
91 KB
24 KB
|
6ms
6ms
|
Script
application/x-javascript |
2a03:2880:f01c:8012:face:b00c:0:3
FACEBOOK
|
|
General
- Full URL
- https://connect.facebook.net/en_US/fbevents.js
- Requested by
- Host: t.co
URL: https://t.co/EQWgQUtcoG
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a03:2880:f01c:8012:face:b00c:0:3
, United States,
ASN32934
(FACEBOOK, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- 9e7ea2b4ba8e2bcc4a964d6192e4671dc5f6863a1c7e35b52b229a3c1e67a68d
- Security Headers
-
Name |
Value |
Content-Security-Policy |
default-src facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com data: blob: 'self';script-src *.fbcdn.net *.facebook.net 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com;connect-src *.fbcdn.net *.facebook.net attachment.fbsbx.com blob: 'self';block-all-mixed-content;upgrade-insecure-requests;report-uri https://www.facebook.com/csp/reporting/?m=c; |
Strict-Transport-Security |
max-age=31536000; preload; includeSubDomains |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
DENY |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
conversion.js
Show response
s.yimg.jp/images/listing/tool/cv/
|
6 KB
2 KB
|
866ms
288ms
|
Script
application/javascript |
183.79.249.252
YAHOO-JP-AS-AP Ya...
|
|
|
GET
H3-Q050
|
200
|
js
Show response
www.googletagmanager.com/gtag/
|
98 KB
39 KB
|
63ms
49ms
|
Script
application/javascript |
2a00:1450:4001:827::2008
GOOGLE
|
|
|
GET
H2
|
200
|
script
Show response
checkout-api.worldshopping.jp/v1/
|
343 KB
121 KB
|
487ms
392ms
|
Script
application/javascript |
13.225.74.64
AMAZON-02
|
|
|
GET
H2
|
200
|
lt.js
Show response
d.line-scdn.net/n/line_tag/public/release/v1/
|
32 KB
10 KB
|
148ms
48ms
|
Script
application/javascript |
184.30.25.99
AKAMAI-AS
|
|
|
GET
H2
|
200
|
ytag.js
Show response
s.yimg.jp/images/listing/tool/cv/
|
23 KB
7 KB
|
305ms
289ms
|
Script
application/javascript |
183.79.249.252
YAHOO-JP-AS-AP Ya...
|
|
|
POST
H3-Q050
|
200
|
collect
Show response
www.google-analytics.com/j/
|
2 B
383 B
|
67ms
13ms
|
XHR
text/plain |
2a00:1450:4001:827::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/j/collect?v=1&_v=j88&a=685202172&t=pageview&_s=1&dl=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&dr=https%3A%2F%2Ft.co%2FEQWgQUtcoG&ul=en-us&de=UTF-8&dt=TOWER%20RECORDS%20ONLINE&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&_u=YEBAAAABAAAAAC~&jid=2048484347&gjid=954539988&cid=2007558036.1614676131&tid=UA-21926253-1&_gid=579042794.1614676131&_r=1>m=2wg2h0SZF9&z=1997254046
- Requested by
- Host: www.google-analytics.com
URL: https://www.google-analytics.com/analytics.js
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:827::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- de3246094525b21a870fc7d2a67490d0132535c6fa5993755c549f1a9d1bd8af
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
1355596731207630
Show response
connect.facebook.net/signals/config/
|
241 KB
69 KB
|
98ms
98ms
|
Script
application/x-javascript |
2a03:2880:f01c:8012:face:b00c:0:3
FACEBOOK
|
|
General
- Full URL
- https://connect.facebook.net/signals/config/1355596731207630?v=2.9.33&r=stable
- Requested by
- Host: connect.facebook.net
URL: https://connect.facebook.net/en_US/fbevents.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a03:2880:f01c:8012:face:b00c:0:3
, United States,
ASN32934
(FACEBOOK, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- ab068cd65d308fdedddf83bad40970dd445a32bdcdb0d3f3ccc5c2e718a0d8ce
- Security Headers
-
Name |
Value |
Content-Security-Policy |
default-src facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com data: blob: 'self';script-src *.fbcdn.net *.facebook.net 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com;connect-src *.fbcdn.net *.facebook.net attachment.fbsbx.com blob: 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;block-all-mixed-content;upgrade-insecure-requests;report-uri https://www.facebook.com/csp/reporting/?m=c; |
Strict-Transport-Security |
max-age=31536000; preload; includeSubDomains |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
DENY |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
adsct
t.co/i/
|
43 B
171 B
|
154ms
154ms
|
Image
image/gif |
104.244.42.133
TWITTER
|
|
General
- Full URL
- https://t.co/i/adsct?type=javascript&version=1.1.1&p_id=Twitter&p_user_id=0&txn_id=o062f&events=%5B%5B%22pageview%22%2Cnull%5D%5D&tw_sale_amount=0&tw_order_quantity=0&tw_iframe_status=0&tw_document_href=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483
- Requested by
- Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.42.133
, United States,
ASN13414
(TWITTER, US),
- Reverse DNS
- Software
-
tsa_o /
- Resource Hash
- ac8778041fdb7f2e08ceb574c9a766247ea26f1a7d90fa854c4efcf4b361a957
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=0 |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
SAMEORIGIN |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
adsct
t.co/i/
|
43 B
125 B
|
166ms
166ms
|
Image
image/gif |
104.244.42.133
TWITTER
|
|
General
- Full URL
- https://t.co/i/adsct?type=javascript&version=1.1.1&p_id=Twitter&p_user_id=0&txn_id=nywsr&events=%5B%5B%22pageview%22%2Cnull%5D%5D&tw_sale_amount=0&tw_order_quantity=0&tw_iframe_status=0&tw_document_href=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483
- Requested by
- Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.42.133
, United States,
ASN13414
(TWITTER, US),
- Reverse DNS
- Software
-
tsa_o /
- Resource Hash
- ac8778041fdb7f2e08ceb574c9a766247ea26f1a7d90fa854c4efcf4b361a957
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=0 |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
SAMEORIGIN |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
adsct
t.co/i/
|
43 B
119 B
|
167ms
167ms
|
Image
image/gif |
104.244.42.133
TWITTER
|
|
General
- Full URL
- https://t.co/i/adsct?type=javascript&version=1.1.1&p_id=Twitter&p_user_id=0&txn_id=o2vlh&events=%5B%5B%22pageview%22%2Cnull%5D%5D&tw_sale_amount=0&tw_order_quantity=0&tw_iframe_status=0&tw_document_href=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483
- Requested by
- Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.42.133
, United States,
ASN13414
(TWITTER, US),
- Reverse DNS
- Software
-
tsa_o /
- Resource Hash
- ac8778041fdb7f2e08ceb574c9a766247ea26f1a7d90fa854c4efcf4b361a957
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=0 |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
SAMEORIGIN |
X-Xss-Protection |
0 |
|
POST
H2
|
200
|
collect
Show response
stats.g.doubleclick.net/j/
|
1 B
80 B
|
13ms
13ms
|
XHR
text/plain |
2a00:1450:400c:c0c::9b
GOOGLE
|
|
General
- Full URL
- https://stats.g.doubleclick.net/j/collect?t=dc&aip=1&_r=3&v=1&_v=j88&tid=UA-21926253-1&cid=2007558036.1614676131&jid=2048484347&gjid=954539988&_gid=579042794.1614676131&_u=YEBAAAAAAAAAAC~&z=1688662348
- Requested by
- Host: www.google-analytics.com
URL: https://www.google-analytics.com/analytics.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:400c:c0c::9b
Brussels, Belgium,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
/
Show response
googleads.g.doubleclick.net/pagead/viewthroughconversion/987250729/
|
2 KB
2 KB
|
37ms
17ms
|
Script
text/javascript |
2a00:1450:4001:802::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/viewthroughconversion/987250729/?random=1614676131397&cv=9&fst=1614676131397&num=1&label=eK3pCLfKjwIQqYDh1gM&guid=ON&resp=GooglemKTybQhCsO&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0>m=2wg2h0&sendb=1&ig=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&hn=www.googleadservices.com&async=1&rfmt=3&fmt=4
- Requested by
- Host: www.googleadservices.com
URL: https://www.googleadservices.com/pagead/conversion_async.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:802::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- f9d8cdaa185d8136a468eb5e09ae0d05d092eb1935b9fdf25fa22431a7216517
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
/
Show response
googleads.g.doubleclick.net/pagead/viewthroughconversion/987250729/
|
2 KB
1 KB
|
52ms
38ms
|
Script
text/javascript |
2a00:1450:4001:802::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/viewthroughconversion/987250729/?random=1614676131400&cv=9&fst=1614676131400&num=1&label=va_2CKfnqgUQqYDh1gM&guid=ON&resp=GooglemKTybQhCsO&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0>m=2wg2h0&sendb=1&ig=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&hn=www.googleadservices.com&async=1&rfmt=3&fmt=4
- Requested by
- Host: www.googleadservices.com
URL: https://www.googleadservices.com/pagead/conversion_async.js
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:802::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 625706d3aacbb5929db21ef012a3aae739195adde128b239275640c757ba54d6
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
/
Show response
googleads.g.doubleclick.net/pagead/viewthroughconversion/813460921/
|
2 KB
1 KB
|
59ms
45ms
|
Script
text/javascript |
2a00:1450:4001:802::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/viewthroughconversion/813460921/?random=1614676131401&cv=9&fst=1614676131401&num=1&label=v5DCOqugH8QudvxgwM&guid=ON&resp=GooglemKTybQhCsO&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0>m=2wg2h0&sendb=1&ig=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&hn=www.googleadservices.com&async=1&rfmt=3&fmt=4
- Requested by
- Host: www.googleadservices.com
URL: https://www.googleadservices.com/pagead/conversion_async.js
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:802::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- d9e52a6b5467b869b3574bef4ba8fef8a33123cc8f4c4d986d738731679ef742
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
/
Show response
googleads.g.doubleclick.net/pagead/viewthroughconversion/987250729/
|
2 KB
2 KB
|
49ms
35ms
|
Script
text/javascript |
2a00:1450:4001:802::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/viewthroughconversion/987250729/?random=1614676131401&cv=9&fst=1614676131401&num=1&label=fctTCJfpqgUQqYDh1gM&guid=ON&resp=GooglemKTybQhCsO&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0>m=2wg2h0&sendb=1&ig=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&hn=www.googleadservices.com&async=1&rfmt=3&fmt=4
- Requested by
- Host: www.googleadservices.com
URL: https://www.googleadservices.com/pagead/conversion_async.js
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:802::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 49733e2668cc34cc3e2274f581ea30985edb82f1c9cccb643391fad2d76e8fa8
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
24.jpg
cdfront.tower.jp/~/media/Images/Tol/pc/article/campaign/common/092/
|
6 KB
6 KB
|
57ms
57ms
|
Image
image/jpeg |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
header_186x30-5.jpg
cdfront.tower.jp/~/media/Images/Tol/pc/bnr/header_right/2018/
|
11 KB
12 KB
|
61ms
60ms
|
Image
image/jpeg |
65.9.58.52
AMAZON-02
|
|
General
- Full URL
- https://cdfront.tower.jp/~/media/Images/Tol/pc/bnr/header_right/2018/header_186x30-5.jpg?h=30&la=ja-JP&w=186
- Requested by
- Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
- Protocol
- HTTP/1.1
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
65.9.58.52
, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
Scutum /
- Resource Hash
- 0fd20e0376bd50d74139c7af594bbd96dc7b74c5a01726dd5e882876800c6d6b
|
GET
H/1.1
|
200
OK
|
tag.gif
tr.line.me/
|
43 B
425 B
|
1263ms
313ms
|
Image
image/gif |
203.104.153.77
LINE LINE Corpora...
|
|
General
- Full URL
- https://tr.line.me/tag.gif?b_id=559a7db4-eb53-491c-ba7f-bfb11edcf614&b_u=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&b_d=tower.jp&b_p=%2Fsearch%2Fadvanced%2Fitem%2Fsearch&b_q=%3Fjan%3D4562494353476%257C4562494353483&b_t=TOWER%20RECORDS%20ONLINE&b_r=https%3A%2F%2Ft.co%2FEQWgQUtcoG&c_t=lap&t_id=50a69175-5137-4d94-8945-a8b2b03a6601&s_id=db26c999-2dd8eb5f&x4=1&e=pv&v=3.0.0&_t=1614676131553
- Requested by
- Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
203.104.153.77
, Japan,
ASN38631
(LINE LINE Corporation, JP),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
H/1.1
|
200
OK
|
mainOneColumn_bg_04.gif
cdfront.tower.jp/img12/common/
|
1 KB
2 KB
|
1024ms
1024ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
mainOneColumn_bg_03.gif
cdfront.tower.jp/img12/common/
|
2 KB
2 KB
|
1008ms
1007ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
mainLeft_bg_01.gif
cdfront.tower.jp/img12/search/common/
|
1 KB
2 KB
|
1243ms
291ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
mainLeft_bg_02.gif
cdfront.tower.jp/img12/search/common/
|
2 KB
2 KB
|
1249ms
313ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
mainLeft_bg_03.gif
cdfront.tower.jp/img12/search/common/
|
1 KB
2 KB
|
1315ms
303ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
mainLeft_bg_04.gif
cdfront.tower.jp/img12/search/common/
|
2 KB
2 KB
|
1043ms
1042ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
mainLeft_bg_05.gif
cdfront.tower.jp/img12/search/common/
|
1 KB
2 KB
|
1030ms
1029ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
ico_accordion_01.gif
cdfront.tower.jp/img12/common/
|
2 KB
3 KB
|
1252ms
1251ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
mainLeft_arrow_04.gif
cdfront.tower.jp/img12/search/common/
|
1 KB
2 KB
|
1011ms
1010ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
/
b97.yahoo.co.jp/pagead/conversion/1000425119/
|
42 B
1021 B
|
1052ms
486ms
|
Image
image/gif |
183.79.255.12
YAHOO-JP-AS-AP Ya...
|
|
General
- Full URL
- https://b97.yahoo.co.jp/pagead/conversion/1000425119/?random=1614676132111&cv=9&fst=1614676132111&num=1&fmt=3&guid=ON&disvt=false&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&sendb=1&ig=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&hn=www.googleadservices.com&async=1
- Requested by
- Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
- Protocol
- HTTP/1.1
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
183.79.255.12
, Japan,
ASN24572
(YAHOO-JP-AS-AP Yahoo Japan, JP),
- Reverse DNS
- Software
-
ATS /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
Content-Security-Policy |
script-src 'none'; object-src 'none' |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
759186491225452
Show response
connect.facebook.net/signals/config/
|
241 KB
69 KB
|
129ms
129ms
|
Script
application/x-javascript |
2a03:2880:f01c:8012:face:b00c:0:3
FACEBOOK
|
|
General
- Full URL
- https://connect.facebook.net/signals/config/759186491225452?v=2.9.33&r=stable
- Requested by
- Host: connect.facebook.net
URL: https://connect.facebook.net/en_US/fbevents.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a03:2880:f01c:8012:face:b00c:0:3
, United States,
ASN32934
(FACEBOOK, US),
- Reverse DNS
- Software
-
/
- Resource Hash
- f706e977b49ea16c21a58411ede0be44de71692c02ed10c4695a0acd3e0f0d03
- Security Headers
-
Name |
Value |
Content-Security-Policy |
default-src facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com data: blob: 'self';script-src *.fbcdn.net *.facebook.net 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com;connect-src *.fbcdn.net *.facebook.net attachment.fbsbx.com blob: 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;block-all-mixed-content;upgrade-insecure-requests;report-uri https://www.facebook.com/csp/reporting/?m=c; |
Strict-Transport-Security |
max-age=31536000; preload; includeSubDomains |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
DENY |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
/
www.facebook.com/tr/
|
44 B
259 B
|
6ms
6ms
|
Image
image/gif |
2a03:2880:f11c:8183:face:b00c:0:25de
FACEBOOK
|
|
General
- Full URL
- https://www.facebook.com/tr/?id=1355596731207630&ev=PageView&dl=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&rl=https%3A%2F%2Ft.co%2FEQWgQUtcoG&if=false&ts=1614676132239&sw=1600&sh=1200&v=2.9.33&r=stable&ec=0&o=30&fbp=fb.1.1614676132238.1716865323&it=1614676131264&coo=false&rqm=GET
- Requested by
- Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a03:2880:f11c:8183:face:b00c:0:25de
, United States,
ASN32934
(FACEBOOK, US),
- Reverse DNS
- Software
-
proxygen-bolt /
- Resource Hash
- 10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; includeSubDomains |
|
GET
H2
|
200
|
/
www.google.com/pagead/1p-user-list/987250729/
|
42 B
552 B
|
38ms
19ms
|
Image
image/gif |
2a00:1450:4001:82a::2004
GOOGLE
|
|
General
- Full URL
- https://www.google.com/pagead/1p-user-list/987250729/?random=1614676131397&cv=9&fst=1614675600000&num=1&label=eK3pCLfKjwIQqYDh1gM&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0>m=2wg2h0&sendb=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&async=1&fmt=3&is_vtc=1&random=920400909&resp=GooglemKTybQhCsO&rmt_tld=0&ipr=y
- Requested by
- Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:82a::2004
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
Content-Security-Policy |
script-src 'none'; object-src 'none' |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
/
www.google.de/pagead/1p-user-list/987250729/
|
42 B
552 B
|
40ms
20ms
|
Image
image/gif |
2a00:1450:4001:812::2003
GOOGLE
|
|
General
- Full URL
- https://www.google.de/pagead/1p-user-list/987250729/?random=1614676131397&cv=9&fst=1614675600000&num=1&label=eK3pCLfKjwIQqYDh1gM&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0>m=2wg2h0&sendb=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&async=1&fmt=3&is_vtc=1&random=920400909&resp=GooglemKTybQhCsO&rmt_tld=1&ipr=y
- Requested by
- Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:812::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
Content-Security-Policy |
script-src 'none'; object-src 'none' |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
/
www.google.com/pagead/1p-user-list/987250729/
|
42 B
66 B
|
72ms
56ms
|
Image
image/gif |
2a00:1450:4001:82a::2004
GOOGLE
|
|
General
- Full URL
- https://www.google.com/pagead/1p-user-list/987250729/?random=1614676131401&cv=9&fst=1614675600000&num=1&label=fctTCJfpqgUQqYDh1gM&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0>m=2wg2h0&sendb=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&async=1&fmt=3&is_vtc=1&random=1554846340&resp=GooglemKTybQhCsO&rmt_tld=0&ipr=y
- Requested by
- Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:82a::2004
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
Content-Security-Policy |
script-src 'none'; object-src 'none' |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
/
www.google.de/pagead/1p-user-list/987250729/
|
42 B
108 B
|
21ms
19ms
|
Image
image/gif |
2a00:1450:4001:812::2003
GOOGLE
|
|
General
- Full URL
- https://www.google.de/pagead/1p-user-list/987250729/?random=1614676131401&cv=9&fst=1614675600000&num=1&label=fctTCJfpqgUQqYDh1gM&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0>m=2wg2h0&sendb=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&async=1&fmt=3&is_vtc=1&random=1554846340&resp=GooglemKTybQhCsO&rmt_tld=1&ipr=y
- Requested by
- Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:812::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
Content-Security-Policy |
script-src 'none'; object-src 'none' |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
/
www.google.com/pagead/1p-user-list/987250729/
|
42 B
530 B
|
71ms
55ms
|
Image
image/gif |
2a00:1450:4001:82a::2004
GOOGLE
|
|
General
- Full URL
- https://www.google.com/pagead/1p-user-list/987250729/?random=1614676131400&cv=9&fst=1614675600000&num=1&label=va_2CKfnqgUQqYDh1gM&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0>m=2wg2h0&sendb=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&async=1&fmt=3&is_vtc=1&random=3938589166&resp=GooglemKTybQhCsO&rmt_tld=0&ipr=y
- Requested by
- Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:82a::2004
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
Content-Security-Policy |
script-src 'none'; object-src 'none' |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
/
www.google.de/pagead/1p-user-list/987250729/
|
42 B
108 B
|
22ms
21ms
|
Image
image/gif |
2a00:1450:4001:812::2003
GOOGLE
|
|
General
- Full URL
- https://www.google.de/pagead/1p-user-list/987250729/?random=1614676131400&cv=9&fst=1614675600000&num=1&label=va_2CKfnqgUQqYDh1gM&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0>m=2wg2h0&sendb=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&async=1&fmt=3&is_vtc=1&random=3938589166&resp=GooglemKTybQhCsO&rmt_tld=1&ipr=y
- Requested by
- Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:812::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
Content-Security-Policy |
script-src 'none'; object-src 'none' |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H3-Q050
|
200
|
/
www.google.com/pagead/1p-user-list/813460921/
|
42 B
66 B
|
72ms
56ms
|
Image
image/gif |
2a00:1450:4001:82a::2004
GOOGLE
|
|
General
- Full URL
- https://www.google.com/pagead/1p-user-list/813460921/?random=1614676131401&cv=9&fst=1614675600000&num=1&label=v5DCOqugH8QudvxgwM&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0>m=2wg2h0&sendb=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&async=1&fmt=3&is_vtc=1&cid=CAQSKQCNIrLMXeVYjxcpBBHTWZsW6j8Yxi-CZB3CcRNmH60ON_tM2mdF0lbp&random=2102106470&resp=GooglemKTybQhCsO&rmt_tld=0&ipr=y
- Requested by
- Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:82a::2004
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
Content-Security-Policy |
script-src 'none'; object-src 'none' |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
/
www.google.de/pagead/1p-user-list/813460921/
|
42 B
108 B
|
20ms
19ms
|
Image
image/gif |
2a00:1450:4001:812::2003
GOOGLE
|
|
General
- Full URL
- https://www.google.de/pagead/1p-user-list/813460921/?random=1614676131401&cv=9&fst=1614675600000&num=1&label=v5DCOqugH8QudvxgwM&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0>m=2wg2h0&sendb=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&async=1&fmt=3&is_vtc=1&cid=CAQSKQCNIrLMXeVYjxcpBBHTWZsW6j8Yxi-CZB3CcRNmH60ON_tM2mdF0lbp&random=2102106470&resp=GooglemKTybQhCsO&rmt_tld=1&ipr=y
- Requested by
- Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:812::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
Content-Security-Policy |
script-src 'none'; object-src 'none' |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
/
www.facebook.com/tr/
|
44 B
101 B
|
7ms
6ms
|
Image
image/gif |
2a03:2880:f11c:8183:face:b00c:0:25de
FACEBOOK
|
|
General
- Full URL
- https://www.facebook.com/tr/?id=759186491225452&ev=PageView&dl=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&rl=https%3A%2F%2Ft.co%2FEQWgQUtcoG&if=false&ts=1614676132681&sw=1600&sh=1200&v=2.9.33&r=stable&ec=0&o=30&fbp=fb.1.1614676132238.1716865323&it=1614676131264&coo=false&rqm=GET
- Requested by
- Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a03:2880:f11c:8183:face:b00c:0:25de
, United States,
ASN32934
(FACEBOOK, US),
- Reverse DNS
- Software
-
proxygen-bolt /
- Resource Hash
- 10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; includeSubDomains |
|
GET
H/1.1
|
200
OK
|
footerContents
Show response
tower.jp/ajax/
|
8 KB
4 KB
|
338ms
337ms
|
XHR
text/html |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H2
|
200
|
ga.js
Show response
ssl.google-analytics.com/
|
45 KB
17 KB
|
7ms
5ms
|
Script
text/javascript |
2a00:1450:4001:827::2008
GOOGLE
|
|
General
- Full URL
- https://ssl.google-analytics.com/ga.js
- Requested by
- Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:827::2008
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 1259ea99bd76596239bfd3102c679eb0a5052578dc526b0452f4d42f8bcdd45f
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
GET
DATA
|
200
OK
|
truncated
Show response
/
|
253 KB
0
|
|
Script
text/javascript |
|
|
|
GET
H2
|
200
|
geolocation
Show response
checkout-api.worldshopping.jp/v1/
|
44 B
487 B
|
1156ms
1060ms
|
XHR
application/json |
13.225.74.64
AMAZON-02
|
|
|
GET
H3-Q050
|
200
|
collect
stats.g.doubleclick.net/r/
Redirect Chain
-
https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=1833220584&utmhn=tower.jp&utmcs=UTF-8&utmsr=1600x1200&utmvp=1600x1200&utmsc=24-bit&utmul=en-us&utmje=0&utmfl=-&utmdt=TOWER%20REC...
-
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1590191-2&cid=2007558036.1614676131&jid=1107790623&_v=5.7.2&z=1833220584
|
35 B
412 B
|
40ms
26ms
|
Image
image/gif |
2a00:1450:400c:c0c::9b
GOOGLE
|
|
General
- Full URL
- https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1590191-2&cid=2007558036.1614676131&jid=1107790623&_v=5.7.2&z=1833220584
- Requested by
- Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:400c:c0c::9b
Brussels, Belgium,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
a2b-tower-to-page.js
Show response
banner.buyee.jp/script/
|
2 KB
1 KB
|
940ms
316ms
|
Script
text/javascript |
54.150.94.100
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
GetDispCustomerNoticeList
Show response
tower.jp/ec/Customer/
|
0
590 B
|
310ms
309ms
|
XHR
text/plain |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
GetDispCustomerNoticeCount
Show response
tower.jp/ec/Customer/
|
1 B
631 B
|
326ms
326ms
|
XHR
text/html |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
/
Show response
tower.jp/rcm/RcmWebSvc.svc/
|
184 B
372 B
|
393ms
392ms
|
XHR
application/json |
133.130.50.172
INTERQ GMO Internet
|
|
|
GET
H/1.1
|
200
OK
|
bg_selectbox_01.gif
cdfront.tower.jp/img12/ec/common/
|
1 KB
2 KB
|
1146ms
348ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
ico_selectbox_01.gif
cdfront.tower.jp/img12/ec/common/
|
1 KB
2 KB
|
1334ms
306ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H2
|
200
|
adsct
Show response
analytics.twitter.com/i/
|
31 B
232 B
|
170ms
169ms
|
Script
application/javascript |
104.244.42.3
TWITTER
|
|
General
- Full URL
- https://analytics.twitter.com/i/adsct?type=javascript&version=1.1.1&p_id=Twitter&p_user_id=0&txn_id=o062f&events=%5B%5B%22pageview%22%2Cnull%5D%5D&tw_sale_amount=0&tw_order_quantity=0&tw_iframe_status=0&tpx_cb=twttr.conversion.loadPixels&tw_document_href=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483
- Requested by
- Host: static.ads-twitter.com
URL: https://static.ads-twitter.com/uwt.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.42.3
, United States,
ASN13414
(TWITTER, US),
- Reverse DNS
- Software
-
tsa_o /
- Resource Hash
- df3e003cc30e9bdd0313100e8ee5d468070b4b34d11ad355f276a356d4b9c7bf
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=631138519 |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
SAMEORIGIN |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
adsct
Show response
analytics.twitter.com/i/
|
31 B
285 B
|
169ms
169ms
|
Script
application/javascript |
104.244.42.3
TWITTER
|
|
General
- Full URL
- https://analytics.twitter.com/i/adsct?type=javascript&version=1.1.1&p_id=Twitter&p_user_id=0&txn_id=nywsr&events=%5B%5B%22pageview%22%2Cnull%5D%5D&tw_sale_amount=0&tw_order_quantity=0&tw_iframe_status=0&tpx_cb=twttr.conversion.loadPixels&tw_document_href=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483
- Requested by
- Host: static.ads-twitter.com
URL: https://static.ads-twitter.com/uwt.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.42.3
, United States,
ASN13414
(TWITTER, US),
- Reverse DNS
- Software
-
tsa_o /
- Resource Hash
- df3e003cc30e9bdd0313100e8ee5d468070b4b34d11ad355f276a356d4b9c7bf
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=631138519 |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
SAMEORIGIN |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
adsct
Show response
analytics.twitter.com/i/
|
31 B
234 B
|
170ms
170ms
|
Script
application/javascript |
104.244.42.3
TWITTER
|
|
General
- Full URL
- https://analytics.twitter.com/i/adsct?type=javascript&version=1.1.1&p_id=Twitter&p_user_id=0&txn_id=o2vlh&events=%5B%5B%22pageview%22%2Cnull%5D%5D&tw_sale_amount=0&tw_order_quantity=0&tw_iframe_status=0&tpx_cb=twttr.conversion.loadPixels&tw_document_href=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483
- Requested by
- Host: static.ads-twitter.com
URL: https://static.ads-twitter.com/uwt.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.42.3
, United States,
ASN13414
(TWITTER, US),
- Reverse DNS
- Software
-
tsa_o /
- Resource Hash
- df3e003cc30e9bdd0313100e8ee5d468070b4b34d11ad355f276a356d4b9c7bf
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=631138519 |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
SAMEORIGIN |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
vclp.js
Show response
trj.valuecommerce.com/
|
3 KB
4 KB
|
29ms
8ms
|
Script
application/javascript |
2a04:4e42:1b::737
FASTLY
|
|
|
GET
H/1.1
|
200
OK
|
bf.png
a.imgvc.com/i/
|
107 B
405 B
|
1220ms
305ms
|
Image
image/png |
210.140.252.195
IDCF IDC Frontier...
|
|
|
GET
H/1.1
|
200
OK
|
tag.gif
tr.line.me/
|
43 B
425 B
|
1081ms
314ms
|
Image
image/gif |
203.104.153.77
LINE LINE Corpora...
|
|
General
- Full URL
- https://tr.line.me/tag.gif?b_id=559a7db4-eb53-491c-ba7f-bfb11edcf614&b_u=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&b_d=tower.jp&b_p=%2Fsearch%2Fadvanced%2Fitem%2Fsearch&b_q=%3Fjan%3D4562494353476%257C4562494353483&b_t=TOWER%20RECORDS%20ONLINE&b_r=https%3A%2F%2Ft.co%2FEQWgQUtcoG&c_t=lap&t_id=3dceb858-0925-48f7-87cc-85250cc75db7&s_id=db26c999-2dd8eb5f&x4=2&e=pv&v=3.0.0&_t=1614676133026
- Requested by
- Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
203.104.153.77
, Japan,
ASN38631
(LINE LINE Corporation, JP),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
H/1.1
|
200
OK
|
bg_top_01.png
cdfront.tower.jp/img12/common/
|
1 KB
2 KB
|
60ms
60ms
|
Image
image/png |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
bottomNav_bg_02.gif
cdfront.tower.jp/img12/common/
|
6 KB
6 KB
|
60ms
59ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
bottomNav_ico_01.gif
cdfront.tower.jp/img12/common/
|
1 KB
2 KB
|
60ms
59ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
bt_top_01.png
cdfront.tower.jp/~/media/Images/Online/Common/
|
2 KB
3 KB
|
61ms
61ms
|
Image
image/png |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
bottomNav_copyright_01_l.gif
cdfront.tower.jp/~/media/Images/Online/Common/
|
2 KB
3 KB
|
62ms
62ms
|
Image
image/gif |
65.9.58.52
AMAZON-02
|
|
|
GET
H2
|
200
|
/
www.facebook.com/tr/
|
44 B
147 B
|
6ms
6ms
|
Image
image/gif |
2a03:2880:f11c:8183:face:b00c:0:25de
FACEBOOK
|
|
General
- Full URL
- https://www.facebook.com/tr/?id=1355596731207630&ev=Microdata&dl=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&rl=https%3A%2F%2Ft.co%2FEQWgQUtcoG&if=false&ts=1614676133760&cd[DataLayer]=%5B%5D&cd[Meta]=%7B%22title%22%3A%22%5Cn%5CtTOWER%20RECORDS%20ONLINE%5Cn%22%2C%22meta%3Adescription%22%3A%22%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0%E8%A9%B3%E7%B4%B0%E6%A4%9C%E7%B4%A2%22%2C%22meta%3Akeywords%22%3A%22CD%2CDVD%2C%E9%9F%B3%E6%A5%BD%E3%82%BD%E3%83%95%E3%83%88%2C%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%2C%E3%82%BF%E3%83%AF%E3%83%BC%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%2C%E3%82%BF%E3%83%AF%E3%83%AC%E3%82%B3%2CTOWER%20RECORDS%22%7D&cd[OpenGraph]=%7B%7D&cd[Schema.org]=%5B%5D&cd[JSON-LD]=%5B%5D&sw=1600&sh=1200&v=2.9.33&r=stable&ec=1&o=30&fbp=fb.1.1614676132238.1716865323&it=1614676131264&coo=false&es=automatic&tm=3&rqm=GET
- Requested by
- Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a03:2880:f11c:8183:face:b00c:0:25de
, United States,
ASN32934
(FACEBOOK, US),
- Reverse DNS
- Software
-
proxygen-bolt /
- Resource Hash
- 10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; includeSubDomains |
|
GET
H2
|
200
|
banner_red.gif
resource.buyee.jp/store/default/tower/
|
49 B
405 B
|
314ms
153ms
|
Image
image/gif |
65.9.187.79
AMAZON-02
|
|
|
GET
H2
|
200
|
checkout-3_2_26.js
Show response
checkout-js.worldshopping.jp/
|
1 MB
464 KB
|
1175ms
1078ms
|
Script
application/javascript |
13.225.74.33
AMAZON-02
|
|
|
GET
H2
|
200
|
/
www.facebook.com/tr/
|
44 B
147 B
|
6ms
6ms
|
Image
image/gif |
2a03:2880:f11c:8183:face:b00c:0:25de
FACEBOOK
|
|
General
- Full URL
- https://www.facebook.com/tr/?id=759186491225452&ev=Microdata&dl=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&rl=https%3A%2F%2Ft.co%2FEQWgQUtcoG&if=false&ts=1614676134183&cd[DataLayer]=%5B%5D&cd[Meta]=%7B%22title%22%3A%22%5Cn%5CtTOWER%20RECORDS%20ONLINE%5Cn%22%2C%22meta%3Adescription%22%3A%22%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0%E8%A9%B3%E7%B4%B0%E6%A4%9C%E7%B4%A2%22%2C%22meta%3Akeywords%22%3A%22CD%2CDVD%2C%E9%9F%B3%E6%A5%BD%E3%82%BD%E3%83%95%E3%83%88%2C%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%2C%E3%82%BF%E3%83%AF%E3%83%BC%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%2C%E3%82%BF%E3%83%AF%E3%83%AC%E3%82%B3%2CTOWER%20RECORDS%22%7D&cd[OpenGraph]=%7B%7D&cd[Schema.org]=%5B%5D&cd[JSON-LD]=%5B%5D&sw=1600&sh=1200&v=2.9.33&r=stable&ec=1&o=30&fbp=fb.1.1614676132238.1716865323&it=1614676131264&coo=false&es=automatic&tm=3&rqm=GET
- Requested by
- Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a03:2880:f11c:8183:face:b00c:0:25de
, United States,
ASN32934
(FACEBOOK, US),
- Reverse DNS
- Software
-
proxygen-bolt /
- Resource Hash
- 10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; includeSubDomains |
|
GET
H2
|
200
|
nr-1198.min.js
Show response
js-agent.newrelic.com/
|
27 KB
11 KB
|
160ms
51ms
|
Script
application/javascript |
151.101.114.110
FASTLY
|
|
|
GET
H/1.1
|
200
OK
|
bt_01_a_on.png
cdfront.tower.jp/img12/common/
|
5 KB
5 KB
|
63ms
62ms
|
Image
image/png |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
bt_10_s2_on.png
cdfront.tower.jp/img12/common/
|
3 KB
3 KB
|
308ms
307ms
|
Image
image/png |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
bt_02_s2_on.png
cdfront.tower.jp/img12/common/
|
3 KB
3 KB
|
343ms
342ms
|
Image
image/png |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
headerNav_bt_12_on.png
cdfront.tower.jp/img12/common/
|
3 KB
3 KB
|
60ms
59ms
|
Image
image/png |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
headerNav_bt_13_on.png
cdfront.tower.jp/img12/common/
|
3 KB
4 KB
|
60ms
59ms
|
Image
image/png |
65.9.58.52
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
event.jpeg
www.pages07.net/WTS/
|
0
458 B
|
878ms
221ms
|
Image
image/jpeg |
18.140.152.123
AMAZON-02
|
|
General
- Full URL
- https://www.pages07.net/WTS/event.jpeg?accesskey=3149a537-159a5c4d96d-3a49a1d67881ef16e3bf2f68bd600905&v=1.31&isNewSession=1&type=pageview&isNewVisitor=1&sessionGUID=ea781eb1-44cd-7994-8281-c5849200c565&webSyncID=68d96710-b7e3-697e-a850-dea1d2c07574&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&newSiteVisit=1&referringURL=https%3A%2F%2Ft.co%2FEQWgQUtcoG&hostname=tower.jp&pathname=%2Fsearch%2Fadvanced%2Fitem%2Fsearch&newPageVisit=1&eventKey=8315377d-b105-a82d-3b6d-3a4734b7d07e
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
18.140.152.123
Singapore, Singapore,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- ec2-18-140-152-123.ap-southeast-1.compute.amazonaws.com
- Software
-
Apache /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=16070400; includeSubDomains; preload |
|
GET
H2
|
200
|
v1
Show response
api.mdb.tower.jp/mdb/search/media/
|
2 B
243 B
|
1027ms
402ms
|
Fetch
application/json |
52.68.230.127
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
event.jpeg
www.pages07.net/WTS/
|
0
458 B
|
915ms
236ms
|
Image
image/jpeg |
18.140.152.123
AMAZON-02
|
|
General
- Full URL
- https://www.pages07.net/WTS/event.jpeg?accesskey=3149a537-159a5c4d96d-3a49a1d67881ef16e3bf2f68bd600905&v=1.31&isNewSession=1&type=pageview&isNewVisitor=0&sessionGUID=12260585-8d4c-4ee2-5713-210b0cbc2e6c&webSyncID=68d96710-b7e3-697e-a850-dea1d2c07574&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&newSiteVisit=1&referringURL=https%3A%2F%2Ft.co%2FEQWgQUtcoG&hostname=tower.jp&pathname=%2Fsearch%2Fadvanced%2Fitem%2Fsearch&newPageVisit=1&eventKey=44c17413-cab7-7229-73da-e41a0161d56c
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
18.140.152.123
Singapore, Singapore,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- ec2-18-140-152-123.ap-southeast-1.compute.amazonaws.com
- Software
-
Apache /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=16070400; includeSubDomains; preload |
|
GET
H2
|
200
|
default
Show response
api.locize.io/60ff8224-bbcc-4802-8d59-c8983deae8d0/production/en-US/
|
3 B
595 B
|
315ms
199ms
|
XHR
application/json |
13.32.24.99
AMAZON-02
|
|
General
- Full URL
- https://api.locize.io/60ff8224-bbcc-4802-8d59-c8983deae8d0/production/en-US/default
- Requested by
- Host: text
URL: data:text/javascript;base64,ZnVuY3Rpb24gb25Mb2FkWmlnWmFnKCl7IWZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4ocil7aWYoZVtyXSlyZXR1cm4gZVtyXS5leHBvcnRzO3ZhciBvPWVbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9bi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxyKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxuLnI9ZnVuY3Rpb24odCl7InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiYib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pLDImZSYmInN0cmluZyIhPXR5cGVvZiB0KWZvcih2YXIgbyBpbiB0KW4uZChyLG8sZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxvKSk7cmV0dXJuIHJ9LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsImEiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPSIvIixuKG4ucz0zMDIpfShbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDUpLG89big0NSkuZixpPW4oODcpLGE9bigxKSxzPW4oMzIpLHU9bigxNyksYz1uKDE0KSxsPWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKGUsbixyKXtpZih0aGlzIGluc3RhbmNlb2YgdCl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGUsbil9cmV0dXJuIG5ldyB0KGUsbixyKX1yZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3JldHVybiBlLnByb3RvdHlwZT10LnByb3RvdHlwZSxlfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbixmLHAsaCxkLGcsdix5LG09dC50YXJnZXQsYj10Lmdsb2JhbCx4PXQuc3RhdCx3PXQucHJvdG8saz1iP3I6eD9yW21dOihyW21dfHx7fSkucHJvdG90eXBlLFM9Yj9hOmFbbV18fChhW21dPXt9KSxFPVMucHJvdG90eXBlO2ZvcihwIGluIGUpbj0haShiP3A6bSsoeD8iLiI6IiMiKStwLHQuZm9yY2VkKSYmayYmYyhrLHApLGQ9U1twXSxuJiYoZz10Lm5vVGFyZ2V0R2V0Pyh5PW8oayxwKSkmJnkudmFsdWU6a1twXSksaD1uJiZnP2c6ZVtwXSxuJiZ0eXBlb2YgZD09dHlwZW9mIGh8fCh2PXQuYmluZCYmbj9zKGgscik6dC53cmFwJiZuP2woaCk6dyYmImZ1bmN0aW9uIj09dHlwZW9mIGg/cyhGdW5jdGlvbi5jYWxsLGgpOmgsKHQuc2hhbXx8aCYmaC5zaGFtfHxkJiZkLnNoYW0pJiZ1KHYsInNoYW0iLCEwKSxTW3BdPXYsdyYmKGMoYSxmPW0rIlByb3RvdHlwZSIpfHx1KGEsZix7fSksYVtmXVtwXT1oLHQucmVhbCYmRSYmIUVbcF0mJnUoRSxwLGgpKSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz1uKDU4KSxpPW4oNzApLGE9big5NSkscz1yLlN5bWJvbCx1PW8oIndrcyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdVt0XXx8KHVbdF09YSYmc1t0XXx8KGE/czppKSgiU3ltYm9sLiIrdCkpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE0Nyl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEpLG89bigxNCksaT1uKDc1KSxhPW4oMjMpLmY7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXIuU3ltYm9sfHwoci5TeW1ib2w9e30pO28oZSx0KXx8YShlLHQse3ZhbHVlOmkuZih0KX0pfX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbihlKXt2YXIgbj0ib2JqZWN0IixyPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lk1hdGg9PU1hdGgmJnR9O3QuZXhwb3J0cz1yKHR5cGVvZiBnbG9iYWxUaGlzPT1uJiZnbG9iYWxUaGlzKXx8cih0eXBlb2Ygd2luZG93PT1uJiZ3aW5kb3cpfHxyKHR5cGVvZiBzZWxmPT1uJiZzZWxmKXx8cih0eXBlb2YgZT09biYmZSl8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9KS5jYWxsKHRoaXMsbig4NSkpfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt0cnl7cmV0dXJuISF0KCl9Y2F0Y2godCl7cmV0dXJuITB9fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0P251bGwhPT10OiJmdW5jdGlvbiI9PXR5cGVvZiB0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMzYpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjEzKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCFyKHQpKXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgYW4gb2JqZWN0Iik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNTQpO2Z1bmN0aW9uIG8odCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLHIodCxvLmtleSxvKX19dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZSYmbyh0LnByb3RvdHlwZSxlKSxuJiZvKHQsbiksdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpO3QuZXhwb3J0cz0hcihmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LGZ1bmN0aW9uKHQsZSl7dmFyIG49e30uaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uY2FsbCh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTY3KSxvPW4oOTcpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIHQuZXhwb3J0cz1pPW8/cjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fHIodCl9LGkoZSl9dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMTcpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMyksbz1uKDIzKSxpPW4oMzEpO3QuZXhwb3J0cz1yP2Z1bmN0aW9uKHQsZSxuKXtyZXR1cm4gby5mKHQsZSxpKDEsbikpfTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRbZV09bix0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiByW3QrIlByb3RvdHlwZSJdfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTc1KSxvPW4oMTc5KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1yKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmbyh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE1MCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY1KSxvPW4oNDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcihvKHQpKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgYSBmdW5jdGlvbiIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTMpLG89big4NiksaT1uKDExKSxhPW4oNTQpLHM9T2JqZWN0LmRlZmluZVByb3BlcnR5O2UuZj1yP3M6ZnVuY3Rpb24odCxlLG4pe2lmKGkodCksZT1hKGUsITApLGkobiksbyl0cnl7cmV0dXJuIHModCxlLG4pfWNhdGNoKHQpe31pZigiZ2V0ImluIG58fCJzZXQiaW4gbil0aHJvdyBUeXBlRXJyb3IoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuInZhbHVlImluIG4mJih0W2VdPW4udmFsdWUpLHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0Nik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qocih0KSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNjEpLG89bi5uKHIpO2Z1bmN0aW9uIGkodCl7dmFyIGU9d2luZG93LnppZ3phZztlJiZlLnV0aWxzLmRlYnVnTG9nZ2VyKCkobygpKHQpKX1lLmE9e2RlYnVnOmksZXJyb3I6ZnVuY3Rpb24odCl7dmFyIGU9d2luZG93LnppZ3phZztlJiZlLnV0aWxzJiZlLnV0aWxzLmVycm9yTG9nZ2VyJiZlLnV0aWxzLmVycm9yTG9nZ2VyKCkodCksaSh0KX19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTQzKX0sZnVuY3Rpb24odCxlKXt2YXIgbj17fS50b1N0cmluZzt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG4uY2FsbCh0KS5zbGljZSg4LC0xKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMykuZixvPW4oMTcpLGk9bigxNCksYT1uKDE4Nykscz1uKDIpKCJ0b1N0cmluZ1RhZyIpLHU9YSE9PXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixjKXtpZih0KXt2YXIgbD1uP3Q6dC5wcm90b3R5cGU7aShsLHMpfHxyKGwscyx7Y29uZmlndXJhYmxlOiEwLHZhbHVlOmV9KSxjJiZ1JiZvKGwsInRvU3RyaW5nIixhKX19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm57ZW51bWVyYWJsZTohKDEmdCksY29uZmlndXJhYmxlOiEoMiZ0KSx3cml0YWJsZTohKDQmdCksdmFsdWU6ZX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtpZihyKHQpLHZvaWQgMD09PWUpcmV0dXJuIHQ7c3dpdGNoKG4pe2Nhc2UgMDpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5jYWxsKGUpfTtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0LmNhbGwoZSxuKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihuLHIpe3JldHVybiB0LmNhbGwoZSxuLHIpfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKG4scixvKXtyZXR1cm4gdC5jYWxsKGUsbixyLG8pfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShlLGFyZ3VtZW50cyl9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMSksbz1uKDUpLGk9ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp2b2lkIDB9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/aShyW3RdKXx8aShvW3RdKTpyW3RdJiZyW3RdW2VdfHxvW3RdJiZvW3RdW2VdfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNjgpLG89TWF0aC5taW47dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0PjA/byhyKHQpLDkwMDcxOTkyNTQ3NDA5OTEpOjB9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTg0KS5jaGFyQXQsbz1uKDUwKSxpPW4oOTkpLGE9by5zZXQscz1vLmdldHRlckZvcigiU3RyaW5nIEl0ZXJhdG9yIik7aShTdHJpbmcsIlN0cmluZyIsZnVuY3Rpb24odCl7YSh0aGlzLHt0eXBlOiJTdHJpbmcgSXRlcmF0b3IiLHN0cmluZzpTdHJpbmcodCksaW5kZXg6MH0pfSxmdW5jdGlvbigpe3ZhciB0LGU9cyh0aGlzKSxuPWUuc3RyaW5nLG89ZS5pbmRleDtyZXR1cm4gbz49bi5sZW5ndGg/e3ZhbHVlOnZvaWQgMCxkb25lOiEwfToodD1yKG4sbyksZS5pbmRleCs9dC5sZW5ndGgse3ZhbHVlOnQsZG9uZTohMX0pfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbyl7byYmby5lbnVtZXJhYmxlP3RbZV09bjpyKHQsZSxuKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE4MCksbz1uKDIxMik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIWV8fCJvYmplY3QiIT09cihlKSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/byh0KTplfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIyNil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMjcpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjI5KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzMCl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMzEpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjM0KX0sZnVuY3Rpb24odCl7dC5leHBvcnRzPUpTT04ucGFyc2UoJ3sibG9jaXplIjp7InByb2R1Y3RJZCI6IjYwZmY4MjI0LWJiY2MtNDgwMi04ZDU5LWM4OTgzZGVhZThkMCIsImFwaUtleSI6IjczOTZlNzc4LTA5MDMtNGU3ZS04MjgyLWU2NzE1ODU4YmI4YyIsInZlcnNpb24iOiJwcm9kdWN0aW9uIn0sImludGVncmF0aW9ucyI6eyJjb2xvcm1lQXBwIjp7ImFwaSI6eyJwcm9kdWN0IjoiaHR0cHM6Ly9jb2xvcm1lLndvcmxkc2hvcHBpbmcuanAvdjEvcHJvZHVjdCJ9fSwic2hvcGlmeUFwcCI6eyJhcGkiOnsicHJvZHVjdCI6Imh0dHBzOi8vYXBwLXMud29ybGRzaG9wcGluZy5qcC92MS9wcm9kdWN0In19fSwibGFtYmRhIjp7ImNyZWF0ZSI6InNob3AtZGF0YS1wcm9kLWNyZWF0ZSIsImNsZWFyIjoic2hvcC1kYXRhLXByb2QtY2xlYXIifSwic2ZkYyI6eyJjb25uZWN0aW9uU2V0dGluZ3NQYXRoIjoiL3NmZGMvcHJvZC9hcGkifSwiZGVidWdIb3N0cyI6WyJzaG9wLWRhc2hib2FyZC53b3JsZHNob3BwaW5nLmJpeiIsInNob3AtZGFzaGJvYXJkLWRldi53b3JsZHNob3BwaW5nLmJpeiIsInNob3AtZGFzaGJvYXJkLWxvY2FsLndvcmxkc2hvcHBpbmcuYml6Il19Jyl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEzKSxvPW4oNjQpLGk9bigzMSksYT1uKDIxKSxzPW4oNTQpLHU9bigxNCksYz1uKDg2KSxsPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7ZS5mPXI/bDpmdW5jdGlvbih0LGUpe2lmKHQ9YSh0KSxlPXMoZSwhMCksYyl0cnl7cmV0dXJuIGwodCxlKX1jYXRjaCh0KXt9aWYodSh0LGUpKXJldHVybiBpKCFvLmYuY2FsbCh0LGUpLHRbZV0pfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYobnVsbD09dCl0aHJvdyBUeXBlRXJyb3IoIkNhbid0IGNhbGwgbWV0aG9kIG9uICIrdCk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDEzOSksaT1uKDY5KSxhPW4oNTYpLHM9big5MCksdT1uKDY2KSxjPW4oNTcpKCJJRV9QUk9UTyIpLGw9ZnVuY3Rpb24oKXt9LGY9ZnVuY3Rpb24oKXt2YXIgdCxlPXUoImlmcmFtZSIpLG49aS5sZW5ndGg7Zm9yKGUuc3R5bGUuZGlzcGxheT0ibm9uZSIscy5hcHBlbmRDaGlsZChlKSxlLnNyYz1TdHJpbmcoImphdmFzY3JpcHQ6IiksKHQ9ZS5jb250ZW50V2luZG93LmRvY3VtZW50KS5vcGVuKCksdC53cml0ZSgiPHNjcmlwdD5kb2N1bWVudC5GPU9iamVjdDxcL3NjcmlwdD4iKSx0LmNsb3NlKCksZj10LkY7bi0tOylkZWxldGUgZi5wcm90b3R5cGVbaVtuXV07cmV0dXJuIGYoKX07dC5leHBvcnRzPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uKHQsZSl7dmFyIG47cmV0dXJuIG51bGwhPT10PyhsLnByb3RvdHlwZT1yKHQpLG49bmV3IGwsbC5wcm90b3R5cGU9bnVsbCxuW2NdPXQpOm49ZigpLHZvaWQgMD09PWU/bjpvKG4sZSl9LGFbY109ITB9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI3KTt0LmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIkFycmF5Ij09cih0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0KSxvPW4oMjQpLGk9big1NyksYT1uKDk2KSxzPWkoIklFX1BST1RPIiksdT1PYmplY3QucHJvdG90eXBlO3QuZXhwb3J0cz1hP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXtyZXR1cm4gdD1vKHQpLHIodCxzKT90W3NdOiJmdW5jdGlvbiI9PXR5cGVvZiB0LmNvbnN0cnVjdG9yJiZ0IGluc3RhbmNlb2YgdC5jb25zdHJ1Y3Rvcj90LmNvbnN0cnVjdG9yLnByb3RvdHlwZTp0IGluc3RhbmNlb2YgT2JqZWN0P3U6bnVsbH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYT1uKDE4NSkscz1uKDUpLHU9big3KSxjPW4oMTcpLGw9bigxNCksZj1uKDU3KSxwPW4oNTYpLGg9cy5XZWFrTWFwO2lmKGEpe3ZhciBkPW5ldyBoLGc9ZC5nZXQsdj1kLmhhcyx5PWQuc2V0O3I9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS5jYWxsKGQsdCxlKSxlfSxvPWZ1bmN0aW9uKHQpe3JldHVybiBnLmNhbGwoZCx0KXx8e319LGk9ZnVuY3Rpb24odCl7cmV0dXJuIHYuY2FsbChkLHQpfX1lbHNle3ZhciBtPWYoInN0YXRlIik7cFttXT0hMCxyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGModCxtLGUpLGV9LG89ZnVuY3Rpb24odCl7cmV0dXJuIGwodCxtKT90W21dOnt9fSxpPWZ1bmN0aW9uKHQpe3JldHVybiBsKHQsbSl9fXQuZXhwb3J0cz17c2V0OnIsZ2V0Om8saGFzOmksZW5mb3JjZTpmdW5jdGlvbih0KXtyZXR1cm4gaSh0KT9vKHQpOnIodCx7fSl9LGdldHRlckZvcjpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG47aWYoIXUoZSl8fChuPW8oZSkpLnR5cGUhPT10KXRocm93IFR5cGVFcnJvcigiSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAiK3QrIiByZXF1aXJlZCIpO3JldHVybiBufX19fSxmdW5jdGlvbih0LGUsbil7bigxMDIpO3ZhciByPW4oMTg4KSxvPW4oNSksaT1uKDE3KSxhPW4oMzApLHM9bigyKSgidG9TdHJpbmdUYWciKTtmb3IodmFyIHUgaW4gcil7dmFyIGM9b1t1XSxsPWMmJmMucHJvdG90eXBlO2wmJiFsW3NdJiZpKGwscyx1KSxhW3VdPWEuQXJyYXl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3Niksbz1uKDMwKSxpPW4oMikoIml0ZXJhdG9yIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpcmV0dXJuIHRbaV18fHRbIkBAaXRlcmF0b3IiXXx8b1tyKHQpXX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMiksbz1mdW5jdGlvbih0KXt2YXIgZSxuO3RoaXMucHJvbWlzZT1uZXcgdChmdW5jdGlvbih0LHIpe2lmKHZvaWQgMCE9PWV8fHZvaWQgMCE9PW4pdGhyb3cgVHlwZUVycm9yKCJCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvciIpO2U9dCxuPXJ9KSx0aGlzLnJlc29sdmU9cihlKSx0aGlzLnJlamVjdD1yKG4pfTt0LmV4cG9ydHMuZj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IG8odCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZighcih0KSlyZXR1cm4gdDt2YXIgbixvO2lmKGUmJiJmdW5jdGlvbiI9PXR5cGVvZihuPXQudG9TdHJpbmcpJiYhcihvPW4uY2FsbCh0KSkpcmV0dXJuIG87aWYoImZ1bmN0aW9uIj09dHlwZW9mKG49dC52YWx1ZU9mKSYmIXIobz1uLmNhbGwodCkpKXJldHVybiBvO2lmKCFlJiYiZnVuY3Rpb24iPT10eXBlb2Yobj10LnRvU3RyaW5nKSYmIXIobz1uLmNhbGwodCkpKXJldHVybiBvO3Rocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big4OCksbz1uKDY5KTt0LmV4cG9ydHM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHQpe3JldHVybiByKHQsbyl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTgpLG89big3MCksaT1yKCJrZXlzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpW3RdfHwoaVt0XT1vKHQpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89bigxNDApLGk9bigyOCksYT1yWyJfX2NvcmUtanNfc2hhcmVkX18iXXx8bygiX19jb3JlLWpzX3NoYXJlZF9fIix7fSk7KHQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBhW3RdfHwoYVt0XT12b2lkIDAhPT1lP2U6e30pfSkoInZlcnNpb25zIixbXSkucHVzaCh7dmVyc2lvbjoiMy4yLjAiLG1vZGU6aT8icHVyZSI6Imdsb2JhbCIsY29weXJpZ2h0OiLCqSAyMDE5IERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpIn0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDExMiksaT1uKDM0KSxhPW4oMzIpLHM9big1MiksdT1uKDExMSksYz1mdW5jdGlvbih0LGUpe3RoaXMuc3RvcHBlZD10LHRoaXMucmVzdWx0PWV9Oyh0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbCxmKXt2YXIgcCxoLGQsZyx2LHksbT1hKGUsbixsPzI6MSk7aWYoZilwPXQ7ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2YoaD1zKHQpKSl0aHJvdyBUeXBlRXJyb3IoIlRhcmdldCBpcyBub3QgaXRlcmFibGUiKTtpZihvKGgpKXtmb3IoZD0wLGc9aSh0Lmxlbmd0aCk7Zz5kO2QrKylpZigodj1sP20ocih5PXRbZF0pWzBdLHlbMV0pOm0odFtkXSkpJiZ2IGluc3RhbmNlb2YgYylyZXR1cm4gdjtyZXR1cm4gbmV3IGMoITEpfXA9aC5jYWxsKHQpfWZvcig7ISh5PXAubmV4dCgpKS5kb25lOylpZigodj11KHAsbSx5LnZhbHVlLGwpKSYmdiBpbnN0YW5jZW9mIGMpcmV0dXJuIHY7cmV0dXJuIG5ldyBjKCExKX0pLnN0b3A9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBjKCEwLHQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybntlcnJvcjohMSx2YWx1ZTp0KCl9fWNhdGNoKHQpe3JldHVybntlcnJvcjohMCx2YWx1ZTp0fX19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTQxKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzNyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyODUpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLG89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixpPW8mJiFyLmNhbGwoezE6Mn0sMSk7ZS5mPWk/ZnVuY3Rpb24odCl7dmFyIGU9byh0aGlzLHQpO3JldHVybiEhZSYmZS5lbnVtZXJhYmxlfTpyfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2KSxvPW4oMjcpLGk9IiIuc3BsaXQ7dC5leHBvcnRzPXIoZnVuY3Rpb24oKXtyZXR1cm4hT2JqZWN0KCJ6IikucHJvcGVydHlJc0VudW1lcmFibGUoMCl9KT9mdW5jdGlvbih0KXtyZXR1cm4iU3RyaW5nIj09byh0KT9pLmNhbGwodCwiIik6T2JqZWN0KHQpfTpPYmplY3R9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89big3KSxpPXIuZG9jdW1lbnQsYT1vKGkpJiZvKGkuY3JlYXRlRWxlbWVudCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBhP2kuY3JlYXRlRWxlbWVudCh0KTp7fX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIxKSxvPW4oMzQpLGk9big4OSksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLGEpe3ZhciBzLHU9cihlKSxjPW8odS5sZW5ndGgpLGw9aShhLGMpO2lmKHQmJm4hPW4pe2Zvcig7Yz5sOylpZigocz11W2wrK10pIT1zKXJldHVybiEwfWVsc2UgZm9yKDtjPmw7bCsrKWlmKCh0fHxsIGluIHUpJiZ1W2xdPT09bilyZXR1cm4gdHx8bHx8MDtyZXR1cm4hdCYmLTF9fTt0LmV4cG9ydHM9e2luY2x1ZGVzOmEoITApLGluZGV4T2Y6YSghMSl9fSxmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguY2VpbCxyPU1hdGguZmxvb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0PSt0KT8wOih0PjA/cjpuKSh0KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPVsiY29uc3RydWN0b3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRvTG9jYWxlU3RyaW5nIiwidG9TdHJpbmciLCJ2YWx1ZU9mIl19LGZ1bmN0aW9uKHQsZSl7dmFyIG49MCxyPU1hdGgucmFuZG9tKCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiJTeW1ib2woIitTdHJpbmcodm9pZCAwPT09dD8iIjp0KSsiKV8iKygrK24rcikudG9TdHJpbmcoMzYpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDU0KSxvPW4oMjMpLGk9bigzMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgYT1yKGUpO2EgaW4gdD9vLmYodCxhLGkoMCxuKSk6dFthXT1ufX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNiksbz1uKDIpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiFyKGZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuKGUuY29uc3RydWN0b3I9e30pW29dPWZ1bmN0aW9uKCl7cmV0dXJue2ZvbzoxfX0sMSE9PWVbdF0oQm9vbGVhbikuZm9vfSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzMiksbz1uKDY1KSxpPW4oMjQpLGE9bigzNCkscz1uKDk0KSx1PVtdLnB1c2gsYz1mdW5jdGlvbih0KXt2YXIgZT0xPT10LG49Mj09dCxjPTM9PXQsbD00PT10LGY9Nj09dCxwPTU9PXR8fGY7cmV0dXJuIGZ1bmN0aW9uKGgsZCxnLHYpe2Zvcih2YXIgeSxtLGI9aShoKSx4PW8oYiksdz1yKGQsZywzKSxrPWEoeC5sZW5ndGgpLFM9MCxFPXZ8fHMsaj1lP0UoaCxrKTpuP0UoaCwwKTp2b2lkIDA7az5TO1MrKylpZigocHx8UyBpbiB4KSYmKG09dyh5PXhbU10sUyxiKSx0KSlpZihlKWpbU109bTtlbHNlIGlmKG0pc3dpdGNoKHQpe2Nhc2UgMzpyZXR1cm4hMDtjYXNlIDU6cmV0dXJuIHk7Y2FzZSA2OnJldHVybiBTO2Nhc2UgMjp1LmNhbGwoaix5KX1lbHNlIGlmKGwpcmV0dXJuITE7cmV0dXJuIGY/LTE6Y3x8bD9sOmp9fTt0LmV4cG9ydHM9e2ZvckVhY2g6YygwKSxtYXA6YygxKSxmaWx0ZXI6YygyKSxzb21lOmMoMyksZXZlcnk6Yyg0KSxmaW5kOmMoNSksZmluZEluZGV4OmMoNil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDE3NCk7dC5leHBvcnRzPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8KCJfX3Byb3RvX18iaW57fT9mdW5jdGlvbigpe3ZhciB0LGU9ITEsbj17fTt0cnl7KHQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCJfX3Byb3RvX18iKS5zZXQpLmNhbGwobixbXSksZT1uIGluc3RhbmNlb2YgQXJyYXl9Y2F0Y2godCl7fXJldHVybiBmdW5jdGlvbihuLGkpe3JldHVybiByKG4pLG8oaSksZT90LmNhbGwobixpKTpuLl9fcHJvdG9fXz1pLG59fSgpOnZvaWQgMCl9LGZ1bmN0aW9uKHQsZSxuKXtlLmY9bigyKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjcpLG89bigyKSgidG9TdHJpbmdUYWciKSxpPSJBcmd1bWVudHMiPT1yKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlLG4sYTtyZXR1cm4gdm9pZCAwPT09dD8iVW5kZWZpbmVkIjpudWxsPT09dD8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihuPWZ1bmN0aW9uKHQsZSl7dHJ5e3JldHVybiB0W2VdfWNhdGNoKHQpe319KGU9T2JqZWN0KHQpLG8pKT9uOmk/cihlKToiT2JqZWN0Ij09KGE9cihlKSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNhbGxlZT8iQXJndW1lbnRzIjphfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz0iXHRcblx2XGZcciDCoOGagOKAgOKAgeKAguKAg+KAhOKAheKAhuKAh+KAiOKAieKAiuKAr+KBn+OAgFx1MjAyOFx1MjAyOVx1ZmVmZiJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMzKTt0LmV4cG9ydHM9cigibmF2aWdhdG9yIiwidXNlckFnZW50Iil8fCIifSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjIyKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0Nyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNjMpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNzMpLG89bigyNzYpLGk9bigyODEpLGE9bigyODQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KXx8byh0KXx8aSh0KXx8YSgpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24odCl7bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIFJ9KSxuLmQoZSwiYiIsZnVuY3Rpb24oKXtyZXR1cm4gUH0pO3ZhciByPW4oMzgpLG89bi5uKHIpLGk9bigzOSksYT1uLm4oaSkscz1uKDQwKSx1PW4ubihzKSxjPW4oNDEpLGw9bi5uKGMpLGY9big0MikscD1uLm4oZiksaD1uKDQzKSxkPW4ubihoKSxnPW4oMTM0KSx2PW4ubihnKSx5PW4oNjMpLG09bi5uKHkpLGI9bigxNikseD1uLm4oYiksdz1uKDgpLGs9bi5uKHcpLFM9bigxMiksRT1uLm4oUyksaj1uKDEzNSksVD1uLm4oaiksTz1uKDI1KSxBPW4oNDQpO2Z1bmN0aW9uIEModCxlKXt2YXIgbjtpZih2b2lkIDA9PT1sLmF8fG51bGw9PXUoKSh0KSl7aWYoYSgpKHQpfHwobj1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKCF0KXJldHVybjtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIEwodCxlKTt2YXIgcj1kKCkobj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLmNhbGwobiw4LC0xKTsiT2JqZWN0Ij09PXImJnQuY29uc3RydWN0b3ImJihyPXQuY29uc3RydWN0b3IubmFtZSk7aWYoIk1hcCI9PT1yfHwiU2V0Ij09PXIpcmV0dXJuIHAoKSh0KTtpZigiQXJndW1lbnRzIj09PXJ8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKXJldHVybiBMKHQsZSl9KHQpKXx8ZSYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxpPWZ1bmN0aW9uKCl7fTtyZXR1cm57czppLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjppfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIHMsYz0hMCxmPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj1vKCkodCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1uLm5leHQoKTtyZXR1cm4gYz10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXtmPSEwLHM9dH0sZjpmdW5jdGlvbigpe3RyeXtjfHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKGYpdGhyb3cgc319fX1mdW5jdGlvbiBMKHQsZSl7KG51bGw9PWV8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9dmFyIFI9e2NvZGU6Ik5PTkUifSxQPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXt2YXIgbj10aGlzLHI9dC5zY3JhcGVyUmVzdWx0LG89dC5sb2NhdGlvbixpPXQuZGF0YTtrKCkodGhpcyxlKSx0aGlzLmV4Y2x1ZGVCeVNjcmFwZXJFcnJvcj1mdW5jdGlvbigpe3ZhciB0PW4uc2NyYXBlclJlc3VsdDtyZXR1cm4gdC5lcnJvcj97Y29kZToiRVJST1IiLG1lc3NhZ2U6ImV4Y2x1ZGVCeVNjcmFwZXJFcnJvcjogIi5jb25jYXQodC5lcnJvcil9OnQuaXRlbT8odC5za3VSb3dzfHwodC5za3VSb3dzPVtdKSxSKTp7Y29kZToiRVJST1IiLG1lc3NhZ2U6ImV4Y2x1ZGVCeVNjcmFwZXJFcnJvcjogbm8gaXRlbSJ9fSx0aGlzLmV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIG4uc2NyYXBlclJlc3VsdC5wdXJjaGFzYWJsZT9SOntjb2RlOiJOT1RfUFVSQ0hBU0FCTEUiLG1lc3NhZ2U6ImV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlIn19LHRoaXMuZXhjbHVkZUJ5U2t1WmVybz1mdW5jdGlvbigpe3JldHVybiBuLnNjcmFwZXJSZXN1bHQuc2t1Um93cyYmMD09PW4uc2NyYXBlclJlc3VsdC5za3VSb3dzLmxlbmd0aD97Y29kZToiTk9UX1BVUkNIQVNBQkxFIixtZXNzYWdlOiJleGNsdWRlQnlTa3VaZXJvIn06Un0sdGhpcy5leGNsdWRlQnlVcmw9ZnVuY3Rpb24oKXtpZigwPT09bi5ieVVybC5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9ZS53aW5kb3dMb2NhdGlvbkhyZWY7cmV0dXJuIG4uZXhjbHVkZShuLmJ5VXJsLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIl4iLmNvbmNhdChUKCkoeCgpKG49ZS51cmwpLmNhbGwobikpKSkudGVzdCh0KX0pfSx0aGlzLmV4Y2x1ZGVCeUl0ZW1OYW1lPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtTmFtZS5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9bi5zY3JhcGVyUmVzdWx0Lml0ZW0mJm4uc2NyYXBlclJlc3VsdC5pdGVtLm5hbWV8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUl0ZW1OYW1lLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIl4iLmNvbmNhdCh4KCkobj1lLml0ZW1OYW1lKS5jYWxsKG4pKSkudGVzdCh0KX0pfSx0aGlzLmV4Y2x1ZGVCeUl0ZW1Db2RlPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtQ29kZS5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9bi5zY3JhcGVyUmVzdWx0Lml0ZW0mJm4uc2NyYXBlclJlc3VsdC5pdGVtLmNvZGV8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUl0ZW1Db2RlLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIHgoKShuPWUuaXRlbUNvZGUpLmNhbGwobik9PT10fSl9LHRoaXMuZXhjbHVkZUJ5Q2F0ZWdvcnk9ZnVuY3Rpb24oKXtpZigwPT09bi5ieUNhdGVnb3J5Lmxlbmd0aClyZXR1cm4gUjt2YXIgdD1uLnNjcmFwZXJSZXN1bHQuaXRlbSYmbi5zY3JhcGVyUmVzdWx0Lml0ZW0uY2F0ZWdvcnl8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUNhdGVnb3J5LHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIHgoKShuPWUuY2F0ZWdvcnkpLmNhbGwobik9PT10fSl9LHRoaXMuZXhjbHVkZUJ5SXRlbURlc2NyaXB0aW9uPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtRGVzY3JpcHRpb24ubGVuZ3RoKXJldHVybiBSO3ZhciB0PW4uc2NyYXBlclJlc3VsdC5pdGVtJiZuLnNjcmFwZXJSZXN1bHQuaXRlbS5kZXNjcmlwdGlvbnx8IiI7cmV0dXJuIG4uZXhjbHVkZShuLmJ5SXRlbURlc2NyaXB0aW9uLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIiIuY29uY2F0KHgoKShuPWUudGV4dCkuY2FsbChuKSkpLnRlc3QodCl9KX0sdGhpcy5leGVjdXRlPWZ1bmN0aW9uKCl7dmFyIHQ9ITEsZT1bXSxyPW4uZXhjbHVkZUJ5U2NyYXBlckVycm9yKCk7aWYoIk5PTkUiIT09ci5jb2RlKXJldHVybntpc0V4Y2x1ZGVkOiEwLHJlYXNvbnM6W3JdfTsiTk9ORSIhPT0ocj1uLmV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlKCkpLmNvZGUmJih0PSEwLGUucHVzaChyKSk7dmFyIG8saT1DKG4uY29uZmlndXJlRXhjbHVzaW9uTWV0aG9kcyhbbi5leGNsdWRlQnlVcmwsbi5leGNsdWRlQnlJdGVtTmFtZSxuLmV4Y2x1ZGVCeUl0ZW1Db2RlLG4uZXhjbHVkZUJ5Q2F0ZWdvcnksbi5leGNsdWRlQnlJdGVtRGVzY3JpcHRpb25dKSk7dHJ5e2ZvcihpLnMoKTshKG89aS5uKCkpLmRvbmU7KXt2YXIgYT0oMCxvLnZhbHVlKSgpO2lmKCJOT05FIiE9PWEuY29kZSYmKHQ9ITAsZS5wdXNoKGEpKSwiRVJST1IiPT09YS5jb2RlKWJyZWFrfX1jYXRjaCh0KXtpLmUodCl9ZmluYWxseXtpLmYoKX1yZXR1cm57aXNFeGNsdWRlZDp0LHJlYXNvbnM6ZX19LHRoaXMuc2NyYXBlclJlc3VsdD1yLHRoaXMubG9jYXRpb249byx0aGlzLmRhdGE9aSx0aGlzLmJ5VXJsPWkuYnlVcmwsdGhpcy5ieUl0ZW1OYW1lPWkuYnlJdGVtTmFtZSx0aGlzLmJ5SXRlbUNvZGU9aS5ieUl0ZW1Db2RlLHRoaXMuYnlDYXRlZ29yeT1pLmJ5Q2F0ZWdvcnksdGhpcy5ieUl0ZW1EZXNjcmlwdGlvbj1pLmJ5SXRlbURlc2NyaXB0aW9ufXJldHVybiBFKCkoZSxbe2tleToiY29uZmlndXJlRXhjbHVzaW9uTWV0aG9kcyIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHR9fSx7a2V5OiJleGNsdWRlIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIFJ9fV0sW3trZXk6IndpbmRvd0xvY2F0aW9uSHJlZiIsZ2V0OmZ1bmN0aW9uKCl7dmFyIGUsbj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUscj13aW5kb3cubG9jYXRpb24uaHJlZjtpZihtKCkoZT1BLmRlYnVnSG9zdHMpLmNhbGwoZSxuKSl7dmFyIG89bmV3IHYuYSh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoInp6dXJsIik7aWYobyl0cnl7cj10LmZyb20obywiYmFzZTY0IikudG9TdHJpbmcoInV0Zi04Iil9Y2F0Y2godCl7Ty5hLmVycm9yKHQpfX1yZXR1cm4gcn19XSksZX0oKX0pLmNhbGwodGhpcyxuKDI5NCkuQnVmZmVyKX0sZnVuY3Rpb24odCxlKXt2YXIgbjtuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7dHJ5e249bnx8bmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9Y2F0Y2godCl7Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJihuPXdpbmRvdyl9dC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEzKSxvPW4oNiksaT1uKDY2KTt0LmV4cG9ydHM9IXImJiFvKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eShpKCJkaXYiKSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNiksbz0vI3xcLnByb3RvdHlwZVwuLyxpPWZ1bmN0aW9uKHQsZSl7dmFyIG49c1thKHQpXTtyZXR1cm4gbj09Y3x8biE9dSYmKCJmdW5jdGlvbiI9PXR5cGVvZiBlP3IoZSk6ISFlKX0sYT1pLm5vcm1hbGl6ZT1mdW5jdGlvbih0KXtyZXR1cm4gU3RyaW5nKHQpLnJlcGxhY2UobywiLiIpLnRvTG93ZXJDYXNlKCl9LHM9aS5kYXRhPXt9LHU9aS5OQVRJVkU9Ik4iLGM9aS5QT0xZRklMTD0iUCI7dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0KSxvPW4oMjEpLGk9big2NykuaW5kZXhPZixhPW4oNTYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuLHM9byh0KSx1PTAsYz1bXTtmb3IobiBpbiBzKSFyKGEsbikmJnIocyxuKSYmYy5wdXNoKG4pO2Zvcig7ZS5sZW5ndGg+dTspcihzLG49ZVt1KytdKSYmKH5pKGMsbil8fGMucHVzaChuKSk7cmV0dXJuIGN9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2OCksbz1NYXRoLm1heCxpPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPXIodCk7cmV0dXJuIG48MD9vKG4rZSwwKTppKG4sZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzMyk7dC5leHBvcnRzPXIoImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50Iil9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMiksbz1uKDcpLGk9W10uc2xpY2UsYT17fSxzPWZ1bmN0aW9uKHQsZSxuKXtpZighKGUgaW4gYSkpe2Zvcih2YXIgcj1bXSxvPTA7bzxlO28rKylyW29dPSJhWyIrbysiXSI7YVtlXT1GdW5jdGlvbigiQyxhIiwicmV0dXJuIG5ldyBDKCIrci5qb2luKCIsIikrIikiKX1yZXR1cm4gYVtlXSh0LG4pfTt0LmV4cG9ydHM9RnVuY3Rpb24uYmluZHx8ZnVuY3Rpb24odCl7dmFyIGU9cih0aGlzKSxuPWkuY2FsbChhcmd1bWVudHMsMSksYT1mdW5jdGlvbigpe3ZhciByPW4uY29uY2F0KGkuY2FsbChhcmd1bWVudHMpKTtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGE/cyhlLHIubGVuZ3RoLHIpOmUuYXBwbHkodCxyKX07cmV0dXJuIG8oZS5wcm90b3R5cGUpJiYoYS5wcm90b3R5cGU9ZS5wcm90b3R5cGUpLGF9fSxmdW5jdGlvbih0LGUpe2UuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDYpLGk9big0OCksYT1uKDcpLHM9bigyNCksdT1uKDM0KSxjPW4oNzEpLGw9big5NCksZj1uKDcyKSxwPW4oMikoImlzQ29uY2F0U3ByZWFkYWJsZSIpLGg9IW8oZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdFtwXT0hMSx0LmNvbmNhdCgpWzBdIT09dH0pLGQ9ZigiY29uY2F0IiksZz1mdW5jdGlvbih0KXtpZighYSh0KSlyZXR1cm4hMTt2YXIgZT10W3BdO3JldHVybiB2b2lkIDAhPT1lPyEhZTppKHQpfTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IWh8fCFkfSx7Y29uY2F0OmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYT1zKHRoaXMpLGY9bChhLDApLHA9MDtmb3IoZT0tMSxyPWFyZ3VtZW50cy5sZW5ndGg7ZTxyO2UrKylpZihpPS0xPT09ZT9hOmFyZ3VtZW50c1tlXSxnKGkpKXtpZihwKyhvPXUoaS5sZW5ndGgpKT45MDA3MTk5MjU0NzQwOTkxKXRocm93IFR5cGVFcnJvcigiTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkIik7Zm9yKG49MDtuPG87bisrLHArKyluIGluIGkmJmMoZixwLGlbbl0pfWVsc2V7aWYocD49OTAwNzE5OTI1NDc0MDk5MSl0aHJvdyBUeXBlRXJyb3IoIk1heGltdW0gYWxsb3dlZCBpbmRleCBleGNlZWRlZCIpO2MoZixwKyssaSl9cmV0dXJuIGYubGVuZ3RoPXAsZn19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNyksbz1uKDQ4KSxpPW4oMikoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gbyh0KSYmKCJmdW5jdGlvbiIhPXR5cGVvZihuPXQuY29uc3RydWN0b3IpfHxuIT09QXJyYXkmJiFvKG4ucHJvdG90eXBlKT9yKG4pJiZudWxsPT09KG49bltpXSkmJihuPXZvaWQgMCk6bj12b2lkIDApLG5ldyh2b2lkIDA9PT1uP0FycmF5Om4pKDA9PT1lPzA6ZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2KTt0LmV4cG9ydHM9ISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYhcihmdW5jdGlvbigpe3JldHVybiFTdHJpbmcoU3ltYm9sKCkpfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpO3QuZXhwb3J0cz0hcihmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPW51bGwsT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyB0KSE9PXQucHJvdG90eXBlfSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzEpfSxmdW5jdGlvbih0LGUsbil7big0KSgiaXRlcmF0b3IiKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89bigxMDApLGk9big0OSksYT1uKDc0KSxzPW4oMjkpLHU9bigxNyksYz1uKDM2KSxsPW4oMiksZj1uKDI4KSxwPW4oMzApLGg9bigxMDEpLGQ9aC5JdGVyYXRvclByb3RvdHlwZSxnPWguQlVHR1lfU0FGQVJJX0lURVJBVE9SUyx2PWwoIml0ZXJhdG9yIikseT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbCxoLG0sYil7byhuLGUsbCk7dmFyIHgsdyxrLFM9ZnVuY3Rpb24odCl7aWYodD09PWgmJkEpcmV0dXJuIEE7aWYoIWcmJnQgaW4gVClyZXR1cm4gVFt0XTtzd2l0Y2godCl7Y2FzZSJrZXlzIjpjYXNlInZhbHVlcyI6Y2FzZSJlbnRyaWVzIjpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcyx0KX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMpfX0sRT1lKyIgSXRlcmF0b3IiLGo9ITEsVD10LnByb3RvdHlwZSxPPVRbdl18fFRbIkBAaXRlcmF0b3IiXXx8aCYmVFtoXSxBPSFnJiZPfHxTKGgpLEM9IkFycmF5Ij09ZSYmVC5lbnRyaWVzfHxPO2lmKEMmJih4PWkoQy5jYWxsKG5ldyB0KSksZCE9PU9iamVjdC5wcm90b3R5cGUmJngubmV4dCYmKGZ8fGkoeCk9PT1kfHwoYT9hKHgsZCk6ImZ1bmN0aW9uIiE9dHlwZW9mIHhbdl0mJnUoeCx2LHkpKSxzKHgsRSwhMCwhMCksZiYmKHBbRV09eSkpKSwidmFsdWVzIj09aCYmTyYmInZhbHVlcyIhPT1PLm5hbWUmJihqPSEwLEE9ZnVuY3Rpb24oKXtyZXR1cm4gTy5jYWxsKHRoaXMpfSksZiYmIWJ8fFRbdl09PT1BfHx1KFQsdixBKSxwW2VdPUEsaClpZih3PXt2YWx1ZXM6UygidmFsdWVzIiksa2V5czptP0E6Uygia2V5cyIpLGVudHJpZXM6UygiZW50cmllcyIpfSxiKWZvcihrIGluIHcpIWcmJiFqJiZrIGluIFR8fGMoVCxrLHdba10pO2Vsc2Ugcih7dGFyZ2V0OmUscHJvdG86ITAsZm9yY2VkOmd8fGp9LHcpO3JldHVybiB3fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDEwMSkuSXRlcmF0b3JQcm90b3R5cGUsbz1uKDQ3KSxpPW4oMzEpLGE9bigyOSkscz1uKDMwKSx1PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7dmFyIGM9ZSsiIEl0ZXJhdG9yIjtyZXR1cm4gdC5wcm90b3R5cGU9byhyLHtuZXh0OmkoMSxuKX0pLGEodCxjLCExLCEwKSxzW2NdPXUsdH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHIsbyxpLGE9big0OSkscz1uKDE3KSx1PW4oMTQpLGM9bigyKSxsPW4oMjgpLGY9YygiaXRlcmF0b3IiKSxwPSExO1tdLmtleXMmJigibmV4dCJpbihpPVtdLmtleXMoKSk/KG89YShhKGkpKSkhPT1PYmplY3QucHJvdG90eXBlJiYocj1vKTpwPSEwKSxudWxsPT1yJiYocj17fSksbHx8dShyLGYpfHxzKHIsZixmdW5jdGlvbigpe3JldHVybiB0aGlzfSksdC5leHBvcnRzPXtJdGVyYXRvclByb3RvdHlwZTpyLEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM6cH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMSksbz1uKDc3KSxpPW4oMzApLGE9big1MCkscz1uKDk5KSx1PWEuc2V0LGM9YS5nZXR0ZXJGb3IoIkFycmF5IEl0ZXJhdG9yIik7dC5leHBvcnRzPXMoQXJyYXksIkFycmF5IixmdW5jdGlvbih0LGUpe3UodGhpcyx7dHlwZToiQXJyYXkgSXRlcmF0b3IiLHRhcmdldDpyKHQpLGluZGV4OjAsa2luZDplfSl9LGZ1bmN0aW9uKCl7dmFyIHQ9Yyh0aGlzKSxlPXQudGFyZ2V0LG49dC5raW5kLHI9dC5pbmRleCsrO3JldHVybiFlfHxyPj1lLmxlbmd0aD8odC50YXJnZXQ9dm9pZCAwLHt2YWx1ZTp2b2lkIDAsZG9uZTohMH0pOiJrZXlzIj09bj97dmFsdWU6cixkb25lOiExfToidmFsdWVzIj09bj97dmFsdWU6ZVtyXSxkb25lOiExfTp7dmFsdWU6W3IsZVtyXV0sZG9uZTohMX19LCJ2YWx1ZXMiKSxpLkFyZ3VtZW50cz1pLkFycmF5LG8oImtleXMiKSxvKCJ2YWx1ZXMiKSxvKCJlbnRyaWVzIil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxODkpfSxmdW5jdGlvbih0LGUsbil7big5MyksbigxMDUpLG4oMTkwKSxuKDE5MiksbigxOTMpLG4oMTk0KSxuKDE5NSksbig5OCksbigxOTYpLG4oMTk3KSxuKDE5OCksbigxOTkpLG4oMjAwKSxuKDIwMSksbigyMDIpLG4oMjAzKSxuKDIwNCksbigyMDUpLG4oMjA2KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLlN5bWJvbH0sZnVuY3Rpb24odCxlKXt9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg4KSxvPW4oNjkpLmNvbmNhdCgibGVuZ3RoIiwicHJvdG90eXBlIik7ZS5mPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzfHxmdW5jdGlvbih0KXtyZXR1cm4gcih0LG8pfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDYpLG89IlsiK24oNzgpKyJdIixpPVJlZ0V4cCgiXiIrbytvKyIqIiksYT1SZWdFeHAobytvKyIqJCIpLHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPVN0cmluZyhyKGUpKTtyZXR1cm4gMSZ0JiYobj1uLnJlcGxhY2UoaSwiIikpLDImdCYmKG49bi5yZXBsYWNlKGEsIiIpKSxufX07dC5leHBvcnRzPXtzdGFydDpzKDEpLGVuZDpzKDIpLHRyaW06cygzKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKSxvPW4oNTIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1vKHQpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgaXRlcmFibGUiKTtyZXR1cm4gcihlLmNhbGwodCkpfX0sZnVuY3Rpb24odCxlLG4pe24oMjI4KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLkFycmF5LmlzQXJyYXl9LGZ1bmN0aW9uKHQsZSxuKXtuKDM1KSxuKDIzMik7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5BcnJheS5mcm9tfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLG8pe3RyeXtyZXR1cm4gbz9lKHIobilbMF0sblsxXSk6ZShuKX1jYXRjaChlKXt2YXIgaT10LnJldHVybjt0aHJvdyB2b2lkIDAhPT1pJiZyKGkuY2FsbCh0KSksZX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyKSxvPW4oMzApLGk9cigiaXRlcmF0b3IiKSxhPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQmJihvLkFycmF5PT09dHx8YVtpXT09PXQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMikoIml0ZXJhdG9yIiksbz0hMTt0cnl7dmFyIGk9MCxhPXtuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6ISFpKyt9fSxyZXR1cm46ZnVuY3Rpb24oKXtvPSEwfX07YVtyXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxBcnJheS5mcm9tKGEsZnVuY3Rpb24oKXt0aHJvdyAyfSl9Y2F0Y2godCl7fXQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKCFlJiYhbylyZXR1cm4hMTt2YXIgbj0hMTt0cnl7dmFyIGk9e307aVtyXT1mdW5jdGlvbigpe3JldHVybntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6bj0hMH19fX0sdChpKX1jYXRjaCh0KXt9cmV0dXJuIG59fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMzUpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LnNsaWNlO3JldHVybiB0PT09b3x8dCBpbnN0YW5jZW9mIEFycmF5JiZlPT09by5zbGljZT9yOmV9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oNSksaT1uKDc5KSxhPVtdLnNsaWNlLHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4yLG89cj9hLmNhbGwoYXJndW1lbnRzLDIpOnZvaWQgMDtyZXR1cm4gdChyP2Z1bmN0aW9uKCl7KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6RnVuY3Rpb24oZSkpLmFwcGx5KHRoaXMsbyl9OmUsbil9fTtyKHtnbG9iYWw6ITAsYmluZDohMCxmb3JjZWQ6L01TSUUgLlwuLy50ZXN0KGkpfSx7c2V0VGltZW91dDpzKG8uc2V0VGltZW91dCksc2V0SW50ZXJ2YWw6cyhvLnNldEludGVydmFsKX0pfSxmdW5jdGlvbih0LGUsbil7bigxMDUpLG4oMzUpLG4oNTEpLG4oMjU0KSxuKDEyMyksbigyNTgpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuUHJvbWlzZX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSk7dC5leHBvcnRzPXIuUHJvbWlzZX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciBvIGluIGUpbiYmbi51bnNhZmUmJnRbb10/dFtvXT1lW29dOnIodCxvLGVbb10sbik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgVHlwZUVycm9yKCJJbmNvcnJlY3QgIisobj9uKyIgIjoiIikrImludm9jYXRpb24iKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKSxvPW4oMjIpLGk9bigyKSgic3BlY2llcyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuLGE9cih0KS5jb25zdHJ1Y3RvcjtyZXR1cm4gdm9pZCAwPT09YXx8bnVsbD09KG49cihhKVtpXSk/ZTpvKG4pfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhPW4oNSkscz1uKDYpLHU9bigyNyksYz1uKDMyKSxsPW4oOTApLGY9big2NikscD1hLmxvY2F0aW9uLGg9YS5zZXRJbW1lZGlhdGUsZD1hLmNsZWFySW1tZWRpYXRlLGc9YS5wcm9jZXNzLHY9YS5NZXNzYWdlQ2hhbm5lbCx5PWEuRGlzcGF0Y2gsbT0wLGI9e30seD1mdW5jdGlvbih0KXtpZihiLmhhc093blByb3BlcnR5KHQpKXt2YXIgZT1iW3RdO2RlbGV0ZSBiW3RdLGUoKX19LHc9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7eCh0KX19LGs9ZnVuY3Rpb24odCl7eCh0LmRhdGEpfSxTPWZ1bmN0aW9uKHQpe2EucG9zdE1lc3NhZ2UodCsiIixwLnByb3RvY29sKyIvLyIrcC5ob3N0KX07aCYmZHx8KGg9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MTthcmd1bWVudHMubGVuZ3RoPm47KWUucHVzaChhcmd1bWVudHNbbisrXSk7cmV0dXJuIGJbKyttXT1mdW5jdGlvbigpeygiZnVuY3Rpb24iPT10eXBlb2YgdD90OkZ1bmN0aW9uKHQpKS5hcHBseSh2b2lkIDAsZSl9LHIobSksbX0sZD1mdW5jdGlvbih0KXtkZWxldGUgYlt0XX0sInByb2Nlc3MiPT11KGcpP3I9ZnVuY3Rpb24odCl7Zy5uZXh0VGljayh3KHQpKX06eSYmeS5ub3c/cj1mdW5jdGlvbih0KXt5Lm5vdyh3KHQpKX06dj8oaT0obz1uZXcgdikucG9ydDIsby5wb3J0MS5vbm1lc3NhZ2U9ayxyPWMoaS5wb3N0TWVzc2FnZSxpLDEpKTohYS5hZGRFdmVudExpc3RlbmVyfHwiZnVuY3Rpb24iIT10eXBlb2YgcG9zdE1lc3NhZ2V8fGEuaW1wb3J0U2NyaXB0c3x8cyhTKT9yPSJvbnJlYWR5c3RhdGVjaGFuZ2UiaW4gZigic2NyaXB0Iik/ZnVuY3Rpb24odCl7bC5hcHBlbmRDaGlsZChmKCJzY3JpcHQiKSkub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7bC5yZW1vdmVDaGlsZCh0aGlzKSx4KHQpfX06ZnVuY3Rpb24odCl7c2V0VGltZW91dCh3KHQpLDApfToocj1TLGEuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsaywhMSkpKSx0LmV4cG9ydHM9e3NldDpoLGNsZWFyOmR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDcpLGk9big1Myk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYocih0KSxvKGUpJiZlLmNvbnN0cnVjdG9yPT09dClyZXR1cm4gZTt2YXIgbj1pLmYodCk7cmV0dXJuKDAsbi5yZXNvbHZlKShlKSxuLnByb21pc2V9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDIyKSxpPW4oNTMpLGE9big2MCkscz1uKDU5KTtyKHt0YXJnZXQ6IlByb21pc2UiLHN0YXQ6ITB9LHthbGxTZXR0bGVkOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1pLmYoZSkscj1uLnJlc29sdmUsdT1uLnJlamVjdCxjPWEoZnVuY3Rpb24oKXt2YXIgbj1vKGUucmVzb2x2ZSksaT1bXSxhPTAsdT0xO3ModCxmdW5jdGlvbih0KXt2YXIgbz1hKysscz0hMTtpLnB1c2godm9pZCAwKSx1Kyssbi5jYWxsKGUsdCkudGhlbihmdW5jdGlvbih0KXtzfHwocz0hMCxpW29dPXtzdGF0dXM6ImZ1bGZpbGxlZCIsdmFsdWU6dH0sLS11fHxyKGkpKX0sZnVuY3Rpb24odCl7c3x8KHM9ITAsaVtvXT17c3RhdHVzOiJyZWplY3RlZCIscmVhc29uOnR9LC0tdXx8cihpKSl9KX0pLC0tdXx8cihpKX0pO3JldHVybiBjLmVycm9yJiZ1KGMudmFsdWUpLG4ucHJvbWlzZX19KX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXsobnVsbD09ZXx8ZT50Lmxlbmd0aCkmJihlPXQubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheShlKTtuPGU7bisrKXJbbl09dFtuXTtyZXR1cm4gcn19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNzcpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNTgpLG89bigxNjIpLGk9bigxNjYpO2Z1bmN0aW9uIGEoZSxuLHMpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgUmVmbGVjdCYmbz90LmV4cG9ydHM9YT1vOnQuZXhwb3J0cz1hPWZ1bmN0aW9uKHQsZSxuKXt2YXIgbz1pKHQsZSk7aWYobyl7dmFyIGE9cihvLGUpO3JldHVybiBhLmdldD9hLmdldC5jYWxsKG4pOmEudmFsdWV9fSxhKGUsbixzfHxlKX10LmV4cG9ydHM9YX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0MCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcjsKLyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuNC4xCiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiAyMDE5LTA1LTAxVDIxOjA0WgogKi8KLyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuNC4xCiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiAyMDE5LTA1LTAxVDIxOjA0WgogKi8KIWZ1bmN0aW9uKGUsbil7InVzZSBzdHJpY3QiOyJvYmplY3QiPT10eXBlb2YgdC5leHBvcnRzP3QuZXhwb3J0cz1lLmRvY3VtZW50P24oZSwhMCk6ZnVuY3Rpb24odCl7aWYoIXQuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIG4odCl9Om4oZSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKG4sbyl7InVzZSBzdHJpY3QiO3ZhciBpPVtdLGE9bi5kb2N1bWVudCxzPU9iamVjdC5nZXRQcm90b3R5cGVPZix1PWkuc2xpY2UsYz1pLmNvbmNhdCxsPWkucHVzaCxmPWkuaW5kZXhPZixwPXt9LGg9cC50b1N0cmluZyxkPXAuaGFzT3duUHJvcGVydHksZz1kLnRvU3RyaW5nLHY9Zy5jYWxsKE9iamVjdCkseT17fSxtPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYibnVtYmVyIiE9dHlwZW9mIHQubm9kZVR5cGV9LGI9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJnQ9PT10LndpbmRvd30seD17dHlwZTohMCxzcmM6ITAsbm9uY2U6ITAsbm9Nb2R1bGU6ITB9O2Z1bmN0aW9uIHcodCxlLG4pe3ZhciByLG8saT0obj1ufHxhKS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtpZihpLnRleHQ9dCxlKWZvcihyIGluIHgpKG89ZVtyXXx8ZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKHIpKSYmaS5zZXRBdHRyaWJ1dGUocixvKTtuLmhlYWQuYXBwZW5kQ2hpbGQoaSkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChpKX1mdW5jdGlvbiBrKHQpe3JldHVybiBudWxsPT10P3QrIiI6Im9iamVjdCI9PXR5cGVvZiB0fHwiZnVuY3Rpb24iPT10eXBlb2YgdD9wW2guY2FsbCh0KV18fCJvYmplY3QiOnR5cGVvZiB0fXZhciBTPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBTLmZuLmluaXQodCxlKX0sRT0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7ZnVuY3Rpb24gaih0KXt2YXIgZT0hIXQmJiJsZW5ndGgiaW4gdCYmdC5sZW5ndGgsbj1rKHQpO3JldHVybiFtKHQpJiYhYih0KSYmKCJhcnJheSI9PT1ufHwwPT09ZXx8Im51bWJlciI9PXR5cGVvZiBlJiZlPjAmJmUtMSBpbiB0KX1TLmZuPVMucHJvdG90eXBlPXtqcXVlcnk6IjMuNC4xIixjb25zdHJ1Y3RvcjpTLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdS5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dS5jYWxsKHRoaXMpOnQ8MD90aGlzW3QrdGhpcy5sZW5ndGhdOnRoaXNbdF19LHB1c2hTdGFjazpmdW5jdGlvbih0KXt2YXIgZT1TLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSx0KTtyZXR1cm4gZS5wcmV2T2JqZWN0PXRoaXMsZX0sZWFjaDpmdW5jdGlvbih0KXtyZXR1cm4gUy5lYWNoKHRoaXMsdCl9LG1hcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy5tYXAodGhpcyxmdW5jdGlvbihlLG4pe3JldHVybiB0LmNhbGwoZSxuLGUpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayh1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGVxOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubGVuZ3RoLG49K3QrKHQ8MD9lOjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhuPj0wJiZuPGU/W3RoaXNbbl1dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcigpfSxwdXNoOmwsc29ydDppLnNvcnQsc3BsaWNlOmkuc3BsaWNlfSxTLmV4dGVuZD1TLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciB0LGUsbixyLG8saSxhPWFyZ3VtZW50c1swXXx8e30scz0xLHU9YXJndW1lbnRzLmxlbmd0aCxjPSExO2ZvcigiYm9vbGVhbiI9PXR5cGVvZiBhJiYoYz1hLGE9YXJndW1lbnRzW3NdfHx7fSxzKyspLCJvYmplY3QiPT10eXBlb2YgYXx8bShhKXx8KGE9e30pLHM9PT11JiYoYT10aGlzLHMtLSk7czx1O3MrKylpZihudWxsIT0odD1hcmd1bWVudHNbc10pKWZvcihlIGluIHQpcj10W2VdLCJfX3Byb3RvX18iIT09ZSYmYSE9PXImJihjJiZyJiYoUy5pc1BsYWluT2JqZWN0KHIpfHwobz1BcnJheS5pc0FycmF5KHIpKSk/KG49YVtlXSxpPW8mJiFBcnJheS5pc0FycmF5KG4pP1tdOm98fFMuaXNQbGFpbk9iamVjdChuKT9uOnt9LG89ITEsYVtlXT1TLmV4dGVuZChjLGkscikpOnZvaWQgMCE9PXImJihhW2VdPXIpKTtyZXR1cm4gYX0sUy5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKCIzLjQuMSIrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IodCl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24odCl7dmFyIGUsbjtyZXR1cm4hKCF0fHwiW29iamVjdCBPYmplY3RdIiE9PWguY2FsbCh0KSkmJighKGU9cyh0KSl8fCJmdW5jdGlvbiI9PXR5cGVvZihuPWQuY2FsbChlLCJjb25zdHJ1Y3RvciIpJiZlLmNvbnN0cnVjdG9yKSYmZy5jYWxsKG4pPT09dil9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24odCl7dmFyIGU7Zm9yKGUgaW4gdClyZXR1cm4hMTtyZXR1cm4hMH0sZ2xvYmFsRXZhbDpmdW5jdGlvbih0LGUpe3codCx7bm9uY2U6ZSYmZS5ub25jZX0pfSxlYWNoOmZ1bmN0aW9uKHQsZSl7dmFyIG4scj0wO2lmKGoodCkpZm9yKG49dC5sZW5ndGg7cjxuJiYhMSE9PWUuY2FsbCh0W3JdLHIsdFtyXSk7cisrKTtlbHNlIGZvcihyIGluIHQpaWYoITE9PT1lLmNhbGwodFtyXSxyLHRbcl0pKWJyZWFrO3JldHVybiB0fSx0cmltOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyIiOih0KyIiKS5yZXBsYWNlKEUsIiIpfSxtYWtlQXJyYXk6ZnVuY3Rpb24odCxlKXt2YXIgbj1lfHxbXTtyZXR1cm4gbnVsbCE9dCYmKGooT2JqZWN0KHQpKT9TLm1lcmdlKG4sInN0cmluZyI9PXR5cGVvZiB0P1t0XTp0KTpsLmNhbGwobix0KSksbn0saW5BcnJheTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIG51bGw9PWU/LTE6Zi5jYWxsKGUsdCxuKX0sbWVyZ2U6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49K2UubGVuZ3RoLHI9MCxvPXQubGVuZ3RoO3I8bjtyKyspdFtvKytdPWVbcl07cmV0dXJuIHQubGVuZ3RoPW8sdH0sZ3JlcDpmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPVtdLG89MCxpPXQubGVuZ3RoLGE9IW47bzxpO28rKykhZSh0W29dLG8pIT09YSYmci5wdXNoKHRbb10pO3JldHVybiByfSxtYXA6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saT0wLGE9W107aWYoaih0KSlmb3Iocj10Lmxlbmd0aDtpPHI7aSsrKW51bGwhPShvPWUodFtpXSxpLG4pKSYmYS5wdXNoKG8pO2Vsc2UgZm9yKGkgaW4gdCludWxsIT0obz1lKHRbaV0saSxuKSkmJmEucHVzaChvKTtyZXR1cm4gYy5hcHBseShbXSxhKX0sZ3VpZDoxLHN1cHBvcnQ6eX0pLCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJihTLmZuW1N5bWJvbC5pdGVyYXRvcl09aVtTeW1ib2wuaXRlcmF0b3JdKSxTLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sIi5zcGxpdCgiICIpLGZ1bmN0aW9uKHQsZSl7cFsiW29iamVjdCAiK2UrIl0iXT1lLnRvTG93ZXJDYXNlKCl9KTt2YXIgVD0KLyohCiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIHYyLjMuNAogKiBodHRwczovL3NpenpsZWpzLmNvbS8KICoKICogQ29weXJpZ2h0IEpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKICogaHR0cHM6Ly9qcy5mb3VuZGF0aW9uLwogKgogKiBEYXRlOiAyMDE5LTA0LTA4CiAqLwpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbyxpLGEscyx1LGMsbCxmLHAsaCxkLGcsdix5LG0sYix4PSJzaXp6bGUiKzEqbmV3IERhdGUsdz10LmRvY3VtZW50LGs9MCxTPTAsRT11dCgpLGo9dXQoKSxUPXV0KCksTz11dCgpLEE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWUmJihmPSEwKSwwfSxDPXt9Lmhhc093blByb3BlcnR5LEw9W10sUj1MLnBvcCxQPUwucHVzaCxOPUwucHVzaCxJPUwuc2xpY2UsXz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylpZih0W25dPT09ZSlyZXR1cm4gbjtyZXR1cm4tMX0sRD0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLE09IltcXHgyMFxcdFxcclxcblxcZl0iLFU9Iig/OlxcXFwufFtcXHctXXxbXlwwLVxceGEwXSkrIixCPSJcXFsiK00rIiooIitVKyIpKD86IitNKyIqKFsqXiR8IX5dPz0pIitNKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrVSsiKSl8KSIrTSsiKlxcXSIscT0iOigiK1UrIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK0IrIikqKXwuKilcXCl8KSIsRj1uZXcgUmVnRXhwKE0rIisiLCJnIiksSD1uZXcgUmVnRXhwKCJeIitNKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK00rIiskIiwiZyIpLHo9bmV3IFJlZ0V4cCgiXiIrTSsiKiwiK00rIioiKSxXPW5ldyBSZWdFeHAoIl4iK00rIiooWz4rfl18IitNKyIpIitNKyIqIiksJD1uZXcgUmVnRXhwKE0rInw+IiksWT1uZXcgUmVnRXhwKHEpLFY9bmV3IFJlZ0V4cCgiXiIrVSsiJCIpLEc9e0lEOm5ldyBSZWdFeHAoIl4jKCIrVSsiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIitVKyIpIiksVEFHOm5ldyBSZWdFeHAoIl4oIitVKyJ8WypdKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrQiksUFNFVURPOm5ldyBSZWdFeHAoIl4iK3EpLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTSsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTSsiKig/OihbKy1dfCkiK00rIiooXFxkKyl8KSkiK00rIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK0QrIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitNKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK00rIiooKD86LVxcZCk/XFxkKikiK00rIipcXCl8KSg/PVteLV18JCkiLCJpIil9LEs9L0hUTUwkL2ksWD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLEo9L15oXGQkL2ksUT0vXltee10rXHtccypcW25hdGl2ZSBcdy8sWj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLHR0PS9bK35dLyxldD1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK00rIj98KCIrTSsiKXwuKSIsImlnIiksbnQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPSIweCIrZS02NTUzNjtyZXR1cm4gciE9cnx8bj9lOnI8MD9TdHJpbmcuZnJvbUNoYXJDb2RlKHIrNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUocj4+MTB8NTUyOTYsMTAyMyZyfDU2MzIwKX0scnQ9LyhbXDAtXHgxZlx4N2ZdfF4tP1xkKXxeLSR8W15cMC1ceDFmXHg3Zi1cdUZGRkZcdy1dL2csb3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT8iXDAiPT09dD8i77+9Ijp0LnNsaWNlKDAsLTEpKyJcXCIrdC5jaGFyQ29kZUF0KHQubGVuZ3RoLTEpLnRvU3RyaW5nKDE2KSsiICI6IlxcIit0fSxpdD1mdW5jdGlvbigpe3AoKX0sYXQ9eHQoZnVuY3Rpb24odCl7cmV0dXJuITA9PT10LmRpc2FibGVkJiYiZmllbGRzZXQiPT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpfSx7ZGlyOiJwYXJlbnROb2RlIixuZXh0OiJsZWdlbmQifSk7dHJ5e04uYXBwbHkoTD1JLmNhbGwody5jaGlsZE5vZGVzKSx3LmNoaWxkTm9kZXMpLExbdy5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2godCl7Tj17YXBwbHk6TC5sZW5ndGg/ZnVuY3Rpb24odCxlKXtQLmFwcGx5KHQsSS5jYWxsKGUpKX06ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5sZW5ndGgscj0wO3RbbisrXT1lW3IrK107KTt0Lmxlbmd0aD1uLTF9fX1mdW5jdGlvbiBzdCh0LGUscixvKXt2YXIgaSxzLGMsbCxmLGQseSxtPWUmJmUub3duZXJEb2N1bWVudCxrPWU/ZS5ub2RlVHlwZTo5O2lmKHI9cnx8W10sInN0cmluZyIhPXR5cGVvZiB0fHwhdHx8MSE9PWsmJjkhPT1rJiYxMSE9PWspcmV0dXJuIHI7aWYoIW8mJigoZT9lLm93bmVyRG9jdW1lbnR8fGU6dykhPT1oJiZwKGUpLGU9ZXx8aCxnKSl7aWYoMTEhPT1rJiYoZj1aLmV4ZWModCkpKWlmKGk9ZlsxXSl7aWYoOT09PWspe2lmKCEoYz1lLmdldEVsZW1lbnRCeUlkKGkpKSlyZXR1cm4gcjtpZihjLmlkPT09aSlyZXR1cm4gci5wdXNoKGMpLHJ9ZWxzZSBpZihtJiYoYz1tLmdldEVsZW1lbnRCeUlkKGkpKSYmYihlLGMpJiZjLmlkPT09aSlyZXR1cm4gci5wdXNoKGMpLHJ9ZWxzZXtpZihmWzJdKXJldHVybiBOLmFwcGx5KHIsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KSkscjtpZigoaT1mWzNdKSYmbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIE4uYXBwbHkocixlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaSkpLHJ9aWYobi5xc2EmJiFPW3QrIiAiXSYmKCF2fHwhdi50ZXN0KHQpKSYmKDEhPT1rfHwib2JqZWN0IiE9PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpe2lmKHk9dCxtPWUsMT09PWsmJiQudGVzdCh0KSl7Zm9yKChsPWUuZ2V0QXR0cmlidXRlKCJpZCIpKT9sPWwucmVwbGFjZShydCxvdCk6ZS5zZXRBdHRyaWJ1dGUoImlkIixsPXgpLHM9KGQ9YSh0KSkubGVuZ3RoO3MtLTspZFtzXT0iIyIrbCsiICIrYnQoZFtzXSk7eT1kLmpvaW4oIiwiKSxtPXR0LnRlc3QodCkmJnl0KGUucGFyZW50Tm9kZSl8fGV9dHJ5e3JldHVybiBOLmFwcGx5KHIsbS5xdWVyeVNlbGVjdG9yQWxsKHkpKSxyfWNhdGNoKGUpe08odCwhMCl9ZmluYWxseXtsPT09eCYmZS5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gdSh0LnJlcGxhY2UoSCwiJDEiKSxlLHIsbyl9ZnVuY3Rpb24gdXQoKXt2YXIgdD1bXTtyZXR1cm4gZnVuY3Rpb24gZShuLG8pe3JldHVybiB0LnB1c2gobisiICIpPnIuY2FjaGVMZW5ndGgmJmRlbGV0ZSBlW3Quc2hpZnQoKV0sZVtuKyIgIl09b319ZnVuY3Rpb24gY3QodCl7cmV0dXJuIHRbeF09ITAsdH1mdW5jdGlvbiBsdCh0KXt2YXIgZT1oLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0Iik7dHJ5e3JldHVybiEhdChlKX1jYXRjaCh0KXtyZXR1cm4hMX1maW5hbGx5e2UucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLGU9bnVsbH19ZnVuY3Rpb24gZnQodCxlKXtmb3IodmFyIG49dC5zcGxpdCgifCIpLG89bi5sZW5ndGg7by0tOylyLmF0dHJIYW5kbGVbbltvXV09ZX1mdW5jdGlvbiBwdCh0LGUpe3ZhciBuPWUmJnQscj1uJiYxPT09dC5ub2RlVHlwZSYmMT09PWUubm9kZVR5cGUmJnQuc291cmNlSW5kZXgtZS5zb3VyY2VJbmRleDtpZihyKXJldHVybiByO2lmKG4pZm9yKDtuPW4ubmV4dFNpYmxpbmc7KWlmKG49PT1lKXJldHVybi0xO3JldHVybiB0PzE6LTF9ZnVuY3Rpb24gaHQodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJmUudHlwZT09PXR9fWZ1bmN0aW9uIGR0KHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1ufHwiYnV0dG9uIj09PW4pJiZlLnR5cGU9PT10fX1mdW5jdGlvbiBndCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuImZvcm0iaW4gZT9lLnBhcmVudE5vZGUmJiExPT09ZS5kaXNhYmxlZD8ibGFiZWwiaW4gZT8ibGFiZWwiaW4gZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS5kaXNhYmxlZD09PXQ6ZS5kaXNhYmxlZD09PXQ6ZS5pc0Rpc2FibGVkPT09dHx8ZS5pc0Rpc2FibGVkIT09IXQmJmF0KGUpPT09dDplLmRpc2FibGVkPT09dDoibGFiZWwiaW4gZSYmZS5kaXNhYmxlZD09PXR9fWZ1bmN0aW9uIHZ0KHQpe3JldHVybiBjdChmdW5jdGlvbihlKXtyZXR1cm4gZT0rZSxjdChmdW5jdGlvbihuLHIpe2Zvcih2YXIgbyxpPXQoW10sbi5sZW5ndGgsZSksYT1pLmxlbmd0aDthLS07KW5bbz1pW2FdXSYmKG5bb109IShyW29dPW5bb10pKX0pfSl9ZnVuY3Rpb24geXQodCl7cmV0dXJuIHQmJnZvaWQgMCE9PXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJnR9Zm9yKGUgaW4gbj1zdC5zdXBwb3J0PXt9LGk9c3QuaXNYTUw9ZnVuY3Rpb24odCl7dmFyIGU9dC5uYW1lc3BhY2VVUkksbj0odC5vd25lckRvY3VtZW50fHx0KS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIUsudGVzdChlfHxuJiZuLm5vZGVOYW1lfHwiSFRNTCIpfSxwPXN0LnNldERvY3VtZW50PWZ1bmN0aW9uKHQpe3ZhciBlLG8sYT10P3Qub3duZXJEb2N1bWVudHx8dDp3O3JldHVybiBhIT09aCYmOT09PWEubm9kZVR5cGUmJmEuZG9jdW1lbnRFbGVtZW50PyhkPShoPWEpLmRvY3VtZW50RWxlbWVudCxnPSFpKGgpLHchPT1oJiYobz1oLmRlZmF1bHRWaWV3KSYmby50b3AhPT1vJiYoby5hZGRFdmVudExpc3RlbmVyP28uYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixpdCwhMSk6by5hdHRhY2hFdmVudCYmby5hdHRhY2hFdmVudCgib251bmxvYWQiLGl0KSksbi5hdHRyaWJ1dGVzPWx0KGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTmFtZT0iaSIsIXQuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKX0pLG4uZ2V0RWxlbWVudHNCeVRhZ05hbWU9bHQoZnVuY3Rpb24odCl7cmV0dXJuIHQuYXBwZW5kQ2hpbGQoaC5jcmVhdGVDb21tZW50KCIiKSksIXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSxuLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9US50ZXN0KGguZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSksbi5nZXRCeUlkPWx0KGZ1bmN0aW9uKHQpe3JldHVybiBkLmFwcGVuZENoaWxkKHQpLmlkPXgsIWguZ2V0RWxlbWVudHNCeU5hbWV8fCFoLmdldEVsZW1lbnRzQnlOYW1lKHgpLmxlbmd0aH0pLG4uZ2V0QnlJZD8oci5maWx0ZXIuSUQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKGV0LG50KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlKCJpZCIpPT09ZX19LHIuZmluZC5JRD1mdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PWUuZ2V0RWxlbWVudEJ5SWQmJmcpe3ZhciBuPWUuZ2V0RWxlbWVudEJ5SWQodCk7cmV0dXJuIG4/W25dOltdfX0pOihyLmZpbHRlci5JRD1mdW5jdGlvbih0KXt2YXIgZT10LnJlcGxhY2UoZXQsbnQpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj12b2lkIDAhPT10LmdldEF0dHJpYnV0ZU5vZGUmJnQuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gbiYmbi52YWx1ZT09PWV9fSxyLmZpbmQuSUQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1lLmdldEVsZW1lbnRCeUlkJiZnKXt2YXIgbixyLG8saT1lLmdldEVsZW1lbnRCeUlkKHQpO2lmKGkpe2lmKChuPWkuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSkmJm4udmFsdWU9PT10KXJldHVybltpXTtmb3Iobz1lLmdldEVsZW1lbnRzQnlOYW1lKHQpLHI9MDtpPW9bcisrXTspaWYoKG49aS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PXQpcmV0dXJuW2ldfXJldHVybltdfX0pLHIuZmluZC5UQUc9bi5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDAhPT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCk6bi5xc2E/ZS5xdWVyeVNlbGVjdG9yQWxsKHQpOnZvaWQgMH06ZnVuY3Rpb24odCxlKXt2YXIgbixyPVtdLG89MCxpPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCk7aWYoIioiPT09dCl7Zm9yKDtuPWlbbysrXTspMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gaX0sci5maW5kLkNMQVNTPW4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1lLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmcpcmV0dXJuIGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh0KX0seT1bXSx2PVtdLChuLnFzYT1RLnRlc3QoaC5xdWVyeVNlbGVjdG9yQWxsKSkmJihsdChmdW5jdGlvbih0KXtkLmFwcGVuZENoaWxkKHQpLmlubmVySFRNTD0iPGEgaWQ9JyIreCsiJz48L2E+PHNlbGVjdCBpZD0nIit4KyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLHQucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnYucHVzaCgiWypeJF09IitNKyIqKD86Jyd8XCJcIikiKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHYucHVzaCgiXFxbIitNKyIqKD86dmFsdWV8IitEKyIpIiksdC5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIreCsiLV0iKS5sZW5ndGh8fHYucHVzaCgifj0iKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHx2LnB1c2goIjpjaGVja2VkIiksdC5xdWVyeVNlbGVjdG9yQWxsKCJhIyIreCsiKyoiKS5sZW5ndGh8fHYucHVzaCgiLiMuK1srfl0iKX0pLGx0KGZ1bmN0aW9uKHQpe3QuaW5uZXJIVE1MPSI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iO3ZhciBlPWguY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtlLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLHQuYXBwZW5kQ2hpbGQoZSkuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLHQucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnYucHVzaCgibmFtZSIrTSsiKlsqXiR8IX5dPz0iKSwyIT09dC5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCYmdi5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGQuYXBwZW5kQ2hpbGQodCkuZGlzYWJsZWQ9ITAsMiE9PXQucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoJiZ2LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksdC5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4Iiksdi5wdXNoKCIsLio6Iil9KSksKG4ubWF0Y2hlc1NlbGVjdG9yPVEudGVzdChtPWQubWF0Y2hlc3x8ZC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGQubW96TWF0Y2hlc1NlbGVjdG9yfHxkLm9NYXRjaGVzU2VsZWN0b3J8fGQubXNNYXRjaGVzU2VsZWN0b3IpKSYmbHQoZnVuY3Rpb24odCl7bi5kaXNjb25uZWN0ZWRNYXRjaD1tLmNhbGwodCwiKiIpLG0uY2FsbCh0LCJbcyE9JyddOngiKSx5LnB1c2goIiE9IixxKX0pLHY9di5sZW5ndGgmJm5ldyBSZWdFeHAodi5qb2luKCJ8IikpLHk9eS5sZW5ndGgmJm5ldyBSZWdFeHAoeS5qb2luKCJ8IikpLGU9US50ZXN0KGQuY29tcGFyZURvY3VtZW50UG9zaXRpb24pLGI9ZXx8US50ZXN0KGQuY29udGFpbnMpP2Z1bmN0aW9uKHQsZSl7dmFyIG49OT09PXQubm9kZVR5cGU/dC5kb2N1bWVudEVsZW1lbnQ6dCxyPWUmJmUucGFyZW50Tm9kZTtyZXR1cm4gdD09PXJ8fCEoIXJ8fDEhPT1yLm5vZGVUeXBlfHwhKG4uY29udGFpbnM/bi5jb250YWlucyhyKTp0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZ0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpKSl9OmZ1bmN0aW9uKHQsZSl7aWYoZSlmb3IoO2U9ZS5wYXJlbnROb2RlOylpZihlPT09dClyZXR1cm4hMDtyZXR1cm4hMX0sQT1lP2Z1bmN0aW9uKHQsZSl7aWYodD09PWUpcmV0dXJuIGY9ITAsMDt2YXIgcj0hdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gcnx8KDEmKHI9KHQub3duZXJEb2N1bWVudHx8dCk9PT0oZS5vd25lckRvY3VtZW50fHxlKT90LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGUpOjEpfHwhbi5zb3J0RGV0YWNoZWQmJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk9PT1yP3Q9PT1ofHx0Lm93bmVyRG9jdW1lbnQ9PT13JiZiKHcsdCk/LTE6ZT09PWh8fGUub3duZXJEb2N1bWVudD09PXcmJmIodyxlKT8xOmw/XyhsLHQpLV8obCxlKTowOjQmcj8tMToxKX06ZnVuY3Rpb24odCxlKXtpZih0PT09ZSlyZXR1cm4gZj0hMCwwO3ZhciBuLHI9MCxvPXQucGFyZW50Tm9kZSxpPWUucGFyZW50Tm9kZSxhPVt0XSxzPVtlXTtpZighb3x8IWkpcmV0dXJuIHQ9PT1oPy0xOmU9PT1oPzE6bz8tMTppPzE6bD9fKGwsdCktXyhsLGUpOjA7aWYobz09PWkpcmV0dXJuIHB0KHQsZSk7Zm9yKG49dDtuPW4ucGFyZW50Tm9kZTspYS51bnNoaWZ0KG4pO2ZvcihuPWU7bj1uLnBhcmVudE5vZGU7KXMudW5zaGlmdChuKTtmb3IoO2Fbcl09PT1zW3JdOylyKys7cmV0dXJuIHI/cHQoYVtyXSxzW3JdKTphW3JdPT09dz8tMTpzW3JdPT09dz8xOjB9LGgpOmh9LHN0Lm1hdGNoZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gc3QodCxudWxsLG51bGwsZSl9LHN0Lm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbih0LGUpe2lmKCh0Lm93bmVyRG9jdW1lbnR8fHQpIT09aCYmcCh0KSxuLm1hdGNoZXNTZWxlY3RvciYmZyYmIU9bZSsiICJdJiYoIXl8fCF5LnRlc3QoZSkpJiYoIXZ8fCF2LnRlc3QoZSkpKXRyeXt2YXIgcj1tLmNhbGwodCxlKTtpZihyfHxuLmRpc2Nvbm5lY3RlZE1hdGNofHx0LmRvY3VtZW50JiYxMSE9PXQuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIHJ9Y2F0Y2godCl7TyhlLCEwKX1yZXR1cm4gc3QoZSxoLG51bGwsW3RdKS5sZW5ndGg+MH0sc3QuY29udGFpbnM9ZnVuY3Rpb24odCxlKXtyZXR1cm4odC5vd25lckRvY3VtZW50fHx0KSE9PWgmJnAodCksYih0LGUpfSxzdC5hdHRyPWZ1bmN0aW9uKHQsZSl7KHQub3duZXJEb2N1bWVudHx8dCkhPT1oJiZwKHQpO3ZhciBvPXIuYXR0ckhhbmRsZVtlLnRvTG93ZXJDYXNlKCldLGk9byYmQy5jYWxsKHIuYXR0ckhhbmRsZSxlLnRvTG93ZXJDYXNlKCkpP28odCxlLCFnKTp2b2lkIDA7cmV0dXJuIHZvaWQgMCE9PWk/aTpuLmF0dHJpYnV0ZXN8fCFnP3QuZ2V0QXR0cmlidXRlKGUpOihpPXQuZ2V0QXR0cmlidXRlTm9kZShlKSkmJmkuc3BlY2lmaWVkP2kudmFsdWU6bnVsbH0sc3QuZXNjYXBlPWZ1bmN0aW9uKHQpe3JldHVybih0KyIiKS5yZXBsYWNlKHJ0LG90KX0sc3QuZXJyb3I9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK3QpfSxzdC51bmlxdWVTb3J0PWZ1bmN0aW9uKHQpe3ZhciBlLHI9W10sbz0wLGk9MDtpZihmPSFuLmRldGVjdER1cGxpY2F0ZXMsbD0hbi5zb3J0U3RhYmxlJiZ0LnNsaWNlKDApLHQuc29ydChBKSxmKXtmb3IoO2U9dFtpKytdOyllPT09dFtpXSYmKG89ci5wdXNoKGkpKTtmb3IoO28tLTspdC5zcGxpY2UocltvXSwxKX1yZXR1cm4gbD1udWxsLHR9LG89c3QuZ2V0VGV4dD1mdW5jdGlvbih0KXt2YXIgZSxuPSIiLHI9MCxpPXQubm9kZVR5cGU7aWYoaSl7aWYoMT09PWl8fDk9PT1pfHwxMT09PWkpe2lmKCJzdHJpbmciPT10eXBlb2YgdC50ZXh0Q29udGVudClyZXR1cm4gdC50ZXh0Q29udGVudDtmb3IodD10LmZpcnN0Q2hpbGQ7dDt0PXQubmV4dFNpYmxpbmcpbis9byh0KX1lbHNlIGlmKDM9PT1pfHw0PT09aSlyZXR1cm4gdC5ub2RlVmFsdWV9ZWxzZSBmb3IoO2U9dFtyKytdOyluKz1vKGUpO3JldHVybiBufSwocj1zdC5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpjdCxtYXRjaDpHLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbih0KXtyZXR1cm4gdFsxXT10WzFdLnJlcGxhY2UoZXQsbnQpLHRbM109KHRbM118fHRbNF18fHRbNV18fCIiKS5yZXBsYWNlKGV0LG50KSwifj0iPT09dFsyXSYmKHRbM109IiAiK3RbM10rIiAiKSx0LnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKHQpe3JldHVybiB0WzFdPXRbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PXRbMV0uc2xpY2UoMCwzKT8odFszXXx8c3QuZXJyb3IodFswXSksdFs0XT0rKHRbNF0/dFs1XSsodFs2XXx8MSk6MiooImV2ZW4iPT09dFszXXx8Im9kZCI9PT10WzNdKSksdFs1XT0rKHRbN10rdFs4XXx8Im9kZCI9PT10WzNdKSk6dFszXSYmc3QuZXJyb3IodFswXSksdH0sUFNFVURPOmZ1bmN0aW9uKHQpe3ZhciBlLG49IXRbNl0mJnRbMl07cmV0dXJuIEcuQ0hJTEQudGVzdCh0WzBdKT9udWxsOih0WzNdP3RbMl09dFs0XXx8dFs1XXx8IiI6biYmWS50ZXN0KG4pJiYoZT1hKG4sITApKSYmKGU9bi5pbmRleE9mKCIpIixuLmxlbmd0aC1lKS1uLmxlbmd0aCkmJih0WzBdPXRbMF0uc2xpY2UoMCxlKSx0WzJdPW4uc2xpY2UoMCxlKSksdC5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKHQpe3ZhciBlPXQucmVwbGFjZShldCxudCkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT10P2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKHQpe3JldHVybiB0Lm5vZGVOYW1lJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1lfX0sQ0xBU1M6ZnVuY3Rpb24odCl7dmFyIGU9RVt0KyIgIl07cmV0dXJuIGV8fChlPW5ldyBSZWdFeHAoIihefCIrTSsiKSIrdCsiKCIrTSsifCQpIikpJiZFKHQsZnVuY3Rpb24odCl7cmV0dXJuIGUudGVzdCgic3RyaW5nIj09dHlwZW9mIHQuY2xhc3NOYW1lJiZ0LmNsYXNzTmFtZXx8dm9pZCAwIT09dC5nZXRBdHRyaWJ1dGUmJnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciBvPXN0LmF0dHIocix0KTtyZXR1cm4gbnVsbD09bz8iIT0iPT09ZTohZXx8KG8rPSIiLCI9Ij09PWU/bz09PW46IiE9Ij09PWU/byE9PW46Il49Ij09PWU/biYmMD09PW8uaW5kZXhPZihuKToiKj0iPT09ZT9uJiZvLmluZGV4T2Yobik+LTE6IiQ9Ij09PWU/biYmby5zbGljZSgtbi5sZW5ndGgpPT09bjoifj0iPT09ZT8oIiAiK28ucmVwbGFjZShGLCIgIikrIiAiKS5pbmRleE9mKG4pPi0xOiJ8PSI9PT1lJiYobz09PW58fG8uc2xpY2UoMCxuLmxlbmd0aCsxKT09PW4rIi0iKSl9fSxDSElMRDpmdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpPSJudGgiIT09dC5zbGljZSgwLDMpLGE9Imxhc3QiIT09dC5zbGljZSgtNCkscz0ib2YtdHlwZSI9PT1lO3JldHVybiAxPT09ciYmMD09PW8/ZnVuY3Rpb24odCl7cmV0dXJuISF0LnBhcmVudE5vZGV9OmZ1bmN0aW9uKGUsbix1KXt2YXIgYyxsLGYscCxoLGQsZz1pIT09YT8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHY9ZS5wYXJlbnROb2RlLHk9cyYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLG09IXUmJiFzLGI9ITE7aWYodil7aWYoaSl7Zm9yKDtnOyl7Zm9yKHA9ZTtwPXBbZ107KWlmKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09eToxPT09cC5ub2RlVHlwZSlyZXR1cm4hMTtkPWc9Im9ubHkiPT09dCYmIWQmJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYoZD1bYT92LmZpcnN0Q2hpbGQ6di5sYXN0Q2hpbGRdLGEmJm0pe2ZvcihiPShoPShjPShsPShmPShwPXYpW3hdfHwocFt4XT17fSkpW3AudW5pcXVlSURdfHwoZltwLnVuaXF1ZUlEXT17fSkpW3RdfHxbXSlbMF09PT1rJiZjWzFdKSYmY1syXSxwPWgmJnYuY2hpbGROb2Rlc1toXTtwPSsraCYmcCYmcFtnXXx8KGI9aD0wKXx8ZC5wb3AoKTspaWYoMT09PXAubm9kZVR5cGUmJisrYiYmcD09PWUpe2xbdF09W2ssaCxiXTticmVha319ZWxzZSBpZihtJiYoYj1oPShjPShsPShmPShwPWUpW3hdfHwocFt4XT17fSkpW3AudW5pcXVlSURdfHwoZltwLnVuaXF1ZUlEXT17fSkpW3RdfHxbXSlbMF09PT1rJiZjWzFdKSwhMT09PWIpZm9yKDsocD0rK2gmJnAmJnBbZ118fChiPWg9MCl8fGQucG9wKCkpJiYoKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09eToxIT09cC5ub2RlVHlwZSl8fCErK2J8fChtJiYoKGw9KGY9cFt4XXx8KHBbeF09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVt0XT1bayxiXSkscCE9PWUpKTspO3JldHVybihiLT1vKT09PXJ8fGIlcj09MCYmYi9yPj0wfX19LFBTRVVETzpmdW5jdGlvbih0LGUpe3ZhciBuLG89ci5wc2V1ZG9zW3RdfHxyLnNldEZpbHRlcnNbdC50b0xvd2VyQ2FzZSgpXXx8c3QuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIit0KTtyZXR1cm4gb1t4XT9vKGUpOm8ubGVuZ3RoPjE/KG49W3QsdCwiIixlXSxyLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkodC50b0xvd2VyQ2FzZSgpKT9jdChmdW5jdGlvbih0LG4pe2Zvcih2YXIgcixpPW8odCxlKSxhPWkubGVuZ3RoO2EtLTspdFtyPV8odCxpW2FdKV09IShuW3JdPWlbYV0pfSk6ZnVuY3Rpb24odCl7cmV0dXJuIG8odCwwLG4pfSk6b319LHBzZXVkb3M6e25vdDpjdChmdW5jdGlvbih0KXt2YXIgZT1bXSxuPVtdLHI9cyh0LnJlcGxhY2UoSCwiJDEiKSk7cmV0dXJuIHJbeF0/Y3QoZnVuY3Rpb24odCxlLG4sbyl7Zm9yKHZhciBpLGE9cih0LG51bGwsbyxbXSkscz10Lmxlbmd0aDtzLS07KShpPWFbc10pJiYodFtzXT0hKGVbc109aSkpfSk6ZnVuY3Rpb24odCxvLGkpe3JldHVybiBlWzBdPXQscihlLG51bGwsaSxuKSxlWzBdPW51bGwsIW4ucG9wKCl9fSksaGFzOmN0KGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gc3QodCxlKS5sZW5ndGg+MH19KSxjb250YWluczpjdChmdW5jdGlvbih0KXtyZXR1cm4gdD10LnJlcGxhY2UoZXQsbnQpLGZ1bmN0aW9uKGUpe3JldHVybihlLnRleHRDb250ZW50fHxvKGUpKS5pbmRleE9mKHQpPi0xfX0pLGxhbmc6Y3QoZnVuY3Rpb24odCl7cmV0dXJuIFYudGVzdCh0fHwiIil8fHN0LmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK3QpLHQ9dC5yZXBsYWNlKGV0LG50KS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKGUpe3ZhciBuO2Rve2lmKG49Zz9lLmxhbmc6ZS5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fGUuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuKG49bi50b0xvd2VyQ2FzZSgpKT09PXR8fDA9PT1uLmluZGV4T2YodCsiLSIpfXdoaWxlKChlPWUucGFyZW50Tm9kZSkmJjE9PT1lLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oZSl7dmFyIG49dC5sb2NhdGlvbiYmdC5sb2NhdGlvbi5oYXNoO3JldHVybiBuJiZuLnNsaWNlKDEpPT09ZS5pZH0scm9vdDpmdW5jdGlvbih0KXtyZXR1cm4gdD09PWR9LGZvY3VzOmZ1bmN0aW9uKHQpe3JldHVybiB0PT09aC5hY3RpdmVFbGVtZW50JiYoIWguaGFzRm9jdXN8fGguaGFzRm9jdXMoKSkmJiEhKHQudHlwZXx8dC5ocmVmfHx+dC50YWJJbmRleCl9LGVuYWJsZWQ6Z3QoITEpLGRpc2FibGVkOmd0KCEwKSxjaGVja2VkOmZ1bmN0aW9uKHQpe3ZhciBlPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09ZSYmISF0LmNoZWNrZWR8fCJvcHRpb24iPT09ZSYmISF0LnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbih0KXtyZXR1cm4gdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCwhMD09PXQuc2VsZWN0ZWR9LGVtcHR5OmZ1bmN0aW9uKHQpe2Zvcih0PXQuZmlyc3RDaGlsZDt0O3Q9dC5uZXh0U2libGluZylpZih0Lm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbih0KXtyZXR1cm4hci5wc2V1ZG9zLmVtcHR5KHQpfSxoZWFkZXI6ZnVuY3Rpb24odCl7cmV0dXJuIEoudGVzdCh0Lm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIFgudGVzdCh0Lm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKHQpe3ZhciBlPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09ZSYmImJ1dHRvbiI9PT10LnR5cGV8fCJidXR0b24iPT09ZX0sdGV4dDpmdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4iaW5wdXQiPT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT10LnR5cGUmJihudWxsPT0oZT10LmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09ZS50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6dnQoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0OnZ0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuW2UtMV19KSxlcTp2dChmdW5jdGlvbih0LGUsbil7cmV0dXJuW248MD9uK2U6bl19KSxldmVuOnZ0KGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjxlO24rPTIpdC5wdXNoKG4pO3JldHVybiB0fSksb2RkOnZ0KGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTE7bjxlO24rPTIpdC5wdXNoKG4pO3JldHVybiB0fSksbHQ6dnQoZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1uPDA/bitlOm4+ZT9lOm47LS1yPj0wOyl0LnB1c2gocik7cmV0dXJuIHR9KSxndDp2dChmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPW48MD9uK2U6bjsrK3I8ZTspdC5wdXNoKHIpO3JldHVybiB0fSl9fSkucHNldWRvcy5udGg9ci5wc2V1ZG9zLmVxLHtyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlyLnBzZXVkb3NbZV09aHQoZSk7Zm9yKGUgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlyLnBzZXVkb3NbZV09ZHQoZSk7ZnVuY3Rpb24gbXQoKXt9ZnVuY3Rpb24gYnQodCl7Zm9yKHZhciBlPTAsbj10Lmxlbmd0aCxyPSIiO2U8bjtlKyspcis9dFtlXS52YWx1ZTtyZXR1cm4gcn1mdW5jdGlvbiB4dCh0LGUsbil7dmFyIHI9ZS5kaXIsbz1lLm5leHQsaT1vfHxyLGE9biYmInBhcmVudE5vZGUiPT09aSxzPVMrKztyZXR1cm4gZS5maXJzdD9mdW5jdGlvbihlLG4sbyl7Zm9yKDtlPWVbcl07KWlmKDE9PT1lLm5vZGVUeXBlfHxhKXJldHVybiB0KGUsbixvKTtyZXR1cm4hMX06ZnVuY3Rpb24oZSxuLHUpe3ZhciBjLGwsZixwPVtrLHNdO2lmKHUpe2Zvcig7ZT1lW3JdOylpZigoMT09PWUubm9kZVR5cGV8fGEpJiZ0KGUsbix1KSlyZXR1cm4hMH1lbHNlIGZvcig7ZT1lW3JdOylpZigxPT09ZS5ub2RlVHlwZXx8YSlpZihsPShmPWVbeF18fChlW3hdPXt9KSlbZS51bmlxdWVJRF18fChmW2UudW5pcXVlSURdPXt9KSxvJiZvPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKWU9ZVtyXXx8ZTtlbHNle2lmKChjPWxbaV0pJiZjWzBdPT09ayYmY1sxXT09PXMpcmV0dXJuIHBbMl09Y1syXTtpZihsW2ldPXAscFsyXT10KGUsbix1KSlyZXR1cm4hMH1yZXR1cm4hMX19ZnVuY3Rpb24gd3QodCl7cmV0dXJuIHQubGVuZ3RoPjE/ZnVuY3Rpb24oZSxuLHIpe2Zvcih2YXIgbz10Lmxlbmd0aDtvLS07KWlmKCF0W29dKGUsbixyKSlyZXR1cm4hMTtyZXR1cm4hMH06dFswXX1mdW5jdGlvbiBrdCh0LGUsbixyLG8pe2Zvcih2YXIgaSxhPVtdLHM9MCx1PXQubGVuZ3RoLGM9bnVsbCE9ZTtzPHU7cysrKShpPXRbc10pJiYobiYmIW4oaSxyLG8pfHwoYS5wdXNoKGkpLGMmJmUucHVzaChzKSkpO3JldHVybiBhfWZ1bmN0aW9uIFN0KHQsZSxuLHIsbyxpKXtyZXR1cm4gciYmIXJbeF0mJihyPVN0KHIpKSxvJiYhb1t4XSYmKG89U3QobyxpKSksY3QoZnVuY3Rpb24oaSxhLHMsdSl7dmFyIGMsbCxmLHA9W10saD1bXSxkPWEubGVuZ3RoLGc9aXx8ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0wLG89ZS5sZW5ndGg7cjxvO3IrKylzdCh0LGVbcl0sbik7cmV0dXJuIG59KGV8fCIqIixzLm5vZGVUeXBlP1tzXTpzLFtdKSx2PSF0fHwhaSYmZT9nOmt0KGcscCx0LHMsdSkseT1uP298fChpP3Q6ZHx8cik/W106YTp2O2lmKG4mJm4odix5LHMsdSkscilmb3IoYz1rdCh5LGgpLHIoYyxbXSxzLHUpLGw9Yy5sZW5ndGg7bC0tOykoZj1jW2xdKSYmKHlbaFtsXV09ISh2W2hbbF1dPWYpKTtpZihpKXtpZihvfHx0KXtpZihvKXtmb3IoYz1bXSxsPXkubGVuZ3RoO2wtLTspKGY9eVtsXSkmJmMucHVzaCh2W2xdPWYpO28obnVsbCx5PVtdLGMsdSl9Zm9yKGw9eS5sZW5ndGg7bC0tOykoZj15W2xdKSYmKGM9bz9fKGksZik6cFtsXSk+LTEmJihpW2NdPSEoYVtjXT1mKSl9fWVsc2UgeT1rdCh5PT09YT95LnNwbGljZShkLHkubGVuZ3RoKTp5KSxvP28obnVsbCxhLHksdSk6Ti5hcHBseShhLHkpfSl9ZnVuY3Rpb24gRXQodCl7Zm9yKHZhciBlLG4sbyxpPXQubGVuZ3RoLGE9ci5yZWxhdGl2ZVt0WzBdLnR5cGVdLHM9YXx8ci5yZWxhdGl2ZVsiICJdLHU9YT8xOjAsbD14dChmdW5jdGlvbih0KXtyZXR1cm4gdD09PWV9LHMsITApLGY9eHQoZnVuY3Rpb24odCl7cmV0dXJuIF8oZSx0KT4tMX0scywhMCkscD1bZnVuY3Rpb24odCxuLHIpe3ZhciBvPSFhJiYocnx8biE9PWMpfHwoKGU9bikubm9kZVR5cGU/bCh0LG4scik6Zih0LG4scikpO3JldHVybiBlPW51bGwsb31dO3U8aTt1KyspaWYobj1yLnJlbGF0aXZlW3RbdV0udHlwZV0pcD1beHQod3QocCksbildO2Vsc2V7aWYoKG49ci5maWx0ZXJbdFt1XS50eXBlXS5hcHBseShudWxsLHRbdV0ubWF0Y2hlcykpW3hdKXtmb3Iobz0rK3U7bzxpJiYhci5yZWxhdGl2ZVt0W29dLnR5cGVdO28rKyk7cmV0dXJuIFN0KHU+MSYmd3QocCksdT4xJiZidCh0LnNsaWNlKDAsdS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PXRbdS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKEgsIiQxIiksbix1PG8mJkV0KHQuc2xpY2UodSxvKSksbzxpJiZFdCh0PXQuc2xpY2UobykpLG88aSYmYnQodCkpfXAucHVzaChuKX1yZXR1cm4gd3QocCl9cmV0dXJuIG10LnByb3RvdHlwZT1yLmZpbHRlcnM9ci5wc2V1ZG9zLHIuc2V0RmlsdGVycz1uZXcgbXQsYT1zdC50b2tlbml6ZT1mdW5jdGlvbih0LGUpe3ZhciBuLG8saSxhLHMsdSxjLGw9alt0KyIgIl07aWYobClyZXR1cm4gZT8wOmwuc2xpY2UoMCk7Zm9yKHM9dCx1PVtdLGM9ci5wcmVGaWx0ZXI7czspe2ZvcihhIGluIG4mJiEobz16LmV4ZWMocykpfHwobyYmKHM9cy5zbGljZShvWzBdLmxlbmd0aCl8fHMpLHUucHVzaChpPVtdKSksbj0hMSwobz1XLmV4ZWMocykpJiYobj1vLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6b1swXS5yZXBsYWNlKEgsIiAiKX0pLHM9cy5zbGljZShuLmxlbmd0aCkpLHIuZmlsdGVyKSEobz1HW2FdLmV4ZWMocykpfHxjW2FdJiYhKG89Y1thXShvKSl8fChuPW8uc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTphLG1hdGNoZXM6b30pLHM9cy5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiBlP3MubGVuZ3RoOnM/c3QuZXJyb3IodCk6aih0LHUpLnNsaWNlKDApfSxzPXN0LmNvbXBpbGU9ZnVuY3Rpb24odCxlKXt2YXIgbixvPVtdLGk9W10scz1UW3QrIiAiXTtpZighcyl7Zm9yKGV8fChlPWEodCkpLG49ZS5sZW5ndGg7bi0tOykocz1FdChlW25dKSlbeF0/by5wdXNoKHMpOmkucHVzaChzKTsocz1UKHQsZnVuY3Rpb24odCxlKXt2YXIgbj1lLmxlbmd0aD4wLG89dC5sZW5ndGg+MCxpPWZ1bmN0aW9uKGksYSxzLHUsbCl7dmFyIGYsZCx2LHk9MCxtPSIwIixiPWkmJltdLHg9W10sdz1jLFM9aXx8byYmci5maW5kLlRBRygiKiIsbCksRT1rKz1udWxsPT13PzE6TWF0aC5yYW5kb20oKXx8LjEsaj1TLmxlbmd0aDtmb3IobCYmKGM9YT09PWh8fGF8fGwpO20hPT1qJiZudWxsIT0oZj1TW21dKTttKyspe2lmKG8mJmYpe2ZvcihkPTAsYXx8Zi5vd25lckRvY3VtZW50PT09aHx8KHAoZikscz0hZyk7dj10W2QrK107KWlmKHYoZixhfHxoLHMpKXt1LnB1c2goZik7YnJlYWt9bCYmKGs9RSl9biYmKChmPSF2JiZmKSYmeS0tLGkmJmIucHVzaChmKSl9aWYoeSs9bSxuJiZtIT09eSl7Zm9yKGQ9MDt2PWVbZCsrXTspdihiLHgsYSxzKTtpZihpKXtpZih5PjApZm9yKDttLS07KWJbbV18fHhbbV18fCh4W21dPVIuY2FsbCh1KSk7eD1rdCh4KX1OLmFwcGx5KHUseCksbCYmIWkmJngubGVuZ3RoPjAmJnkrZS5sZW5ndGg+MSYmc3QudW5pcXVlU29ydCh1KX1yZXR1cm4gbCYmKGs9RSxjPXcpLGJ9O3JldHVybiBuP2N0KGkpOml9KGksbykpKS5zZWxlY3Rvcj10fXJldHVybiBzfSx1PXN0LnNlbGVjdD1mdW5jdGlvbih0LGUsbixvKXt2YXIgaSx1LGMsbCxmLHA9ImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQsaD0hbyYmYSh0PXAuc2VsZWN0b3J8fHQpO2lmKG49bnx8W10sMT09PWgubGVuZ3RoKXtpZigodT1oWzBdPWhbMF0uc2xpY2UoMCkpLmxlbmd0aD4yJiYiSUQiPT09KGM9dVswXSkudHlwZSYmOT09PWUubm9kZVR5cGUmJmcmJnIucmVsYXRpdmVbdVsxXS50eXBlXSl7aWYoIShlPShyLmZpbmQuSUQoYy5tYXRjaGVzWzBdLnJlcGxhY2UoZXQsbnQpLGUpfHxbXSlbMF0pKXJldHVybiBuO3AmJihlPWUucGFyZW50Tm9kZSksdD10LnNsaWNlKHUuc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWZvcihpPUcubmVlZHNDb250ZXh0LnRlc3QodCk/MDp1Lmxlbmd0aDtpLS0mJihjPXVbaV0sIXIucmVsYXRpdmVbbD1jLnR5cGVdKTspaWYoKGY9ci5maW5kW2xdKSYmKG89ZihjLm1hdGNoZXNbMF0ucmVwbGFjZShldCxudCksdHQudGVzdCh1WzBdLnR5cGUpJiZ5dChlLnBhcmVudE5vZGUpfHxlKSkpe2lmKHUuc3BsaWNlKGksMSksISh0PW8ubGVuZ3RoJiZidCh1KSkpcmV0dXJuIE4uYXBwbHkobixvKSxuO2JyZWFrfX1yZXR1cm4ocHx8cyh0LGgpKShvLGUsIWcsbiwhZXx8dHQudGVzdCh0KSYmeXQoZS5wYXJlbnROb2RlKXx8ZSksbn0sbi5zb3J0U3RhYmxlPXguc3BsaXQoIiIpLnNvcnQoQSkuam9pbigiIik9PT14LG4uZGV0ZWN0RHVwbGljYXRlcz0hIWYscCgpLG4uc29ydERldGFjaGVkPWx0KGZ1bmN0aW9uKHQpe3JldHVybiAxJnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaC5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpKX0pLGx0KGZ1bmN0aW9uKHQpe3JldHVybiB0LmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09dC5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGZ0KCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbih0LGUsbil7aWYoIW4pcmV0dXJuIHQuZ2V0QXR0cmlidXRlKGUsInR5cGUiPT09ZS50b0xvd2VyQ2FzZSgpPzE6Mil9KSxuLmF0dHJpYnV0ZXMmJmx0KGZ1bmN0aW9uKHQpe3JldHVybiB0LmlubmVySFRNTD0iPGlucHV0Lz4iLHQuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT10LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGZ0KCJ2YWx1ZSIsZnVuY3Rpb24odCxlLG4pe2lmKCFuJiYiaW5wdXQiPT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiB0LmRlZmF1bHRWYWx1ZX0pLGx0KGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10LmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxmdChELGZ1bmN0aW9uKHQsZSxuKXt2YXIgcjtpZighbilyZXR1cm4hMD09PXRbZV0/ZS50b0xvd2VyQ2FzZSgpOihyPXQuZ2V0QXR0cmlidXRlTm9kZShlKSkmJnIuc3BlY2lmaWVkP3IudmFsdWU6bnVsbH0pLHN0fShuKTtTLmZpbmQ9VCxTLmV4cHI9VC5zZWxlY3RvcnMsUy5leHByWyI6Il09Uy5leHByLnBzZXVkb3MsUy51bmlxdWVTb3J0PVMudW5pcXVlPVQudW5pcXVlU29ydCxTLnRleHQ9VC5nZXRUZXh0LFMuaXNYTUxEb2M9VC5pc1hNTCxTLmNvbnRhaW5zPVQuY29udGFpbnMsUy5lc2NhcGVTZWxlY3Rvcj1ULmVzY2FwZTt2YXIgTz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPVtdLG89dm9pZCAwIT09bjsodD10W2VdKSYmOSE9PXQubm9kZVR5cGU7KWlmKDE9PT10Lm5vZGVUeXBlKXtpZihvJiZTKHQpLmlzKG4pKWJyZWFrO3IucHVzaCh0KX1yZXR1cm4gcn0sQT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1bXTt0O3Q9dC5uZXh0U2libGluZykxPT09dC5ub2RlVHlwZSYmdCE9PWUmJm4ucHVzaCh0KTtyZXR1cm4gbn0sQz1TLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O2Z1bmN0aW9uIEwodCxlKXtyZXR1cm4gdC5ub2RlTmFtZSYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ZS50b0xvd2VyQ2FzZSgpfXZhciBSPS9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pO2Z1bmN0aW9uIFAodCxlLG4pe3JldHVybiBtKGUpP1MuZ3JlcCh0LGZ1bmN0aW9uKHQscil7cmV0dXJuISFlLmNhbGwodCxyLHQpIT09bn0pOmUubm9kZVR5cGU/Uy5ncmVwKHQsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1lIT09bn0pOiJzdHJpbmciIT10eXBlb2YgZT9TLmdyZXAodCxmdW5jdGlvbih0KXtyZXR1cm4gZi5jYWxsKGUsdCk+LTEhPT1ufSk6Uy5maWx0ZXIoZSx0LG4pfVMuZmlsdGVyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lWzBdO3JldHVybiBuJiYodD0iOm5vdCgiK3QrIikiKSwxPT09ZS5sZW5ndGgmJjE9PT1yLm5vZGVUeXBlP1MuZmluZC5tYXRjaGVzU2VsZWN0b3Iocix0KT9bcl06W106Uy5maW5kLm1hdGNoZXModCxTLmdyZXAoZSxmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQubm9kZVR5cGV9KSl9LFMuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKHQpe3ZhciBlLG4scj10aGlzLmxlbmd0aCxvPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiB0aGlzLnB1c2hTdGFjayhTKHQpLmZpbHRlcihmdW5jdGlvbigpe2ZvcihlPTA7ZTxyO2UrKylpZihTLmNvbnRhaW5zKG9bZV0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKG49dGhpcy5wdXNoU3RhY2soW10pLGU9MDtlPHI7ZSsrKVMuZmluZCh0LG9bZV0sbik7cmV0dXJuIHI+MT9TLnVuaXF1ZVNvcnQobik6bn0sZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhQKHRoaXMsdHx8W10sITEpKX0sbm90OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhQKHRoaXMsdHx8W10sITApKX0saXM6ZnVuY3Rpb24odCl7cmV0dXJuISFQKHRoaXMsInN0cmluZyI9PXR5cGVvZiB0JiZDLnRlc3QodCk/Uyh0KTp0fHxbXSwhMSkubGVuZ3RofX0pO3ZhciBOLEk9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLzsoUy5mbi5pbml0PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvO2lmKCF0KXJldHVybiB0aGlzO2lmKG49bnx8Tiwic3RyaW5nIj09dHlwZW9mIHQpe2lmKCEocj0iPCI9PT10WzBdJiYiPiI9PT10W3QubGVuZ3RoLTFdJiZ0Lmxlbmd0aD49Mz9bbnVsbCx0LG51bGxdOkkuZXhlYyh0KSl8fCFyWzFdJiZlKXJldHVybiFlfHxlLmpxdWVyeT8oZXx8bikuZmluZCh0KTp0aGlzLmNvbnN0cnVjdG9yKGUpLmZpbmQodCk7aWYoclsxXSl7aWYoZT1lIGluc3RhbmNlb2YgUz9lWzBdOmUsUy5tZXJnZSh0aGlzLFMucGFyc2VIVE1MKHJbMV0sZSYmZS5ub2RlVHlwZT9lLm93bmVyRG9jdW1lbnR8fGU6YSwhMCkpLFIudGVzdChyWzFdKSYmUy5pc1BsYWluT2JqZWN0KGUpKWZvcihyIGluIGUpbSh0aGlzW3JdKT90aGlzW3JdKGVbcl0pOnRoaXMuYXR0cihyLGVbcl0pO3JldHVybiB0aGlzfXJldHVybihvPWEuZ2V0RWxlbWVudEJ5SWQoclsyXSkpJiYodGhpc1swXT1vLHRoaXMubGVuZ3RoPTEpLHRoaXN9cmV0dXJuIHQubm9kZVR5cGU/KHRoaXNbMF09dCx0aGlzLmxlbmd0aD0xLHRoaXMpOm0odCk/dm9pZCAwIT09bi5yZWFkeT9uLnJlYWR5KHQpOnQoUyk6Uy5tYWtlQXJyYXkodCx0aGlzKX0pLnByb3RvdHlwZT1TLmZuLE49UyhhKTt2YXIgXz0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxEPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2Z1bmN0aW9uIE0odCxlKXtmb3IoOyh0PXRbZV0pJiYxIT09dC5ub2RlVHlwZTspO3JldHVybiB0fVMuZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24odCl7dmFyIGU9Uyh0LHRoaXMpLG49ZS5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDxuO3QrKylpZihTLmNvbnRhaW5zKHRoaXMsZVt0XSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbih0LGUpe3ZhciBuLHI9MCxvPXRoaXMubGVuZ3RoLGk9W10sYT0ic3RyaW5nIiE9dHlwZW9mIHQmJlModCk7aWYoIUMudGVzdCh0KSlmb3IoO3I8bztyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09ZTtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYoYT9hLmluZGV4KG4pPi0xOjE9PT1uLm5vZGVUeXBlJiZTLmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sdCkpKXtpLnB1c2gobik7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKGkubGVuZ3RoPjE/Uy51bmlxdWVTb3J0KGkpOmkpfSxpbmRleDpmdW5jdGlvbih0KXtyZXR1cm4gdD8ic3RyaW5nIj09dHlwZW9mIHQ/Zi5jYWxsKFModCksdGhpc1swXSk6Zi5jYWxsKHRoaXMsdC5qcXVlcnk/dFswXTp0KTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhTLnVuaXF1ZVNvcnQoUy5tZXJnZSh0aGlzLmdldCgpLFModCxlKSkpKX0sYWRkQmFjazpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hZGQobnVsbD09dD90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcih0KSl9fSksUy5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5wYXJlbnROb2RlO3JldHVybiBlJiYxMSE9PWUubm9kZVR5cGU/ZTpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKHQpe3JldHVybiBPKHQsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTyh0LCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbih0KXtyZXR1cm4gTSh0LCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKHQpe3JldHVybiBNKHQsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKHQpe3JldHVybiBPKHQsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24odCl7cmV0dXJuIE8odCwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIE8odCwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBPKHQsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKHQpe3JldHVybiBBKCh0LnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLHQpfSxjaGlsZHJlbjpmdW5jdGlvbih0KXtyZXR1cm4gQSh0LmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dC5jb250ZW50RG9jdW1lbnQ/dC5jb250ZW50RG9jdW1lbnQ6KEwodCwidGVtcGxhdGUiKSYmKHQ9dC5jb250ZW50fHx0KSxTLm1lcmdlKFtdLHQuY2hpbGROb2RlcykpfX0sZnVuY3Rpb24odCxlKXtTLmZuW3RdPWZ1bmN0aW9uKG4scil7dmFyIG89Uy5tYXAodGhpcyxlLG4pO3JldHVybiJVbnRpbCIhPT10LnNsaWNlKC01KSYmKHI9biksciYmInN0cmluZyI9PXR5cGVvZiByJiYobz1TLmZpbHRlcihyLG8pKSx0aGlzLmxlbmd0aD4xJiYoRFt0XXx8Uy51bmlxdWVTb3J0KG8pLF8udGVzdCh0KSYmby5yZXZlcnNlKCkpLHRoaXMucHVzaFN0YWNrKG8pfX0pO3ZhciBVPS9bXlx4MjBcdFxyXG5cZl0rL2c7ZnVuY3Rpb24gQih0KXtyZXR1cm4gdH1mdW5jdGlvbiBxKHQpe3Rocm93IHR9ZnVuY3Rpb24gRih0LGUsbixyKXt2YXIgbzt0cnl7dCYmbShvPXQucHJvbWlzZSk/by5jYWxsKHQpLmRvbmUoZSkuZmFpbChuKTp0JiZtKG89dC50aGVuKT9vLmNhbGwodCxlLG4pOmUuYXBwbHkodm9pZCAwLFt0XS5zbGljZShyKSl9Y2F0Y2godCl7bi5hcHBseSh2b2lkIDAsW3RdKX19Uy5DYWxsYmFja3M9ZnVuY3Rpb24odCl7dD0ic3RyaW5nIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7dmFyIGU9e307cmV0dXJuIFMuZWFjaCh0Lm1hdGNoKFUpfHxbXSxmdW5jdGlvbih0LG4pe2Vbbl09ITB9KSxlfSh0KTpTLmV4dGVuZCh7fSx0KTt2YXIgZSxuLHIsbyxpPVtdLGE9W10scz0tMSx1PWZ1bmN0aW9uKCl7Zm9yKG89b3x8dC5vbmNlLHI9ZT0hMDthLmxlbmd0aDtzPS0xKWZvcihuPWEuc2hpZnQoKTsrK3M8aS5sZW5ndGg7KSExPT09aVtzXS5hcHBseShuWzBdLG5bMV0pJiZ0LnN0b3BPbkZhbHNlJiYocz1pLmxlbmd0aCxuPSExKTt0Lm1lbW9yeXx8KG49ITEpLGU9ITEsbyYmKGk9bj9bXToiIil9LGM9e2FkZDpmdW5jdGlvbigpe3JldHVybiBpJiYobiYmIWUmJihzPWkubGVuZ3RoLTEsYS5wdXNoKG4pKSxmdW5jdGlvbiBlKG4pe1MuZWFjaChuLGZ1bmN0aW9uKG4scil7bShyKT90LnVuaXF1ZSYmYy5oYXMocil8fGkucHVzaChyKTpyJiZyLmxlbmd0aCYmInN0cmluZyIhPT1rKHIpJiZlKHIpfSl9KGFyZ3VtZW50cyksbiYmIWUmJnUoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIFMuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24odCxlKXtmb3IodmFyIG47KG49Uy5pbkFycmF5KGUsaSxuKSk+LTE7KWkuc3BsaWNlKG4sMSksbjw9cyYmcy0tfSksdGhpc30saGFzOmZ1bmN0aW9uKHQpe3JldHVybiB0P1MuaW5BcnJheSh0LGkpPi0xOmkubGVuZ3RoPjB9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIGkmJihpPVtdKSx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG89YT1bXSxpPW49IiIsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haX0sbG9jazpmdW5jdGlvbigpe3JldHVybiBvPWE9W10sbnx8ZXx8KGk9bj0iIiksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuISFvfSxmaXJlV2l0aDpmdW5jdGlvbih0LG4pe3JldHVybiBvfHwobj1bdCwobj1ufHxbXSkuc2xpY2U/bi5zbGljZSgpOm5dLGEucHVzaChuKSxlfHx1KCkpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gYy5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXJ9fTtyZXR1cm4gY30sUy5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKHQpe3ZhciBlPVtbIm5vdGlmeSIsInByb2dyZXNzIixTLkNhbGxiYWNrcygibWVtb3J5IiksUy5DYWxsYmFja3MoIm1lbW9yeSIpLDJdLFsicmVzb2x2ZSIsImRvbmUiLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDAsInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwxLCJyZWplY3RlZCJdXSxyPSJwZW5kaW5nIixvPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiByfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gaS5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LGNhdGNoOmZ1bmN0aW9uKHQpe3JldHVybiBvLnRoZW4obnVsbCx0KX0scGlwZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cztyZXR1cm4gUy5EZWZlcnJlZChmdW5jdGlvbihuKXtTLmVhY2goZSxmdW5jdGlvbihlLHIpe3ZhciBvPW0odFtyWzRdXSkmJnRbcls0XV07aVtyWzFdXShmdW5jdGlvbigpe3ZhciB0PW8mJm8uYXBwbHkodGhpcyxhcmd1bWVudHMpO3QmJm0odC5wcm9taXNlKT90LnByb21pc2UoKS5wcm9ncmVzcyhuLm5vdGlmeSkuZG9uZShuLnJlc29sdmUpLmZhaWwobi5yZWplY3QpOm5bclswXSsiV2l0aCJdKHRoaXMsbz9bdF06YXJndW1lbnRzKX0pfSksdD1udWxsfSkucHJvbWlzZSgpfSx0aGVuOmZ1bmN0aW9uKHQscixvKXt2YXIgaT0wO2Z1bmN0aW9uIGEodCxlLHIsbyl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHM9dGhpcyx1PWFyZ3VtZW50cyxjPWZ1bmN0aW9uKCl7dmFyIG4sYztpZighKHQ8aSkpe2lmKChuPXIuYXBwbHkocyx1KSk9PT1lLnByb21pc2UoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iKTtjPW4mJigib2JqZWN0Ij09dHlwZW9mIG58fCJmdW5jdGlvbiI9PXR5cGVvZiBuKSYmbi50aGVuLG0oYyk/bz9jLmNhbGwobixhKGksZSxCLG8pLGEoaSxlLHEsbykpOihpKyssYy5jYWxsKG4sYShpLGUsQixvKSxhKGksZSxxLG8pLGEoaSxlLEIsZS5ub3RpZnlXaXRoKSkpOihyIT09QiYmKHM9dm9pZCAwLHU9W25dKSwob3x8ZS5yZXNvbHZlV2l0aCkocyx1KSl9fSxsPW8/YzpmdW5jdGlvbigpe3RyeXtjKCl9Y2F0Y2gobil7Uy5EZWZlcnJlZC5leGNlcHRpb25Ib29rJiZTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2sobixsLnN0YWNrVHJhY2UpLHQrMT49aSYmKHIhPT1xJiYocz12b2lkIDAsdT1bbl0pLGUucmVqZWN0V2l0aChzLHUpKX19O3Q/bCgpOihTLkRlZmVycmVkLmdldFN0YWNrSG9vayYmKGwuc3RhY2tUcmFjZT1TLkRlZmVycmVkLmdldFN0YWNrSG9vaygpKSxuLnNldFRpbWVvdXQobCkpfX1yZXR1cm4gUy5EZWZlcnJlZChmdW5jdGlvbihuKXtlWzBdWzNdLmFkZChhKDAsbixtKG8pP286QixuLm5vdGlmeVdpdGgpKSxlWzFdWzNdLmFkZChhKDAsbixtKHQpP3Q6QikpLGVbMl1bM10uYWRkKGEoMCxuLG0ocik/cjpxKSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQ/Uy5leHRlbmQodCxvKTpvfX0saT17fTtyZXR1cm4gUy5lYWNoKGUsZnVuY3Rpb24odCxuKXt2YXIgYT1uWzJdLHM9bls1XTtvW25bMV1dPWEuYWRkLHMmJmEuYWRkKGZ1bmN0aW9uKCl7cj1zfSxlWzMtdF1bMl0uZGlzYWJsZSxlWzMtdF1bM10uZGlzYWJsZSxlWzBdWzJdLmxvY2ssZVswXVszXS5sb2NrKSxhLmFkZChuWzNdLmZpcmUpLGlbblswXV09ZnVuY3Rpb24oKXtyZXR1cm4gaVtuWzBdKyJXaXRoIl0odGhpcz09PWk/dm9pZCAwOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxpW25bMF0rIldpdGgiXT1hLmZpcmVXaXRofSksby5wcm9taXNlKGkpLHQmJnQuY2FsbChpLGkpLGl9LHdoZW46ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aCxuPWUscj1BcnJheShuKSxvPXUuY2FsbChhcmd1bWVudHMpLGk9Uy5EZWZlcnJlZCgpLGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JbdF09dGhpcyxvW3RdPWFyZ3VtZW50cy5sZW5ndGg+MT91LmNhbGwoYXJndW1lbnRzKTpuLC0tZXx8aS5yZXNvbHZlV2l0aChyLG8pfX07aWYoZTw9MSYmKEYodCxpLmRvbmUoYShuKSkucmVzb2x2ZSxpLnJlamVjdCwhZSksInBlbmRpbmciPT09aS5zdGF0ZSgpfHxtKG9bbl0mJm9bbl0udGhlbikpKXJldHVybiBpLnRoZW4oKTtmb3IoO24tLTspRihvW25dLGEobiksaS5yZWplY3QpO3JldHVybiBpLnByb21pc2UoKX19KTt2YXIgSD0vXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLztTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2s9ZnVuY3Rpb24odCxlKXtuLmNvbnNvbGUmJm4uY29uc29sZS53YXJuJiZ0JiZILnRlc3QodC5uYW1lKSYmbi5jb25zb2xlLndhcm4oImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIrdC5tZXNzYWdlLHQuc3RhY2ssZSl9LFMucmVhZHlFeGNlcHRpb249ZnVuY3Rpb24odCl7bi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgdH0pfTt2YXIgej1TLkRlZmVycmVkKCk7ZnVuY3Rpb24gVygpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsVyksbi5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixXKSxTLnJlYWR5KCl9Uy5mbi5yZWFkeT1mdW5jdGlvbih0KXtyZXR1cm4gei50aGVuKHQpLmNhdGNoKGZ1bmN0aW9uKHQpe1MucmVhZHlFeGNlcHRpb24odCl9KSx0aGlzfSxTLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxyZWFkeTpmdW5jdGlvbih0KXsoITA9PT10Py0tUy5yZWFkeVdhaXQ6Uy5pc1JlYWR5KXx8KFMuaXNSZWFkeT0hMCwhMCE9PXQmJi0tUy5yZWFkeVdhaXQ+MHx8ei5yZXNvbHZlV2l0aChhLFtTXSkpfX0pLFMucmVhZHkudGhlbj16LnRoZW4sImNvbXBsZXRlIj09PWEucmVhZHlTdGF0ZXx8ImxvYWRpbmciIT09YS5yZWFkeVN0YXRlJiYhYS5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGw/bi5zZXRUaW1lb3V0KFMucmVhZHkpOihhLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLFcpLG4uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsVykpO3ZhciAkPWZ1bmN0aW9uKHQsZSxuLHIsbyxpLGEpe3ZhciBzPTAsdT10Lmxlbmd0aCxjPW51bGw9PW47aWYoIm9iamVjdCI9PT1rKG4pKWZvcihzIGluIG89ITAsbikkKHQsZSxzLG5bc10sITAsaSxhKTtlbHNlIGlmKHZvaWQgMCE9PXImJihvPSEwLG0ocil8fChhPSEwKSxjJiYoYT8oZS5jYWxsKHQsciksZT1udWxsKTooYz1lLGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBjLmNhbGwoUyh0KSxuKX0pKSxlKSlmb3IoO3M8dTtzKyspZSh0W3NdLG4sYT9yOnIuY2FsbCh0W3NdLHMsZSh0W3NdLG4pKSk7cmV0dXJuIG8/dDpjP2UuY2FsbCh0KTp1P2UodFswXSxuKTppfSxZPS9eLW1zLS8sVj0vLShbYS16XSkvZztmdW5jdGlvbiBHKHQsZSl7cmV0dXJuIGUudG9VcHBlckNhc2UoKX1mdW5jdGlvbiBLKHQpe3JldHVybiB0LnJlcGxhY2UoWSwibXMtIikucmVwbGFjZShWLEcpfXZhciBYPWZ1bmN0aW9uKHQpe3JldHVybiAxPT09dC5ub2RlVHlwZXx8OT09PXQubm9kZVR5cGV8fCErdC5ub2RlVHlwZX07ZnVuY3Rpb24gSigpe3RoaXMuZXhwYW5kbz1TLmV4cGFuZG8rSi51aWQrK31KLnVpZD0xLEoucHJvdG90eXBlPXtjYWNoZTpmdW5jdGlvbih0KXt2YXIgZT10W3RoaXMuZXhwYW5kb107cmV0dXJuIGV8fChlPXt9LFgodCkmJih0Lm5vZGVUeXBlP3RbdGhpcy5leHBhbmRvXT1lOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHRoaXMuZXhwYW5kbyx7dmFsdWU6ZSxjb25maWd1cmFibGU6ITB9KSkpLGV9LHNldDpmdW5jdGlvbih0LGUsbil7dmFyIHIsbz10aGlzLmNhY2hlKHQpO2lmKCJzdHJpbmciPT10eXBlb2YgZSlvW0soZSldPW47ZWxzZSBmb3IociBpbiBlKW9bSyhyKV09ZVtyXTtyZXR1cm4gb30sZ2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PWU/dGhpcy5jYWNoZSh0KTp0W3RoaXMuZXhwYW5kb10mJnRbdGhpcy5leHBhbmRvXVtLKGUpXX0sYWNjZXNzOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09ZXx8ZSYmInN0cmluZyI9PXR5cGVvZiBlJiZ2b2lkIDA9PT1uP3RoaXMuZ2V0KHQsZSk6KHRoaXMuc2V0KHQsZSxuKSx2b2lkIDAhPT1uP246ZSl9LHJlbW92ZTpmdW5jdGlvbih0LGUpe3ZhciBuLHI9dFt0aGlzLmV4cGFuZG9dO2lmKHZvaWQgMCE9PXIpe2lmKHZvaWQgMCE9PWUpe249KGU9QXJyYXkuaXNBcnJheShlKT9lLm1hcChLKTooZT1LKGUpKWluIHI/W2VdOmUubWF0Y2goVSl8fFtdKS5sZW5ndGg7Zm9yKDtuLS07KWRlbGV0ZSByW2Vbbl1dfSh2b2lkIDA9PT1lfHxTLmlzRW1wdHlPYmplY3QocikpJiYodC5ub2RlVHlwZT90W3RoaXMuZXhwYW5kb109dm9pZCAwOmRlbGV0ZSB0W3RoaXMuZXhwYW5kb10pfX0saGFzRGF0YTpmdW5jdGlvbih0KXt2YXIgZT10W3RoaXMuZXhwYW5kb107cmV0dXJuIHZvaWQgMCE9PWUmJiFTLmlzRW1wdHlPYmplY3QoZSl9fTt2YXIgUT1uZXcgSixaPW5ldyBKLHR0PS9eKD86XHtbXHdcV10qXH18XFtbXHdcV10qXF0pJC8sZXQ9L1tBLVpdL2c7ZnVuY3Rpb24gbnQodCxlLG4pe3ZhciByO2lmKHZvaWQgMD09PW4mJjE9PT10Lm5vZGVUeXBlKWlmKHI9ImRhdGEtIitlLnJlcGxhY2UoZXQsIi0kJiIpLnRvTG93ZXJDYXNlKCksInN0cmluZyI9PXR5cGVvZihuPXQuZ2V0QXR0cmlidXRlKHIpKSl7dHJ5e249ZnVuY3Rpb24odCl7cmV0dXJuInRydWUiPT09dHx8ImZhbHNlIiE9PXQmJigibnVsbCI9PT10P251bGw6dD09PSt0KyIiPyt0OnR0LnRlc3QodCk/SlNPTi5wYXJzZSh0KTp0KX0obil9Y2F0Y2godCl7fVouc2V0KHQsZSxuKX1lbHNlIG49dm9pZCAwO3JldHVybiBufVMuZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKHQpe3JldHVybiBaLmhhc0RhdGEodCl8fFEuaGFzRGF0YSh0KX0sZGF0YTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIFouYWNjZXNzKHQsZSxuKX0scmVtb3ZlRGF0YTpmdW5jdGlvbih0LGUpe1oucmVtb3ZlKHQsZSl9LF9kYXRhOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gUS5hY2Nlc3ModCxlLG4pfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbih0LGUpe1EucmVtb3ZlKHQsZSl9fSksUy5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24odCxlKXt2YXIgbixyLG8saT10aGlzWzBdLGE9aSYmaS5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PXQpe2lmKHRoaXMubGVuZ3RoJiYobz1aLmdldChpKSwxPT09aS5ub2RlVHlwZSYmIVEuZ2V0KGksImhhc0RhdGFBdHRycyIpKSl7Zm9yKG49YS5sZW5ndGg7bi0tOylhW25dJiYwPT09KHI9YVtuXS5uYW1lKS5pbmRleE9mKCJkYXRhLSIpJiYocj1LKHIuc2xpY2UoNSkpLG50KGkscixvW3JdKSk7US5zZXQoaSwiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIG99cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0P3RoaXMuZWFjaChmdW5jdGlvbigpe1ouc2V0KHRoaXMsdCl9KTokKHRoaXMsZnVuY3Rpb24oZSl7dmFyIG47aWYoaSYmdm9pZCAwPT09ZSlyZXR1cm4gdm9pZCAwIT09KG49Wi5nZXQoaSx0KSk/bjp2b2lkIDAhPT0obj1udChpLHQpKT9uOnZvaWQgMDt0aGlzLmVhY2goZnVuY3Rpb24oKXtaLnNldCh0aGlzLHQsZSl9KX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Wi5yZW1vdmUodGhpcyx0KX0pfX0pLFMuZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI7aWYodClyZXR1cm4gZT0oZXx8ImZ4IikrInF1ZXVlIixyPVEuZ2V0KHQsZSksbiYmKCFyfHxBcnJheS5pc0FycmF5KG4pP3I9US5hY2Nlc3ModCxlLFMubWFrZUFycmF5KG4pKTpyLnB1c2gobikpLHJ8fFtdfSxkZXF1ZXVlOmZ1bmN0aW9uKHQsZSl7ZT1lfHwiZngiO3ZhciBuPVMucXVldWUodCxlKSxyPW4ubGVuZ3RoLG89bi5zaGlmdCgpLGk9Uy5fcXVldWVIb29rcyh0LGUpOyJpbnByb2dyZXNzIj09PW8mJihvPW4uc2hpZnQoKSxyLS0pLG8mJigiZngiPT09ZSYmbi51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIGkuc3RvcCxvLmNhbGwodCxmdW5jdGlvbigpe1MuZGVxdWV1ZSh0LGUpfSxpKSksIXImJmkmJmkuZW1wdHkuZmlyZSgpfSxfcXVldWVIb29rczpmdW5jdGlvbih0LGUpe3ZhciBuPWUrInF1ZXVlSG9va3MiO3JldHVybiBRLmdldCh0LG4pfHxRLmFjY2Vzcyh0LG4se2VtcHR5OlMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe1EucmVtb3ZlKHQsW2UrInF1ZXVlIixuXSl9KX0pfX0pLFMuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPTI7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0JiYoZT10LHQ9ImZ4IixuLS0pLGFyZ3VtZW50cy5sZW5ndGg8bj9TLnF1ZXVlKHRoaXNbMF0sdCk6dm9pZCAwPT09ZT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBuPVMucXVldWUodGhpcyx0LGUpO1MuX3F1ZXVlSG9va3ModGhpcyx0KSwiZngiPT09dCYmImlucHJvZ3Jlc3MiIT09blswXSYmUy5kZXF1ZXVlKHRoaXMsdCl9KX0sZGVxdWV1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5kZXF1ZXVlKHRoaXMsdCl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5xdWV1ZSh0fHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbih0LGUpe3ZhciBuLHI9MSxvPVMuRGVmZXJyZWQoKSxpPXRoaXMsYT10aGlzLmxlbmd0aCxzPWZ1bmN0aW9uKCl7LS1yfHxvLnJlc29sdmVXaXRoKGksW2ldKX07Zm9yKCJzdHJpbmciIT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksdD10fHwiZngiO2EtLTspKG49US5nZXQoaVthXSx0KyJxdWV1ZUhvb2tzIikpJiZuLmVtcHR5JiYocisrLG4uZW1wdHkuYWRkKHMpKTtyZXR1cm4gcygpLG8ucHJvbWlzZShlKX19KTt2YXIgcnQ9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2Usb3Q9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK3J0KyIpKFthLXolXSopJCIsImkiKSxpdD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLGF0PWEuZG9jdW1lbnRFbGVtZW50LHN0PWZ1bmN0aW9uKHQpe3JldHVybiBTLmNvbnRhaW5zKHQub3duZXJEb2N1bWVudCx0KX0sdXQ9e2NvbXBvc2VkOiEwfTthdC5nZXRSb290Tm9kZSYmKHN0PWZ1bmN0aW9uKHQpe3JldHVybiBTLmNvbnRhaW5zKHQub3duZXJEb2N1bWVudCx0KXx8dC5nZXRSb290Tm9kZSh1dCk9PT10Lm93bmVyRG9jdW1lbnR9KTt2YXIgY3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4ibm9uZSI9PT0odD1lfHx0KS5zdHlsZS5kaXNwbGF5fHwiIj09PXQuc3R5bGUuZGlzcGxheSYmc3QodCkmJiJub25lIj09PVMuY3NzKHQsImRpc3BsYXkiKX0sbHQ9ZnVuY3Rpb24odCxlLG4scil7dmFyIG8saSxhPXt9O2ZvcihpIGluIGUpYVtpXT10LnN0eWxlW2ldLHQuc3R5bGVbaV09ZVtpXTtmb3IoaSBpbiBvPW4uYXBwbHkodCxyfHxbXSksZSl0LnN0eWxlW2ldPWFbaV07cmV0dXJuIG99O2Z1bmN0aW9uIGZ0KHQsZSxuLHIpe3ZhciBvLGksYT0yMCxzPXI/ZnVuY3Rpb24oKXtyZXR1cm4gci5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gUy5jc3ModCxlLCIiKX0sdT1zKCksYz1uJiZuWzNdfHwoUy5jc3NOdW1iZXJbZV0/IiI6InB4IiksbD10Lm5vZGVUeXBlJiYoUy5jc3NOdW1iZXJbZV18fCJweCIhPT1jJiYrdSkmJm90LmV4ZWMoUy5jc3ModCxlKSk7aWYobCYmbFszXSE9PWMpe2Zvcih1Lz0yLGM9Y3x8bFszXSxsPSt1fHwxO2EtLTspUy5zdHlsZSh0LGUsbCtjKSwoMS1pKSooMS0oaT1zKCkvdXx8LjUpKTw9MCYmKGE9MCksbC89aTtsKj0yLFMuc3R5bGUodCxlLGwrYyksbj1ufHxbXX1yZXR1cm4gbiYmKGw9K2x8fCt1fHwwLG89blsxXT9sKyhuWzFdKzEpKm5bMl06K25bMl0sciYmKHIudW5pdD1jLHIuc3RhcnQ9bCxyLmVuZD1vKSksb312YXIgcHQ9e307ZnVuY3Rpb24gaHQodCl7dmFyIGUsbj10Lm93bmVyRG9jdW1lbnQscj10Lm5vZGVOYW1lLG89cHRbcl07cmV0dXJuIG98fChlPW4uYm9keS5hcHBlbmRDaGlsZChuLmNyZWF0ZUVsZW1lbnQocikpLG89Uy5jc3MoZSwiZGlzcGxheSIpLGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSwibm9uZSI9PT1vJiYobz0iYmxvY2siKSxwdFtyXT1vLG8pfWZ1bmN0aW9uIGR0KHQsZSl7Zm9yKHZhciBuLHIsbz1bXSxpPTAsYT10Lmxlbmd0aDtpPGE7aSsrKShyPXRbaV0pLnN0eWxlJiYobj1yLnN0eWxlLmRpc3BsYXksZT8oIm5vbmUiPT09biYmKG9baV09US5nZXQociwiZGlzcGxheSIpfHxudWxsLG9baV18fChyLnN0eWxlLmRpc3BsYXk9IiIpKSwiIj09PXIuc3R5bGUuZGlzcGxheSYmY3QocikmJihvW2ldPWh0KHIpKSk6Im5vbmUiIT09biYmKG9baV09Im5vbmUiLFEuc2V0KHIsImRpc3BsYXkiLG4pKSk7Zm9yKGk9MDtpPGE7aSsrKW51bGwhPW9baV0mJih0W2ldLnN0eWxlLmRpc3BsYXk9b1tpXSk7cmV0dXJuIHR9Uy5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oKXtyZXR1cm4gZHQodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gZHQodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbih0KXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0P3Q/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Y3QodGhpcyk/Uyh0aGlzKS5zaG93KCk6Uyh0aGlzKS5oaWRlKCl9KX19KTt2YXIgZ3Q9L14oPzpjaGVja2JveHxyYWRpbykkL2ksdnQ9LzwoW2Etel1bXlwvXDA+XHgyMFx0XHJcblxmXSopL2kseXQ9L14kfF5tb2R1bGUkfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLG10PXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07ZnVuY3Rpb24gYnQodCxlKXt2YXIgbjtyZXR1cm4gbj12b2lkIDAhPT10LmdldEVsZW1lbnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZXx8IioiKTp2b2lkIDAhPT10LnF1ZXJ5U2VsZWN0b3JBbGw/dC5xdWVyeVNlbGVjdG9yQWxsKGV8fCIqIik6W10sdm9pZCAwPT09ZXx8ZSYmTCh0LGUpP1MubWVyZ2UoW3RdLG4pOm59ZnVuY3Rpb24geHQodCxlKXtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspUS5zZXQodFtuXSwiZ2xvYmFsRXZhbCIsIWV8fFEuZ2V0KGVbbl0sImdsb2JhbEV2YWwiKSl9bXQub3B0Z3JvdXA9bXQub3B0aW9uLG10LnRib2R5PW10LnRmb290PW10LmNvbGdyb3VwPW10LmNhcHRpb249bXQudGhlYWQsbXQudGg9bXQudGQ7dmFyIHd0LGt0LFN0PS88fCYjP1x3KzsvO2Z1bmN0aW9uIEV0KHQsZSxuLHIsbyl7Zm9yKHZhciBpLGEscyx1LGMsbCxmPWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLHA9W10saD0wLGQ9dC5sZW5ndGg7aDxkO2grKylpZigoaT10W2hdKXx8MD09PWkpaWYoIm9iamVjdCI9PT1rKGkpKVMubWVyZ2UocCxpLm5vZGVUeXBlP1tpXTppKTtlbHNlIGlmKFN0LnRlc3QoaSkpe2ZvcihhPWF8fGYuYXBwZW5kQ2hpbGQoZS5jcmVhdGVFbGVtZW50KCJkaXYiKSkscz0odnQuZXhlYyhpKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSx1PW10W3NdfHxtdC5fZGVmYXVsdCxhLmlubmVySFRNTD11WzFdK1MuaHRtbFByZWZpbHRlcihpKSt1WzJdLGw9dVswXTtsLS07KWE9YS5sYXN0Q2hpbGQ7Uy5tZXJnZShwLGEuY2hpbGROb2RlcyksKGE9Zi5maXJzdENoaWxkKS50ZXh0Q29udGVudD0iIn1lbHNlIHAucHVzaChlLmNyZWF0ZVRleHROb2RlKGkpKTtmb3IoZi50ZXh0Q29udGVudD0iIixoPTA7aT1wW2grK107KWlmKHImJlMuaW5BcnJheShpLHIpPi0xKW8mJm8ucHVzaChpKTtlbHNlIGlmKGM9c3QoaSksYT1idChmLmFwcGVuZENoaWxkKGkpLCJzY3JpcHQiKSxjJiZ4dChhKSxuKWZvcihsPTA7aT1hW2wrK107KXl0LnRlc3QoaS50eXBlfHwiIikmJm4ucHVzaChpKTtyZXR1cm4gZn13dD1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5hcHBlbmRDaGlsZChhLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSwoa3Q9YS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGt0LnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxrdC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0Iiksd3QuYXBwZW5kQ2hpbGQoa3QpLHkuY2hlY2tDbG9uZT13dC5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsd3QuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+Iix5Lm5vQ2xvbmVDaGVja2VkPSEhd3QuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlO3ZhciBqdD0vXmtleS8sVHQ9L14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLE90PS9eKFteLl0qKSg/OlwuKC4rKXwpLztmdW5jdGlvbiBBdCgpe3JldHVybiEwfWZ1bmN0aW9uIEN0KCl7cmV0dXJuITF9ZnVuY3Rpb24gTHQodCxlKXtyZXR1cm4gdD09PWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBhLmFjdGl2ZUVsZW1lbnR9Y2F0Y2godCl7fX0oKT09KCJmb2N1cyI9PT1lKX1mdW5jdGlvbiBSdCh0LGUsbixyLG8saSl7dmFyIGEscztpZigib2JqZWN0Ij09dHlwZW9mIGUpe2ZvcihzIGluInN0cmluZyIhPXR5cGVvZiBuJiYocj1yfHxuLG49dm9pZCAwKSxlKVJ0KHQscyxuLHIsZVtzXSxpKTtyZXR1cm4gdH1pZihudWxsPT1yJiZudWxsPT1vPyhvPW4scj1uPXZvaWQgMCk6bnVsbD09byYmKCJzdHJpbmciPT10eXBlb2Ygbj8obz1yLHI9dm9pZCAwKToobz1yLHI9bixuPXZvaWQgMCkpLCExPT09bylvPUN0O2Vsc2UgaWYoIW8pcmV0dXJuIHQ7cmV0dXJuIDE9PT1pJiYoYT1vLChvPWZ1bmN0aW9uKHQpe3JldHVybiBTKCkub2ZmKHQpLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfSkuZ3VpZD1hLmd1aWR8fChhLmd1aWQ9Uy5ndWlkKyspKSx0LmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LmFkZCh0aGlzLGUsbyxyLG4pfSl9ZnVuY3Rpb24gUHQodCxlLG4pe24/KFEuc2V0KHQsZSwhMSksUy5ldmVudC5hZGQodCxlLHtuYW1lc3BhY2U6ITEsaGFuZGxlcjpmdW5jdGlvbih0KXt2YXIgcixvLGk9US5nZXQodGhpcyxlKTtpZigxJnQuaXNUcmlnZ2VyJiZ0aGlzW2VdKXtpZihpLmxlbmd0aCkoUy5ldmVudC5zcGVjaWFsW2VdfHx7fSkuZGVsZWdhdGVUeXBlJiZ0LnN0b3BQcm9wYWdhdGlvbigpO2Vsc2UgaWYoaT11LmNhbGwoYXJndW1lbnRzKSxRLnNldCh0aGlzLGUsaSkscj1uKHRoaXMsZSksdGhpc1tlXSgpLGkhPT0obz1RLmdldCh0aGlzLGUpKXx8cj9RLnNldCh0aGlzLGUsITEpOm89e30saSE9PW8pcmV0dXJuIHQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdC5wcmV2ZW50RGVmYXVsdCgpLG8udmFsdWV9ZWxzZSBpLmxlbmd0aCYmKFEuc2V0KHRoaXMsZSx7dmFsdWU6Uy5ldmVudC50cmlnZ2VyKFMuZXh0ZW5kKGlbMF0sUy5FdmVudC5wcm90b3R5cGUpLGkuc2xpY2UoMSksdGhpcyl9KSx0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpKX19KSk6dm9pZCAwPT09US5nZXQodCxlKSYmUy5ldmVudC5hZGQodCxlLEF0KX1TLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGksYSxzLHUsYyxsLGYscCxoLGQsZyx2PVEuZ2V0KHQpO2lmKHYpZm9yKG4uaGFuZGxlciYmKG49KGk9bikuaGFuZGxlcixvPWkuc2VsZWN0b3IpLG8mJlMuZmluZC5tYXRjaGVzU2VsZWN0b3IoYXQsbyksbi5ndWlkfHwobi5ndWlkPVMuZ3VpZCsrKSwodT12LmV2ZW50cyl8fCh1PXYuZXZlbnRzPXt9KSwoYT12LmhhbmRsZSl8fChhPXYuaGFuZGxlPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT1TJiZTLmV2ZW50LnRyaWdnZXJlZCE9PWUudHlwZT9TLmV2ZW50LmRpc3BhdGNoLmFwcGx5KHQsYXJndW1lbnRzKTp2b2lkIDB9KSxjPShlPShlfHwiIikubWF0Y2goVSl8fFsiIl0pLmxlbmd0aDtjLS07KWg9Zz0ocz1PdC5leGVjKGVbY10pfHxbXSlbMV0sZD0oc1syXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGgmJihmPVMuZXZlbnQuc3BlY2lhbFtoXXx8e30saD0obz9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8aCxmPVMuZXZlbnQuc3BlY2lhbFtoXXx8e30sbD1TLmV4dGVuZCh7dHlwZTpoLG9yaWdUeXBlOmcsZGF0YTpyLGhhbmRsZXI6bixndWlkOm4uZ3VpZCxzZWxlY3RvcjpvLG5lZWRzQ29udGV4dDpvJiZTLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QobyksbmFtZXNwYWNlOmQuam9pbigiLiIpfSxpKSwocD11W2hdKXx8KChwPXVbaF09W10pLmRlbGVnYXRlQ291bnQ9MCxmLnNldHVwJiYhMSE9PWYuc2V0dXAuY2FsbCh0LHIsZCxhKXx8dC5hZGRFdmVudExpc3RlbmVyJiZ0LmFkZEV2ZW50TGlzdGVuZXIoaCxhKSksZi5hZGQmJihmLmFkZC5jYWxsKHQsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1uLmd1aWQpKSxvP3Auc3BsaWNlKHAuZGVsZWdhdGVDb3VudCsrLDAsbCk6cC5wdXNoKGwpLFMuZXZlbnQuZ2xvYmFsW2hdPSEwKX0scmVtb3ZlOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGksYSxzLHUsYyxsLGYscCxoLGQsZyx2PVEuaGFzRGF0YSh0KSYmUS5nZXQodCk7aWYodiYmKHU9di5ldmVudHMpKXtmb3IoYz0oZT0oZXx8IiIpLm1hdGNoKFUpfHxbIiJdKS5sZW5ndGg7Yy0tOylpZihoPWc9KHM9T3QuZXhlYyhlW2NdKXx8W10pWzFdLGQ9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxoKXtmb3IoZj1TLmV2ZW50LnNwZWNpYWxbaF18fHt9LHA9dVtoPShyP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxoXXx8W10scz1zWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitkLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGE9aT1wLmxlbmd0aDtpLS07KWw9cFtpXSwhbyYmZyE9PWwub3JpZ1R5cGV8fG4mJm4uZ3VpZCE9PWwuZ3VpZHx8cyYmIXMudGVzdChsLm5hbWVzcGFjZSl8fHImJnIhPT1sLnNlbGVjdG9yJiYoIioqIiE9PXJ8fCFsLnNlbGVjdG9yKXx8KHAuc3BsaWNlKGksMSksbC5zZWxlY3RvciYmcC5kZWxlZ2F0ZUNvdW50LS0sZi5yZW1vdmUmJmYucmVtb3ZlLmNhbGwodCxsKSk7YSYmIXAubGVuZ3RoJiYoZi50ZWFyZG93biYmITEhPT1mLnRlYXJkb3duLmNhbGwodCxkLHYuaGFuZGxlKXx8Uy5yZW1vdmVFdmVudCh0LGgsdi5oYW5kbGUpLGRlbGV0ZSB1W2hdKX1lbHNlIGZvcihoIGluIHUpUy5ldmVudC5yZW1vdmUodCxoK2VbY10sbixyLCEwKTtTLmlzRW1wdHlPYmplY3QodSkmJlEucmVtb3ZlKHQsImhhbmRsZSBldmVudHMiKX19LGRpc3BhdGNoOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYSxzPVMuZXZlbnQuZml4KHQpLHU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLGM9KFEuZ2V0KHRoaXMsImV2ZW50cyIpfHx7fSlbcy50eXBlXXx8W10sbD1TLmV2ZW50LnNwZWNpYWxbcy50eXBlXXx8e307Zm9yKHVbMF09cyxlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl1W2VdPWFyZ3VtZW50c1tlXTtpZihzLmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWwucHJlRGlzcGF0Y2h8fCExIT09bC5wcmVEaXNwYXRjaC5jYWxsKHRoaXMscykpe2ZvcihhPVMuZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLHMsYyksZT0wOyhvPWFbZSsrXSkmJiFzLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7KWZvcihzLmN1cnJlbnRUYXJnZXQ9by5lbGVtLG49MDsoaT1vLmhhbmRsZXJzW24rK10pJiYhcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpOylzLnJuYW1lc3BhY2UmJiExIT09aS5uYW1lc3BhY2UmJiFzLnJuYW1lc3BhY2UudGVzdChpLm5hbWVzcGFjZSl8fChzLmhhbmRsZU9iaj1pLHMuZGF0YT1pLmRhdGEsdm9pZCAwIT09KHI9KChTLmV2ZW50LnNwZWNpYWxbaS5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fGkuaGFuZGxlcikuYXBwbHkoby5lbGVtLHUpKSYmITE9PT0ocy5yZXN1bHQ9cikmJihzLnByZXZlbnREZWZhdWx0KCkscy5zdG9wUHJvcGFnYXRpb24oKSkpO3JldHVybiBsLnBvc3REaXNwYXRjaCYmbC5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLHMpLHMucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24odCxlKXt2YXIgbixyLG8saSxhLHM9W10sdT1lLmRlbGVnYXRlQ291bnQsYz10LnRhcmdldDtpZih1JiZjLm5vZGVUeXBlJiYhKCJjbGljayI9PT10LnR5cGUmJnQuYnV0dG9uPj0xKSlmb3IoO2MhPT10aGlzO2M9Yy5wYXJlbnROb2RlfHx0aGlzKWlmKDE9PT1jLm5vZGVUeXBlJiYoImNsaWNrIiE9PXQudHlwZXx8ITAhPT1jLmRpc2FibGVkKSl7Zm9yKGk9W10sYT17fSxuPTA7bjx1O24rKyl2b2lkIDA9PT1hW289KHI9ZVtuXSkuc2VsZWN0b3IrIiAiXSYmKGFbb109ci5uZWVkc0NvbnRleHQ/UyhvLHRoaXMpLmluZGV4KGMpPi0xOlMuZmluZChvLHRoaXMsbnVsbCxbY10pLmxlbmd0aCksYVtvXSYmaS5wdXNoKHIpO2kubGVuZ3RoJiZzLnB1c2goe2VsZW06YyxoYW5kbGVyczppfSl9cmV0dXJuIGM9dGhpcyx1PGUubGVuZ3RoJiZzLnB1c2goe2VsZW06YyxoYW5kbGVyczplLnNsaWNlKHUpfSksc30sYWRkUHJvcDpmdW5jdGlvbih0LGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShTLkV2ZW50LnByb3RvdHlwZSx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6bShlKT9mdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gZSh0aGlzLm9yaWdpbmFsRXZlbnQpfTpmdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50W3RdfSxzZXQ6ZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZX0pfX0pfSxmaXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRbUy5leHBhbmRvXT90Om5ldyBTLkV2ZW50KHQpfSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sY2xpY2s6e3NldHVwOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXN8fHQ7cmV0dXJuIGd0LnRlc3QoZS50eXBlKSYmZS5jbGljayYmTChlLCJpbnB1dCIpJiZQdChlLCJjbGljayIsQXQpLCExfSx0cmlnZ2VyOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXN8fHQ7cmV0dXJuIGd0LnRlc3QoZS50eXBlKSYmZS5jbGljayYmTChlLCJpbnB1dCIpJiZQdChlLCJjbGljayIpLCEwfSxfZGVmYXVsdDpmdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldDtyZXR1cm4gZ3QudGVzdChlLnR5cGUpJiZlLmNsaWNrJiZMKGUsImlucHV0IikmJlEuZ2V0KGUsImNsaWNrIil8fEwoZSwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24odCl7dm9pZCAwIT09dC5yZXN1bHQmJnQub3JpZ2luYWxFdmVudCYmKHQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT10LnJlc3VsdCl9fX19LFMucmVtb3ZlRXZlbnQ9ZnVuY3Rpb24odCxlLG4pe3QucmVtb3ZlRXZlbnRMaXN0ZW5lciYmdC5yZW1vdmVFdmVudExpc3RlbmVyKGUsbil9LFMuRXZlbnQ9ZnVuY3Rpb24odCxlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBTLkV2ZW50KSlyZXR1cm4gbmV3IFMuRXZlbnQodCxlKTt0JiZ0LnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD10LHRoaXMudHlwZT10LnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9dC5kZWZhdWx0UHJldmVudGVkfHx2b2lkIDA9PT10LmRlZmF1bHRQcmV2ZW50ZWQmJiExPT09dC5yZXR1cm5WYWx1ZT9BdDpDdCx0aGlzLnRhcmdldD10LnRhcmdldCYmMz09PXQudGFyZ2V0Lm5vZGVUeXBlP3QudGFyZ2V0LnBhcmVudE5vZGU6dC50YXJnZXQsdGhpcy5jdXJyZW50VGFyZ2V0PXQuY3VycmVudFRhcmdldCx0aGlzLnJlbGF0ZWRUYXJnZXQ9dC5yZWxhdGVkVGFyZ2V0KTp0aGlzLnR5cGU9dCxlJiZTLmV4dGVuZCh0aGlzLGUpLHRoaXMudGltZVN0YW1wPXQmJnQudGltZVN0YW1wfHxEYXRlLm5vdygpLHRoaXNbUy5leHBhbmRvXT0hMH0sUy5FdmVudC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlMuRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOkN0LGlzUHJvcGFnYXRpb25TdG9wcGVkOkN0LGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOkN0LGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPUF0LHQmJiF0aGlzLmlzU2ltdWxhdGVkJiZ0LnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPUF0LHQmJiF0aGlzLmlzU2ltdWxhdGVkJiZ0LnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1BdCx0JiYhdGhpcy5pc1NpbXVsYXRlZCYmdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sUy5lYWNoKHthbHRLZXk6ITAsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNoYW5nZWRUb3VjaGVzOiEwLGN0cmxLZXk6ITAsZGV0YWlsOiEwLGV2ZW50UGhhc2U6ITAsbWV0YUtleTohMCxwYWdlWDohMCxwYWdlWTohMCxzaGlmdEtleTohMCx2aWV3OiEwLGNoYXI6ITAsY29kZTohMCxjaGFyQ29kZTohMCxrZXk6ITAsa2V5Q29kZTohMCxidXR0b246ITAsYnV0dG9uczohMCxjbGllbnRYOiEwLGNsaWVudFk6ITAsb2Zmc2V0WDohMCxvZmZzZXRZOiEwLHBvaW50ZXJJZDohMCxwb2ludGVyVHlwZTohMCxzY3JlZW5YOiEwLHNjcmVlblk6ITAsdGFyZ2V0VG91Y2hlczohMCx0b0VsZW1lbnQ6ITAsdG91Y2hlczohMCx3aGljaDpmdW5jdGlvbih0KXt2YXIgZT10LmJ1dHRvbjtyZXR1cm4gbnVsbD09dC53aGljaCYmanQudGVzdCh0LnR5cGUpP251bGwhPXQuY2hhckNvZGU/dC5jaGFyQ29kZTp0LmtleUNvZGU6IXQud2hpY2gmJnZvaWQgMCE9PWUmJlR0LnRlc3QodC50eXBlKT8xJmU/MToyJmU/Mzo0JmU/MjowOnQud2hpY2h9fSxTLmV2ZW50LmFkZFByb3ApLFMuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24odCxlKXtTLmV2ZW50LnNwZWNpYWxbdF09e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIFB0KHRoaXMsdCxMdCksITF9LHRyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gUHQodGhpcyx0KSwhMH0sZGVsZWdhdGVUeXBlOmV9fSksUy5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbih0LGUpe1MuZXZlbnQuc3BlY2lhbFt0XT17ZGVsZWdhdGVUeXBlOmUsYmluZFR5cGU6ZSxoYW5kbGU6ZnVuY3Rpb24odCl7dmFyIG4scj10aGlzLG89dC5yZWxhdGVkVGFyZ2V0LGk9dC5oYW5kbGVPYmo7cmV0dXJuIG8mJihvPT09cnx8Uy5jb250YWlucyhyLG8pKXx8KHQudHlwZT1pLm9yaWdUeXBlLG49aS5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LnR5cGU9ZSksbn19fSksUy5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBSdCh0aGlzLHQsZSxuLHIpfSxvbmU6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIFJ0KHRoaXMsdCxlLG4sciwxKX0sb2ZmOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvO2lmKHQmJnQucHJldmVudERlZmF1bHQmJnQuaGFuZGxlT2JqKXJldHVybiByPXQuaGFuZGxlT2JqLFModC5kZWxlZ2F0ZVRhcmdldCkub2ZmKHIubmFtZXNwYWNlP3Iub3JpZ1R5cGUrIi4iK3IubmFtZXNwYWNlOnIub3JpZ1R5cGUsci5zZWxlY3RvcixyLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiB0KXtmb3IobyBpbiB0KXRoaXMub2ZmKG8sZSx0W29dKTtyZXR1cm4gdGhpc31yZXR1cm4hMSE9PWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlfHwobj1lLGU9dm9pZCAwKSwhMT09PW4mJihuPUN0KSx0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LnJlbW92ZSh0aGlzLHQsbixlKX0pfX0pO3ZhciBOdD0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksSXQ9LzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksX3Q9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksRHQ9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nO2Z1bmN0aW9uIE10KHQsZSl7cmV0dXJuIEwodCwidGFibGUiKSYmTCgxMSE9PWUubm9kZVR5cGU/ZTplLmZpcnN0Q2hpbGQsInRyIikmJlModCkuY2hpbGRyZW4oInRib2R5IilbMF18fHR9ZnVuY3Rpb24gVXQodCl7cmV0dXJuIHQudHlwZT0obnVsbCE9PXQuZ2V0QXR0cmlidXRlKCJ0eXBlIikpKyIvIit0LnR5cGUsdH1mdW5jdGlvbiBCdCh0KXtyZXR1cm4idHJ1ZS8iPT09KHQudHlwZXx8IiIpLnNsaWNlKDAsNSk/dC50eXBlPXQudHlwZS5zbGljZSg1KTp0LnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLHR9ZnVuY3Rpb24gcXQodCxlKXt2YXIgbixyLG8saSxhLHMsdSxjO2lmKDE9PT1lLm5vZGVUeXBlKXtpZihRLmhhc0RhdGEodCkmJihpPVEuYWNjZXNzKHQpLGE9US5zZXQoZSxpKSxjPWkuZXZlbnRzKSlmb3IobyBpbiBkZWxldGUgYS5oYW5kbGUsYS5ldmVudHM9e30sYylmb3Iobj0wLHI9Y1tvXS5sZW5ndGg7bjxyO24rKylTLmV2ZW50LmFkZChlLG8sY1tvXVtuXSk7Wi5oYXNEYXRhKHQpJiYocz1aLmFjY2Vzcyh0KSx1PVMuZXh0ZW5kKHt9LHMpLFouc2V0KGUsdSkpfX1mdW5jdGlvbiBGdCh0LGUpe3ZhciBuPWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsiaW5wdXQiPT09biYmZ3QudGVzdCh0LnR5cGUpP2UuY2hlY2tlZD10LmNoZWNrZWQ6ImlucHV0IiE9PW4mJiJ0ZXh0YXJlYSIhPT1ufHwoZS5kZWZhdWx0VmFsdWU9dC5kZWZhdWx0VmFsdWUpfWZ1bmN0aW9uIEh0KHQsZSxuLHIpe2U9Yy5hcHBseShbXSxlKTt2YXIgbyxpLGEscyx1LGwsZj0wLHA9dC5sZW5ndGgsaD1wLTEsZD1lWzBdLGc9bShkKTtpZihnfHxwPjEmJiJzdHJpbmciPT10eXBlb2YgZCYmIXkuY2hlY2tDbG9uZSYmX3QudGVzdChkKSlyZXR1cm4gdC5lYWNoKGZ1bmN0aW9uKG8pe3ZhciBpPXQuZXEobyk7ZyYmKGVbMF09ZC5jYWxsKHRoaXMsbyxpLmh0bWwoKSkpLEh0KGksZSxuLHIpfSk7aWYocCYmKGk9KG89RXQoZSx0WzBdLm93bmVyRG9jdW1lbnQsITEsdCxyKSkuZmlyc3RDaGlsZCwxPT09by5jaGlsZE5vZGVzLmxlbmd0aCYmKG89aSksaXx8cikpe2ZvcihzPShhPVMubWFwKGJ0KG8sInNjcmlwdCIpLFV0KSkubGVuZ3RoO2Y8cDtmKyspdT1vLGYhPT1oJiYodT1TLmNsb25lKHUsITAsITApLHMmJlMubWVyZ2UoYSxidCh1LCJzY3JpcHQiKSkpLG4uY2FsbCh0W2ZdLHUsZik7aWYocylmb3IobD1hW2EubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsUy5tYXAoYSxCdCksZj0wO2Y8cztmKyspdT1hW2ZdLHl0LnRlc3QodS50eXBlfHwiIikmJiFRLmFjY2Vzcyh1LCJnbG9iYWxFdmFsIikmJlMuY29udGFpbnMobCx1KSYmKHUuc3JjJiYibW9kdWxlIiE9PSh1LnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpP1MuX2V2YWxVcmwmJiF1Lm5vTW9kdWxlJiZTLl9ldmFsVXJsKHUuc3JjLHtub25jZTp1Lm5vbmNlfHx1LmdldEF0dHJpYnV0ZSgibm9uY2UiKX0pOncodS50ZXh0Q29udGVudC5yZXBsYWNlKER0LCIiKSx1LGwpKX1yZXR1cm4gdH1mdW5jdGlvbiB6dCh0LGUsbil7Zm9yKHZhciByLG89ZT9TLmZpbHRlcihlLHQpOnQsaT0wO251bGwhPShyPW9baV0pO2krKylufHwxIT09ci5ub2RlVHlwZXx8Uy5jbGVhbkRhdGEoYnQocikpLHIucGFyZW50Tm9kZSYmKG4mJnN0KHIpJiZ4dChidChyLCJzY3JpcHQiKSksci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHIpKTtyZXR1cm4gdH1TLmV4dGVuZCh7aHRtbFByZWZpbHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdC5yZXBsYWNlKE50LCI8JDE+PC8kMj4iKX0sY2xvbmU6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhLHM9dC5jbG9uZU5vZGUoITApLHU9c3QodCk7aWYoISh5Lm5vQ2xvbmVDaGVja2VkfHwxIT09dC5ub2RlVHlwZSYmMTEhPT10Lm5vZGVUeXBlfHxTLmlzWE1MRG9jKHQpKSlmb3IoYT1idChzKSxyPTAsbz0oaT1idCh0KSkubGVuZ3RoO3I8bztyKyspRnQoaVtyXSxhW3JdKTtpZihlKWlmKG4pZm9yKGk9aXx8YnQodCksYT1hfHxidChzKSxyPTAsbz1pLmxlbmd0aDtyPG87cisrKXF0KGlbcl0sYVtyXSk7ZWxzZSBxdCh0LHMpO3JldHVybihhPWJ0KHMsInNjcmlwdCIpKS5sZW5ndGg+MCYmeHQoYSwhdSYmYnQodCwic2NyaXB0IikpLHN9LGNsZWFuRGF0YTpmdW5jdGlvbih0KXtmb3IodmFyIGUsbixyLG89Uy5ldmVudC5zcGVjaWFsLGk9MDt2b2lkIDAhPT0obj10W2ldKTtpKyspaWYoWChuKSl7aWYoZT1uW1EuZXhwYW5kb10pe2lmKGUuZXZlbnRzKWZvcihyIGluIGUuZXZlbnRzKW9bcl0/Uy5ldmVudC5yZW1vdmUobixyKTpTLnJlbW92ZUV2ZW50KG4scixlLmhhbmRsZSk7bltRLmV4cGFuZG9dPXZvaWQgMH1uW1ouZXhwYW5kb10mJihuW1ouZXhwYW5kb109dm9pZCAwKX19fSksUy5mbi5leHRlbmQoe2RldGFjaDpmdW5jdGlvbih0KXtyZXR1cm4genQodGhpcyx0LCEwKX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiB6dCh0aGlzLHQpfSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQ/Uy50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5lYWNoKGZ1bmN0aW9uKCl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fCh0aGlzLnRleHRDb250ZW50PXQpfSl9LG51bGwsdCxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIEh0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpezEhPT10aGlzLm5vZGVUeXBlJiYxMSE9PXRoaXMubm9kZVR5cGUmJjkhPT10aGlzLm5vZGVUeXBlfHxNdCh0aGlzLHQpLmFwcGVuZENoaWxkKHQpfSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSHQodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24odCl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBlPU10KHRoaXMsdCk7ZS5pbnNlcnRCZWZvcmUodCxlLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gSHQodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24odCl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHQsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gSHQodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24odCl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHQsdGhpcy5uZXh0U2libGluZyl9KX0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIHQsZT0wO251bGwhPSh0PXRoaXNbZV0pO2UrKykxPT09dC5ub2RlVHlwZSYmKFMuY2xlYW5EYXRhKGJ0KHQsITEpKSx0LnRleHRDb250ZW50PSIiKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD1udWxsIT10JiZ0LGU9bnVsbD09ZT90OmUsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gUy5jbG9uZSh0aGlzLHQsZSl9KX0saHRtbDpmdW5jdGlvbih0KXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXNbMF18fHt9LG49MCxyPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PXQmJjE9PT1lLm5vZGVUeXBlKXJldHVybiBlLmlubmVySFRNTDtpZigic3RyaW5nIj09dHlwZW9mIHQmJiFJdC50ZXN0KHQpJiYhbXRbKHZ0LmV4ZWModCl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXt0PVMuaHRtbFByZWZpbHRlcih0KTt0cnl7Zm9yKDtuPHI7bisrKTE9PT0oZT10aGlzW25dfHx7fSkubm9kZVR5cGUmJihTLmNsZWFuRGF0YShidChlLCExKSksZS5pbm5lckhUTUw9dCk7ZT0wfWNhdGNoKHQpe319ZSYmdGhpcy5lbXB0eSgpLmFwcGVuZCh0KX0sbnVsbCx0LGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiBIdCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7Uy5pbkFycmF5KHRoaXMsdCk8MCYmKFMuY2xlYW5EYXRhKGJ0KHRoaXMpKSxuJiZuLnJlcGxhY2VDaGlsZChlLHRoaXMpKX0sdCl9fSksUy5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24odCxlKXtTLmZuW3RdPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixyPVtdLG89Uyh0KSxpPW8ubGVuZ3RoLTEsYT0wO2E8PWk7YSsrKW49YT09PWk/dGhpczp0aGlzLmNsb25lKCEwKSxTKG9bYV0pW2VdKG4pLGwuYXBwbHkocixuLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2socil9fSk7dmFyIFd0PW5ldyBSZWdFeHAoIl4oIitydCsiKSg/IXB4KVthLXolXSskIiwiaSIpLCR0PWZ1bmN0aW9uKHQpe3ZhciBlPXQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztyZXR1cm4gZSYmZS5vcGVuZXJ8fChlPW4pLGUuZ2V0Q29tcHV0ZWRTdHlsZSh0KX0sWXQ9bmV3IFJlZ0V4cChpdC5qb2luKCJ8IiksImkiKTtmdW5jdGlvbiBWdCh0LGUsbil7dmFyIHIsbyxpLGEscz10LnN0eWxlO3JldHVybihuPW58fCR0KHQpKSYmKCIiIT09KGE9bi5nZXRQcm9wZXJ0eVZhbHVlKGUpfHxuW2VdKXx8c3QodCl8fChhPVMuc3R5bGUodCxlKSksIXkucGl4ZWxCb3hTdHlsZXMoKSYmV3QudGVzdChhKSYmWXQudGVzdChlKSYmKHI9cy53aWR0aCxvPXMubWluV2lkdGgsaT1zLm1heFdpZHRoLHMubWluV2lkdGg9cy5tYXhXaWR0aD1zLndpZHRoPWEsYT1uLndpZHRoLHMud2lkdGg9cixzLm1pbldpZHRoPW8scy5tYXhXaWR0aD1pKSksdm9pZCAwIT09YT9hKyIiOmF9ZnVuY3Rpb24gR3QodCxlKXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7aWYoIXQoKSlyZXR1cm4odGhpcy5nZXQ9ZSkuYXBwbHkodGhpcyxhcmd1bWVudHMpO2RlbGV0ZSB0aGlzLmdldH19fSFmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtpZihsKXtjLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDttYXJnaW4tdG9wOjFweDtwYWRkaW5nOjA7Ym9yZGVyOjAiLGwuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NjAlO3RvcDoxJSIsYXQuYXBwZW5kQ2hpbGQoYykuYXBwZW5kQ2hpbGQobCk7dmFyIHQ9bi5nZXRDb21wdXRlZFN0eWxlKGwpO3I9IjElIiE9PXQudG9wLHU9MTI9PT1lKHQubWFyZ2luTGVmdCksbC5zdHlsZS5yaWdodD0iNjAlIixzPTM2PT09ZSh0LnJpZ2h0KSxvPTM2PT09ZSh0LndpZHRoKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaT0xMj09PWUobC5vZmZzZXRXaWR0aC8zKSxhdC5yZW1vdmVDaGlsZChjKSxsPW51bGx9fWZ1bmN0aW9uIGUodCl7cmV0dXJuIE1hdGgucm91bmQocGFyc2VGbG9hdCh0KSl9dmFyIHIsbyxpLHMsdSxjPWEuY3JlYXRlRWxlbWVudCgiZGl2IiksbD1hLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuc3R5bGUmJihsLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsbC5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLHkuY2xlYXJDbG9uZVN0eWxlPSJjb250ZW50LWJveCI9PT1sLnN0eWxlLmJhY2tncm91bmRDbGlwLFMuZXh0ZW5kKHkse2JveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxvfSxwaXhlbEJveFN0eWxlczpmdW5jdGlvbigpe3JldHVybiB0KCksc30scGl4ZWxQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiB0KCkscn0scmVsaWFibGVNYXJnaW5MZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSx1fSxzY3JvbGxib3hTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxpfX0pKX0oKTt2YXIgS3Q9WyJXZWJraXQiLCJNb3oiLCJtcyJdLFh0PWEuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsSnQ9e307ZnVuY3Rpb24gUXQodCl7dmFyIGU9Uy5jc3NQcm9wc1t0XXx8SnRbdF07cmV0dXJuIGV8fCh0IGluIFh0P3Q6SnRbdF09ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpLG49S3QubGVuZ3RoO24tLTspaWYoKHQ9S3Rbbl0rZSlpbiBYdClyZXR1cm4gdH0odCl8fHQpfXZhciBadD0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sdGU9L14tLS8sZWU9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LG5lPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifTtmdW5jdGlvbiByZSh0LGUsbil7dmFyIHI9b3QuZXhlYyhlKTtyZXR1cm4gcj9NYXRoLm1heCgwLHJbMl0tKG58fDApKSsoclszXXx8InB4Iik6ZX1mdW5jdGlvbiBvZSh0LGUsbixyLG8saSl7dmFyIGE9IndpZHRoIj09PWU/MTowLHM9MCx1PTA7aWYobj09PShyPyJib3JkZXIiOiJjb250ZW50IikpcmV0dXJuIDA7Zm9yKDthPDQ7YSs9MikibWFyZ2luIj09PW4mJih1Kz1TLmNzcyh0LG4raXRbYV0sITAsbykpLHI/KCJjb250ZW50Ij09PW4mJih1LT1TLmNzcyh0LCJwYWRkaW5nIitpdFthXSwhMCxvKSksIm1hcmdpbiIhPT1uJiYodS09Uy5jc3ModCwiYm9yZGVyIitpdFthXSsiV2lkdGgiLCEwLG8pKSk6KHUrPVMuY3NzKHQsInBhZGRpbmciK2l0W2FdLCEwLG8pLCJwYWRkaW5nIiE9PW4/dSs9Uy5jc3ModCwiYm9yZGVyIitpdFthXSsiV2lkdGgiLCEwLG8pOnMrPVMuY3NzKHQsImJvcmRlciIraXRbYV0rIldpZHRoIiwhMCxvKSk7cmV0dXJuIXImJmk+PTAmJih1Kz1NYXRoLm1heCgwLE1hdGguY2VpbCh0WyJvZmZzZXQiK2VbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpXS1pLXUtcy0uNSkpfHwwKSx1fWZ1bmN0aW9uIGllKHQsZSxuKXt2YXIgcj0kdCh0KSxvPSgheS5ib3hTaXppbmdSZWxpYWJsZSgpfHxuKSYmImJvcmRlci1ib3giPT09Uy5jc3ModCwiYm94U2l6aW5nIiwhMSxyKSxpPW8sYT1WdCh0LGUscikscz0ib2Zmc2V0IitlWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKTtpZihXdC50ZXN0KGEpKXtpZighbilyZXR1cm4gYTthPSJhdXRvIn1yZXR1cm4oIXkuYm94U2l6aW5nUmVsaWFibGUoKSYmb3x8ImF1dG8iPT09YXx8IXBhcnNlRmxvYXQoYSkmJiJpbmxpbmUiPT09Uy5jc3ModCwiZGlzcGxheSIsITEscikpJiZ0LmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiYobz0iYm9yZGVyLWJveCI9PT1TLmNzcyh0LCJib3hTaXppbmciLCExLHIpLChpPXMgaW4gdCkmJihhPXRbc10pKSwoYT1wYXJzZUZsb2F0KGEpfHwwKStvZSh0LGUsbnx8KG8/ImJvcmRlciI6ImNvbnRlbnQiKSxpLHIsYSkrInB4In1mdW5jdGlvbiBhZSh0LGUsbixyLG8pe3JldHVybiBuZXcgYWUucHJvdG90eXBlLmluaXQodCxlLG4scixvKX1TLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbih0LGUpe2lmKGUpe3ZhciBuPVZ0KHQsIm9wYWNpdHkiKTtyZXR1cm4iIj09PW4/IjEiOm59fX19LGNzc051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsY29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGdyaWRBcmVhOiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTdGFydDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnt9LHN0eWxlOmZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQmJjMhPT10Lm5vZGVUeXBlJiY4IT09dC5ub2RlVHlwZSYmdC5zdHlsZSl7dmFyIG8saSxhLHM9SyhlKSx1PXRlLnRlc3QoZSksYz10LnN0eWxlO2lmKHV8fChlPVF0KHMpKSxhPVMuY3NzSG9va3NbZV18fFMuY3NzSG9va3Nbc10sdm9pZCAwPT09bilyZXR1cm4gYSYmImdldCJpbiBhJiZ2b2lkIDAhPT0obz1hLmdldCh0LCExLHIpKT9vOmNbZV07InN0cmluZyI9PT0oaT10eXBlb2YgbikmJihvPW90LmV4ZWMobikpJiZvWzFdJiYobj1mdCh0LGUsbyksaT0ibnVtYmVyIiksbnVsbCE9biYmbj09biYmKCJudW1iZXIiIT09aXx8dXx8KG4rPW8mJm9bM118fChTLmNzc051bWJlcltzXT8iIjoicHgiKSkseS5jbGVhckNsb25lU3R5bGV8fCIiIT09bnx8MCE9PWUuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoY1tlXT0iaW5oZXJpdCIpLGEmJiJzZXQiaW4gYSYmdm9pZCAwPT09KG49YS5zZXQodCxuLHIpKXx8KHU/Yy5zZXRQcm9wZXJ0eShlLG4pOmNbZV09bikpfX0sY3NzOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvLGksYSxzPUsoZSk7cmV0dXJuIHRlLnRlc3QoZSl8fChlPVF0KHMpKSwoYT1TLmNzc0hvb2tzW2VdfHxTLmNzc0hvb2tzW3NdKSYmImdldCJpbiBhJiYobz1hLmdldCh0LCEwLG4pKSx2b2lkIDA9PT1vJiYobz1WdCh0LGUscikpLCJub3JtYWwiPT09byYmZSBpbiBuZSYmKG89bmVbZV0pLCIiPT09bnx8bj8oaT1wYXJzZUZsb2F0KG8pLCEwPT09bnx8aXNGaW5pdGUoaSk/aXx8MDpvKTpvfX0pLFMuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24odCxlKXtTLmNzc0hvb2tzW2VdPXtnZXQ6ZnVuY3Rpb24odCxuLHIpe2lmKG4pcmV0dXJuIVp0LnRlc3QoUy5jc3ModCwiZGlzcGxheSIpKXx8dC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aD9pZSh0LGUscik6bHQodCxlZSxmdW5jdGlvbigpe3JldHVybiBpZSh0LGUscil9KX0sc2V0OmZ1bmN0aW9uKHQsbixyKXt2YXIgbyxpPSR0KHQpLGE9IXkuc2Nyb2xsYm94U2l6ZSgpJiYiYWJzb2x1dGUiPT09aS5wb3NpdGlvbixzPShhfHxyKSYmImJvcmRlci1ib3giPT09Uy5jc3ModCwiYm94U2l6aW5nIiwhMSxpKSx1PXI/b2UodCxlLHIscyxpKTowO3JldHVybiBzJiZhJiYodS09TWF0aC5jZWlsKHRbIm9mZnNldCIrZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSldLXBhcnNlRmxvYXQoaVtlXSktb2UodCxlLCJib3JkZXIiLCExLGkpLS41KSksdSYmKG89b3QuZXhlYyhuKSkmJiJweCIhPT0ob1szXXx8InB4IikmJih0LnN0eWxlW2VdPW4sbj1TLmNzcyh0LGUpKSxyZSgwLG4sdSl9fX0pLFMuY3NzSG9va3MubWFyZ2luTGVmdD1HdCh5LnJlbGlhYmxlTWFyZ2luTGVmdCxmdW5jdGlvbih0LGUpe2lmKGUpcmV0dXJuKHBhcnNlRmxvYXQoVnQodCwibWFyZ2luTGVmdCIpKXx8dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LWx0KHQse21hcmdpbkxlZnQ6MH0sZnVuY3Rpb24oKXtyZXR1cm4gdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSkpKyJweCJ9KSxTLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbih0LGUpe1MuY3NzSG9va3NbdCtlXT17ZXhwYW5kOmZ1bmN0aW9uKG4pe2Zvcih2YXIgcj0wLG89e30saT0ic3RyaW5nIj09dHlwZW9mIG4/bi5zcGxpdCgiICIpOltuXTtyPDQ7cisrKW9bdCtpdFtyXStlXT1pW3JdfHxpW3ItMl18fGlbMF07cmV0dXJuIG99fSwibWFyZ2luIiE9PXQmJihTLmNzc0hvb2tzW3QrZV0uc2V0PXJlKX0pLFMuZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24odCxlKXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGk9e30sYT0wO2lmKEFycmF5LmlzQXJyYXkoZSkpe2ZvcihyPSR0KHQpLG89ZS5sZW5ndGg7YTxvO2ErKylpW2VbYV1dPVMuY3NzKHQsZVthXSwhMSxyKTtyZXR1cm4gaX1yZXR1cm4gdm9pZCAwIT09bj9TLnN0eWxlKHQsZSxuKTpTLmNzcyh0LGUpfSx0LGUsYXJndW1lbnRzLmxlbmd0aD4xKX19KSxTLlR3ZWVuPWFlLGFlLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YWUsaW5pdDpmdW5jdGlvbih0LGUsbixyLG8saSl7dGhpcy5lbGVtPXQsdGhpcy5wcm9wPW4sdGhpcy5lYXNpbmc9b3x8Uy5lYXNpbmcuX2RlZmF1bHQsdGhpcy5vcHRpb25zPWUsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPXIsdGhpcy51bml0PWl8fChTLmNzc051bWJlcltuXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIHQ9YWUucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHQmJnQuZ2V0P3QuZ2V0KHRoaXMpOmFlLnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbih0KXt2YXIgZSxuPWFlLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9ZT1TLmVhc2luZ1t0aGlzLmVhc2luZ10odCx0aGlzLm9wdGlvbnMuZHVyYXRpb24qdCwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz1lPXQsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKmUrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksbiYmbi5zZXQ/bi5zZXQodGhpcyk6YWUucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0sYWUucHJvdG90eXBlLmluaXQucHJvdG90eXBlPWFlLnByb3RvdHlwZSxhZS5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIDEhPT10LmVsZW0ubm9kZVR5cGV8fG51bGwhPXQuZWxlbVt0LnByb3BdJiZudWxsPT10LmVsZW0uc3R5bGVbdC5wcm9wXT90LmVsZW1bdC5wcm9wXTooZT1TLmNzcyh0LmVsZW0sdC5wcm9wLCIiKSkmJiJhdXRvIiE9PWU/ZTowfSxzZXQ6ZnVuY3Rpb24odCl7Uy5meC5zdGVwW3QucHJvcF0/Uy5meC5zdGVwW3QucHJvcF0odCk6MSE9PXQuZWxlbS5ub2RlVHlwZXx8IVMuY3NzSG9va3NbdC5wcm9wXSYmbnVsbD09dC5lbGVtLnN0eWxlW1F0KHQucHJvcCldP3QuZWxlbVt0LnByb3BdPXQubm93OlMuc3R5bGUodC5lbGVtLHQucHJvcCx0Lm5vdyt0LnVuaXQpfX19LGFlLnByb3BIb29rcy5zY3JvbGxUb3A9YWUucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbih0KXt0LmVsZW0ubm9kZVR5cGUmJnQuZWxlbS5wYXJlbnROb2RlJiYodC5lbGVtW3QucHJvcF09dC5ub3cpfX0sUy5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbih0KXtyZXR1cm4gdH0sc3dpbmc6ZnVuY3Rpb24odCl7cmV0dXJuLjUtTWF0aC5jb3ModCpNYXRoLlBJKS8yfSxfZGVmYXVsdDoic3dpbmcifSxTLmZ4PWFlLnByb3RvdHlwZS5pbml0LFMuZnguc3RlcD17fTt2YXIgc2UsdWUsY2U9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGxlPS9xdWV1ZUhvb2tzJC87ZnVuY3Rpb24gZmUoKXt1ZSYmKCExPT09YS5oaWRkZW4mJm4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lP24ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZlKTpuLnNldFRpbWVvdXQoZmUsUy5meC5pbnRlcnZhbCksUy5meC50aWNrKCkpfWZ1bmN0aW9uIHBlKCl7cmV0dXJuIG4uc2V0VGltZW91dChmdW5jdGlvbigpe3NlPXZvaWQgMH0pLHNlPURhdGUubm93KCl9ZnVuY3Rpb24gaGUodCxlKXt2YXIgbixyPTAsbz17aGVpZ2h0OnR9O2ZvcihlPWU/MTowO3I8NDtyKz0yLWUpb1sibWFyZ2luIisobj1pdFtyXSldPW9bInBhZGRpbmciK25dPXQ7cmV0dXJuIGUmJihvLm9wYWNpdHk9by53aWR0aD10KSxvfWZ1bmN0aW9uIGRlKHQsZSxuKXtmb3IodmFyIHIsbz0oZ2UudHdlZW5lcnNbZV18fFtdKS5jb25jYXQoZ2UudHdlZW5lcnNbIioiXSksaT0wLGE9by5sZW5ndGg7aTxhO2krKylpZihyPW9baV0uY2FsbChuLGUsdCkpcmV0dXJuIHJ9ZnVuY3Rpb24gZ2UodCxlLG4pe3ZhciByLG8saT0wLGE9Z2UucHJlZmlsdGVycy5sZW5ndGgscz1TLkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIHUuZWxlbX0pLHU9ZnVuY3Rpb24oKXtpZihvKXJldHVybiExO2Zvcih2YXIgZT1zZXx8cGUoKSxuPU1hdGgubWF4KDAsYy5zdGFydFRpbWUrYy5kdXJhdGlvbi1lKSxyPTEtKG4vYy5kdXJhdGlvbnx8MCksaT0wLGE9Yy50d2VlbnMubGVuZ3RoO2k8YTtpKyspYy50d2VlbnNbaV0ucnVuKHIpO3JldHVybiBzLm5vdGlmeVdpdGgodCxbYyxyLG5dKSxyPDEmJmE/bjooYXx8cy5ub3RpZnlXaXRoKHQsW2MsMSwwXSkscy5yZXNvbHZlV2l0aCh0LFtjXSksITEpfSxjPXMucHJvbWlzZSh7ZWxlbTp0LHByb3BzOlMuZXh0ZW5kKHt9LGUpLG9wdHM6Uy5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e30sZWFzaW5nOlMuZWFzaW5nLl9kZWZhdWx0fSxuKSxvcmlnaW5hbFByb3BlcnRpZXM6ZSxvcmlnaW5hbE9wdGlvbnM6bixzdGFydFRpbWU6c2V8fHBlKCksZHVyYXRpb246bi5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oZSxuKXt2YXIgcj1TLlR3ZWVuKHQsYy5vcHRzLGUsbixjLm9wdHMuc3BlY2lhbEVhc2luZ1tlXXx8Yy5vcHRzLmVhc2luZyk7cmV0dXJuIGMudHdlZW5zLnB1c2gocikscn0sc3RvcDpmdW5jdGlvbihlKXt2YXIgbj0wLHI9ZT9jLnR3ZWVucy5sZW5ndGg6MDtpZihvKXJldHVybiB0aGlzO2ZvcihvPSEwO248cjtuKyspYy50d2VlbnNbbl0ucnVuKDEpO3JldHVybiBlPyhzLm5vdGlmeVdpdGgodCxbYywxLDBdKSxzLnJlc29sdmVXaXRoKHQsW2MsZV0pKTpzLnJlamVjdFdpdGgodCxbYyxlXSksdGhpc319KSxsPWMucHJvcHM7Zm9yKCFmdW5jdGlvbih0LGUpe3ZhciBuLHIsbyxpLGE7Zm9yKG4gaW4gdClpZihvPWVbcj1LKG4pXSxpPXRbbl0sQXJyYXkuaXNBcnJheShpKSYmKG89aVsxXSxpPXRbbl09aVswXSksbiE9PXImJih0W3JdPWksZGVsZXRlIHRbbl0pLChhPVMuY3NzSG9va3Nbcl0pJiYiZXhwYW5kImluIGEpZm9yKG4gaW4gaT1hLmV4cGFuZChpKSxkZWxldGUgdFtyXSxpKW4gaW4gdHx8KHRbbl09aVtuXSxlW25dPW8pO2Vsc2UgZVtyXT1vfShsLGMub3B0cy5zcGVjaWFsRWFzaW5nKTtpPGE7aSsrKWlmKHI9Z2UucHJlZmlsdGVyc1tpXS5jYWxsKGMsdCxsLGMub3B0cykpcmV0dXJuIG0oci5zdG9wKSYmKFMuX3F1ZXVlSG9va3MoYy5lbGVtLGMub3B0cy5xdWV1ZSkuc3RvcD1yLnN0b3AuYmluZChyKSkscjtyZXR1cm4gUy5tYXAobCxkZSxjKSxtKGMub3B0cy5zdGFydCkmJmMub3B0cy5zdGFydC5jYWxsKHQsYyksYy5wcm9ncmVzcyhjLm9wdHMucHJvZ3Jlc3MpLmRvbmUoYy5vcHRzLmRvbmUsYy5vcHRzLmNvbXBsZXRlKS5mYWlsKGMub3B0cy5mYWlsKS5hbHdheXMoYy5vcHRzLmFsd2F5cyksUy5meC50aW1lcihTLmV4dGVuZCh1LHtlbGVtOnQsYW5pbTpjLHF1ZXVlOmMub3B0cy5xdWV1ZX0pKSxjfVMuQW5pbWF0aW9uPVMuZXh0ZW5kKGdlLHt0d2VlbmVyczp7IioiOltmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuY3JlYXRlVHdlZW4odCxlKTtyZXR1cm4gZnQobi5lbGVtLHQsb3QuZXhlYyhlKSxuKSxufV19LHR3ZWVuZXI6ZnVuY3Rpb24odCxlKXttKHQpPyhlPXQsdD1bIioiXSk6dD10Lm1hdGNoKFUpO2Zvcih2YXIgbixyPTAsbz10Lmxlbmd0aDtyPG87cisrKW49dFtyXSxnZS50d2VlbmVyc1tuXT1nZS50d2VlbmVyc1tuXXx8W10sZ2UudHdlZW5lcnNbbl0udW5zaGlmdChlKX0scHJlZmlsdGVyczpbZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhLHMsdSxjLGwsZj0id2lkdGgiaW4gZXx8ImhlaWdodCJpbiBlLHA9dGhpcyxoPXt9LGQ9dC5zdHlsZSxnPXQubm9kZVR5cGUmJmN0KHQpLHY9US5nZXQodCwiZnhzaG93Iik7Zm9yKHIgaW4gbi5xdWV1ZXx8KG51bGw9PShhPVMuX3F1ZXVlSG9va3ModCwiZngiKSkudW5xdWV1ZWQmJihhLnVucXVldWVkPTAscz1hLmVtcHR5LmZpcmUsYS5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7YS51bnF1ZXVlZHx8cygpfSksYS51bnF1ZXVlZCsrLHAuYWx3YXlzKGZ1bmN0aW9uKCl7cC5hbHdheXMoZnVuY3Rpb24oKXthLnVucXVldWVkLS0sUy5xdWV1ZSh0LCJmeCIpLmxlbmd0aHx8YS5lbXB0eS5maXJlKCl9KX0pKSxlKWlmKG89ZVtyXSxjZS50ZXN0KG8pKXtpZihkZWxldGUgZVtyXSxpPWl8fCJ0b2dnbGUiPT09byxvPT09KGc/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PW98fCF2fHx2b2lkIDA9PT12W3JdKWNvbnRpbnVlO2c9ITB9aFtyXT12JiZ2W3JdfHxTLnN0eWxlKHQscil9aWYoKHU9IVMuaXNFbXB0eU9iamVjdChlKSl8fCFTLmlzRW1wdHlPYmplY3QoaCkpZm9yKHIgaW4gZiYmMT09PXQubm9kZVR5cGUmJihuLm92ZXJmbG93PVtkLm92ZXJmbG93LGQub3ZlcmZsb3dYLGQub3ZlcmZsb3dZXSxudWxsPT0oYz12JiZ2LmRpc3BsYXkpJiYoYz1RLmdldCh0LCJkaXNwbGF5IikpLCJub25lIj09PShsPVMuY3NzKHQsImRpc3BsYXkiKSkmJihjP2w9YzooZHQoW3RdLCEwKSxjPXQuc3R5bGUuZGlzcGxheXx8YyxsPVMuY3NzKHQsImRpc3BsYXkiKSxkdChbdF0pKSksKCJpbmxpbmUiPT09bHx8ImlubGluZS1ibG9jayI9PT1sJiZudWxsIT1jKSYmIm5vbmUiPT09Uy5jc3ModCwiZmxvYXQiKSYmKHV8fChwLmRvbmUoZnVuY3Rpb24oKXtkLmRpc3BsYXk9Y30pLG51bGw9PWMmJihsPWQuZGlzcGxheSxjPSJub25lIj09PWw/IiI6bCkpLGQuZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLG4ub3ZlcmZsb3cmJihkLm92ZXJmbG93PSJoaWRkZW4iLHAuYWx3YXlzKGZ1bmN0aW9uKCl7ZC5vdmVyZmxvdz1uLm92ZXJmbG93WzBdLGQub3ZlcmZsb3dYPW4ub3ZlcmZsb3dbMV0sZC5vdmVyZmxvd1k9bi5vdmVyZmxvd1syXX0pKSx1PSExLGgpdXx8KHY/ImhpZGRlbiJpbiB2JiYoZz12LmhpZGRlbik6dj1RLmFjY2Vzcyh0LCJmeHNob3ciLHtkaXNwbGF5OmN9KSxpJiYodi5oaWRkZW49IWcpLGcmJmR0KFt0XSwhMCkscC5kb25lKGZ1bmN0aW9uKCl7Zm9yKHIgaW4gZ3x8ZHQoW3RdKSxRLnJlbW92ZSh0LCJmeHNob3ciKSxoKVMuc3R5bGUodCxyLGhbcl0pfSkpLHU9ZGUoZz92W3JdOjAscixwKSxyIGluIHZ8fCh2W3JdPXUuc3RhcnQsZyYmKHUuZW5kPXUuc3RhcnQsdS5zdGFydD0wKSl9XSxwcmVmaWx0ZXI6ZnVuY3Rpb24odCxlKXtlP2dlLnByZWZpbHRlcnMudW5zaGlmdCh0KTpnZS5wcmVmaWx0ZXJzLnB1c2godCl9fSksUy5zcGVlZD1mdW5jdGlvbih0LGUsbil7dmFyIHI9dCYmIm9iamVjdCI9PXR5cGVvZiB0P1MuZXh0ZW5kKHt9LHQpOntjb21wbGV0ZTpufHwhbiYmZXx8bSh0KSYmdCxkdXJhdGlvbjp0LGVhc2luZzpuJiZlfHxlJiYhbShlKSYmZX07cmV0dXJuIFMuZngub2ZmP3IuZHVyYXRpb249MDoibnVtYmVyIiE9dHlwZW9mIHIuZHVyYXRpb24mJihyLmR1cmF0aW9uIGluIFMuZnguc3BlZWRzP3IuZHVyYXRpb249Uy5meC5zcGVlZHNbci5kdXJhdGlvbl06ci5kdXJhdGlvbj1TLmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9ci5xdWV1ZSYmITAhPT1yLnF1ZXVlfHwoci5xdWV1ZT0iZngiKSxyLm9sZD1yLmNvbXBsZXRlLHIuY29tcGxldGU9ZnVuY3Rpb24oKXttKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZTLmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0sUy5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIoY3QpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6ZX0sdCxuLHIpfSxhbmltYXRlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPVMuaXNFbXB0eU9iamVjdCh0KSxpPVMuc3BlZWQoZSxuLHIpLGE9ZnVuY3Rpb24oKXt2YXIgZT1nZSh0aGlzLFMuZXh0ZW5kKHt9LHQpLGkpOyhvfHxRLmdldCh0aGlzLCJmaW5pc2giKSkmJmUuc3RvcCghMCl9O3JldHVybiBhLmZpbmlzaD1hLG98fCExPT09aS5xdWV1ZT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShpLnF1ZXVlLGEpfSxzdG9wOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1mdW5jdGlvbih0KXt2YXIgZT10LnN0b3A7ZGVsZXRlIHQuc3RvcCxlKG4pfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJihuPWUsZT10LHQ9dm9pZCAwKSxlJiYhMSE9PXQmJnRoaXMucXVldWUodHx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9ITAsbz1udWxsIT10JiZ0KyJxdWV1ZUhvb2tzIixpPVMudGltZXJzLGE9US5nZXQodGhpcyk7aWYobylhW29dJiZhW29dLnN0b3AmJnIoYVtvXSk7ZWxzZSBmb3IobyBpbiBhKWFbb10mJmFbb10uc3RvcCYmbGUudGVzdChvKSYmcihhW29dKTtmb3Iobz1pLmxlbmd0aDtvLS07KWlbb10uZWxlbSE9PXRoaXN8fG51bGwhPXQmJmlbb10ucXVldWUhPT10fHwoaVtvXS5hbmltLnN0b3AobiksZT0hMSxpLnNwbGljZShvLDEpKTshZSYmbnx8Uy5kZXF1ZXVlKHRoaXMsdCl9KX0sZmluaXNoOmZ1bmN0aW9uKHQpe3JldHVybiExIT09dCYmKHQ9dHx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsbj1RLmdldCh0aGlzKSxyPW5bdCsicXVldWUiXSxvPW5bdCsicXVldWVIb29rcyJdLGk9Uy50aW1lcnMsYT1yP3IubGVuZ3RoOjA7Zm9yKG4uZmluaXNoPSEwLFMucXVldWUodGhpcyx0LFtdKSxvJiZvLnN0b3AmJm8uc3RvcC5jYWxsKHRoaXMsITApLGU9aS5sZW5ndGg7ZS0tOylpW2VdLmVsZW09PT10aGlzJiZpW2VdLnF1ZXVlPT09dCYmKGlbZV0uYW5pbS5zdG9wKCEwKSxpLnNwbGljZShlLDEpKTtmb3IoZT0wO2U8YTtlKyspcltlXSYmcltlXS5maW5pc2gmJnJbZV0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIG4uZmluaXNofSl9fSksUy5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbih0LGUpe3ZhciBuPVMuZm5bZV07Uy5mbltlXT1mdW5jdGlvbih0LHIsbyl7cmV0dXJuIG51bGw9PXR8fCJib29sZWFuIj09dHlwZW9mIHQ/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGhlKGUsITApLHQscixvKX19KSxTLmVhY2goe3NsaWRlRG93bjpoZSgic2hvdyIpLHNsaWRlVXA6aGUoImhpZGUiKSxzbGlkZVRvZ2dsZTpoZSgidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbih0LGUpe1MuZm5bdF09ZnVuY3Rpb24odCxuLHIpe3JldHVybiB0aGlzLmFuaW1hdGUoZSx0LG4scil9fSksUy50aW1lcnM9W10sUy5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIHQsZT0wLG49Uy50aW1lcnM7Zm9yKHNlPURhdGUubm93KCk7ZTxuLmxlbmd0aDtlKyspKHQ9bltlXSkoKXx8bltlXSE9PXR8fG4uc3BsaWNlKGUtLSwxKTtuLmxlbmd0aHx8Uy5meC5zdG9wKCksc2U9dm9pZCAwfSxTLmZ4LnRpbWVyPWZ1bmN0aW9uKHQpe1MudGltZXJzLnB1c2godCksUy5meC5zdGFydCgpfSxTLmZ4LmludGVydmFsPTEzLFMuZnguc3RhcnQ9ZnVuY3Rpb24oKXt1ZXx8KHVlPSEwLGZlKCkpfSxTLmZ4LnN0b3A9ZnVuY3Rpb24oKXt1ZT1udWxsfSxTLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxTLmZuLmRlbGF5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9Uy5meCYmUy5meC5zcGVlZHNbdF18fHQsZT1lfHwiZngiLHRoaXMucXVldWUoZSxmdW5jdGlvbihlLHIpe3ZhciBvPW4uc2V0VGltZW91dChlLHQpO3Iuc3RvcD1mdW5jdGlvbigpe24uY2xlYXJUaW1lb3V0KG8pfX0pfSxmdW5jdGlvbigpe3ZhciB0PWEuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxlPWEuY3JlYXRlRWxlbWVudCgic2VsZWN0IikuYXBwZW5kQ2hpbGQoYS5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSk7dC50eXBlPSJjaGVja2JveCIseS5jaGVja09uPSIiIT09dC52YWx1ZSx5Lm9wdFNlbGVjdGVkPWUuc2VsZWN0ZWQsKHQ9YS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS52YWx1ZT0idCIsdC50eXBlPSJyYWRpbyIseS5yYWRpb1ZhbHVlPSJ0Ij09PXQudmFsdWV9KCk7dmFyIHZlLHllPVMuZXhwci5hdHRySGFuZGxlO1MuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuICQodGhpcyxTLmF0dHIsdCxlLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1MucmVtb3ZlQXR0cih0aGlzLHQpfSl9fSksUy5leHRlbmQoe2F0dHI6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saT10Lm5vZGVUeXBlO2lmKDMhPT1pJiY4IT09aSYmMiE9PWkpcmV0dXJuIHZvaWQgMD09PXQuZ2V0QXR0cmlidXRlP1MucHJvcCh0LGUsbik6KDE9PT1pJiZTLmlzWE1MRG9jKHQpfHwobz1TLmF0dHJIb29rc1tlLnRvTG93ZXJDYXNlKCldfHwoUy5leHByLm1hdGNoLmJvb2wudGVzdChlKT92ZTp2b2lkIDApKSx2b2lkIDAhPT1uP251bGw9PT1uP3ZvaWQgUy5yZW1vdmVBdHRyKHQsZSk6byYmInNldCJpbiBvJiZ2b2lkIDAhPT0ocj1vLnNldCh0LG4sZSkpP3I6KHQuc2V0QXR0cmlidXRlKGUsbisiIiksbik6byYmImdldCJpbiBvJiZudWxsIT09KHI9by5nZXQodCxlKSk/cjpudWxsPT0ocj1TLmZpbmQuYXR0cih0LGUpKT92b2lkIDA6cil9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKHQsZSl7aWYoIXkucmFkaW9WYWx1ZSYmInJhZGlvIj09PWUmJkwodCwiaW5wdXQiKSl7dmFyIG49dC52YWx1ZTtyZXR1cm4gdC5zZXRBdHRyaWJ1dGUoInR5cGUiLGUpLG4mJih0LnZhbHVlPW4pLGV9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24odCxlKXt2YXIgbixyPTAsbz1lJiZlLm1hdGNoKFUpO2lmKG8mJjE9PT10Lm5vZGVUeXBlKWZvcig7bj1vW3IrK107KXQucmVtb3ZlQXR0cmlidXRlKG4pfX0pLHZlPXtzZXQ6ZnVuY3Rpb24odCxlLG4pe3JldHVybiExPT09ZT9TLnJlbW92ZUF0dHIodCxuKTp0LnNldEF0dHJpYnV0ZShuLG4pLG59fSxTLmVhY2goUy5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cdysvZyksZnVuY3Rpb24odCxlKXt2YXIgbj15ZVtlXXx8Uy5maW5kLmF0dHI7eWVbZV09ZnVuY3Rpb24odCxlLHIpe3ZhciBvLGksYT1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHJ8fChpPXllW2FdLHllW2FdPW8sbz1udWxsIT1uKHQsZSxyKT9hOm51bGwseWVbYV09aSksb319KTt2YXIgbWU9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxiZT0vXig/OmF8YXJlYSkkL2k7ZnVuY3Rpb24geGUodCl7cmV0dXJuKHQubWF0Y2goVSl8fFtdKS5qb2luKCIgIil9ZnVuY3Rpb24gd2UodCl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlJiZ0LmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiJ9ZnVuY3Rpb24ga2UodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dDoic3RyaW5nIj09dHlwZW9mIHQmJnQubWF0Y2goVSl8fFtdfVMuZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKHQsZSl7cmV0dXJuICQodGhpcyxTLnByb3AsdCxlLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW1MucHJvcEZpeFt0XXx8dF19KX19KSxTLmV4dGVuZCh7cHJvcDpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpPXQubm9kZVR5cGU7aWYoMyE9PWkmJjghPT1pJiYyIT09aSlyZXR1cm4gMT09PWkmJlMuaXNYTUxEb2ModCl8fChlPVMucHJvcEZpeFtlXXx8ZSxvPVMucHJvcEhvb2tzW2VdKSx2b2lkIDAhPT1uP28mJiJzZXQiaW4gbyYmdm9pZCAwIT09KHI9by5zZXQodCxuLGUpKT9yOnRbZV09bjpvJiYiZ2V0ImluIG8mJm51bGwhPT0ocj1vLmdldCh0LGUpKT9yOnRbZV19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbih0KXt2YXIgZT1TLmZpbmQuYXR0cih0LCJ0YWJpbmRleCIpO3JldHVybiBlP3BhcnNlSW50KGUsMTApOm1lLnRlc3QodC5ub2RlTmFtZSl8fGJlLnRlc3QodC5ub2RlTmFtZSkmJnQuaHJlZj8wOi0xfX19LHByb3BGaXg6e2ZvcjoiaHRtbEZvciIsY2xhc3M6ImNsYXNzTmFtZSJ9fSkseS5vcHRTZWxlY3RlZHx8KFMucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5wYXJlbnROb2RlO3JldHVybiBlJiZlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LG51bGx9LHNldDpmdW5jdGlvbih0KXt2YXIgZT10LnBhcmVudE5vZGU7ZSYmKGUuc2VsZWN0ZWRJbmRleCxlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KX19KSxTLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe1MucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxTLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG8saSxhLHMsdT0wO2lmKG0odCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLmFkZENsYXNzKHQuY2FsbCh0aGlzLGUsd2UodGhpcykpKX0pO2lmKChlPWtlKHQpKS5sZW5ndGgpZm9yKDtuPXRoaXNbdSsrXTspaWYobz13ZShuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIreGUobykrIiAiKXtmb3IoYT0wO2k9ZVthKytdOylyLmluZGV4T2YoIiAiK2krIiAiKTwwJiYocis9aSsiICIpO28hPT0ocz14ZShyKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYSxzLHU9MDtpZihtKHQpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS5yZW1vdmVDbGFzcyh0LmNhbGwodGhpcyxlLHdlKHRoaXMpKSl9KTtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5hdHRyKCJjbGFzcyIsIiIpO2lmKChlPWtlKHQpKS5sZW5ndGgpZm9yKDtuPXRoaXNbdSsrXTspaWYobz13ZShuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIreGUobykrIiAiKXtmb3IoYT0wO2k9ZVthKytdOylmb3IoO3IuaW5kZXhPZigiICIraSsiICIpPi0xOylyPXIucmVwbGFjZSgiICIraSsiICIsIiAiKTtvIT09KHM9eGUocikpJiZuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpfXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbih0LGUpe3ZhciBuPXR5cGVvZiB0LHI9InN0cmluZyI9PT1ufHxBcnJheS5pc0FycmF5KHQpO3JldHVybiJib29sZWFuIj09dHlwZW9mIGUmJnI/ZT90aGlzLmFkZENsYXNzKHQpOnRoaXMucmVtb3ZlQ2xhc3ModCk6bSh0KT90aGlzLmVhY2goZnVuY3Rpb24obil7Uyh0aGlzKS50b2dnbGVDbGFzcyh0LmNhbGwodGhpcyxuLHdlKHRoaXMpLGUpLGUpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsbyxpLGE7aWYocilmb3Iobz0wLGk9Uyh0aGlzKSxhPWtlKHQpO2U9YVtvKytdOylpLmhhc0NsYXNzKGUpP2kucmVtb3ZlQ2xhc3MoZSk6aS5hZGRDbGFzcyhlKTtlbHNlIHZvaWQgMCE9PXQmJiJib29sZWFuIiE9PW58fCgoZT13ZSh0aGlzKSkmJlEuc2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iLGUpLHRoaXMuc2V0QXR0cmlidXRlJiZ0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGV8fCExPT09dD8iIjpRLmdldCh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyPTA7Zm9yKGU9IiAiK3QrIiAiO249dGhpc1tyKytdOylpZigxPT09bi5ub2RlVHlwZSYmKCIgIit4ZSh3ZShuKSkrIiAiKS5pbmRleE9mKGUpPi0xKXJldHVybiEwO3JldHVybiExfX0pO3ZhciBTZT0vXHIvZztTLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvPXRoaXNbMF07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bSh0KSx0aGlzLmVhY2goZnVuY3Rpb24obil7dmFyIG87MT09PXRoaXMubm9kZVR5cGUmJihudWxsPT0obz1yP3QuY2FsbCh0aGlzLG4sUyh0aGlzKS52YWwoKSk6dCk/bz0iIjoibnVtYmVyIj09dHlwZW9mIG8/bys9IiI6QXJyYXkuaXNBcnJheShvKSYmKG89Uy5tYXAobyxmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8iIjp0KyIifSkpLChlPVMudmFsSG9va3NbdGhpcy50eXBlXXx8Uy52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmInNldCJpbiBlJiZ2b2lkIDAhPT1lLnNldCh0aGlzLG8sInZhbHVlIil8fCh0aGlzLnZhbHVlPW8pKX0pKTpvPyhlPVMudmFsSG9va3Nbby50eXBlXXx8Uy52YWxIb29rc1tvLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmImdldCJpbiBlJiZ2b2lkIDAhPT0obj1lLmdldChvLCJ2YWx1ZSIpKT9uOiJzdHJpbmciPT10eXBlb2Yobj1vLnZhbHVlKT9uLnJlcGxhY2UoU2UsIiIpOm51bGw9PW4/IiI6bjp2b2lkIDB9fSksUy5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbih0KXt2YXIgZT1TLmZpbmQuYXR0cih0LCJ2YWx1ZSIpO3JldHVybiBudWxsIT1lP2U6eGUoUy50ZXh0KHQpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvPXQub3B0aW9ucyxpPXQuc2VsZWN0ZWRJbmRleCxhPSJzZWxlY3Qtb25lIj09PXQudHlwZSxzPWE/bnVsbDpbXSx1PWE/aSsxOm8ubGVuZ3RoO2ZvcihyPWk8MD91OmE/aTowO3I8dTtyKyspaWYoKChuPW9bcl0pLnNlbGVjdGVkfHxyPT09aSkmJiFuLmRpc2FibGVkJiYoIW4ucGFyZW50Tm9kZS5kaXNhYmxlZHx8IUwobi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYoZT1TKG4pLnZhbCgpLGEpcmV0dXJuIGU7cy5wdXNoKGUpfXJldHVybiBzfSxzZXQ6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4scixvPXQub3B0aW9ucyxpPVMubWFrZUFycmF5KGUpLGE9by5sZW5ndGg7YS0tOykoKHI9b1thXSkuc2VsZWN0ZWQ9Uy5pbkFycmF5KFMudmFsSG9va3Mub3B0aW9uLmdldChyKSxpKT4tMSkmJihuPSEwKTtyZXR1cm4gbnx8KHQuc2VsZWN0ZWRJbmRleD0tMSksaX19fX0pLFMuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe1MudmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIHQuY2hlY2tlZD1TLmluQXJyYXkoUyh0KS52YWwoKSxlKT4tMX19LHkuY2hlY2tPbnx8KFMudmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dC5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjp0LnZhbHVlfSl9KSx5LmZvY3VzaW49Im9uZm9jdXNpbiJpbiBuO3ZhciBFZT0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8samU9ZnVuY3Rpb24odCl7dC5zdG9wUHJvcGFnYXRpb24oKX07Uy5leHRlbmQoUy5ldmVudCx7dHJpZ2dlcjpmdW5jdGlvbih0LGUscixvKXt2YXIgaSxzLHUsYyxsLGYscCxoLGc9W3J8fGFdLHY9ZC5jYWxsKHQsInR5cGUiKT90LnR5cGU6dCx5PWQuY2FsbCh0LCJuYW1lc3BhY2UiKT90Lm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKHM9aD11PXI9cnx8YSwzIT09ci5ub2RlVHlwZSYmOCE9PXIubm9kZVR5cGUmJiFFZS50ZXN0KHYrUy5ldmVudC50cmlnZ2VyZWQpJiYodi5pbmRleE9mKCIuIik+LTEmJih5PXYuc3BsaXQoIi4iKSx2PXkuc2hpZnQoKSx5LnNvcnQoKSksbD12LmluZGV4T2YoIjoiKTwwJiYib24iK3YsKHQ9dFtTLmV4cGFuZG9dP3Q6bmV3IFMuRXZlbnQodiwib2JqZWN0Ij09dHlwZW9mIHQmJnQpKS5pc1RyaWdnZXI9bz8yOjMsdC5uYW1lc3BhY2U9eS5qb2luKCIuIiksdC5ybmFtZXNwYWNlPXQubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3kuam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCx0LnJlc3VsdD12b2lkIDAsdC50YXJnZXR8fCh0LnRhcmdldD1yKSxlPW51bGw9PWU/W3RdOlMubWFrZUFycmF5KGUsW3RdKSxwPVMuZXZlbnQuc3BlY2lhbFt2XXx8e30sb3x8IXAudHJpZ2dlcnx8ITEhPT1wLnRyaWdnZXIuYXBwbHkocixlKSkpe2lmKCFvJiYhcC5ub0J1YmJsZSYmIWIocikpe2ZvcihjPXAuZGVsZWdhdGVUeXBlfHx2LEVlLnRlc3QoYyt2KXx8KHM9cy5wYXJlbnROb2RlKTtzO3M9cy5wYXJlbnROb2RlKWcucHVzaChzKSx1PXM7dT09PShyLm93bmVyRG9jdW1lbnR8fGEpJiZnLnB1c2godS5kZWZhdWx0Vmlld3x8dS5wYXJlbnRXaW5kb3d8fG4pfWZvcihpPTA7KHM9Z1tpKytdKSYmIXQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTspaD1zLHQudHlwZT1pPjE/YzpwLmJpbmRUeXBlfHx2LChmPShRLmdldChzLCJldmVudHMiKXx8e30pW3QudHlwZV0mJlEuZ2V0KHMsImhhbmRsZSIpKSYmZi5hcHBseShzLGUpLChmPWwmJnNbbF0pJiZmLmFwcGx5JiZYKHMpJiYodC5yZXN1bHQ9Zi5hcHBseShzLGUpLCExPT09dC5yZXN1bHQmJnQucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIHQudHlwZT12LG98fHQuaXNEZWZhdWx0UHJldmVudGVkKCl8fHAuX2RlZmF1bHQmJiExIT09cC5fZGVmYXVsdC5hcHBseShnLnBvcCgpLGUpfHwhWChyKXx8bCYmbShyW3ZdKSYmIWIocikmJigodT1yW2xdKSYmKHJbbF09bnVsbCksUy5ldmVudC50cmlnZ2VyZWQ9dix0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmguYWRkRXZlbnRMaXN0ZW5lcih2LGplKSxyW3ZdKCksdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZoLnJlbW92ZUV2ZW50TGlzdGVuZXIodixqZSksUy5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwLHUmJihyW2xdPXUpKSx0LnJlc3VsdH19LHNpbXVsYXRlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1TLmV4dGVuZChuZXcgUy5FdmVudCxuLHt0eXBlOnQsaXNTaW11bGF0ZWQ6ITB9KTtTLmV2ZW50LnRyaWdnZXIocixudWxsLGUpfX0pLFMuZm4uZXh0ZW5kKHt0cmlnZ2VyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQudHJpZ2dlcih0LGUsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzWzBdO2lmKG4pcmV0dXJuIFMuZXZlbnQudHJpZ2dlcih0LGUsbiwhMCl9fSkseS5mb2N1c2lufHxTLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKHQsZSl7dmFyIG49ZnVuY3Rpb24odCl7Uy5ldmVudC5zaW11bGF0ZShlLHQudGFyZ2V0LFMuZXZlbnQuZml4KHQpKX07Uy5ldmVudC5zcGVjaWFsW2VdPXtzZXR1cDpmdW5jdGlvbigpe3ZhciByPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxvPVEuYWNjZXNzKHIsZSk7b3x8ci5hZGRFdmVudExpc3RlbmVyKHQsbiwhMCksUS5hY2Nlc3MocixlLChvfHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgcj10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsbz1RLmFjY2VzcyhyLGUpLTE7bz9RLmFjY2VzcyhyLGUsbyk6KHIucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4sITApLFEucmVtb3ZlKHIsZSkpfX19KTt2YXIgVGU9bi5sb2NhdGlvbixPZT1EYXRlLm5vdygpLEFlPS9cPy87Uy5wYXJzZVhNTD1mdW5jdGlvbih0KXt2YXIgZTtpZighdHx8InN0cmluZyIhPXR5cGVvZiB0KXJldHVybiBudWxsO3RyeXtlPShuZXcgbi5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyh0LCJ0ZXh0L3htbCIpfWNhdGNoKHQpe2U9dm9pZCAwfXJldHVybiBlJiYhZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGh8fFMuZXJyb3IoIkludmFsaWQgWE1MOiAiK3QpLGV9O3ZhciBDZT0vXFtcXSQvLExlPS9ccj9cbi9nLFJlPS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxQZT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7ZnVuY3Rpb24gTmUodCxlLG4scil7dmFyIG87aWYoQXJyYXkuaXNBcnJheShlKSlTLmVhY2goZSxmdW5jdGlvbihlLG8pe258fENlLnRlc3QodCk/cih0LG8pOk5lKHQrIlsiKygib2JqZWN0Ij09dHlwZW9mIG8mJm51bGwhPW8/ZToiIikrIl0iLG8sbixyKX0pO2Vsc2UgaWYobnx8Im9iamVjdCIhPT1rKGUpKXIodCxlKTtlbHNlIGZvcihvIGluIGUpTmUodCsiWyIrbysiXSIsZVtvXSxuLHIpfVMucGFyYW09ZnVuY3Rpb24odCxlKXt2YXIgbixyPVtdLG89ZnVuY3Rpb24odCxlKXt2YXIgbj1tKGUpP2UoKTplO3Jbci5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudCh0KSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KG51bGw9PW4/IiI6bil9O2lmKG51bGw9PXQpcmV0dXJuIiI7aWYoQXJyYXkuaXNBcnJheSh0KXx8dC5qcXVlcnkmJiFTLmlzUGxhaW5PYmplY3QodCkpUy5lYWNoKHQsZnVuY3Rpb24oKXtvKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKG4gaW4gdClOZShuLHRbbl0sZSxvKTtyZXR1cm4gci5qb2luKCImIil9LFMuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gUy5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciB0PVMucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiB0P1MubWFrZUFycmF5KHQpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgdD10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIVModGhpcykuaXMoIjpkaXNhYmxlZCIpJiZQZS50ZXN0KHRoaXMubm9kZU5hbWUpJiYhUmUudGVzdCh0KSYmKHRoaXMuY2hlY2tlZHx8IWd0LnRlc3QodCkpfSkubWFwKGZ1bmN0aW9uKHQsZSl7dmFyIG49Uyh0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09bj9udWxsOkFycmF5LmlzQXJyYXkobik/Uy5tYXAobixmdW5jdGlvbih0KXtyZXR1cm57bmFtZTplLm5hbWUsdmFsdWU6dC5yZXBsYWNlKExlLCJcclxuIil9fSk6e25hbWU6ZS5uYW1lLHZhbHVlOm4ucmVwbGFjZShMZSwiXHJcbiIpfX0pLmdldCgpfX0pO3ZhciBJZT0vJTIwL2csX2U9LyMuKiQvLERlPS8oWz8mXSlfPVteJl0qLyxNZT0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLFVlPS9eKD86R0VUfEhFQUQpJC8sQmU9L15cL1wvLyxxZT17fSxGZT17fSxIZT0iKi8iLmNvbmNhdCgiKiIpLHplPWEuY3JlYXRlRWxlbWVudCgiYSIpO2Z1bmN0aW9uIFdlKHQpe3JldHVybiBmdW5jdGlvbihlLG4peyJzdHJpbmciIT10eXBlb2YgZSYmKG49ZSxlPSIqIik7dmFyIHIsbz0wLGk9ZS50b0xvd2VyQ2FzZSgpLm1hdGNoKFUpfHxbXTtpZihtKG4pKWZvcig7cj1pW28rK107KSIrIj09PXJbMF0/KHI9ci5zbGljZSgxKXx8IioiLCh0W3JdPXRbcl18fFtdKS51bnNoaWZ0KG4pKToodFtyXT10W3JdfHxbXSkucHVzaChuKX19ZnVuY3Rpb24gJGUodCxlLG4scil7dmFyIG89e30saT10PT09RmU7ZnVuY3Rpb24gYShzKXt2YXIgdTtyZXR1cm4gb1tzXT0hMCxTLmVhY2godFtzXXx8W10sZnVuY3Rpb24odCxzKXt2YXIgYz1zKGUsbixyKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGN8fGl8fG9bY10/aT8hKHU9Yyk6dm9pZCAwOihlLmRhdGFUeXBlcy51bnNoaWZ0KGMpLGEoYyksITEpfSksdX1yZXR1cm4gYShlLmRhdGFUeXBlc1swXSl8fCFvWyIqIl0mJmEoIioiKX1mdW5jdGlvbiBZZSh0LGUpe3ZhciBuLHIsbz1TLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKG4gaW4gZSl2b2lkIDAhPT1lW25dJiYoKG9bbl0/dDpyfHwocj17fSkpW25dPWVbbl0pO3JldHVybiByJiZTLmV4dGVuZCghMCx0LHIpLHR9emUuaHJlZj1UZS5ocmVmLFMuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4U2V0dGluZ3M6e3VybDpUZS5ocmVmLHR5cGU6IkdFVCIsaXNMb2NhbDovXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLy50ZXN0KFRlLnByb3RvY29sKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsYWNjZXB0czp7IioiOkhlLHRleHQ6InRleHQvcGxhaW4iLGh0bWw6InRleHQvaHRtbCIseG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQifSxjb250ZW50czp7eG1sOi9cYnhtbFxiLyxodG1sOi9cYmh0bWwvLGpzb246L1xianNvblxiL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCIsanNvbjoicmVzcG9uc2VKU09OIn0sY29udmVydGVyczp7IiogdGV4dCI6U3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOkpTT04ucGFyc2UsInRleHQgeG1sIjpTLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT9ZZShZZSh0LFMuYWpheFNldHRpbmdzKSxlKTpZZShTLmFqYXhTZXR0aW5ncyx0KX0sYWpheFByZWZpbHRlcjpXZShxZSksYWpheFRyYW5zcG9ydDpXZShGZSksYWpheDpmdW5jdGlvbih0LGUpeyJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksZT1lfHx7fTt2YXIgcixvLGkscyx1LGMsbCxmLHAsaCxkPVMuYWpheFNldHVwKHt9LGUpLGc9ZC5jb250ZXh0fHxkLHY9ZC5jb250ZXh0JiYoZy5ub2RlVHlwZXx8Zy5qcXVlcnkpP1MoZyk6Uy5ldmVudCx5PVMuRGVmZXJyZWQoKSxtPVMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGI9ZC5zdGF0dXNDb2RlfHx7fSx4PXt9LHc9e30saz0iY2FuY2VsZWQiLEU9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbih0KXt2YXIgZTtpZihsKXtpZighcylmb3Iocz17fTtlPU1lLmV4ZWMoaSk7KXNbZVsxXS50b0xvd2VyQ2FzZSgpKyIgIl09KHNbZVsxXS50b0xvd2VyQ2FzZSgpKyIgIl18fFtdKS5jb25jYXQoZVsyXSk7ZT1zW3QudG9Mb3dlckNhc2UoKSsiICJdfXJldHVybiBudWxsPT1lP251bGw6ZS5qb2luKCIsICIpfSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gbD9pOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09bCYmKHQ9d1t0LnRvTG93ZXJDYXNlKCldPXdbdC50b0xvd2VyQ2FzZSgpXXx8dCx4W3RdPWUpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PWwmJihkLm1pbWVUeXBlPXQpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24odCl7dmFyIGU7aWYodClpZihsKUUuYWx3YXlzKHRbRS5zdGF0dXNdKTtlbHNlIGZvcihlIGluIHQpYltlXT1bYltlXSx0W2VdXTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24odCl7dmFyIGU9dHx8aztyZXR1cm4gciYmci5hYm9ydChlKSxqKDAsZSksdGhpc319O2lmKHkucHJvbWlzZShFKSxkLnVybD0oKHR8fGQudXJsfHxUZS5ocmVmKSsiIikucmVwbGFjZShCZSxUZS5wcm90b2NvbCsiLy8iKSxkLnR5cGU9ZS5tZXRob2R8fGUudHlwZXx8ZC5tZXRob2R8fGQudHlwZSxkLmRhdGFUeXBlcz0oZC5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKFUpfHxbIiJdLG51bGw9PWQuY3Jvc3NEb21haW4pe2M9YS5jcmVhdGVFbGVtZW50KCJhIik7dHJ5e2MuaHJlZj1kLnVybCxjLmhyZWY9Yy5ocmVmLGQuY3Jvc3NEb21haW49emUucHJvdG9jb2wrIi8vIit6ZS5ob3N0IT1jLnByb3RvY29sKyIvLyIrYy5ob3N0fWNhdGNoKHQpe2QuY3Jvc3NEb21haW49ITB9fWlmKGQuZGF0YSYmZC5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiBkLmRhdGEmJihkLmRhdGE9Uy5wYXJhbShkLmRhdGEsZC50cmFkaXRpb25hbCkpLCRlKHFlLGQsZSxFKSxsKXJldHVybiBFO2ZvcihwIGluKGY9Uy5ldmVudCYmZC5nbG9iYWwpJiYwPT1TLmFjdGl2ZSsrJiZTLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLGQudHlwZT1kLnR5cGUudG9VcHBlckNhc2UoKSxkLmhhc0NvbnRlbnQ9IVVlLnRlc3QoZC50eXBlKSxvPWQudXJsLnJlcGxhY2UoX2UsIiIpLGQuaGFzQ29udGVudD9kLmRhdGEmJmQucHJvY2Vzc0RhdGEmJjA9PT0oZC5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYoZC5kYXRhPWQuZGF0YS5yZXBsYWNlKEllLCIrIikpOihoPWQudXJsLnNsaWNlKG8ubGVuZ3RoKSxkLmRhdGEmJihkLnByb2Nlc3NEYXRhfHwic3RyaW5nIj09dHlwZW9mIGQuZGF0YSkmJihvKz0oQWUudGVzdChvKT8iJiI6Ij8iKStkLmRhdGEsZGVsZXRlIGQuZGF0YSksITE9PT1kLmNhY2hlJiYobz1vLnJlcGxhY2UoRGUsIiQxIiksaD0oQWUudGVzdChvKT8iJiI6Ij8iKSsiXz0iK09lKysraCksZC51cmw9bytoKSxkLmlmTW9kaWZpZWQmJihTLmxhc3RNb2RpZmllZFtvXSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsUy5sYXN0TW9kaWZpZWRbb10pLFMuZXRhZ1tvXSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixTLmV0YWdbb10pKSwoZC5kYXRhJiZkLmhhc0NvbnRlbnQmJiExIT09ZC5jb250ZW50VHlwZXx8ZS5jb250ZW50VHlwZSkmJkUuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixkLmNvbnRlbnRUeXBlKSxFLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsZC5kYXRhVHlwZXNbMF0mJmQuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0/ZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXSsoIioiIT09ZC5kYXRhVHlwZXNbMF0/IiwgIitIZSsiOyBxPTAuMDEiOiIiKTpkLmFjY2VwdHNbIioiXSksZC5oZWFkZXJzKUUuc2V0UmVxdWVzdEhlYWRlcihwLGQuaGVhZGVyc1twXSk7aWYoZC5iZWZvcmVTZW5kJiYoITE9PT1kLmJlZm9yZVNlbmQuY2FsbChnLEUsZCl8fGwpKXJldHVybiBFLmFib3J0KCk7aWYoaz0iYWJvcnQiLG0uYWRkKGQuY29tcGxldGUpLEUuZG9uZShkLnN1Y2Nlc3MpLEUuZmFpbChkLmVycm9yKSxyPSRlKEZlLGQsZSxFKSl7aWYoRS5yZWFkeVN0YXRlPTEsZiYmdi50cmlnZ2VyKCJhamF4U2VuZCIsW0UsZF0pLGwpcmV0dXJuIEU7ZC5hc3luYyYmZC50aW1lb3V0PjAmJih1PW4uc2V0VGltZW91dChmdW5jdGlvbigpe0UuYWJvcnQoInRpbWVvdXQiKX0sZC50aW1lb3V0KSk7dHJ5e2w9ITEsci5zZW5kKHgsail9Y2F0Y2godCl7aWYobCl0aHJvdyB0O2ooLTEsdCl9fWVsc2UgaigtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24gaih0LGUsYSxzKXt2YXIgYyxwLGgseCx3LGs9ZTtsfHwobD0hMCx1JiZuLmNsZWFyVGltZW91dCh1KSxyPXZvaWQgMCxpPXN8fCIiLEUucmVhZHlTdGF0ZT10PjA/NDowLGM9dD49MjAwJiZ0PDMwMHx8MzA0PT09dCxhJiYoeD1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLG8saSxhLHM9dC5jb250ZW50cyx1PXQuZGF0YVR5cGVzOyIqIj09PXVbMF07KXUuc2hpZnQoKSx2b2lkIDA9PT1yJiYocj10Lm1pbWVUeXBlfHxlLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYocilmb3IobyBpbiBzKWlmKHNbb10mJnNbb10udGVzdChyKSl7dS51bnNoaWZ0KG8pO2JyZWFrfWlmKHVbMF1pbiBuKWk9dVswXTtlbHNle2ZvcihvIGluIG4pe2lmKCF1WzBdfHx0LmNvbnZlcnRlcnNbbysiICIrdVswXV0pe2k9bzticmVha31hfHwoYT1vKX1pPWl8fGF9aWYoaSlyZXR1cm4gaSE9PXVbMF0mJnUudW5zaGlmdChpKSxuW2ldfShkLEUsYSkpLHg9ZnVuY3Rpb24odCxlLG4scil7dmFyIG8saSxhLHMsdSxjPXt9LGw9dC5kYXRhVHlwZXMuc2xpY2UoKTtpZihsWzFdKWZvcihhIGluIHQuY29udmVydGVycyljW2EudG9Mb3dlckNhc2UoKV09dC5jb252ZXJ0ZXJzW2FdO2ZvcihpPWwuc2hpZnQoKTtpOylpZih0LnJlc3BvbnNlRmllbGRzW2ldJiYoblt0LnJlc3BvbnNlRmllbGRzW2ldXT1lKSwhdSYmciYmdC5kYXRhRmlsdGVyJiYoZT10LmRhdGFGaWx0ZXIoZSx0LmRhdGFUeXBlKSksdT1pLGk9bC5zaGlmdCgpKWlmKCIqIj09PWkpaT11O2Vsc2UgaWYoIioiIT09dSYmdSE9PWkpe2lmKCEoYT1jW3UrIiAiK2ldfHxjWyIqICIraV0pKWZvcihvIGluIGMpaWYoKHM9by5zcGxpdCgiICIpKVsxXT09PWkmJihhPWNbdSsiICIrc1swXV18fGNbIiogIitzWzBdXSkpeyEwPT09YT9hPWNbb106ITAhPT1jW29dJiYoaT1zWzBdLGwudW5zaGlmdChzWzFdKSk7YnJlYWt9aWYoITAhPT1hKWlmKGEmJnQudGhyb3dzKWU9YShlKTtlbHNlIHRyeXtlPWEoZSl9Y2F0Y2godCl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6YT90OiJObyBjb252ZXJzaW9uIGZyb20gIit1KyIgdG8gIitpfX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOmV9fShkLHgsRSxjKSxjPyhkLmlmTW9kaWZpZWQmJigodz1FLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIikpJiYoUy5sYXN0TW9kaWZpZWRbb109dyksKHc9RS5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpKSYmKFMuZXRhZ1tvXT13KSksMjA0PT09dHx8IkhFQUQiPT09ZC50eXBlP2s9Im5vY29udGVudCI6MzA0PT09dD9rPSJub3Rtb2RpZmllZCI6KGs9eC5zdGF0ZSxwPXguZGF0YSxjPSEoaD14LmVycm9yKSkpOihoPWssIXQmJmt8fChrPSJlcnJvciIsdDwwJiYodD0wKSkpLEUuc3RhdHVzPXQsRS5zdGF0dXNUZXh0PShlfHxrKSsiIixjP3kucmVzb2x2ZVdpdGgoZyxbcCxrLEVdKTp5LnJlamVjdFdpdGgoZyxbRSxrLGhdKSxFLnN0YXR1c0NvZGUoYiksYj12b2lkIDAsZiYmdi50cmlnZ2VyKGM/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbRSxkLGM/cDpoXSksbS5maXJlV2l0aChnLFtFLGtdKSxmJiYodi50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFtFLGRdKSwtLVMuYWN0aXZlfHxTLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gRX0sZ2V0SlNPTjpmdW5jdGlvbih0LGUsbil7cmV0dXJuIFMuZ2V0KHQsZSxuLCJqc29uIil9LGdldFNjcmlwdDpmdW5jdGlvbih0LGUpe3JldHVybiBTLmdldCh0LHZvaWQgMCxlLCJzY3JpcHQiKX19KSxTLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24odCxlKXtTW2VdPWZ1bmN0aW9uKHQsbixyLG8pe3JldHVybiBtKG4pJiYobz1vfHxyLHI9bixuPXZvaWQgMCksUy5hamF4KFMuZXh0ZW5kKHt1cmw6dCx0eXBlOmUsZGF0YVR5cGU6byxkYXRhOm4sc3VjY2VzczpyfSxTLmlzUGxhaW5PYmplY3QodCkmJnQpKX19KSxTLl9ldmFsVXJsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFMuYWpheCh7dXJsOnQsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0IixjYWNoZTohMCxhc3luYzohMSxnbG9iYWw6ITEsY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbigpe319LGRhdGFGaWx0ZXI6ZnVuY3Rpb24odCl7Uy5nbG9iYWxFdmFsKHQsZSl9fSl9LFMuZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiB0aGlzWzBdJiYobSh0KSYmKHQ9dC5jYWxsKHRoaXNbMF0pKSxlPVModCx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJmUuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGUubWFwKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXM7dC5maXJzdEVsZW1lbnRDaGlsZDspdD10LmZpcnN0RWxlbWVudENoaWxkO3JldHVybiB0fSkuYXBwZW5kKHRoaXMpKSx0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG0odCk/dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1ModGhpcykud3JhcElubmVyKHQuY2FsbCh0aGlzLGUpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPVModGhpcyksbj1lLmNvbnRlbnRzKCk7bi5sZW5ndGg/bi53cmFwQWxsKHQpOmUuYXBwZW5kKHQpfSl9LHdyYXA6ZnVuY3Rpb24odCl7dmFyIGU9bSh0KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe1ModGhpcykud3JhcEFsbChlP3QuY2FsbCh0aGlzLG4pOnQpfSl9LHVud3JhcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wYXJlbnQodCkubm90KCJib2R5IikuZWFjaChmdW5jdGlvbigpe1ModGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLHRoaXN9fSksUy5leHByLnBzZXVkb3MuaGlkZGVuPWZ1bmN0aW9uKHQpe3JldHVybiFTLmV4cHIucHNldWRvcy52aXNpYmxlKHQpfSxTLmV4cHIucHNldWRvcy52aXNpYmxlPWZ1bmN0aW9uKHQpe3JldHVybiEhKHQub2Zmc2V0V2lkdGh8fHQub2Zmc2V0SGVpZ2h0fHx0LmdldENsaWVudFJlY3RzKCkubGVuZ3RoKX0sUy5hamF4U2V0dGluZ3MueGhyPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBuZXcgbi5YTUxIdHRwUmVxdWVzdH1jYXRjaCh0KXt9fTt2YXIgVmU9ezA6MjAwLDEyMjM6MjA0fSxHZT1TLmFqYXhTZXR0aW5ncy54aHIoKTt5LmNvcnM9ISFHZSYmIndpdGhDcmVkZW50aWFscyJpbiBHZSx5LmFqYXg9R2U9ISFHZSxTLmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24odCl7dmFyIGUscjtpZih5LmNvcnN8fEdlJiYhdC5jcm9zc0RvbWFpbilyZXR1cm57c2VuZDpmdW5jdGlvbihvLGkpe3ZhciBhLHM9dC54aHIoKTtpZihzLm9wZW4odC50eXBlLHQudXJsLHQuYXN5bmMsdC51c2VybmFtZSx0LnBhc3N3b3JkKSx0LnhockZpZWxkcylmb3IoYSBpbiB0LnhockZpZWxkcylzW2FdPXQueGhyRmllbGRzW2FdO2ZvcihhIGluIHQubWltZVR5cGUmJnMub3ZlcnJpZGVNaW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlKHQubWltZVR5cGUpLHQuY3Jvc3NEb21haW58fG9bIlgtUmVxdWVzdGVkLVdpdGgiXXx8KG9bIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKSxvKXMuc2V0UmVxdWVzdEhlYWRlcihhLG9bYV0pO2U9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZSYmKGU9cj1zLm9ubG9hZD1zLm9uZXJyb3I9cy5vbmFib3J0PXMub250aW1lb3V0PXMub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsImFib3J0Ij09PXQ/cy5hYm9ydCgpOiJlcnJvciI9PT10PyJudW1iZXIiIT10eXBlb2Ygcy5zdGF0dXM/aSgwLCJlcnJvciIpOmkocy5zdGF0dXMscy5zdGF0dXNUZXh0KTppKFZlW3Muc3RhdHVzXXx8cy5zdGF0dXMscy5zdGF0dXNUZXh0LCJ0ZXh0IiE9PShzLnJlc3BvbnNlVHlwZXx8InRleHQiKXx8InN0cmluZyIhPXR5cGVvZiBzLnJlc3BvbnNlVGV4dD97YmluYXJ5OnMucmVzcG9uc2V9Ont0ZXh0OnMucmVzcG9uc2VUZXh0fSxzLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSl9fSxzLm9ubG9hZD1lKCkscj1zLm9uZXJyb3I9cy5vbnRpbWVvdXQ9ZSgiZXJyb3IiKSx2b2lkIDAhPT1zLm9uYWJvcnQ/cy5vbmFib3J0PXI6cy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXs0PT09cy5yZWFkeVN0YXRlJiZuLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlJiZyKCl9KX0sZT1lKCJhYm9ydCIpO3RyeXtzLnNlbmQodC5oYXNDb250ZW50JiZ0LmRhdGF8fG51bGwpfWNhdGNoKHQpe2lmKGUpdGhyb3cgdH19LGFib3J0OmZ1bmN0aW9uKCl7ZSYmZSgpfX19KSxTLmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24odCl7dC5jcm9zc0RvbWFpbiYmKHQuY29udGVudHMuc2NyaXB0PSExKX0pLFMuYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovXGIoPzpqYXZhfGVjbWEpc2NyaXB0XGIvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKHQpe3JldHVybiBTLmdsb2JhbEV2YWwodCksdH19fSksUy5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKHQpe3ZvaWQgMD09PXQuY2FjaGUmJih0LmNhY2hlPSExKSx0LmNyb3NzRG9tYWluJiYodC50eXBlPSJHRVQiKX0pLFMuYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbih0KXt2YXIgZSxuO2lmKHQuY3Jvc3NEb21haW58fHQuc2NyaXB0QXR0cnMpcmV0dXJue3NlbmQ6ZnVuY3Rpb24ocixvKXtlPVMoIjxzY3JpcHQ+IikuYXR0cih0LnNjcmlwdEF0dHJzfHx7fSkucHJvcCh7Y2hhcnNldDp0LnNjcmlwdENoYXJzZXQsc3JjOnQudXJsfSkub24oImxvYWQgZXJyb3IiLG49ZnVuY3Rpb24odCl7ZS5yZW1vdmUoKSxuPW51bGwsdCYmbygiZXJyb3IiPT09dC50eXBlPzQwNDoyMDAsdC50eXBlKX0pLGEuaGVhZC5hcHBlbmRDaGlsZChlWzBdKX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuKCl9fX0pO3ZhciBLZSxYZT1bXSxKZT0vKD0pXD8oPz0mfCQpfFw/XD8vO1MuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgdD1YZS5wb3AoKXx8Uy5leHBhbmRvKyJfIitPZSsrO3JldHVybiB0aGlzW3RdPSEwLHR9fSksUy5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbih0LGUscil7dmFyIG8saSxhLHM9ITEhPT10Lmpzb25wJiYoSmUudGVzdCh0LnVybCk/InVybCI6InN0cmluZyI9PXR5cGVvZiB0LmRhdGEmJjA9PT0odC5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiZKZS50ZXN0KHQuZGF0YSkmJiJkYXRhIik7aWYoc3x8Impzb25wIj09PXQuZGF0YVR5cGVzWzBdKXJldHVybiBvPXQuanNvbnBDYWxsYmFjaz1tKHQuanNvbnBDYWxsYmFjayk/dC5qc29ucENhbGxiYWNrKCk6dC5qc29ucENhbGxiYWNrLHM/dFtzXT10W3NdLnJlcGxhY2UoSmUsIiQxIitvKTohMSE9PXQuanNvbnAmJih0LnVybCs9KEFlLnRlc3QodC51cmwpPyImIjoiPyIpK3QuanNvbnArIj0iK28pLHQuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBhfHxTLmVycm9yKG8rIiB3YXMgbm90IGNhbGxlZCIpLGFbMF19LHQuZGF0YVR5cGVzWzBdPSJqc29uIixpPW5bb10sbltvXT1mdW5jdGlvbigpe2E9YXJndW1lbnRzfSxyLmFsd2F5cyhmdW5jdGlvbigpe3ZvaWQgMD09PWk/UyhuKS5yZW1vdmVQcm9wKG8pOm5bb109aSx0W29dJiYodC5qc29ucENhbGxiYWNrPWUuanNvbnBDYWxsYmFjayxYZS5wdXNoKG8pKSxhJiZtKGkpJiZpKGFbMF0pLGE9aT12b2lkIDB9KSwic2NyaXB0In0pLHkuY3JlYXRlSFRNTERvY3VtZW50PSgoS2U9YS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLmJvZHkpLmlubmVySFRNTD0iPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT4iLDI9PT1LZS5jaGlsZE5vZGVzLmxlbmd0aCksUy5wYXJzZUhUTUw9ZnVuY3Rpb24odCxlLG4pe3JldHVybiJzdHJpbmciIT10eXBlb2YgdD9bXTooImJvb2xlYW4iPT10eXBlb2YgZSYmKG49ZSxlPSExKSxlfHwoeS5jcmVhdGVIVE1MRG9jdW1lbnQ/KChyPShlPWEuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKSkuY3JlYXRlRWxlbWVudCgiYmFzZSIpKS5ocmVmPWEubG9jYXRpb24uaHJlZixlLmhlYWQuYXBwZW5kQ2hpbGQocikpOmU9YSksaT0hbiYmW10sKG89Ui5leGVjKHQpKT9bZS5jcmVhdGVFbGVtZW50KG9bMV0pXToobz1FdChbdF0sZSxpKSxpJiZpLmxlbmd0aCYmUyhpKS5yZW1vdmUoKSxTLm1lcmdlKFtdLG8uY2hpbGROb2RlcykpKTt2YXIgcixvLGl9LFMuZm4ubG9hZD1mdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGE9dGhpcyxzPXQuaW5kZXhPZigiICIpO3JldHVybiBzPi0xJiYocj14ZSh0LnNsaWNlKHMpKSx0PXQuc2xpY2UoMCxzKSksbShlKT8obj1lLGU9dm9pZCAwKTplJiYib2JqZWN0Ij09dHlwZW9mIGUmJihvPSJQT1NUIiksYS5sZW5ndGg+MCYmUy5hamF4KHt1cmw6dCx0eXBlOm98fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOmV9KS5kb25lKGZ1bmN0aW9uKHQpe2k9YXJndW1lbnRzLGEuaHRtbChyP1MoIjxkaXY+IikuYXBwZW5kKFMucGFyc2VIVE1MKHQpKS5maW5kKHIpOnQpfSkuYWx3YXlzKG4mJmZ1bmN0aW9uKHQsZSl7YS5lYWNoKGZ1bmN0aW9uKCl7bi5hcHBseSh0aGlzLGl8fFt0LnJlc3BvbnNlVGV4dCxlLHRdKX0pfSksdGhpc30sUy5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24odCxlKXtTLmZuW2VdPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9uKGUsdCl9fSksUy5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIFMuZ3JlcChTLnRpbWVycyxmdW5jdGlvbihlKXtyZXR1cm4gdD09PWUuZWxlbX0pLmxlbmd0aH0sUy5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGEscyx1LGM9Uy5jc3ModCwicG9zaXRpb24iKSxsPVModCksZj17fTsic3RhdGljIj09PWMmJih0LnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpLHM9bC5vZmZzZXQoKSxpPVMuY3NzKHQsInRvcCIpLHU9Uy5jc3ModCwibGVmdCIpLCgiYWJzb2x1dGUiPT09Y3x8ImZpeGVkIj09PWMpJiYoaSt1KS5pbmRleE9mKCJhdXRvIik+LTE/KGE9KHI9bC5wb3NpdGlvbigpKS50b3Asbz1yLmxlZnQpOihhPXBhcnNlRmxvYXQoaSl8fDAsbz1wYXJzZUZsb2F0KHUpfHwwKSxtKGUpJiYoZT1lLmNhbGwodCxuLFMuZXh0ZW5kKHt9LHMpKSksbnVsbCE9ZS50b3AmJihmLnRvcD1lLnRvcC1zLnRvcCthKSxudWxsIT1lLmxlZnQmJihmLmxlZnQ9ZS5sZWZ0LXMubGVmdCtvKSwidXNpbmciaW4gZT9lLnVzaW5nLmNhbGwodCxmKTpsLmNzcyhmKX19LFMuZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24odCl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihlKXtTLm9mZnNldC5zZXRPZmZzZXQodGhpcyx0LGUpfSk7dmFyIGUsbixyPXRoaXNbMF07cmV0dXJuIHI/ci5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8oZT1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49ci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6ZS50b3Arbi5wYWdlWU9mZnNldCxsZWZ0OmUubGVmdCtuLnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH06dm9pZCAwfSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciB0LGUsbixyPXRoaXNbMF0sbz17dG9wOjAsbGVmdDowfTtpZigiZml4ZWQiPT09Uy5jc3MociwicG9zaXRpb24iKSllPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZWxzZXtmb3IoZT10aGlzLm9mZnNldCgpLG49ci5vd25lckRvY3VtZW50LHQ9ci5vZmZzZXRQYXJlbnR8fG4uZG9jdW1lbnRFbGVtZW50O3QmJih0PT09bi5ib2R5fHx0PT09bi5kb2N1bWVudEVsZW1lbnQpJiYic3RhdGljIj09PVMuY3NzKHQsInBvc2l0aW9uIik7KXQ9dC5wYXJlbnROb2RlO3QmJnQhPT1yJiYxPT09dC5ub2RlVHlwZSYmKChvPVModCkub2Zmc2V0KCkpLnRvcCs9Uy5jc3ModCwiYm9yZGVyVG9wV2lkdGgiLCEwKSxvLmxlZnQrPVMuY3NzKHQsImJvcmRlckxlZnRXaWR0aCIsITApKX1yZXR1cm57dG9wOmUudG9wLW8udG9wLVMuY3NzKHIsIm1hcmdpblRvcCIsITApLGxlZnQ6ZS5sZWZ0LW8ubGVmdC1TLmNzcyhyLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMub2Zmc2V0UGFyZW50O3QmJiJzdGF0aWMiPT09Uy5jc3ModCwicG9zaXRpb24iKTspdD10Lm9mZnNldFBhcmVudDtyZXR1cm4gdHx8YXR9KX19KSxTLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24odCxlKXt2YXIgbj0icGFnZVlPZmZzZXQiPT09ZTtTLmZuW3RdPWZ1bmN0aW9uKHIpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24odCxyLG8pe3ZhciBpO2lmKGIodCk/aT10Ojk9PT10Lm5vZGVUeXBlJiYoaT10LmRlZmF1bHRWaWV3KSx2b2lkIDA9PT1vKXJldHVybiBpP2lbZV06dFtyXTtpP2kuc2Nyb2xsVG8obj9pLnBhZ2VYT2Zmc2V0Om8sbj9vOmkucGFnZVlPZmZzZXQpOnRbcl09b30sdCxyLGFyZ3VtZW50cy5sZW5ndGgpfX0pLFMuZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbih0LGUpe1MuY3NzSG9va3NbZV09R3QoeS5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKHQsbil7aWYobilyZXR1cm4gbj1WdCh0LGUpLFd0LnRlc3Qobik/Uyh0KS5wb3NpdGlvbigpW2VdKyJweCI6bn0pfSksUy5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24odCxlKXtTLmVhY2goe3BhZGRpbmc6ImlubmVyIit0LGNvbnRlbnQ6ZSwiIjoib3V0ZXIiK3R9LGZ1bmN0aW9uKG4scil7Uy5mbltyXT1mdW5jdGlvbihvLGkpe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGgmJihufHwiYm9vbGVhbiIhPXR5cGVvZiBvKSxzPW58fCghMD09PW98fCEwPT09aT8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuICQodGhpcyxmdW5jdGlvbihlLG4sbyl7dmFyIGk7cmV0dXJuIGIoZSk/MD09PXIuaW5kZXhPZigib3V0ZXIiKT9lWyJpbm5lciIrdF06ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrdF06OT09PWUubm9kZVR5cGU/KGk9ZS5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoZS5ib2R5WyJzY3JvbGwiK3RdLGlbInNjcm9sbCIrdF0sZS5ib2R5WyJvZmZzZXQiK3RdLGlbIm9mZnNldCIrdF0saVsiY2xpZW50Iit0XSkpOnZvaWQgMD09PW8/Uy5jc3MoZSxuLHMpOlMuc3R5bGUoZSxuLG8scyl9LGUsYT9vOnZvaWQgMCxhKX19KX0pLFMuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbih0LGUpe1MuZm5bZV09ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oZSxudWxsLHQsbik6dGhpcy50cmlnZ2VyKGUpfX0pLFMuZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIodCkubW91c2VsZWF2ZShlfHx0KX19KSxTLmZuLmV4dGVuZCh7YmluZDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMub24odCxudWxsLGUsbil9LHVuYmluZDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm9mZih0LG51bGwsZSl9LGRlbGVnYXRlOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0aGlzLm9uKGUsdCxuLHIpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYodCwiKioiKTp0aGlzLm9mZihlLHR8fCIqKiIsbil9fSksUy5wcm94eT1mdW5jdGlvbih0LGUpe3ZhciBuLHIsbztpZigic3RyaW5nIj09dHlwZW9mIGUmJihuPXRbZV0sZT10LHQ9biksbSh0KSlyZXR1cm4gcj11LmNhbGwoYXJndW1lbnRzLDIpLChvPWZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZXx8dGhpcyxyLmNvbmNhdCh1LmNhbGwoYXJndW1lbnRzKSkpfSkuZ3VpZD10Lmd1aWQ9dC5ndWlkfHxTLmd1aWQrKyxvfSxTLmhvbGRSZWFkeT1mdW5jdGlvbih0KXt0P1MucmVhZHlXYWl0Kys6Uy5yZWFkeSghMCl9LFMuaXNBcnJheT1BcnJheS5pc0FycmF5LFMucGFyc2VKU09OPUpTT04ucGFyc2UsUy5ub2RlTmFtZT1MLFMuaXNGdW5jdGlvbj1tLFMuaXNXaW5kb3c9YixTLmNhbWVsQ2FzZT1LLFMudHlwZT1rLFMubm93PURhdGUubm93LFMuaXNOdW1lcmljPWZ1bmN0aW9uKHQpe3ZhciBlPVMudHlwZSh0KTtyZXR1cm4oIm51bWJlciI9PT1lfHwic3RyaW5nIj09PWUpJiYhaXNOYU4odC1wYXJzZUZsb2F0KHQpKX0sdm9pZCAwPT09KHI9ZnVuY3Rpb24oKXtyZXR1cm4gU30uYXBwbHkoZSxbXSkpfHwodC5leHBvcnRzPXIpO3ZhciBRZT1uLmpRdWVyeSxaZT1uLiQ7cmV0dXJuIFMubm9Db25mbGljdD1mdW5jdGlvbih0KXtyZXR1cm4gbi4kPT09UyYmKG4uJD1aZSksdCYmbi5qUXVlcnk9PT1TJiYobi5qUXVlcnk9UWUpLFN9LG98fChuLmpRdWVyeT1uLiQ9UyksU30pfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjQ1KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0Nil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDgpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNTIpO2Z1bmN0aW9uIG8odCxlLG4sbyxpLGEscyl7dHJ5e3ZhciB1PXRbYV0ocyksYz11LnZhbHVlfWNhdGNoKHQpe3JldHVybiB2b2lkIG4odCl9dS5kb25lP2UoYyk6ci5yZXNvbHZlKGMpLnRoZW4obyxpKX10LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPWFyZ3VtZW50cztyZXR1cm4gbmV3IHIoZnVuY3Rpb24ocixpKXt2YXIgYT10LmFwcGx5KGUsbik7ZnVuY3Rpb24gcyh0KXtvKGEscixpLHMsdSwibmV4dCIsdCl9ZnVuY3Rpb24gdSh0KXtvKGEscixpLHMsdSwidGhyb3ciLHQpfXModm9pZCAwKX0pfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI2NCkuZGVmYXVsdDt0LmV4cG9ydHM9cix0LmV4cG9ydHMuZGVmYXVsdD1yfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjk4KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKHQpe3JldHVybiB0LnJlcGxhY2UoL1tcLVxbXF1cL1x7XH1cKFwpXCpcK1w/XC5cXFxeXCRcfF0vZywiXFwkJiIpfXIucHJvdG89ZnVuY3Rpb24oKXtyZXR1cm4gUmVnRXhwLmVzY2FwZT1yLHJ9LHQuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTM3KX0sZnVuY3Rpb24odCxlLG4pe24oMTM4KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLlJlZmxlY3QuY29uc3RydWN0fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oMzMpLGk9bigyMiksYT1uKDExKSxzPW4oNyksdT1uKDQ3KSxjPW4oOTEpLGw9big2KSxmPW8oIlJlZmxlY3QiLCJjb25zdHJ1Y3QiKSxwPWwoZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiEoZihmdW5jdGlvbigpe30sW10sdClpbnN0YW5jZW9mIHQpfSksaD0hbChmdW5jdGlvbigpe2YoZnVuY3Rpb24oKXt9KX0pLGQ9cHx8aDtyKHt0YXJnZXQ6IlJlZmxlY3QiLHN0YXQ6ITAsZm9yY2VkOmQsc2hhbTpkfSx7Y29uc3RydWN0OmZ1bmN0aW9uKHQsZSl7aSh0KSxhKGUpO3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg8Mz90OmkoYXJndW1lbnRzWzJdKTtpZihoJiYhcClyZXR1cm4gZih0LGUsbik7aWYodD09bil7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyB0O2Nhc2UgMTpyZXR1cm4gbmV3IHQoZVswXSk7Y2FzZSAyOnJldHVybiBuZXcgdChlWzBdLGVbMV0pO2Nhc2UgMzpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0pO2Nhc2UgNDpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0sZVszXSl9dmFyIHI9W251bGxdO3JldHVybiByLnB1c2guYXBwbHkocixlKSxuZXcoYy5hcHBseSh0LHIpKX12YXIgbz1uLnByb3RvdHlwZSxsPXUocyhvKT9vOk9iamVjdC5wcm90b3R5cGUpLGQ9RnVuY3Rpb24uYXBwbHkuY2FsbCh0LGwsZSk7cmV0dXJuIHMoZCk/ZDpsfX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMyksbz1uKDIzKSxpPW4oMTEpLGE9big1NSk7dC5leHBvcnRzPXI/T2JqZWN0LmRlZmluZVByb3BlcnRpZXM6ZnVuY3Rpb24odCxlKXtpKHQpO2Zvcih2YXIgbixyPWEoZSkscz1yLmxlbmd0aCx1PTA7cz51OylvLmYodCxuPXJbdSsrXSxlW25dKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89bigxNyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dHJ5e28ocix0LGUpfWNhdGNoKG4pe3JbdF09ZX1yZXR1cm4gZX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNDIpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxKSxvPXIuSlNPTnx8KHIuSlNPTj17c3RyaW5naWZ5OkpTT04uc3RyaW5naWZ5fSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBvLnN0cmluZ2lmeS5hcHBseShvLGFyZ3VtZW50cyl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTQ0KX0sZnVuY3Rpb24odCxlLG4pe24oMTQ1KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLk9iamVjdC5hc3NpZ259LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigxNDYpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpPYmplY3QuYXNzaWduIT09b30se2Fzc2lnbjpvfSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxMyksbz1uKDYpLGk9big1NSksYT1uKDkyKSxzPW4oNjQpLHU9bigyNCksYz1uKDY1KSxsPU9iamVjdC5hc3NpZ247dC5leHBvcnRzPSFsfHxvKGZ1bmN0aW9uKCl7dmFyIHQ9e30sZT17fSxuPVN5bWJvbCgpO3JldHVybiB0W25dPTcsImFiY2RlZmdoaWprbG1ub3BxcnN0Ii5zcGxpdCgiIikuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPXR9KSw3IT1sKHt9LHQpW25dfHwiYWJjZGVmZ2hpamtsbW5vcHFyc3QiIT1pKGwoe30sZSkpLmpvaW4oIiIpfSk/ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dSh0KSxvPWFyZ3VtZW50cy5sZW5ndGgsbD0xLGY9YS5mLHA9cy5mO28+bDspZm9yKHZhciBoLGQ9Yyhhcmd1bWVudHNbbCsrXSksZz1mP2koZCkuY29uY2F0KGYoZCkpOmkoZCksdj1nLmxlbmd0aCx5PTA7dj55OyloPWdbeSsrXSxyJiYhcC5jYWxsKGQsaCl8fChuW2hdPWRbaF0pO3JldHVybiBufTpsfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTQ4KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQ5KSxvPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5jb25jYXQ7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLmNvbmNhdD9yOmV9fSxmdW5jdGlvbih0LGUsbil7big5Myk7dmFyIHI9bigxOCk7dC5leHBvcnRzPXIoIkFycmF5IikuY29uY2F0fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTUxKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTUyKSxvPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5tYXA7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLm1hcD9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigxNTMpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLm1hcH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89big3MykubWFwO3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDohbig3MikoIm1hcCIpfSx7bWFwOmZ1bmN0aW9uKHQpe3JldHVybiBvKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNTUpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTU2KX0sZnVuY3Rpb24odCxlLG4pe24oMTU3KTt2YXIgcj1uKDEpLk9iamVjdCxvPXQuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHIuZGVmaW5lUHJvcGVydHkodCxlLG4pfTtyLmRlZmluZVByb3BlcnR5LnNoYW0mJihvLnNoYW09ITApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oMTMpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDohbyxzaGFtOiFvfSx7ZGVmaW5lUHJvcGVydHk6bigyMykuZn0pfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTU5KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE2MCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE2MSk7dmFyIHI9bigxKS5PYmplY3Qsbz10LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKX07ci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iuc2hhbSYmKG8uc2hhbT0hMCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big2KSxpPW4oMjEpLGE9big0NSkuZixzPW4oMTMpLHU9byhmdW5jdGlvbigpe2EoMSl9KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXN8fHUsc2hhbTohc30se2dldE93blByb3BlcnR5RGVzY3JpcHRvcjpmdW5jdGlvbih0LGUpe3JldHVybiBhKGkodCksZSl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNjMpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTY0KX0sZnVuY3Rpb24odCxlLG4pe24oMTY1KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLlJlZmxlY3QuZ2V0fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oNyksaT1uKDExKSxhPW4oMTQpLHM9big0NSksdT1uKDQ5KTtyKHt0YXJnZXQ6IlJlZmxlY3QiLHN0YXQ6ITB9LHtnZXQ6ZnVuY3Rpb24gdChlLG4pe3ZhciByLGMsbD1hcmd1bWVudHMubGVuZ3RoPDM/ZTphcmd1bWVudHNbMl07cmV0dXJuIGkoZSk9PT1sP2Vbbl06KHI9cy5mKGUsbikpP2EociwidmFsdWUiKT9yLnZhbHVlOnZvaWQgMD09PXIuZ2V0P3ZvaWQgMDpyLmdldC5jYWxsKGwpOm8oYz11KGUpKT90KGMsbixsKTp2b2lkIDB9fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtmb3IoOyFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKSYmbnVsbCE9PSh0PXIodCkpOyk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTY4KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE2OSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE3MCk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5PYmplY3QuZ2V0UHJvdG90eXBlT2Z9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big2KSxpPW4oMjQpLGE9big0OSkscz1uKDk2KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6byhmdW5jdGlvbigpe2EoMSl9KSxzaGFtOiFzfSx7Z2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIGEoaSh0KSl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzIpfSxmdW5jdGlvbih0LGUsbil7bigxNzMpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuT2JqZWN0LnNldFByb3RvdHlwZU9mfSxmdW5jdGlvbih0LGUsbil7bigwKSh7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITB9LHtzZXRQcm90b3R5cGVPZjpuKDc0KX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoIXIodCkmJm51bGwhPT10KXRocm93IFR5cGVFcnJvcigiQ2FuJ3Qgc2V0ICIrU3RyaW5nKHQpKyIgYXMgYSBwcm90b3R5cGUiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzYpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTc3KX0sZnVuY3Rpb24odCxlLG4pe24oMTc4KTt2YXIgcj1uKDEpLk9iamVjdDt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gci5jcmVhdGUodCxlKX19LGZ1bmN0aW9uKHQsZSxuKXtuKDApKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxzaGFtOiFuKDEzKX0se2NyZWF0ZTpuKDQ3KX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big5Nyk7ZnVuY3Rpb24gbyhlLG4pe3JldHVybiB0LmV4cG9ydHM9bz1yfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9LG8oZSxuKX10LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTgxKSxvPW4oMTAzKTtmdW5jdGlvbiBpKGUpe3JldHVybiB0LmV4cG9ydHM9aT0iZnVuY3Rpb24iPT10eXBlb2YgbyYmInN5bWJvbCI9PXR5cGVvZiByP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBvJiZ0LmNvbnN0cnVjdG9yPT09byYmdCE9PW8ucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSxpKGUpfXQuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTgyKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE4Myl9LGZ1bmN0aW9uKHQsZSxuKXtuKDk4KSxuKDM1KSxuKDUxKTt2YXIgcj1uKDc1KTt0LmV4cG9ydHM9ci5mKCJpdGVyYXRvciIpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2OCksbz1uKDQ2KSxpPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciBpLGEscz1TdHJpbmcobyhlKSksdT1yKG4pLGM9cy5sZW5ndGg7cmV0dXJuIHU8MHx8dT49Yz90PyIiOnZvaWQgMDooaT1zLmNoYXJDb2RlQXQodSkpPDU1Mjk2fHxpPjU2MzE5fHx1KzE9PT1jfHwoYT1zLmNoYXJDb2RlQXQodSsxKSk8NTYzMjB8fGE+NTczNDM/dD9zLmNoYXJBdCh1KTppOnQ/cy5zbGljZSh1LHUrMik6YS01NjMyMCsoaS01NTI5Njw8MTApKzY1NTM2fX07dC5leHBvcnRzPXtjb2RlQXQ6aSghMSksY2hhckF0OmkoITApfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz1uKDE4NiksaT1yLldlYWtNYXA7dC5leHBvcnRzPSJmdW5jdGlvbiI9PXR5cGVvZiBpJiYvbmF0aXZlIGNvZGUvLnRlc3Qoby5jYWxsKGkpKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTgpO3QuZXhwb3J0cz1yKCJuYXRpdmUtZnVuY3Rpb24tdG8tc3RyaW5nIixGdW5jdGlvbi50b1N0cmluZyl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big3Niksbz17fTtvW24oMikoInRvU3RyaW5nVGFnIildPSJ6Iix0LmV4cG9ydHM9IltvYmplY3Qgel0iIT09U3RyaW5nKG8pP2Z1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgIityKHRoaXMpKyJdIn06by50b1N0cmluZ30sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9e0NTU1J1bGVMaXN0OjAsQ1NTU3R5bGVEZWNsYXJhdGlvbjowLENTU1ZhbHVlTGlzdDowLENsaWVudFJlY3RMaXN0OjAsRE9NUmVjdExpc3Q6MCxET01TdHJpbmdMaXN0OjAsRE9NVG9rZW5MaXN0OjEsRGF0YVRyYW5zZmVySXRlbUxpc3Q6MCxGaWxlTGlzdDowLEhUTUxBbGxDb2xsZWN0aW9uOjAsSFRNTENvbGxlY3Rpb246MCxIVE1MRm9ybUVsZW1lbnQ6MCxIVE1MU2VsZWN0RWxlbWVudDowLE1lZGlhTGlzdDowLE1pbWVUeXBlQXJyYXk6MCxOYW1lZE5vZGVNYXA6MCxOb2RlTGlzdDoxLFBhaW50UmVxdWVzdExpc3Q6MCxQbHVnaW46MCxQbHVnaW5BcnJheTowLFNWR0xlbmd0aExpc3Q6MCxTVkdOdW1iZXJMaXN0OjAsU1ZHUGF0aFNlZ0xpc3Q6MCxTVkdQb2ludExpc3Q6MCxTVkdTdHJpbmdMaXN0OjAsU1ZHVHJhbnNmb3JtTGlzdDowLFNvdXJjZUJ1ZmZlckxpc3Q6MCxTdHlsZVNoZWV0TGlzdDowLFRleHRUcmFja0N1ZUxpc3Q6MCxUZXh0VHJhY2tMaXN0OjAsVG91Y2hMaXN0OjB9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTA0KSxuKDIwNyksbigyMDgpLG4oMjA5KSxuKDIxMCksbigyMTEpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDUpLGk9bigyOCksYT1uKDEzKSxzPW4oOTUpLHU9big2KSxjPW4oMTQpLGw9big0OCksZj1uKDcpLHA9bigxMSksaD1uKDI0KSxkPW4oMjEpLGc9big1NCksdj1uKDMxKSx5PW4oNDcpLG09big1NSksYj1uKDEwNikseD1uKDE5MSksdz1uKDkyKSxrPW4oNDUpLFM9bigyMyksRT1uKDY0KSxqPW4oMTcpLFQ9bigzNiksTz1uKDU4KSxBPW4oNTcpLEM9big1NiksTD1uKDcwKSxSPW4oMiksUD1uKDc1KSxOPW4oNCksST1uKDI5KSxfPW4oNTApLEQ9big3MykuZm9yRWFjaCxNPUEoImhpZGRlbiIpLFU9UigidG9QcmltaXRpdmUiKSxCPV8uc2V0LHE9Xy5nZXR0ZXJGb3IoIlN5bWJvbCIpLEY9T2JqZWN0LnByb3RvdHlwZSxIPW8uU3ltYm9sLHo9by5KU09OLFc9eiYmei5zdHJpbmdpZnksJD1rLmYsWT1TLmYsVj14LmYsRz1FLmYsSz1PKCJzeW1ib2xzIiksWD1PKCJvcC1zeW1ib2xzIiksSj1PKCJzdHJpbmctdG8tc3ltYm9sLXJlZ2lzdHJ5IiksUT1PKCJzeW1ib2wtdG8tc3RyaW5nLXJlZ2lzdHJ5IiksWj1PKCJ3a3MiKSx0dD1vLlFPYmplY3QsZXQ9IXR0fHwhdHQucHJvdG90eXBlfHwhdHQucHJvdG90eXBlLmZpbmRDaGlsZCxudD1hJiZ1KGZ1bmN0aW9uKCl7cmV0dXJuIDchPXkoWSh7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiBZKHRoaXMsImEiLHt2YWx1ZTo3fSkuYX19KSkuYX0pP2Z1bmN0aW9uKHQsZSxuKXt2YXIgcj0kKEYsZSk7ciYmZGVsZXRlIEZbZV0sWSh0LGUsbiksciYmdCE9PUYmJlkoRixlLHIpfTpZLHJ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49S1t0XT15KEgucHJvdG90eXBlKTtyZXR1cm4gQihuLHt0eXBlOiJTeW1ib2wiLHRhZzp0LGRlc2NyaXB0aW9uOmV9KSxhfHwobi5kZXNjcmlwdGlvbj1lKSxufSxvdD1zJiYic3ltYm9sIj09dHlwZW9mIEguaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KHQpaW5zdGFuY2VvZiBIfSxpdD1mdW5jdGlvbih0LGUsbil7dD09PUYmJml0KFgsZSxuKSxwKHQpO3ZhciByPWcoZSwhMCk7cmV0dXJuIHAobiksYyhLLHIpPyhuLmVudW1lcmFibGU/KGModCxNKSYmdFtNXVtyXSYmKHRbTV1bcl09ITEpLG49eShuLHtlbnVtZXJhYmxlOnYoMCwhMSl9KSk6KGModCxNKXx8WSh0LE0sdigxLHt9KSksdFtNXVtyXT0hMCksbnQodCxyLG4pKTpZKHQscixuKX0sYXQ9ZnVuY3Rpb24odCxlKXtwKHQpO3ZhciBuPWQoZSkscj1tKG4pLmNvbmNhdChsdChuKSk7cmV0dXJuIEQocixmdW5jdGlvbihlKXthJiYhc3QuY2FsbChuLGUpfHxpdCh0LGUsbltlXSl9KSx0fSxzdD1mdW5jdGlvbih0KXt2YXIgZT1nKHQsITApLG49Ry5jYWxsKHRoaXMsZSk7cmV0dXJuISh0aGlzPT09RiYmYyhLLGUpJiYhYyhYLGUpKSYmKCEobnx8IWModGhpcyxlKXx8IWMoSyxlKXx8Yyh0aGlzLE0pJiZ0aGlzW01dW2VdKXx8bil9LHV0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZCh0KSxyPWcoZSwhMCk7aWYobiE9PUZ8fCFjKEsscil8fGMoWCxyKSl7dmFyIG89JChuLHIpO3JldHVybiFvfHwhYyhLLHIpfHxjKG4sTSkmJm5bTV1bcl18fChvLmVudW1lcmFibGU9ITApLG99fSxjdD1mdW5jdGlvbih0KXt2YXIgZT1WKGQodCkpLG49W107cmV0dXJuIEQoZSxmdW5jdGlvbih0KXtjKEssdCl8fGMoQyx0KXx8bi5wdXNoKHQpfSksbn0sbHQ9ZnVuY3Rpb24odCl7dmFyIGU9dD09PUYsbj1WKGU/WDpkKHQpKSxyPVtdO3JldHVybiBEKG4sZnVuY3Rpb24odCl7IWMoSyx0KXx8ZSYmIWMoRix0KXx8ci5wdXNoKEtbdF0pfSkscn07c3x8KFQoKEg9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgSCl0aHJvdyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9TdHJpbmcoYXJndW1lbnRzWzBdKTp2b2lkIDAsZT1MKHQpLG49ZnVuY3Rpb24odCl7dGhpcz09PUYmJm4uY2FsbChYLHQpLGModGhpcyxNKSYmYyh0aGlzW01dLGUpJiYodGhpc1tNXVtlXT0hMSksbnQodGhpcyxlLHYoMSx0KSl9O3JldHVybiBhJiZldCYmbnQoRixlLHtjb25maWd1cmFibGU6ITAsc2V0Om59KSxydChlLHQpfSkucHJvdG90eXBlLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4gcSh0aGlzKS50YWd9KSxFLmY9c3QsUy5mPWl0LGsuZj11dCxiLmY9eC5mPWN0LHcuZj1sdCxhJiYoWShILnByb3RvdHlwZSwiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHEodGhpcykuZGVzY3JpcHRpb259fSksaXx8VChGLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsc3Qse3Vuc2FmZTohMH0pKSxQLmY9ZnVuY3Rpb24odCl7cmV0dXJuIHJ0KFIodCksdCl9KSxyKHtnbG9iYWw6ITAsd3JhcDohMCxmb3JjZWQ6IXMsc2hhbTohc30se1N5bWJvbDpIfSksRChtKFopLGZ1bmN0aW9uKHQpe04odCl9KSxyKHt0YXJnZXQ6IlN5bWJvbCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtmb3I6ZnVuY3Rpb24odCl7dmFyIGU9U3RyaW5nKHQpO2lmKGMoSixlKSlyZXR1cm4gSltlXTt2YXIgbj1IKGUpO3JldHVybiBKW2VdPW4sUVtuXT1lLG59LGtleUZvcjpmdW5jdGlvbih0KXtpZighb3QodCkpdGhyb3cgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBzeW1ib2wiKTtpZihjKFEsdCkpcmV0dXJuIFFbdF19LHVzZVNldHRlcjpmdW5jdGlvbigpe2V0PSEwfSx1c2VTaW1wbGU6ZnVuY3Rpb24oKXtldD0hMX19KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXMsc2hhbTohYX0se2NyZWF0ZTpmdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lP3kodCk6YXQoeSh0KSxlKX0sZGVmaW5lUHJvcGVydHk6aXQsZGVmaW5lUHJvcGVydGllczphdCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6dXR9KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtnZXRPd25Qcm9wZXJ0eU5hbWVzOmN0LGdldE93blByb3BlcnR5U3ltYm9sczpsdH0pLHIoe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDp1KGZ1bmN0aW9uKCl7dy5mKDEpfSl9LHtnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ZnVuY3Rpb24odCl7cmV0dXJuIHcuZihoKHQpKX19KSx6JiZyKHt0YXJnZXQ6IkpTT04iLHN0YXQ6ITAsZm9yY2VkOiFzfHx1KGZ1bmN0aW9uKCl7dmFyIHQ9SCgpO3JldHVybiJbbnVsbF0iIT1XKFt0XSl8fCJ7fSIhPVcoe2E6dH0pfHwie30iIT1XKE9iamVjdCh0KSl9KX0se3N0cmluZ2lmeTpmdW5jdGlvbih0KXtmb3IodmFyIGUsbixyPVt0XSxvPTE7YXJndW1lbnRzLmxlbmd0aD5vOylyLnB1c2goYXJndW1lbnRzW28rK10pO2lmKG49ZT1yWzFdLChmKGUpfHx2b2lkIDAhPT10KSYmIW90KHQpKXJldHVybiBsKGUpfHwoZT1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuJiYoZT1uLmNhbGwodGhpcyx0LGUpKSwhb3QoZSkpcmV0dXJuIGV9KSxyWzFdPWUsVy5hcHBseSh6LHIpfX0pLEgucHJvdG90eXBlW1VdfHxqKEgucHJvdG90eXBlLFUsSC5wcm90b3R5cGUudmFsdWVPZiksSShILCJTeW1ib2wiKSxDW01dPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMSksbz1uKDEwNikuZixpPXt9LnRvU3RyaW5nLGE9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KTpbXTt0LmV4cG9ydHMuZj1mdW5jdGlvbih0KXtyZXR1cm4gYSYmIltvYmplY3QgV2luZG93XSI9PWkuY2FsbCh0KT9mdW5jdGlvbih0KXt0cnl7cmV0dXJuIG8odCl9Y2F0Y2godCl7cmV0dXJuIGEuc2xpY2UoKX19KHQpOm8ocih0KSl9fSxmdW5jdGlvbih0LGUsbil7big0KSgiYXN5bmNJdGVyYXRvciIpfSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlLG4pe24oNCkoImhhc0luc3RhbmNlIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJpc0NvbmNhdFNwcmVhZGFibGUiKX0sZnVuY3Rpb24odCxlLG4pe24oNCkoIm1hdGNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJtYXRjaEFsbCIpfSxmdW5jdGlvbih0LGUsbil7big0KSgicmVwbGFjZSIpfSxmdW5jdGlvbih0LGUsbil7big0KSgic2VhcmNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJzcGVjaWVzIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJzcGxpdCIpfSxmdW5jdGlvbih0LGUsbil7big0KSgidG9QcmltaXRpdmUiKX0sZnVuY3Rpb24odCxlLG4pe24oNCkoInRvU3RyaW5nVGFnIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJ1bnNjb3BhYmxlcyIpfSxmdW5jdGlvbih0LGUsbil7bigyOSkoTWF0aCwiTWF0aCIsITApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KTtuKDI5KShyLkpTT04sIkpTT04iLCEwKX0sZnVuY3Rpb24odCxlLG4pe24oNCkoImFzeW5jRGlzcG9zZSIpfSxmdW5jdGlvbih0LGUsbil7big0KSgiZGlzcG9zZSIpfSxmdW5jdGlvbih0LGUsbil7big0KSgib2JzZXJ2YWJsZSIpfSxmdW5jdGlvbih0LGUsbil7big0KSgicGF0dGVybk1hdGNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJyZXBsYWNlQWxsIil9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMTQpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMTUpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmZpbmQ7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLmZpbmQ/cjplfX0sZnVuY3Rpb24odCxlLG4pe24oMjE2KTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5maW5kfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDczKS5maW5kLGk9big3NyksYT0hMDsiZmluZCJpbltdJiZBcnJheSgxKS5maW5kKGZ1bmN0aW9uKCl7YT0hMX0pLHIoe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDphfSx7ZmluZDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLGkoImZpbmQiKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIxOCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIxOSksbz1TdHJpbmcucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LnRyaW07cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHx0PT09b3x8dCBpbnN0YW5jZW9mIFN0cmluZyYmZT09PW8udHJpbT9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigyMjApO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJTdHJpbmciKS50cmltfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDEwNykudHJpbTtyKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOm4oMjIxKSgidHJpbSIpfSx7dHJpbTpmdW5jdGlvbigpe3JldHVybiBvKHRoaXMpfX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2KSxvPW4oNzgpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcihmdW5jdGlvbigpe3JldHVybiEhb1t0XSgpfHwi4oCLwoXhoI4iIT0i4oCLwoXhoI4iW3RdKCl8fG9bdF0ubmFtZSE9PXR9KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMjMpfSxmdW5jdGlvbih0LGUsbil7bigyMjQpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIucGFyc2VJbnR9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigyMjUpO3Ioe2dsb2JhbDohMCxmb3JjZWQ6cGFyc2VJbnQhPW99LHtwYXJzZUludDpvfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89bigxMDcpLnRyaW0saT1uKDc4KSxhPXIucGFyc2VJbnQscz0vXlsrLV0/MFtYeF0vLHU9OCE9PWEoaSsiMDgiKXx8MjIhPT1hKGkrIjB4MTYiKTt0LmV4cG9ydHM9dT9mdW5jdGlvbih0LGUpe3ZhciBuPW8oU3RyaW5nKHQpKTtyZXR1cm4gYShuLGU+Pj4wfHwocy50ZXN0KG4pPzE2OjEwKSl9OmF9LGZ1bmN0aW9uKHQsZSxuKXtuKDUxKSxuKDM1KSx0LmV4cG9ydHM9bigxMDgpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTA5KX0sZnVuY3Rpb24odCxlLG4pe24oMCkoe3RhcmdldDoiQXJyYXkiLHN0YXQ6ITB9LHtpc0FycmF5Om4oNDgpfSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDUxKSxuKDM1KSx0LmV4cG9ydHM9big1Mil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMDQpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTEwKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDIzMyk7cih7dGFyZ2V0OiJBcnJheSIsc3RhdDohMCxmb3JjZWQ6IW4oMTEzKShmdW5jdGlvbih0KXtBcnJheS5mcm9tKHQpfSl9LHtmcm9tOm99KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMyKSxvPW4oMjQpLGk9bigxMTEpLGE9bigxMTIpLHM9bigzNCksdT1uKDcxKSxjPW4oNTIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZSxuLGwsZixwPW8odCksaD0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcz90aGlzOkFycmF5LGQ9YXJndW1lbnRzLmxlbmd0aCxnPWQ+MT9hcmd1bWVudHNbMV06dm9pZCAwLHY9dm9pZCAwIT09Zyx5PTAsbT1jKHApO2lmKHYmJihnPXIoZyxkPjI/YXJndW1lbnRzWzJdOnZvaWQgMCwyKSksbnVsbD09bXx8aD09QXJyYXkmJmEobSkpZm9yKG49bmV3IGgoZT1zKHAubGVuZ3RoKSk7ZT55O3krKyl1KG4seSx2P2cocFt5XSx5KTpwW3ldKTtlbHNlIGZvcihmPW0uY2FsbChwKSxuPW5ldyBoOyEobD1mLm5leHQoKSkuZG9uZTt5KyspdShuLHksdj9pKGYsZyxbbC52YWx1ZSx5XSwhMCk6bC52YWx1ZSk7cmV0dXJuIG4ubGVuZ3RoPXksbn19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMTQpfSxmdW5jdGlvbih0LGUsbil7bigyMzYpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLnNsaWNlfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDcpLGk9big0OCksYT1uKDg5KSxzPW4oMzQpLHU9bigyMSksYz1uKDcxKSxsPW4oNzIpLGY9bigyKSgic3BlY2llcyIpLHA9W10uc2xpY2UsaD1NYXRoLm1heDtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IWwoInNsaWNlIil9LHtzbGljZTpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbCxkPXUodGhpcyksZz1zKGQubGVuZ3RoKSx2PWEodCxnKSx5PWEodm9pZCAwPT09ZT9nOmUsZyk7aWYoaShkKSYmKCJmdW5jdGlvbiIhPXR5cGVvZihuPWQuY29uc3RydWN0b3IpfHxuIT09QXJyYXkmJiFpKG4ucHJvdG90eXBlKT9vKG4pJiZudWxsPT09KG49bltmXSkmJihuPXZvaWQgMCk6bj12b2lkIDAsbj09PUFycmF5fHx2b2lkIDA9PT1uKSlyZXR1cm4gcC5jYWxsKGQsdix5KTtmb3Iocj1uZXcodm9pZCAwPT09bj9BcnJheTpuKShoKHktdiwwKSksbD0wO3Y8eTt2KyssbCsrKXYgaW4gZCYmYyhyLGwsZFt2XSk7cmV0dXJuIHIubGVuZ3RoPWwscn19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzOCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDIzOSk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5PYmplY3Qua2V5c30sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDI0KSxpPW4oNTUpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpuKDYpKGZ1bmN0aW9uKCl7aSgxKX0pfSx7a2V5czpmdW5jdGlvbih0KXtyZXR1cm4gaShvKHQpKX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0MSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI0Miksbz1BcnJheS5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5kZXhPZjtyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PW8uaW5kZXhPZj9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigyNDMpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLmluZGV4T2Z9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNjcpLmluZGV4T2YsaT1uKDI0NCksYT1bXS5pbmRleE9mLHM9ISFhJiYxL1sxXS5pbmRleE9mKDEsLTApPDAsdT1pKCJpbmRleE9mIik7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOnN8fHV9LHtpbmRleE9mOmZ1bmN0aW9uKHQpe3JldHVybiBzP2EuYXBwbHkodGhpcyxhcmd1bWVudHMpfHwwOm8odGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPVtdW3RdO3JldHVybiFufHwhcihmdW5jdGlvbigpe24uY2FsbChudWxsLGV8fGZ1bmN0aW9uKCl7dGhyb3cgMX0sMSl9KX19LGZ1bmN0aW9uKHQsZSxuKXtuKDExNSksdC5leHBvcnRzPW4oMSkuc2V0VGltZW91dH0sZnVuY3Rpb24odCxlLG4pe24oMTE1KSx0LmV4cG9ydHM9bigxKS5zZXRJbnRlcnZhbH0sZnVuY3Rpb24odCxlLG4pe3ZhciByPWZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZSxuPU9iamVjdC5wcm90b3R5cGUscj1uLmhhc093blByb3BlcnR5LG89ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbD9TeW1ib2w6e30saT1vLml0ZXJhdG9yfHwiQEBpdGVyYXRvciIsYT1vLmFzeW5jSXRlcmF0b3J8fCJAQGFzeW5jSXRlcmF0b3IiLHM9by50b1N0cmluZ1RhZ3x8IkBAdG9TdHJpbmdUYWciO2Z1bmN0aW9uIHUodCxlLG4pe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSksdFtlXX10cnl7dSh7fSwiIil9Y2F0Y2godCl7dT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRbZV09bn19ZnVuY3Rpb24gYyh0LGUsbixyKXt2YXIgbz1lJiZlLnByb3RvdHlwZSBpbnN0YW5jZW9mIHY/ZTp2LGk9T2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSksYT1uZXcgQShyfHxbXSk7cmV0dXJuIGkuX2ludm9rZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZjtyZXR1cm4gZnVuY3Rpb24obyxpKXtpZihyPT09aCl0aHJvdyBuZXcgRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTtpZihyPT09ZCl7aWYoInRocm93Ij09PW8pdGhyb3cgaTtyZXR1cm4gTCgpfWZvcihuLm1ldGhvZD1vLG4uYXJnPWk7Oyl7dmFyIGE9bi5kZWxlZ2F0ZTtpZihhKXt2YXIgcz1qKGEsbik7aWYocyl7aWYocz09PWcpY29udGludWU7cmV0dXJuIHN9fWlmKCJuZXh0Ij09PW4ubWV0aG9kKW4uc2VudD1uLl9zZW50PW4uYXJnO2Vsc2UgaWYoInRocm93Ij09PW4ubWV0aG9kKXtpZihyPT09Zil0aHJvdyByPWQsbi5hcmc7bi5kaXNwYXRjaEV4Y2VwdGlvbihuLmFyZyl9ZWxzZSJyZXR1cm4iPT09bi5tZXRob2QmJm4uYWJydXB0KCJyZXR1cm4iLG4uYXJnKTtyPWg7dmFyIHU9bCh0LGUsbik7aWYoIm5vcm1hbCI9PT11LnR5cGUpe2lmKHI9bi5kb25lP2Q6cCx1LmFyZz09PWcpY29udGludWU7cmV0dXJue3ZhbHVlOnUuYXJnLGRvbmU6bi5kb25lfX0idGhyb3ciPT09dS50eXBlJiYocj1kLG4ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9dS5hcmcpfX19KHQsbixhKSxpfWZ1bmN0aW9uIGwodCxlLG4pe3RyeXtyZXR1cm57dHlwZToibm9ybWFsIixhcmc6dC5jYWxsKGUsbil9fWNhdGNoKHQpe3JldHVybnt0eXBlOiJ0aHJvdyIsYXJnOnR9fX10LndyYXA9Yzt2YXIgZj0ic3VzcGVuZGVkU3RhcnQiLHA9InN1c3BlbmRlZFlpZWxkIixoPSJleGVjdXRpbmciLGQ9ImNvbXBsZXRlZCIsZz17fTtmdW5jdGlvbiB2KCl7fWZ1bmN0aW9uIHkoKXt9ZnVuY3Rpb24gbSgpe312YXIgYj17fTtiW2ldPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3ZhciB4PU9iamVjdC5nZXRQcm90b3R5cGVPZix3PXgmJngoeChDKFtdKSkpO3cmJnchPT1uJiZyLmNhbGwodyxpKSYmKGI9dyk7dmFyIGs9bS5wcm90b3R5cGU9di5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShiKTtmdW5jdGlvbiBTKHQpe1sibmV4dCIsInRocm93IiwicmV0dXJuIl0uZm9yRWFjaChmdW5jdGlvbihlKXt1KHQsZSxmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faW52b2tlKGUsdCl9KX0pfWZ1bmN0aW9uIEUodCxlKXt2YXIgbjt0aGlzLl9pbnZva2U9ZnVuY3Rpb24obyxpKXtmdW5jdGlvbiBhKCl7cmV0dXJuIG5ldyBlKGZ1bmN0aW9uKG4sYSl7IWZ1bmN0aW9uIG4obyxpLGEscyl7dmFyIHU9bCh0W29dLHQsaSk7aWYoInRocm93IiE9PXUudHlwZSl7dmFyIGM9dS5hcmcsZj1jLnZhbHVlO3JldHVybiBmJiYib2JqZWN0Ij09dHlwZW9mIGYmJnIuY2FsbChmLCJfX2F3YWl0Iik/ZS5yZXNvbHZlKGYuX19hd2FpdCkudGhlbihmdW5jdGlvbih0KXtuKCJuZXh0Iix0LGEscyl9LGZ1bmN0aW9uKHQpe24oInRocm93Iix0LGEscyl9KTplLnJlc29sdmUoZikudGhlbihmdW5jdGlvbih0KXtjLnZhbHVlPXQsYShjKX0sZnVuY3Rpb24odCl7cmV0dXJuIG4oInRocm93Iix0LGEscyl9KX1zKHUuYXJnKX0obyxpLG4sYSl9KX1yZXR1cm4gbj1uP24udGhlbihhLGEpOmEoKX19ZnVuY3Rpb24gaih0LG4pe3ZhciByPXQuaXRlcmF0b3Jbbi5tZXRob2RdO2lmKHI9PT1lKXtpZihuLmRlbGVnYXRlPW51bGwsInRocm93Ij09PW4ubWV0aG9kKXtpZih0Lml0ZXJhdG9yLnJldHVybiYmKG4ubWV0aG9kPSJyZXR1cm4iLG4uYXJnPWUsaih0LG4pLCJ0aHJvdyI9PT1uLm1ldGhvZCkpcmV0dXJuIGc7bi5tZXRob2Q9InRocm93IixuLmFyZz1uZXcgVHlwZUVycm9yKCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kIil9cmV0dXJuIGd9dmFyIG89bChyLHQuaXRlcmF0b3Isbi5hcmcpO2lmKCJ0aHJvdyI9PT1vLnR5cGUpcmV0dXJuIG4ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9by5hcmcsbi5kZWxlZ2F0ZT1udWxsLGc7dmFyIGk9by5hcmc7cmV0dXJuIGk/aS5kb25lPyhuW3QucmVzdWx0TmFtZV09aS52YWx1ZSxuLm5leHQ9dC5uZXh0TG9jLCJyZXR1cm4iIT09bi5tZXRob2QmJihuLm1ldGhvZD0ibmV4dCIsbi5hcmc9ZSksbi5kZWxlZ2F0ZT1udWxsLGcpOmk6KG4ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9bmV3IFR5cGVFcnJvcigiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3QiKSxuLmRlbGVnYXRlPW51bGwsZyl9ZnVuY3Rpb24gVCh0KXt2YXIgZT17dHJ5TG9jOnRbMF19OzEgaW4gdCYmKGUuY2F0Y2hMb2M9dFsxXSksMiBpbiB0JiYoZS5maW5hbGx5TG9jPXRbMl0sZS5hZnRlckxvYz10WzNdKSx0aGlzLnRyeUVudHJpZXMucHVzaChlKX1mdW5jdGlvbiBPKHQpe3ZhciBlPXQuY29tcGxldGlvbnx8e307ZS50eXBlPSJub3JtYWwiLGRlbGV0ZSBlLmFyZyx0LmNvbXBsZXRpb249ZX1mdW5jdGlvbiBBKHQpe3RoaXMudHJ5RW50cmllcz1be3RyeUxvYzoicm9vdCJ9XSx0LmZvckVhY2goVCx0aGlzKSx0aGlzLnJlc2V0KCEwKX1mdW5jdGlvbiBDKHQpe2lmKHQpe3ZhciBuPXRbaV07aWYobilyZXR1cm4gbi5jYWxsKHQpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0Lm5leHQpcmV0dXJuIHQ7aWYoIWlzTmFOKHQubGVuZ3RoKSl7dmFyIG89LTEsYT1mdW5jdGlvbiBuKCl7Zm9yKDsrK288dC5sZW5ndGg7KWlmKHIuY2FsbCh0LG8pKXJldHVybiBuLnZhbHVlPXRbb10sbi5kb25lPSExLG47cmV0dXJuIG4udmFsdWU9ZSxuLmRvbmU9ITAsbn07cmV0dXJuIGEubmV4dD1hfX1yZXR1cm57bmV4dDpMfX1mdW5jdGlvbiBMKCl7cmV0dXJue3ZhbHVlOmUsZG9uZTohMH19cmV0dXJuIHkucHJvdG90eXBlPWsuY29uc3RydWN0b3I9bSxtLmNvbnN0cnVjdG9yPXkseS5kaXNwbGF5TmFtZT11KG0scywiR2VuZXJhdG9yRnVuY3Rpb24iKSx0LmlzR2VuZXJhdG9yRnVuY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQuY29uc3RydWN0b3I7cmV0dXJuISFlJiYoZT09PXl8fCJHZW5lcmF0b3JGdW5jdGlvbiI9PT0oZS5kaXNwbGF5TmFtZXx8ZS5uYW1lKSl9LHQubWFyaz1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LG0pOih0Ll9fcHJvdG9fXz1tLHUodCxzLCJHZW5lcmF0b3JGdW5jdGlvbiIpKSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGspLHR9LHQuYXdyYXA9ZnVuY3Rpb24odCl7cmV0dXJue19fYXdhaXQ6dH19LFMoRS5wcm90b3R5cGUpLEUucHJvdG90eXBlW2FdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQuQXN5bmNJdGVyYXRvcj1FLHQuYXN5bmM9ZnVuY3Rpb24oZSxuLHIsbyxpKXt2b2lkIDA9PT1pJiYoaT1Qcm9taXNlKTt2YXIgYT1uZXcgRShjKGUsbixyLG8pLGkpO3JldHVybiB0LmlzR2VuZXJhdG9yRnVuY3Rpb24obik/YTphLm5leHQoKS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiB0LmRvbmU/dC52YWx1ZTphLm5leHQoKX0pfSxTKGspLHUoayxzLCJHZW5lcmF0b3IiKSxrW2ldPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGsudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iW29iamVjdCBHZW5lcmF0b3JdIn0sdC5rZXlzPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KWUucHVzaChuKTtyZXR1cm4gZS5yZXZlcnNlKCksZnVuY3Rpb24gbigpe2Zvcig7ZS5sZW5ndGg7KXt2YXIgcj1lLnBvcCgpO2lmKHIgaW4gdClyZXR1cm4gbi52YWx1ZT1yLG4uZG9uZT0hMSxufXJldHVybiBuLmRvbmU9ITAsbn19LHQudmFsdWVzPUMsQS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkEscmVzZXQ6ZnVuY3Rpb24odCl7aWYodGhpcy5wcmV2PTAsdGhpcy5uZXh0PTAsdGhpcy5zZW50PXRoaXMuX3NlbnQ9ZSx0aGlzLmRvbmU9ITEsdGhpcy5kZWxlZ2F0ZT1udWxsLHRoaXMubWV0aG9kPSJuZXh0Iix0aGlzLmFyZz1lLHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKE8pLCF0KWZvcih2YXIgbiBpbiB0aGlzKSJ0Ij09PW4uY2hhckF0KDApJiZyLmNhbGwodGhpcyxuKSYmIWlzTmFOKCtuLnNsaWNlKDEpKSYmKHRoaXNbbl09ZSl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLmRvbmU9ITA7dmFyIHQ9dGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247aWYoInRocm93Ij09PXQudHlwZSl0aHJvdyB0LmFyZztyZXR1cm4gdGhpcy5ydmFsfSxkaXNwYXRjaEV4Y2VwdGlvbjpmdW5jdGlvbih0KXtpZih0aGlzLmRvbmUpdGhyb3cgdDt2YXIgbj10aGlzO2Z1bmN0aW9uIG8ocixvKXtyZXR1cm4gcy50eXBlPSJ0aHJvdyIscy5hcmc9dCxuLm5leHQ9cixvJiYobi5tZXRob2Q9Im5leHQiLG4uYXJnPWUpLCEhb31mb3IodmFyIGk9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2k+PTA7LS1pKXt2YXIgYT10aGlzLnRyeUVudHJpZXNbaV0scz1hLmNvbXBsZXRpb247aWYoInJvb3QiPT09YS50cnlMb2MpcmV0dXJuIG8oImVuZCIpO2lmKGEudHJ5TG9jPD10aGlzLnByZXYpe3ZhciB1PXIuY2FsbChhLCJjYXRjaExvYyIpLGM9ci5jYWxsKGEsImZpbmFsbHlMb2MiKTtpZih1JiZjKXtpZih0aGlzLnByZXY8YS5jYXRjaExvYylyZXR1cm4gbyhhLmNhdGNoTG9jLCEwKTtpZih0aGlzLnByZXY8YS5maW5hbGx5TG9jKXJldHVybiBvKGEuZmluYWxseUxvYyl9ZWxzZSBpZih1KXtpZih0aGlzLnByZXY8YS5jYXRjaExvYylyZXR1cm4gbyhhLmNhdGNoTG9jLCEwKX1lbHNle2lmKCFjKXRocm93IG5ldyBFcnJvcigidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHkiKTtpZih0aGlzLnByZXY8YS5maW5hbGx5TG9jKXJldHVybiBvKGEuZmluYWxseUxvYyl9fX19LGFicnVwdDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7bj49MDstLW4pe3ZhciBvPXRoaXMudHJ5RW50cmllc1tuXTtpZihvLnRyeUxvYzw9dGhpcy5wcmV2JiZyLmNhbGwobywiZmluYWxseUxvYyIpJiZ0aGlzLnByZXY8by5maW5hbGx5TG9jKXt2YXIgaT1vO2JyZWFrfX1pJiYoImJyZWFrIj09PXR8fCJjb250aW51ZSI9PT10KSYmaS50cnlMb2M8PWUmJmU8PWkuZmluYWxseUxvYyYmKGk9bnVsbCk7dmFyIGE9aT9pLmNvbXBsZXRpb246e307cmV0dXJuIGEudHlwZT10LGEuYXJnPWUsaT8odGhpcy5tZXRob2Q9Im5leHQiLHRoaXMubmV4dD1pLmZpbmFsbHlMb2MsZyk6dGhpcy5jb21wbGV0ZShhKX0sY29tcGxldGU6ZnVuY3Rpb24odCxlKXtpZigidGhyb3ciPT09dC50eXBlKXRocm93IHQuYXJnO3JldHVybiJicmVhayI9PT10LnR5cGV8fCJjb250aW51ZSI9PT10LnR5cGU/dGhpcy5uZXh0PXQuYXJnOiJyZXR1cm4iPT09dC50eXBlPyh0aGlzLnJ2YWw9dGhpcy5hcmc9dC5hcmcsdGhpcy5tZXRob2Q9InJldHVybiIsdGhpcy5uZXh0PSJlbmQiKToibm9ybWFsIj09PXQudHlwZSYmZSYmKHRoaXMubmV4dD1lKSxnfSxmaW5pc2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtlPj0wOy0tZSl7dmFyIG49dGhpcy50cnlFbnRyaWVzW2VdO2lmKG4uZmluYWxseUxvYz09PXQpcmV0dXJuIHRoaXMuY29tcGxldGUobi5jb21wbGV0aW9uLG4uYWZ0ZXJMb2MpLE8obiksZ319LGNhdGNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7ZT49MDstLWUpe3ZhciBuPXRoaXMudHJ5RW50cmllc1tlXTtpZihuLnRyeUxvYz09PXQpe3ZhciByPW4uY29tcGxldGlvbjtpZigidGhyb3ciPT09ci50eXBlKXt2YXIgbz1yLmFyZztPKG4pfXJldHVybiBvfX10aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpfSxkZWxlZ2F0ZVlpZWxkOmZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdGhpcy5kZWxlZ2F0ZT17aXRlcmF0b3I6Qyh0KSxyZXN1bHROYW1lOm4sbmV4dExvYzpyfSwibmV4dCI9PT10aGlzLm1ldGhvZCYmKHRoaXMuYXJnPWUpLGd9fSx0fSh0LmV4cG9ydHMpO3RyeXtyZWdlbmVyYXRvclJ1bnRpbWU9cn1jYXRjaCh0KXtGdW5jdGlvbigiciIsInJlZ2VuZXJhdG9yUnVudGltZSA9IHIiKShyKX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDkpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNTApLG89RnVuY3Rpb24ucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmJpbmQ7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgRnVuY3Rpb24mJmU9PT1vLmJpbmQ/cjplfX0sZnVuY3Rpb24odCxlLG4pe24oMjUxKTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiRnVuY3Rpb24iKS5iaW5kfSxmdW5jdGlvbih0LGUsbil7bigwKSh7dGFyZ2V0OiJGdW5jdGlvbiIscHJvdG86ITB9LHtiaW5kOm4oOTEpfSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNTMpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTE2KSxuKDI1OSksbigyNjApLG4oMjYxKSxuKDI2Mil9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHIsbyxpLGEscz1uKDApLHU9bigyOCksYz1uKDUpLGw9bigxKSxmPW4oMTE3KSxwPW4oMzYpLGg9bigxMTgpLGQ9bigyOSksZz1uKDI1NSksdj1uKDcpLHk9bigyMiksbT1uKDExOSksYj1uKDI3KSx4PW4oNTkpLHc9bigxMTMpLGs9bigxMjApLFM9bigxMjEpLnNldCxFPW4oMjU2KSxqPW4oMTIyKSxUPW4oMjU3KSxPPW4oNTMpLEE9big2MCksQz1uKDc5KSxMPW4oNTApLFI9big4NyksUD1uKDIpKCJzcGVjaWVzIiksTj0iUHJvbWlzZSIsST1MLmdldCxfPUwuc2V0LEQ9TC5nZXR0ZXJGb3IoTiksTT1mLFU9Yy5UeXBlRXJyb3IsQj1jLmRvY3VtZW50LHE9Yy5wcm9jZXNzLEY9Yy5mZXRjaCxIPXEmJnEudmVyc2lvbnMsej1IJiZILnY4fHwiIixXPU8uZiwkPVcsWT0icHJvY2VzcyI9PWIocSksVj0hIShCJiZCLmNyZWF0ZUV2ZW50JiZjLmRpc3BhdGNoRXZlbnQpLEc9UihOLGZ1bmN0aW9uKCl7dmFyIHQ9TS5yZXNvbHZlKDEpLGU9ZnVuY3Rpb24oKXt9LG49KHQuY29uc3RydWN0b3I9e30pW1BdPWZ1bmN0aW9uKHQpe3QoZSxlKX07cmV0dXJuISgoWXx8ImZ1bmN0aW9uIj09dHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCkmJighdXx8dC5maW5hbGx5KSYmdC50aGVuKGUpaW5zdGFuY2VvZiBuJiYwIT09ei5pbmRleE9mKCI2LjYiKSYmLTE9PT1DLmluZGV4T2YoIkNocm9tZS82NiIpKX0pLEs9R3x8IXcoZnVuY3Rpb24odCl7TS5hbGwodCkuY2F0Y2goZnVuY3Rpb24oKXt9KX0pLFg9ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuISghdih0KXx8ImZ1bmN0aW9uIiE9dHlwZW9mKGU9dC50aGVuKSkmJmV9LEo9ZnVuY3Rpb24odCxlLG4pe2lmKCFlLm5vdGlmaWVkKXtlLm5vdGlmaWVkPSEwO3ZhciByPWUucmVhY3Rpb25zO0UoZnVuY3Rpb24oKXtmb3IodmFyIG89ZS52YWx1ZSxpPTE9PWUuc3RhdGUsYT0wO3IubGVuZ3RoPmE7KXt2YXIgcyx1LGMsbD1yW2ErK10sZj1pP2wub2s6bC5mYWlsLHA9bC5yZXNvbHZlLGg9bC5yZWplY3QsZD1sLmRvbWFpbjt0cnl7Zj8oaXx8KDI9PT1lLnJlamVjdGlvbiYmZXQodCxlKSxlLnJlamVjdGlvbj0xKSwhMD09PWY/cz1vOihkJiZkLmVudGVyKCkscz1mKG8pLGQmJihkLmV4aXQoKSxjPSEwKSkscz09PWwucHJvbWlzZT9oKFUoIlByb21pc2UtY2hhaW4gY3ljbGUiKSk6KHU9WChzKSk/dS5jYWxsKHMscCxoKTpwKHMpKTpoKG8pfWNhdGNoKHQpe2QmJiFjJiZkLmV4aXQoKSxoKHQpfX1lLnJlYWN0aW9ucz1bXSxlLm5vdGlmaWVkPSExLG4mJiFlLnJlamVjdGlvbiYmWih0LGUpfSl9fSxRPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvO1Y/KChyPUIuY3JlYXRlRXZlbnQoIkV2ZW50IikpLnByb21pc2U9ZSxyLnJlYXNvbj1uLHIuaW5pdEV2ZW50KHQsITEsITApLGMuZGlzcGF0Y2hFdmVudChyKSk6cj17cHJvbWlzZTplLHJlYXNvbjpufSwobz1jWyJvbiIrdF0pP28ocik6InVuaGFuZGxlZHJlamVjdGlvbiI9PT10JiZUKCJVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24iLG4pfSxaPWZ1bmN0aW9uKHQsZSl7Uy5jYWxsKGMsZnVuY3Rpb24oKXt2YXIgbixyPWUudmFsdWU7aWYodHQoZSkmJihuPUEoZnVuY3Rpb24oKXtZP3EuZW1pdCgidW5oYW5kbGVkUmVqZWN0aW9uIixyLHQpOlEoInVuaGFuZGxlZHJlamVjdGlvbiIsdCxyKX0pLGUucmVqZWN0aW9uPVl8fHR0KGUpPzI6MSxuLmVycm9yKSl0aHJvdyBuLnZhbHVlfSl9LHR0PWZ1bmN0aW9uKHQpe3JldHVybiAxIT09dC5yZWplY3Rpb24mJiF0LnBhcmVudH0sZXQ9ZnVuY3Rpb24odCxlKXtTLmNhbGwoYyxmdW5jdGlvbigpe1k/cS5lbWl0KCJyZWplY3Rpb25IYW5kbGVkIix0KTpRKCJyZWplY3Rpb25oYW5kbGVkIix0LGUudmFsdWUpfSl9LG50PWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBmdW5jdGlvbihvKXt0KGUsbixvLHIpfX0scnQ9ZnVuY3Rpb24odCxlLG4scil7ZS5kb25lfHwoZS5kb25lPSEwLHImJihlPXIpLGUudmFsdWU9bixlLnN0YXRlPTIsSih0LGUsITApKX0sb3Q9ZnVuY3Rpb24odCxlLG4scil7aWYoIWUuZG9uZSl7ZS5kb25lPSEwLHImJihlPXIpO3RyeXtpZih0PT09bil0aHJvdyBVKCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZiIpO3ZhciBvPVgobik7bz9FKGZ1bmN0aW9uKCl7dmFyIHI9e2RvbmU6ITF9O3RyeXtvLmNhbGwobixudChvdCx0LHIsZSksbnQocnQsdCxyLGUpKX1jYXRjaChuKXtydCh0LHIsbixlKX19KTooZS52YWx1ZT1uLGUuc3RhdGU9MSxKKHQsZSwhMSkpfWNhdGNoKG4pe3J0KHQse2RvbmU6ITF9LG4sZSl9fX07RyYmKE09ZnVuY3Rpb24odCl7bSh0aGlzLE0sTikseSh0KSxyLmNhbGwodGhpcyk7dmFyIGU9SSh0aGlzKTt0cnl7dChudChvdCx0aGlzLGUpLG50KHJ0LHRoaXMsZSkpfWNhdGNoKHQpe3J0KHRoaXMsZSx0KX19LChyPWZ1bmN0aW9uKHQpe18odGhpcyx7dHlwZTpOLGRvbmU6ITEsbm90aWZpZWQ6ITEscGFyZW50OiExLHJlYWN0aW9uczpbXSxyZWplY3Rpb246ITEsc3RhdGU6MCx2YWx1ZTp2b2lkIDB9KX0pLnByb3RvdHlwZT1oKE0ucHJvdG90eXBlLHt0aGVuOmZ1bmN0aW9uKHQsZSl7dmFyIG49RCh0aGlzKSxyPVcoayh0aGlzLE0pKTtyZXR1cm4gci5vaz0iZnVuY3Rpb24iIT10eXBlb2YgdHx8dCxyLmZhaWw9ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUsci5kb21haW49WT9xLmRvbWFpbjp2b2lkIDAsbi5wYXJlbnQ9ITAsbi5yZWFjdGlvbnMucHVzaChyKSwwIT1uLnN0YXRlJiZKKHRoaXMsbiwhMSksci5wcm9taXNlfSxjYXRjaDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aGVuKHZvaWQgMCx0KX19KSxvPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHIsZT1JKHQpO3RoaXMucHJvbWlzZT10LHRoaXMucmVzb2x2ZT1udChvdCx0LGUpLHRoaXMucmVqZWN0PW50KHJ0LHQsZSl9LE8uZj1XPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09TXx8dD09PWk/bmV3IG8odCk6JCh0KX0sdXx8ImZ1bmN0aW9uIiE9dHlwZW9mIGZ8fChhPWYucHJvdG90eXBlLnRoZW4scChmLnByb3RvdHlwZSwidGhlbiIsZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3JldHVybiBuZXcgTShmdW5jdGlvbih0LGUpe2EuY2FsbChuLHQsZSl9KS50aGVuKHQsZSl9KSwiZnVuY3Rpb24iPT10eXBlb2YgRiYmcyh7Z2xvYmFsOiEwLGVudW1lcmFibGU6ITAsZm9yY2VkOiEwfSx7ZmV0Y2g6ZnVuY3Rpb24odCl7cmV0dXJuIGooTSxGLmFwcGx5KGMsYXJndW1lbnRzKSl9fSkpKSxzKHtnbG9iYWw6ITAsd3JhcDohMCxmb3JjZWQ6R30se1Byb21pc2U6TX0pLGQoTSxOLCExLCEwKSxnKE4pLGk9bC5Qcm9taXNlLHMoe3RhcmdldDpOLHN0YXQ6ITAsZm9yY2VkOkd9LHtyZWplY3Q6ZnVuY3Rpb24odCl7dmFyIGU9Vyh0aGlzKTtyZXR1cm4gZS5yZWplY3QuY2FsbCh2b2lkIDAsdCksZS5wcm9taXNlfX0pLHMoe3RhcmdldDpOLHN0YXQ6ITAsZm9yY2VkOnV8fEd9LHtyZXNvbHZlOmZ1bmN0aW9uKHQpe3JldHVybiBqKHUmJnRoaXM9PT1pP006dGhpcyx0KX19KSxzKHt0YXJnZXQ6TixzdGF0OiEwLGZvcmNlZDpLfSx7YWxsOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1XKGUpLHI9bi5yZXNvbHZlLG89bi5yZWplY3QsaT1BKGZ1bmN0aW9uKCl7dmFyIG49eShlLnJlc29sdmUpLGk9W10sYT0wLHM9MTt4KHQsZnVuY3Rpb24odCl7dmFyIHU9YSsrLGM9ITE7aS5wdXNoKHZvaWQgMCkscysrLG4uY2FsbChlLHQpLnRoZW4oZnVuY3Rpb24odCl7Y3x8KGM9ITAsaVt1XT10LC0tc3x8cihpKSl9LG8pfSksLS1zfHxyKGkpfSk7cmV0dXJuIGkuZXJyb3ImJm8oaS52YWx1ZSksbi5wcm9taXNlfSxyYWNlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1XKGUpLHI9bi5yZWplY3Qsbz1BKGZ1bmN0aW9uKCl7dmFyIG89eShlLnJlc29sdmUpO3godCxmdW5jdGlvbih0KXtvLmNhbGwoZSx0KS50aGVuKG4ucmVzb2x2ZSxyKX0pfSk7cmV0dXJuIG8uZXJyb3ImJnIoby52YWx1ZSksbi5wcm9taXNlfX0pfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzMpLG89bigyMyksaT1uKDIpLGE9bigxMykscz1pKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXIodCksbj1vLmY7YSYmZSYmIWVbc10mJm4oZSxzLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGEscyx1LGMsbD1uKDUpLGY9big0NSkuZixwPW4oMjcpLGg9bigxMjEpLnNldCxkPW4oNzkpLGc9bC5NdXRhdGlvbk9ic2VydmVyfHxsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXIsdj1sLnByb2Nlc3MseT1sLlByb21pc2UsbT0icHJvY2VzcyI9PXAodiksYj1mKGwsInF1ZXVlTWljcm90YXNrIikseD1iJiZiLnZhbHVlO3h8fChyPWZ1bmN0aW9uKCl7dmFyIHQsZTtmb3IobSYmKHQ9di5kb21haW4pJiZ0LmV4aXQoKTtvOyl7ZT1vLmZuLG89by5uZXh0O3RyeXtlKCl9Y2F0Y2godCl7dGhyb3cgbz9hKCk6aT12b2lkIDAsdH19aT12b2lkIDAsdCYmdC5lbnRlcigpfSxtP2E9ZnVuY3Rpb24oKXt2Lm5leHRUaWNrKHIpfTpnJiYhLyhpcGhvbmV8aXBvZHxpcGFkKS4qYXBwbGV3ZWJraXQvaS50ZXN0KGQpPyhzPSEwLHU9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpLG5ldyBnKHIpLm9ic2VydmUodSx7Y2hhcmFjdGVyRGF0YTohMH0pLGE9ZnVuY3Rpb24oKXt1LmRhdGE9cz0hc30pOnkmJnkucmVzb2x2ZT8oYz15LnJlc29sdmUodm9pZCAwKSxhPWZ1bmN0aW9uKCl7Yy50aGVuKHIpfSk6YT1mdW5jdGlvbigpe2guY2FsbChsLHIpfSksdC5leHBvcnRzPXh8fGZ1bmN0aW9uKHQpe3ZhciBlPXtmbjp0LG5leHQ6dm9pZCAwfTtpJiYoaS5uZXh0PWUpLG98fChvPWUsYSgpKSxpPWV9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj1yLmNvbnNvbGU7biYmbi5lcnJvciYmKDE9PT1hcmd1bWVudHMubGVuZ3RoP24uZXJyb3IodCk6bi5lcnJvcih0LGUpKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oMjgpLGk9bigxMTcpLGE9bigzMykscz1uKDEyMCksdT1uKDEyMiksYz1uKDM2KTtyKHt0YXJnZXQ6IlByb21pc2UiLHByb3RvOiEwLHJlYWw6ITB9LHtmaW5hbGx5OmZ1bmN0aW9uKHQpe3ZhciBlPXModGhpcyxhKCJQcm9taXNlIikpLG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ7cmV0dXJuIHRoaXMudGhlbihuP2Z1bmN0aW9uKG4pe3JldHVybiB1KGUsdCgpKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIG59KX06dCxuP2Z1bmN0aW9uKG4pe3JldHVybiB1KGUsdCgpKS50aGVuKGZ1bmN0aW9uKCl7dGhyb3cgbn0pfTp0KX19KSxvfHwiZnVuY3Rpb24iIT10eXBlb2YgaXx8aS5wcm90b3R5cGUuZmluYWxseXx8YyhpLnByb3RvdHlwZSwiZmluYWxseSIsYSgiUHJvbWlzZSIpLnByb3RvdHlwZS5maW5hbGx5KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDQ5KSxpPW4oNzQpLGE9big0Nykscz1uKDMxKSx1PW4oNTkpLGM9bigxNyksbD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7aWYoIShuIGluc3RhbmNlb2YgbCkpcmV0dXJuIG5ldyBsKHQsZSk7aSYmKG49aShuZXcgRXJyb3IoZSksbyhuKSkpO3ZhciByPVtdO3JldHVybiB1KHQsci5wdXNoLHIpLGMobiwiZXJyb3JzIixyKSx2b2lkIDAhPT1lJiZjKG4sIm1lc3NhZ2UiLFN0cmluZyhlKSksbn07bC5wcm90b3R5cGU9YShFcnJvci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnMoNSxsKSxuYW1lOnMoNSwiQWdncmVnYXRlRXJyb3IiKX0pLHIoe2dsb2JhbDohMH0se0FnZ3JlZ2F0ZUVycm9yOmx9KX0sZnVuY3Rpb24odCxlLG4pe24oMTIzKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89big1MyksaT1uKDYwKTtyKHt0YXJnZXQ6IlByb21pc2UiLHN0YXQ6ITB9LHt0cnk6ZnVuY3Rpb24odCl7dmFyIGU9by5mKHRoaXMpLG49aSh0KTtyZXR1cm4obi5lcnJvcj9lLnJlamVjdDplLnJlc29sdmUpKG4udmFsdWUpLGUucHJvbWlzZX19KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89bigyMiksaT1uKDMzKSxhPW4oNTMpLHM9big2MCksdT1uKDU5KTtyKHt0YXJnZXQ6IlByb21pc2UiLHN0YXQ6ITB9LHthbnk6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWEuZihlKSxyPW4ucmVzb2x2ZSxjPW4ucmVqZWN0LGw9cyhmdW5jdGlvbigpe3ZhciBuPW8oZS5yZXNvbHZlKSxhPVtdLHM9MCxsPTEsZj0hMTt1KHQsZnVuY3Rpb24odCl7dmFyIG89cysrLHU9ITE7YS5wdXNoKHZvaWQgMCksbCsrLG4uY2FsbChlLHQpLnRoZW4oZnVuY3Rpb24odCl7dXx8Znx8KGY9ITAscih0KSl9LGZ1bmN0aW9uKHQpe3V8fGZ8fCh1PSEwLGFbb109dCwtLWx8fGMobmV3KGkoIkFnZ3JlZ2F0ZUVycm9yIikpKGEsIk5vIG9uZSBwcm9taXNlIHJlc29sdmVkIikpKX0pfSksLS1sfHxjKG5ldyhpKCJBZ2dyZWdhdGVFcnJvciIpKShhLCJObyBvbmUgcHJvbWlzZSByZXNvbHZlZCIpKX0pO3JldHVybiBsLmVycm9yJiZjKGwudmFsdWUpLG4ucHJvbWlzZX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDExNil9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fXJldHVybiBmdW5jdGlvbihlLG4scil7cmV0dXJuIG4mJnQoZS5wcm90b3R5cGUsbiksciYmdChlLHIpLGV9fSgpLG89ZnVuY3Rpb24odCl7aWYodCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBlPXt9O2lmKG51bGwhPXQpZm9yKHZhciBuIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJihlW25dPXRbbl0pO3JldHVybiBlLmRlZmF1bHQ9dCxlfShuKDI2NSkpLGk9cChuKDI2NikpLGE9cChuKDI2NykpLHM9cChuKDI2OCkpLHU9cChuKDI2OSkpLGM9cChuKDI3MCkpLGw9cChuKDI3MSkpLGY9cChuKDI3MikpO2Z1bmN0aW9uIHAodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fXZhciBoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307IWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsdCksdGhpcy50eXBlPSJsYW5ndWFnZURldGVjdG9yIix0aGlzLmRldGVjdG9ycz17fSx0aGlzLmluaXQoZSxuKX1yZXR1cm4gcih0LFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e30sbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e307dGhpcy5zZXJ2aWNlcz10LHRoaXMub3B0aW9ucz1vLmRlZmF1bHRzKGUsdGhpcy5vcHRpb25zfHx7fSx7b3JkZXI6WyJxdWVyeXN0cmluZyIsImNvb2tpZSIsImxvY2FsU3RvcmFnZSIsIm5hdmlnYXRvciIsImh0bWxUYWciXSxsb29rdXBRdWVyeXN0cmluZzoibG5nIixsb29rdXBDb29raWU6ImkxOG5leHQiLGxvb2t1cExvY2FsU3RvcmFnZToiaTE4bmV4dExuZyIsY2FjaGVzOlsibG9jYWxTdG9yYWdlIl0sZXhjbHVkZUNhY2hlRm9yOlsiY2ltb2RlIl19KSx0aGlzLm9wdGlvbnMubG9va3VwRnJvbVVybEluZGV4JiYodGhpcy5vcHRpb25zLmxvb2t1cEZyb21QYXRoSW5kZXg9dGhpcy5vcHRpb25zLmxvb2t1cEZyb21VcmxJbmRleCksdGhpcy5pMThuT3B0aW9ucz1uLHRoaXMuYWRkRGV0ZWN0b3IoaS5kZWZhdWx0KSx0aGlzLmFkZERldGVjdG9yKGEuZGVmYXVsdCksdGhpcy5hZGREZXRlY3RvcihzLmRlZmF1bHQpLHRoaXMuYWRkRGV0ZWN0b3IodS5kZWZhdWx0KSx0aGlzLmFkZERldGVjdG9yKGMuZGVmYXVsdCksdGhpcy5hZGREZXRlY3RvcihsLmRlZmF1bHQpLHRoaXMuYWRkRGV0ZWN0b3IoZi5kZWZhdWx0KX19LHtrZXk6ImFkZERldGVjdG9yIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmRldGVjdG9yc1t0Lm5hbWVdPXR9fSx7a2V5OiJkZXRlY3QiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dHx8KHQ9dGhpcy5vcHRpb25zLm9yZGVyKTt2YXIgbj1bXTt0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoZS5kZXRlY3RvcnNbdF0pe3ZhciByPWUuZGV0ZWN0b3JzW3RdLmxvb2t1cChlLm9wdGlvbnMpO3ImJiJzdHJpbmciPT10eXBlb2YgciYmKHI9W3JdKSxyJiYobj1uLmNvbmNhdChyKSl9fSk7dmFyIHI9dm9pZCAwO2lmKG4uZm9yRWFjaChmdW5jdGlvbih0KXtpZighcil7dmFyIG49ZS5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmZvcm1hdExhbmd1YWdlQ29kZSh0KTtlLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuaXNXaGl0ZWxpc3RlZChuKSYmKHI9bil9fSksIXIpe3ZhciBvPXRoaXMuaTE4bk9wdGlvbnMuZmFsbGJhY2tMbmc7InN0cmluZyI9PXR5cGVvZiBvJiYobz1bb10pLG98fChvPVtdKSxyPSJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KG8pP29bMF06b1swXXx8by5kZWZhdWx0JiZvLmRlZmF1bHRbMF19cmV0dXJuIHJ9fSx7a2V5OiJjYWNoZVVzZXJMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2V8fChlPXRoaXMub3B0aW9ucy5jYWNoZXMpLGUmJih0aGlzLm9wdGlvbnMuZXhjbHVkZUNhY2hlRm9yJiZ0aGlzLm9wdGlvbnMuZXhjbHVkZUNhY2hlRm9yLmluZGV4T2YodCk+LTF8fGUuZm9yRWFjaChmdW5jdGlvbihlKXtuLmRldGVjdG9yc1tlXSYmbi5kZXRlY3RvcnNbZV0uY2FjaGVVc2VyTGFuZ3VhZ2UodCxuLm9wdGlvbnMpfSkpfX1dKSx0fSgpO2gudHlwZT0ibGFuZ3VhZ2VEZXRlY3RvciIsZS5kZWZhdWx0PWh9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdHM9ZnVuY3Rpb24odCl7cmV0dXJuIG8uY2FsbChpLmNhbGwoYXJndW1lbnRzLDEpLGZ1bmN0aW9uKGUpe2lmKGUpZm9yKHZhciBuIGluIGUpdm9pZCAwPT09dFtuXSYmKHRbbl09ZVtuXSl9KSx0fSxlLmV4dGVuZD1mdW5jdGlvbih0KXtyZXR1cm4gby5jYWxsKGkuY2FsbChhcmd1bWVudHMsMSksZnVuY3Rpb24oZSl7aWYoZSlmb3IodmFyIG4gaW4gZSl0W25dPWVbbl19KSx0fTt2YXIgcj1bXSxvPXIuZm9yRWFjaCxpPXIuc2xpY2V9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPXZvaWQgMDtpZihuKXt2YXIgaT1uZXcgRGF0ZTtpLnNldFRpbWUoaS5nZXRUaW1lKCkrNjAqbioxZTMpLG89IjsgZXhwaXJlcz0iK2kudG9HTVRTdHJpbmcoKX1lbHNlIG89IiI7cj1yPyJkb21haW49IityKyI7IjoiIixkb2N1bWVudC5jb29raWU9dCsiPSIrZStvKyI7IityKyJwYXRoPS8ifSxvPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10KyI9IixuPWRvY3VtZW50LmNvb2tpZS5zcGxpdCgiOyIpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7Zm9yKHZhciBvPW5bcl07IiAiPT09by5jaGFyQXQoMCk7KW89by5zdWJzdHJpbmcoMSxvLmxlbmd0aCk7aWYoMD09PW8uaW5kZXhPZihlKSlyZXR1cm4gby5zdWJzdHJpbmcoZS5sZW5ndGgsby5sZW5ndGgpfXJldHVybiBudWxsfTtlLmRlZmF1bHQ9e25hbWU6ImNvb2tpZSIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMDtpZih0Lmxvb2t1cENvb2tpZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCl7dmFyIG49byh0Lmxvb2t1cENvb2tpZSk7biYmKGU9bil9cmV0dXJuIGV9LGNhY2hlVXNlckxhbmd1YWdlOmZ1bmN0aW9uKHQsZSl7ZS5sb29rdXBDb29raWUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJnIoZS5sb29rdXBDb29raWUsdCxlLmNvb2tpZU1pbnV0ZXMsZS5jb29raWVEb21haW4pfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD17bmFtZToicXVlcnlzdHJpbmciLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDA7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cpZm9yKHZhciBuPXdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKDEpLnNwbGl0KCImIikscj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgbz1uW3JdLmluZGV4T2YoIj0iKTtpZihvPjApbltyXS5zdWJzdHJpbmcoMCxvKT09PXQubG9va3VwUXVlcnlzdHJpbmcmJihlPW5bcl0uc3Vic3RyaW5nKG8rMSkpfXJldHVybiBlfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPXZvaWQgMDt0cnl7cj0idW5kZWZpbmVkIiE9PXdpbmRvdyYmbnVsbCE9PXdpbmRvdy5sb2NhbFN0b3JhZ2U7d2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKCJpMThuZXh0LnRyYW5zbGF0ZS5ib28iLCJmb28iKSx3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oImkxOG5leHQudHJhbnNsYXRlLmJvbyIpfWNhdGNoKHQpe3I9ITF9ZS5kZWZhdWx0PXtuYW1lOiJsb2NhbFN0b3JhZ2UiLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDA7aWYodC5sb29rdXBMb2NhbFN0b3JhZ2UmJnIpe3ZhciBuPXdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0Lmxvb2t1cExvY2FsU3RvcmFnZSk7biYmKGU9bil9cmV0dXJuIGV9LGNhY2hlVXNlckxhbmd1YWdlOmZ1bmN0aW9uKHQsZSl7ZS5sb29rdXBMb2NhbFN0b3JhZ2UmJnImJndpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShlLmxvb2t1cExvY2FsU3RvcmFnZSx0KX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHQ9e25hbWU6Im5hdmlnYXRvciIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPVtdO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yKXtpZihuYXZpZ2F0b3IubGFuZ3VhZ2VzKWZvcih2YXIgbj0wO248bmF2aWdhdG9yLmxhbmd1YWdlcy5sZW5ndGg7bisrKWUucHVzaChuYXZpZ2F0b3IubGFuZ3VhZ2VzW25dKTtuYXZpZ2F0b3IudXNlckxhbmd1YWdlJiZlLnB1c2gobmF2aWdhdG9yLnVzZXJMYW5ndWFnZSksbmF2aWdhdG9yLmxhbmd1YWdlJiZlLnB1c2gobmF2aWdhdG9yLmxhbmd1YWdlKX1yZXR1cm4gZS5sZW5ndGg+MD9lOnZvaWQgMH19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHQ9e25hbWU6Imh0bWxUYWciLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDAsbj10Lmh0bWxUYWd8fCgidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50P2RvY3VtZW50LmRvY3VtZW50RWxlbWVudDpudWxsKTtyZXR1cm4gbiYmImZ1bmN0aW9uIj09dHlwZW9mIG4uZ2V0QXR0cmlidXRlJiYoZT1uLmdldEF0dHJpYnV0ZSgibGFuZyIpKSxlfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD17bmFtZToicGF0aCIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyl7dmFyIG49d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLm1hdGNoKC9cLyhbYS16QS1aLV0qKS9nKTtpZihuIGluc3RhbmNlb2YgQXJyYXkpaWYoIm51bWJlciI9PXR5cGVvZiB0Lmxvb2t1cEZyb21QYXRoSW5kZXgpe2lmKCJzdHJpbmciIT10eXBlb2Ygblt0Lmxvb2t1cEZyb21QYXRoSW5kZXhdKXJldHVybjtlPW5bdC5sb29rdXBGcm9tUGF0aEluZGV4XS5yZXBsYWNlKCIvIiwiIil9ZWxzZSBlPW5bMF0ucmVwbGFjZSgiLyIsIiIpfXJldHVybiBlfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD17bmFtZToic3ViZG9tYWluIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93KXt2YXIgbj13aW5kb3cubG9jYXRpb24uaHJlZi5tYXRjaCgvKD86aHR0cFtzXSpcOlwvXC8pKiguKj8pXC4oPz1bXlwvXSpcLi57Miw1fSkvZ2kpO24gaW5zdGFuY2VvZiBBcnJheSYmKGU9Im51bWJlciI9PXR5cGVvZiB0Lmxvb2t1cEZyb21TdWJkb21haW5JbmRleD9uW3QubG9va3VwRnJvbVN1YmRvbWFpbkluZGV4XS5yZXBsYWNlKCJodHRwOi8vIiwiIikucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKS5yZXBsYWNlKCIuIiwiIik6blswXS5yZXBsYWNlKCJodHRwOi8vIiwiIikucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKS5yZXBsYWNlKCIuIiwiIikpfXJldHVybiBlfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI3NCksbz1uKDEyNCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHIodCkpcmV0dXJuIG8odCl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjc1KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDEwOSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEyNSksbz1uKDI3OCksaT1uKDEwMyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PWkmJm8oT2JqZWN0KHQpKSlyZXR1cm4gcih0KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMTApfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjc5KX0sZnVuY3Rpb24odCxlLG4pe24oNTEpLG4oMzUpLHQuZXhwb3J0cz1uKDI4MCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDc2KSxvPW4oMiksaT1uKDMwKSxhPW8oIml0ZXJhdG9yIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPU9iamVjdCh0KTtyZXR1cm4gdm9pZCAwIT09ZVthXXx8IkBAaXRlcmF0b3IiaW4gZXx8aS5oYXNPd25Qcm9wZXJ0eShyKGUpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEyNSksbz1uKDI4MiksaT1uKDEyNCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG47aWYodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBpKHQsZSk7dmFyIGE9byhuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSkuY2FsbChuLDgsLTEpO3JldHVybiJPYmplY3QiPT09YSYmdC5jb25zdHJ1Y3RvciYmKGE9dC5jb25zdHJ1Y3Rvci5uYW1lKSwiTWFwIj09PWF8fCJTZXQiPT09YT9yKHQpOiJBcmd1bWVudHMiPT09YXx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QoYSk/aSh0LGUpOnZvaWQgMH19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjgzKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDExNCl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjg2KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjg3KSxvPW4oMjg5KSxpPUFycmF5LnByb3RvdHlwZSxhPVN0cmluZy5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5jbHVkZXM7cmV0dXJuIHQ9PT1pfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1pLmluY2x1ZGVzP3I6InN0cmluZyI9PXR5cGVvZiB0fHx0PT09YXx8dCBpbnN0YW5jZW9mIFN0cmluZyYmZT09PWEuaW5jbHVkZXM/bzplfX0sZnVuY3Rpb24odCxlLG4pe24oMjg4KTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5pbmNsdWRlc30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89big2NykuaW5jbHVkZXMsaT1uKDc3KTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMH0se2luY2x1ZGVzOmZ1bmN0aW9uKHQpe3JldHVybiBvKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSksaSgiaW5jbHVkZXMiKX0sZnVuY3Rpb24odCxlLG4pe24oMjkwKTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiU3RyaW5nIikuaW5jbHVkZXN9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oMjkxKSxpPW4oNDYpO3Ioe3RhcmdldDoiU3RyaW5nIixwcm90bzohMCxmb3JjZWQ6IW4oMjkzKSgiaW5jbHVkZXMiKX0se2luY2x1ZGVzOmZ1bmN0aW9uKHQpe3JldHVybiEhflN0cmluZyhpKHRoaXMpKS5pbmRleE9mKG8odCksYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyOTIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihyKHQpKXRocm93IFR5cGVFcnJvcigiVGhlIG1ldGhvZCBkb2Vzbid0IGFjY2VwdCByZWd1bGFyIGV4cHJlc3Npb25zIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3KSxvPW4oMjcpLGk9bigyKSgibWF0Y2giKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIHIodCkmJih2b2lkIDAhPT0oZT10W2ldKT8hIWU6IlJlZ0V4cCI9PW8odCkpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMikoIm1hdGNoIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPS8uLzt0cnl7Ii8uLyJbdF0oZSl9Y2F0Y2gobil7dHJ5e3JldHVybiBlW3JdPSExLCIvLi8iW3RdKGUpfWNhdGNoKHQpe319cmV0dXJuITF9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiOyhmdW5jdGlvbih0KXsKLyohCiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLgogKgogKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz4KICogQGxpY2Vuc2UgIE1JVAogKi8KdmFyIHI9bigyOTUpLG89bigyOTYpLGk9bigyOTcpO2Z1bmN0aW9uIGEoKXtyZXR1cm4gdS5UWVBFRF9BUlJBWV9TVVBQT1JUPzIxNDc0ODM2NDc6MTA3Mzc0MTgyM31mdW5jdGlvbiBzKHQsZSl7aWYoYSgpPGUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoIik7cmV0dXJuIHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odD1uZXcgVWludDhBcnJheShlKSkuX19wcm90b19fPXUucHJvdG90eXBlOihudWxsPT09dCYmKHQ9bmV3IHUoZSkpLHQubGVuZ3RoPWUpLHR9ZnVuY3Rpb24gdSh0LGUsbil7aWYoISh1LlRZUEVEX0FSUkFZX1NVUFBPUlR8fHRoaXMgaW5zdGFuY2VvZiB1KSlyZXR1cm4gbmV3IHUodCxlLG4pO2lmKCJudW1iZXIiPT10eXBlb2YgdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmciKTtyZXR1cm4gZih0aGlzLHQpfXJldHVybiBjKHRoaXMsdCxlLG4pfWZ1bmN0aW9uIGModCxlLG4scil7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ZnVuY3Rpb24odCxlLG4scil7aWYoZS5ieXRlTGVuZ3RoLG48MHx8ZS5ieXRlTGVuZ3RoPG4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHMiKTtpZihlLmJ5dGVMZW5ndGg8bisocnx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHMiKTtlPXZvaWQgMD09PW4mJnZvaWQgMD09PXI/bmV3IFVpbnQ4QXJyYXkoZSk6dm9pZCAwPT09cj9uZXcgVWludDhBcnJheShlLG4pOm5ldyBVaW50OEFycmF5KGUsbixyKTt1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9ZSkuX19wcm90b19fPXUucHJvdG90eXBlOnQ9cCh0LGUpO3JldHVybiB0fSh0LGUsbixyKToic3RyaW5nIj09dHlwZW9mIGU/ZnVuY3Rpb24odCxlLG4peyJzdHJpbmciPT10eXBlb2YgbiYmIiIhPT1ufHwobj0idXRmOCIpO2lmKCF1LmlzRW5jb2RpbmcobikpdGhyb3cgbmV3IFR5cGVFcnJvcignImVuY29kaW5nIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJyk7dmFyIHI9MHxkKGUsbiksbz0odD1zKHQscikpLndyaXRlKGUsbik7byE9PXImJih0PXQuc2xpY2UoMCxvKSk7cmV0dXJuIHR9KHQsZSxuKTpmdW5jdGlvbih0LGUpe2lmKHUuaXNCdWZmZXIoZSkpe3ZhciBuPTB8aChlLmxlbmd0aCk7cmV0dXJuIDA9PT0odD1zKHQsbikpLmxlbmd0aD90OihlLmNvcHkodCwwLDAsbiksdCl9aWYoZSl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8Imxlbmd0aCJpbiBlKXJldHVybiJudW1iZXIiIT10eXBlb2YgZS5sZW5ndGh8fChyPWUubGVuZ3RoKSE9cj9zKHQsMCk6cCh0LGUpO2lmKCJCdWZmZXIiPT09ZS50eXBlJiZpKGUuZGF0YSkpcmV0dXJuIHAodCxlLmRhdGEpfXZhciByO3Rocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4iKX0odCxlKX1mdW5jdGlvbiBsKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9ZnVuY3Rpb24gZih0LGUpe2lmKGwoZSksdD1zKHQsZTwwPzA6MHxoKGUpKSwhdS5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcih2YXIgbj0wO248ZTsrK24pdFtuXT0wO3JldHVybiB0fWZ1bmN0aW9uIHAodCxlKXt2YXIgbj1lLmxlbmd0aDwwPzA6MHxoKGUubGVuZ3RoKTt0PXModCxuKTtmb3IodmFyIHI9MDtyPG47cis9MSl0W3JdPTI1NSZlW3JdO3JldHVybiB0fWZ1bmN0aW9uIGgodCl7aWYodD49YSgpKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4IithKCkudG9TdHJpbmcoMTYpKyIgYnl0ZXMiKTtyZXR1cm4gMHx0fWZ1bmN0aW9uIGQodCxlKXtpZih1LmlzQnVmZmVyKHQpKXJldHVybiB0Lmxlbmd0aDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3KHQpfHx0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXJldHVybiB0LmJ5dGVMZW5ndGg7InN0cmluZyIhPXR5cGVvZiB0JiYodD0iIit0KTt2YXIgbj10Lmxlbmd0aDtpZigwPT09bilyZXR1cm4gMDtmb3IodmFyIHI9ITE7Oylzd2l0Y2goZSl7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gbjtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2Ugdm9pZCAwOnJldHVybiBGKHQpLmxlbmd0aDtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIDIqbjtjYXNlImhleCI6cmV0dXJuIG4+Pj4xO2Nhc2UiYmFzZTY0IjpyZXR1cm4gSCh0KS5sZW5ndGg7ZGVmYXVsdDppZihyKXJldHVybiBGKHQpLmxlbmd0aDtlPSgiIitlKS50b0xvd2VyQ2FzZSgpLHI9ITB9fWZ1bmN0aW9uIGcodCxlLG4pe3ZhciByPSExO2lmKCh2b2lkIDA9PT1lfHxlPDApJiYoZT0wKSxlPnRoaXMubGVuZ3RoKXJldHVybiIiO2lmKCh2b2lkIDA9PT1ufHxuPnRoaXMubGVuZ3RoKSYmKG49dGhpcy5sZW5ndGgpLG48PTApcmV0dXJuIiI7aWYoKG4+Pj49MCk8PShlPj4+PTApKXJldHVybiIiO2Zvcih0fHwodD0idXRmOCIpOzspc3dpdGNoKHQpe2Nhc2UiaGV4IjpyZXR1cm4gTCh0aGlzLGUsbik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gVCh0aGlzLGUsbik7Y2FzZSJhc2NpaSI6cmV0dXJuIEEodGhpcyxlLG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIEModGhpcyxlLG4pO2Nhc2UiYmFzZTY0IjpyZXR1cm4gaih0aGlzLGUsbik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBSKHRoaXMsZSxuKTtkZWZhdWx0OmlmKHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTt0PSh0KyIiKS50b0xvd2VyQ2FzZSgpLHI9ITB9fWZ1bmN0aW9uIHYodCxlLG4pe3ZhciByPXRbZV07dFtlXT10W25dLHRbbl09cn1mdW5jdGlvbiB5KHQsZSxuLHIsbyl7aWYoMD09PXQubGVuZ3RoKXJldHVybi0xO2lmKCJzdHJpbmciPT10eXBlb2Ygbj8ocj1uLG49MCk6bj4yMTQ3NDgzNjQ3P249MjE0NzQ4MzY0NzpuPC0yMTQ3NDgzNjQ4JiYobj0tMjE0NzQ4MzY0OCksbj0rbixpc05hTihuKSYmKG49bz8wOnQubGVuZ3RoLTEpLG48MCYmKG49dC5sZW5ndGgrbiksbj49dC5sZW5ndGgpe2lmKG8pcmV0dXJuLTE7bj10Lmxlbmd0aC0xfWVsc2UgaWYobjwwKXtpZighbylyZXR1cm4tMTtuPTB9aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT11LmZyb20oZSxyKSksdS5pc0J1ZmZlcihlKSlyZXR1cm4gMD09PWUubGVuZ3RoPy0xOm0odCxlLG4scixvKTtpZigibnVtYmVyIj09dHlwZW9mIGUpcmV0dXJuIGUmPTI1NSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQmJiJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mP28/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHQsZSxuKTpVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKHQsZSxuKTptKHQsW2VdLG4scixvKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKX1mdW5jdGlvbiBtKHQsZSxuLHIsbyl7dmFyIGksYT0xLHM9dC5sZW5ndGgsdT1lLmxlbmd0aDtpZih2b2lkIDAhPT1yJiYoInVjczIiPT09KHI9U3RyaW5nKHIpLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09cnx8InV0ZjE2bGUiPT09cnx8InV0Zi0xNmxlIj09PXIpKXtpZih0Lmxlbmd0aDwyfHxlLmxlbmd0aDwyKXJldHVybi0xO2E9MixzLz0yLHUvPTIsbi89Mn1mdW5jdGlvbiBjKHQsZSl7cmV0dXJuIDE9PT1hP3RbZV06dC5yZWFkVUludDE2QkUoZSphKX1pZihvKXt2YXIgbD0tMTtmb3IoaT1uO2k8cztpKyspaWYoYyh0LGkpPT09YyhlLC0xPT09bD8wOmktbCkpe2lmKC0xPT09bCYmKGw9aSksaS1sKzE9PT11KXJldHVybiBsKmF9ZWxzZS0xIT09bCYmKGktPWktbCksbD0tMX1lbHNlIGZvcihuK3U+cyYmKG49cy11KSxpPW47aT49MDtpLS0pe2Zvcih2YXIgZj0hMCxwPTA7cDx1O3ArKylpZihjKHQsaStwKSE9PWMoZSxwKSl7Zj0hMTticmVha31pZihmKXJldHVybiBpfXJldHVybi0xfWZ1bmN0aW9uIGIodCxlLG4scil7bj1OdW1iZXIobil8fDA7dmFyIG89dC5sZW5ndGgtbjtyPyhyPU51bWJlcihyKSk+byYmKHI9byk6cj1vO3ZhciBpPWUubGVuZ3RoO2lmKGklMiE9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtyPmkvMiYmKHI9aS8yKTtmb3IodmFyIGE9MDthPHI7KythKXt2YXIgcz1wYXJzZUludChlLnN1YnN0cigyKmEsMiksMTYpO2lmKGlzTmFOKHMpKXJldHVybiBhO3RbbithXT1zfXJldHVybiBhfWZ1bmN0aW9uIHgodCxlLG4scil7cmV0dXJuIHooRihlLHQubGVuZ3RoLW4pLHQsbixyKX1mdW5jdGlvbiB3KHQsZSxuLHIpe3JldHVybiB6KGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDsrK24pZS5wdXNoKDI1NSZ0LmNoYXJDb2RlQXQobikpO3JldHVybiBlfShlKSx0LG4scil9ZnVuY3Rpb24gayh0LGUsbixyKXtyZXR1cm4gdyh0LGUsbixyKX1mdW5jdGlvbiBTKHQsZSxuLHIpe3JldHVybiB6KEgoZSksdCxuLHIpfWZ1bmN0aW9uIEUodCxlLG4scil7cmV0dXJuIHooZnVuY3Rpb24odCxlKXtmb3IodmFyIG4scixvLGk9W10sYT0wO2E8dC5sZW5ndGgmJiEoKGUtPTIpPDApOysrYSluPXQuY2hhckNvZGVBdChhKSxyPW4+Pjgsbz1uJTI1NixpLnB1c2gobyksaS5wdXNoKHIpO3JldHVybiBpfShlLHQubGVuZ3RoLW4pLHQsbixyKX1mdW5jdGlvbiBqKHQsZSxuKXtyZXR1cm4gMD09PWUmJm49PT10Lmxlbmd0aD9yLmZyb21CeXRlQXJyYXkodCk6ci5mcm9tQnl0ZUFycmF5KHQuc2xpY2UoZSxuKSl9ZnVuY3Rpb24gVCh0LGUsbil7bj1NYXRoLm1pbih0Lmxlbmd0aCxuKTtmb3IodmFyIHI9W10sbz1lO288bjspe3ZhciBpLGEscyx1LGM9dFtvXSxsPW51bGwsZj1jPjIzOT80OmM+MjIzPzM6Yz4xOTE/MjoxO2lmKG8rZjw9bilzd2l0Y2goZil7Y2FzZSAxOmM8MTI4JiYobD1jKTticmVhaztjYXNlIDI6MTI4PT0oMTkyJihpPXRbbysxXSkpJiYodT0oMzEmYyk8PDZ8NjMmaSk+MTI3JiYobD11KTticmVhaztjYXNlIDM6aT10W28rMV0sYT10W28rMl0sMTI4PT0oMTkyJmkpJiYxMjg9PSgxOTImYSkmJih1PSgxNSZjKTw8MTJ8KDYzJmkpPDw2fDYzJmEpPjIwNDcmJih1PDU1Mjk2fHx1PjU3MzQzKSYmKGw9dSk7YnJlYWs7Y2FzZSA0Omk9dFtvKzFdLGE9dFtvKzJdLHM9dFtvKzNdLDEyOD09KDE5MiZpKSYmMTI4PT0oMTkyJmEpJiYxMjg9PSgxOTImcykmJih1PSgxNSZjKTw8MTh8KDYzJmkpPDwxMnwoNjMmYSk8PDZ8NjMmcyk+NjU1MzUmJnU8MTExNDExMiYmKGw9dSl9bnVsbD09PWw/KGw9NjU1MzMsZj0xKTpsPjY1NTM1JiYobC09NjU1MzYsci5wdXNoKGw+Pj4xMCYxMDIzfDU1Mjk2KSxsPTU2MzIwfDEwMjMmbCksci5wdXNoKGwpLG8rPWZ9cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8PU8pcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQpO3ZhciBuPSIiLHI9MDtmb3IoO3I8ZTspbis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdC5zbGljZShyLHIrPU8pKTtyZXR1cm4gbn0ocil9ZS5CdWZmZXI9dSxlLlNsb3dCdWZmZXI9ZnVuY3Rpb24odCl7K3QhPXQmJih0PTApO3JldHVybiB1LmFsbG9jKCt0KX0sZS5JTlNQRUNUX01BWF9CWVRFUz01MCx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwIT09dC5UWVBFRF9BUlJBWV9TVVBQT1JUP3QuVFlQRURfQVJSQVlfU1VQUE9SVDpmdW5jdGlvbigpe3RyeXt2YXIgdD1uZXcgVWludDhBcnJheSgxKTtyZXR1cm4gdC5fX3Byb3RvX189e19fcHJvdG9fXzpVaW50OEFycmF5LnByb3RvdHlwZSxmb286ZnVuY3Rpb24oKXtyZXR1cm4gNDJ9fSw0Mj09PXQuZm9vKCkmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnN1YmFycmF5JiYwPT09dC5zdWJhcnJheSgxLDEpLmJ5dGVMZW5ndGh9Y2F0Y2godCl7cmV0dXJuITF9fSgpLGUua01heExlbmd0aD1hKCksdS5wb29sU2l6ZT04MTkyLHUuX2F1Z21lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19fPXUucHJvdG90eXBlLHR9LHUuZnJvbT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGMobnVsbCx0LGUsbil9LHUuVFlQRURfQVJSQVlfU1VQUE9SVCYmKHUucHJvdG90eXBlLl9fcHJvdG9fXz1VaW50OEFycmF5LnByb3RvdHlwZSx1Ll9fcHJvdG9fXz1VaW50OEFycmF5LCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuc3BlY2llcyYmdVtTeW1ib2wuc3BlY2llc109PT11JiZPYmplY3QuZGVmaW5lUHJvcGVydHkodSxTeW1ib2wuc3BlY2llcyx7dmFsdWU6bnVsbCxjb25maWd1cmFibGU6ITB9KSksdS5hbGxvYz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBsKGUpLGU8PTA/cyh0LGUpOnZvaWQgMCE9PW4/InN0cmluZyI9PXR5cGVvZiByP3ModCxlKS5maWxsKG4scik6cyh0LGUpLmZpbGwobik6cyh0LGUpfShudWxsLHQsZSxuKX0sdS5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtyZXR1cm4gZihudWxsLHQpfSx1LmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbih0KXtyZXR1cm4gZihudWxsLHQpfSx1LmlzQnVmZmVyPWZ1bmN0aW9uKHQpe3JldHVybiEobnVsbD09dHx8IXQuX2lzQnVmZmVyKX0sdS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7aWYoIXUuaXNCdWZmZXIodCl8fCF1LmlzQnVmZmVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMiKTtpZih0PT09ZSlyZXR1cm4gMDtmb3IodmFyIG49dC5sZW5ndGgscj1lLmxlbmd0aCxvPTAsaT1NYXRoLm1pbihuLHIpO288aTsrK28paWYodFtvXSE9PWVbb10pe249dFtvXSxyPWVbb107YnJlYWt9cmV0dXJuIG48cj8tMTpyPG4/MTowfSx1LmlzRW5jb2Rpbmc9ZnVuY3Rpb24odCl7c3dpdGNoKFN0cmluZyh0KS50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LHUuY29uY2F0PWZ1bmN0aW9uKHQsZSl7aWYoIWkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gdS5hbGxvYygwKTt2YXIgbjtpZih2b2lkIDA9PT1lKWZvcihlPTAsbj0wO248dC5sZW5ndGg7KytuKWUrPXRbbl0ubGVuZ3RoO3ZhciByPXUuYWxsb2NVbnNhZmUoZSksbz0wO2ZvcihuPTA7bjx0Lmxlbmd0aDsrK24pe3ZhciBhPXRbbl07aWYoIXUuaXNCdWZmZXIoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2EuY29weShyLG8pLG8rPWEubGVuZ3RofXJldHVybiByfSx1LmJ5dGVMZW5ndGg9ZCx1LnByb3RvdHlwZS5faXNCdWZmZXI9ITAsdS5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCUyIT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz0yKXYodGhpcyxlLGUrMSk7cmV0dXJuIHRoaXN9LHUucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9NCl2KHRoaXMsZSxlKzMpLHYodGhpcyxlKzEsZSsyKTtyZXR1cm4gdGhpc30sdS5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCU4IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz04KXYodGhpcyxlLGUrNyksdih0aGlzLGUrMSxlKzYpLHYodGhpcyxlKzIsZSs1KSx2KHRoaXMsZSszLGUrNCk7cmV0dXJuIHRoaXN9LHUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PXQ/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/VCh0aGlzLDAsdCk6Zy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHUucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtpZighdS5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7cmV0dXJuIHRoaXM9PT10fHwwPT09dS5jb21wYXJlKHRoaXMsdCl9LHUucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgdD0iIixuPWUuSU5TUEVDVF9NQVhfQllURVM7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJih0PXRoaXMudG9TdHJpbmcoImhleCIsMCxuKS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+biYmKHQrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK3QrIj4ifSx1LnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSxuLHIsbyl7aWYoIXUuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PW4mJihuPXQ/dC5sZW5ndGg6MCksdm9pZCAwPT09ciYmKHI9MCksdm9pZCAwPT09byYmKG89dGhpcy5sZW5ndGgpLGU8MHx8bj50Lmxlbmd0aHx8cjwwfHxvPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPj1vJiZlPj1uKXJldHVybiAwO2lmKHI+PW8pcmV0dXJuLTE7aWYoZT49bilyZXR1cm4gMTtpZih0aGlzPT09dClyZXR1cm4gMDtmb3IodmFyIGk9KG8+Pj49MCktKHI+Pj49MCksYT0obj4+Pj0wKS0oZT4+Pj0wKSxzPU1hdGgubWluKGksYSksYz10aGlzLnNsaWNlKHIsbyksbD10LnNsaWNlKGUsbiksZj0wO2Y8czsrK2YpaWYoY1tmXSE9PWxbZl0pe2k9Y1tmXSxhPWxbZl07YnJlYWt9cmV0dXJuIGk8YT8tMTphPGk/MTowfSx1LnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbih0LGUsbil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YodCxlLG4pfSx1LnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geSh0aGlzLHQsZSxuLCEwKX0sdS5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5KHRoaXMsdCxlLG4sITEpfSx1LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LGUsbixyKXtpZih2b2lkIDA9PT1lKXI9InV0ZjgiLG49dGhpcy5sZW5ndGgsZT0wO2Vsc2UgaWYodm9pZCAwPT09biYmInN0cmluZyI9PXR5cGVvZiBlKXI9ZSxuPXRoaXMubGVuZ3RoLGU9MDtlbHNle2lmKCFpc0Zpbml0ZShlKSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7ZXw9MCxpc0Zpbml0ZShuKT8obnw9MCx2b2lkIDA9PT1yJiYocj0idXRmOCIpKToocj1uLG49dm9pZCAwKX12YXIgbz10aGlzLmxlbmd0aC1lO2lmKCh2b2lkIDA9PT1ufHxuPm8pJiYobj1vKSx0Lmxlbmd0aD4wJiYobjwwfHxlPDApfHxlPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO3J8fChyPSJ1dGY4Iik7Zm9yKHZhciBpPSExOzspc3dpdGNoKHIpe2Nhc2UiaGV4IjpyZXR1cm4gYih0aGlzLHQsZSxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiB4KHRoaXMsdCxlLG4pO2Nhc2UiYXNjaWkiOnJldHVybiB3KHRoaXMsdCxlLG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIGsodGhpcyx0LGUsbik7Y2FzZSJiYXNlNjQiOnJldHVybiBTKHRoaXMsdCxlLG4pO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gRSh0aGlzLHQsZSxuKTtkZWZhdWx0OmlmKGkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKTtyPSgiIityKS50b0xvd2VyQ2FzZSgpLGk9ITB9fSx1LnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O3ZhciBPPTQwOTY7ZnVuY3Rpb24gQSh0LGUsbil7dmFyIHI9IiI7bj1NYXRoLm1pbih0Lmxlbmd0aCxuKTtmb3IodmFyIG89ZTtvPG47KytvKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JnRbb10pO3JldHVybiByfWZ1bmN0aW9uIEModCxlLG4pe3ZhciByPSIiO249TWF0aC5taW4odC5sZW5ndGgsbik7Zm9yKHZhciBvPWU7bzxuOysrbylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRbb10pO3JldHVybiByfWZ1bmN0aW9uIEwodCxlLG4pe3ZhciByPXQubGVuZ3RoOyghZXx8ZTwwKSYmKGU9MCksKCFufHxuPDB8fG4+cikmJihuPXIpO2Zvcih2YXIgbz0iIixpPWU7aTxuOysraSlvKz1xKHRbaV0pO3JldHVybiBvfWZ1bmN0aW9uIFIodCxlLG4pe2Zvcih2YXIgcj10LnNsaWNlKGUsbiksbz0iIixpPTA7aTxyLmxlbmd0aDtpKz0yKW8rPVN0cmluZy5mcm9tQ2hhckNvZGUocltpXSsyNTYqcltpKzFdKTtyZXR1cm4gb31mdW5jdGlvbiBQKHQsZSxuKXtpZih0JTEhPTB8fHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib2Zmc2V0IGlzIG5vdCB1aW50Iik7aWYodCtlPm4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlRyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgiKX1mdW5jdGlvbiBOKHQsZSxuLHIsbyxpKXtpZighdS5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmZmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7aWYoZT5vfHxlPGkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKG4rcj50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gSSh0LGUsbixyKXtlPDAmJihlPTY1NTM1K2UrMSk7Zm9yKHZhciBvPTAsaT1NYXRoLm1pbih0Lmxlbmd0aC1uLDIpO288aTsrK28pdFtuK29dPShlJjI1NTw8OCoocj9vOjEtbykpPj4+OCoocj9vOjEtbyl9ZnVuY3Rpb24gXyh0LGUsbixyKXtlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKTtmb3IodmFyIG89MCxpPU1hdGgubWluKHQubGVuZ3RoLW4sNCk7bzxpOysrbyl0W24rb109ZT4+PjgqKHI/bzozLW8pJjI1NX1mdW5jdGlvbiBEKHQsZSxuLHIsbyxpKXtpZihuK3I+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKG48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gTSh0LGUsbixyLGkpe3JldHVybiBpfHxEKHQsMCxuLDQpLG8ud3JpdGUodCxlLG4sciwyMyw0KSxuKzR9ZnVuY3Rpb24gVSh0LGUsbixyLGkpe3JldHVybiBpfHxEKHQsMCxuLDgpLG8ud3JpdGUodCxlLG4sciw1Miw4KSxuKzh9dS5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24odCxlKXt2YXIgbixyPXRoaXMubGVuZ3RoO2lmKCh0PX5+dCk8MD8odCs9cik8MCYmKHQ9MCk6dD5yJiYodD1yKSwoZT12b2lkIDA9PT1lP3I6fn5lKTwwPyhlKz1yKTwwJiYoZT0wKTplPnImJihlPXIpLGU8dCYmKGU9dCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUKShuPXRoaXMuc3ViYXJyYXkodCxlKSkuX19wcm90b19fPXUucHJvdG90eXBlO2Vsc2V7dmFyIG89ZS10O249bmV3IHUobyx2b2lkIDApO2Zvcih2YXIgaT0wO2k8bzsrK2kpbltpXT10aGlzW2krdF19cmV0dXJuIG59LHUucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24odCxlLG4pe3R8PTAsZXw9MCxufHxQKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbdF0sbz0xLGk9MDsrK2k8ZSYmKG8qPTI1Nik7KXIrPXRoaXNbdCtpXSpvO3JldHVybiByfSx1LnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKHQsZSxuKXt0fD0wLGV8PTAsbnx8UCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW3QrLS1lXSxvPTE7ZT4wJiYobyo9MjU2KTspcis9dGhpc1t0Ky0tZV0qbztyZXR1cm4gcn0sdS5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCwxLHRoaXMubGVuZ3RoKSx0aGlzW3RdfSx1LnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fSx1LnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDh8dGhpc1t0KzFdfSx1LnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDQsdGhpcy5sZW5ndGgpLCh0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2KSsxNjc3NzIxNip0aGlzW3QrM119LHUucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1t0XSsodGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdKX0sdS5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKHQsZSxuKXt0fD0wLGV8PTAsbnx8UCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW3RdLG89MSxpPTA7KytpPGUmJihvKj0yNTYpOylyKz10aGlzW3QraV0qbztyZXR1cm4gcj49KG8qPTEyOCkmJihyLT1NYXRoLnBvdygyLDgqZSkpLHJ9LHUucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbih0LGUsbil7dHw9MCxlfD0wLG58fFAodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9ZSxvPTEsaT10aGlzW3QrLS1yXTtyPjAmJihvKj0yNTYpOylpKz10aGlzW3QrLS1yXSpvO3JldHVybiBpPj0obyo9MTI4KSYmKGktPU1hdGgucG93KDIsOCplKSksaX0sdS5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDEsdGhpcy5sZW5ndGgpLDEyOCZ0aGlzW3RdPy0xKigyNTUtdGhpc1t0XSsxKTp0aGlzW3RdfSx1LnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbih0LGUpe2V8fFAodCwyLHRoaXMubGVuZ3RoKTt2YXIgbj10aGlzW3RdfHRoaXNbdCsxXTw8ODtyZXR1cm4gMzI3Njgmbj80Mjk0OTAxNzYwfG46bn0sdS5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24odCxlKXtlfHxQKHQsMix0aGlzLmxlbmd0aCk7dmFyIG49dGhpc1t0KzFdfHRoaXNbdF08PDg7cmV0dXJuIDMyNzY4Jm4/NDI5NDkwMTc2MHxuOm59LHUucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2fHRoaXNbdCszXTw8MjR9LHUucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdPDwyNHx0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM119LHUucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw0LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyx0LCEwLDIzLDQpfSx1LnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsNCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsdCwhMSwyMyw0KX0sdS5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw4LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyx0LCEwLDUyLDgpfSx1LnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDgsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLHQsITEsNTIsOCl9LHUucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKHQsZSxuLHIpeyh0PSt0LGV8PTAsbnw9MCxyKXx8Tih0aGlzLHQsZSxuLE1hdGgucG93KDIsOCpuKS0xLDApO3ZhciBvPTEsaT0wO2Zvcih0aGlzW2VdPTI1NSZ0OysraTxuJiYobyo9MjU2KTspdGhpc1tlK2ldPXQvbyYyNTU7cmV0dXJuIGUrbn0sdS5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24odCxlLG4scil7KHQ9K3QsZXw9MCxufD0wLHIpfHxOKHRoaXMsdCxlLG4sTWF0aC5wb3coMiw4Km4pLTEsMCk7dmFyIG89bi0xLGk9MTtmb3IodGhpc1tlK29dPTI1NSZ0Oy0tbz49MCYmKGkqPTI1Nik7KXRoaXNbZStvXT10L2kmMjU1O3JldHVybiBlK259LHUucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwxLDI1NSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlR8fCh0PU1hdGguZmxvb3IodCkpLHRoaXNbZV09MjU1JnQsZSsxfSx1LnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsMiw2NTUzNSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44KTpJKHRoaXMsdCxlLCEwKSxlKzJ9LHUucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwyLDY1NTM1LDApLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+OCx0aGlzW2UrMV09MjU1JnQpOkkodGhpcyx0LGUsITEpLGUrMn0sdS5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZSszXT10Pj4+MjQsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrMV09dD4+PjgsdGhpc1tlXT0yNTUmdCk6Xyh0aGlzLHQsZSwhMCksZSs0fSx1LnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+MjQsdGhpc1tlKzFdPXQ+Pj4xNix0aGlzW2UrMl09dD4+PjgsdGhpc1tlKzNdPTI1NSZ0KTpfKHRoaXMsdCxlLCExKSxlKzR9LHUucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24odCxlLG4scil7aWYodD0rdCxlfD0wLCFyKXt2YXIgbz1NYXRoLnBvdygyLDgqbi0xKTtOKHRoaXMsdCxlLG4sby0xLC1vKX12YXIgaT0wLGE9MSxzPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KytpPG4mJihhKj0yNTYpOyl0PDAmJjA9PT1zJiYwIT09dGhpc1tlK2ktMV0mJihzPTEpLHRoaXNbZStpXT0odC9hPj4wKS1zJjI1NTtyZXR1cm4gZStufSx1LnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9K3QsZXw9MCwhcil7dmFyIG89TWF0aC5wb3coMiw4Km4tMSk7Tih0aGlzLHQsZSxuLG8tMSwtbyl9dmFyIGk9bi0xLGE9MSxzPTA7Zm9yKHRoaXNbZStpXT0yNTUmdDstLWk+PTAmJihhKj0yNTYpOyl0PDAmJjA9PT1zJiYwIT09dGhpc1tlK2krMV0mJihzPTEpLHRoaXNbZStpXT0odC9hPj4wKS1zJjI1NTtyZXR1cm4gZStufSx1LnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwxLDEyNywtMTI4KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlR8fCh0PU1hdGguZmxvb3IodCkpLHQ8MCYmKHQ9MjU1K3QrMSksdGhpc1tlXT0yNTUmdCxlKzF9LHUucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44KTpJKHRoaXMsdCxlLCEwKSxlKzJ9LHUucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjgsdGhpc1tlKzFdPTI1NSZ0KTpJKHRoaXMsdCxlLCExKSxlKzJ9LHUucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCx0aGlzW2UrMl09dD4+PjE2LHRoaXNbZSszXT10Pj4+MjQpOl8odGhpcyx0LGUsITApLGUrNH0sdS5wcm90b3R5cGUud3JpdGVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx0PDAmJih0PTQyOTQ5NjcyOTUrdCsxKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCk6Xyh0aGlzLHQsZSwhMSksZSs0fSx1LnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBNKHRoaXMsdCxlLCEwLG4pfSx1LnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBNKHRoaXMsdCxlLCExLG4pfSx1LnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gVSh0aGlzLHQsZSwhMCxuKX0sdS5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIFUodGhpcyx0LGUsITEsbil9LHUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24odCxlLG4scil7aWYobnx8KG49MCkscnx8MD09PXJ8fChyPXRoaXMubGVuZ3RoKSxlPj10Lmxlbmd0aCYmKGU9dC5sZW5ndGgpLGV8fChlPTApLHI+MCYmcjxuJiYocj1uKSxyPT09bilyZXR1cm4gMDtpZigwPT09dC5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZihlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDB8fG4+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO3I+dGhpcy5sZW5ndGgmJihyPXRoaXMubGVuZ3RoKSx0Lmxlbmd0aC1lPHItbiYmKHI9dC5sZW5ndGgtZStuKTt2YXIgbyxpPXItbjtpZih0aGlzPT09dCYmbjxlJiZlPHIpZm9yKG89aS0xO28+PTA7LS1vKXRbbytlXT10aGlzW28rbl07ZWxzZSBpZihpPDFlM3x8IXUuVFlQRURfQVJSQVlfU1VQUE9SVClmb3Iobz0wO288aTsrK28pdFtvK2VdPXRoaXNbbytuXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKHQsdGhpcy5zdWJhcnJheShuLG4raSksZSk7cmV0dXJuIGl9LHUucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24odCxlLG4scil7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIGU/KHI9ZSxlPTAsbj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiBuJiYocj1uLG49dGhpcy5sZW5ndGgpLDE9PT10Lmxlbmd0aCl7dmFyIG89dC5jaGFyQ29kZUF0KDApO288MjU2JiYodD1vKX1pZih2b2lkIDAhPT1yJiYic3RyaW5nIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgciYmIXUuaXNFbmNvZGluZyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3IpfWVsc2UibnVtYmVyIj09dHlwZW9mIHQmJih0Jj0yNTUpO2lmKGU8MHx8dGhpcy5sZW5ndGg8ZXx8dGhpcy5sZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYobjw9ZSlyZXR1cm4gdGhpczt2YXIgaTtpZihlPj4+PTAsbj12b2lkIDA9PT1uP3RoaXMubGVuZ3RoOm4+Pj4wLHR8fCh0PTApLCJudW1iZXIiPT10eXBlb2YgdClmb3IoaT1lO2k8bjsrK2kpdGhpc1tpXT10O2Vsc2V7dmFyIGE9dS5pc0J1ZmZlcih0KT90OkYobmV3IHUodCxyKS50b1N0cmluZygpKSxzPWEubGVuZ3RoO2ZvcihpPTA7aTxuLWU7KytpKXRoaXNbaStlXT1hW2klc119cmV0dXJuIHRoaXN9O3ZhciBCPS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIHEodCl7cmV0dXJuIHQ8MTY/IjAiK3QudG9TdHJpbmcoMTYpOnQudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIEYodCxlKXt2YXIgbjtlPWV8fDEvMDtmb3IodmFyIHI9dC5sZW5ndGgsbz1udWxsLGk9W10sYT0wO2E8cjsrK2Epe2lmKChuPXQuY2hhckNvZGVBdChhKSk+NTUyOTUmJm48NTczNDQpe2lmKCFvKXtpZihuPjU2MzE5KXsoZS09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYoYSsxPT09cil7KGUtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfW89bjtjb250aW51ZX1pZihuPDU2MzIwKXsoZS09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSksbz1uO2NvbnRpbnVlfW49NjU1MzYrKG8tNTUyOTY8PDEwfG4tNTYzMjApfWVsc2UgbyYmKGUtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2lmKG89bnVsbCxuPDEyOCl7aWYoKGUtPTEpPDApYnJlYWs7aS5wdXNoKG4pfWVsc2UgaWYobjwyMDQ4KXtpZigoZS09Mik8MClicmVhaztpLnB1c2gobj4+NnwxOTIsNjMmbnwxMjgpfWVsc2UgaWYobjw2NTUzNil7aWYoKGUtPTMpPDApYnJlYWs7aS5wdXNoKG4+PjEyfDIyNCxuPj42JjYzfDEyOCw2MyZufDEyOCl9ZWxzZXtpZighKG48MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigoZS09NCk8MClicmVhaztpLnB1c2gobj4+MTh8MjQwLG4+PjEyJjYzfDEyOCxuPj42JjYzfDEyOCw2MyZufDEyOCl9fXJldHVybiBpfWZ1bmN0aW9uIEgodCl7cmV0dXJuIHIudG9CeXRlQXJyYXkoZnVuY3Rpb24odCl7aWYoKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbT90LnRyaW0oKTp0LnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0odCkucmVwbGFjZShCLCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDt0Lmxlbmd0aCU0IT0wOyl0Kz0iPSI7cmV0dXJuIHR9KHQpKX1mdW5jdGlvbiB6KHQsZSxuLHIpe2Zvcih2YXIgbz0wO288ciYmIShvK24+PWUubGVuZ3RofHxvPj10Lmxlbmd0aCk7KytvKWVbbytuXT10W29dO3JldHVybiBvfX0pLmNhbGwodGhpcyxuKDg1KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS5ieXRlTGVuZ3RoPWZ1bmN0aW9uKHQpe3ZhciBlPWModCksbj1lWzBdLHI9ZVsxXTtyZXR1cm4gMyoobityKS80LXJ9LGUudG9CeXRlQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGUsbixyPWModCksYT1yWzBdLHM9clsxXSx1PW5ldyBpKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gMyooZStuKS80LW59KDAsYSxzKSksbD0wLGY9cz4wP2EtNDphO2ZvcihuPTA7bjxmO24rPTQpZT1vW3QuY2hhckNvZGVBdChuKV08PDE4fG9bdC5jaGFyQ29kZUF0KG4rMSldPDwxMnxvW3QuY2hhckNvZGVBdChuKzIpXTw8NnxvW3QuY2hhckNvZGVBdChuKzMpXSx1W2wrK109ZT4+MTYmMjU1LHVbbCsrXT1lPj44JjI1NSx1W2wrK109MjU1JmU7Mj09PXMmJihlPW9bdC5jaGFyQ29kZUF0KG4pXTw8MnxvW3QuY2hhckNvZGVBdChuKzEpXT4+NCx1W2wrK109MjU1JmUpOzE9PT1zJiYoZT1vW3QuY2hhckNvZGVBdChuKV08PDEwfG9bdC5jaGFyQ29kZUF0KG4rMSldPDw0fG9bdC5jaGFyQ29kZUF0KG4rMildPj4yLHVbbCsrXT1lPj44JjI1NSx1W2wrK109MjU1JmUpO3JldHVybiB1fSxlLmZyb21CeXRlQXJyYXk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49dC5sZW5ndGgsbz1uJTMsaT1bXSxhPTAscz1uLW87YTxzO2ErPTE2MzgzKWkucHVzaChsKHQsYSxhKzE2MzgzPnM/czphKzE2MzgzKSk7MT09PW8/KGU9dFtuLTFdLGkucHVzaChyW2U+PjJdK3JbZTw8NCY2M10rIj09IikpOjI9PT1vJiYoZT0odFtuLTJdPDw4KSt0W24tMV0saS5wdXNoKHJbZT4+MTBdK3JbZT4+NCY2M10rcltlPDwyJjYzXSsiPSIpKTtyZXR1cm4gaS5qb2luKCIiKX07Zm9yKHZhciByPVtdLG89W10saT0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSxhPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixzPTAsdT1hLmxlbmd0aDtzPHU7KytzKXJbc109YVtzXSxvW2EuY2hhckNvZGVBdChzKV09cztmdW5jdGlvbiBjKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGUlND4wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpO3ZhciBuPXQuaW5kZXhPZigiPSIpO3JldHVybi0xPT09biYmKG49ZSksW24sbj09PWU/MDo0LW4lNF19ZnVuY3Rpb24gbCh0LGUsbil7Zm9yKHZhciBvLGksYT1bXSxzPWU7czxuO3MrPTMpbz0odFtzXTw8MTYmMTY3MTE2ODApKyh0W3MrMV08PDgmNjUyODApKygyNTUmdFtzKzJdKSxhLnB1c2goclsoaT1vKT4+MTgmNjNdK3JbaT4+MTImNjNdK3JbaT4+NiY2M10rcls2MyZpXSk7cmV0dXJuIGEuam9pbigiIil9b1siLSIuY2hhckNvZGVBdCgwKV09NjIsb1siXyIuY2hhckNvZGVBdCgwKV09NjN9LGZ1bmN0aW9uKHQsZSl7ZS5yZWFkPWZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGksYSxzPTgqby1yLTEsdT0oMTw8cyktMSxjPXU+PjEsbD0tNyxmPW4/by0xOjAscD1uPy0xOjEsaD10W2UrZl07Zm9yKGYrPXAsaT1oJigxPDwtbCktMSxoPj49LWwsbCs9cztsPjA7aT0yNTYqaSt0W2UrZl0sZis9cCxsLT04KTtmb3IoYT1pJigxPDwtbCktMSxpPj49LWwsbCs9cjtsPjA7YT0yNTYqYSt0W2UrZl0sZis9cCxsLT04KTtpZigwPT09aSlpPTEtYztlbHNle2lmKGk9PT11KXJldHVybiBhP05hTjoxLzAqKGg/LTE6MSk7YSs9TWF0aC5wb3coMixyKSxpLT1jfXJldHVybihoPy0xOjEpKmEqTWF0aC5wb3coMixpLXIpfSxlLndyaXRlPWZ1bmN0aW9uKHQsZSxuLHIsbyxpKXt2YXIgYSxzLHUsYz04Kmktby0xLGw9KDE8PGMpLTEsZj1sPj4xLHA9MjM9PT1vP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxoPXI/MDppLTEsZD1yPzE6LTEsZz1lPDB8fDA9PT1lJiYxL2U8MD8xOjA7Zm9yKGU9TWF0aC5hYnMoZSksaXNOYU4oZSl8fGU9PT0xLzA/KHM9aXNOYU4oZSk/MTowLGE9bCk6KGE9TWF0aC5mbG9vcihNYXRoLmxvZyhlKS9NYXRoLkxOMiksZSoodT1NYXRoLnBvdygyLC1hKSk8MSYmKGEtLSx1Kj0yKSwoZSs9YStmPj0xP3AvdTpwKk1hdGgucG93KDIsMS1mKSkqdT49MiYmKGErKyx1Lz0yKSxhK2Y+PWw/KHM9MCxhPWwpOmErZj49MT8ocz0oZSp1LTEpKk1hdGgucG93KDIsbyksYSs9Zik6KHM9ZSpNYXRoLnBvdygyLGYtMSkqTWF0aC5wb3coMixvKSxhPTApKTtvPj04O3RbbitoXT0yNTUmcyxoKz1kLHMvPTI1NixvLT04KTtmb3IoYT1hPDxvfHMsYys9bztjPjA7dFtuK2hdPTI1NSZhLGgrPWQsYS89MjU2LGMtPTgpO3RbbitoLWRdfD0xMjgqZ319LGZ1bmN0aW9uKHQsZSl7dmFyIG49e30udG9TdHJpbmc7dC5leHBvcnRzPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PW4uY2FsbCh0KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyOTkpfSxmdW5jdGlvbih0LGUsbil7bigzMDApO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuVVJMU2VhcmNoUGFyYW1zfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24oMTAyKTt2YXIgcj1uKDApLG89bigzMDEpLGk9bigzNiksYT1uKDExOCkscz1uKDI5KSx1PW4oMTAwKSxjPW4oNTApLGw9bigxMTkpLGY9bigxNCkscD1uKDMyKSxoPW4oMTEpLGQ9big3KSxnPW4oMTA4KSx2PW4oNTIpLHk9bigyKSgiaXRlcmF0b3IiKSxtPWMuc2V0LGI9Yy5nZXR0ZXJGb3IoIlVSTFNlYXJjaFBhcmFtcyIpLHg9Yy5nZXR0ZXJGb3IoIlVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yIiksdz0vXCsvZyxrPUFycmF5KDQpLFM9ZnVuY3Rpb24odCl7cmV0dXJuIGtbdC0xXXx8KGtbdC0xXT1SZWdFeHAoIigoPzolW1xcZGEtZl17Mn0peyIrdCsifSkiLCJnaSIpKX0sRT1mdW5jdGlvbih0KXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0KX1jYXRjaChlKXtyZXR1cm4gdH19LGo9ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKHcsIiAiKSxuPTQ7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZSl9Y2F0Y2godCl7Zm9yKDtuOyllPWUucmVwbGFjZShTKG4tLSksRSk7cmV0dXJuIGV9fSxUPS9bIScoKX5dfCUyMC9nLE89eyIhIjoiJTIxIiwiJyI6IiUyNyIsIigiOiIlMjgiLCIpIjoiJTI5IiwifiI6IiU3RSIsIiUyMCI6IisifSxBPWZ1bmN0aW9uKHQpe3JldHVybiBPW3RdfSxDPWZ1bmN0aW9uKHQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQodCkucmVwbGFjZShULEEpfSxMPWZ1bmN0aW9uKHQsZSl7aWYoZSlmb3IodmFyIG4scixvPWUuc3BsaXQoIiYiKSxpPTA7aTxvLmxlbmd0aDspKG49b1tpKytdKS5sZW5ndGgmJihyPW4uc3BsaXQoIj0iKSx0LnB1c2goe2tleTpqKHIuc2hpZnQoKSksdmFsdWU6aihyLmpvaW4oIj0iKSl9KSl9LFI9ZnVuY3Rpb24odCl7dGhpcy5lbnRyaWVzLmxlbmd0aD0wLEwodGhpcy5lbnRyaWVzLHQpfSxQPWZ1bmN0aW9uKHQsZSl7aWYodDxlKXRocm93IFR5cGVFcnJvcigiTm90IGVub3VnaCBhcmd1bWVudHMiKX0sTj11KGZ1bmN0aW9uKHQsZSl7bSh0aGlzLHt0eXBlOiJVUkxTZWFyY2hQYXJhbXNJdGVyYXRvciIsaXRlcmF0b3I6ZyhiKHQpLmVudHJpZXMpLGtpbmQ6ZX0pfSwiSXRlcmF0b3IiLGZ1bmN0aW9uKCl7dmFyIHQ9eCh0aGlzKSxlPXQua2luZCxuPXQuaXRlcmF0b3IubmV4dCgpLHI9bi52YWx1ZTtyZXR1cm4gbi5kb25lfHwobi52YWx1ZT0ia2V5cyI9PT1lP3Iua2V5OiJ2YWx1ZXMiPT09ZT9yLnZhbHVlOltyLmtleSxyLnZhbHVlXSksbn0pLEk9ZnVuY3Rpb24oKXtsKHRoaXMsSSwiVVJMU2VhcmNoUGFyYW1zIik7dmFyIHQsZSxuLHIsbyxpLGEscz1hcmd1bWVudHMubGVuZ3RoPjA/YXJndW1lbnRzWzBdOnZvaWQgMCx1PXRoaXMsYz1bXTtpZihtKHUse3R5cGU6IlVSTFNlYXJjaFBhcmFtcyIsZW50cmllczpjLHVwZGF0ZVVSTDpmdW5jdGlvbigpe30sdXBkYXRlU2VhcmNoUGFyYW1zOlJ9KSx2b2lkIDAhPT1zKWlmKGQocykpaWYoImZ1bmN0aW9uIj09dHlwZW9mKHQ9dihzKSkpZm9yKGU9dC5jYWxsKHMpOyEobj1lLm5leHQoKSkuZG9uZTspe2lmKChvPShyPWcoaChuLnZhbHVlKSkpLm5leHQoKSkuZG9uZXx8KGk9ci5uZXh0KCkpLmRvbmV8fCFyLm5leHQoKS5kb25lKXRocm93IFR5cGVFcnJvcigiRXhwZWN0ZWQgc2VxdWVuY2Ugd2l0aCBsZW5ndGggMiIpO2MucHVzaCh7a2V5Om8udmFsdWUrIiIsdmFsdWU6aS52YWx1ZSsiIn0pfWVsc2UgZm9yKGEgaW4gcylmKHMsYSkmJmMucHVzaCh7a2V5OmEsdmFsdWU6c1thXSsiIn0pO2Vsc2UgTChjLCJzdHJpbmciPT10eXBlb2Ygcz8iPyI9PT1zLmNoYXJBdCgwKT9zLnNsaWNlKDEpOnM6cysiIil9LF89SS5wcm90b3R5cGU7YShfLHthcHBlbmQ6ZnVuY3Rpb24odCxlKXtQKGFyZ3VtZW50cy5sZW5ndGgsMik7dmFyIG49Yih0aGlzKTtuLmVudHJpZXMucHVzaCh7a2V5OnQrIiIsdmFsdWU6ZSsiIn0pLG4udXBkYXRlVVJMKCl9LGRlbGV0ZTpmdW5jdGlvbih0KXtQKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBlPWIodGhpcyksbj1lLmVudHJpZXMscj10KyIiLG89MDtvPG4ubGVuZ3RoOyluW29dLmtleT09PXI/bi5zcGxpY2UobywxKTpvKys7ZS51cGRhdGVVUkwoKX0sZ2V0OmZ1bmN0aW9uKHQpe1AoYXJndW1lbnRzLmxlbmd0aCwxKTtmb3IodmFyIGU9Yih0aGlzKS5lbnRyaWVzLG49dCsiIixyPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXS5rZXk9PT1uKXJldHVybiBlW3JdLnZhbHVlO3JldHVybiBudWxsfSxnZXRBbGw6ZnVuY3Rpb24odCl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgZT1iKHRoaXMpLmVudHJpZXMsbj10KyIiLHI9W10sbz0wO288ZS5sZW5ndGg7bysrKWVbb10ua2V5PT09biYmci5wdXNoKGVbb10udmFsdWUpO3JldHVybiByfSxoYXM6ZnVuY3Rpb24odCl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgZT1iKHRoaXMpLmVudHJpZXMsbj10KyIiLHI9MDtyPGUubGVuZ3RoOylpZihlW3IrK10ua2V5PT09bilyZXR1cm4hMDtyZXR1cm4hMX0sc2V0OmZ1bmN0aW9uKHQsZSl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgbixyPWIodGhpcyksbz1yLmVudHJpZXMsaT0hMSxhPXQrIiIscz1lKyIiLHU9MDt1PG8ubGVuZ3RoO3UrKykobj1vW3VdKS5rZXk9PT1hJiYoaT9vLnNwbGljZSh1LS0sMSk6KGk9ITAsbi52YWx1ZT1zKSk7aXx8by5wdXNoKHtrZXk6YSx2YWx1ZTpzfSksci51cGRhdGVVUkwoKX0sc29ydDpmdW5jdGlvbigpe3ZhciB0LGUsbixyPWIodGhpcyksbz1yLmVudHJpZXMsaT1vLnNsaWNlKCk7Zm9yKG8ubGVuZ3RoPTAsbj0wO248aS5sZW5ndGg7bisrKXtmb3IodD1pW25dLGU9MDtlPG47ZSsrKWlmKG9bZV0ua2V5PnQua2V5KXtvLnNwbGljZShlLDAsdCk7YnJlYWt9ZT09PW4mJm8ucHVzaCh0KX1yLnVwZGF0ZVVSTCgpfSxmb3JFYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPWIodGhpcykuZW50cmllcyxyPXAodCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKSxvPTA7bzxuLmxlbmd0aDspcigoZT1uW28rK10pLnZhbHVlLGUua2V5LHRoaXMpfSxrZXlzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsImtleXMiKX0sdmFsdWVzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsInZhbHVlcyIpfSxlbnRyaWVzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsImVudHJpZXMiKX19LHtlbnVtZXJhYmxlOiEwfSksaShfLHksXy5lbnRyaWVzKSxpKF8sInRvU3RyaW5nIixmdW5jdGlvbigpe2Zvcih2YXIgdCxlPWIodGhpcykuZW50cmllcyxuPVtdLHI9MDtyPGUubGVuZ3RoOyl0PWVbcisrXSxuLnB1c2goQyh0LmtleSkrIj0iK0ModC52YWx1ZSkpO3JldHVybiBuLmpvaW4oIiYiKX0se2VudW1lcmFibGU6ITB9KSxzKEksIlVSTFNlYXJjaFBhcmFtcyIpLHIoe2dsb2JhbDohMCxmb3JjZWQ6IW99LHtVUkxTZWFyY2hQYXJhbXM6SX0pLHQuZXhwb3J0cz17VVJMU2VhcmNoUGFyYW1zOkksZ2V0U3RhdGU6Yn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpLG89bigyKSxpPW4oMjgpLGE9bygiaXRlcmF0b3IiKTt0LmV4cG9ydHM9IXIoZnVuY3Rpb24oKXt2YXIgdD1uZXcgVVJMKCJiP2U9MSIsImh0dHA6Ly9hIiksZT10LnNlYXJjaFBhcmFtcztyZXR1cm4gdC5wYXRobmFtZT0iYyUyMGQiLGkmJiF0LnRvSlNPTnx8IWUuc29ydHx8Imh0dHA6Ly9hL2MlMjBkP2U9MSIhPT10LmhyZWZ8fCIxIiE9PWUuZ2V0KCJlIil8fCJhPTEiIT09U3RyaW5nKG5ldyBVUkxTZWFyY2hQYXJhbXMoIj9hPTEiKSl8fCFlW2FdfHwiYSIhPT1uZXcgVVJMKCJodHRwczovL2FAYiIpLnVzZXJuYW1lfHwiYiIhPT1uZXcgVVJMU2VhcmNoUGFyYW1zKG5ldyBVUkxTZWFyY2hQYXJhbXMoImE9YiIpKS5nZXQoImEiKXx8InhuLS1lMWF5YmMiIT09bmV3IFVSTCgiaHR0cDovL9GC0LXRgdGCIikuaG9zdHx8IiMlRDAlQjEiIT09bmV3IFVSTCgiaHR0cDovL2Ej0LEiKS5oYXNofSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5yKGUpO3ZhciByPW4oOSksbz1uLm4ociksaT1uKDYxKSxhPW4ubihpKSxzPW4oMjYpLHU9bi5uKHMpLGM9bigzKSxsPW4ubihjKSxmPW4oMjApLHA9bi5uKGYpLGg9big4KSxkPW4ubihoKSxnPW4oMTIpLHY9bi5uKGcpLHk9bigxMjYpLG09bi5uKHkpLGI9bigxOSkseD1uLm4oYiksdz1uKDM3KSxrPW4ubih3KSxTPW4oMTUpLEU9bi5uKFMpLGo9bigxMCksVD1uLm4oaiksTz0obigxNiksbig4MCkpLEE9bi5uKE8pO2Z1bmN0aW9uIEModCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjAsbj1BKCkodC5yZXBsYWNlKC9bXjAtOV0vZ2ksIiIpLDEwKTtyZXR1cm4gbnx8ZX1mdW5jdGlvbiBMKHQpe3ZhciBlPSIiLG49dC5jb250ZW50cygpO2lmKG4ubGVuZ3RoPjApZm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKz0xKXt2YXIgbz1uLmdldChyKTszPT09by5ub2RlVHlwZSYmby5kYXRhJiYoZSs9by5kYXRhKX1yZXR1cm4gZX1mdW5jdGlvbiBSKHQsZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJzZWxlY3RvciByZXF1aXJlZCIpO3JldHVybiB0KGUpLmxlbmd0aD4wJiYiaW1nIj09PXQoZSkucHJvcCgidGFnTmFtZSIpLnRvTG93ZXJDYXNlKCk/dChlKS5hdHRyKCJhbHQiKXx8IiI6dChlKS50ZXh0KCkucmVwbGFjZSgvXG4vLCIiKX1mdW5jdGlvbiBQKHQsZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJzZWxlY3RvciByZXF1aXJlZCIpO3ZhciBuPSIiO2lmKHQoZSkubGVuZ3RoPjApe3ZhciByPXQoZSkucHJvcCgidGFnTmFtZSIpLnRvTG93ZXJDYXNlKCk7bj0iaW5wdXQiPT09cj90KGUpLnZhbCgpOiJtZXRhIj09PXI/dChlKS5hdHRyKCJjb250ZW50Iil8fCIiOkwodChlKSl9cmV0dXJuIG49bi5yZXBsYWNlKC9bXjAtOV0vZywiIiksQSgpKG4sMTApfXZhciBOPW4oMzgpLEk9bi5uKE4pLF89bigzOSksRD1uLm4oXyksTT1uKDQwKSxVPW4ubihNKSxCPW4oNDEpLHE9bi5uKEIpLEY9big0MiksSD1uLm4oRiksej1uKDQzKSxXPW4ubih6KSwkPW4oNjIpLFk9bi5uKCQpO2Z1bmN0aW9uIFYodCxlKXt2YXIgbjtpZih2b2lkIDA9PT1xLmF8fG51bGw9PVUoKSh0KSl7aWYoRCgpKHQpfHwobj1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKCF0KXJldHVybjtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIEcodCxlKTt2YXIgcj1XKCkobj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLmNhbGwobiw4LC0xKTsiT2JqZWN0Ij09PXImJnQuY29uc3RydWN0b3ImJihyPXQuY29uc3RydWN0b3IubmFtZSk7aWYoIk1hcCI9PT1yfHwiU2V0Ij09PXIpcmV0dXJuIEgoKSh0KTtpZigiQXJndW1lbnRzIj09PXJ8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKXJldHVybiBHKHQsZSl9KHQpKXx8ZSYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxvPWZ1bmN0aW9uKCl7fTtyZXR1cm57czpvLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjpvfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGksYT0hMCxzPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj1JKCkodCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1uLm5leHQoKTtyZXR1cm4gYT10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXtzPSEwLGk9dH0sZjpmdW5jdGlvbigpe3RyeXthfHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKHMpdGhyb3cgaX19fX1mdW5jdGlvbiBHKHQsZSl7KG51bGw9PWV8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9ZnVuY3Rpb24gSyh0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIlNLVeOBjOS4jeato+OBp+OBmSIpO2lmKDA9PT1ZKCkodCkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiU0tV6aCF55uu5pWw44GM5LiN5q2j44Gn44GZIil9dmFyIFg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuPWUuJCxyPWUubmFtZSxvPWUucHJpY2U7ZCgpKHRoaXMsdCksdGhpcy4kPW4sdGhpcy5uYW1lU2VsZWN0b3I9cnx8IiIsdGhpcy5wcmljZVNlbGVjdG9yPW98fCIifXJldHVybiB2KCkodCxbe2tleToiZ2V0UHVyY2hhc2FibGUiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiEwfX0se2tleToiZXhlY3V0ZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdCxlLG4scj0hMDt0cnl7cmV0dXJuIHQ9dGhpcy5nZXRJdGVtKCksZT10aGlzLmdldFNrdVJvd3ModCkscj10aGlzLmdldFB1cmNoYXNhYmxlKHtpdGVtOnQsc2t1Um93czplfSksZnVuY3Rpb24odCl7dmFyIGU9dC5pdGVtLG49dC5za3VSb3dzO2lmKCFlKXRocm93IG5ldyBFcnJvcigi44Ki44Kk44OG44Og44GM5LiN5q2j44Gn44GZIik7aWYoIWUubmFtZSl0aHJvdyBuZXcgRXJyb3IoIuOCouOCpOODhuODoOWQjeWJjeOBjOS4jeato+OBp+OBmSIpO2lmKCEobiYmMCE9PW4ubGVuZ3RofHxlLnByaWNlKSl0aHJvdyBuZXcgRXJyb3IoIuOCouOCpOODhuODoOmHkemhjeOBjOS4jeato+OBp+OBmSIpO2lmKG4pe3ZhciByLG89VihuKTt0cnl7Zm9yKG8ucygpOyEocj1vLm4oKSkuZG9uZTspe0soci52YWx1ZSl9fWNhdGNoKHQpe28uZSh0KX1maW5hbGx5e28uZigpfX19KHtpdGVtOnQsc2t1Um93czplfSkse2l0ZW06dCxza3VSb3dzOmUscHVyY2hhc2FibGU6cn19Y2F0Y2godCl7bj10fXZhciBvPXtwdXJjaGFzYWJsZTpyfTtyZXR1cm4gdCYmKG8uaXRlbT10KSxlJiYoby5za3VSb3dzPWUpLG4mJihvLmVycm9yPW4pLG99fSx7a2V5OiJnZXRJdGVtIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXtuYW1lOiIiLHByaWNlOjB9O3RoaXMubmFtZVNlbGVjdG9yP3QubmFtZT10aGlzLmdldEl0ZW1OYW1lKFIodGhpcy4kLHRoaXMubmFtZVNlbGVjdG9yKSk6dC5uYW1lPXRoaXMuZ2V0SXRlbU5hbWUoKSx0aGlzLnByaWNlU2VsZWN0b3I/dC5wcmljZT10aGlzLmdldEl0ZW1QcmljZShQKHRoaXMuJCx0aGlzLnByaWNlU2VsZWN0b3IpKTp0LnByaWNlPXRoaXMuZ2V0SXRlbVByaWNlKCk7dmFyIGU9dGhpcy5nZXRJdGVtQ29kZSgpO3JldHVybiBlJiYodC5jb2RlPWUpLHR9fSx7a2V5OiJnZXRJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06IiI7cmV0dXJuIHRoaXMubmFtZVNlbGVjdG9yP1IodGhpcy4kLHRoaXMubmFtZVNlbGVjdG9yKTp0fX0se2tleToiZ2V0SXRlbVByaWNlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTowO3JldHVybiB0aGlzLnByaWNlU2VsZWN0b3I/UCh0aGlzLiQsdGhpcy5wcmljZVNlbGVjdG9yKTp0fX0se2tleToiZ2V0SXRlbUNvZGUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9fSx7a2V5OiJnZXRTa3VSb3dzIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm5bXX19XSksdH0oKSxKPW4oMTI3KSxRPW4ubihKKSxaPW4oMTI4KTtmdW5jdGlvbiB0dCgpe3JldHVybiB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlcyYmd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2V8fHdpbmRvdy5uYXZpZ2F0b3IudXNlckxhbmd1YWdlfHx3aW5kb3cubmF2aWdhdG9yLmJyb3dzZXJMYW5ndWFnZX12YXIgZXQ9bigxMjkpLG50PW4ubihldCkscnQ9bigxMzApLG90PW4ubihydCksaXQ9InppZ3phZyI7dmFyIGF0PW4oMjUpLHN0PSJ1c2FnZSIsdXQ9InppZ3phZy1mbG93LWNvbnRyb2xsZWQiO2Z1bmN0aW9uIGN0KHQsZSl7d2luZG93LiQmJmZ1bmN0aW9uKG4pe3ZhciByPW4odCk7aWYociYmci5sZW5ndGg+MClmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rPTEpe3ZhciBpPXIuZ2V0KG8pO2kuaGFzQXR0cmlidXRlKHV0KXx8KCJjbGljayI9PT1lP2kub25jbGljaz1udWxsOiJzdWJtaXQiPT09ZSYmKGkub25zdWJtaXQ9bnVsbCksIm9mZiJpbiBuKGkpP24oaSkub2ZmKGUpOiJ1bmJpbmQiaW4gbihpKSYmbihpKS51bmJpbmQoZSkpfX0od2luZG93LiQpfXZhciBsdD17cHJlc2VydmVPcmlnaW5hbEV2ZW50OiExLGRpc2FibGVQb2ludGVyRXZlbnQ6ITEsZGlzYWJsZVJlcG9ydDohMX07dmFyIGZ0PXtkaXNhYmxlUmVwb3J0OiExfTtmdW5jdGlvbiBwdCh0KXt2YXIgZT1vdCgpKGZ1bmN0aW9uKCl7dmFyIG4scixvPXdpbmRvdy56aWd6YWc7ImRlYWN0aXZhdGVkIj09PShuPXN0LHI9d2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGl0KSxKU09OLnBhcnNlKHI/ZGVjb2RlVVJJQ29tcG9uZW50KGF0b2IocikpOiJ7fSIpW25dKXx8by5pc0RlbmllZHx8KHQoKSxjbGVhckludGVydmFsKGUpKX0sNTAwKX1mdW5jdGlvbiBodCh0LGUpe3ZhciBuPXdpbmRvdy56aWd6YWc7bnQoKShmdW5jdGlvbigpey9DaHJvbWUvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpJiYwPT09dChlKS5sZW5ndGgmJm4mJiJpdGVtIj09PW4uZGlzY292ZXJ5U3RhdHVzJiZhdC5hLmVycm9yKCIiLmNvbmNhdChlLCI6IOOCouOCpOODhuODoOODmuODvOOCuOOBp+ipsuW9k+OBmeOCi+ODleODreODvOWItuW+oeeUqOOBruimgee0oOOBjOimi+OBpOOBi+OCiuOBvuOBm+OCkyIpKX0sNWUzKX12YXIgZHQ9e29uQ2hhbmdlc1JlYWR5OmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpbImphIl07Qm9vbGVhbihUKCkoZSkuY2FsbChlLGZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybi0xIT09USgpKGU9dHQoKSkuY2FsbChlLHQpfSkpfHxwdChmdW5jdGlvbigpe3QoWil9KX0sb3ZlcnJpZGVDbGlja0V2ZW50OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106bHQ7aWYoKHI9dSgpKHUoKSh7fSxsdCkscikpLmRpc2FibGVSZXBvcnR8fGh0KHQsZSksci5kaXNhYmxlUG9pbnRlckV2ZW50KXtpZih3aW5kb3cuZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUodXQpKXJldHVybjt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO28uaW5uZXJIVE1MPSJcbiAgICAiLmNvbmNhdChlLCIge1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgfSIpO3ZhciBpPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdCIpO3JldHVybiBpJiZpLnBhcmVudE5vZGUmJmkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobyxpKSx0KGRvY3VtZW50KS5vbigiY2xpY2siLGZ1bmN0aW9uKHIpe3IudGFyZ2V0JiZ0KHIudGFyZ2V0KS5jbG9zZXN0KHQoZSkucGFyZW50KCkpLmxlbmd0aD4wJiZuKHIpfSksdm9pZCB3aW5kb3cuZG9jdW1lbnQuYm9keS5zZXRBdHRyaWJ1dGUodXQsIjEiKX1yLnByZXNlcnZlT3JpZ2luYWxFdmVudHx8Y3QoZSwiY2xpY2siKTtmb3IodmFyIGE9dChlKSxzPTA7czxhLmxlbmd0aDtzKz0xKXt2YXIgYz1hLmdldChzKTtjLmhhc0F0dHJpYnV0ZSh1dCl8fChjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbih0KXtyLnByZXNlcnZlT3JpZ2luYWxFdmVudHx8KHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpKSxuKHQpfSwhMCksYy5zZXRBdHRyaWJ1dGUodXQsIjEiKSl9fSxvdmVycmlkZVN1Ym1pdEV2ZW50OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106ZnQ7KHI9dSgpKHUoKSh7fSxmdCkscikpLmRpc2FibGVSZXBvcnR8fGh0KHQsZSksY3QoZSwic3VibWl0Iik7dmFyIG89dChlKTtpZihvJiZvLmxlbmd0aD4wKWZvcih2YXIgaT0wO2k8by5sZW5ndGg7aSs9MSl7dmFyIGE9by5nZXQoaSk7YS5oYXNBdHRyaWJ1dGUodXQpfHwodChhKS5vbigic3VibWl0IixuKSxhLnNldEF0dHJpYnV0ZSh1dCwiMSIpKX19LHVuYmluZE9yaWdpbmFsSlF1ZXJ5RXZlbnRzOmN0fTt2YXIgZ3Q9big4MSksdnQ9bi5uKGd0KSx5dD1uKDEzMSksbXQ9bi5uKHl0KSxidD1uKDEzMikseHQ9bi5uKGJ0KSx3dD1uKDgyKSxrdD1uLm4od3QpO2Z1bmN0aW9uIFN0KHQpe3JldHVybihTdD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIEV0KHQsZSxuKXtyZXR1cm4gZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH1mdW5jdGlvbiBqdCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/T2JqZWN0KGFyZ3VtZW50c1tlXSk6e30scj1PYmplY3Qua2V5cyhuKTsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmKHI9ci5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhuKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KS5lbnVtZXJhYmxlfSkpKSxyLmZvckVhY2goZnVuY3Rpb24oZSl7RXQodCxlLG5bZV0pfSl9cmV0dXJuIHR9ZnVuY3Rpb24gVHQodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBPdCh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fWZ1bmN0aW9uIEF0KHQsZSxuKXtyZXR1cm4gZSYmT3QodC5wcm90b3R5cGUsZSksbiYmT3QodCxuKSx0fWZ1bmN0aW9uIEN0KHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBMdCh0LGUpe3JldHVybiFlfHwib2JqZWN0IiE9PVN0KGUpJiYiZnVuY3Rpb24iIT10eXBlb2YgZT9DdCh0KTplfWZ1bmN0aW9uIFJ0KHQpe3JldHVybihSdD1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9ZnVuY3Rpb24gUHQodCxlKXtyZXR1cm4oUHQ9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9KSh0LGUpfWZ1bmN0aW9uIE50KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJlB0KHQsZSl9dmFyIEl0PXt0eXBlOiJsb2dnZXIiLGxvZzpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgibG9nIix0KX0sd2FybjpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgid2FybiIsdCl9LGVycm9yOmZ1bmN0aW9uKHQpe3RoaXMub3V0cHV0KCJlcnJvciIsdCl9LG91dHB1dDpmdW5jdGlvbih0LGUpe2NvbnNvbGUmJmNvbnNvbGVbdF0mJmNvbnNvbGVbdF0uYXBwbHkoY29uc29sZSxlKX19LF90PW5ldyhmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O1R0KHRoaXMsdCksdGhpcy5pbml0KGUsbil9cmV0dXJuIEF0KHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTt0aGlzLnByZWZpeD1lLnByZWZpeHx8ImkxOG5leHQ6Iix0aGlzLmxvZ2dlcj10fHxJdCx0aGlzLm9wdGlvbnM9ZSx0aGlzLmRlYnVnPWUuZGVidWd9fSx7a2V5OiJzZXREZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5kZWJ1Zz10fX0se2tleToibG9nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwibG9nIiwiIiwhMCl9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIiIsITApfX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCksbj0wO248dDtuKyspZVtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuZm9yd2FyZChlLCJlcnJvciIsIiIpfX0se2tleToiZGVwcmVjYXRlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIldBUk5JTkcgREVQUkVDQVRFRDogIiwhMCl9fSx7a2V5OiJmb3J3YXJkIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gciYmIXRoaXMuZGVidWc/bnVsbDooInN0cmluZyI9PXR5cGVvZiB0WzBdJiYodFswXT0iIi5jb25jYXQobikuY29uY2F0KHRoaXMucHJlZml4LCIgIikuY29uY2F0KHRbMF0pKSx0aGlzLmxvZ2dlcltlXSh0KSl9fSx7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdCh0aGlzLmxvZ2dlcixqdCh7fSx7cHJlZml4OiIiLmNvbmNhdCh0aGlzLnByZWZpeCwiOiIpLmNvbmNhdChlLCI6Iil9LHRoaXMub3B0aW9ucykpfX1dKSx0fSgpKSxEdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtUdCh0aGlzLHQpLHRoaXMub2JzZXJ2ZXJzPXt9fXJldHVybiBBdCh0LFt7a2V5OiJvbiIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3JldHVybiB0LnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbih0KXtuLm9ic2VydmVyc1t0XT1uLm9ic2VydmVyc1t0XXx8W10sbi5vYnNlcnZlcnNbdF0ucHVzaChlKX0pLHRoaXN9fSx7a2V5OiJvZmYiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5vYnNlcnZlcnNbdF0mJihlP3RoaXMub2JzZXJ2ZXJzW3RdPXRoaXMub2JzZXJ2ZXJzW3RdLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdCE9PWV9KTpkZWxldGUgdGhpcy5vYnNlcnZlcnNbdF0pfX0se2tleToiZW1pdCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkoZT4xP2UtMTowKSxyPTE7cjxlO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO2lmKHRoaXMub2JzZXJ2ZXJzW3RdKXt2YXIgbz1bXS5jb25jYXQodGhpcy5vYnNlcnZlcnNbdF0pO28uZm9yRWFjaChmdW5jdGlvbih0KXt0LmFwcGx5KHZvaWQgMCxuKX0pfWlmKHRoaXMub2JzZXJ2ZXJzWyIqIl0pe3ZhciBpPVtdLmNvbmNhdCh0aGlzLm9ic2VydmVyc1siKiJdKTtpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hcHBseShlLFt0XS5jb25jYXQobikpfSl9fX1dKSx0fSgpO2Z1bmN0aW9uIE10KCl7dmFyIHQsZSxuPW5ldyBQcm9taXNlKGZ1bmN0aW9uKG4scil7dD1uLGU9cn0pO3JldHVybiBuLnJlc29sdmU9dCxuLnJlamVjdD1lLG59ZnVuY3Rpb24gVXQodCl7cmV0dXJuIG51bGw9PXQ/IiI6IiIrdH1mdW5jdGlvbiBCdCh0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5pbmRleE9mKCIjIyMiKT4tMT90LnJlcGxhY2UoLyMjIy9nLCIuIik6dH1mdW5jdGlvbiBvKCl7cmV0dXJuIXR8fCJzdHJpbmciPT10eXBlb2YgdH1mb3IodmFyIGk9InN0cmluZyIhPXR5cGVvZiBlP1tdLmNvbmNhdChlKTplLnNwbGl0KCIuIik7aS5sZW5ndGg+MTspe2lmKG8oKSlyZXR1cm57fTt2YXIgYT1yKGkuc2hpZnQoKSk7IXRbYV0mJm4mJih0W2FdPW5ldyBuKSx0PXRbYV19cmV0dXJuIG8oKT97fTp7b2JqOnQsazpyKGkuc2hpZnQoKSl9fWZ1bmN0aW9uIHF0KHQsZSxuKXt2YXIgcj1CdCh0LGUsT2JqZWN0KTtyLm9ialtyLmtdPW59ZnVuY3Rpb24gRnQodCxlKXt2YXIgbj1CdCh0LGUpLHI9bi5vYmosbz1uLms7aWYocilyZXR1cm4gcltvXX1mdW5jdGlvbiBIdCh0LGUsbil7dmFyIHI9RnQodCxuKTtyZXR1cm4gdm9pZCAwIT09cj9yOkZ0KGUsbil9ZnVuY3Rpb24genQodCxlLG4pe2Zvcih2YXIgciBpbiBlKSJfX3Byb3RvX18iIT09ciYmImNvbnN0cnVjdG9yIiE9PXImJihyIGluIHQ/InN0cmluZyI9PXR5cGVvZiB0W3JdfHx0W3JdaW5zdGFuY2VvZiBTdHJpbmd8fCJzdHJpbmciPT10eXBlb2YgZVtyXXx8ZVtyXWluc3RhbmNlb2YgU3RyaW5nP24mJih0W3JdPWVbcl0pOnp0KHRbcl0sZVtyXSxuKTp0W3JdPWVbcl0pO3JldHVybiB0fWZ1bmN0aW9uIFd0KHQpe3JldHVybiB0LnJlcGxhY2UoL1tcLVxbXF1cL1x7XH1cKFwpXCpcK1w/XC5cXFxeXCRcfF0vZywiXFwkJiIpfXZhciAkdD17IiYiOiImYW1wOyIsIjwiOiImbHQ7IiwiPiI6IiZndDsiLCciJzoiJnF1b3Q7IiwiJyI6IiYjMzk7IiwiLyI6IiYjeDJGOyJ9O2Z1bmN0aW9uIFl0KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90LnJlcGxhY2UoL1smPD4iJ1wvXS9nLGZ1bmN0aW9uKHQpe3JldHVybiAkdFt0XX0pOnR9dmFyIFZ0PSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cubmF2aWdhdG9yJiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCYmd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpPi0xLEd0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7dmFyIG4scj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e25zOlsidHJhbnNsYXRpb24iXSxkZWZhdWx0TlM6InRyYW5zbGF0aW9uIn07cmV0dXJuIFR0KHRoaXMsZSksbj1MdCh0aGlzLFJ0KGUpLmNhbGwodGhpcykpLFZ0JiZEdC5jYWxsKEN0KG4pKSxuLmRhdGE9dHx8e30sbi5vcHRpb25zPXIsdm9pZCAwPT09bi5vcHRpb25zLmtleVNlcGFyYXRvciYmKG4ub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSxufXJldHVybiBOdChlLER0KSxBdChlLFt7a2V5OiJhZGROYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMubnMuaW5kZXhPZih0KTwwJiZ0aGlzLm9wdGlvbnMubnMucHVzaCh0KX19LHtrZXk6InJlbW92ZU5hbWVzcGFjZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9ucy5ucy5pbmRleE9mKHQpO2U+LTEmJnRoaXMub3B0aW9ucy5ucy5zcGxpY2UoZSwxKX19LHtrZXk6ImdldFJlc291cmNlIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9LG89dm9pZCAwIT09ci5rZXlTZXBhcmF0b3I/ci5rZXlTZXBhcmF0b3I6dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcixpPVt0LGVdO3JldHVybiBuJiYic3RyaW5nIiE9dHlwZW9mIG4mJihpPWkuY29uY2F0KG4pKSxuJiYic3RyaW5nIj09dHlwZW9mIG4mJihpPWkuY29uY2F0KG8/bi5zcGxpdChvKTpuKSksdC5pbmRleE9mKCIuIik+LTEmJihpPXQuc3BsaXQoIi4iKSksRnQodGhpcy5kYXRhLGkpfX0se2tleToiYWRkUmVzb3VyY2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTp7c2lsZW50OiExfSxpPXRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3I7dm9pZCAwPT09aSYmKGk9Ii4iKTt2YXIgYT1bdCxlXTtuJiYoYT1hLmNvbmNhdChpP24uc3BsaXQoaSk6bikpLHQuaW5kZXhPZigiLiIpPi0xJiYocj1lLGU9KGE9dC5zcGxpdCgiLiIpKVsxXSksdGhpcy5hZGROYW1lc3BhY2VzKGUpLHF0KHRoaXMuZGF0YSxhLHIpLG8uc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbixyKX19LHtrZXk6ImFkZFJlc291cmNlcyIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7c2lsZW50OiExfTtmb3IodmFyIG8gaW4gbikic3RyaW5nIiE9dHlwZW9mIG5bb10mJiJbb2JqZWN0IEFycmF5XSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KG5bb10pfHx0aGlzLmFkZFJlc291cmNlKHQsZSxvLG5bb10se3NpbGVudDohMH0pO3Iuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbil9fSx7a2V5OiJhZGRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06e3NpbGVudDohMX0sYT1bdCxlXTt0LmluZGV4T2YoIi4iKT4tMSYmKHI9bixuPWUsZT0oYT10LnNwbGl0KCIuIikpWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoZSk7dmFyIHM9RnQodGhpcy5kYXRhLGEpfHx7fTtyP3p0KHMsbixvKTpzPWp0KHt9LHMsbikscXQodGhpcy5kYXRhLGEscyksaS5zaWxlbnR8fHRoaXMuZW1pdCgiYWRkZWQiLHQsZSxuKX19LHtrZXk6InJlbW92ZVJlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMuaGFzUmVzb3VyY2VCdW5kbGUodCxlKSYmZGVsZXRlIHRoaXMuZGF0YVt0XVtlXSx0aGlzLnJlbW92ZU5hbWVzcGFjZXMoZSksdGhpcy5lbWl0KCJyZW1vdmVkIix0LGUpfX0se2tleToiaGFzUmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuZ2V0UmVzb3VyY2UodCxlKX19LHtrZXk6ImdldFJlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiBlfHwoZT10aGlzLm9wdGlvbnMuZGVmYXVsdE5TKSwidjEiPT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEk/anQoe30se30sdGhpcy5nZXRSZXNvdXJjZSh0LGUpKTp0aGlzLmdldFJlc291cmNlKHQsZSl9fSx7a2V5OiJnZXREYXRhQnlMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF0YVt0XX19LHtrZXk6InRvSlNPTiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhfX1dKSxlfSgpLEt0PXtwcm9jZXNzb3JzOnt9LGFkZFBvc3RQcm9jZXNzb3I6ZnVuY3Rpb24odCl7dGhpcy5wcm9jZXNzb3JzW3QubmFtZV09dH0saGFuZGxlOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGk9dGhpcztyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2kucHJvY2Vzc29yc1t0XSYmKGU9aS5wcm9jZXNzb3JzW3RdLnByb2Nlc3MoZSxuLHIsbykpfSksZX19LFh0PXt9LEp0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7dmFyIG4scixvLGksYT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307cmV0dXJuIFR0KHRoaXMsZSksbj1MdCh0aGlzLFJ0KGUpLmNhbGwodGhpcykpLFZ0JiZEdC5jYWxsKEN0KG4pKSxyPVsicmVzb3VyY2VTdG9yZSIsImxhbmd1YWdlVXRpbHMiLCJwbHVyYWxSZXNvbHZlciIsImludGVycG9sYXRvciIsImJhY2tlbmRDb25uZWN0b3IiLCJpMThuRm9ybWF0IiwidXRpbHMiXSxvPXQsaT1DdChuKSxyLmZvckVhY2goZnVuY3Rpb24odCl7b1t0XSYmKGlbdF09b1t0XSl9KSxuLm9wdGlvbnM9YSx2b2lkIDA9PT1uLm9wdGlvbnMua2V5U2VwYXJhdG9yJiYobi5vcHRpb25zLmtleVNlcGFyYXRvcj0iLiIpLG4ubG9nZ2VyPV90LmNyZWF0ZSgidHJhbnNsYXRvciIpLG59cmV0dXJuIE50KGUsRHQpLEF0KGUsW3trZXk6ImNoYW5nZUxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbih0KXt0JiYodGhpcy5sYW5ndWFnZT10KX19LHtrZXk6ImV4aXN0cyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOntpbnRlcnBvbGF0aW9uOnt9fSxuPXRoaXMucmVzb2x2ZSh0LGUpO3JldHVybiBuJiZ2b2lkIDAhPT1uLnJlc319LHtrZXk6ImV4dHJhY3RGcm9tS2V5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXZvaWQgMCE9PWUubnNTZXBhcmF0b3I/ZS5uc1NlcGFyYXRvcjp0aGlzLm9wdGlvbnMubnNTZXBhcmF0b3I7dm9pZCAwPT09biYmKG49IjoiKTt2YXIgcj12b2lkIDAhPT1lLmtleVNlcGFyYXRvcj9lLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLG89ZS5uc3x8dGhpcy5vcHRpb25zLmRlZmF1bHROUztpZihuJiZ0LmluZGV4T2Yobik+LTEpe3ZhciBpPXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7aWYoaSYmaS5sZW5ndGg+MClyZXR1cm57a2V5OnQsbmFtZXNwYWNlczpvfTt2YXIgYT10LnNwbGl0KG4pOyhuIT09cnx8bj09PXImJnRoaXMub3B0aW9ucy5ucy5pbmRleE9mKGFbMF0pPi0xKSYmKG89YS5zaGlmdCgpKSx0PWEuam9pbihyKX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIG8mJihvPVtvXSkse2tleTp0LG5hbWVzcGFjZXM6b319fSx7a2V5OiJ0cmFuc2xhdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzO2lmKCJvYmplY3QiIT09U3QoZSkmJnRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlciYmKGU9dGhpcy5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKGFyZ3VtZW50cykpLGV8fChlPXt9KSxudWxsPT10KXJldHVybiIiO0FycmF5LmlzQXJyYXkodCl8fCh0PVtTdHJpbmcodCldKTt2YXIgbz12b2lkIDAhPT1lLmtleVNlcGFyYXRvcj9lLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLGk9dGhpcy5leHRyYWN0RnJvbUtleSh0W3QubGVuZ3RoLTFdLGUpLGE9aS5rZXkscz1pLm5hbWVzcGFjZXMsdT1zW3MubGVuZ3RoLTFdLGM9ZS5sbmd8fHRoaXMubGFuZ3VhZ2UsbD1lLmFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlfHx0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU7aWYoYyYmImNpbW9kZSI9PT1jLnRvTG93ZXJDYXNlKCkpe2lmKGwpe3ZhciBmPWUubnNTZXBhcmF0b3J8fHRoaXMub3B0aW9ucy5uc1NlcGFyYXRvcjtyZXR1cm4gdStmK2F9cmV0dXJuIGF9dmFyIHA9dGhpcy5yZXNvbHZlKHQsZSksaD1wJiZwLnJlcyxkPXAmJnAudXNlZEtleXx8YSxnPXAmJnAuZXhhY3RVc2VkS2V5fHxhLHY9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShoKSx5PVsiW29iamVjdCBOdW1iZXJdIiwiW29iamVjdCBGdW5jdGlvbl0iLCJbb2JqZWN0IFJlZ0V4cF0iXSxtPXZvaWQgMCE9PWUuam9pbkFycmF5cz9lLmpvaW5BcnJheXM6dGhpcy5vcHRpb25zLmpvaW5BcnJheXMsYj0hdGhpcy5pMThuRm9ybWF0fHx0aGlzLmkxOG5Gb3JtYXQuaGFuZGxlQXNPYmplY3QseD0ic3RyaW5nIiE9dHlwZW9mIGgmJiJib29sZWFuIiE9dHlwZW9mIGgmJiJudW1iZXIiIT10eXBlb2YgaDtpZihiJiZoJiZ4JiZ5LmluZGV4T2Yodik8MCYmKCJzdHJpbmciIT10eXBlb2YgbXx8IltvYmplY3QgQXJyYXldIiE9PXYpKXtpZighZS5yZXR1cm5PYmplY3RzJiYhdGhpcy5vcHRpb25zLnJldHVybk9iamVjdHMpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImFjY2Vzc2luZyBhbiBvYmplY3QgLSBidXQgcmV0dXJuT2JqZWN0cyBvcHRpb25zIGlzIG5vdCBlbmFibGVkISIpLHRoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXI/dGhpcy5vcHRpb25zLnJldHVybmVkT2JqZWN0SGFuZGxlcihkLGgsZSk6ImtleSAnIi5jb25jYXQoYSwiICgiKS5jb25jYXQodGhpcy5sYW5ndWFnZSwiKScgcmV0dXJuZWQgYW4gb2JqZWN0IGluc3RlYWQgb2Ygc3RyaW5nLiIpO2lmKG8pe3ZhciB3PSJbb2JqZWN0IEFycmF5XSI9PT12LGs9dz9bXTp7fSxTPXc/ZzpkO2Zvcih2YXIgRSBpbiBoKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChoLEUpKXt2YXIgaj0iIi5jb25jYXQoUykuY29uY2F0KG8pLmNvbmNhdChFKTtrW0VdPXRoaXMudHJhbnNsYXRlKGosanQoe30sZSx7am9pbkFycmF5czohMSxuczpzfSkpLGtbRV09PT1qJiYoa1tFXT1oW0VdKX1oPWt9fWVsc2UgaWYoYiYmInN0cmluZyI9PXR5cGVvZiBtJiYiW29iamVjdCBBcnJheV0iPT09dikoaD1oLmpvaW4obSkpJiYoaD10aGlzLmV4dGVuZFRyYW5zbGF0aW9uKGgsdCxlLG4pKTtlbHNle3ZhciBUPSExLE89ITE7aWYoIXRoaXMuaXNWYWxpZExvb2t1cChoKSYmdm9pZCAwIT09ZS5kZWZhdWx0VmFsdWUpe2lmKFQ9ITAsdm9pZCAwIT09ZS5jb3VudCl7dmFyIEE9dGhpcy5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgoYyxlLmNvdW50KTtoPWVbImRlZmF1bHRWYWx1ZSIuY29uY2F0KEEpXX1ofHwoaD1lLmRlZmF1bHRWYWx1ZSl9dGhpcy5pc1ZhbGlkTG9va3VwKGgpfHwoTz0hMCxoPWEpO3ZhciBDPWUuZGVmYXVsdFZhbHVlJiZlLmRlZmF1bHRWYWx1ZSE9PWgmJnRoaXMub3B0aW9ucy51cGRhdGVNaXNzaW5nO2lmKE98fFR8fEMpe2lmKHRoaXMubG9nZ2VyLmxvZyhDPyJ1cGRhdGVLZXkiOiJtaXNzaW5nS2V5IixjLHUsYSxDP2UuZGVmYXVsdFZhbHVlOmgpLG8pe3ZhciBMPXRoaXMucmVzb2x2ZShhLGp0KHt9LGUse2tleVNlcGFyYXRvcjohMX0pKTtMJiZMLnJlcyYmdGhpcy5sb2dnZXIud2FybigiU2VlbXMgdGhlIGxvYWRlZCB0cmFuc2xhdGlvbnMgd2VyZSBpbiBmbGF0IEpTT04gZm9ybWF0IGluc3RlYWQgb2YgbmVzdGVkLiBFaXRoZXIgc2V0IGtleVNlcGFyYXRvcjogZmFsc2Ugb24gaW5pdCBvciBtYWtlIHN1cmUgeW91ciB0cmFuc2xhdGlvbnMgYXJlIHB1Ymxpc2hlZCBpbiBuZXN0ZWQgZm9ybWF0LiIpfXZhciBSPVtdLFA9dGhpcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nLGUubG5nfHx0aGlzLmxhbmd1YWdlKTtpZigiZmFsbGJhY2siPT09dGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nVG8mJlAmJlBbMF0pZm9yKHZhciBOPTA7TjxQLmxlbmd0aDtOKyspUi5wdXNoKFBbTl0pO2Vsc2UiYWxsIj09PXRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvP1I9dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShlLmxuZ3x8dGhpcy5sYW5ndWFnZSk6Ui5wdXNoKGUubG5nfHx0aGlzLmxhbmd1YWdlKTt2YXIgST1mdW5jdGlvbih0LG4pe3Iub3B0aW9ucy5taXNzaW5nS2V5SGFuZGxlcj9yLm9wdGlvbnMubWlzc2luZ0tleUhhbmRsZXIodCx1LG4sQz9lLmRlZmF1bHRWYWx1ZTpoLEMsZSk6ci5iYWNrZW5kQ29ubmVjdG9yJiZyLmJhY2tlbmRDb25uZWN0b3Iuc2F2ZU1pc3NpbmcmJnIuYmFja2VuZENvbm5lY3Rvci5zYXZlTWlzc2luZyh0LHUsbixDP2UuZGVmYXVsdFZhbHVlOmgsQyxlKSxyLmVtaXQoIm1pc3NpbmdLZXkiLHQsdSxuLGgpfTtpZih0aGlzLm9wdGlvbnMuc2F2ZU1pc3Npbmcpe3ZhciBfPXZvaWQgMCE9PWUuY291bnQmJiJzdHJpbmciIT10eXBlb2YgZS5jb3VudDt0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdQbHVyYWxzJiZfP1IuZm9yRWFjaChmdW5jdGlvbih0KXtyLnBsdXJhbFJlc29sdmVyLmdldFBsdXJhbEZvcm1zT2ZLZXkodCxhKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBJKFt0XSxlKX0pfSk6SShSLGEpfX1oPXRoaXMuZXh0ZW5kVHJhbnNsYXRpb24oaCx0LGUscCxuKSxPJiZoPT09YSYmdGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvTWlzc2luZ0tleSYmKGg9IiIuY29uY2F0KHUsIjoiKS5jb25jYXQoYSkpLE8mJnRoaXMub3B0aW9ucy5wYXJzZU1pc3NpbmdLZXlIYW5kbGVyJiYoaD10aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcihoKSl9cmV0dXJuIGh9fSx7a2V5OiJleHRlbmRUcmFuc2xhdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaT10aGlzO2lmKHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LnBhcnNlKXQ9dGhpcy5pMThuRm9ybWF0LnBhcnNlKHQsbixyLnVzZWRMbmcsci51c2VkTlMsci51c2VkS2V5LHtyZXNvbHZlZDpyfSk7ZWxzZSBpZighbi5za2lwSW50ZXJwb2xhdGlvbil7bi5pbnRlcnBvbGF0aW9uJiZ0aGlzLmludGVycG9sYXRvci5pbml0KGp0KHt9LG4se2ludGVycG9sYXRpb246anQoe30sdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24sbi5pbnRlcnBvbGF0aW9uKX0pKTt2YXIgYSxzPW4uaW50ZXJwb2xhdGlvbiYmbi5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlc3x8dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzO2lmKHMpe3ZhciB1PXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7YT11JiZ1Lmxlbmd0aH12YXIgYz1uLnJlcGxhY2UmJiJzdHJpbmciIT10eXBlb2Ygbi5yZXBsYWNlP24ucmVwbGFjZTpuO2lmKHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMmJihjPWp0KHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMsYykpLHQ9dGhpcy5pbnRlcnBvbGF0b3IuaW50ZXJwb2xhdGUodCxjLG4ubG5nfHx0aGlzLmxhbmd1YWdlLG4pLHMpe3ZhciBsPXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7YTwobCYmbC5sZW5ndGgpJiYobi5uZXN0PSExKX0hMSE9PW4ubmVzdCYmKHQ9dGhpcy5pbnRlcnBvbGF0b3IubmVzdCh0LGZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkodCksYT0wO2E8dDthKyspclthXT1hcmd1bWVudHNbYV07cmV0dXJuIG8mJm9bMF09PT1yWzBdJiYhbi5jb250ZXh0PyhpLmxvZ2dlci53YXJuKCJJdCBzZWVtcyB5b3UgYXJlIG5lc3RpbmcgcmVjdXJzaXZlbHkga2V5OiAiLmNvbmNhdChyWzBdLCIgaW4ga2V5OiAiKS5jb25jYXQoZVswXSkpLG51bGwpOmkudHJhbnNsYXRlLmFwcGx5KGksci5jb25jYXQoW2VdKSl9LG4pKSxuLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLnJlc2V0KCl9dmFyIGY9bi5wb3N0UHJvY2Vzc3x8dGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzLHA9InN0cmluZyI9PXR5cGVvZiBmP1tmXTpmO3JldHVybiBudWxsIT10JiZwJiZwLmxlbmd0aCYmITEhPT1uLmFwcGx5UG9zdFByb2Nlc3NvciYmKHQ9S3QuaGFuZGxlKHAsdCxlLHRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzUGFzc1Jlc29sdmVkP2p0KHtpMThuUmVzb2x2ZWQ6cn0sbik6bix0aGlzKSksdH19LHtrZXk6InJlc29sdmUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYT10aGlzLHM9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSx0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoIWEuaXNWYWxpZExvb2t1cChlKSl7dmFyIHU9YS5leHRyYWN0RnJvbUtleSh0LHMpLGM9dS5rZXk7bj1jO3ZhciBsPXUubmFtZXNwYWNlczthLm9wdGlvbnMuZmFsbGJhY2tOUyYmKGw9bC5jb25jYXQoYS5vcHRpb25zLmZhbGxiYWNrTlMpKTt2YXIgZj12b2lkIDAhPT1zLmNvdW50JiYic3RyaW5nIiE9dHlwZW9mIHMuY291bnQscD12b2lkIDAhPT1zLmNvbnRleHQmJiJzdHJpbmciPT10eXBlb2Ygcy5jb250ZXh0JiYiIiE9PXMuY29udGV4dCxoPXMubG5ncz9zLmxuZ3M6YS5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShzLmxuZ3x8YS5sYW5ndWFnZSxzLmZhbGxiYWNrTG5nKTtsLmZvckVhY2goZnVuY3Rpb24odCl7YS5pc1ZhbGlkTG9va3VwKGUpfHwoaT10LCFYdFsiIi5jb25jYXQoaFswXSwiLSIpLmNvbmNhdCh0KV0mJmEudXRpbHMmJmEudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlJiYhYS51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UoaSkmJihYdFsiIi5jb25jYXQoaFswXSwiLSIpLmNvbmNhdCh0KV09ITAsYS5sb2dnZXIud2Fybigna2V5ICInLmNvbmNhdChuLCciIGZvciBsYW5ndWFnZXMgIicpLmNvbmNhdChoLmpvaW4oIiwgIiksJyIgd29uXCd0IGdldCByZXNvbHZlZCBhcyBuYW1lc3BhY2UgIicpLmNvbmNhdChpLCciIHdhcyBub3QgeWV0IGxvYWRlZCcpLCJUaGlzIG1lYW5zIHNvbWV0aGluZyBJUyBXUk9ORyBpbiB5b3VyIHNldHVwLiBZb3UgYWNjZXNzIHRoZSB0IGZ1bmN0aW9uIGJlZm9yZSBpMThuZXh0LmluaXQgLyBpMThuZXh0LmxvYWROYW1lc3BhY2UgLyBpMThuZXh0LmNoYW5nZUxhbmd1YWdlIHdhcyBkb25lLiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgb3IgUHJvbWlzZSB0byByZXNvbHZlIGJlZm9yZSBhY2Nlc3NpbmcgaXQhISEiKSksaC5mb3JFYWNoKGZ1bmN0aW9uKG4pe2lmKCFhLmlzVmFsaWRMb29rdXAoZSkpe289bjt2YXIgaSx1LGw9YyxoPVtsXTtpZihhLmkxOG5Gb3JtYXQmJmEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKWEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKGgsYyxuLHQscyk7ZWxzZSBmJiYoaT1hLnBsdXJhbFJlc29sdmVyLmdldFN1ZmZpeChuLHMuY291bnQpKSxmJiZwJiZoLnB1c2gobCtpKSxwJiZoLnB1c2gobCs9IiIuY29uY2F0KGEub3B0aW9ucy5jb250ZXh0U2VwYXJhdG9yKS5jb25jYXQocy5jb250ZXh0KSksZiYmaC5wdXNoKGwrPWkpO2Zvcig7dT1oLnBvcCgpOylhLmlzVmFsaWRMb29rdXAoZSl8fChyPXUsZT1hLmdldFJlc291cmNlKG4sdCx1LHMpKX19KSl9KX19KSx7cmVzOmUsdXNlZEtleTpuLGV4YWN0VXNlZEtleTpyLHVzZWRMbmc6byx1c2VkTlM6aX19fSx7a2V5OiJpc1ZhbGlkTG9va3VwIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4hKHZvaWQgMD09PXR8fCF0aGlzLm9wdGlvbnMucmV0dXJuTnVsbCYmbnVsbD09PXR8fCF0aGlzLm9wdGlvbnMucmV0dXJuRW1wdHlTdHJpbmcmJiIiPT09dCl9fSx7a2V5OiJnZXRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fTtyZXR1cm4gdGhpcy5pMThuRm9ybWF0JiZ0aGlzLmkxOG5Gb3JtYXQuZ2V0UmVzb3VyY2U/dGhpcy5pMThuRm9ybWF0LmdldFJlc291cmNlKHQsZSxuLHIpOnRoaXMucmVzb3VyY2VTdG9yZS5nZXRSZXNvdXJjZSh0LGUsbixyKX19XSksZX0oKTtmdW5jdGlvbiBRdCh0KXtyZXR1cm4gdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpfXZhciBadD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7VHQodGhpcyx0KSx0aGlzLm9wdGlvbnM9ZSx0aGlzLndoaXRlbGlzdD10aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5nc3x8ITEsdGhpcy5zdXBwb3J0ZWRMbmdzPXRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHwhMSx0aGlzLmxvZ2dlcj1fdC5jcmVhdGUoImxhbmd1YWdlVXRpbHMiKX1yZXR1cm4gQXQodCxbe2tleToiZ2V0U2NyaXB0UGFydEZyb21Db2RlIix2YWx1ZTpmdW5jdGlvbih0KXtpZighdHx8dC5pbmRleE9mKCItIik8MClyZXR1cm4gbnVsbDt2YXIgZT10LnNwbGl0KCItIik7cmV0dXJuIDI9PT1lLmxlbmd0aD9udWxsOihlLnBvcCgpLCJ4Ij09PWVbZS5sZW5ndGgtMV0udG9Mb3dlckNhc2UoKT9udWxsOnRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKGUuam9pbigiLSIpKSl9fSx7a2V5OiJnZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHQuaW5kZXhPZigiLSIpPDApcmV0dXJuIHQ7dmFyIGU9dC5zcGxpdCgiLSIpO3JldHVybiB0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlWzBdKX19LHtrZXk6ImZvcm1hdExhbmd1YWdlQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0JiZ0LmluZGV4T2YoIi0iKT4tMSl7dmFyIGU9WyJoYW5zIiwiaGFudCIsImxhdG4iLCJjeXJsIiwiY2FucyIsIm1vbmciLCJhcmFiIl0sbj10LnNwbGl0KCItIik7cmV0dXJuIHRoaXMub3B0aW9ucy5sb3dlckNhc2VMbmc/bj1uLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC50b0xvd2VyQ2FzZSgpfSk6Mj09PW4ubGVuZ3RoPyhuWzBdPW5bMF0udG9Mb3dlckNhc2UoKSxuWzFdPW5bMV0udG9VcHBlckNhc2UoKSxlLmluZGV4T2YoblsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKG5bMV09UXQoblsxXS50b0xvd2VyQ2FzZSgpKSkpOjM9PT1uLmxlbmd0aCYmKG5bMF09blswXS50b0xvd2VyQ2FzZSgpLDI9PT1uWzFdLmxlbmd0aCYmKG5bMV09blsxXS50b1VwcGVyQ2FzZSgpKSwic2duIiE9PW5bMF0mJjI9PT1uWzJdLmxlbmd0aCYmKG5bMl09blsyXS50b1VwcGVyQ2FzZSgpKSxlLmluZGV4T2YoblsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKG5bMV09UXQoblsxXS50b0xvd2VyQ2FzZSgpKSksZS5pbmRleE9mKG5bMl0udG9Mb3dlckNhc2UoKSk+LTEmJihuWzJdPVF0KG5bMl0udG9Mb3dlckNhc2UoKSkpKSxuLmpvaW4oIi0iKX1yZXR1cm4gdGhpcy5vcHRpb25zLmNsZWFuQ29kZXx8dGhpcy5vcHRpb25zLmxvd2VyQ2FzZUxuZz90LnRvTG93ZXJDYXNlKCk6dH19LHtrZXk6ImlzV2hpdGVsaXN0ZWQiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxvZ2dlci5kZXByZWNhdGUoImxhbmd1YWdlVXRpbHMuaXNXaGl0ZWxpc3RlZCIsJ2Z1bmN0aW9uICJpc1doaXRlbGlzdGVkIiB3aWxsIGJlIHJlbmFtZWQgdG8gImlzU3VwcG9ydGVkQ29kZSIgaW4gdGhlIG5leHQgbWFqb3IgLSBwbGVhc2UgbWFrZSBzdXJlIHRvIHJlbmFtZSBpdFwncyB1c2FnZSBhc2FwLicpLHRoaXMuaXNTdXBwb3J0ZWRDb2RlKHQpfX0se2tleToiaXNTdXBwb3J0ZWRDb2RlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4oImxhbmd1YWdlT25seSI9PT10aGlzLm9wdGlvbnMubG9hZHx8dGhpcy5vcHRpb25zLm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncykmJih0PXRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCkpLCF0aGlzLnN1cHBvcnRlZExuZ3N8fCF0aGlzLnN1cHBvcnRlZExuZ3MubGVuZ3RofHx0aGlzLnN1cHBvcnRlZExuZ3MuaW5kZXhPZih0KT4tMX19LHtrZXk6ImdldEJlc3RNYXRjaEZyb21Db2RlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzO3JldHVybiB0Pyh0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoIWUpe3ZhciByPW4uZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpO24ub3B0aW9ucy5zdXBwb3J0ZWRMbmdzJiYhbi5pc1N1cHBvcnRlZENvZGUocil8fChlPXIpfX0pLCFlJiZ0aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5ncyYmdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCFlKXt2YXIgcj1uLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpO2lmKG4uaXNTdXBwb3J0ZWRDb2RlKHIpKXJldHVybiBlPXI7ZT1uLm9wdGlvbnMuc3VwcG9ydGVkTG5ncy5maW5kKGZ1bmN0aW9uKHQpe2lmKDA9PT10LmluZGV4T2YocikpcmV0dXJuIHR9KX19KSxlfHwoZT10aGlzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKVswXSksZSk6bnVsbH19LHtrZXk6ImdldEZhbGxiYWNrQ29kZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYoIXQpcmV0dXJuW107aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXQoZSkpLCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSwiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseSh0KSlyZXR1cm4gdDtpZighZSlyZXR1cm4gdC5kZWZhdWx0fHxbXTt2YXIgbj10W2VdO3JldHVybiBufHwobj10W3RoaXMuZ2V0U2NyaXB0UGFydEZyb21Db2RlKGUpXSksbnx8KG49dFt0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlKV0pLG58fChuPXRbdGhpcy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShlKV0pLG58fChuPXQuZGVmYXVsdCksbnx8W119fSx7a2V5OiJ0b1Jlc29sdmVIaWVyYXJjaHkiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPXRoaXMuZ2V0RmFsbGJhY2tDb2RlcyhlfHx0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmd8fFtdLHQpLG89W10saT1mdW5jdGlvbih0KXt0JiYobi5pc1N1cHBvcnRlZENvZGUodCk/by5wdXNoKHQpOm4ubG9nZ2VyLndhcm4oInJlamVjdGluZyBsYW5ndWFnZSBjb2RlIG5vdCBmb3VuZCBpbiBzdXBwb3J0ZWRMbmdzOiAiLmNvbmNhdCh0KSkpfTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJnQuaW5kZXhPZigiLSIpPi0xPygibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiZpKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSwibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiYiY3VycmVudE9ubHkiIT09dGhpcy5vcHRpb25zLmxvYWQmJmkodGhpcy5nZXRTY3JpcHRQYXJ0RnJvbUNvZGUodCkpLCJjdXJyZW50T25seSIhPT10aGlzLm9wdGlvbnMubG9hZCYmaSh0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKSk6InN0cmluZyI9PXR5cGVvZiB0JiZpKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSxyLmZvckVhY2goZnVuY3Rpb24odCl7by5pbmRleE9mKHQpPDAmJmkobi5mb3JtYXRMYW5ndWFnZUNvZGUodCkpfSksb319XSksdH0oKSx0ZT1be2xuZ3M6WyJhY2giLCJhayIsImFtIiwiYXJuIiwiYnIiLCJmaWwiLCJndW4iLCJsbiIsIm1mZSIsIm1nIiwibWkiLCJvYyIsInB0IiwicHQtQlIiLCJ0ZyIsInRpIiwidHIiLCJ1eiIsIndhIl0sbnI6WzEsMl0sZmM6MX0se2xuZ3M6WyJhZiIsImFuIiwiYXN0IiwiYXoiLCJiZyIsImJuIiwiY2EiLCJkYSIsImRlIiwiZGV2IiwiZWwiLCJlbiIsImVvIiwiZXMiLCJldCIsImV1IiwiZmkiLCJmbyIsImZ1ciIsImZ5IiwiZ2wiLCJndSIsImhhIiwiaGkiLCJodSIsImh5IiwiaWEiLCJpdCIsImtuIiwia3UiLCJsYiIsIm1haSIsIm1sIiwibW4iLCJtciIsIm5haCIsIm5hcCIsIm5iIiwibmUiLCJubCIsIm5uIiwibm8iLCJuc28iLCJwYSIsInBhcCIsInBtcyIsInBzIiwicHQtUFQiLCJybSIsInNjbyIsInNlIiwic2kiLCJzbyIsInNvbiIsInNxIiwic3YiLCJzdyIsInRhIiwidGUiLCJ0ayIsInVyIiwieW8iXSxucjpbMSwyXSxmYzoyfSx7bG5nczpbImF5IiwiYm8iLCJjZ2ciLCJmYSIsImh0IiwiaWQiLCJqYSIsImpibyIsImthIiwia2siLCJrbSIsImtvIiwia3kiLCJsbyIsIm1zIiwic2FoIiwic3UiLCJ0aCIsInR0IiwidWciLCJ2aSIsIndvIiwiemgiXSxucjpbMV0sZmM6M30se2xuZ3M6WyJiZSIsImJzIiwiY25yIiwiZHoiLCJociIsInJ1Iiwic3IiLCJ1ayJdLG5yOlsxLDIsNV0sZmM6NH0se2xuZ3M6WyJhciJdLG5yOlswLDEsMiwzLDExLDEwMF0sZmM6NX0se2xuZ3M6WyJjcyIsInNrIl0sbnI6WzEsMiw1XSxmYzo2fSx7bG5nczpbImNzYiIsInBsIl0sbnI6WzEsMiw1XSxmYzo3fSx7bG5nczpbImN5Il0sbnI6WzEsMiwzLDhdLGZjOjh9LHtsbmdzOlsiZnIiXSxucjpbMSwyXSxmYzo5fSx7bG5nczpbImdhIl0sbnI6WzEsMiwzLDcsMTFdLGZjOjEwfSx7bG5nczpbImdkIl0sbnI6WzEsMiwzLDIwXSxmYzoxMX0se2xuZ3M6WyJpcyJdLG5yOlsxLDJdLGZjOjEyfSx7bG5nczpbImp2Il0sbnI6WzAsMV0sZmM6MTN9LHtsbmdzOlsia3ciXSxucjpbMSwyLDMsNF0sZmM6MTR9LHtsbmdzOlsibHQiXSxucjpbMSwyLDEwXSxmYzoxNX0se2xuZ3M6WyJsdiJdLG5yOlsxLDIsMF0sZmM6MTZ9LHtsbmdzOlsibWsiXSxucjpbMSwyXSxmYzoxN30se2xuZ3M6WyJtbmsiXSxucjpbMCwxLDJdLGZjOjE4fSx7bG5nczpbIm10Il0sbnI6WzEsMiwxMSwyMF0sZmM6MTl9LHtsbmdzOlsib3IiXSxucjpbMiwxXSxmYzoyfSx7bG5nczpbInJvIl0sbnI6WzEsMiwyMF0sZmM6MjB9LHtsbmdzOlsic2wiXSxucjpbNSwxLDIsM10sZmM6MjF9LHtsbmdzOlsiaGUiLCJpdyJdLG5yOlsxLDIsMjAsMjFdLGZjOjIyfV0sZWU9ezE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PjEpfSwyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMSE9dCl9LDM6ZnVuY3Rpb24odCl7cmV0dXJuIDB9LDQ6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwPT0xJiZ0JTEwMCE9MTE/MDp0JTEwPj0yJiZ0JTEwPD00JiYodCUxMDA8MTB8fHQlMTAwPj0yMCk/MToyKX0sNTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDA9PXQ/MDoxPT10PzE6Mj09dD8yOnQlMTAwPj0zJiZ0JTEwMDw9MTA/Mzp0JTEwMD49MTE/NDo1KX0sNjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDp0Pj0yJiZ0PD00PzE6Mil9LDc6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6dCUxMD49MiYmdCUxMDw9NCYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDg6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOjghPXQmJjExIT10PzI6Myl9LDk6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0Pj0yKX0sMTA6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOnQ8Nz8yOnQ8MTE/Mzo0KX0sMTE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10fHwxMT09dD8wOjI9PXR8fDEyPT10PzE6dD4yJiZ0PDIwPzI6Myl9LDEyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMCE9MXx8dCUxMDA9PTExKX0sMTM6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigwIT09dCl9LDE0OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjI9PXQ/MTozPT10PzI6Myl9LDE1OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6dCUxMD49MiYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDE2OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6MCE9PXQ/MToyKX0sMTc6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10fHx0JTEwPT0xJiZ0JTEwMCE9MTE/MDoxKX0sMTg6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigwPT10PzA6MT09dD8xOjIpfSwxOTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDowPT10fHx0JTEwMD4xJiZ0JTEwMDwxMT8xOnQlMTAwPjEwJiZ0JTEwMDwyMD8yOjMpfSwyMDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDowPT10fHx0JTEwMD4wJiZ0JTEwMDwyMD8xOjIpfSwyMTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTAwPT0xPzE6dCUxMDA9PTI/Mjp0JTEwMD09M3x8dCUxMDA9PTQ/MzowKX0sMjI6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOih0PDB8fHQ+MTApJiZ0JTEwPT0wPzI6Myl9fTt2YXIgbmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O1R0KHRoaXMsdCksdGhpcy5sYW5ndWFnZVV0aWxzPWUsdGhpcy5vcHRpb25zPXIsdGhpcy5sb2dnZXI9X3QuY3JlYXRlKCJwbHVyYWxSZXNvbHZlciIpLHRoaXMucnVsZXM9KG49e30sdGUuZm9yRWFjaChmdW5jdGlvbih0KXt0LmxuZ3MuZm9yRWFjaChmdW5jdGlvbihlKXtuW2VdPXtudW1iZXJzOnQubnIscGx1cmFsczplZVt0LmZjXX19KX0pLG4pfXJldHVybiBBdCh0LFt7a2V5OiJhZGRSdWxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMucnVsZXNbdF09ZX19LHtrZXk6ImdldFJ1bGUiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJ1bGVzW3RdfHx0aGlzLnJ1bGVzW3RoaXMubGFuZ3VhZ2VVdGlscy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KV19fSx7a2V5OiJuZWVkc1BsdXJhbCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRSdWxlKHQpO3JldHVybiBlJiZlLm51bWJlcnMubGVuZ3RoPjF9fSx7a2V5OiJnZXRQbHVyYWxGb3Jtc09mS2V5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1bXSxvPXRoaXMuZ2V0UnVsZSh0KTtyZXR1cm4gbz8oby5udW1iZXJzLmZvckVhY2goZnVuY3Rpb24obyl7dmFyIGk9bi5nZXRTdWZmaXgodCxvKTtyLnB1c2goIiIuY29uY2F0KGUpLmNvbmNhdChpKSl9KSxyKTpyfX0se2tleToiZ2V0U3VmZml4Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj10aGlzLmdldFJ1bGUodCk7aWYocil7dmFyIG89ci5ub0Ficz9yLnBsdXJhbHMoZSk6ci5wbHVyYWxzKE1hdGguYWJzKGUpKSxpPXIubnVtYmVyc1tvXTt0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXgmJjI9PT1yLm51bWJlcnMubGVuZ3RoJiYxPT09ci5udW1iZXJzWzBdJiYoMj09PWk/aT0icGx1cmFsIjoxPT09aSYmKGk9IiIpKTt2YXIgYT1mdW5jdGlvbigpe3JldHVybiBuLm9wdGlvbnMucHJlcGVuZCYmaS50b1N0cmluZygpP24ub3B0aW9ucy5wcmVwZW5kK2kudG9TdHJpbmcoKTppLnRvU3RyaW5nKCl9O3JldHVybiJ2MSI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04/MT09PWk/IiI6Im51bWJlciI9PXR5cGVvZiBpPyJfcGx1cmFsXyIuY29uY2F0KGkudG9TdHJpbmcoKSk6YSgpOiJ2MiI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04/YSgpOnRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCYmMj09PXIubnVtYmVycy5sZW5ndGgmJjE9PT1yLm51bWJlcnNbMF0/YSgpOnRoaXMub3B0aW9ucy5wcmVwZW5kJiZvLnRvU3RyaW5nKCk/dGhpcy5vcHRpb25zLnByZXBlbmQrby50b1N0cmluZygpOm8udG9TdHJpbmcoKX1yZXR1cm4gdGhpcy5sb2dnZXIud2Fybigibm8gcGx1cmFsIHJ1bGUgZm91bmQgZm9yOiAiLmNvbmNhdCh0KSksIiJ9fV0pLHR9KCkscmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O1R0KHRoaXMsdCksdGhpcy5sb2dnZXI9X3QuY3JlYXRlKCJpbnRlcnBvbGF0b3IiKSx0aGlzLm9wdGlvbnM9ZSx0aGlzLmZvcm1hdD1lLmludGVycG9sYXRpb24mJmUuaW50ZXJwb2xhdGlvbi5mb3JtYXR8fGZ1bmN0aW9uKHQpe3JldHVybiB0fSx0aGlzLmluaXQoZSl9cmV0dXJuIEF0KHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O3QuaW50ZXJwb2xhdGlvbnx8KHQuaW50ZXJwb2xhdGlvbj17ZXNjYXBlVmFsdWU6ITB9KTt2YXIgZT10LmludGVycG9sYXRpb247dGhpcy5lc2NhcGU9dm9pZCAwIT09ZS5lc2NhcGU/ZS5lc2NhcGU6WXQsdGhpcy5lc2NhcGVWYWx1ZT12b2lkIDA9PT1lLmVzY2FwZVZhbHVlfHxlLmVzY2FwZVZhbHVlLHRoaXMudXNlUmF3VmFsdWVUb0VzY2FwZT12b2lkIDAhPT1lLnVzZVJhd1ZhbHVlVG9Fc2NhcGUmJmUudXNlUmF3VmFsdWVUb0VzY2FwZSx0aGlzLnByZWZpeD1lLnByZWZpeD9XdChlLnByZWZpeCk6ZS5wcmVmaXhFc2NhcGVkfHwie3siLHRoaXMuc3VmZml4PWUuc3VmZml4P1d0KGUuc3VmZml4KTplLnN1ZmZpeEVzY2FwZWR8fCJ9fSIsdGhpcy5mb3JtYXRTZXBhcmF0b3I9ZS5mb3JtYXRTZXBhcmF0b3I/ZS5mb3JtYXRTZXBhcmF0b3I6ZS5mb3JtYXRTZXBhcmF0b3J8fCIsIix0aGlzLnVuZXNjYXBlUHJlZml4PWUudW5lc2NhcGVTdWZmaXg/IiI6ZS51bmVzY2FwZVByZWZpeHx8Ii0iLHRoaXMudW5lc2NhcGVTdWZmaXg9dGhpcy51bmVzY2FwZVByZWZpeD8iIjplLnVuZXNjYXBlU3VmZml4fHwiIix0aGlzLm5lc3RpbmdQcmVmaXg9ZS5uZXN0aW5nUHJlZml4P1d0KGUubmVzdGluZ1ByZWZpeCk6ZS5uZXN0aW5nUHJlZml4RXNjYXBlZHx8V3QoIiR0KCIpLHRoaXMubmVzdGluZ1N1ZmZpeD1lLm5lc3RpbmdTdWZmaXg/V3QoZS5uZXN0aW5nU3VmZml4KTplLm5lc3RpbmdTdWZmaXhFc2NhcGVkfHxXdCgiKSIpLHRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I9ZS5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcj9lLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yOmUubmVzdGluZ09wdGlvbnNTZXBhcmF0b3J8fCIsIix0aGlzLm1heFJlcGxhY2VzPWUubWF4UmVwbGFjZXM/ZS5tYXhSZXBsYWNlczoxZTMsdGhpcy5hbHdheXNGb3JtYXQ9dm9pZCAwIT09ZS5hbHdheXNGb3JtYXQmJmUuYWx3YXlzRm9ybWF0LHRoaXMucmVzZXRSZWdFeHAoKX19LHtrZXk6InJlc2V0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucyYmdGhpcy5pbml0KHRoaXMub3B0aW9ucyl9fSx7a2V5OiJyZXNldFJlZ0V4cCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0iIi5jb25jYXQodGhpcy5wcmVmaXgsIiguKz8pIikuY29uY2F0KHRoaXMuc3VmZml4KTt0aGlzLnJlZ2V4cD1uZXcgUmVnRXhwKHQsImciKTt2YXIgZT0iIi5jb25jYXQodGhpcy5wcmVmaXgpLmNvbmNhdCh0aGlzLnVuZXNjYXBlUHJlZml4LCIoLis/KSIpLmNvbmNhdCh0aGlzLnVuZXNjYXBlU3VmZml4KS5jb25jYXQodGhpcy5zdWZmaXgpO3RoaXMucmVnZXhwVW5lc2NhcGU9bmV3IFJlZ0V4cChlLCJnIik7dmFyIG49IiIuY29uY2F0KHRoaXMubmVzdGluZ1ByZWZpeCwiKC4rPykiKS5jb25jYXQodGhpcy5uZXN0aW5nU3VmZml4KTt0aGlzLm5lc3RpbmdSZWdleHA9bmV3IFJlZ0V4cChuLCJnIil9fSx7a2V5OiJpbnRlcnBvbGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIG8saSxhLHM9dGhpcyx1PXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24mJnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXN8fHt9O2Z1bmN0aW9uIGModCl7cmV0dXJuIHQucmVwbGFjZSgvXCQvZywiJCQkJCIpfXZhciBsPWZ1bmN0aW9uKHQpe2lmKHQuaW5kZXhPZihzLmZvcm1hdFNlcGFyYXRvcik8MCl7dmFyIG89SHQoZSx1LHQpO3JldHVybiBzLmFsd2F5c0Zvcm1hdD9zLmZvcm1hdChvLHZvaWQgMCxuKTpvfXZhciBpPXQuc3BsaXQocy5mb3JtYXRTZXBhcmF0b3IpLGE9aS5zaGlmdCgpLnRyaW0oKSxjPWkuam9pbihzLmZvcm1hdFNlcGFyYXRvcikudHJpbSgpO3JldHVybiBzLmZvcm1hdChIdChlLHUsYSksYyxuLHIpfTt0aGlzLnJlc2V0UmVnRXhwKCk7dmFyIGY9ciYmci5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXJ8fHRoaXMub3B0aW9ucy5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXIscD1yJiZyLmludGVycG9sYXRpb24mJnIuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXN8fHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcztyZXR1cm5be3JlZ2V4OnRoaXMucmVnZXhwVW5lc2NhcGUsc2FmZVZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBjKHQpfX0se3JlZ2V4OnRoaXMucmVnZXhwLHNhZmVWYWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gcy5lc2NhcGVWYWx1ZT9jKHMuZXNjYXBlKHQpKTpjKHQpfX1dLmZvckVhY2goZnVuY3Rpb24oZSl7Zm9yKGE9MDtvPWUucmVnZXguZXhlYyh0KTspe2lmKHZvaWQgMD09PShpPWwob1sxXS50cmltKCkpKSlpZigiZnVuY3Rpb24iPT10eXBlb2YgZil7dmFyIG49Zih0LG8scik7aT0ic3RyaW5nIj09dHlwZW9mIG4/bjoiIn1lbHNle2lmKHApe2k9b1swXTtjb250aW51ZX1zLmxvZ2dlci53YXJuKCJtaXNzZWQgdG8gcGFzcyBpbiB2YXJpYWJsZSAiLmNvbmNhdChvWzFdLCIgZm9yIGludGVycG9sYXRpbmcgIikuY29uY2F0KHQpKSxpPSIifWVsc2Uic3RyaW5nIj09dHlwZW9mIGl8fHMudXNlUmF3VmFsdWVUb0VzY2FwZXx8KGk9VXQoaSkpO2lmKHQ9dC5yZXBsYWNlKG9bMF0sZS5zYWZlVmFsdWUoaSkpLGUucmVnZXgubGFzdEluZGV4PTAsKythPj1zLm1heFJlcGxhY2VzKWJyZWFrfX0pLHR9fSx7a2V5OiJuZXN0Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbz10aGlzLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGE9anQoe30saSk7ZnVuY3Rpb24gcyh0LGUpe3ZhciBuPXRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I7aWYodC5pbmRleE9mKG4pPDApcmV0dXJuIHQ7dmFyIHI9dC5zcGxpdChuZXcgUmVnRXhwKCIiLmNvbmNhdChuLCJbIF0qeyIpKSksbz0ieyIuY29uY2F0KHJbMV0pO3Q9clswXSxvPShvPXRoaXMuaW50ZXJwb2xhdGUobyxhKSkucmVwbGFjZSgvJy9nLCciJyk7dHJ5e2E9SlNPTi5wYXJzZShvKSxlJiYoYT1qdCh7fSxlLGEpKX1jYXRjaChlKXtyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiZmFpbGVkIHBhcnNpbmcgb3B0aW9ucyBzdHJpbmcgaW4gbmVzdGluZyBmb3Iga2V5ICIuY29uY2F0KHQpLGUpLCIiLmNvbmNhdCh0KS5jb25jYXQobikuY29uY2F0KG8pfXJldHVybiBkZWxldGUgYS5kZWZhdWx0VmFsdWUsdH1mb3IoYS5hcHBseVBvc3RQcm9jZXNzb3I9ITEsZGVsZXRlIGEuZGVmYXVsdFZhbHVlO249dGhpcy5uZXN0aW5nUmVnZXhwLmV4ZWModCk7KXt2YXIgdT1bXSxjPSExO2lmKG5bMF0uaW5jbHVkZXModGhpcy5mb3JtYXRTZXBhcmF0b3IpJiYhL3suKn0vLnRlc3QoblsxXSkpe3ZhciBsPW5bMV0uc3BsaXQodGhpcy5mb3JtYXRTZXBhcmF0b3IpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCl9KTtuWzFdPWwuc2hpZnQoKSx1PWwsYz0hMH1pZigocj1lKHMuY2FsbCh0aGlzLG5bMV0udHJpbSgpLGEpLGEpKSYmblswXT09PXQmJiJzdHJpbmciIT10eXBlb2YgcilyZXR1cm4gcjsic3RyaW5nIiE9dHlwZW9mIHImJihyPVV0KHIpKSxyfHwodGhpcy5sb2dnZXIud2FybigibWlzc2VkIHRvIHJlc29sdmUgIi5jb25jYXQoblsxXSwiIGZvciBuZXN0aW5nICIpLmNvbmNhdCh0KSkscj0iIiksYyYmKHI9dS5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gby5mb3JtYXQodCxlLGkubG5nLGkpfSxyLnRyaW0oKSkpLHQ9dC5yZXBsYWNlKG5bMF0sciksdGhpcy5yZWdleHAubGFzdEluZGV4PTB9cmV0dXJuIHR9fV0pLHR9KCk7dmFyIG9lPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxuLHIpe3ZhciBvLGk9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9O3JldHVybiBUdCh0aGlzLGUpLG89THQodGhpcyxSdChlKS5jYWxsKHRoaXMpKSxWdCYmRHQuY2FsbChDdChvKSksby5iYWNrZW5kPXQsby5zdG9yZT1uLG8uc2VydmljZXM9cixvLmxhbmd1YWdlVXRpbHM9ci5sYW5ndWFnZVV0aWxzLG8ub3B0aW9ucz1pLG8ubG9nZ2VyPV90LmNyZWF0ZSgiYmFja2VuZENvbm5lY3RvciIpLG8uc3RhdGU9e30sby5xdWV1ZT1bXSxvLmJhY2tlbmQmJm8uYmFja2VuZC5pbml0JiZvLmJhY2tlbmQuaW5pdChyLGkuYmFja2VuZCxpKSxvfXJldHVybiBOdChlLER0KSxBdChlLFt7a2V5OiJxdWV1ZUxvYWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPXRoaXMsaT1bXSxhPVtdLHM9W10sdT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciByPSEwO2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgcz0iIi5jb25jYXQodCwifCIpLmNvbmNhdChlKTshbi5yZWxvYWQmJm8uc3RvcmUuaGFzUmVzb3VyY2VCdW5kbGUodCxlKT9vLnN0YXRlW3NdPTI6by5zdGF0ZVtzXTwwfHwoMT09PW8uc3RhdGVbc10/YS5pbmRleE9mKHMpPDAmJmEucHVzaChzKTooby5zdGF0ZVtzXT0xLHI9ITEsYS5pbmRleE9mKHMpPDAmJmEucHVzaChzKSxpLmluZGV4T2Yocyk8MCYmaS5wdXNoKHMpLHUuaW5kZXhPZihlKTwwJiZ1LnB1c2goZSkpKX0pLHJ8fHMucHVzaCh0KX0pLChpLmxlbmd0aHx8YS5sZW5ndGgpJiZ0aGlzLnF1ZXVlLnB1c2goe3BlbmRpbmc6YSxsb2FkZWQ6e30sZXJyb3JzOltdLGNhbGxiYWNrOnJ9KSx7dG9Mb2FkOmkscGVuZGluZzphLHRvTG9hZExhbmd1YWdlczpzLHRvTG9hZE5hbWVzcGFjZXM6dX19fSx7a2V5OiJsb2FkZWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LnNwbGl0KCJ8Iiksbz1yWzBdLGk9clsxXTtlJiZ0aGlzLmVtaXQoImZhaWxlZExvYWRpbmciLG8saSxlKSxuJiZ0aGlzLnN0b3JlLmFkZFJlc291cmNlQnVuZGxlKG8saSxuKSx0aGlzLnN0YXRlW3RdPWU/LTE6Mjt2YXIgYT17fTt0aGlzLnF1ZXVlLmZvckVhY2goZnVuY3Rpb24obil7IWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPUJ0KHQsZSxPYmplY3QpLGk9by5vYmosYT1vLms7aVthXT1pW2FdfHxbXSxyJiYoaVthXT1pW2FdLmNvbmNhdChuKSkscnx8aVthXS5wdXNoKG4pfShuLmxvYWRlZCxbb10saSksZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5pbmRleE9mKGUpOy0xIT09bjspdC5zcGxpY2UobiwxKSxuPXQuaW5kZXhPZihlKX0obi5wZW5kaW5nLHQpLGUmJm4uZXJyb3JzLnB1c2goZSksMCE9PW4ucGVuZGluZy5sZW5ndGh8fG4uZG9uZXx8KE9iamVjdC5rZXlzKG4ubG9hZGVkKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2FbdF18fChhW3RdPVtdKSxuLmxvYWRlZFt0XS5sZW5ndGgmJm4ubG9hZGVkW3RdLmZvckVhY2goZnVuY3Rpb24oZSl7YVt0XS5pbmRleE9mKGUpPDAmJmFbdF0ucHVzaChlKX0pfSksbi5kb25lPSEwLG4uZXJyb3JzLmxlbmd0aD9uLmNhbGxiYWNrKG4uZXJyb3JzKTpuLmNhbGxiYWNrKCkpfSksdGhpcy5lbWl0KCJsb2FkZWQiLGEpLHRoaXMucXVldWU9dGhpcy5xdWV1ZS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIXQuZG9uZX0pfX0se2tleToicmVhZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMsbz1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106MCxpPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTozNTAsYT1hcmd1bWVudHMubGVuZ3RoPjU/YXJndW1lbnRzWzVdOnZvaWQgMDtyZXR1cm4gdC5sZW5ndGg/dGhpcy5iYWNrZW5kW25dKHQsZSxmdW5jdGlvbihzLHUpe3MmJnUmJm88NT9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5yZWFkLmNhbGwocix0LGUsbixvKzEsMippLGEpfSxpKTphKHMsdSl9KTphKG51bGwse30pfX0se2tleToicHJlcGFyZUxvYWRpbmciLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fSxvPWFyZ3VtZW50cy5sZW5ndGg+Mz9hcmd1bWVudHNbM106dm9pZCAwO2lmKCF0aGlzLmJhY2tlbmQpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oIk5vIGJhY2tlbmQgd2FzIGFkZGVkIHZpYSBpMThuZXh0LnVzZS4gV2lsbCBub3QgbG9hZCByZXNvdXJjZXMuIiksbyYmbygpOyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeSh0KSksInN0cmluZyI9PXR5cGVvZiBlJiYoZT1bZV0pO3ZhciBpPXRoaXMucXVldWVMb2FkKHQsZSxyLG8pO2lmKCFpLnRvTG9hZC5sZW5ndGgpcmV0dXJuIGkucGVuZGluZy5sZW5ndGh8fG8oKSxudWxsO2kudG9Mb2FkLmZvckVhY2goZnVuY3Rpb24odCl7bi5sb2FkT25lKHQpfSl9fSx7a2V5OiJsb2FkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dGhpcy5wcmVwYXJlTG9hZGluZyh0LGUse30sbil9fSx7a2V5OiJyZWxvYWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt0aGlzLnByZXBhcmVMb2FkaW5nKHQsZSx7cmVsb2FkOiEwfSxuKX19LHtrZXk6ImxvYWRPbmUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06IiIscj10LnNwbGl0KCJ8Iiksbz1yWzBdLGk9clsxXTt0aGlzLnJlYWQobyxpLCJyZWFkIix2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKHIsYSl7ciYmZS5sb2dnZXIud2FybigiIi5jb25jYXQobiwibG9hZGluZyBuYW1lc3BhY2UgIikuY29uY2F0KGksIiBmb3IgbGFuZ3VhZ2UgIikuY29uY2F0KG8sIiBmYWlsZWQiKSxyKSwhciYmYSYmZS5sb2dnZXIubG9nKCIiLmNvbmNhdChuLCJsb2FkZWQgbmFtZXNwYWNlICIpLmNvbmNhdChpLCIgZm9yIGxhbmd1YWdlICIpLmNvbmNhdChvKSxhKSxlLmxvYWRlZCh0LHIsYSl9KX19LHtrZXk6InNhdmVNaXNzaW5nIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+NSYmdm9pZCAwIT09YXJndW1lbnRzWzVdP2FyZ3VtZW50c1s1XTp7fTt0aGlzLnNlcnZpY2VzLnV0aWxzJiZ0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSYmIXRoaXMuc2VydmljZXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlKGUpP3RoaXMubG9nZ2VyLndhcm4oJ2RpZCBub3Qgc2F2ZSBrZXkgIicuY29uY2F0KG4sJyIgYXMgdGhlIG5hbWVzcGFjZSAiJykuY29uY2F0KGUsJyIgd2FzIG5vdCB5ZXQgbG9hZGVkJyksIlRoaXMgbWVhbnMgc29tZXRoaW5nIElTIFdST05HIGluIHlvdXIgc2V0dXAuIFlvdSBhY2Nlc3MgdGhlIHQgZnVuY3Rpb24gYmVmb3JlIGkxOG5leHQuaW5pdCAvIGkxOG5leHQubG9hZE5hbWVzcGFjZSAvIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2Ugd2FzIGRvbmUuIFdhaXQgZm9yIHRoZSBjYWxsYmFjayBvciBQcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGFjY2Vzc2luZyBpdCEhISIpOm51bGwhPW4mJiIiIT09biYmKHRoaXMuYmFja2VuZCYmdGhpcy5iYWNrZW5kLmNyZWF0ZSYmdGhpcy5iYWNrZW5kLmNyZWF0ZSh0LGUsbixyLG51bGwsanQoe30saSx7aXNVcGRhdGU6b30pKSx0JiZ0WzBdJiZ0aGlzLnN0b3JlLmFkZFJlc291cmNlKHRbMF0sZSxuLHIpKX19XSksZX0oKTtmdW5jdGlvbiBpZSgpe3JldHVybntkZWJ1ZzohMSxpbml0SW1tZWRpYXRlOiEwLG5zOlsidHJhbnNsYXRpb24iXSxkZWZhdWx0TlM6WyJ0cmFuc2xhdGlvbiJdLGZhbGxiYWNrTG5nOlsiZGV2Il0sZmFsbGJhY2tOUzohMSx3aGl0ZWxpc3Q6ITEsbm9uRXhwbGljaXRXaGl0ZWxpc3Q6ITEsc3VwcG9ydGVkTG5nczohMSxub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M6ITEsbG9hZDoiYWxsIixwcmVsb2FkOiExLHNpbXBsaWZ5UGx1cmFsU3VmZml4OiEwLGtleVNlcGFyYXRvcjoiLiIsbnNTZXBhcmF0b3I6IjoiLHBsdXJhbFNlcGFyYXRvcjoiXyIsY29udGV4dFNlcGFyYXRvcjoiXyIscGFydGlhbEJ1bmRsZWRMYW5ndWFnZXM6ITEsc2F2ZU1pc3Npbmc6ITEsdXBkYXRlTWlzc2luZzohMSxzYXZlTWlzc2luZ1RvOiJmYWxsYmFjayIsc2F2ZU1pc3NpbmdQbHVyYWxzOiEwLG1pc3NpbmdLZXlIYW5kbGVyOiExLG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcjohMSxwb3N0UHJvY2VzczohMSxwb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZDohMSxyZXR1cm5OdWxsOiEwLHJldHVybkVtcHR5U3RyaW5nOiEwLHJldHVybk9iamVjdHM6ITEsam9pbkFycmF5czohMSxyZXR1cm5lZE9iamVjdEhhbmRsZXI6ITEscGFyc2VNaXNzaW5nS2V5SGFuZGxlcjohMSxhcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk6ITEsYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU6ITEsb3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGU9e307aWYoIm9iamVjdCI9PT1TdCh0WzFdKSYmKGU9dFsxXSksInN0cmluZyI9PXR5cGVvZiB0WzFdJiYoZS5kZWZhdWx0VmFsdWU9dFsxXSksInN0cmluZyI9PXR5cGVvZiB0WzJdJiYoZS50RGVzY3JpcHRpb249dFsyXSksIm9iamVjdCI9PT1TdCh0WzJdKXx8Im9iamVjdCI9PT1TdCh0WzNdKSl7dmFyIG49dFszXXx8dFsyXTtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09blt0XX0pfXJldHVybiBlfSxpbnRlcnBvbGF0aW9uOntlc2NhcGVWYWx1ZTohMCxmb3JtYXQ6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHR9LHByZWZpeDoie3siLHN1ZmZpeDoifX0iLGZvcm1hdFNlcGFyYXRvcjoiLCIsdW5lc2NhcGVQcmVmaXg6Ii0iLG5lc3RpbmdQcmVmaXg6IiR0KCIsbmVzdGluZ1N1ZmZpeDoiKSIsbmVzdGluZ09wdGlvbnNTZXBhcmF0b3I6IiwiLG1heFJlcGxhY2VzOjFlMyxza2lwT25WYXJpYWJsZXM6ITF9fX1mdW5jdGlvbiBhZSh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQubnMmJih0Lm5zPVt0Lm5zXSksInN0cmluZyI9PXR5cGVvZiB0LmZhbGxiYWNrTG5nJiYodC5mYWxsYmFja0xuZz1bdC5mYWxsYmFja0xuZ10pLCJzdHJpbmciPT10eXBlb2YgdC5mYWxsYmFja05TJiYodC5mYWxsYmFja05TPVt0LmZhbGxiYWNrTlNdKSx0LndoaXRlbGlzdCYmKHQud2hpdGVsaXN0JiZ0LndoaXRlbGlzdC5pbmRleE9mKCJjaW1vZGUiKTwwJiYodC53aGl0ZWxpc3Q9dC53aGl0ZWxpc3QuY29uY2F0KFsiY2ltb2RlIl0pKSx0LnN1cHBvcnRlZExuZ3M9dC53aGl0ZWxpc3QpLHQubm9uRXhwbGljaXRXaGl0ZWxpc3QmJih0Lm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncz10Lm5vbkV4cGxpY2l0V2hpdGVsaXN0KSx0LnN1cHBvcnRlZExuZ3MmJnQuc3VwcG9ydGVkTG5ncy5pbmRleE9mKCJjaW1vZGUiKTwwJiYodC5zdXBwb3J0ZWRMbmdzPXQuc3VwcG9ydGVkTG5ncy5jb25jYXQoWyJjaW1vZGUiXSkpLHR9ZnVuY3Rpb24gc2UoKXt9dmFyIHVlPW5ldyhmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIHQsbj1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30scj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtpZihUdCh0aGlzLGUpLHQ9THQodGhpcyxSdChlKS5jYWxsKHRoaXMpKSxWdCYmRHQuY2FsbChDdCh0KSksdC5vcHRpb25zPWFlKG4pLHQuc2VydmljZXM9e30sdC5sb2dnZXI9X3QsdC5tb2R1bGVzPXtleHRlcm5hbDpbXX0sciYmIXQuaXNJbml0aWFsaXplZCYmIW4uaXNDbG9uZSl7aWYoIXQub3B0aW9ucy5pbml0SW1tZWRpYXRlKXJldHVybiB0LmluaXQobixyKSxMdCh0LEN0KHQpKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5pbml0KG4scil9LDApfXJldHVybiB0fXJldHVybiBOdChlLER0KSxBdChlLFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30sbj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtmdW5jdGlvbiByKHQpe3JldHVybiB0PyJmdW5jdGlvbiI9PXR5cGVvZiB0P25ldyB0OnQ6bnVsbH1pZigiZnVuY3Rpb24iPT10eXBlb2YgZSYmKG49ZSxlPXt9KSxlLndoaXRlbGlzdCYmIWUuc3VwcG9ydGVkTG5ncyYmdGhpcy5sb2dnZXIuZGVwcmVjYXRlKCJ3aGl0ZWxpc3QiLCdvcHRpb24gIndoaXRlbGlzdCIgd2lsbCBiZSByZW5hbWVkIHRvICJzdXBwb3J0ZWRMbmdzIiBpbiB0aGUgbmV4dCBtYWpvciAtIHBsZWFzZSBtYWtlIHN1cmUgdG8gcmVuYW1lIHRoaXMgb3B0aW9uIGFzYXAuJyksZS5ub25FeHBsaWNpdFdoaXRlbGlzdCYmIWUubm9uRXhwbGljaXRTdXBwb3J0ZWRMbmdzJiZ0aGlzLmxvZ2dlci5kZXByZWNhdGUoIndoaXRlbGlzdCIsJ29wdGlvbnMgIm5vbkV4cGxpY2l0V2hpdGVsaXN0IiB3aWxsIGJlIHJlbmFtZWQgdG8gIm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncyIgaW4gdGhlIG5leHQgbWFqb3IgLSBwbGVhc2UgbWFrZSBzdXJlIHRvIHJlbmFtZSB0aGlzIG9wdGlvbiBhc2FwLicpLHRoaXMub3B0aW9ucz1qdCh7fSxpZSgpLHRoaXMub3B0aW9ucyxhZShlKSksdGhpcy5mb3JtYXQ9dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0LG58fChuPXNlKSwhdGhpcy5vcHRpb25zLmlzQ2xvbmUpe3RoaXMubW9kdWxlcy5sb2dnZXI/X3QuaW5pdChyKHRoaXMubW9kdWxlcy5sb2dnZXIpLHRoaXMub3B0aW9ucyk6X3QuaW5pdChudWxsLHRoaXMub3B0aW9ucyk7dmFyIG89bmV3IFp0KHRoaXMub3B0aW9ucyk7dGhpcy5zdG9yZT1uZXcgR3QodGhpcy5vcHRpb25zLnJlc291cmNlcyx0aGlzLm9wdGlvbnMpO3ZhciBpPXRoaXMuc2VydmljZXM7aS5sb2dnZXI9X3QsaS5yZXNvdXJjZVN0b3JlPXRoaXMuc3RvcmUsaS5sYW5ndWFnZVV0aWxzPW8saS5wbHVyYWxSZXNvbHZlcj1uZXcgbmUobyx7cHJlcGVuZDp0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yLGNvbXBhdGliaWxpdHlKU09OOnRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTixzaW1wbGlmeVBsdXJhbFN1ZmZpeDp0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXh9KSxpLmludGVycG9sYXRvcj1uZXcgcmUodGhpcy5vcHRpb25zKSxpLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6dGhpcy5oYXNMb2FkZWROYW1lc3BhY2UuYmluZCh0aGlzKX0saS5iYWNrZW5kQ29ubmVjdG9yPW5ldyBvZShyKHRoaXMubW9kdWxlcy5iYWNrZW5kKSxpLnJlc291cmNlU3RvcmUsaSx0aGlzLm9wdGlvbnMpLGkuYmFja2VuZENvbm5lY3Rvci5vbigiKiIsZnVuY3Rpb24oZSl7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkobj4xP24tMTowKSxvPTE7bzxuO28rKylyW28tMV09YXJndW1lbnRzW29dO3QuZW1pdC5hcHBseSh0LFtlXS5jb25jYXQocikpfSksdGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3ImJihpLmxhbmd1YWdlRGV0ZWN0b3I9cih0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3RvciksaS5sYW5ndWFnZURldGVjdG9yLmluaXQoaSx0aGlzLm9wdGlvbnMuZGV0ZWN0aW9uLHRoaXMub3B0aW9ucykpLHRoaXMubW9kdWxlcy5pMThuRm9ybWF0JiYoaS5pMThuRm9ybWF0PXIodGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQpLGkuaTE4bkZvcm1hdC5pbml0JiZpLmkxOG5Gb3JtYXQuaW5pdCh0aGlzKSksdGhpcy50cmFuc2xhdG9yPW5ldyBKdCh0aGlzLnNlcnZpY2VzLHRoaXMub3B0aW9ucyksdGhpcy50cmFuc2xhdG9yLm9uKCIqIixmdW5jdGlvbihlKXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjE/bi0xOjApLG89MTtvPG47bysrKXJbby0xXT1hcmd1bWVudHNbb107dC5lbWl0LmFwcGx5KHQsW2VdLmNvbmNhdChyKSl9KSx0aGlzLm1vZHVsZXMuZXh0ZXJuYWwuZm9yRWFjaChmdW5jdGlvbihlKXtlLmluaXQmJmUuaW5pdCh0KX0pfXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvcnx8dGhpcy5vcHRpb25zLmxuZ3x8dGhpcy5sb2dnZXIud2FybigiaW5pdDogbm8gbGFuZ3VhZ2VEZXRlY3RvciBpcyB1c2VkIGFuZCBubyBsbmcgaXMgZGVmaW5lZCIpO3ZhciBhPVsiZ2V0UmVzb3VyY2UiLCJoYXNSZXNvdXJjZUJ1bmRsZSIsImdldFJlc291cmNlQnVuZGxlIiwiZ2V0RGF0YUJ5TGFuZ3VhZ2UiXTthLmZvckVhY2goZnVuY3Rpb24oZSl7dFtlXT1mdW5jdGlvbigpe3ZhciBuO3JldHVybihuPXQuc3RvcmUpW2VdLmFwcGx5KG4sYXJndW1lbnRzKX19KTt2YXIgcz1bImFkZFJlc291cmNlIiwiYWRkUmVzb3VyY2VzIiwiYWRkUmVzb3VyY2VCdW5kbGUiLCJyZW1vdmVSZXNvdXJjZUJ1bmRsZSJdO3MuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPWZ1bmN0aW9uKCl7dmFyIG47cmV0dXJuKG49dC5zdG9yZSlbZV0uYXBwbHkobixhcmd1bWVudHMpLHR9fSk7dmFyIHU9TXQoKSxjPWZ1bmN0aW9uKCl7dC5jaGFuZ2VMYW5ndWFnZSh0Lm9wdGlvbnMubG5nLGZ1bmN0aW9uKGUscil7dC5pc0luaXRpYWxpemVkPSEwLHQub3B0aW9ucy5pc0Nsb25lfHx0LmxvZ2dlci5sb2coImluaXRpYWxpemVkIix0Lm9wdGlvbnMpLHQuZW1pdCgiaW5pdGlhbGl6ZWQiLHQub3B0aW9ucyksdS5yZXNvbHZlKHIpLG4oZSxyKX0pfTtyZXR1cm4gdGhpcy5vcHRpb25zLnJlc291cmNlc3x8IXRoaXMub3B0aW9ucy5pbml0SW1tZWRpYXRlP2MoKTpzZXRUaW1lb3V0KGMsMCksdX19LHtrZXk6ImxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06c2Uscj1uLG89InN0cmluZyI9PXR5cGVvZiB0P3Q6dGhpcy5sYW5ndWFnZTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHI9dCksIXRoaXMub3B0aW9ucy5yZXNvdXJjZXN8fHRoaXMub3B0aW9ucy5wYXJ0aWFsQnVuZGxlZExhbmd1YWdlcyl7aWYobyYmImNpbW9kZSI9PT1vLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHIoKTt2YXIgaT1bXSxhPWZ1bmN0aW9uKHQpe3QmJmUuc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkodCkuZm9yRWFjaChmdW5jdGlvbih0KXtpLmluZGV4T2YodCk8MCYmaS5wdXNoKHQpfSl9O2lmKG8pYShvKTtlbHNle3ZhciBzPXRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyk7cy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBhKHQpfSl9dGhpcy5vcHRpb25zLnByZWxvYWQmJnRoaXMub3B0aW9ucy5wcmVsb2FkLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGEodCl9KSx0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IubG9hZChpLHRoaXMub3B0aW9ucy5ucyxyKX1lbHNlIHIobnVsbCl9fSx7a2V5OiJyZWxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1NdCgpO3JldHVybiB0fHwodD10aGlzLmxhbmd1YWdlcyksZXx8KGU9dGhpcy5vcHRpb25zLm5zKSxufHwobj1zZSksdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnJlbG9hZCh0LGUsZnVuY3Rpb24odCl7ci5yZXNvbHZlKCksbih0KX0pLHJ9fSx7a2V5OiJ1c2UiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCF0KXRocm93IG5ldyBFcnJvcigiWW91IGFyZSBwYXNzaW5nIGFuIHVuZGVmaW5lZCBtb2R1bGUhIFBsZWFzZSBjaGVjayB0aGUgb2JqZWN0IHlvdSBhcmUgcGFzc2luZyB0byBpMThuZXh0LnVzZSgpIik7aWYoIXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoIllvdSBhcmUgcGFzc2luZyBhIHdyb25nIG1vZHVsZSEgUGxlYXNlIGNoZWNrIHRoZSBvYmplY3QgeW91IGFyZSBwYXNzaW5nIHRvIGkxOG5leHQudXNlKCkiKTtyZXR1cm4iYmFja2VuZCI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMuYmFja2VuZD10KSwoImxvZ2dlciI9PT10LnR5cGV8fHQubG9nJiZ0Lndhcm4mJnQuZXJyb3IpJiYodGhpcy5tb2R1bGVzLmxvZ2dlcj10KSwibGFuZ3VhZ2VEZXRlY3RvciI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3Rvcj10KSwiaTE4bkZvcm1hdCI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdD10KSwicG9zdFByb2Nlc3NvciI9PT10LnR5cGUmJkt0LmFkZFBvc3RQcm9jZXNzb3IodCksIjNyZFBhcnR5Ij09PXQudHlwZSYmdGhpcy5tb2R1bGVzLmV4dGVybmFsLnB1c2godCksdGhpc319LHtrZXk6ImNoYW5nZUxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7dGhpcy5pc0xhbmd1YWdlQ2hhbmdpbmdUbz10O3ZhciByPU10KCk7dGhpcy5lbWl0KCJsYW5ndWFnZUNoYW5naW5nIix0KTt2YXIgbz1mdW5jdGlvbih0KXt2YXIgbz0ic3RyaW5nIj09dHlwZW9mIHQ/dDpuLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0QmVzdE1hdGNoRnJvbUNvZGVzKHQpO28mJihuLmxhbmd1YWdlfHwobi5sYW5ndWFnZT1vLG4ubGFuZ3VhZ2VzPW4uc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkobykpLG4udHJhbnNsYXRvci5sYW5ndWFnZXx8bi50cmFuc2xhdG9yLmNoYW5nZUxhbmd1YWdlKG8pLG4uc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmbi5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmNhY2hlVXNlckxhbmd1YWdlKG8pKSxuLmxvYWRSZXNvdXJjZXMobyxmdW5jdGlvbih0KXshZnVuY3Rpb24odCxvKXtvPyhuLmxhbmd1YWdlPW8sbi5sYW5ndWFnZXM9bi5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShvKSxuLnRyYW5zbGF0b3IuY2hhbmdlTGFuZ3VhZ2Uobyksbi5pc0xhbmd1YWdlQ2hhbmdpbmdUbz12b2lkIDAsbi5lbWl0KCJsYW5ndWFnZUNoYW5nZWQiLG8pLG4ubG9nZ2VyLmxvZygibGFuZ3VhZ2VDaGFuZ2VkIixvKSk6bi5pc0xhbmd1YWdlQ2hhbmdpbmdUbz12b2lkIDAsci5yZXNvbHZlKGZ1bmN0aW9uKCl7cmV0dXJuIG4udC5hcHBseShuLGFyZ3VtZW50cyl9KSxlJiZlKHQsZnVuY3Rpb24oKXtyZXR1cm4gbi50LmFwcGx5KG4sYXJndW1lbnRzKX0pfSh0LG8pfSl9O3JldHVybiB0fHwhdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yfHx0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuYXN5bmM/IXQmJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jP3RoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3Qobyk6byh0KTpvKHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3QoKSkscn19LHtrZXk6ImdldEZpeGVkVCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9ZnVuY3Rpb24gdChlLHIpe3ZhciBvO2lmKCJvYmplY3QiIT09U3Qocikpe2Zvcih2YXIgaT1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KGk+Mj9pLTI6MCkscz0yO3M8aTtzKyspYVtzLTJdPWFyZ3VtZW50c1tzXTtvPW4ub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihbZSxyXS5jb25jYXQoYSkpfWVsc2Ugbz1qdCh7fSxyKTtyZXR1cm4gby5sbmc9by5sbmd8fHQubG5nLG8ubG5ncz1vLmxuZ3N8fHQubG5ncyxvLm5zPW8ubnN8fHQubnMsbi50KGUsbyl9O3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9yLmxuZz10OnIubG5ncz10LHIubnM9ZSxyfX0se2tleToidCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdGhpcy50cmFuc2xhdG9yJiYodD10aGlzLnRyYW5zbGF0b3IpLnRyYW5zbGF0ZS5hcHBseSh0LGFyZ3VtZW50cyl9fSx7a2V5OiJleGlzdHMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHRoaXMudHJhbnNsYXRvciYmKHQ9dGhpcy50cmFuc2xhdG9yKS5leGlzdHMuYXBwbHkodCxhcmd1bWVudHMpfX0se2tleToic2V0RGVmYXVsdE5hbWVzcGFjZSIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLmRlZmF1bHROUz10fX0se2tleToiaGFzTG9hZGVkTmFtZXNwYWNlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCF0aGlzLmlzSW5pdGlhbGl6ZWQpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImhhc0xvYWRlZE5hbWVzcGFjZTogaTE4bmV4dCB3YXMgbm90IGluaXRpYWxpemVkIix0aGlzLmxhbmd1YWdlcyksITE7aWYoIXRoaXMubGFuZ3VhZ2VzfHwhdGhpcy5sYW5ndWFnZXMubGVuZ3RoKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJoYXNMb2FkZWROYW1lc3BhY2U6IGkxOG4ubGFuZ3VhZ2VzIHdlcmUgdW5kZWZpbmVkIG9yIGVtcHR5Iix0aGlzLmxhbmd1YWdlcyksITE7dmFyIHI9dGhpcy5sYW5ndWFnZXNbMF0sbz0hIXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nLGk9dGhpcy5sYW5ndWFnZXNbdGhpcy5sYW5ndWFnZXMubGVuZ3RoLTFdO2lmKCJjaW1vZGUiPT09ci50b0xvd2VyQ2FzZSgpKXJldHVybiEwO3ZhciBhPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnN0YXRlWyIiLmNvbmNhdCh0LCJ8IikuY29uY2F0KG4pXTtyZXR1cm4tMT09PXJ8fDI9PT1yfTtpZihuLnByZWNoZWNrKXt2YXIgcz1uLnByZWNoZWNrKHRoaXMsYSk7aWYodm9pZCAwIT09cylyZXR1cm4gc31yZXR1cm4hIXRoaXMuaGFzUmVzb3VyY2VCdW5kbGUocix0KXx8KCF0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IuYmFja2VuZHx8ISghYShyLHQpfHxvJiYhYShpLHQpKSl9fSx7a2V5OiJsb2FkTmFtZXNwYWNlcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9TXQoKTtyZXR1cm4gdGhpcy5vcHRpb25zLm5zPygic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe24ub3B0aW9ucy5ucy5pbmRleE9mKHQpPDAmJm4ub3B0aW9ucy5ucy5wdXNoKHQpfSksdGhpcy5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uKHQpe3IucmVzb2x2ZSgpLGUmJmUodCl9KSxyKTooZSYmZSgpLFByb21pc2UucmVzb2x2ZSgpKX19LHtrZXk6ImxvYWRMYW5ndWFnZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49TXQoKTsic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSk7dmFyIHI9dGhpcy5vcHRpb25zLnByZWxvYWR8fFtdLG89dC5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHIuaW5kZXhPZih0KTwwfSk7cmV0dXJuIG8ubGVuZ3RoPyh0aGlzLm9wdGlvbnMucHJlbG9hZD1yLmNvbmNhdChvKSx0aGlzLmxvYWRSZXNvdXJjZXMoZnVuY3Rpb24odCl7bi5yZXNvbHZlKCksZSYmZSh0KX0pLG4pOihlJiZlKCksUHJvbWlzZS5yZXNvbHZlKCkpfX0se2tleToiZGlyIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0fHwodD10aGlzLmxhbmd1YWdlcyYmdGhpcy5sYW5ndWFnZXMubGVuZ3RoPjA/dGhpcy5sYW5ndWFnZXNbMF06dGhpcy5sYW5ndWFnZSksIXQpcmV0dXJuInJ0bCI7cmV0dXJuWyJhciIsInNodSIsInNxciIsInNzaCIsInhhYSIsInloZCIsInl1ZCIsImFhbyIsImFiaCIsImFidiIsImFjbSIsImFjcSIsImFjdyIsImFjeCIsImFjeSIsImFkZiIsImFkcyIsImFlYiIsImFlYyIsImFmYiIsImFqcCIsImFwYyIsImFwZCIsImFyYiIsImFycSIsImFycyIsImFyeSIsImFyeiIsImF1eiIsImF2bCIsImF5aCIsImF5bCIsImF5biIsImF5cCIsImJieiIsInBnYSIsImhlIiwiaXciLCJwcyIsInBidCIsInBidSIsInBzdCIsInBycCIsInByZCIsInVnIiwidXIiLCJ5ZGQiLCJ5ZHMiLCJ5aWgiLCJqaSIsInlpIiwiaGJvIiwibWVuIiwieG1uIiwiZmEiLCJqcHIiLCJwZW8iLCJwZXMiLCJwcnMiLCJkdiIsInNhbSJdLmluZGV4T2YodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKT49MD8icnRsIjoibHRyIn19LHtrZXk6ImNyZWF0ZUluc3RhbmNlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxuPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwO3JldHVybiBuZXcgZSh0LG4pfX0se2tleToiY2xvbmVJbnN0YW5jZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnNlLG89anQoe30sdGhpcy5vcHRpb25zLG4se2lzQ2xvbmU6ITB9KSxpPW5ldyBlKG8pLGE9WyJzdG9yZSIsInNlcnZpY2VzIiwibGFuZ3VhZ2UiXTtyZXR1cm4gYS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lbZV09dFtlXX0pLGkuc2VydmljZXM9anQoe30sdGhpcy5zZXJ2aWNlcyksaS5zZXJ2aWNlcy51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOmkuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQoaSl9LGkudHJhbnNsYXRvcj1uZXcgSnQoaS5zZXJ2aWNlcyxpLm9wdGlvbnMpLGkudHJhbnNsYXRvci5vbigiKiIsZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkoZT4xP2UtMTowKSxyPTE7cjxlO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO2kuZW1pdC5hcHBseShpLFt0XS5jb25jYXQobikpfSksaS5pbml0KG8sciksaS50cmFuc2xhdG9yLm9wdGlvbnM9aS5vcHRpb25zLGkudHJhbnNsYXRvci5iYWNrZW5kQ29ubmVjdG9yLnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6aS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZChpKX0saX19XSksZX0oKSksY2U9bigxMzMpLGxlPW4ubihjZSk7ZnVuY3Rpb24gZmUodCxlLG4pe3JldHVybiBlIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09bix0fWZ1bmN0aW9uIHBlKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e30scj1PYmplY3Qua2V5cyhuKTsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmKHI9ci5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhuKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KS5lbnVtZXJhYmxlfSkpKSxyLmZvckVhY2goZnVuY3Rpb24oZSl7ZmUodCxlLG5bZV0pfSl9cmV0dXJuIHR9ZnVuY3Rpb24gaGUodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1mdW5jdGlvbiBkZSh0LGUsbil7dmFyIHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcyxpPWFyZ3VtZW50cyxhPWZ1bmN0aW9uKCl7cj1udWxsLG58fHQuYXBwbHkobyxpKX0scz1uJiYhcjtjbGVhclRpbWVvdXQocikscj1zZXRUaW1lb3V0KGEsZSkscyYmdC5hcHBseShvLGkpfX1mdW5jdGlvbiBnZSh0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5pbmRleE9mKCIjIyMiKT4tMT90LnJlcGxhY2UoLyMjIy9nLCIuIik6dH1mb3IodmFyIG89InN0cmluZyIhPXR5cGVvZiBlP1tdLmNvbmNhdChlKTplLnNwbGl0KCIuIik7by5sZW5ndGg+MTspe2lmKCF0KXJldHVybnt9O3ZhciBpPXIoby5zaGlmdCgpKTshdFtpXSYmbiYmKHRbaV09bmV3IG4pLHQ9dFtpXX1yZXR1cm4gdD97b2JqOnQsazpyKG8uc2hpZnQoKSl9Ont9fWZ1bmN0aW9uIHZlKHQsZSxuKXt2YXIgcj1nZSh0LGUsT2JqZWN0KTtyLm9ialtyLmtdPW59ZnVuY3Rpb24geWUodCxlKXt2YXIgbj1nZSh0LGUpLHI9bi5vYmosbz1uLms7aWYocilyZXR1cm4gcltvXX12YXIgbWU9bmV3IFJlZ0V4cCgie3soLis/KX19IiwiZyIpO2Z1bmN0aW9uIGJlKHQsZSxuKXt2YXIgcixvLGk7Zm9yKDtyPW1lLmV4ZWModCk7KSJzdHJpbmciIT10eXBlb2Yobz1yWzFdLnRyaW0oKSkmJihvPW51bGw9PShpPW8pPyIiOiIiK2kpLG98fChvPSIiKSxvPW8ucmVwbGFjZSgvXCQvZywiJCQkJCIpLHQ9dC5yZXBsYWNlKHJbMF0sZVtvXXx8byksbWUubGFzdEluZGV4PTA7cmV0dXJuIHR9ZnVuY3Rpb24geGUodCxlLG4scixvKXt0cnl7dmFyIGk9bmV3KFhNTEh0dHBSZXF1ZXN0fHxBY3RpdmVYT2JqZWN0KSgiTVNYTUwyLlhNTEhUVFAuMy4wIik7aS5vcGVuKHI/IlBPU1QiOiJHRVQiLHQsMSksZS5jcm9zc0RvbWFpbnx8aS5zZXRSZXF1ZXN0SGVhZGVyKCJYLVJlcXVlc3RlZC1XaXRoIiwiWE1MSHR0cFJlcXVlc3QiKSxlLmF1dGhvcml6ZSYmZS5hcGlLZXkmJmkuc2V0UmVxdWVzdEhlYWRlcigiQXV0aG9yaXphdGlvbiIsZS5hcGlLZXkpLChyfHxlLnNldENvbnRlbnRUeXBlSlNPTikmJmkuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24vanNvbiIpLGkub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aS5yZWFkeVN0YXRlPjMmJm4mJm4oaS5yZXNwb25zZVRleHQsaSl9LGkuc2VuZChKU09OLnN0cmluZ2lmeShyKSl9Y2F0Y2godCl7d2luZG93LmNvbnNvbGUmJmNvbnNvbGUubG9nKHQpfX12YXIgd2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbixyKXshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyx0KSxlJiZlLnByb2plY3RJZD90aGlzLmluaXQobnVsbCxlLHt9LG4pOnRoaXMuaW5pdChudWxsLG4se30sciksdGhpcy50eXBlPSJiYWNrZW5kIn12YXIgZSxuLHI7cmV0dXJuIGU9dCwobj1be2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxyPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwLG89YXJndW1lbnRzLmxlbmd0aD4zP2FyZ3VtZW50c1szXTp2b2lkIDA7dGhpcy5vcHRpb25zPXBlKHt9LHtsb2FkUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL3t7cHJvamVjdElkfX0ve3t2ZXJzaW9ufX0ve3tsbmd9fS97e25zfX0iLHByaXZhdGVQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vcHJpdmF0ZS97e3Byb2plY3RJZH19L3t7dmVyc2lvbn19L3t7bG5nfX0ve3tuc319IixwdWxsUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL3B1bGwve3twcm9qZWN0SWR9fS97e3ZlcnNpb259fS97e2xuZ319L3t7bnN9fSIsZ2V0TGFuZ3VhZ2VzUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL2xhbmd1YWdlcy97e3Byb2plY3RJZH19IixhZGRQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vbWlzc2luZy97e3Byb2plY3RJZH19L3t7dmVyc2lvbn19L3t7bG5nfX0ve3tuc319Iix1cGRhdGVQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vdXBkYXRlL3t7cHJvamVjdElkfX0ve3t2ZXJzaW9ufX0ve3tsbmd9fS97e25zfX0iLHJlZmVyZW5jZUxuZzoiZW4iLGNyb3NzRG9tYWluOiEwLHNldENvbnRlbnRUeXBlSlNPTjohMSx2ZXJzaW9uOiJsYXRlc3QiLHB1bGw6ITEscHJpdmF0ZTohMSx3aGl0ZWxpc3RUaHJlc2hvbGQ6LjksZmFpbExvYWRpbmdPbkVtcHR5SlNPTjohMSxhbGxvd2VkQWRkT3JVcGRhdGVIb3N0czpbImxvY2FsaG9zdCJdfSx0aGlzLm9wdGlvbnMsbiksdGhpcy5zZXJ2aWNlcz10LHRoaXMub3B0aW9ucy5wdWxsJiZjb25zb2xlLndhcm4oImRlcHJlY2F0ZWQ6IHB1bGwgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBhbmQgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggbG9jaXplIHByaXZhdGUgdmVyc2lvbnMiKTt2YXIgaT13aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZTtpPyh0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkPXRoaXMub3B0aW9ucy5hbGxvd2VkQWRkT3JVcGRhdGVIb3N0cy5pbmRleE9mKGkpPi0xLHIuc2F2ZU1pc3NpbmcmJiF0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkJiZ0JiZ0LmxvZ2dlciYmdC5sb2dnZXIud2FybignbG9jaXplLWJhY2tlbmQ6IHdpbGwgbm90IHNhdmUgbWlzc2luZ3MgYmVjYXVzZSB0aGUgaG9zdCAiJy5jb25jYXQoaSwnIiB3YXMgbm90IGluIHRoZSBsaXN0IG9mIGFsbG93ZWRBZGRPclVwZGF0ZUhvc3RzOiAnKS5jb25jYXQodGhpcy5vcHRpb25zLmFsbG93ZWRBZGRPclVwZGF0ZUhvc3RzLmpvaW4oIiwgIiksIiAobWF0Y2hlcyBuZWVkIHRvIGJlIGV4YWN0KS4iKSkpOnRoaXMuaXNBZGRPclVwZGF0ZUFsbG93ZWQ9ITAsImZ1bmN0aW9uIj09dHlwZW9mIG8mJnRoaXMuZ2V0T3B0aW9ucyhmdW5jdGlvbih0LHIpe2lmKHQpcmV0dXJuIG8odCk7ZS5vcHRpb25zLnJlZmVyZW5jZUxuZz1uLnJlZmVyZW5jZUxuZ3x8ci5yZWZlcmVuY2VMbmd8fGUub3B0aW9ucy5yZWZlcmVuY2VMbmcsbyhudWxsLHIpfSksdGhpcy5xdWV1ZWRXcml0ZXM9e30sdGhpcy5kZWJvdW5jZWRQcm9jZXNzPWRlKHRoaXMucHJvY2VzcywxZTQpfX0se2tleToiZ2V0TGFuZ3VhZ2VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1iZSh0aGlzLm9wdGlvbnMuZ2V0TGFuZ3VhZ2VzUGF0aCx7cHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWR9KTt0aGlzLmxvYWRVcmwoZSx7fSx0KX19LHtrZXk6ImdldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5nZXRMYW5ndWFnZXMoZnVuY3Rpb24obixyKXtpZihuKXJldHVybiB0KG4pO3ZhciBvPU9iamVjdC5rZXlzKHIpO2lmKCFvLmxlbmd0aClyZXR1cm4gdChuZXcgRXJyb3IoIndhcyB1bmFibGUgdG8gbG9hZCBsYW5ndWFnZXMgdmlhIEFQSSIpKTt2YXIgaT1vLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiByW2VdLmlzUmVmZXJlbmNlTGFuZ3VhZ2UmJih0PWUpLHR9LCIiKSxhPW8ucmVkdWNlKGZ1bmN0aW9uKHQsbil7dmFyIG89cltuXTtyZXR1cm4gby50cmFuc2xhdGVkW2Uub3B0aW9ucy52ZXJzaW9uXSYmby50cmFuc2xhdGVkW2Uub3B0aW9ucy52ZXJzaW9uXT49ZS5vcHRpb25zLndoaXRlbGlzdFRocmVzaG9sZCYmdC5wdXNoKG4pLHR9LFtdKSxzPW8ucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaW5kZXhPZigiLSIpPi0xfHx0fSwhMSk7dChudWxsLHtmYWxsYmFja0xuZzppLHJlZmVyZW5jZUxuZzppLHdoaXRlbGlzdDphLGxvYWQ6cz8iYWxsIjoibGFuZ3VhZ2VPbmx5In0pfSl9fSx7a2V5OiJyZWFkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHIsbz17fTt0aGlzLm9wdGlvbnMucHJpdmF0ZT8ocj1iZSh0aGlzLm9wdGlvbnMucHJpdmF0ZVBhdGgse2xuZzp0LG5zOmUscHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWQsdmVyc2lvbjp0aGlzLm9wdGlvbnMudmVyc2lvbn0pLG89e2F1dGhvcml6ZTohMH0pOnRoaXMub3B0aW9ucy5wdWxsPyhyPWJlKHRoaXMub3B0aW9ucy5wdWxsUGF0aCx7bG5nOnQsbnM6ZSxwcm9qZWN0SWQ6dGhpcy5vcHRpb25zLnByb2plY3RJZCx2ZXJzaW9uOnRoaXMub3B0aW9ucy52ZXJzaW9ufSksbz17YXV0aG9yaXplOiEwfSk6cj1iZSh0aGlzLm9wdGlvbnMubG9hZFBhdGgse2xuZzp0LG5zOmUscHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWQsdmVyc2lvbjp0aGlzLm9wdGlvbnMudmVyc2lvbn0pLHRoaXMubG9hZFVybChyLG8sbil9fSx7a2V5OiJsb2FkVXJsIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpczt4ZSh0LHBlKHt9LHRoaXMub3B0aW9ucyxlKSxmdW5jdGlvbihlLG8pe2lmKG8uc3RhdHVzPj01MDAmJm8uc3RhdHVzPDYwMClyZXR1cm4gbigiZmFpbGVkIGxvYWRpbmcgIit0LCEwKTtpZihvLnN0YXR1cz49NDAwJiZvLnN0YXR1czw1MDApcmV0dXJuIG4oImZhaWxlZCBsb2FkaW5nICIrdCwhMSk7dmFyIGksYTt0cnl7aT1KU09OLnBhcnNlKGUpfWNhdGNoKGUpe2E9ImZhaWxlZCBwYXJzaW5nICIrdCsiIHRvIGpzb24ifXJldHVybiBhP24oYSwhMSk6ci5vcHRpb25zLmZhaWxMb2FkaW5nT25FbXB0eUpTT04mJiFPYmplY3Qua2V5cyhpKS5sZW5ndGg/bigibG9hZGVkIHJlc3VsdCBlbXB0eSBmb3IgIit0LCExKTp2b2lkIG4obnVsbCxpKX0pfX0se2tleToiY3JlYXRlIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8saSl7dmFyIGE9dGhpcztpZihvfHwobz1mdW5jdGlvbigpe30pLCF0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkKXJldHVybiBvKCJob3N0IGlzIG5vdCBhbGxvd2VkIHRvIGNyZWF0ZSBrZXkuIik7InN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLHQuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0PT09YS5vcHRpb25zLnJlZmVyZW5jZUxuZ30pLmxlbmd0aDwxJiZ0aGlzLnNlcnZpY2VzJiZ0aGlzLnNlcnZpY2VzLmxvZ2dlciYmdGhpcy5zZXJ2aWNlcy5sb2dnZXIud2FybignbG9jaXplLWJhY2tlbmQ6IHdpbGwgbm90IHNhdmUgbWlzc2luZ3MgYmVjYXVzZSB0aGUgcmVmZXJlbmNlIGxhbmd1YWdlICInLmNvbmNhdCh0aGlzLm9wdGlvbnMucmVmZXJlbmNlTG5nLCciIHdhcyBub3QgaW4gdGhlIGxpc3Qgb2YgdG8gc2F2ZSBsYW5ndWFnZXM6ICcpLmNvbmNhdCh0LmpvaW4oIiwgIiksIiAob3BlbiB5b3VyIHNpdGUgaW4gdGhlIHJlZmVyZW5jZSBsYW5ndWFnZSB0byBzYXZlIG1pc3NpbmdzKS4iKSksdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Q9PT1hLm9wdGlvbnMucmVmZXJlbmNlTG5nJiZhLnF1ZXVlLmNhbGwoYSxhLm9wdGlvbnMucmVmZXJlbmNlTG5nLGUsbixyLG8saSl9KX19LHtrZXk6InVwZGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvLGkpe3ZhciBhPXRoaXM7aWYob3x8KG89ZnVuY3Rpb24oKXt9KSwhdGhpcy5pc0FkZE9yVXBkYXRlQWxsb3dlZClyZXR1cm4gbygiaG9zdCBpcyBub3QgYWxsb3dlZCB0byB1cGRhdGUga2V5LiIpO2l8fChpPXt9KSwic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksaS5pc1VwZGF0ZT0hMCx0LmZvckVhY2goZnVuY3Rpb24odCl7dD09PWEub3B0aW9ucy5yZWZlcmVuY2VMbmcmJmEucXVldWUuY2FsbChhLGEub3B0aW9ucy5yZWZlcmVuY2VMbmcsZSxuLHIsbyxpKX0pfX0se2tleToid3JpdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpZigheWUodGhpcy5xdWV1ZWRXcml0ZXMsWyJsb2NrcyIsdCxlXSkpe3ZhciByPWJlKHRoaXMub3B0aW9ucy5hZGRQYXRoLHtsbmc6dCxuczplLHByb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkLHZlcnNpb246dGhpcy5vcHRpb25zLnZlcnNpb259KSxvPWJlKHRoaXMub3B0aW9ucy51cGRhdGVQYXRoLHtsbmc6dCxuczplLHByb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkLHZlcnNpb246dGhpcy5vcHRpb25zLnZlcnNpb259KSxpPXllKHRoaXMucXVldWVkV3JpdGVzLFt0LGVdKTtpZih2ZSh0aGlzLnF1ZXVlZFdyaXRlcyxbdCxlXSxbXSksaS5sZW5ndGgpe3ZlKHRoaXMucXVldWVkV3JpdGVzLFsibG9ja3MiLHQsZV0sITApO3ZhciBhPSExLHM9ITEsdT17fSxjPXt9O2kuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT10Lm9wdGlvbnMmJnQub3B0aW9ucy50RGVzY3JpcHRpb24/e3ZhbHVlOnQuZmFsbGJhY2tWYWx1ZXx8IiIsY29udGV4dDp7dGV4dDp0Lm9wdGlvbnMudERlc2NyaXB0aW9ufX06dC5mYWxsYmFja1ZhbHVlfHwiIjt0Lm9wdGlvbnMmJnQub3B0aW9ucy5pc1VwZGF0ZT8oc3x8KHM9ITApLGNbdC5rZXldPWUpOihhfHwoYT0hMCksdVt0LmtleV09ZSl9KTt2YXIgbD0wO2EmJmwrKyxzJiZsKys7dmFyIGY9ZnVuY3Rpb24oKXstLWx8fCh2ZShuLnF1ZXVlZFdyaXRlcyxbImxvY2tzIix0LGVdLCExKSxpLmZvckVhY2goZnVuY3Rpb24odCl7dC5jYWxsYmFjayYmdC5jYWxsYmFjaygpfSksbi5kZWJvdW5jZWRQcm9jZXNzKHQsZSkpfTtsfHxmKCksYSYmeGUocixwZSh7fSx7YXV0aG9yaXplOiEwfSx0aGlzLm9wdGlvbnMpLGZ1bmN0aW9uKHQsZSl7ZigpfSx1KSxzJiZ4ZShvLHBlKHt9LHthdXRob3JpemU6ITB9LHRoaXMub3B0aW9ucyksZnVuY3Rpb24odCxlKXtmKCl9LGMpfX19fSx7a2V5OiJwcm9jZXNzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7T2JqZWN0LmtleXModGhpcy5xdWV1ZWRXcml0ZXMpLmZvckVhY2goZnVuY3Rpb24oZSl7ImxvY2tzIiE9PWUmJk9iamVjdC5rZXlzKHQucXVldWVkV3JpdGVzW2VdKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3QucXVldWVkV3JpdGVzW2VdW25dLmxlbmd0aCYmdC53cml0ZShlLG4pfSl9KX19LHtrZXk6InF1ZXVlIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8saSl7IWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPWdlKHQsZSxPYmplY3QpLGk9by5vYmosYT1vLms7aVthXT1pW2FdfHxbXSxyJiYoaVthXT1pW2FdLmNvbmNhdChuKSkscnx8aVthXS5wdXNoKG4pfSh0aGlzLnF1ZXVlZFdyaXRlcyxbdCxlXSx7a2V5Om4sZmFsbGJhY2tWYWx1ZTpyfHwiIixjYWxsYmFjazpvLG9wdGlvbnM6aX0pLHRoaXMuZGVib3VuY2VkUHJvY2VzcygpfX1dKSYmaGUoZS5wcm90b3R5cGUsbiksciYmaGUoZSxyKSx0fSgpO3dlLnR5cGU9ImJhY2tlbmQiO3ZhciBrZT13ZSxTZT1uKDQ0KTtmdW5jdGlvbiBFZSgpe3JldHVybihFZT14dCgpKHZ0LmEubWFyayhmdW5jdGlvbiB0KGUpe3JldHVybiB2dC5hLndyYXAoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLG5ldyBrdC5hKGZ1bmN0aW9uKHQpe3VlLmNoYW5nZUxhbmd1YWdlKGUsZnVuY3Rpb24oKXt0KHZvaWQgMCl9KX0pKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19LHQpfSkpKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gamUoKXt2YXIgdDtyZXR1cm4gbXQoKSh0PXVlLnQpLmNhbGwodCx1ZSl9dmFyIFRlPXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBrdC5hKGZ1bmN0aW9uKHQsZSl7dWUudXNlKG5ldyBsZS5hKG51bGwse29yZGVyOlsibmF2aWdhdG9yIl19KSkudXNlKGtlKS5pbml0KHtmYWxsYmFja0xuZzoiZW4iLG5zOlsiZGVmYXVsdCJdLGRlZmF1bHROUzoiZGVmYXVsdCIsYmFja2VuZDp7cHJvamVjdElkOlNlLmxvY2l6ZS5wcm9kdWN0SWQsdmVyc2lvbjpTZS5sb2NpemUudmVyc2lvbixhcGlLZXk6U2UubG9jaXplLmFwaUtleSxyZWZlcmVuY2VMbmc6ImVuIn19LGZ1bmN0aW9uKG4scil7cmV0dXJuIG4/ZShuKTp0KHIpfSl9KX0sY2hhbmdlTGFuZ3VhZ2U6ZnVuY3Rpb24odCl7cmV0dXJuIEVlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZ2V0TGFuZ3VhZ2U6ZnVuY3Rpb24oKXtyZXR1cm4gdWUubGFuZ3VhZ2V9LGdldFQ6amV9LE9lPW4oODMpLEFlPW4ubihPZSksQ2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuPWUuZGF0YTtkKCkodGhpcyx0KSx0aGlzLmRhdGE9bn1yZXR1cm4gdigpKHQsbnVsbCxbe2tleToiY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10scj0xO3I8ZS5sZW5ndGg7cis9MSl7Zm9yKHZhciBvPXt9LGk9MDtpPHQubGVuZ3RoO2krPTEpb1t0W2ldXT1lW3JdW2ldO24ucHVzaChvKX1yZXR1cm4gbn19LHtrZXk6InNwbGl0Q291bnRyaWVzIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdD8iIj09PXR8fCIsIj09PXQ/W106dC5zcGxpdCgiLCIpOltdfX0se2tleToibm9ybWFsaXplUmF3RGF0YSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10scj0wLG89WSgpKHQpO3I8by5sZW5ndGg7cisrKXt2YXIgaSxhPXRbb1tyXV07YS5zaGlmdCgpLG49bCgpKGk9W10pLmNhbGwoaSxBZSgpKG4pLEFlKCkoYSkpfXJldHVybiBuLnVuc2hpZnQoZSkse2RhdGE6bn19fV0pLHR9KCk7ZnVuY3Rpb24gTGUodCl7dmFyIGU9ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFvLmEpcmV0dXJuITE7aWYoby5hLnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKCkoRGF0ZSxbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1FKCkodCk7aWYoZSl7dmFyIGk9RSgpKHRoaXMpLmNvbnN0cnVjdG9yO249bygpKHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gaygpKHRoaXMsbil9fXZhciBSZT17YnlVcmw6e25hbWU6ImJ5VXJsIixjb2x1bW5zOlsidXJsIiwiY291bnRyaWVzIl19LGJ5SXRlbU5hbWU6e25hbWU6ImJ5SXRlbU5hbWUiLGNvbHVtbnM6WyJpdGVtTmFtZSIsImNvdW50cmllcyJdfSxieUl0ZW1Db2RlOntuYW1lOiJieUl0ZW1Db2RlIixjb2x1bW5zOlsiaXRlbUNvZGUiLCJjb3VudHJpZXMiXX0sYnlDYXRlZ29yeTp7bmFtZToiYnlDYXRlZ29yeSIsY29sdW1uczpbImNhdGVnb3J5IiwiY291bnRyaWVzIl19LGJ5SXRlbURlc2NyaXB0aW9uOntuYW1lOiJieUl0ZW1EZXNjcmlwdGlvbiIsY29sdW1uczpbInRleHQiLCJjb3VudHJpZXMiXX19LFBlPWZ1bmN0aW9uKHQpe3goKShuLHQpO3ZhciBlPUxlKG4pO2Z1bmN0aW9uIG4odCl7dmFyIHI7cmV0dXJuIGQoKSh0aGlzLG4pLChyPWUuY2FsbCh0aGlzLHQpKS5kYXRhPXQuZGF0YSxyLnNoZWV0VHlwZT10LnNoZWV0VHlwZXx8UmUscn1yZXR1cm4gdigpKG4sW3trZXk6ImJ5VXJsIix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoZWV0VHlwZS5ieVVybClyZXR1cm5bXTt2YXIgdD10aGlzLnNoZWV0VHlwZS5ieVVybDtpZighdGhpcy5kYXRhW3QubmFtZV0pcmV0dXJuW107dmFyIGU9Q2UuY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSh0LmNvbHVtbnMsdGhpcy5kYXRhW3QubmFtZV0pO3JldHVybiBwKCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57dXJsOmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiYnlJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXtpZighdGhpcy5zaGVldFR5cGUuYnlJdGVtTmFtZSlyZXR1cm5bXTt2YXIgdD10aGlzLnNoZWV0VHlwZS5ieUl0ZW1OYW1lO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1DZS5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIHAoKShlKS5jYWxsKGUsZnVuY3Rpb24oZSl7dmFyIG49ZVt0LmNvbHVtbnNbMV1dO3JldHVybntpdGVtTmFtZTplW3QuY29sdW1uc1swXV0sY291bnRyaWVzOkNlLnNwbGl0Q291bnRyaWVzKG4pLGlzQWxsOiJBTEwiPT09bn19KX19LHtrZXk6ImJ5SXRlbUNvZGUiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5SXRlbUNvZGUpcmV0dXJuW107dmFyIHQ9dGhpcy5zaGVldFR5cGUuYnlJdGVtQ29kZTtpZighdGhpcy5kYXRhW3QubmFtZV0pcmV0dXJuW107dmFyIGU9Q2UuY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSh0LmNvbHVtbnMsdGhpcy5kYXRhW3QubmFtZV0pO3JldHVybiBwKCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57aXRlbUNvZGU6ZVt0LmNvbHVtbnNbMF1dLGNvdW50cmllczpDZS5zcGxpdENvdW50cmllcyhuKSxpc0FsbDoiQUxMIj09PW59fSl9fSx7a2V5OiJieUNhdGVnb3J5Iix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoZWV0VHlwZS5ieUNhdGVnb3J5KXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5Q2F0ZWdvcnk7aWYoIXRoaXMuZGF0YVt0Lm5hbWVdKXJldHVybltdO3ZhciBlPUNlLmNvbnZlcnRHb29nbGVTcHJlYWRzaGVldEFwaVJhd0RhdGEodC5jb2x1bW5zLHRoaXMuZGF0YVt0Lm5hbWVdKTtyZXR1cm4gcCgpKGUpLmNhbGwoZSxmdW5jdGlvbihlKXt2YXIgbj1lW3QuY29sdW1uc1sxXV07cmV0dXJue2NhdGVnb3J5OmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiYnlJdGVtRGVzY3JpcHRpb24iLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5SXRlbURlc2NyaXB0aW9uKXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5SXRlbURlc2NyaXB0aW9uO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1DZS5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIHAoKShlKS5jYWxsKGUsZnVuY3Rpb24oZSl7dmFyIG49ZVt0LmNvbHVtbnNbMV1dO3JldHVybnt0ZXh0OmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiZXhlY3V0ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57ZXhjbHVzaW9uOntieVVybDp0aGlzLmJ5VXJsKCksYnlJdGVtTmFtZTp0aGlzLmJ5SXRlbU5hbWUoKSxieUl0ZW1Db2RlOnRoaXMuYnlJdGVtQ29kZSgpLGJ5Q2F0ZWdvcnk6dGhpcy5ieUNhdGVnb3J5KCksYnlJdGVtRGVzY3JpcHRpb246dGhpcy5ieUl0ZW1EZXNjcmlwdGlvbigpfX19fV0pLG59KENlKSxOZT1uKDYzKSxJZT1uLm4oTmUpLF9lPW4oODQpO2Z1bmN0aW9uIERlKHQsZSl7dmFyIG47aWYodm9pZCAwPT09cS5hfHxudWxsPT1VKCkodCkpe2lmKEQoKSh0KXx8KG49ZnVuY3Rpb24odCxlKXt2YXIgbjtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBNZSh0LGUpO3ZhciByPVcoKShuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSkuY2FsbChuLDgsLTEpOyJPYmplY3QiPT09ciYmdC5jb25zdHJ1Y3RvciYmKHI9dC5jb25zdHJ1Y3Rvci5uYW1lKTtpZigiTWFwIj09PXJ8fCJTZXQiPT09cilyZXR1cm4gSCgpKHQpO2lmKCJBcmd1bWVudHMiPT09cnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QocikpcmV0dXJuIE1lKHQsZSl9KHQpKXx8ZSYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxvPWZ1bmN0aW9uKCl7fTtyZXR1cm57czpvLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjpvfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGksYT0hMCxzPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj1JKCkodCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1uLm5leHQoKTtyZXR1cm4gYT10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXtzPSEwLGk9dH0sZjpmdW5jdGlvbigpe3RyeXthfHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKHMpdGhyb3cgaX19fX1mdW5jdGlvbiBNZSh0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfWZ1bmN0aW9uIFVlKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhby5hKXJldHVybiExO2lmKG8uYS5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobygpKERhdGUsW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9RSgpKHQpO2lmKGUpe3ZhciBpPUUoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPW8oKShyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGsoKSh0aGlzLG4pfX12YXIgQmU9ZnVuY3Rpb24odCl7eCgpKG4sdCk7dmFyIGU9VWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBkKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gdigpKG4sW3trZXk6ImV4Y2x1ZGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxyKXt2YXIgbyxpLGEscz0hMSx1PXRoaXMubG9jYXRpb24uY291bnRyeSxjPURlKHQpO3RyeXtmb3IoYy5zKCk7IShvPWMubigpKS5kb25lOyl7dmFyIGY9by52YWx1ZTtpZihyKGYpKXtzPW4ubWF0Y2hDb3VudHJ5KGYsdSk7YnJlYWt9fX1jYXRjaCh0KXtjLmUodCl9ZmluYWxseXtjLmYoKX1yZXR1cm4gcz8oYXQuYS5kZWJ1ZyhsKCkoaT0iRVhDTFVERUQgQlkgU1BSRUFEU0hFRVQ6ICIuY29uY2F0KGUsIiwgIikpLmNhbGwoaSx1KSkse2NvZGU6IkVYQ0xVREVEX0JZX0JMQUNLTElTVCIsbWVzc2FnZTpsKCkoYT0iIi5jb25jYXQoZSwiLCAiKSkuY2FsbChhLHUsIiDjgavoqbLlvZPjgZfjgZ/jgZ/jgoHpmaTlpJYiKSxwYXJhbXM6e3ZhbHVlOmUsY291bnRyeTp1fX0pOl9lLmF9fV0sW3trZXk6Im1hdGNoQ291bnRyeSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4hKCF0LmlzQWxsJiYwIT09dC5jb3VudHJpZXMubGVuZ3RoKXx8SWUoKShuPXQuY291bnRyaWVzKS5jYWxsKG4sZSl9fV0pLG59KF9lLmIpO2Z1bmN0aW9uIHFlKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhby5hKXJldHVybiExO2lmKG8uYS5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobygpKERhdGUsW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9RSgpKHQpO2lmKGUpe3ZhciBpPUUoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPW8oKShyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGsoKSh0aGlzLG4pfX12YXIgRmU9d2luZG93LnppZ3phZyxIZT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJidG4tbmF2IikubGVuZ3RoPjAsemU9L1wvaXRlbVwvXGQrLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtkdC5vbkNoYW5nZXNSZWFkeShmdW5jdGlvbih0KXsvdG93ZXJcLmpwXC8vLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpJiYoSGU/KHplJiYoZHQub3ZlcnJpZGVDbGlja0V2ZW50KHQsIi5pdGVtLWluZm8tbWFpbiAubWFpbi1jYXJ0aW4tYnRuLCAjRmxvYXRpbmdDYXJ0SW4gLm1haW4tY2FydGluLWJ0biIsZnVuY3Rpb24oKXtGZS5wYWdlVG8oIml0ZW0iKX0pLHQoJ1tpZCo9IlJlbGF0aW9uR3JvdXBJdGVtc18iXScpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwiLmNhcnRpbi1idG4ucmVsZWFzZWQtYnRuIixmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG4scj10KGUudGFyZ2V0KTtpZihyLmNsb3Nlc3QoIi5yZWxhdGlvbi1ncm91cC1pdGVtLXJvdyIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShuPXIuY2xvc2VzdCgiLnJlbGF0aW9uLWdyb3VwLWl0ZW0tcm93IikpLmNhbGwobiwiLml0ZW0taW5mby1ibG9jayA+IGEiKS5hdHRyKCJocmVmIil8fCIifX0pKSxkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwnYVtocmVmJD0iL2VjL1Nob3BwaW5nQmFnL0l0ZW1MaXN0Il0nLGZ1bmN0aW9uKCl7RmUucGFnZVRvKCJjYXJ0Iil9KSx0KCIuYm94LnNlY3Rpb24sIC50ZXh0LWhvbGRlciIpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwnYVtocmVmKj0iYWN0aW9uPWNhcnRpbiJdJyxmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG49dChlLnRhcmdldCk7aWYobi5jbG9zZXN0KCIuZXZlbi1pdGVtIikubGVuZ3RoPjApe3ZhciByPW4uY2xvc2VzdCgiLmV2ZW4taXRlbSIpO1QoKShyKS5jYWxsKHIsIi5zdWItdGl0bGUiKS5sZW5ndGg+MD93aW5kb3cubG9jYXRpb24uaHJlZj1UKCkocikuY2FsbChyLCIuc3ViLXRpdGxlID4gYSIpLmF0dHIoImhyZWYiKXx8IiI6VCgpKHIpLmNhbGwociwiLndyYXBwLXRleHQiKS5sZW5ndGg+MCYmKHdpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShyKS5jYWxsKHIsIi53cmFwcC10ZXh0IGE6Zmlyc3Qtb2YtdHlwZSIpLmF0dHIoImhyZWYiKXx8IiIpfX19KSk6KHplJiYoZHQub3ZlcnJpZGVDbGlja0V2ZW50KHQsIi5wcmljZS1pbmZvLW1haW4gLmNhcnRpbi1hcmVhLW5vd29uc2FsZSwgLnByaWNlLWluZm8tbWFpbiAuY2FydGluLWFyZWEtcmVzZXJ2ZSIsZnVuY3Rpb24oKXtGZS5wYWdlVG8oIml0ZW0iKX0pLHQoJ1tpZCo9IlJlbGF0aW9uR3JvdXBJdGVtc18iXScpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwiLmNhcnRpbi1idG4ucmVsZWFzZWQtYnRuIixmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG4scj10KGUudGFyZ2V0KTtpZihyLmNsb3Nlc3QoIi5yZWxhdGlvbi1ncm91cC1pdGVtLXJvdyIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShuPXIuY2xvc2VzdCgiLml0ZW0tYmxvY2siKSkuY2FsbChuLCIuaXRlbS1pbmZvLWJsb2NrID4gYSIpLmF0dHIoImhyZWYiKXx8IiJ9fSkpLGR0Lm92ZXJyaWRlQ2xpY2tFdmVudCh0LCdhW2hyZWYkPSIvZWMvU2hvcHBpbmdCYWcvSXRlbUxpc3QiXScsZnVuY3Rpb24oKXtGZS5wYWdlVG8oImNhcnQiKX0pLHQoIi50b3BNb2R1bGVCb3gsIC5hcnRpc3RNYWluT25lQ29sdW1uLCAuc2VhcmNoTGlzdFRhYmxlIikubGVuZ3RoPjAmJmR0Lm92ZXJyaWRlQ2xpY2tFdmVudCh0LCdhW2hyZWYqPSJhY3Rpb249Y2FydGluIl0nLGZ1bmN0aW9uKGUpe2lmKGUudGFyZ2V0KXt2YXIgbixyPXQoZS50YXJnZXQpO2lmKHIuY2xvc2VzdCgiLmZlYXR1cmVJdGVtQ2FydFdyYXAwMSIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShuPXIuY2xvc2VzdCgiLmZlYXR1cmVJdGVtQ2FydFdyYXAwMSIpKS5jYWxsKG4sIi5uYW1lOmZpcnN0LW9mLXR5cGUgPiBhIikuYXR0cigiaHJlZiIpfHwiIjtlbHNlIGlmKHIuY2xvc2VzdCgiLmFydGlzdFNlY3Rpb25MaW5lMDEiKS5sZW5ndGg+MCl7dmFyIG87d2luZG93LmxvY2F0aW9uLmhyZWY9VCgpKG89ci5jbG9zZXN0KCJsaSIpKS5jYWxsKG8sIi50aXRsZSA+IGEiKS5hdHRyKCJocmVmIil8fCIifWVsc2UgaWYoci5jbG9zZXN0KCIuaW5NZGwtZmVhdHVyZUl0ZW1DZWxsLCAuZGlzY29ncmFwaHlMaW5ldXBUYWJsZTAxIikubGVuZ3RoPjApe3ZhciBpO3dpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShpPXIuY2xvc2VzdCgiLmluTWRsLWZlYXR1cmVJdGVtQ2VsbCwgLmRpc2NvZ3JhcGh5TGluZXVwVGFibGUwMSIpKS5jYWxsKGksIi50aXRsZSA+IGEiKS5hdHRyKCJocmVmIil8fCIifWVsc2UgaWYoci5jbG9zZXN0KCIuZmVhdHVyZUl0ZW1PdGhlckxpc3QwMSIpLmxlbmd0aD4wKXt2YXIgYTt3aW5kb3cubG9jYXRpb24uaHJlZj1UKCkoYT1yLmNsb3Nlc3QoImxpIikpLmNhbGwoYSwiLmltZyA+IHAgPiBhIikuYXR0cigiaHJlZiIpfHwiIn1lbHNlIGlmKHIuY2xvc2VzdCgiLmluTWRsLWF0Y2xJdGVtUm93IikubGVuZ3RoPjApe3ZhciBzO3dpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShzPXIuY2xvc2VzdCgibGkiKSkuY2FsbChzLCIudGl0bGUgPiBhIikuYXR0cigiaHJlZiIpfHwiIn19fSx7ZGlzYWJsZVBvaW50ZXJFdmVudDohMH0pKSl9KTt2YXIgV2U9ZnVuY3Rpb24odCl7eCgpKG4sdCk7dmFyIGU9cWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBkKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gdigpKG4sW3trZXk6ImdldEl0ZW0iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsZSxyPXRoaXMsbz1tKCkoRSgpKG4ucHJvdG90eXBlKSwiZ2V0SXRlbSIsdGhpcykuY2FsbCh0aGlzKTtIZT9vLmltYWdlcz1wKCkodD10aGlzLiQoIiNqYWNrZXRQaG90b1N3aXBlciAubWFpbi1qYWNrZXQgaW1nIikuZ2V0KCkpLmNhbGwodCxmdW5jdGlvbih0KXtyZXR1cm4gci4kKHQpLmF0dHIoInNyYyIpfHwiIn0pOm8uaW1hZ2VzPXAoKShlPXRoaXMuJCgiI21haW4taW1hZ2UiKS5nZXQoKSkuY2FsbChlLGZ1bmN0aW9uKHQpe3JldHVybiByLiQodCkuYXR0cigic3JjIil8fCIifSk7cmV0dXJuIG99fSx7a2V5OiJnZXRJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06IiI7cmV0dXJuIHRoaXMuJCgiI1ByaXZpbGVnZUFyZWEiKS5sZW5ndGg+MD90KyLvvIjnibnlhbjjgYLjgorvvIkiOnR9fSx7a2V5OiJnZXRJdGVtUHJpY2UiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjAsZT10LG49dGhpcy4kKCIuc2FsZS1wcmljZS12YWx1ZSIpLHI9dGhpcy4kKCIubXVsdGlidXktcHJpY2UtbGFiZWwiKS50ZXh0KCk7cmV0dXJuIG4ubGVuZ3RoPjAmJigv44G+44Go44KB44Gm44Kq44OV5L6h5qC8Ly50ZXN0KHIpfHwoZT1DKG4udGV4dCgpKSkpLGV9fSx7a2V5OiJnZXRQdXJjaGFzYWJsZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIDAhPT10aGlzLiQoJy5jYXJ0aW4tYXJlYS1ub3dvbnNhbGVbb25jbGljayo9IkNhcnRJbiJdLCAuY2FydGluLWFyZWEtcmVzZXJ2ZVtvbmNsaWNrKj0iQ2FydEluIl0nKS5sZW5ndGh8fChhdC5hLmRlYnVnKCLjgqvjg7zjg4jjg5zjgr/jg7PjgYznhKHjgYTjgZ/jgoHjgIHos7zlhaXkuI3lj68iKSwhMSl9fV0pLG59KFgpLCRlPWZ1bmN0aW9uKHQpe3goKShuLHQpO3ZhciBlPXFlKG4pO2Z1bmN0aW9uIG4oKXtyZXR1cm4gZCgpKHRoaXMsbiksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIG59KFdlKSxZZT1mdW5jdGlvbih0KXt4KCkobix0KTt2YXIgZT1xZShuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIGQoKSh0aGlzLG4pLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBufShXZSksVmU9ZnVuY3Rpb24odCl7eCgpKG4sdCk7dmFyIGU9cWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBkKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gbn0oQmUpO0ZlLmRpc2NvdmVyeShmdW5jdGlvbih0KXt2YXIgZT10LmNhbGxiYWNrLG49dC5sb2NhdGlvbjshZnVuY3Rpb24odCxlKXt2YXIgbj13aW5kb3cuemlnemFnO24mJm4udXRpbHMuZmV0Y2hIdG1sKHQsZSl9KGZ1bmN0aW9uKHQpe3RyeXtpZighemUpcmV0dXJuIGUoKTt2YXIgcixvPW5ldyBQZSh7ZGF0YTpGZS5zaG9wRGF0YXx8e319KS5leGVjdXRlKCk7aWYoSGUpe3I9bmV3ICRlKHskOnQsbmFtZToiLml0ZW0tamFja2V0LXRpdGxlIC5wcm9kdWN0LXRpdGxlIixwcmljZToiLml0ZW0taW5mbyAucHJpY2UtdmFsdWUifSkuZXhlY3V0ZSgpfWVsc2V7cj1uZXcgWWUoeyQ6dCxuYW1lOiIuaXRlbS1pbmZvIC5wcm9kdWN0LXRpdGxlIixwcmljZToiLnByaWNlLWluZm8tbWFpbiAucHJpY2UtdmFsdWUifSkuZXhlY3V0ZSgpfXZhciBpPW5ldyBWZSh7bG9jYXRpb246bixzY3JhcGVyUmVzdWx0OnIsZGF0YTpvLmV4Y2x1c2lvbn0pLmV4ZWN1dGUoKTtyZXR1cm4gZShudWxsLHtpdGVtOnIuaXRlbSxza3VSb3dzOnIuc2t1Um93cyxleGNsdXNpb246aX0pfWNhdGNoKHQpe3JldHVybiBlKHQpfX0pfSk7dmFyIEdlPW5ldyBEYXRlKCJNb24gRmViIDEgMjAyMSAwMDowMDowMCBHTVQrMDgwMCIpLEtlPW5ldyBEYXRlKCJTdW4gRmViIDI4IDIwMjEgMjM6NTk6NTkgR01UKzA4MDAiKSxYZT1uZXcgRGF0ZSgiTW9uIEZlYiAxIDIwMjEgMDA6MDA6MDAgR01UKzA4MDAiKSxKZT1uZXcgRGF0ZSgiU3VuIEZlYiAxNCAyMDIxIDIzOjU5OjU5IEdNVCswODAwIiksUWU9bmV3IERhdGUsWmU9UWUuZ2V0VGltZSgpPj1HZS5nZXRUaW1lKCkmJlFlLmdldFRpbWUoKTw9S2UuZ2V0VGltZSgpLHRuPVFlLmdldFRpbWUoKT49WGUuZ2V0VGltZSgpJiZRZS5nZXRUaW1lKCk8PUplLmdldFRpbWUoKSxlbj0vXnpoL2kudGVzdCh0dCgpKTtpZihaZSYmZW4/KEZlLmNhcnRNb2RhbChmdW5jdGlvbigpe3ZhciB0LGUsbixyPWplKCk7cmV0dXJue2JvdHRvbTp7aHRtbDpsKCkodD1sKCkoZT1sKCkobj0nXG4gICAgPGRpdiBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuMyAhaW1wb3J0YW50OyI+XG4gICAgPHAgc3R5bGU9ImNvbG9yOiByZWQgIWltcG9ydGFudDtmb250LXNpemU6IDAuN2VtICFpbXBvcnRhbnQ7bWFyZ2luOiAwICFpbXBvcnRhbnQ7Ij4nLmNvbmNhdChyKCJ0b3dlcl9qcC5jYXJ0LmJvdHRvbS50ZXh0MS5hbGVydCIpLCc8L3A+XG4gICAgPHVsIHN0eWxlPSJtYXJnaW46IDAuNGVtIDAgIWltcG9ydGFudDsiPlxuICAgIDxsaSBzdHlsZT0iZm9udC1zaXplOiAwLjdlbSAhaW1wb3J0YW50O3BhZGRpbmc6IDAgIWltcG9ydGFudDsiPicpKS5jYWxsKG4scigidG93ZXJfanAuY2FydC5ib3R0b20ubGluZTEiKSwnPC9saT5cbiAgICA8bGkgc3R5bGU9ImZvbnQtc2l6ZTogMC43ZW0gIWltcG9ydGFudDtwYWRkaW5nOiAwICFpbXBvcnRhbnQ7Ij4nKSkuY2FsbChlLHIoInRvd2VyX2pwLmNhcnQuYm90dG9tLmxpbmUyIiksJzwvbGk+XG4gICAgPC91bD5cbiAgICA8cCBzdHlsZT0iY29sb3I6IHJlZCAhaW1wb3J0YW50O2ZvbnQtc2l6ZTogMC43ZW0gIWltcG9ydGFudDttYXJnaW46IDAgIWltcG9ydGFudDsiPicpKS5jYWxsKHQscigidG93ZXJfanAuY2FydC5ib3R0b20udGV4dDIuYWxlcnQiKSwiIDwvcD5cbiAgICA8L2Rpdj5cbiAgICAiKX0sbWlkZGxlOntodG1sOidcbiAgICA8ZGl2IHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmUgIWltcG9ydGFudDsgbWFyZ2luOiAtMTZweCAwIDBweCAhaW1wb3J0YW50OyI+XG4gICAgPHNwYW4gc3R5bGU9IlxuICAgIGNvbnRlbnQ6IFwnXCcgIWltcG9ydGFudDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDtcbiAgICByaWdodDogMTNweCAhaW1wb3J0YW50O1xuICAgIHRvcDogLTExcHggIWltcG9ydGFudDtcbiAgICB3aWR0aDogMHB4ICFpbXBvcnRhbnQ7XG4gICAgaGVpZ2h0OiAwcHggIWltcG9ydGFudDtcbiAgICBtYXJnaW46IGF1dG8gIWltcG9ydGFudDtcbiAgICBib3JkZXItc3R5bGU6IHNvbGlkICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyOiA2cHggc29saWQgdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgICBib3JkZXItYm90dG9tOiA2cHggc29saWQgI2UzMzczOCAhaW1wb3J0YW50OyI+PC9zcGFuPlxuICAgIDxwIHN0eWxlPSJcbiAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDtcbiAgICBjb2xvcjogI2RhNDg0OCAhaW1wb3J0YW50O1xuICAgIGxpbmUtaGVpZ2h0OiAxLjUgIWltcG9ydGFudDtcbiAgICBmb250LXdlaWdodDogYm9sZCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDNweCAhaW1wb3J0YW50O1xuICAgIGJhY2tncm91bmQ6ICNmZmZlZmMgIWltcG9ydGFudDtcbiAgICBib3JkZXI6IHNvbGlkIDFweCAjZGE0ODQ4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogNHB4IDFlbSAhaW1wb3J0YW50O1xuICAgIHdoaXRlLXNwYWNlOiBwcmUtbGluZSAhaW1wb3J0YW50OyI+Jy5jb25jYXQocigidG93ZXJfanAuY2FydE1vZGFsLm1pZGRsZSIpLCI8L3A+XG4gICAgPC9kaXY+XG4gICAgIil9fX0pLEZlLmNoYXJnZXMoZnVuY3Rpb24odCl7dmFyIGU9dC5kZWZhdWx0Q2hhcmdlcztyZXR1cm4gdSgpKHUoKSh7fSxlKSx7cHVyY2hhc2VTZXJ2aWNlRmVlOjB9KX0pKTpGZS5jYXJ0TW9kYWwoZnVuY3Rpb24oKXt2YXIgdCxlLG4scj1qZSgpO3JldHVybntib3R0b206e2h0bWw6bCgpKHQ9bCgpKGU9bCgpKG49J1xuICA8ZGl2IHN0eWxlPSJsaW5lLWhlaWdodDogMS4zICFpbXBvcnRhbnQ7Ij5cbiAgPHAgc3R5bGU9ImNvbG9yOiByZWQgIWltcG9ydGFudDtmb250LXNpemU6IDAuN2VtICFpbXBvcnRhbnQ7bWFyZ2luOiAwICFpbXBvcnRhbnQ7Ij4nLmNvbmNhdChyKCJ0b3dlcl9qcC5jYXJ0LmJvdHRvbS50ZXh0MS5hbGVydCIpLCc8L3A+XG4gIDx1bCBzdHlsZT0ibWFyZ2luOiAwLjRlbSAwICFpbXBvcnRhbnQ7Ij5cbiAgPGxpIHN0eWxlPSJmb250LXNpemU6IDAuN2VtICFpbXBvcnRhbnQ7cGFkZGluZzogMCAhaW1wb3J0YW50OyI+JykpLmNhbGwobixyKCJ0b3dlcl9qcC5jYXJ0LmJvdHRvbS5saW5lMSIpLCc8L2xpPlxuICA8bGkgc3R5bGU9ImZvbnQtc2l6ZTogMC43ZW0gIWltcG9ydGFudDtwYWRkaW5nOiAwICFpbXBvcnRhbnQ7Ij4nKSkuY2FsbChlLHIoInRvd2VyX2pwLmNhcnQuYm90dG9tLmxpbmUyIiksJzwvbGk+XG4gIDwvdWw+XG4gIDxwIHN0eWxlPSJjb2xvcjogcmVkICFpbXBvcnRhbnQ7Zm9udC1zaXplOiAwLjdlbSAhaW1wb3J0YW50O21hcmdpbjogMCAhaW1wb3J0YW50OyI+JykpLmNhbGwodCxyKCJ0b3dlcl9qcC5jYXJ0LmJvdHRvbS50ZXh0Mi5hbGVydCIpLCIgPC9wPlxuICA8L2Rpdj5cbiAgIil9fX0pLHRuJiZlbil7aWYoRmUubm90aWNlTW9kYWwoZnVuY3Rpb24oKXt2YXIgdCxlLG4scixvPWplKCk7cmV0dXJuIEhlP3tqdW1ib3Ryb246e2h0bWw6bCgpKHQ9bCgpKGU9J1xuICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luOiA2cHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICAgIDxkaXY+XG4gICAgICA8c3BhbiBzdHlsZT0ibWFyZ2luOiAzNHB4IDAgMCAhaW1wb3J0YW50OyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyI+PGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvbm90aWNlTW9kYWxfbG9nby5wbmciIGFsdD0iV29ybGRTaG9wcGluZ8OXVE9XRVIgUkVDT1JEUyIgc3R5bGU9Im1heC13aWR0aDogNDAwcHggIWltcG9ydGFudDsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsiPjwvc3Bhbj5cbiAgICAgIDxoMSBzdHlsZT0iZm9udC1zaXplOiAyLjlyZW0gIWltcG9ydGFudDsiPicuY29uY2F0KG8oImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDEiKSwnPC9oMT5cbiAgICAgIDxoMiBzdHlsZT0iZm9udC1zaXplOiAxLjRyZW0gIWltcG9ydGFudDsiPicpKS5jYWxsKGUsbygiY29tbW9uLm5vdGljZU1vZGFsLmp1bWJvdHJvbi5oMiIpLCc8L2gyPlxuICAgICAgPGEgaHJlZj0iYWxpcGF5czovL3BsYXRmb3JtYXBpL3N0YXJ0YXBwP2FwcElkPTIwMTkxMDE3Njg0MTg3NTUiPlxuICAgICAgPGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvY2FtcGFpZ24tYmFubmVyLXNwXzIwMjEwMTIyLnBuZyIgc3R5bGU9IndpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Ij5cbiAgICAgIDwvYT5cbiAgICAgIDxhIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7IiBocmVmPSJodHRwczovL3Rvd2VyLmpwL3NpdGUvaG93dG8vZm9yaW50ZXJuYXRpb25hbGN1c3RvbWVyIj5cbiAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgICAgICAgIGZvbnQtc2l6ZTogMS42cmVtICFpbXBvcnRhbnQ7XG4gICAgICAgICAgbWFyZ2luOiAxcmVtIGF1dG8gIWltcG9ydGFudDtcbiAgICAgICAgICBwYWRkaW5nOiAxcmVtICFpbXBvcnRhbnQ7XG4gICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQgIWltcG9ydGFudDtcbiAgICAgICAgICBtYXgtd2lkdGg6IDUwMHB4ICFpbXBvcnRhbnQ7XG4gICAgICAgICAgYm9yZGVyOiBzb2xpZCAjZmZjYTAwICFpbXBvcnRhbnQ7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmY2EwMCAhaW1wb3J0YW50O1xuICAgICAgICAgIGNvbG9yOiAjMDAwMDAwICFpbXBvcnRhbnQ7Ij4nKSkuY2FsbCh0LG8oInRvd2VyX2pwLm5vdGljZU1vZGFsLmp1bWJvdHJvbi50ZXh0IiksIjwvc3Bhbj5cbiAgICAgIDwvYT5cbiAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICAiKX19OntqdW1ib3Ryb246e2h0bWw6bCgpKG49bCgpKHI9J1xuICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luOiA2cHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICAgIDxkaXY+XG4gICAgICA8c3BhbiBzdHlsZT0ibWFyZ2luOiAzNHB4IDAgMCAhaW1wb3J0YW50OyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyI+PGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvbm90aWNlTW9kYWxfbG9nby5wbmciIGFsdD0iV29ybGRTaG9wcGluZ8OXVE9XRVIgUkVDT1JEUyIgc3R5bGU9Im1heC13aWR0aDogNDAwcHggIWltcG9ydGFudDsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsiPjwvc3Bhbj5cbiAgICAgIDxoMSBzdHlsZT0iZm9udC1zaXplOiAyLjlyZW0gIWltcG9ydGFudDsiPicuY29uY2F0KG8oImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDEiKSwnPC9oMT5cbiAgICAgIDxoMiBzdHlsZT0iZm9udC1zaXplOiAxLjRyZW0gIWltcG9ydGFudDsiPicpKS5jYWxsKHIsbygiY29tbW9uLm5vdGljZU1vZGFsLmp1bWJvdHJvbi5oMiIpLCc8L2gyPlxuICAgICAgPGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvY2FtcGFpZ24tYmFubmVyLXBjXzIwMjEwMTIyLnBuZyIgc3R5bGU9IndpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IG1heC13aWR0aDogMzgwcHggIWltcG9ydGFudDsiPlxuICAgICAgPGEgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OyBjb2xvcjogYmxhY2sgIWltcG9ydGFudDsiIGhyZWY9Imh0dHBzOi8vdG93ZXIuanAvc2l0ZS9ob3d0by9mb3JpbnRlcm5hdGlvbmFsY3VzdG9tZXIiPlxuICAgICAgPHNwYW4gc3R5bGU9ImRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gICAgICAgIGZvbnQtc2l6ZTogMS42cmVtICFpbXBvcnRhbnQ7XG4gICAgICAgIG1hcmdpbjogMXJlbSBhdXRvICFpbXBvcnRhbnQ7XG4gICAgICAgIHBhZGRpbmc6IDFyZW0gIWltcG9ydGFudDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQgIWltcG9ydGFudDtcbiAgICAgICAgbWF4LXdpZHRoOiA1MDBweCAhaW1wb3J0YW50O1xuICAgICAgICBib3JkZXI6IHNvbGlkICNmZmNhMDAgIWltcG9ydGFudDtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmY2EwMCAhaW1wb3J0YW50O1xuICAgICAgICBjb2xvcjogIzAwMDAwMCAhaW1wb3J0YW50OyI+JykpLmNhbGwobixvKCJ0b3dlcl9qcC5ub3RpY2VNb2RhbC5qdW1ib3Ryb24udGV4dCIpLCI8L3NwYW4+XG4gICAgICA8L2E+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgIil9fX0pLHplKWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pdGVtLWluZm8tbWFpbiAuc3RvY2stc3RhdHVzIikubGVuZ3RoPjAmJiLjgYrlj5bjgorlr4TjgZsiPT09ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLml0ZW0taW5mby1tYWluIC5zdG9jay1zdGF0dXMiKVswXS50ZXh0Q29udGVudD9GZS5pdGVtTW9kYWwoZnVuY3Rpb24oKXt2YXIgdCxlLG49amUoKTtyZXR1cm4gSGU/e2JvdHRvbTp7aHRtbDpsKCkodD0nXG4gICAgICA8ZGl2PlxuICAgICAgPHAgc3R5bGU9ImNvbG9yOiByZWQgIWltcG9ydGFudDtcbiAgICAgICAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDtcbiAgICAgICAgICBmb250LXdlaWdodDogYm9sZCAhaW1wb3J0YW50O1xuICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxICFpbXBvcnRhbnQ7XG4gICAgICAgICAgbWFyZ2luOiAwLjRlbSAwICFpbXBvcnRhbnQ7Ij4nLmNvbmNhdChuKCJ0b3dlcl9qcC5pdGVtLmJvdHRvbS50aXRsZSIpLCc8L3A+XG4gICAgICA8cCBzdHlsZT0iZm9udC1zaXplOiAxMXB4ICFpbXBvcnRhbnQ7XG4gICAgICAgICAgd2hpdGUtc3BhY2U6IHByZS1saW5lICFpbXBvcnRhbnQ7XG4gICAgICAgICAgbGluZS1oZWlnaHQ6IDEuMiAhaW1wb3J0YW50O1xuICAgICAgICAgIHBhZGRpbmctYm90dG9tOiAwLjJlbSAhaW1wb3J0YW50OyI+JykpLmNhbGwodCxuKCJ0b3dlcl9qcC5pdGVtLmJvdHRvbS50ZXh0IiksJzwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGEgaHJlZj0iYWxpcGF5czovL3BsYXRmb3JtYXBpL3N0YXJ0YXBwP2FwcElkPTIwMTkxMDE3Njg0MTg3NTUiPlxuICAgICAgPGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvY2FtcGFpZ24tYmFubmVyLXNwXzIwMjEwMTIyLnBuZyIgc3R5bGU9IndpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Ij5cbiAgICAgIDwvYT5cbiAgICAgICcpfX06e2JvdHRvbTp7aHRtbDpsKCkoZT0nXG4gICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiAtMTVweCFpbXBvcnRhbnQ7Ij5cbiAgICAgIDxwIHN0eWxlPSJjb2xvcjogcmVkICFpbXBvcnRhbnQ7XG4gICAgICAgICAgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7XG4gICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQgIWltcG9ydGFudDtcbiAgICAgICAgICBsaW5lLWhlaWdodDogMSAhaW1wb3J0YW50O1xuICAgICAgICAgIG1hcmdpbjogMC4xZW0gMCAhaW1wb3J0YW50OyI+Jy5jb25jYXQobigidG93ZXJfanAuaXRlbS5ib3R0b20udGl0bGUiKSwnPC9wPlxuICAgICAgPHAgc3R5bGU9ImZvbnQtc2l6ZTogMTBweCAhaW1wb3J0YW50O1xuICAgICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtbGluZSAhaW1wb3J0YW50O1xuICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxICFpbXBvcnRhbnQ7Ij4nKSkuY2FsbChlLG4oInRvd2VyX2pwLml0ZW0uYm90dG9tLnRleHQiKSwnPC9wPlxuICAgICAgPC9kaXY+XG4gICAgICA8aW1nIHNyYz0iaHR0cHM6Ly9zdGF0aWMtY29udGVudHMud29ybGRzaG9wcGluZy5qcC9zaG9wcy90b3dlcl9qcC9jYW1wYWlnbi1iYW5uZXItcGNfMjAyMTAxMjIucG5nIiBzdHlsZT0id2lkdGg6IDg1JSAhaW1wb3J0YW50OyBtYXgtd2lkdGg6IDI0MHB4ICFpbXBvcnRhbnQ7IG1hcmdpbi1ib3R0b206IC0xNXB4IWltcG9ydGFudDsiPlxuICAgICAgJyl9fX0pOkZlLml0ZW1Nb2RhbChmdW5jdGlvbigpe3JldHVybiBIZT97Ym90dG9tOntodG1sOidcbiAgICAgICAgICA8YSBocmVmPSJhbGlwYXlzOi8vcGxhdGZvcm1hcGkvc3RhcnRhcHA/YXBwSWQ9MjAxOTEwMTc2ODQxODc1NSI+XG4gICAgICAgICAgPGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvY2FtcGFpZ24tYmFubmVyLXNwXzIwMjEwMTIyLnBuZyIgc3R5bGU9IndpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Ij5cbiAgICAgICAgICA8L2E+XG4gICAgICAgICAgJ319Ontib3R0b206e2h0bWw6J1xuICAgICAgICAgIDxpbWcgc3JjPSJodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL3Rvd2VyX2pwL2NhbXBhaWduLWJhbm5lci1wY18yMDIxMDEyMi5wbmciIHN0eWxlPSJ3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBtYXgtd2lkdGg6IDQ4MHB4ICFpbXBvcnRhbnQ7Ij5cbiAgICAgICAgICAnfX19KTtGZS5sYXVuY2goZnVuY3Rpb24oKXt2YXIgdD0hc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiU1RPUkFHRV9LRVlfcmFndGFnX2pwIik7cmV0dXJuIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oIlNUT1JBR0VfS0VZX3JhZ3RhZ19qcCIsYSgpKCEwKSksdD8ibm90aWNlIjpudWxsfSl9ZWxzZXtpZihGZS5ub3RpY2VNb2RhbChmdW5jdGlvbigpe3ZhciB0LGUsbj1qZSgpO3JldHVybntqdW1ib3Ryb246e2h0bWw6bCgpKHQ9bCgpKGU9J1xuICA8ZGl2IHN0eWxlPSJtYXJnaW46IDZweCAwIDAgIWltcG9ydGFudDsiPlxuICA8ZGl2PlxuICA8c3BhbiBzdHlsZT0ibWFyZ2luOiAzNHB4IDAgMCAhaW1wb3J0YW50OyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyI+PGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvbm90aWNlTW9kYWxfbG9nby5wbmciIGFsdD0iV29ybGRTaG9wcGluZ8OXVE9XRVIgUkVDT1JEUyIgc3R5bGU9Im1heC13aWR0aDogNDAwcHggIWltcG9ydGFudDsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsiPjwvc3Bhbj5cbiAgPGgxIHN0eWxlPSJmb250LXNpemU6IDIuOXJlbSAhaW1wb3J0YW50OyI+Jy5jb25jYXQobigiY29tbW9uLm5vdGljZU1vZGFsLmp1bWJvdHJvbi5oMSIpLCc8L2gxPlxuICA8aDIgc3R5bGU9ImZvbnQtc2l6ZTogMS40cmVtICFpbXBvcnRhbnQ7Ij4nKSkuY2FsbChlLG4oImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDIiKSwnPC9oMj5cbiAgPGEgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OyBjb2xvcjogYmxhY2sgIWltcG9ydGFudDsiIGhyZWY9Imh0dHBzOi8vdG93ZXIuanAvc2l0ZS9ob3d0by9mb3JpbnRlcm5hdGlvbmFsY3VzdG9tZXIiPlxuICA8c3BhbiBzdHlsZT0iZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICAgIGZvbnQtc2l6ZTogMS42cmVtICFpbXBvcnRhbnQ7XG4gICAgICBtYXJnaW46IDFyZW0gYXV0byAhaW1wb3J0YW50O1xuICAgICAgcGFkZGluZzogMXJlbSAhaW1wb3J0YW50O1xuICAgICAgZm9udC13ZWlnaHQ6IGJvbGQgIWltcG9ydGFudDtcbiAgICAgIG1heC13aWR0aDogNTAwcHggIWltcG9ydGFudDtcbiAgICAgIGJvcmRlcjogc29saWQgI2ZmY2EwMCAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmY2EwMCAhaW1wb3J0YW50O1xuICAgICAgY29sb3I6ICMwMDAwMDAgIWltcG9ydGFudDsiPicpKS5jYWxsKHQsbigidG93ZXJfanAubm90aWNlTW9kYWwuanVtYm90cm9uLnRleHQiKSwiPC9zcGFuPlxuICA8L2E+XG4gIDwvZGl2PlxuICA8L2Rpdj5cbiAgIil9fX0pLHplKWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pdGVtLWluZm8tbWFpbiAuc3RvY2stc3RhdHVzIikubGVuZ3RoPjAmJiLjgYrlj5bjgorlr4TjgZsiPT09ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLml0ZW0taW5mby1tYWluIC5zdG9jay1zdGF0dXMiKVswXS50ZXh0Q29udGVudCYmRmUuaXRlbU1vZGFsKGZ1bmN0aW9uKCl7dmFyIHQsZT1qZSgpO3JldHVybntib3R0b206e2h0bWw6bCgpKHQ9J1xuICA8ZGl2PlxuICA8cCBzdHlsZT0iY29sb3I6IHJlZCAhaW1wb3J0YW50O1xuICAgICAgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7XG4gICAgICBmb250LXdlaWdodDogYm9sZCAhaW1wb3J0YW50O1xuICAgICAgbGluZS1oZWlnaHQ6IDEgIWltcG9ydGFudDtcbiAgICAgIG1hcmdpbjogMC40ZW0gMCAhaW1wb3J0YW50OyI+Jy5jb25jYXQoZSgidG93ZXJfanAuaXRlbS5ib3R0b20udGl0bGUiKSwnPC9wPlxuICA8cCBzdHlsZT0iZm9udC1zaXplOiAxMXB4ICFpbXBvcnRhbnQ7XG4gICAgICB3aGl0ZS1zcGFjZTogcHJlLWxpbmUgIWltcG9ydGFudDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxLjIgIWltcG9ydGFudDtcbiAgICAgIHBhZGRpbmctYm90dG9tOiAwLjJlbSAhaW1wb3J0YW50OyI+JykpLmNhbGwodCxlKCJ0b3dlcl9qcC5pdGVtLmJvdHRvbS50ZXh0IiksIjwvcD5cbiAgPC9kaXY+XG4gICIpfX19KX0vdG93ZXJzaGlidXlhXC5qcFwva3BvcC8udGVzdCh3aW5kb3cubG9jYXRpb24uaHJlZik/KEZlLmxhdW5jaChmdW5jdGlvbigpe3JldHVybiJiYW5uZXItaGlkZGVuIn0pLEZlLmJhbm5lcihmdW5jdGlvbigpe3JldHVybntoaWRkZW46e2h0bWw6J1xuPGEgaHJlZj0iaHR0cHM6Ly9iaXQubHkvMllVbEtUZCI+XG48ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiAjNjQ2NTY3ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogNHB4IDRweCAwICFpbXBvcnRhbnQ7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7XG4gICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gICAgYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gICAgcmlnaHQ6IDEwcHggIWltcG9ydGFudDtcbiAgICBsZWZ0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogMTBweCAxMHB4IDAgMCAhaW1wb3J0YW50OyI+XG4gICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDZweCA3cHggNXB4IDdweCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDZweCA2cHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICA8aW1nIHNyYz0iaHR0cHM6Ly9jaGVja291dC1zdGF0aWMud29ybGRzaG9wcGluZy5qcC9pbWFnZXMvY29tbW9uL2Jhbm5lcl9oaWRkZW5faWNvbl9lbi5zdmciIGFsdD0iR2xvYmFsIFNoaXBwaW5nIiBzdHlsZT0id2lkdGg6IDUycHggIWltcG9ydGFudDsiPlxuICAgIDwvc3Bhbj5cbjwvZGl2PlxuPC9hPlxuJ319fSkpOi8odG93ZXJzaGlidXlhXC5qcCkvLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpJiYoRmUubGF1bmNoKGZ1bmN0aW9uKCl7cmV0dXJuImJhbm5lci1oaWRkZW4ifSksRmUuYmFubmVyKGZ1bmN0aW9uKCl7cmV0dXJue2hpZGRlbjp7aHRtbDonXG48YSBocmVmPSJodHRwczovL2JpdC5seS8zZ0x1NHVBIj5cbjxkaXYgc3R5bGU9ImJhY2tncm91bmQ6ICM2NDY1NjcgIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiA0cHggNHB4IDAgIWltcG9ydGFudDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDtcbiAgICBib3R0b206IDAgIWltcG9ydGFudDtcbiAgICByaWdodDogMTBweCAhaW1wb3J0YW50O1xuICAgIGxlZnQ6IGF1dG8gIWltcG9ydGFudDtcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4IDEwcHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogd2hpdGUgIWltcG9ydGFudDtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgIHdpZHRoOiA1MHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogNnB4IDdweCA1cHggN3B4ICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogNnB4IDZweCAwIDAgIWltcG9ydGFudDsiPlxuICAgIDxpbWcgc3JjPSJodHRwczovL2NoZWNrb3V0LXN0YXRpYy53b3JsZHNob3BwaW5nLmpwL2ltYWdlcy9jb21tb24vYmFubmVyX2hpZGRlbl9pY29uX2VuLnN2ZyIgYWx0PSJHbG9iYWwgU2hpcHBpbmciIHN0eWxlPSJ3aWR0aDogNTJweCAhaW1wb3J0YW50OyI+XG4gICAgPC9zcGFuPlxuPC9kaXY+XG48L2E+XG4nfX19KSksLyhtaWtpa2lcLnRva3lvXC5qcFwvKS8udGVzdCh3aW5kb3cubG9jYXRpb24uaHJlZikmJihGZS5sYXVuY2goZnVuY3Rpb24oKXtyZXR1cm4iYmFubmVyLWhpZGRlbiJ9KSxGZS5iYW5uZXIoZnVuY3Rpb24oKXtyZXR1cm57aGlkZGVuOntodG1sOidcbjxhIGhyZWY9Imh0dHBzOi8vYml0Lmx5LzMxSU56MkwiPlxuPGRpdiBzdHlsZT0iYmFja2dyb3VuZDogIzY0NjU2NyAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDRweCA0cHggIWltcG9ydGFudDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDtcbiAgICBib3R0b206IDEzMHB4ICFpbXBvcnRhbnQ7XG4gICAgcmlnaHQ6IC0yM3B4ICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogMTBweCAwIDAgMTBweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctcmlnaHQ6IDAgIWltcG9ydGFudDsiPlxuICAgIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50O1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gICAgd2lkdGg6IDUwcHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiA2cHggMjBweCA2cHggN3B4ICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogNnB4IDAgMCA2cHggIWltcG9ydGFudDsiPlxuICAgIDxpbWcgc3JjPSJodHRwczovL2NoZWNrb3V0LXN0YXRpYy53b3JsZHNob3BwaW5nLmpwL2ltYWdlcy9jb21tb24vYmFubmVyX2hpZGRlbl9pY29uX2VuLnN2ZyIgYWx0PSJHbG9iYWwgU2hpcHBpbmciIHN0eWxlPSJ3aWR0aDogNTJweCAhaW1wb3J0YW50OyBib3JkZXItcmFkaXVzOiA2cHggMCAwIDZweCAhaW1wb3J0YW50OyI+XG4gICAgPC9zcGFuPlxuPC9kaXY+XG48L2E+XG4nfX19KSksLyh0b3dlclwuanBcL3x0b3dlcnNoaWJ1eWFcLmpwXC98bWlraWtpXC50b2t5b1wuanBcLykvLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpJiZUZS5pbml0aWFsaXplKCkudGhlbihmdW5jdGlvbigpe3JldHVybiBGZS5ydW4oKX0pfV0pO30=
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
13.32.24.99
, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- server-13-32-24-99.fra56.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- ca3d163bab055381827226140568f3bef7eaac187cebd76878e0b63e9e442356
|
GET
H2
|
200
|
default
Show response
api.locize.io/60ff8224-bbcc-4802-8d59-c8983deae8d0/production/en/
|
11 KB
3 KB
|
281ms
168ms
|
XHR
application/json |
13.32.24.99
AMAZON-02
|
|
General
- Full URL
- https://api.locize.io/60ff8224-bbcc-4802-8d59-c8983deae8d0/production/en/default
- Requested by
- Host: text
URL: data:text/javascript;base64,ZnVuY3Rpb24gb25Mb2FkWmlnWmFnKCl7IWZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4ocil7aWYoZVtyXSlyZXR1cm4gZVtyXS5leHBvcnRzO3ZhciBvPWVbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9bi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxyKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxuLnI9ZnVuY3Rpb24odCl7InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiYib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pLDImZSYmInN0cmluZyIhPXR5cGVvZiB0KWZvcih2YXIgbyBpbiB0KW4uZChyLG8sZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxvKSk7cmV0dXJuIHJ9LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsImEiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPSIvIixuKG4ucz0zMDIpfShbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDUpLG89big0NSkuZixpPW4oODcpLGE9bigxKSxzPW4oMzIpLHU9bigxNyksYz1uKDE0KSxsPWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKGUsbixyKXtpZih0aGlzIGluc3RhbmNlb2YgdCl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGUsbil9cmV0dXJuIG5ldyB0KGUsbixyKX1yZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3JldHVybiBlLnByb3RvdHlwZT10LnByb3RvdHlwZSxlfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbixmLHAsaCxkLGcsdix5LG09dC50YXJnZXQsYj10Lmdsb2JhbCx4PXQuc3RhdCx3PXQucHJvdG8saz1iP3I6eD9yW21dOihyW21dfHx7fSkucHJvdG90eXBlLFM9Yj9hOmFbbV18fChhW21dPXt9KSxFPVMucHJvdG90eXBlO2ZvcihwIGluIGUpbj0haShiP3A6bSsoeD8iLiI6IiMiKStwLHQuZm9yY2VkKSYmayYmYyhrLHApLGQ9U1twXSxuJiYoZz10Lm5vVGFyZ2V0R2V0Pyh5PW8oayxwKSkmJnkudmFsdWU6a1twXSksaD1uJiZnP2c6ZVtwXSxuJiZ0eXBlb2YgZD09dHlwZW9mIGh8fCh2PXQuYmluZCYmbj9zKGgscik6dC53cmFwJiZuP2woaCk6dyYmImZ1bmN0aW9uIj09dHlwZW9mIGg/cyhGdW5jdGlvbi5jYWxsLGgpOmgsKHQuc2hhbXx8aCYmaC5zaGFtfHxkJiZkLnNoYW0pJiZ1KHYsInNoYW0iLCEwKSxTW3BdPXYsdyYmKGMoYSxmPW0rIlByb3RvdHlwZSIpfHx1KGEsZix7fSksYVtmXVtwXT1oLHQucmVhbCYmRSYmIUVbcF0mJnUoRSxwLGgpKSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz1uKDU4KSxpPW4oNzApLGE9big5NSkscz1yLlN5bWJvbCx1PW8oIndrcyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdVt0XXx8KHVbdF09YSYmc1t0XXx8KGE/czppKSgiU3ltYm9sLiIrdCkpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE0Nyl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEpLG89bigxNCksaT1uKDc1KSxhPW4oMjMpLmY7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXIuU3ltYm9sfHwoci5TeW1ib2w9e30pO28oZSx0KXx8YShlLHQse3ZhbHVlOmkuZih0KX0pfX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbihlKXt2YXIgbj0ib2JqZWN0IixyPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lk1hdGg9PU1hdGgmJnR9O3QuZXhwb3J0cz1yKHR5cGVvZiBnbG9iYWxUaGlzPT1uJiZnbG9iYWxUaGlzKXx8cih0eXBlb2Ygd2luZG93PT1uJiZ3aW5kb3cpfHxyKHR5cGVvZiBzZWxmPT1uJiZzZWxmKXx8cih0eXBlb2YgZT09biYmZSl8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9KS5jYWxsKHRoaXMsbig4NSkpfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt0cnl7cmV0dXJuISF0KCl9Y2F0Y2godCl7cmV0dXJuITB9fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0P251bGwhPT10OiJmdW5jdGlvbiI9PXR5cGVvZiB0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMzYpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjEzKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCFyKHQpKXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgYW4gb2JqZWN0Iik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNTQpO2Z1bmN0aW9uIG8odCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLHIodCxvLmtleSxvKX19dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZSYmbyh0LnByb3RvdHlwZSxlKSxuJiZvKHQsbiksdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpO3QuZXhwb3J0cz0hcihmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LGZ1bmN0aW9uKHQsZSl7dmFyIG49e30uaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uY2FsbCh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTY3KSxvPW4oOTcpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIHQuZXhwb3J0cz1pPW8/cjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fHIodCl9LGkoZSl9dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMTcpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMyksbz1uKDIzKSxpPW4oMzEpO3QuZXhwb3J0cz1yP2Z1bmN0aW9uKHQsZSxuKXtyZXR1cm4gby5mKHQsZSxpKDEsbikpfTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRbZV09bix0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiByW3QrIlByb3RvdHlwZSJdfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTc1KSxvPW4oMTc5KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1yKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmbyh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE1MCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY1KSxvPW4oNDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcihvKHQpKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgYSBmdW5jdGlvbiIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTMpLG89big4NiksaT1uKDExKSxhPW4oNTQpLHM9T2JqZWN0LmRlZmluZVByb3BlcnR5O2UuZj1yP3M6ZnVuY3Rpb24odCxlLG4pe2lmKGkodCksZT1hKGUsITApLGkobiksbyl0cnl7cmV0dXJuIHModCxlLG4pfWNhdGNoKHQpe31pZigiZ2V0ImluIG58fCJzZXQiaW4gbil0aHJvdyBUeXBlRXJyb3IoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuInZhbHVlImluIG4mJih0W2VdPW4udmFsdWUpLHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0Nik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qocih0KSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNjEpLG89bi5uKHIpO2Z1bmN0aW9uIGkodCl7dmFyIGU9d2luZG93LnppZ3phZztlJiZlLnV0aWxzLmRlYnVnTG9nZ2VyKCkobygpKHQpKX1lLmE9e2RlYnVnOmksZXJyb3I6ZnVuY3Rpb24odCl7dmFyIGU9d2luZG93LnppZ3phZztlJiZlLnV0aWxzJiZlLnV0aWxzLmVycm9yTG9nZ2VyJiZlLnV0aWxzLmVycm9yTG9nZ2VyKCkodCksaSh0KX19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTQzKX0sZnVuY3Rpb24odCxlKXt2YXIgbj17fS50b1N0cmluZzt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG4uY2FsbCh0KS5zbGljZSg4LC0xKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMykuZixvPW4oMTcpLGk9bigxNCksYT1uKDE4Nykscz1uKDIpKCJ0b1N0cmluZ1RhZyIpLHU9YSE9PXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixjKXtpZih0KXt2YXIgbD1uP3Q6dC5wcm90b3R5cGU7aShsLHMpfHxyKGwscyx7Y29uZmlndXJhYmxlOiEwLHZhbHVlOmV9KSxjJiZ1JiZvKGwsInRvU3RyaW5nIixhKX19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm57ZW51bWVyYWJsZTohKDEmdCksY29uZmlndXJhYmxlOiEoMiZ0KSx3cml0YWJsZTohKDQmdCksdmFsdWU6ZX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtpZihyKHQpLHZvaWQgMD09PWUpcmV0dXJuIHQ7c3dpdGNoKG4pe2Nhc2UgMDpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5jYWxsKGUpfTtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0LmNhbGwoZSxuKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihuLHIpe3JldHVybiB0LmNhbGwoZSxuLHIpfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKG4scixvKXtyZXR1cm4gdC5jYWxsKGUsbixyLG8pfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShlLGFyZ3VtZW50cyl9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMSksbz1uKDUpLGk9ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp2b2lkIDB9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/aShyW3RdKXx8aShvW3RdKTpyW3RdJiZyW3RdW2VdfHxvW3RdJiZvW3RdW2VdfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNjgpLG89TWF0aC5taW47dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0PjA/byhyKHQpLDkwMDcxOTkyNTQ3NDA5OTEpOjB9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTg0KS5jaGFyQXQsbz1uKDUwKSxpPW4oOTkpLGE9by5zZXQscz1vLmdldHRlckZvcigiU3RyaW5nIEl0ZXJhdG9yIik7aShTdHJpbmcsIlN0cmluZyIsZnVuY3Rpb24odCl7YSh0aGlzLHt0eXBlOiJTdHJpbmcgSXRlcmF0b3IiLHN0cmluZzpTdHJpbmcodCksaW5kZXg6MH0pfSxmdW5jdGlvbigpe3ZhciB0LGU9cyh0aGlzKSxuPWUuc3RyaW5nLG89ZS5pbmRleDtyZXR1cm4gbz49bi5sZW5ndGg/e3ZhbHVlOnZvaWQgMCxkb25lOiEwfToodD1yKG4sbyksZS5pbmRleCs9dC5sZW5ndGgse3ZhbHVlOnQsZG9uZTohMX0pfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbyl7byYmby5lbnVtZXJhYmxlP3RbZV09bjpyKHQsZSxuKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE4MCksbz1uKDIxMik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIWV8fCJvYmplY3QiIT09cihlKSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/byh0KTplfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIyNil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMjcpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjI5KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzMCl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMzEpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjM0KX0sZnVuY3Rpb24odCl7dC5leHBvcnRzPUpTT04ucGFyc2UoJ3sibG9jaXplIjp7InByb2R1Y3RJZCI6IjYwZmY4MjI0LWJiY2MtNDgwMi04ZDU5LWM4OTgzZGVhZThkMCIsImFwaUtleSI6IjczOTZlNzc4LTA5MDMtNGU3ZS04MjgyLWU2NzE1ODU4YmI4YyIsInZlcnNpb24iOiJwcm9kdWN0aW9uIn0sImludGVncmF0aW9ucyI6eyJjb2xvcm1lQXBwIjp7ImFwaSI6eyJwcm9kdWN0IjoiaHR0cHM6Ly9jb2xvcm1lLndvcmxkc2hvcHBpbmcuanAvdjEvcHJvZHVjdCJ9fSwic2hvcGlmeUFwcCI6eyJhcGkiOnsicHJvZHVjdCI6Imh0dHBzOi8vYXBwLXMud29ybGRzaG9wcGluZy5qcC92MS9wcm9kdWN0In19fSwibGFtYmRhIjp7ImNyZWF0ZSI6InNob3AtZGF0YS1wcm9kLWNyZWF0ZSIsImNsZWFyIjoic2hvcC1kYXRhLXByb2QtY2xlYXIifSwic2ZkYyI6eyJjb25uZWN0aW9uU2V0dGluZ3NQYXRoIjoiL3NmZGMvcHJvZC9hcGkifSwiZGVidWdIb3N0cyI6WyJzaG9wLWRhc2hib2FyZC53b3JsZHNob3BwaW5nLmJpeiIsInNob3AtZGFzaGJvYXJkLWRldi53b3JsZHNob3BwaW5nLmJpeiIsInNob3AtZGFzaGJvYXJkLWxvY2FsLndvcmxkc2hvcHBpbmcuYml6Il19Jyl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEzKSxvPW4oNjQpLGk9bigzMSksYT1uKDIxKSxzPW4oNTQpLHU9bigxNCksYz1uKDg2KSxsPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7ZS5mPXI/bDpmdW5jdGlvbih0LGUpe2lmKHQ9YSh0KSxlPXMoZSwhMCksYyl0cnl7cmV0dXJuIGwodCxlKX1jYXRjaCh0KXt9aWYodSh0LGUpKXJldHVybiBpKCFvLmYuY2FsbCh0LGUpLHRbZV0pfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYobnVsbD09dCl0aHJvdyBUeXBlRXJyb3IoIkNhbid0IGNhbGwgbWV0aG9kIG9uICIrdCk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDEzOSksaT1uKDY5KSxhPW4oNTYpLHM9big5MCksdT1uKDY2KSxjPW4oNTcpKCJJRV9QUk9UTyIpLGw9ZnVuY3Rpb24oKXt9LGY9ZnVuY3Rpb24oKXt2YXIgdCxlPXUoImlmcmFtZSIpLG49aS5sZW5ndGg7Zm9yKGUuc3R5bGUuZGlzcGxheT0ibm9uZSIscy5hcHBlbmRDaGlsZChlKSxlLnNyYz1TdHJpbmcoImphdmFzY3JpcHQ6IiksKHQ9ZS5jb250ZW50V2luZG93LmRvY3VtZW50KS5vcGVuKCksdC53cml0ZSgiPHNjcmlwdD5kb2N1bWVudC5GPU9iamVjdDxcL3NjcmlwdD4iKSx0LmNsb3NlKCksZj10LkY7bi0tOylkZWxldGUgZi5wcm90b3R5cGVbaVtuXV07cmV0dXJuIGYoKX07dC5leHBvcnRzPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uKHQsZSl7dmFyIG47cmV0dXJuIG51bGwhPT10PyhsLnByb3RvdHlwZT1yKHQpLG49bmV3IGwsbC5wcm90b3R5cGU9bnVsbCxuW2NdPXQpOm49ZigpLHZvaWQgMD09PWU/bjpvKG4sZSl9LGFbY109ITB9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI3KTt0LmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIkFycmF5Ij09cih0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0KSxvPW4oMjQpLGk9big1NyksYT1uKDk2KSxzPWkoIklFX1BST1RPIiksdT1PYmplY3QucHJvdG90eXBlO3QuZXhwb3J0cz1hP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXtyZXR1cm4gdD1vKHQpLHIodCxzKT90W3NdOiJmdW5jdGlvbiI9PXR5cGVvZiB0LmNvbnN0cnVjdG9yJiZ0IGluc3RhbmNlb2YgdC5jb25zdHJ1Y3Rvcj90LmNvbnN0cnVjdG9yLnByb3RvdHlwZTp0IGluc3RhbmNlb2YgT2JqZWN0P3U6bnVsbH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYT1uKDE4NSkscz1uKDUpLHU9big3KSxjPW4oMTcpLGw9bigxNCksZj1uKDU3KSxwPW4oNTYpLGg9cy5XZWFrTWFwO2lmKGEpe3ZhciBkPW5ldyBoLGc9ZC5nZXQsdj1kLmhhcyx5PWQuc2V0O3I9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS5jYWxsKGQsdCxlKSxlfSxvPWZ1bmN0aW9uKHQpe3JldHVybiBnLmNhbGwoZCx0KXx8e319LGk9ZnVuY3Rpb24odCl7cmV0dXJuIHYuY2FsbChkLHQpfX1lbHNle3ZhciBtPWYoInN0YXRlIik7cFttXT0hMCxyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGModCxtLGUpLGV9LG89ZnVuY3Rpb24odCl7cmV0dXJuIGwodCxtKT90W21dOnt9fSxpPWZ1bmN0aW9uKHQpe3JldHVybiBsKHQsbSl9fXQuZXhwb3J0cz17c2V0OnIsZ2V0Om8saGFzOmksZW5mb3JjZTpmdW5jdGlvbih0KXtyZXR1cm4gaSh0KT9vKHQpOnIodCx7fSl9LGdldHRlckZvcjpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG47aWYoIXUoZSl8fChuPW8oZSkpLnR5cGUhPT10KXRocm93IFR5cGVFcnJvcigiSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAiK3QrIiByZXF1aXJlZCIpO3JldHVybiBufX19fSxmdW5jdGlvbih0LGUsbil7bigxMDIpO3ZhciByPW4oMTg4KSxvPW4oNSksaT1uKDE3KSxhPW4oMzApLHM9bigyKSgidG9TdHJpbmdUYWciKTtmb3IodmFyIHUgaW4gcil7dmFyIGM9b1t1XSxsPWMmJmMucHJvdG90eXBlO2wmJiFsW3NdJiZpKGwscyx1KSxhW3VdPWEuQXJyYXl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3Niksbz1uKDMwKSxpPW4oMikoIml0ZXJhdG9yIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpcmV0dXJuIHRbaV18fHRbIkBAaXRlcmF0b3IiXXx8b1tyKHQpXX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMiksbz1mdW5jdGlvbih0KXt2YXIgZSxuO3RoaXMucHJvbWlzZT1uZXcgdChmdW5jdGlvbih0LHIpe2lmKHZvaWQgMCE9PWV8fHZvaWQgMCE9PW4pdGhyb3cgVHlwZUVycm9yKCJCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvciIpO2U9dCxuPXJ9KSx0aGlzLnJlc29sdmU9cihlKSx0aGlzLnJlamVjdD1yKG4pfTt0LmV4cG9ydHMuZj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IG8odCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZighcih0KSlyZXR1cm4gdDt2YXIgbixvO2lmKGUmJiJmdW5jdGlvbiI9PXR5cGVvZihuPXQudG9TdHJpbmcpJiYhcihvPW4uY2FsbCh0KSkpcmV0dXJuIG87aWYoImZ1bmN0aW9uIj09dHlwZW9mKG49dC52YWx1ZU9mKSYmIXIobz1uLmNhbGwodCkpKXJldHVybiBvO2lmKCFlJiYiZnVuY3Rpb24iPT10eXBlb2Yobj10LnRvU3RyaW5nKSYmIXIobz1uLmNhbGwodCkpKXJldHVybiBvO3Rocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big4OCksbz1uKDY5KTt0LmV4cG9ydHM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHQpe3JldHVybiByKHQsbyl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTgpLG89big3MCksaT1yKCJrZXlzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpW3RdfHwoaVt0XT1vKHQpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89bigxNDApLGk9bigyOCksYT1yWyJfX2NvcmUtanNfc2hhcmVkX18iXXx8bygiX19jb3JlLWpzX3NoYXJlZF9fIix7fSk7KHQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBhW3RdfHwoYVt0XT12b2lkIDAhPT1lP2U6e30pfSkoInZlcnNpb25zIixbXSkucHVzaCh7dmVyc2lvbjoiMy4yLjAiLG1vZGU6aT8icHVyZSI6Imdsb2JhbCIsY29weXJpZ2h0OiLCqSAyMDE5IERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpIn0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDExMiksaT1uKDM0KSxhPW4oMzIpLHM9big1MiksdT1uKDExMSksYz1mdW5jdGlvbih0LGUpe3RoaXMuc3RvcHBlZD10LHRoaXMucmVzdWx0PWV9Oyh0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbCxmKXt2YXIgcCxoLGQsZyx2LHksbT1hKGUsbixsPzI6MSk7aWYoZilwPXQ7ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2YoaD1zKHQpKSl0aHJvdyBUeXBlRXJyb3IoIlRhcmdldCBpcyBub3QgaXRlcmFibGUiKTtpZihvKGgpKXtmb3IoZD0wLGc9aSh0Lmxlbmd0aCk7Zz5kO2QrKylpZigodj1sP20ocih5PXRbZF0pWzBdLHlbMV0pOm0odFtkXSkpJiZ2IGluc3RhbmNlb2YgYylyZXR1cm4gdjtyZXR1cm4gbmV3IGMoITEpfXA9aC5jYWxsKHQpfWZvcig7ISh5PXAubmV4dCgpKS5kb25lOylpZigodj11KHAsbSx5LnZhbHVlLGwpKSYmdiBpbnN0YW5jZW9mIGMpcmV0dXJuIHY7cmV0dXJuIG5ldyBjKCExKX0pLnN0b3A9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBjKCEwLHQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybntlcnJvcjohMSx2YWx1ZTp0KCl9fWNhdGNoKHQpe3JldHVybntlcnJvcjohMCx2YWx1ZTp0fX19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTQxKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzNyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyODUpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLG89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixpPW8mJiFyLmNhbGwoezE6Mn0sMSk7ZS5mPWk/ZnVuY3Rpb24odCl7dmFyIGU9byh0aGlzLHQpO3JldHVybiEhZSYmZS5lbnVtZXJhYmxlfTpyfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2KSxvPW4oMjcpLGk9IiIuc3BsaXQ7dC5leHBvcnRzPXIoZnVuY3Rpb24oKXtyZXR1cm4hT2JqZWN0KCJ6IikucHJvcGVydHlJc0VudW1lcmFibGUoMCl9KT9mdW5jdGlvbih0KXtyZXR1cm4iU3RyaW5nIj09byh0KT9pLmNhbGwodCwiIik6T2JqZWN0KHQpfTpPYmplY3R9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89big3KSxpPXIuZG9jdW1lbnQsYT1vKGkpJiZvKGkuY3JlYXRlRWxlbWVudCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBhP2kuY3JlYXRlRWxlbWVudCh0KTp7fX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIxKSxvPW4oMzQpLGk9big4OSksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLGEpe3ZhciBzLHU9cihlKSxjPW8odS5sZW5ndGgpLGw9aShhLGMpO2lmKHQmJm4hPW4pe2Zvcig7Yz5sOylpZigocz11W2wrK10pIT1zKXJldHVybiEwfWVsc2UgZm9yKDtjPmw7bCsrKWlmKCh0fHxsIGluIHUpJiZ1W2xdPT09bilyZXR1cm4gdHx8bHx8MDtyZXR1cm4hdCYmLTF9fTt0LmV4cG9ydHM9e2luY2x1ZGVzOmEoITApLGluZGV4T2Y6YSghMSl9fSxmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguY2VpbCxyPU1hdGguZmxvb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0PSt0KT8wOih0PjA/cjpuKSh0KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPVsiY29uc3RydWN0b3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRvTG9jYWxlU3RyaW5nIiwidG9TdHJpbmciLCJ2YWx1ZU9mIl19LGZ1bmN0aW9uKHQsZSl7dmFyIG49MCxyPU1hdGgucmFuZG9tKCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiJTeW1ib2woIitTdHJpbmcodm9pZCAwPT09dD8iIjp0KSsiKV8iKygrK24rcikudG9TdHJpbmcoMzYpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDU0KSxvPW4oMjMpLGk9bigzMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgYT1yKGUpO2EgaW4gdD9vLmYodCxhLGkoMCxuKSk6dFthXT1ufX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNiksbz1uKDIpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiFyKGZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuKGUuY29uc3RydWN0b3I9e30pW29dPWZ1bmN0aW9uKCl7cmV0dXJue2ZvbzoxfX0sMSE9PWVbdF0oQm9vbGVhbikuZm9vfSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzMiksbz1uKDY1KSxpPW4oMjQpLGE9bigzNCkscz1uKDk0KSx1PVtdLnB1c2gsYz1mdW5jdGlvbih0KXt2YXIgZT0xPT10LG49Mj09dCxjPTM9PXQsbD00PT10LGY9Nj09dCxwPTU9PXR8fGY7cmV0dXJuIGZ1bmN0aW9uKGgsZCxnLHYpe2Zvcih2YXIgeSxtLGI9aShoKSx4PW8oYiksdz1yKGQsZywzKSxrPWEoeC5sZW5ndGgpLFM9MCxFPXZ8fHMsaj1lP0UoaCxrKTpuP0UoaCwwKTp2b2lkIDA7az5TO1MrKylpZigocHx8UyBpbiB4KSYmKG09dyh5PXhbU10sUyxiKSx0KSlpZihlKWpbU109bTtlbHNlIGlmKG0pc3dpdGNoKHQpe2Nhc2UgMzpyZXR1cm4hMDtjYXNlIDU6cmV0dXJuIHk7Y2FzZSA2OnJldHVybiBTO2Nhc2UgMjp1LmNhbGwoaix5KX1lbHNlIGlmKGwpcmV0dXJuITE7cmV0dXJuIGY/LTE6Y3x8bD9sOmp9fTt0LmV4cG9ydHM9e2ZvckVhY2g6YygwKSxtYXA6YygxKSxmaWx0ZXI6YygyKSxzb21lOmMoMyksZXZlcnk6Yyg0KSxmaW5kOmMoNSksZmluZEluZGV4OmMoNil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDE3NCk7dC5leHBvcnRzPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8KCJfX3Byb3RvX18iaW57fT9mdW5jdGlvbigpe3ZhciB0LGU9ITEsbj17fTt0cnl7KHQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCJfX3Byb3RvX18iKS5zZXQpLmNhbGwobixbXSksZT1uIGluc3RhbmNlb2YgQXJyYXl9Y2F0Y2godCl7fXJldHVybiBmdW5jdGlvbihuLGkpe3JldHVybiByKG4pLG8oaSksZT90LmNhbGwobixpKTpuLl9fcHJvdG9fXz1pLG59fSgpOnZvaWQgMCl9LGZ1bmN0aW9uKHQsZSxuKXtlLmY9bigyKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjcpLG89bigyKSgidG9TdHJpbmdUYWciKSxpPSJBcmd1bWVudHMiPT1yKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlLG4sYTtyZXR1cm4gdm9pZCAwPT09dD8iVW5kZWZpbmVkIjpudWxsPT09dD8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihuPWZ1bmN0aW9uKHQsZSl7dHJ5e3JldHVybiB0W2VdfWNhdGNoKHQpe319KGU9T2JqZWN0KHQpLG8pKT9uOmk/cihlKToiT2JqZWN0Ij09KGE9cihlKSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNhbGxlZT8iQXJndW1lbnRzIjphfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz0iXHRcblx2XGZcciDCoOGagOKAgOKAgeKAguKAg+KAhOKAheKAhuKAh+KAiOKAieKAiuKAr+KBn+OAgFx1MjAyOFx1MjAyOVx1ZmVmZiJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMzKTt0LmV4cG9ydHM9cigibmF2aWdhdG9yIiwidXNlckFnZW50Iil8fCIifSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjIyKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0Nyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNjMpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNzMpLG89bigyNzYpLGk9bigyODEpLGE9bigyODQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KXx8byh0KXx8aSh0KXx8YSgpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24odCl7bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIFJ9KSxuLmQoZSwiYiIsZnVuY3Rpb24oKXtyZXR1cm4gUH0pO3ZhciByPW4oMzgpLG89bi5uKHIpLGk9bigzOSksYT1uLm4oaSkscz1uKDQwKSx1PW4ubihzKSxjPW4oNDEpLGw9bi5uKGMpLGY9big0MikscD1uLm4oZiksaD1uKDQzKSxkPW4ubihoKSxnPW4oMTM0KSx2PW4ubihnKSx5PW4oNjMpLG09bi5uKHkpLGI9bigxNikseD1uLm4oYiksdz1uKDgpLGs9bi5uKHcpLFM9bigxMiksRT1uLm4oUyksaj1uKDEzNSksVD1uLm4oaiksTz1uKDI1KSxBPW4oNDQpO2Z1bmN0aW9uIEModCxlKXt2YXIgbjtpZih2b2lkIDA9PT1sLmF8fG51bGw9PXUoKSh0KSl7aWYoYSgpKHQpfHwobj1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKCF0KXJldHVybjtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIEwodCxlKTt2YXIgcj1kKCkobj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLmNhbGwobiw4LC0xKTsiT2JqZWN0Ij09PXImJnQuY29uc3RydWN0b3ImJihyPXQuY29uc3RydWN0b3IubmFtZSk7aWYoIk1hcCI9PT1yfHwiU2V0Ij09PXIpcmV0dXJuIHAoKSh0KTtpZigiQXJndW1lbnRzIj09PXJ8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKXJldHVybiBMKHQsZSl9KHQpKXx8ZSYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxpPWZ1bmN0aW9uKCl7fTtyZXR1cm57czppLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjppfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIHMsYz0hMCxmPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj1vKCkodCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1uLm5leHQoKTtyZXR1cm4gYz10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXtmPSEwLHM9dH0sZjpmdW5jdGlvbigpe3RyeXtjfHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKGYpdGhyb3cgc319fX1mdW5jdGlvbiBMKHQsZSl7KG51bGw9PWV8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9dmFyIFI9e2NvZGU6Ik5PTkUifSxQPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXt2YXIgbj10aGlzLHI9dC5zY3JhcGVyUmVzdWx0LG89dC5sb2NhdGlvbixpPXQuZGF0YTtrKCkodGhpcyxlKSx0aGlzLmV4Y2x1ZGVCeVNjcmFwZXJFcnJvcj1mdW5jdGlvbigpe3ZhciB0PW4uc2NyYXBlclJlc3VsdDtyZXR1cm4gdC5lcnJvcj97Y29kZToiRVJST1IiLG1lc3NhZ2U6ImV4Y2x1ZGVCeVNjcmFwZXJFcnJvcjogIi5jb25jYXQodC5lcnJvcil9OnQuaXRlbT8odC5za3VSb3dzfHwodC5za3VSb3dzPVtdKSxSKTp7Y29kZToiRVJST1IiLG1lc3NhZ2U6ImV4Y2x1ZGVCeVNjcmFwZXJFcnJvcjogbm8gaXRlbSJ9fSx0aGlzLmV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIG4uc2NyYXBlclJlc3VsdC5wdXJjaGFzYWJsZT9SOntjb2RlOiJOT1RfUFVSQ0hBU0FCTEUiLG1lc3NhZ2U6ImV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlIn19LHRoaXMuZXhjbHVkZUJ5U2t1WmVybz1mdW5jdGlvbigpe3JldHVybiBuLnNjcmFwZXJSZXN1bHQuc2t1Um93cyYmMD09PW4uc2NyYXBlclJlc3VsdC5za3VSb3dzLmxlbmd0aD97Y29kZToiTk9UX1BVUkNIQVNBQkxFIixtZXNzYWdlOiJleGNsdWRlQnlTa3VaZXJvIn06Un0sdGhpcy5leGNsdWRlQnlVcmw9ZnVuY3Rpb24oKXtpZigwPT09bi5ieVVybC5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9ZS53aW5kb3dMb2NhdGlvbkhyZWY7cmV0dXJuIG4uZXhjbHVkZShuLmJ5VXJsLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIl4iLmNvbmNhdChUKCkoeCgpKG49ZS51cmwpLmNhbGwobikpKSkudGVzdCh0KX0pfSx0aGlzLmV4Y2x1ZGVCeUl0ZW1OYW1lPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtTmFtZS5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9bi5zY3JhcGVyUmVzdWx0Lml0ZW0mJm4uc2NyYXBlclJlc3VsdC5pdGVtLm5hbWV8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUl0ZW1OYW1lLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIl4iLmNvbmNhdCh4KCkobj1lLml0ZW1OYW1lKS5jYWxsKG4pKSkudGVzdCh0KX0pfSx0aGlzLmV4Y2x1ZGVCeUl0ZW1Db2RlPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtQ29kZS5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9bi5zY3JhcGVyUmVzdWx0Lml0ZW0mJm4uc2NyYXBlclJlc3VsdC5pdGVtLmNvZGV8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUl0ZW1Db2RlLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIHgoKShuPWUuaXRlbUNvZGUpLmNhbGwobik9PT10fSl9LHRoaXMuZXhjbHVkZUJ5Q2F0ZWdvcnk9ZnVuY3Rpb24oKXtpZigwPT09bi5ieUNhdGVnb3J5Lmxlbmd0aClyZXR1cm4gUjt2YXIgdD1uLnNjcmFwZXJSZXN1bHQuaXRlbSYmbi5zY3JhcGVyUmVzdWx0Lml0ZW0uY2F0ZWdvcnl8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUNhdGVnb3J5LHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIHgoKShuPWUuY2F0ZWdvcnkpLmNhbGwobik9PT10fSl9LHRoaXMuZXhjbHVkZUJ5SXRlbURlc2NyaXB0aW9uPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtRGVzY3JpcHRpb24ubGVuZ3RoKXJldHVybiBSO3ZhciB0PW4uc2NyYXBlclJlc3VsdC5pdGVtJiZuLnNjcmFwZXJSZXN1bHQuaXRlbS5kZXNjcmlwdGlvbnx8IiI7cmV0dXJuIG4uZXhjbHVkZShuLmJ5SXRlbURlc2NyaXB0aW9uLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIiIuY29uY2F0KHgoKShuPWUudGV4dCkuY2FsbChuKSkpLnRlc3QodCl9KX0sdGhpcy5leGVjdXRlPWZ1bmN0aW9uKCl7dmFyIHQ9ITEsZT1bXSxyPW4uZXhjbHVkZUJ5U2NyYXBlckVycm9yKCk7aWYoIk5PTkUiIT09ci5jb2RlKXJldHVybntpc0V4Y2x1ZGVkOiEwLHJlYXNvbnM6W3JdfTsiTk9ORSIhPT0ocj1uLmV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlKCkpLmNvZGUmJih0PSEwLGUucHVzaChyKSk7dmFyIG8saT1DKG4uY29uZmlndXJlRXhjbHVzaW9uTWV0aG9kcyhbbi5leGNsdWRlQnlVcmwsbi5leGNsdWRlQnlJdGVtTmFtZSxuLmV4Y2x1ZGVCeUl0ZW1Db2RlLG4uZXhjbHVkZUJ5Q2F0ZWdvcnksbi5leGNsdWRlQnlJdGVtRGVzY3JpcHRpb25dKSk7dHJ5e2ZvcihpLnMoKTshKG89aS5uKCkpLmRvbmU7KXt2YXIgYT0oMCxvLnZhbHVlKSgpO2lmKCJOT05FIiE9PWEuY29kZSYmKHQ9ITAsZS5wdXNoKGEpKSwiRVJST1IiPT09YS5jb2RlKWJyZWFrfX1jYXRjaCh0KXtpLmUodCl9ZmluYWxseXtpLmYoKX1yZXR1cm57aXNFeGNsdWRlZDp0LHJlYXNvbnM6ZX19LHRoaXMuc2NyYXBlclJlc3VsdD1yLHRoaXMubG9jYXRpb249byx0aGlzLmRhdGE9aSx0aGlzLmJ5VXJsPWkuYnlVcmwsdGhpcy5ieUl0ZW1OYW1lPWkuYnlJdGVtTmFtZSx0aGlzLmJ5SXRlbUNvZGU9aS5ieUl0ZW1Db2RlLHRoaXMuYnlDYXRlZ29yeT1pLmJ5Q2F0ZWdvcnksdGhpcy5ieUl0ZW1EZXNjcmlwdGlvbj1pLmJ5SXRlbURlc2NyaXB0aW9ufXJldHVybiBFKCkoZSxbe2tleToiY29uZmlndXJlRXhjbHVzaW9uTWV0aG9kcyIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHR9fSx7a2V5OiJleGNsdWRlIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIFJ9fV0sW3trZXk6IndpbmRvd0xvY2F0aW9uSHJlZiIsZ2V0OmZ1bmN0aW9uKCl7dmFyIGUsbj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUscj13aW5kb3cubG9jYXRpb24uaHJlZjtpZihtKCkoZT1BLmRlYnVnSG9zdHMpLmNhbGwoZSxuKSl7dmFyIG89bmV3IHYuYSh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoInp6dXJsIik7aWYobyl0cnl7cj10LmZyb20obywiYmFzZTY0IikudG9TdHJpbmcoInV0Zi04Iil9Y2F0Y2godCl7Ty5hLmVycm9yKHQpfX1yZXR1cm4gcn19XSksZX0oKX0pLmNhbGwodGhpcyxuKDI5NCkuQnVmZmVyKX0sZnVuY3Rpb24odCxlKXt2YXIgbjtuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7dHJ5e249bnx8bmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9Y2F0Y2godCl7Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJihuPXdpbmRvdyl9dC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEzKSxvPW4oNiksaT1uKDY2KTt0LmV4cG9ydHM9IXImJiFvKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eShpKCJkaXYiKSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNiksbz0vI3xcLnByb3RvdHlwZVwuLyxpPWZ1bmN0aW9uKHQsZSl7dmFyIG49c1thKHQpXTtyZXR1cm4gbj09Y3x8biE9dSYmKCJmdW5jdGlvbiI9PXR5cGVvZiBlP3IoZSk6ISFlKX0sYT1pLm5vcm1hbGl6ZT1mdW5jdGlvbih0KXtyZXR1cm4gU3RyaW5nKHQpLnJlcGxhY2UobywiLiIpLnRvTG93ZXJDYXNlKCl9LHM9aS5kYXRhPXt9LHU9aS5OQVRJVkU9Ik4iLGM9aS5QT0xZRklMTD0iUCI7dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0KSxvPW4oMjEpLGk9big2NykuaW5kZXhPZixhPW4oNTYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuLHM9byh0KSx1PTAsYz1bXTtmb3IobiBpbiBzKSFyKGEsbikmJnIocyxuKSYmYy5wdXNoKG4pO2Zvcig7ZS5sZW5ndGg+dTspcihzLG49ZVt1KytdKSYmKH5pKGMsbil8fGMucHVzaChuKSk7cmV0dXJuIGN9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2OCksbz1NYXRoLm1heCxpPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPXIodCk7cmV0dXJuIG48MD9vKG4rZSwwKTppKG4sZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzMyk7dC5leHBvcnRzPXIoImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50Iil9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMiksbz1uKDcpLGk9W10uc2xpY2UsYT17fSxzPWZ1bmN0aW9uKHQsZSxuKXtpZighKGUgaW4gYSkpe2Zvcih2YXIgcj1bXSxvPTA7bzxlO28rKylyW29dPSJhWyIrbysiXSI7YVtlXT1GdW5jdGlvbigiQyxhIiwicmV0dXJuIG5ldyBDKCIrci5qb2luKCIsIikrIikiKX1yZXR1cm4gYVtlXSh0LG4pfTt0LmV4cG9ydHM9RnVuY3Rpb24uYmluZHx8ZnVuY3Rpb24odCl7dmFyIGU9cih0aGlzKSxuPWkuY2FsbChhcmd1bWVudHMsMSksYT1mdW5jdGlvbigpe3ZhciByPW4uY29uY2F0KGkuY2FsbChhcmd1bWVudHMpKTtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGE/cyhlLHIubGVuZ3RoLHIpOmUuYXBwbHkodCxyKX07cmV0dXJuIG8oZS5wcm90b3R5cGUpJiYoYS5wcm90b3R5cGU9ZS5wcm90b3R5cGUpLGF9fSxmdW5jdGlvbih0LGUpe2UuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDYpLGk9big0OCksYT1uKDcpLHM9bigyNCksdT1uKDM0KSxjPW4oNzEpLGw9big5NCksZj1uKDcyKSxwPW4oMikoImlzQ29uY2F0U3ByZWFkYWJsZSIpLGg9IW8oZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdFtwXT0hMSx0LmNvbmNhdCgpWzBdIT09dH0pLGQ9ZigiY29uY2F0IiksZz1mdW5jdGlvbih0KXtpZighYSh0KSlyZXR1cm4hMTt2YXIgZT10W3BdO3JldHVybiB2b2lkIDAhPT1lPyEhZTppKHQpfTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IWh8fCFkfSx7Y29uY2F0OmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYT1zKHRoaXMpLGY9bChhLDApLHA9MDtmb3IoZT0tMSxyPWFyZ3VtZW50cy5sZW5ndGg7ZTxyO2UrKylpZihpPS0xPT09ZT9hOmFyZ3VtZW50c1tlXSxnKGkpKXtpZihwKyhvPXUoaS5sZW5ndGgpKT45MDA3MTk5MjU0NzQwOTkxKXRocm93IFR5cGVFcnJvcigiTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkIik7Zm9yKG49MDtuPG87bisrLHArKyluIGluIGkmJmMoZixwLGlbbl0pfWVsc2V7aWYocD49OTAwNzE5OTI1NDc0MDk5MSl0aHJvdyBUeXBlRXJyb3IoIk1heGltdW0gYWxsb3dlZCBpbmRleCBleGNlZWRlZCIpO2MoZixwKyssaSl9cmV0dXJuIGYubGVuZ3RoPXAsZn19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNyksbz1uKDQ4KSxpPW4oMikoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gbyh0KSYmKCJmdW5jdGlvbiIhPXR5cGVvZihuPXQuY29uc3RydWN0b3IpfHxuIT09QXJyYXkmJiFvKG4ucHJvdG90eXBlKT9yKG4pJiZudWxsPT09KG49bltpXSkmJihuPXZvaWQgMCk6bj12b2lkIDApLG5ldyh2b2lkIDA9PT1uP0FycmF5Om4pKDA9PT1lPzA6ZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2KTt0LmV4cG9ydHM9ISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYhcihmdW5jdGlvbigpe3JldHVybiFTdHJpbmcoU3ltYm9sKCkpfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpO3QuZXhwb3J0cz0hcihmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPW51bGwsT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyB0KSE9PXQucHJvdG90eXBlfSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzEpfSxmdW5jdGlvbih0LGUsbil7big0KSgiaXRlcmF0b3IiKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89bigxMDApLGk9big0OSksYT1uKDc0KSxzPW4oMjkpLHU9bigxNyksYz1uKDM2KSxsPW4oMiksZj1uKDI4KSxwPW4oMzApLGg9bigxMDEpLGQ9aC5JdGVyYXRvclByb3RvdHlwZSxnPWguQlVHR1lfU0FGQVJJX0lURVJBVE9SUyx2PWwoIml0ZXJhdG9yIikseT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbCxoLG0sYil7byhuLGUsbCk7dmFyIHgsdyxrLFM9ZnVuY3Rpb24odCl7aWYodD09PWgmJkEpcmV0dXJuIEE7aWYoIWcmJnQgaW4gVClyZXR1cm4gVFt0XTtzd2l0Y2godCl7Y2FzZSJrZXlzIjpjYXNlInZhbHVlcyI6Y2FzZSJlbnRyaWVzIjpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcyx0KX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMpfX0sRT1lKyIgSXRlcmF0b3IiLGo9ITEsVD10LnByb3RvdHlwZSxPPVRbdl18fFRbIkBAaXRlcmF0b3IiXXx8aCYmVFtoXSxBPSFnJiZPfHxTKGgpLEM9IkFycmF5Ij09ZSYmVC5lbnRyaWVzfHxPO2lmKEMmJih4PWkoQy5jYWxsKG5ldyB0KSksZCE9PU9iamVjdC5wcm90b3R5cGUmJngubmV4dCYmKGZ8fGkoeCk9PT1kfHwoYT9hKHgsZCk6ImZ1bmN0aW9uIiE9dHlwZW9mIHhbdl0mJnUoeCx2LHkpKSxzKHgsRSwhMCwhMCksZiYmKHBbRV09eSkpKSwidmFsdWVzIj09aCYmTyYmInZhbHVlcyIhPT1PLm5hbWUmJihqPSEwLEE9ZnVuY3Rpb24oKXtyZXR1cm4gTy5jYWxsKHRoaXMpfSksZiYmIWJ8fFRbdl09PT1BfHx1KFQsdixBKSxwW2VdPUEsaClpZih3PXt2YWx1ZXM6UygidmFsdWVzIiksa2V5czptP0E6Uygia2V5cyIpLGVudHJpZXM6UygiZW50cmllcyIpfSxiKWZvcihrIGluIHcpIWcmJiFqJiZrIGluIFR8fGMoVCxrLHdba10pO2Vsc2Ugcih7dGFyZ2V0OmUscHJvdG86ITAsZm9yY2VkOmd8fGp9LHcpO3JldHVybiB3fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDEwMSkuSXRlcmF0b3JQcm90b3R5cGUsbz1uKDQ3KSxpPW4oMzEpLGE9bigyOSkscz1uKDMwKSx1PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7dmFyIGM9ZSsiIEl0ZXJhdG9yIjtyZXR1cm4gdC5wcm90b3R5cGU9byhyLHtuZXh0OmkoMSxuKX0pLGEodCxjLCExLCEwKSxzW2NdPXUsdH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHIsbyxpLGE9big0OSkscz1uKDE3KSx1PW4oMTQpLGM9bigyKSxsPW4oMjgpLGY9YygiaXRlcmF0b3IiKSxwPSExO1tdLmtleXMmJigibmV4dCJpbihpPVtdLmtleXMoKSk/KG89YShhKGkpKSkhPT1PYmplY3QucHJvdG90eXBlJiYocj1vKTpwPSEwKSxudWxsPT1yJiYocj17fSksbHx8dShyLGYpfHxzKHIsZixmdW5jdGlvbigpe3JldHVybiB0aGlzfSksdC5leHBvcnRzPXtJdGVyYXRvclByb3RvdHlwZTpyLEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM6cH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMSksbz1uKDc3KSxpPW4oMzApLGE9big1MCkscz1uKDk5KSx1PWEuc2V0LGM9YS5nZXR0ZXJGb3IoIkFycmF5IEl0ZXJhdG9yIik7dC5leHBvcnRzPXMoQXJyYXksIkFycmF5IixmdW5jdGlvbih0LGUpe3UodGhpcyx7dHlwZToiQXJyYXkgSXRlcmF0b3IiLHRhcmdldDpyKHQpLGluZGV4OjAsa2luZDplfSl9LGZ1bmN0aW9uKCl7dmFyIHQ9Yyh0aGlzKSxlPXQudGFyZ2V0LG49dC5raW5kLHI9dC5pbmRleCsrO3JldHVybiFlfHxyPj1lLmxlbmd0aD8odC50YXJnZXQ9dm9pZCAwLHt2YWx1ZTp2b2lkIDAsZG9uZTohMH0pOiJrZXlzIj09bj97dmFsdWU6cixkb25lOiExfToidmFsdWVzIj09bj97dmFsdWU6ZVtyXSxkb25lOiExfTp7dmFsdWU6W3IsZVtyXV0sZG9uZTohMX19LCJ2YWx1ZXMiKSxpLkFyZ3VtZW50cz1pLkFycmF5LG8oImtleXMiKSxvKCJ2YWx1ZXMiKSxvKCJlbnRyaWVzIil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxODkpfSxmdW5jdGlvbih0LGUsbil7big5MyksbigxMDUpLG4oMTkwKSxuKDE5MiksbigxOTMpLG4oMTk0KSxuKDE5NSksbig5OCksbigxOTYpLG4oMTk3KSxuKDE5OCksbigxOTkpLG4oMjAwKSxuKDIwMSksbigyMDIpLG4oMjAzKSxuKDIwNCksbigyMDUpLG4oMjA2KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLlN5bWJvbH0sZnVuY3Rpb24odCxlKXt9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg4KSxvPW4oNjkpLmNvbmNhdCgibGVuZ3RoIiwicHJvdG90eXBlIik7ZS5mPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzfHxmdW5jdGlvbih0KXtyZXR1cm4gcih0LG8pfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDYpLG89IlsiK24oNzgpKyJdIixpPVJlZ0V4cCgiXiIrbytvKyIqIiksYT1SZWdFeHAobytvKyIqJCIpLHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPVN0cmluZyhyKGUpKTtyZXR1cm4gMSZ0JiYobj1uLnJlcGxhY2UoaSwiIikpLDImdCYmKG49bi5yZXBsYWNlKGEsIiIpKSxufX07dC5leHBvcnRzPXtzdGFydDpzKDEpLGVuZDpzKDIpLHRyaW06cygzKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKSxvPW4oNTIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1vKHQpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgaXRlcmFibGUiKTtyZXR1cm4gcihlLmNhbGwodCkpfX0sZnVuY3Rpb24odCxlLG4pe24oMjI4KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLkFycmF5LmlzQXJyYXl9LGZ1bmN0aW9uKHQsZSxuKXtuKDM1KSxuKDIzMik7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5BcnJheS5mcm9tfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLG8pe3RyeXtyZXR1cm4gbz9lKHIobilbMF0sblsxXSk6ZShuKX1jYXRjaChlKXt2YXIgaT10LnJldHVybjt0aHJvdyB2b2lkIDAhPT1pJiZyKGkuY2FsbCh0KSksZX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyKSxvPW4oMzApLGk9cigiaXRlcmF0b3IiKSxhPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQmJihvLkFycmF5PT09dHx8YVtpXT09PXQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMikoIml0ZXJhdG9yIiksbz0hMTt0cnl7dmFyIGk9MCxhPXtuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6ISFpKyt9fSxyZXR1cm46ZnVuY3Rpb24oKXtvPSEwfX07YVtyXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxBcnJheS5mcm9tKGEsZnVuY3Rpb24oKXt0aHJvdyAyfSl9Y2F0Y2godCl7fXQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKCFlJiYhbylyZXR1cm4hMTt2YXIgbj0hMTt0cnl7dmFyIGk9e307aVtyXT1mdW5jdGlvbigpe3JldHVybntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6bj0hMH19fX0sdChpKX1jYXRjaCh0KXt9cmV0dXJuIG59fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMzUpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LnNsaWNlO3JldHVybiB0PT09b3x8dCBpbnN0YW5jZW9mIEFycmF5JiZlPT09by5zbGljZT9yOmV9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oNSksaT1uKDc5KSxhPVtdLnNsaWNlLHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4yLG89cj9hLmNhbGwoYXJndW1lbnRzLDIpOnZvaWQgMDtyZXR1cm4gdChyP2Z1bmN0aW9uKCl7KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6RnVuY3Rpb24oZSkpLmFwcGx5KHRoaXMsbyl9OmUsbil9fTtyKHtnbG9iYWw6ITAsYmluZDohMCxmb3JjZWQ6L01TSUUgLlwuLy50ZXN0KGkpfSx7c2V0VGltZW91dDpzKG8uc2V0VGltZW91dCksc2V0SW50ZXJ2YWw6cyhvLnNldEludGVydmFsKX0pfSxmdW5jdGlvbih0LGUsbil7bigxMDUpLG4oMzUpLG4oNTEpLG4oMjU0KSxuKDEyMyksbigyNTgpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuUHJvbWlzZX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSk7dC5leHBvcnRzPXIuUHJvbWlzZX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciBvIGluIGUpbiYmbi51bnNhZmUmJnRbb10/dFtvXT1lW29dOnIodCxvLGVbb10sbik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgVHlwZUVycm9yKCJJbmNvcnJlY3QgIisobj9uKyIgIjoiIikrImludm9jYXRpb24iKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKSxvPW4oMjIpLGk9bigyKSgic3BlY2llcyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuLGE9cih0KS5jb25zdHJ1Y3RvcjtyZXR1cm4gdm9pZCAwPT09YXx8bnVsbD09KG49cihhKVtpXSk/ZTpvKG4pfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhPW4oNSkscz1uKDYpLHU9bigyNyksYz1uKDMyKSxsPW4oOTApLGY9big2NikscD1hLmxvY2F0aW9uLGg9YS5zZXRJbW1lZGlhdGUsZD1hLmNsZWFySW1tZWRpYXRlLGc9YS5wcm9jZXNzLHY9YS5NZXNzYWdlQ2hhbm5lbCx5PWEuRGlzcGF0Y2gsbT0wLGI9e30seD1mdW5jdGlvbih0KXtpZihiLmhhc093blByb3BlcnR5KHQpKXt2YXIgZT1iW3RdO2RlbGV0ZSBiW3RdLGUoKX19LHc9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7eCh0KX19LGs9ZnVuY3Rpb24odCl7eCh0LmRhdGEpfSxTPWZ1bmN0aW9uKHQpe2EucG9zdE1lc3NhZ2UodCsiIixwLnByb3RvY29sKyIvLyIrcC5ob3N0KX07aCYmZHx8KGg9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MTthcmd1bWVudHMubGVuZ3RoPm47KWUucHVzaChhcmd1bWVudHNbbisrXSk7cmV0dXJuIGJbKyttXT1mdW5jdGlvbigpeygiZnVuY3Rpb24iPT10eXBlb2YgdD90OkZ1bmN0aW9uKHQpKS5hcHBseSh2b2lkIDAsZSl9LHIobSksbX0sZD1mdW5jdGlvbih0KXtkZWxldGUgYlt0XX0sInByb2Nlc3MiPT11KGcpP3I9ZnVuY3Rpb24odCl7Zy5uZXh0VGljayh3KHQpKX06eSYmeS5ub3c/cj1mdW5jdGlvbih0KXt5Lm5vdyh3KHQpKX06dj8oaT0obz1uZXcgdikucG9ydDIsby5wb3J0MS5vbm1lc3NhZ2U9ayxyPWMoaS5wb3N0TWVzc2FnZSxpLDEpKTohYS5hZGRFdmVudExpc3RlbmVyfHwiZnVuY3Rpb24iIT10eXBlb2YgcG9zdE1lc3NhZ2V8fGEuaW1wb3J0U2NyaXB0c3x8cyhTKT9yPSJvbnJlYWR5c3RhdGVjaGFuZ2UiaW4gZigic2NyaXB0Iik/ZnVuY3Rpb24odCl7bC5hcHBlbmRDaGlsZChmKCJzY3JpcHQiKSkub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7bC5yZW1vdmVDaGlsZCh0aGlzKSx4KHQpfX06ZnVuY3Rpb24odCl7c2V0VGltZW91dCh3KHQpLDApfToocj1TLGEuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsaywhMSkpKSx0LmV4cG9ydHM9e3NldDpoLGNsZWFyOmR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDcpLGk9big1Myk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYocih0KSxvKGUpJiZlLmNvbnN0cnVjdG9yPT09dClyZXR1cm4gZTt2YXIgbj1pLmYodCk7cmV0dXJuKDAsbi5yZXNvbHZlKShlKSxuLnByb21pc2V9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDIyKSxpPW4oNTMpLGE9big2MCkscz1uKDU5KTtyKHt0YXJnZXQ6IlByb21pc2UiLHN0YXQ6ITB9LHthbGxTZXR0bGVkOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1pLmYoZSkscj1uLnJlc29sdmUsdT1uLnJlamVjdCxjPWEoZnVuY3Rpb24oKXt2YXIgbj1vKGUucmVzb2x2ZSksaT1bXSxhPTAsdT0xO3ModCxmdW5jdGlvbih0KXt2YXIgbz1hKysscz0hMTtpLnB1c2godm9pZCAwKSx1Kyssbi5jYWxsKGUsdCkudGhlbihmdW5jdGlvbih0KXtzfHwocz0hMCxpW29dPXtzdGF0dXM6ImZ1bGZpbGxlZCIsdmFsdWU6dH0sLS11fHxyKGkpKX0sZnVuY3Rpb24odCl7c3x8KHM9ITAsaVtvXT17c3RhdHVzOiJyZWplY3RlZCIscmVhc29uOnR9LC0tdXx8cihpKSl9KX0pLC0tdXx8cihpKX0pO3JldHVybiBjLmVycm9yJiZ1KGMudmFsdWUpLG4ucHJvbWlzZX19KX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXsobnVsbD09ZXx8ZT50Lmxlbmd0aCkmJihlPXQubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheShlKTtuPGU7bisrKXJbbl09dFtuXTtyZXR1cm4gcn19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNzcpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNTgpLG89bigxNjIpLGk9bigxNjYpO2Z1bmN0aW9uIGEoZSxuLHMpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgUmVmbGVjdCYmbz90LmV4cG9ydHM9YT1vOnQuZXhwb3J0cz1hPWZ1bmN0aW9uKHQsZSxuKXt2YXIgbz1pKHQsZSk7aWYobyl7dmFyIGE9cihvLGUpO3JldHVybiBhLmdldD9hLmdldC5jYWxsKG4pOmEudmFsdWV9fSxhKGUsbixzfHxlKX10LmV4cG9ydHM9YX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0MCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcjsKLyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuNC4xCiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiAyMDE5LTA1LTAxVDIxOjA0WgogKi8KLyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuNC4xCiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiAyMDE5LTA1LTAxVDIxOjA0WgogKi8KIWZ1bmN0aW9uKGUsbil7InVzZSBzdHJpY3QiOyJvYmplY3QiPT10eXBlb2YgdC5leHBvcnRzP3QuZXhwb3J0cz1lLmRvY3VtZW50P24oZSwhMCk6ZnVuY3Rpb24odCl7aWYoIXQuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIG4odCl9Om4oZSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKG4sbyl7InVzZSBzdHJpY3QiO3ZhciBpPVtdLGE9bi5kb2N1bWVudCxzPU9iamVjdC5nZXRQcm90b3R5cGVPZix1PWkuc2xpY2UsYz1pLmNvbmNhdCxsPWkucHVzaCxmPWkuaW5kZXhPZixwPXt9LGg9cC50b1N0cmluZyxkPXAuaGFzT3duUHJvcGVydHksZz1kLnRvU3RyaW5nLHY9Zy5jYWxsKE9iamVjdCkseT17fSxtPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYibnVtYmVyIiE9dHlwZW9mIHQubm9kZVR5cGV9LGI9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJnQ9PT10LndpbmRvd30seD17dHlwZTohMCxzcmM6ITAsbm9uY2U6ITAsbm9Nb2R1bGU6ITB9O2Z1bmN0aW9uIHcodCxlLG4pe3ZhciByLG8saT0obj1ufHxhKS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtpZihpLnRleHQ9dCxlKWZvcihyIGluIHgpKG89ZVtyXXx8ZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKHIpKSYmaS5zZXRBdHRyaWJ1dGUocixvKTtuLmhlYWQuYXBwZW5kQ2hpbGQoaSkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChpKX1mdW5jdGlvbiBrKHQpe3JldHVybiBudWxsPT10P3QrIiI6Im9iamVjdCI9PXR5cGVvZiB0fHwiZnVuY3Rpb24iPT10eXBlb2YgdD9wW2guY2FsbCh0KV18fCJvYmplY3QiOnR5cGVvZiB0fXZhciBTPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBTLmZuLmluaXQodCxlKX0sRT0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7ZnVuY3Rpb24gaih0KXt2YXIgZT0hIXQmJiJsZW5ndGgiaW4gdCYmdC5sZW5ndGgsbj1rKHQpO3JldHVybiFtKHQpJiYhYih0KSYmKCJhcnJheSI9PT1ufHwwPT09ZXx8Im51bWJlciI9PXR5cGVvZiBlJiZlPjAmJmUtMSBpbiB0KX1TLmZuPVMucHJvdG90eXBlPXtqcXVlcnk6IjMuNC4xIixjb25zdHJ1Y3RvcjpTLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdS5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dS5jYWxsKHRoaXMpOnQ8MD90aGlzW3QrdGhpcy5sZW5ndGhdOnRoaXNbdF19LHB1c2hTdGFjazpmdW5jdGlvbih0KXt2YXIgZT1TLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSx0KTtyZXR1cm4gZS5wcmV2T2JqZWN0PXRoaXMsZX0sZWFjaDpmdW5jdGlvbih0KXtyZXR1cm4gUy5lYWNoKHRoaXMsdCl9LG1hcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy5tYXAodGhpcyxmdW5jdGlvbihlLG4pe3JldHVybiB0LmNhbGwoZSxuLGUpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayh1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGVxOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubGVuZ3RoLG49K3QrKHQ8MD9lOjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhuPj0wJiZuPGU/W3RoaXNbbl1dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcigpfSxwdXNoOmwsc29ydDppLnNvcnQsc3BsaWNlOmkuc3BsaWNlfSxTLmV4dGVuZD1TLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciB0LGUsbixyLG8saSxhPWFyZ3VtZW50c1swXXx8e30scz0xLHU9YXJndW1lbnRzLmxlbmd0aCxjPSExO2ZvcigiYm9vbGVhbiI9PXR5cGVvZiBhJiYoYz1hLGE9YXJndW1lbnRzW3NdfHx7fSxzKyspLCJvYmplY3QiPT10eXBlb2YgYXx8bShhKXx8KGE9e30pLHM9PT11JiYoYT10aGlzLHMtLSk7czx1O3MrKylpZihudWxsIT0odD1hcmd1bWVudHNbc10pKWZvcihlIGluIHQpcj10W2VdLCJfX3Byb3RvX18iIT09ZSYmYSE9PXImJihjJiZyJiYoUy5pc1BsYWluT2JqZWN0KHIpfHwobz1BcnJheS5pc0FycmF5KHIpKSk/KG49YVtlXSxpPW8mJiFBcnJheS5pc0FycmF5KG4pP1tdOm98fFMuaXNQbGFpbk9iamVjdChuKT9uOnt9LG89ITEsYVtlXT1TLmV4dGVuZChjLGkscikpOnZvaWQgMCE9PXImJihhW2VdPXIpKTtyZXR1cm4gYX0sUy5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKCIzLjQuMSIrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IodCl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24odCl7dmFyIGUsbjtyZXR1cm4hKCF0fHwiW29iamVjdCBPYmplY3RdIiE9PWguY2FsbCh0KSkmJighKGU9cyh0KSl8fCJmdW5jdGlvbiI9PXR5cGVvZihuPWQuY2FsbChlLCJjb25zdHJ1Y3RvciIpJiZlLmNvbnN0cnVjdG9yKSYmZy5jYWxsKG4pPT09dil9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24odCl7dmFyIGU7Zm9yKGUgaW4gdClyZXR1cm4hMTtyZXR1cm4hMH0sZ2xvYmFsRXZhbDpmdW5jdGlvbih0LGUpe3codCx7bm9uY2U6ZSYmZS5ub25jZX0pfSxlYWNoOmZ1bmN0aW9uKHQsZSl7dmFyIG4scj0wO2lmKGoodCkpZm9yKG49dC5sZW5ndGg7cjxuJiYhMSE9PWUuY2FsbCh0W3JdLHIsdFtyXSk7cisrKTtlbHNlIGZvcihyIGluIHQpaWYoITE9PT1lLmNhbGwodFtyXSxyLHRbcl0pKWJyZWFrO3JldHVybiB0fSx0cmltOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyIiOih0KyIiKS5yZXBsYWNlKEUsIiIpfSxtYWtlQXJyYXk6ZnVuY3Rpb24odCxlKXt2YXIgbj1lfHxbXTtyZXR1cm4gbnVsbCE9dCYmKGooT2JqZWN0KHQpKT9TLm1lcmdlKG4sInN0cmluZyI9PXR5cGVvZiB0P1t0XTp0KTpsLmNhbGwobix0KSksbn0saW5BcnJheTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIG51bGw9PWU/LTE6Zi5jYWxsKGUsdCxuKX0sbWVyZ2U6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49K2UubGVuZ3RoLHI9MCxvPXQubGVuZ3RoO3I8bjtyKyspdFtvKytdPWVbcl07cmV0dXJuIHQubGVuZ3RoPW8sdH0sZ3JlcDpmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPVtdLG89MCxpPXQubGVuZ3RoLGE9IW47bzxpO28rKykhZSh0W29dLG8pIT09YSYmci5wdXNoKHRbb10pO3JldHVybiByfSxtYXA6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saT0wLGE9W107aWYoaih0KSlmb3Iocj10Lmxlbmd0aDtpPHI7aSsrKW51bGwhPShvPWUodFtpXSxpLG4pKSYmYS5wdXNoKG8pO2Vsc2UgZm9yKGkgaW4gdCludWxsIT0obz1lKHRbaV0saSxuKSkmJmEucHVzaChvKTtyZXR1cm4gYy5hcHBseShbXSxhKX0sZ3VpZDoxLHN1cHBvcnQ6eX0pLCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJihTLmZuW1N5bWJvbC5pdGVyYXRvcl09aVtTeW1ib2wuaXRlcmF0b3JdKSxTLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sIi5zcGxpdCgiICIpLGZ1bmN0aW9uKHQsZSl7cFsiW29iamVjdCAiK2UrIl0iXT1lLnRvTG93ZXJDYXNlKCl9KTt2YXIgVD0KLyohCiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIHYyLjMuNAogKiBodHRwczovL3NpenpsZWpzLmNvbS8KICoKICogQ29weXJpZ2h0IEpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKICogaHR0cHM6Ly9qcy5mb3VuZGF0aW9uLwogKgogKiBEYXRlOiAyMDE5LTA0LTA4CiAqLwpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbyxpLGEscyx1LGMsbCxmLHAsaCxkLGcsdix5LG0sYix4PSJzaXp6bGUiKzEqbmV3IERhdGUsdz10LmRvY3VtZW50LGs9MCxTPTAsRT11dCgpLGo9dXQoKSxUPXV0KCksTz11dCgpLEE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWUmJihmPSEwKSwwfSxDPXt9Lmhhc093blByb3BlcnR5LEw9W10sUj1MLnBvcCxQPUwucHVzaCxOPUwucHVzaCxJPUwuc2xpY2UsXz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylpZih0W25dPT09ZSlyZXR1cm4gbjtyZXR1cm4tMX0sRD0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLE09IltcXHgyMFxcdFxcclxcblxcZl0iLFU9Iig/OlxcXFwufFtcXHctXXxbXlwwLVxceGEwXSkrIixCPSJcXFsiK00rIiooIitVKyIpKD86IitNKyIqKFsqXiR8IX5dPz0pIitNKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrVSsiKSl8KSIrTSsiKlxcXSIscT0iOigiK1UrIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK0IrIikqKXwuKilcXCl8KSIsRj1uZXcgUmVnRXhwKE0rIisiLCJnIiksSD1uZXcgUmVnRXhwKCJeIitNKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK00rIiskIiwiZyIpLHo9bmV3IFJlZ0V4cCgiXiIrTSsiKiwiK00rIioiKSxXPW5ldyBSZWdFeHAoIl4iK00rIiooWz4rfl18IitNKyIpIitNKyIqIiksJD1uZXcgUmVnRXhwKE0rInw+IiksWT1uZXcgUmVnRXhwKHEpLFY9bmV3IFJlZ0V4cCgiXiIrVSsiJCIpLEc9e0lEOm5ldyBSZWdFeHAoIl4jKCIrVSsiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIitVKyIpIiksVEFHOm5ldyBSZWdFeHAoIl4oIitVKyJ8WypdKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrQiksUFNFVURPOm5ldyBSZWdFeHAoIl4iK3EpLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTSsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTSsiKig/OihbKy1dfCkiK00rIiooXFxkKyl8KSkiK00rIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK0QrIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitNKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK00rIiooKD86LVxcZCk/XFxkKikiK00rIipcXCl8KSg/PVteLV18JCkiLCJpIil9LEs9L0hUTUwkL2ksWD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLEo9L15oXGQkL2ksUT0vXltee10rXHtccypcW25hdGl2ZSBcdy8sWj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLHR0PS9bK35dLyxldD1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK00rIj98KCIrTSsiKXwuKSIsImlnIiksbnQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPSIweCIrZS02NTUzNjtyZXR1cm4gciE9cnx8bj9lOnI8MD9TdHJpbmcuZnJvbUNoYXJDb2RlKHIrNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUocj4+MTB8NTUyOTYsMTAyMyZyfDU2MzIwKX0scnQ9LyhbXDAtXHgxZlx4N2ZdfF4tP1xkKXxeLSR8W15cMC1ceDFmXHg3Zi1cdUZGRkZcdy1dL2csb3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT8iXDAiPT09dD8i77+9Ijp0LnNsaWNlKDAsLTEpKyJcXCIrdC5jaGFyQ29kZUF0KHQubGVuZ3RoLTEpLnRvU3RyaW5nKDE2KSsiICI6IlxcIit0fSxpdD1mdW5jdGlvbigpe3AoKX0sYXQ9eHQoZnVuY3Rpb24odCl7cmV0dXJuITA9PT10LmRpc2FibGVkJiYiZmllbGRzZXQiPT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpfSx7ZGlyOiJwYXJlbnROb2RlIixuZXh0OiJsZWdlbmQifSk7dHJ5e04uYXBwbHkoTD1JLmNhbGwody5jaGlsZE5vZGVzKSx3LmNoaWxkTm9kZXMpLExbdy5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2godCl7Tj17YXBwbHk6TC5sZW5ndGg/ZnVuY3Rpb24odCxlKXtQLmFwcGx5KHQsSS5jYWxsKGUpKX06ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5sZW5ndGgscj0wO3RbbisrXT1lW3IrK107KTt0Lmxlbmd0aD1uLTF9fX1mdW5jdGlvbiBzdCh0LGUscixvKXt2YXIgaSxzLGMsbCxmLGQseSxtPWUmJmUub3duZXJEb2N1bWVudCxrPWU/ZS5ub2RlVHlwZTo5O2lmKHI9cnx8W10sInN0cmluZyIhPXR5cGVvZiB0fHwhdHx8MSE9PWsmJjkhPT1rJiYxMSE9PWspcmV0dXJuIHI7aWYoIW8mJigoZT9lLm93bmVyRG9jdW1lbnR8fGU6dykhPT1oJiZwKGUpLGU9ZXx8aCxnKSl7aWYoMTEhPT1rJiYoZj1aLmV4ZWModCkpKWlmKGk9ZlsxXSl7aWYoOT09PWspe2lmKCEoYz1lLmdldEVsZW1lbnRCeUlkKGkpKSlyZXR1cm4gcjtpZihjLmlkPT09aSlyZXR1cm4gci5wdXNoKGMpLHJ9ZWxzZSBpZihtJiYoYz1tLmdldEVsZW1lbnRCeUlkKGkpKSYmYihlLGMpJiZjLmlkPT09aSlyZXR1cm4gci5wdXNoKGMpLHJ9ZWxzZXtpZihmWzJdKXJldHVybiBOLmFwcGx5KHIsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KSkscjtpZigoaT1mWzNdKSYmbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIE4uYXBwbHkocixlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaSkpLHJ9aWYobi5xc2EmJiFPW3QrIiAiXSYmKCF2fHwhdi50ZXN0KHQpKSYmKDEhPT1rfHwib2JqZWN0IiE9PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpe2lmKHk9dCxtPWUsMT09PWsmJiQudGVzdCh0KSl7Zm9yKChsPWUuZ2V0QXR0cmlidXRlKCJpZCIpKT9sPWwucmVwbGFjZShydCxvdCk6ZS5zZXRBdHRyaWJ1dGUoImlkIixsPXgpLHM9KGQ9YSh0KSkubGVuZ3RoO3MtLTspZFtzXT0iIyIrbCsiICIrYnQoZFtzXSk7eT1kLmpvaW4oIiwiKSxtPXR0LnRlc3QodCkmJnl0KGUucGFyZW50Tm9kZSl8fGV9dHJ5e3JldHVybiBOLmFwcGx5KHIsbS5xdWVyeVNlbGVjdG9yQWxsKHkpKSxyfWNhdGNoKGUpe08odCwhMCl9ZmluYWxseXtsPT09eCYmZS5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gdSh0LnJlcGxhY2UoSCwiJDEiKSxlLHIsbyl9ZnVuY3Rpb24gdXQoKXt2YXIgdD1bXTtyZXR1cm4gZnVuY3Rpb24gZShuLG8pe3JldHVybiB0LnB1c2gobisiICIpPnIuY2FjaGVMZW5ndGgmJmRlbGV0ZSBlW3Quc2hpZnQoKV0sZVtuKyIgIl09b319ZnVuY3Rpb24gY3QodCl7cmV0dXJuIHRbeF09ITAsdH1mdW5jdGlvbiBsdCh0KXt2YXIgZT1oLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0Iik7dHJ5e3JldHVybiEhdChlKX1jYXRjaCh0KXtyZXR1cm4hMX1maW5hbGx5e2UucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLGU9bnVsbH19ZnVuY3Rpb24gZnQodCxlKXtmb3IodmFyIG49dC5zcGxpdCgifCIpLG89bi5sZW5ndGg7by0tOylyLmF0dHJIYW5kbGVbbltvXV09ZX1mdW5jdGlvbiBwdCh0LGUpe3ZhciBuPWUmJnQscj1uJiYxPT09dC5ub2RlVHlwZSYmMT09PWUubm9kZVR5cGUmJnQuc291cmNlSW5kZXgtZS5zb3VyY2VJbmRleDtpZihyKXJldHVybiByO2lmKG4pZm9yKDtuPW4ubmV4dFNpYmxpbmc7KWlmKG49PT1lKXJldHVybi0xO3JldHVybiB0PzE6LTF9ZnVuY3Rpb24gaHQodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJmUudHlwZT09PXR9fWZ1bmN0aW9uIGR0KHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1ufHwiYnV0dG9uIj09PW4pJiZlLnR5cGU9PT10fX1mdW5jdGlvbiBndCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuImZvcm0iaW4gZT9lLnBhcmVudE5vZGUmJiExPT09ZS5kaXNhYmxlZD8ibGFiZWwiaW4gZT8ibGFiZWwiaW4gZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS5kaXNhYmxlZD09PXQ6ZS5kaXNhYmxlZD09PXQ6ZS5pc0Rpc2FibGVkPT09dHx8ZS5pc0Rpc2FibGVkIT09IXQmJmF0KGUpPT09dDplLmRpc2FibGVkPT09dDoibGFiZWwiaW4gZSYmZS5kaXNhYmxlZD09PXR9fWZ1bmN0aW9uIHZ0KHQpe3JldHVybiBjdChmdW5jdGlvbihlKXtyZXR1cm4gZT0rZSxjdChmdW5jdGlvbihuLHIpe2Zvcih2YXIgbyxpPXQoW10sbi5sZW5ndGgsZSksYT1pLmxlbmd0aDthLS07KW5bbz1pW2FdXSYmKG5bb109IShyW29dPW5bb10pKX0pfSl9ZnVuY3Rpb24geXQodCl7cmV0dXJuIHQmJnZvaWQgMCE9PXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJnR9Zm9yKGUgaW4gbj1zdC5zdXBwb3J0PXt9LGk9c3QuaXNYTUw9ZnVuY3Rpb24odCl7dmFyIGU9dC5uYW1lc3BhY2VVUkksbj0odC5vd25lckRvY3VtZW50fHx0KS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIUsudGVzdChlfHxuJiZuLm5vZGVOYW1lfHwiSFRNTCIpfSxwPXN0LnNldERvY3VtZW50PWZ1bmN0aW9uKHQpe3ZhciBlLG8sYT10P3Qub3duZXJEb2N1bWVudHx8dDp3O3JldHVybiBhIT09aCYmOT09PWEubm9kZVR5cGUmJmEuZG9jdW1lbnRFbGVtZW50PyhkPShoPWEpLmRvY3VtZW50RWxlbWVudCxnPSFpKGgpLHchPT1oJiYobz1oLmRlZmF1bHRWaWV3KSYmby50b3AhPT1vJiYoby5hZGRFdmVudExpc3RlbmVyP28uYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixpdCwhMSk6by5hdHRhY2hFdmVudCYmby5hdHRhY2hFdmVudCgib251bmxvYWQiLGl0KSksbi5hdHRyaWJ1dGVzPWx0KGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTmFtZT0iaSIsIXQuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKX0pLG4uZ2V0RWxlbWVudHNCeVRhZ05hbWU9bHQoZnVuY3Rpb24odCl7cmV0dXJuIHQuYXBwZW5kQ2hpbGQoaC5jcmVhdGVDb21tZW50KCIiKSksIXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSxuLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9US50ZXN0KGguZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSksbi5nZXRCeUlkPWx0KGZ1bmN0aW9uKHQpe3JldHVybiBkLmFwcGVuZENoaWxkKHQpLmlkPXgsIWguZ2V0RWxlbWVudHNCeU5hbWV8fCFoLmdldEVsZW1lbnRzQnlOYW1lKHgpLmxlbmd0aH0pLG4uZ2V0QnlJZD8oci5maWx0ZXIuSUQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKGV0LG50KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlKCJpZCIpPT09ZX19LHIuZmluZC5JRD1mdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PWUuZ2V0RWxlbWVudEJ5SWQmJmcpe3ZhciBuPWUuZ2V0RWxlbWVudEJ5SWQodCk7cmV0dXJuIG4/W25dOltdfX0pOihyLmZpbHRlci5JRD1mdW5jdGlvbih0KXt2YXIgZT10LnJlcGxhY2UoZXQsbnQpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj12b2lkIDAhPT10LmdldEF0dHJpYnV0ZU5vZGUmJnQuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gbiYmbi52YWx1ZT09PWV9fSxyLmZpbmQuSUQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1lLmdldEVsZW1lbnRCeUlkJiZnKXt2YXIgbixyLG8saT1lLmdldEVsZW1lbnRCeUlkKHQpO2lmKGkpe2lmKChuPWkuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSkmJm4udmFsdWU9PT10KXJldHVybltpXTtmb3Iobz1lLmdldEVsZW1lbnRzQnlOYW1lKHQpLHI9MDtpPW9bcisrXTspaWYoKG49aS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PXQpcmV0dXJuW2ldfXJldHVybltdfX0pLHIuZmluZC5UQUc9bi5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDAhPT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCk6bi5xc2E/ZS5xdWVyeVNlbGVjdG9yQWxsKHQpOnZvaWQgMH06ZnVuY3Rpb24odCxlKXt2YXIgbixyPVtdLG89MCxpPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCk7aWYoIioiPT09dCl7Zm9yKDtuPWlbbysrXTspMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gaX0sci5maW5kLkNMQVNTPW4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1lLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmcpcmV0dXJuIGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh0KX0seT1bXSx2PVtdLChuLnFzYT1RLnRlc3QoaC5xdWVyeVNlbGVjdG9yQWxsKSkmJihsdChmdW5jdGlvbih0KXtkLmFwcGVuZENoaWxkKHQpLmlubmVySFRNTD0iPGEgaWQ9JyIreCsiJz48L2E+PHNlbGVjdCBpZD0nIit4KyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLHQucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnYucHVzaCgiWypeJF09IitNKyIqKD86Jyd8XCJcIikiKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHYucHVzaCgiXFxbIitNKyIqKD86dmFsdWV8IitEKyIpIiksdC5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIreCsiLV0iKS5sZW5ndGh8fHYucHVzaCgifj0iKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHx2LnB1c2goIjpjaGVja2VkIiksdC5xdWVyeVNlbGVjdG9yQWxsKCJhIyIreCsiKyoiKS5sZW5ndGh8fHYucHVzaCgiLiMuK1srfl0iKX0pLGx0KGZ1bmN0aW9uKHQpe3QuaW5uZXJIVE1MPSI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iO3ZhciBlPWguY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtlLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLHQuYXBwZW5kQ2hpbGQoZSkuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLHQucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnYucHVzaCgibmFtZSIrTSsiKlsqXiR8IX5dPz0iKSwyIT09dC5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCYmdi5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGQuYXBwZW5kQ2hpbGQodCkuZGlzYWJsZWQ9ITAsMiE9PXQucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoJiZ2LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksdC5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4Iiksdi5wdXNoKCIsLio6Iil9KSksKG4ubWF0Y2hlc1NlbGVjdG9yPVEudGVzdChtPWQubWF0Y2hlc3x8ZC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGQubW96TWF0Y2hlc1NlbGVjdG9yfHxkLm9NYXRjaGVzU2VsZWN0b3J8fGQubXNNYXRjaGVzU2VsZWN0b3IpKSYmbHQoZnVuY3Rpb24odCl7bi5kaXNjb25uZWN0ZWRNYXRjaD1tLmNhbGwodCwiKiIpLG0uY2FsbCh0LCJbcyE9JyddOngiKSx5LnB1c2goIiE9IixxKX0pLHY9di5sZW5ndGgmJm5ldyBSZWdFeHAodi5qb2luKCJ8IikpLHk9eS5sZW5ndGgmJm5ldyBSZWdFeHAoeS5qb2luKCJ8IikpLGU9US50ZXN0KGQuY29tcGFyZURvY3VtZW50UG9zaXRpb24pLGI9ZXx8US50ZXN0KGQuY29udGFpbnMpP2Z1bmN0aW9uKHQsZSl7dmFyIG49OT09PXQubm9kZVR5cGU/dC5kb2N1bWVudEVsZW1lbnQ6dCxyPWUmJmUucGFyZW50Tm9kZTtyZXR1cm4gdD09PXJ8fCEoIXJ8fDEhPT1yLm5vZGVUeXBlfHwhKG4uY29udGFpbnM/bi5jb250YWlucyhyKTp0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZ0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpKSl9OmZ1bmN0aW9uKHQsZSl7aWYoZSlmb3IoO2U9ZS5wYXJlbnROb2RlOylpZihlPT09dClyZXR1cm4hMDtyZXR1cm4hMX0sQT1lP2Z1bmN0aW9uKHQsZSl7aWYodD09PWUpcmV0dXJuIGY9ITAsMDt2YXIgcj0hdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gcnx8KDEmKHI9KHQub3duZXJEb2N1bWVudHx8dCk9PT0oZS5vd25lckRvY3VtZW50fHxlKT90LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGUpOjEpfHwhbi5zb3J0RGV0YWNoZWQmJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk9PT1yP3Q9PT1ofHx0Lm93bmVyRG9jdW1lbnQ9PT13JiZiKHcsdCk/LTE6ZT09PWh8fGUub3duZXJEb2N1bWVudD09PXcmJmIodyxlKT8xOmw/XyhsLHQpLV8obCxlKTowOjQmcj8tMToxKX06ZnVuY3Rpb24odCxlKXtpZih0PT09ZSlyZXR1cm4gZj0hMCwwO3ZhciBuLHI9MCxvPXQucGFyZW50Tm9kZSxpPWUucGFyZW50Tm9kZSxhPVt0XSxzPVtlXTtpZighb3x8IWkpcmV0dXJuIHQ9PT1oPy0xOmU9PT1oPzE6bz8tMTppPzE6bD9fKGwsdCktXyhsLGUpOjA7aWYobz09PWkpcmV0dXJuIHB0KHQsZSk7Zm9yKG49dDtuPW4ucGFyZW50Tm9kZTspYS51bnNoaWZ0KG4pO2ZvcihuPWU7bj1uLnBhcmVudE5vZGU7KXMudW5zaGlmdChuKTtmb3IoO2Fbcl09PT1zW3JdOylyKys7cmV0dXJuIHI/cHQoYVtyXSxzW3JdKTphW3JdPT09dz8tMTpzW3JdPT09dz8xOjB9LGgpOmh9LHN0Lm1hdGNoZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gc3QodCxudWxsLG51bGwsZSl9LHN0Lm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbih0LGUpe2lmKCh0Lm93bmVyRG9jdW1lbnR8fHQpIT09aCYmcCh0KSxuLm1hdGNoZXNTZWxlY3RvciYmZyYmIU9bZSsiICJdJiYoIXl8fCF5LnRlc3QoZSkpJiYoIXZ8fCF2LnRlc3QoZSkpKXRyeXt2YXIgcj1tLmNhbGwodCxlKTtpZihyfHxuLmRpc2Nvbm5lY3RlZE1hdGNofHx0LmRvY3VtZW50JiYxMSE9PXQuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIHJ9Y2F0Y2godCl7TyhlLCEwKX1yZXR1cm4gc3QoZSxoLG51bGwsW3RdKS5sZW5ndGg+MH0sc3QuY29udGFpbnM9ZnVuY3Rpb24odCxlKXtyZXR1cm4odC5vd25lckRvY3VtZW50fHx0KSE9PWgmJnAodCksYih0LGUpfSxzdC5hdHRyPWZ1bmN0aW9uKHQsZSl7KHQub3duZXJEb2N1bWVudHx8dCkhPT1oJiZwKHQpO3ZhciBvPXIuYXR0ckhhbmRsZVtlLnRvTG93ZXJDYXNlKCldLGk9byYmQy5jYWxsKHIuYXR0ckhhbmRsZSxlLnRvTG93ZXJDYXNlKCkpP28odCxlLCFnKTp2b2lkIDA7cmV0dXJuIHZvaWQgMCE9PWk/aTpuLmF0dHJpYnV0ZXN8fCFnP3QuZ2V0QXR0cmlidXRlKGUpOihpPXQuZ2V0QXR0cmlidXRlTm9kZShlKSkmJmkuc3BlY2lmaWVkP2kudmFsdWU6bnVsbH0sc3QuZXNjYXBlPWZ1bmN0aW9uKHQpe3JldHVybih0KyIiKS5yZXBsYWNlKHJ0LG90KX0sc3QuZXJyb3I9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK3QpfSxzdC51bmlxdWVTb3J0PWZ1bmN0aW9uKHQpe3ZhciBlLHI9W10sbz0wLGk9MDtpZihmPSFuLmRldGVjdER1cGxpY2F0ZXMsbD0hbi5zb3J0U3RhYmxlJiZ0LnNsaWNlKDApLHQuc29ydChBKSxmKXtmb3IoO2U9dFtpKytdOyllPT09dFtpXSYmKG89ci5wdXNoKGkpKTtmb3IoO28tLTspdC5zcGxpY2UocltvXSwxKX1yZXR1cm4gbD1udWxsLHR9LG89c3QuZ2V0VGV4dD1mdW5jdGlvbih0KXt2YXIgZSxuPSIiLHI9MCxpPXQubm9kZVR5cGU7aWYoaSl7aWYoMT09PWl8fDk9PT1pfHwxMT09PWkpe2lmKCJzdHJpbmciPT10eXBlb2YgdC50ZXh0Q29udGVudClyZXR1cm4gdC50ZXh0Q29udGVudDtmb3IodD10LmZpcnN0Q2hpbGQ7dDt0PXQubmV4dFNpYmxpbmcpbis9byh0KX1lbHNlIGlmKDM9PT1pfHw0PT09aSlyZXR1cm4gdC5ub2RlVmFsdWV9ZWxzZSBmb3IoO2U9dFtyKytdOyluKz1vKGUpO3JldHVybiBufSwocj1zdC5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpjdCxtYXRjaDpHLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbih0KXtyZXR1cm4gdFsxXT10WzFdLnJlcGxhY2UoZXQsbnQpLHRbM109KHRbM118fHRbNF18fHRbNV18fCIiKS5yZXBsYWNlKGV0LG50KSwifj0iPT09dFsyXSYmKHRbM109IiAiK3RbM10rIiAiKSx0LnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKHQpe3JldHVybiB0WzFdPXRbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PXRbMV0uc2xpY2UoMCwzKT8odFszXXx8c3QuZXJyb3IodFswXSksdFs0XT0rKHRbNF0/dFs1XSsodFs2XXx8MSk6MiooImV2ZW4iPT09dFszXXx8Im9kZCI9PT10WzNdKSksdFs1XT0rKHRbN10rdFs4XXx8Im9kZCI9PT10WzNdKSk6dFszXSYmc3QuZXJyb3IodFswXSksdH0sUFNFVURPOmZ1bmN0aW9uKHQpe3ZhciBlLG49IXRbNl0mJnRbMl07cmV0dXJuIEcuQ0hJTEQudGVzdCh0WzBdKT9udWxsOih0WzNdP3RbMl09dFs0XXx8dFs1XXx8IiI6biYmWS50ZXN0KG4pJiYoZT1hKG4sITApKSYmKGU9bi5pbmRleE9mKCIpIixuLmxlbmd0aC1lKS1uLmxlbmd0aCkmJih0WzBdPXRbMF0uc2xpY2UoMCxlKSx0WzJdPW4uc2xpY2UoMCxlKSksdC5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKHQpe3ZhciBlPXQucmVwbGFjZShldCxudCkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT10P2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKHQpe3JldHVybiB0Lm5vZGVOYW1lJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1lfX0sQ0xBU1M6ZnVuY3Rpb24odCl7dmFyIGU9RVt0KyIgIl07cmV0dXJuIGV8fChlPW5ldyBSZWdFeHAoIihefCIrTSsiKSIrdCsiKCIrTSsifCQpIikpJiZFKHQsZnVuY3Rpb24odCl7cmV0dXJuIGUudGVzdCgic3RyaW5nIj09dHlwZW9mIHQuY2xhc3NOYW1lJiZ0LmNsYXNzTmFtZXx8dm9pZCAwIT09dC5nZXRBdHRyaWJ1dGUmJnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciBvPXN0LmF0dHIocix0KTtyZXR1cm4gbnVsbD09bz8iIT0iPT09ZTohZXx8KG8rPSIiLCI9Ij09PWU/bz09PW46IiE9Ij09PWU/byE9PW46Il49Ij09PWU/biYmMD09PW8uaW5kZXhPZihuKToiKj0iPT09ZT9uJiZvLmluZGV4T2Yobik+LTE6IiQ9Ij09PWU/biYmby5zbGljZSgtbi5sZW5ndGgpPT09bjoifj0iPT09ZT8oIiAiK28ucmVwbGFjZShGLCIgIikrIiAiKS5pbmRleE9mKG4pPi0xOiJ8PSI9PT1lJiYobz09PW58fG8uc2xpY2UoMCxuLmxlbmd0aCsxKT09PW4rIi0iKSl9fSxDSElMRDpmdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpPSJudGgiIT09dC5zbGljZSgwLDMpLGE9Imxhc3QiIT09dC5zbGljZSgtNCkscz0ib2YtdHlwZSI9PT1lO3JldHVybiAxPT09ciYmMD09PW8/ZnVuY3Rpb24odCl7cmV0dXJuISF0LnBhcmVudE5vZGV9OmZ1bmN0aW9uKGUsbix1KXt2YXIgYyxsLGYscCxoLGQsZz1pIT09YT8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHY9ZS5wYXJlbnROb2RlLHk9cyYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLG09IXUmJiFzLGI9ITE7aWYodil7aWYoaSl7Zm9yKDtnOyl7Zm9yKHA9ZTtwPXBbZ107KWlmKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09eToxPT09cC5ub2RlVHlwZSlyZXR1cm4hMTtkPWc9Im9ubHkiPT09dCYmIWQmJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYoZD1bYT92LmZpcnN0Q2hpbGQ6di5sYXN0Q2hpbGRdLGEmJm0pe2ZvcihiPShoPShjPShsPShmPShwPXYpW3hdfHwocFt4XT17fSkpW3AudW5pcXVlSURdfHwoZltwLnVuaXF1ZUlEXT17fSkpW3RdfHxbXSlbMF09PT1rJiZjWzFdKSYmY1syXSxwPWgmJnYuY2hpbGROb2Rlc1toXTtwPSsraCYmcCYmcFtnXXx8KGI9aD0wKXx8ZC5wb3AoKTspaWYoMT09PXAubm9kZVR5cGUmJisrYiYmcD09PWUpe2xbdF09W2ssaCxiXTticmVha319ZWxzZSBpZihtJiYoYj1oPShjPShsPShmPShwPWUpW3hdfHwocFt4XT17fSkpW3AudW5pcXVlSURdfHwoZltwLnVuaXF1ZUlEXT17fSkpW3RdfHxbXSlbMF09PT1rJiZjWzFdKSwhMT09PWIpZm9yKDsocD0rK2gmJnAmJnBbZ118fChiPWg9MCl8fGQucG9wKCkpJiYoKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09eToxIT09cC5ub2RlVHlwZSl8fCErK2J8fChtJiYoKGw9KGY9cFt4XXx8KHBbeF09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVt0XT1bayxiXSkscCE9PWUpKTspO3JldHVybihiLT1vKT09PXJ8fGIlcj09MCYmYi9yPj0wfX19LFBTRVVETzpmdW5jdGlvbih0LGUpe3ZhciBuLG89ci5wc2V1ZG9zW3RdfHxyLnNldEZpbHRlcnNbdC50b0xvd2VyQ2FzZSgpXXx8c3QuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIit0KTtyZXR1cm4gb1t4XT9vKGUpOm8ubGVuZ3RoPjE/KG49W3QsdCwiIixlXSxyLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkodC50b0xvd2VyQ2FzZSgpKT9jdChmdW5jdGlvbih0LG4pe2Zvcih2YXIgcixpPW8odCxlKSxhPWkubGVuZ3RoO2EtLTspdFtyPV8odCxpW2FdKV09IShuW3JdPWlbYV0pfSk6ZnVuY3Rpb24odCl7cmV0dXJuIG8odCwwLG4pfSk6b319LHBzZXVkb3M6e25vdDpjdChmdW5jdGlvbih0KXt2YXIgZT1bXSxuPVtdLHI9cyh0LnJlcGxhY2UoSCwiJDEiKSk7cmV0dXJuIHJbeF0/Y3QoZnVuY3Rpb24odCxlLG4sbyl7Zm9yKHZhciBpLGE9cih0LG51bGwsbyxbXSkscz10Lmxlbmd0aDtzLS07KShpPWFbc10pJiYodFtzXT0hKGVbc109aSkpfSk6ZnVuY3Rpb24odCxvLGkpe3JldHVybiBlWzBdPXQscihlLG51bGwsaSxuKSxlWzBdPW51bGwsIW4ucG9wKCl9fSksaGFzOmN0KGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gc3QodCxlKS5sZW5ndGg+MH19KSxjb250YWluczpjdChmdW5jdGlvbih0KXtyZXR1cm4gdD10LnJlcGxhY2UoZXQsbnQpLGZ1bmN0aW9uKGUpe3JldHVybihlLnRleHRDb250ZW50fHxvKGUpKS5pbmRleE9mKHQpPi0xfX0pLGxhbmc6Y3QoZnVuY3Rpb24odCl7cmV0dXJuIFYudGVzdCh0fHwiIil8fHN0LmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK3QpLHQ9dC5yZXBsYWNlKGV0LG50KS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKGUpe3ZhciBuO2Rve2lmKG49Zz9lLmxhbmc6ZS5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fGUuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuKG49bi50b0xvd2VyQ2FzZSgpKT09PXR8fDA9PT1uLmluZGV4T2YodCsiLSIpfXdoaWxlKChlPWUucGFyZW50Tm9kZSkmJjE9PT1lLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oZSl7dmFyIG49dC5sb2NhdGlvbiYmdC5sb2NhdGlvbi5oYXNoO3JldHVybiBuJiZuLnNsaWNlKDEpPT09ZS5pZH0scm9vdDpmdW5jdGlvbih0KXtyZXR1cm4gdD09PWR9LGZvY3VzOmZ1bmN0aW9uKHQpe3JldHVybiB0PT09aC5hY3RpdmVFbGVtZW50JiYoIWguaGFzRm9jdXN8fGguaGFzRm9jdXMoKSkmJiEhKHQudHlwZXx8dC5ocmVmfHx+dC50YWJJbmRleCl9LGVuYWJsZWQ6Z3QoITEpLGRpc2FibGVkOmd0KCEwKSxjaGVja2VkOmZ1bmN0aW9uKHQpe3ZhciBlPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09ZSYmISF0LmNoZWNrZWR8fCJvcHRpb24iPT09ZSYmISF0LnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbih0KXtyZXR1cm4gdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCwhMD09PXQuc2VsZWN0ZWR9LGVtcHR5OmZ1bmN0aW9uKHQpe2Zvcih0PXQuZmlyc3RDaGlsZDt0O3Q9dC5uZXh0U2libGluZylpZih0Lm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbih0KXtyZXR1cm4hci5wc2V1ZG9zLmVtcHR5KHQpfSxoZWFkZXI6ZnVuY3Rpb24odCl7cmV0dXJuIEoudGVzdCh0Lm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIFgudGVzdCh0Lm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKHQpe3ZhciBlPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09ZSYmImJ1dHRvbiI9PT10LnR5cGV8fCJidXR0b24iPT09ZX0sdGV4dDpmdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4iaW5wdXQiPT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT10LnR5cGUmJihudWxsPT0oZT10LmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09ZS50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6dnQoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0OnZ0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuW2UtMV19KSxlcTp2dChmdW5jdGlvbih0LGUsbil7cmV0dXJuW248MD9uK2U6bl19KSxldmVuOnZ0KGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjxlO24rPTIpdC5wdXNoKG4pO3JldHVybiB0fSksb2RkOnZ0KGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTE7bjxlO24rPTIpdC5wdXNoKG4pO3JldHVybiB0fSksbHQ6dnQoZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1uPDA/bitlOm4+ZT9lOm47LS1yPj0wOyl0LnB1c2gocik7cmV0dXJuIHR9KSxndDp2dChmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPW48MD9uK2U6bjsrK3I8ZTspdC5wdXNoKHIpO3JldHVybiB0fSl9fSkucHNldWRvcy5udGg9ci5wc2V1ZG9zLmVxLHtyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlyLnBzZXVkb3NbZV09aHQoZSk7Zm9yKGUgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlyLnBzZXVkb3NbZV09ZHQoZSk7ZnVuY3Rpb24gbXQoKXt9ZnVuY3Rpb24gYnQodCl7Zm9yKHZhciBlPTAsbj10Lmxlbmd0aCxyPSIiO2U8bjtlKyspcis9dFtlXS52YWx1ZTtyZXR1cm4gcn1mdW5jdGlvbiB4dCh0LGUsbil7dmFyIHI9ZS5kaXIsbz1lLm5leHQsaT1vfHxyLGE9biYmInBhcmVudE5vZGUiPT09aSxzPVMrKztyZXR1cm4gZS5maXJzdD9mdW5jdGlvbihlLG4sbyl7Zm9yKDtlPWVbcl07KWlmKDE9PT1lLm5vZGVUeXBlfHxhKXJldHVybiB0KGUsbixvKTtyZXR1cm4hMX06ZnVuY3Rpb24oZSxuLHUpe3ZhciBjLGwsZixwPVtrLHNdO2lmKHUpe2Zvcig7ZT1lW3JdOylpZigoMT09PWUubm9kZVR5cGV8fGEpJiZ0KGUsbix1KSlyZXR1cm4hMH1lbHNlIGZvcig7ZT1lW3JdOylpZigxPT09ZS5ub2RlVHlwZXx8YSlpZihsPShmPWVbeF18fChlW3hdPXt9KSlbZS51bmlxdWVJRF18fChmW2UudW5pcXVlSURdPXt9KSxvJiZvPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKWU9ZVtyXXx8ZTtlbHNle2lmKChjPWxbaV0pJiZjWzBdPT09ayYmY1sxXT09PXMpcmV0dXJuIHBbMl09Y1syXTtpZihsW2ldPXAscFsyXT10KGUsbix1KSlyZXR1cm4hMH1yZXR1cm4hMX19ZnVuY3Rpb24gd3QodCl7cmV0dXJuIHQubGVuZ3RoPjE/ZnVuY3Rpb24oZSxuLHIpe2Zvcih2YXIgbz10Lmxlbmd0aDtvLS07KWlmKCF0W29dKGUsbixyKSlyZXR1cm4hMTtyZXR1cm4hMH06dFswXX1mdW5jdGlvbiBrdCh0LGUsbixyLG8pe2Zvcih2YXIgaSxhPVtdLHM9MCx1PXQubGVuZ3RoLGM9bnVsbCE9ZTtzPHU7cysrKShpPXRbc10pJiYobiYmIW4oaSxyLG8pfHwoYS5wdXNoKGkpLGMmJmUucHVzaChzKSkpO3JldHVybiBhfWZ1bmN0aW9uIFN0KHQsZSxuLHIsbyxpKXtyZXR1cm4gciYmIXJbeF0mJihyPVN0KHIpKSxvJiYhb1t4XSYmKG89U3QobyxpKSksY3QoZnVuY3Rpb24oaSxhLHMsdSl7dmFyIGMsbCxmLHA9W10saD1bXSxkPWEubGVuZ3RoLGc9aXx8ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0wLG89ZS5sZW5ndGg7cjxvO3IrKylzdCh0LGVbcl0sbik7cmV0dXJuIG59KGV8fCIqIixzLm5vZGVUeXBlP1tzXTpzLFtdKSx2PSF0fHwhaSYmZT9nOmt0KGcscCx0LHMsdSkseT1uP298fChpP3Q6ZHx8cik/W106YTp2O2lmKG4mJm4odix5LHMsdSkscilmb3IoYz1rdCh5LGgpLHIoYyxbXSxzLHUpLGw9Yy5sZW5ndGg7bC0tOykoZj1jW2xdKSYmKHlbaFtsXV09ISh2W2hbbF1dPWYpKTtpZihpKXtpZihvfHx0KXtpZihvKXtmb3IoYz1bXSxsPXkubGVuZ3RoO2wtLTspKGY9eVtsXSkmJmMucHVzaCh2W2xdPWYpO28obnVsbCx5PVtdLGMsdSl9Zm9yKGw9eS5sZW5ndGg7bC0tOykoZj15W2xdKSYmKGM9bz9fKGksZik6cFtsXSk+LTEmJihpW2NdPSEoYVtjXT1mKSl9fWVsc2UgeT1rdCh5PT09YT95LnNwbGljZShkLHkubGVuZ3RoKTp5KSxvP28obnVsbCxhLHksdSk6Ti5hcHBseShhLHkpfSl9ZnVuY3Rpb24gRXQodCl7Zm9yKHZhciBlLG4sbyxpPXQubGVuZ3RoLGE9ci5yZWxhdGl2ZVt0WzBdLnR5cGVdLHM9YXx8ci5yZWxhdGl2ZVsiICJdLHU9YT8xOjAsbD14dChmdW5jdGlvbih0KXtyZXR1cm4gdD09PWV9LHMsITApLGY9eHQoZnVuY3Rpb24odCl7cmV0dXJuIF8oZSx0KT4tMX0scywhMCkscD1bZnVuY3Rpb24odCxuLHIpe3ZhciBvPSFhJiYocnx8biE9PWMpfHwoKGU9bikubm9kZVR5cGU/bCh0LG4scik6Zih0LG4scikpO3JldHVybiBlPW51bGwsb31dO3U8aTt1KyspaWYobj1yLnJlbGF0aXZlW3RbdV0udHlwZV0pcD1beHQod3QocCksbildO2Vsc2V7aWYoKG49ci5maWx0ZXJbdFt1XS50eXBlXS5hcHBseShudWxsLHRbdV0ubWF0Y2hlcykpW3hdKXtmb3Iobz0rK3U7bzxpJiYhci5yZWxhdGl2ZVt0W29dLnR5cGVdO28rKyk7cmV0dXJuIFN0KHU+MSYmd3QocCksdT4xJiZidCh0LnNsaWNlKDAsdS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PXRbdS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKEgsIiQxIiksbix1PG8mJkV0KHQuc2xpY2UodSxvKSksbzxpJiZFdCh0PXQuc2xpY2UobykpLG88aSYmYnQodCkpfXAucHVzaChuKX1yZXR1cm4gd3QocCl9cmV0dXJuIG10LnByb3RvdHlwZT1yLmZpbHRlcnM9ci5wc2V1ZG9zLHIuc2V0RmlsdGVycz1uZXcgbXQsYT1zdC50b2tlbml6ZT1mdW5jdGlvbih0LGUpe3ZhciBuLG8saSxhLHMsdSxjLGw9alt0KyIgIl07aWYobClyZXR1cm4gZT8wOmwuc2xpY2UoMCk7Zm9yKHM9dCx1PVtdLGM9ci5wcmVGaWx0ZXI7czspe2ZvcihhIGluIG4mJiEobz16LmV4ZWMocykpfHwobyYmKHM9cy5zbGljZShvWzBdLmxlbmd0aCl8fHMpLHUucHVzaChpPVtdKSksbj0hMSwobz1XLmV4ZWMocykpJiYobj1vLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6b1swXS5yZXBsYWNlKEgsIiAiKX0pLHM9cy5zbGljZShuLmxlbmd0aCkpLHIuZmlsdGVyKSEobz1HW2FdLmV4ZWMocykpfHxjW2FdJiYhKG89Y1thXShvKSl8fChuPW8uc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTphLG1hdGNoZXM6b30pLHM9cy5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiBlP3MubGVuZ3RoOnM/c3QuZXJyb3IodCk6aih0LHUpLnNsaWNlKDApfSxzPXN0LmNvbXBpbGU9ZnVuY3Rpb24odCxlKXt2YXIgbixvPVtdLGk9W10scz1UW3QrIiAiXTtpZighcyl7Zm9yKGV8fChlPWEodCkpLG49ZS5sZW5ndGg7bi0tOykocz1FdChlW25dKSlbeF0/by5wdXNoKHMpOmkucHVzaChzKTsocz1UKHQsZnVuY3Rpb24odCxlKXt2YXIgbj1lLmxlbmd0aD4wLG89dC5sZW5ndGg+MCxpPWZ1bmN0aW9uKGksYSxzLHUsbCl7dmFyIGYsZCx2LHk9MCxtPSIwIixiPWkmJltdLHg9W10sdz1jLFM9aXx8byYmci5maW5kLlRBRygiKiIsbCksRT1rKz1udWxsPT13PzE6TWF0aC5yYW5kb20oKXx8LjEsaj1TLmxlbmd0aDtmb3IobCYmKGM9YT09PWh8fGF8fGwpO20hPT1qJiZudWxsIT0oZj1TW21dKTttKyspe2lmKG8mJmYpe2ZvcihkPTAsYXx8Zi5vd25lckRvY3VtZW50PT09aHx8KHAoZikscz0hZyk7dj10W2QrK107KWlmKHYoZixhfHxoLHMpKXt1LnB1c2goZik7YnJlYWt9bCYmKGs9RSl9biYmKChmPSF2JiZmKSYmeS0tLGkmJmIucHVzaChmKSl9aWYoeSs9bSxuJiZtIT09eSl7Zm9yKGQ9MDt2PWVbZCsrXTspdihiLHgsYSxzKTtpZihpKXtpZih5PjApZm9yKDttLS07KWJbbV18fHhbbV18fCh4W21dPVIuY2FsbCh1KSk7eD1rdCh4KX1OLmFwcGx5KHUseCksbCYmIWkmJngubGVuZ3RoPjAmJnkrZS5sZW5ndGg+MSYmc3QudW5pcXVlU29ydCh1KX1yZXR1cm4gbCYmKGs9RSxjPXcpLGJ9O3JldHVybiBuP2N0KGkpOml9KGksbykpKS5zZWxlY3Rvcj10fXJldHVybiBzfSx1PXN0LnNlbGVjdD1mdW5jdGlvbih0LGUsbixvKXt2YXIgaSx1LGMsbCxmLHA9ImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQsaD0hbyYmYSh0PXAuc2VsZWN0b3J8fHQpO2lmKG49bnx8W10sMT09PWgubGVuZ3RoKXtpZigodT1oWzBdPWhbMF0uc2xpY2UoMCkpLmxlbmd0aD4yJiYiSUQiPT09KGM9dVswXSkudHlwZSYmOT09PWUubm9kZVR5cGUmJmcmJnIucmVsYXRpdmVbdVsxXS50eXBlXSl7aWYoIShlPShyLmZpbmQuSUQoYy5tYXRjaGVzWzBdLnJlcGxhY2UoZXQsbnQpLGUpfHxbXSlbMF0pKXJldHVybiBuO3AmJihlPWUucGFyZW50Tm9kZSksdD10LnNsaWNlKHUuc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWZvcihpPUcubmVlZHNDb250ZXh0LnRlc3QodCk/MDp1Lmxlbmd0aDtpLS0mJihjPXVbaV0sIXIucmVsYXRpdmVbbD1jLnR5cGVdKTspaWYoKGY9ci5maW5kW2xdKSYmKG89ZihjLm1hdGNoZXNbMF0ucmVwbGFjZShldCxudCksdHQudGVzdCh1WzBdLnR5cGUpJiZ5dChlLnBhcmVudE5vZGUpfHxlKSkpe2lmKHUuc3BsaWNlKGksMSksISh0PW8ubGVuZ3RoJiZidCh1KSkpcmV0dXJuIE4uYXBwbHkobixvKSxuO2JyZWFrfX1yZXR1cm4ocHx8cyh0LGgpKShvLGUsIWcsbiwhZXx8dHQudGVzdCh0KSYmeXQoZS5wYXJlbnROb2RlKXx8ZSksbn0sbi5zb3J0U3RhYmxlPXguc3BsaXQoIiIpLnNvcnQoQSkuam9pbigiIik9PT14LG4uZGV0ZWN0RHVwbGljYXRlcz0hIWYscCgpLG4uc29ydERldGFjaGVkPWx0KGZ1bmN0aW9uKHQpe3JldHVybiAxJnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaC5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpKX0pLGx0KGZ1bmN0aW9uKHQpe3JldHVybiB0LmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09dC5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGZ0KCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbih0LGUsbil7aWYoIW4pcmV0dXJuIHQuZ2V0QXR0cmlidXRlKGUsInR5cGUiPT09ZS50b0xvd2VyQ2FzZSgpPzE6Mil9KSxuLmF0dHJpYnV0ZXMmJmx0KGZ1bmN0aW9uKHQpe3JldHVybiB0LmlubmVySFRNTD0iPGlucHV0Lz4iLHQuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT10LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGZ0KCJ2YWx1ZSIsZnVuY3Rpb24odCxlLG4pe2lmKCFuJiYiaW5wdXQiPT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiB0LmRlZmF1bHRWYWx1ZX0pLGx0KGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10LmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxmdChELGZ1bmN0aW9uKHQsZSxuKXt2YXIgcjtpZighbilyZXR1cm4hMD09PXRbZV0/ZS50b0xvd2VyQ2FzZSgpOihyPXQuZ2V0QXR0cmlidXRlTm9kZShlKSkmJnIuc3BlY2lmaWVkP3IudmFsdWU6bnVsbH0pLHN0fShuKTtTLmZpbmQ9VCxTLmV4cHI9VC5zZWxlY3RvcnMsUy5leHByWyI6Il09Uy5leHByLnBzZXVkb3MsUy51bmlxdWVTb3J0PVMudW5pcXVlPVQudW5pcXVlU29ydCxTLnRleHQ9VC5nZXRUZXh0LFMuaXNYTUxEb2M9VC5pc1hNTCxTLmNvbnRhaW5zPVQuY29udGFpbnMsUy5lc2NhcGVTZWxlY3Rvcj1ULmVzY2FwZTt2YXIgTz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPVtdLG89dm9pZCAwIT09bjsodD10W2VdKSYmOSE9PXQubm9kZVR5cGU7KWlmKDE9PT10Lm5vZGVUeXBlKXtpZihvJiZTKHQpLmlzKG4pKWJyZWFrO3IucHVzaCh0KX1yZXR1cm4gcn0sQT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1bXTt0O3Q9dC5uZXh0U2libGluZykxPT09dC5ub2RlVHlwZSYmdCE9PWUmJm4ucHVzaCh0KTtyZXR1cm4gbn0sQz1TLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O2Z1bmN0aW9uIEwodCxlKXtyZXR1cm4gdC5ub2RlTmFtZSYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ZS50b0xvd2VyQ2FzZSgpfXZhciBSPS9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pO2Z1bmN0aW9uIFAodCxlLG4pe3JldHVybiBtKGUpP1MuZ3JlcCh0LGZ1bmN0aW9uKHQscil7cmV0dXJuISFlLmNhbGwodCxyLHQpIT09bn0pOmUubm9kZVR5cGU/Uy5ncmVwKHQsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1lIT09bn0pOiJzdHJpbmciIT10eXBlb2YgZT9TLmdyZXAodCxmdW5jdGlvbih0KXtyZXR1cm4gZi5jYWxsKGUsdCk+LTEhPT1ufSk6Uy5maWx0ZXIoZSx0LG4pfVMuZmlsdGVyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lWzBdO3JldHVybiBuJiYodD0iOm5vdCgiK3QrIikiKSwxPT09ZS5sZW5ndGgmJjE9PT1yLm5vZGVUeXBlP1MuZmluZC5tYXRjaGVzU2VsZWN0b3Iocix0KT9bcl06W106Uy5maW5kLm1hdGNoZXModCxTLmdyZXAoZSxmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQubm9kZVR5cGV9KSl9LFMuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKHQpe3ZhciBlLG4scj10aGlzLmxlbmd0aCxvPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiB0aGlzLnB1c2hTdGFjayhTKHQpLmZpbHRlcihmdW5jdGlvbigpe2ZvcihlPTA7ZTxyO2UrKylpZihTLmNvbnRhaW5zKG9bZV0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKG49dGhpcy5wdXNoU3RhY2soW10pLGU9MDtlPHI7ZSsrKVMuZmluZCh0LG9bZV0sbik7cmV0dXJuIHI+MT9TLnVuaXF1ZVNvcnQobik6bn0sZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhQKHRoaXMsdHx8W10sITEpKX0sbm90OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhQKHRoaXMsdHx8W10sITApKX0saXM6ZnVuY3Rpb24odCl7cmV0dXJuISFQKHRoaXMsInN0cmluZyI9PXR5cGVvZiB0JiZDLnRlc3QodCk/Uyh0KTp0fHxbXSwhMSkubGVuZ3RofX0pO3ZhciBOLEk9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLzsoUy5mbi5pbml0PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvO2lmKCF0KXJldHVybiB0aGlzO2lmKG49bnx8Tiwic3RyaW5nIj09dHlwZW9mIHQpe2lmKCEocj0iPCI9PT10WzBdJiYiPiI9PT10W3QubGVuZ3RoLTFdJiZ0Lmxlbmd0aD49Mz9bbnVsbCx0LG51bGxdOkkuZXhlYyh0KSl8fCFyWzFdJiZlKXJldHVybiFlfHxlLmpxdWVyeT8oZXx8bikuZmluZCh0KTp0aGlzLmNvbnN0cnVjdG9yKGUpLmZpbmQodCk7aWYoclsxXSl7aWYoZT1lIGluc3RhbmNlb2YgUz9lWzBdOmUsUy5tZXJnZSh0aGlzLFMucGFyc2VIVE1MKHJbMV0sZSYmZS5ub2RlVHlwZT9lLm93bmVyRG9jdW1lbnR8fGU6YSwhMCkpLFIudGVzdChyWzFdKSYmUy5pc1BsYWluT2JqZWN0KGUpKWZvcihyIGluIGUpbSh0aGlzW3JdKT90aGlzW3JdKGVbcl0pOnRoaXMuYXR0cihyLGVbcl0pO3JldHVybiB0aGlzfXJldHVybihvPWEuZ2V0RWxlbWVudEJ5SWQoclsyXSkpJiYodGhpc1swXT1vLHRoaXMubGVuZ3RoPTEpLHRoaXN9cmV0dXJuIHQubm9kZVR5cGU/KHRoaXNbMF09dCx0aGlzLmxlbmd0aD0xLHRoaXMpOm0odCk/dm9pZCAwIT09bi5yZWFkeT9uLnJlYWR5KHQpOnQoUyk6Uy5tYWtlQXJyYXkodCx0aGlzKX0pLnByb3RvdHlwZT1TLmZuLE49UyhhKTt2YXIgXz0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxEPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2Z1bmN0aW9uIE0odCxlKXtmb3IoOyh0PXRbZV0pJiYxIT09dC5ub2RlVHlwZTspO3JldHVybiB0fVMuZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24odCl7dmFyIGU9Uyh0LHRoaXMpLG49ZS5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDxuO3QrKylpZihTLmNvbnRhaW5zKHRoaXMsZVt0XSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbih0LGUpe3ZhciBuLHI9MCxvPXRoaXMubGVuZ3RoLGk9W10sYT0ic3RyaW5nIiE9dHlwZW9mIHQmJlModCk7aWYoIUMudGVzdCh0KSlmb3IoO3I8bztyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09ZTtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYoYT9hLmluZGV4KG4pPi0xOjE9PT1uLm5vZGVUeXBlJiZTLmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sdCkpKXtpLnB1c2gobik7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKGkubGVuZ3RoPjE/Uy51bmlxdWVTb3J0KGkpOmkpfSxpbmRleDpmdW5jdGlvbih0KXtyZXR1cm4gdD8ic3RyaW5nIj09dHlwZW9mIHQ/Zi5jYWxsKFModCksdGhpc1swXSk6Zi5jYWxsKHRoaXMsdC5qcXVlcnk/dFswXTp0KTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhTLnVuaXF1ZVNvcnQoUy5tZXJnZSh0aGlzLmdldCgpLFModCxlKSkpKX0sYWRkQmFjazpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hZGQobnVsbD09dD90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcih0KSl9fSksUy5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5wYXJlbnROb2RlO3JldHVybiBlJiYxMSE9PWUubm9kZVR5cGU/ZTpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKHQpe3JldHVybiBPKHQsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTyh0LCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbih0KXtyZXR1cm4gTSh0LCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKHQpe3JldHVybiBNKHQsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKHQpe3JldHVybiBPKHQsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24odCl7cmV0dXJuIE8odCwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIE8odCwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBPKHQsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKHQpe3JldHVybiBBKCh0LnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLHQpfSxjaGlsZHJlbjpmdW5jdGlvbih0KXtyZXR1cm4gQSh0LmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dC5jb250ZW50RG9jdW1lbnQ/dC5jb250ZW50RG9jdW1lbnQ6KEwodCwidGVtcGxhdGUiKSYmKHQ9dC5jb250ZW50fHx0KSxTLm1lcmdlKFtdLHQuY2hpbGROb2RlcykpfX0sZnVuY3Rpb24odCxlKXtTLmZuW3RdPWZ1bmN0aW9uKG4scil7dmFyIG89Uy5tYXAodGhpcyxlLG4pO3JldHVybiJVbnRpbCIhPT10LnNsaWNlKC01KSYmKHI9biksciYmInN0cmluZyI9PXR5cGVvZiByJiYobz1TLmZpbHRlcihyLG8pKSx0aGlzLmxlbmd0aD4xJiYoRFt0XXx8Uy51bmlxdWVTb3J0KG8pLF8udGVzdCh0KSYmby5yZXZlcnNlKCkpLHRoaXMucHVzaFN0YWNrKG8pfX0pO3ZhciBVPS9bXlx4MjBcdFxyXG5cZl0rL2c7ZnVuY3Rpb24gQih0KXtyZXR1cm4gdH1mdW5jdGlvbiBxKHQpe3Rocm93IHR9ZnVuY3Rpb24gRih0LGUsbixyKXt2YXIgbzt0cnl7dCYmbShvPXQucHJvbWlzZSk/by5jYWxsKHQpLmRvbmUoZSkuZmFpbChuKTp0JiZtKG89dC50aGVuKT9vLmNhbGwodCxlLG4pOmUuYXBwbHkodm9pZCAwLFt0XS5zbGljZShyKSl9Y2F0Y2godCl7bi5hcHBseSh2b2lkIDAsW3RdKX19Uy5DYWxsYmFja3M9ZnVuY3Rpb24odCl7dD0ic3RyaW5nIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7dmFyIGU9e307cmV0dXJuIFMuZWFjaCh0Lm1hdGNoKFUpfHxbXSxmdW5jdGlvbih0LG4pe2Vbbl09ITB9KSxlfSh0KTpTLmV4dGVuZCh7fSx0KTt2YXIgZSxuLHIsbyxpPVtdLGE9W10scz0tMSx1PWZ1bmN0aW9uKCl7Zm9yKG89b3x8dC5vbmNlLHI9ZT0hMDthLmxlbmd0aDtzPS0xKWZvcihuPWEuc2hpZnQoKTsrK3M8aS5sZW5ndGg7KSExPT09aVtzXS5hcHBseShuWzBdLG5bMV0pJiZ0LnN0b3BPbkZhbHNlJiYocz1pLmxlbmd0aCxuPSExKTt0Lm1lbW9yeXx8KG49ITEpLGU9ITEsbyYmKGk9bj9bXToiIil9LGM9e2FkZDpmdW5jdGlvbigpe3JldHVybiBpJiYobiYmIWUmJihzPWkubGVuZ3RoLTEsYS5wdXNoKG4pKSxmdW5jdGlvbiBlKG4pe1MuZWFjaChuLGZ1bmN0aW9uKG4scil7bShyKT90LnVuaXF1ZSYmYy5oYXMocil8fGkucHVzaChyKTpyJiZyLmxlbmd0aCYmInN0cmluZyIhPT1rKHIpJiZlKHIpfSl9KGFyZ3VtZW50cyksbiYmIWUmJnUoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIFMuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24odCxlKXtmb3IodmFyIG47KG49Uy5pbkFycmF5KGUsaSxuKSk+LTE7KWkuc3BsaWNlKG4sMSksbjw9cyYmcy0tfSksdGhpc30saGFzOmZ1bmN0aW9uKHQpe3JldHVybiB0P1MuaW5BcnJheSh0LGkpPi0xOmkubGVuZ3RoPjB9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIGkmJihpPVtdKSx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG89YT1bXSxpPW49IiIsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haX0sbG9jazpmdW5jdGlvbigpe3JldHVybiBvPWE9W10sbnx8ZXx8KGk9bj0iIiksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuISFvfSxmaXJlV2l0aDpmdW5jdGlvbih0LG4pe3JldHVybiBvfHwobj1bdCwobj1ufHxbXSkuc2xpY2U/bi5zbGljZSgpOm5dLGEucHVzaChuKSxlfHx1KCkpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gYy5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXJ9fTtyZXR1cm4gY30sUy5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKHQpe3ZhciBlPVtbIm5vdGlmeSIsInByb2dyZXNzIixTLkNhbGxiYWNrcygibWVtb3J5IiksUy5DYWxsYmFja3MoIm1lbW9yeSIpLDJdLFsicmVzb2x2ZSIsImRvbmUiLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDAsInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwxLCJyZWplY3RlZCJdXSxyPSJwZW5kaW5nIixvPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiByfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gaS5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LGNhdGNoOmZ1bmN0aW9uKHQpe3JldHVybiBvLnRoZW4obnVsbCx0KX0scGlwZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cztyZXR1cm4gUy5EZWZlcnJlZChmdW5jdGlvbihuKXtTLmVhY2goZSxmdW5jdGlvbihlLHIpe3ZhciBvPW0odFtyWzRdXSkmJnRbcls0XV07aVtyWzFdXShmdW5jdGlvbigpe3ZhciB0PW8mJm8uYXBwbHkodGhpcyxhcmd1bWVudHMpO3QmJm0odC5wcm9taXNlKT90LnByb21pc2UoKS5wcm9ncmVzcyhuLm5vdGlmeSkuZG9uZShuLnJlc29sdmUpLmZhaWwobi5yZWplY3QpOm5bclswXSsiV2l0aCJdKHRoaXMsbz9bdF06YXJndW1lbnRzKX0pfSksdD1udWxsfSkucHJvbWlzZSgpfSx0aGVuOmZ1bmN0aW9uKHQscixvKXt2YXIgaT0wO2Z1bmN0aW9uIGEodCxlLHIsbyl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHM9dGhpcyx1PWFyZ3VtZW50cyxjPWZ1bmN0aW9uKCl7dmFyIG4sYztpZighKHQ8aSkpe2lmKChuPXIuYXBwbHkocyx1KSk9PT1lLnByb21pc2UoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iKTtjPW4mJigib2JqZWN0Ij09dHlwZW9mIG58fCJmdW5jdGlvbiI9PXR5cGVvZiBuKSYmbi50aGVuLG0oYyk/bz9jLmNhbGwobixhKGksZSxCLG8pLGEoaSxlLHEsbykpOihpKyssYy5jYWxsKG4sYShpLGUsQixvKSxhKGksZSxxLG8pLGEoaSxlLEIsZS5ub3RpZnlXaXRoKSkpOihyIT09QiYmKHM9dm9pZCAwLHU9W25dKSwob3x8ZS5yZXNvbHZlV2l0aCkocyx1KSl9fSxsPW8/YzpmdW5jdGlvbigpe3RyeXtjKCl9Y2F0Y2gobil7Uy5EZWZlcnJlZC5leGNlcHRpb25Ib29rJiZTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2sobixsLnN0YWNrVHJhY2UpLHQrMT49aSYmKHIhPT1xJiYocz12b2lkIDAsdT1bbl0pLGUucmVqZWN0V2l0aChzLHUpKX19O3Q/bCgpOihTLkRlZmVycmVkLmdldFN0YWNrSG9vayYmKGwuc3RhY2tUcmFjZT1TLkRlZmVycmVkLmdldFN0YWNrSG9vaygpKSxuLnNldFRpbWVvdXQobCkpfX1yZXR1cm4gUy5EZWZlcnJlZChmdW5jdGlvbihuKXtlWzBdWzNdLmFkZChhKDAsbixtKG8pP286QixuLm5vdGlmeVdpdGgpKSxlWzFdWzNdLmFkZChhKDAsbixtKHQpP3Q6QikpLGVbMl1bM10uYWRkKGEoMCxuLG0ocik/cjpxKSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQ/Uy5leHRlbmQodCxvKTpvfX0saT17fTtyZXR1cm4gUy5lYWNoKGUsZnVuY3Rpb24odCxuKXt2YXIgYT1uWzJdLHM9bls1XTtvW25bMV1dPWEuYWRkLHMmJmEuYWRkKGZ1bmN0aW9uKCl7cj1zfSxlWzMtdF1bMl0uZGlzYWJsZSxlWzMtdF1bM10uZGlzYWJsZSxlWzBdWzJdLmxvY2ssZVswXVszXS5sb2NrKSxhLmFkZChuWzNdLmZpcmUpLGlbblswXV09ZnVuY3Rpb24oKXtyZXR1cm4gaVtuWzBdKyJXaXRoIl0odGhpcz09PWk/dm9pZCAwOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxpW25bMF0rIldpdGgiXT1hLmZpcmVXaXRofSksby5wcm9taXNlKGkpLHQmJnQuY2FsbChpLGkpLGl9LHdoZW46ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aCxuPWUscj1BcnJheShuKSxvPXUuY2FsbChhcmd1bWVudHMpLGk9Uy5EZWZlcnJlZCgpLGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JbdF09dGhpcyxvW3RdPWFyZ3VtZW50cy5sZW5ndGg+MT91LmNhbGwoYXJndW1lbnRzKTpuLC0tZXx8aS5yZXNvbHZlV2l0aChyLG8pfX07aWYoZTw9MSYmKEYodCxpLmRvbmUoYShuKSkucmVzb2x2ZSxpLnJlamVjdCwhZSksInBlbmRpbmciPT09aS5zdGF0ZSgpfHxtKG9bbl0mJm9bbl0udGhlbikpKXJldHVybiBpLnRoZW4oKTtmb3IoO24tLTspRihvW25dLGEobiksaS5yZWplY3QpO3JldHVybiBpLnByb21pc2UoKX19KTt2YXIgSD0vXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLztTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2s9ZnVuY3Rpb24odCxlKXtuLmNvbnNvbGUmJm4uY29uc29sZS53YXJuJiZ0JiZILnRlc3QodC5uYW1lKSYmbi5jb25zb2xlLndhcm4oImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIrdC5tZXNzYWdlLHQuc3RhY2ssZSl9LFMucmVhZHlFeGNlcHRpb249ZnVuY3Rpb24odCl7bi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgdH0pfTt2YXIgej1TLkRlZmVycmVkKCk7ZnVuY3Rpb24gVygpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsVyksbi5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixXKSxTLnJlYWR5KCl9Uy5mbi5yZWFkeT1mdW5jdGlvbih0KXtyZXR1cm4gei50aGVuKHQpLmNhdGNoKGZ1bmN0aW9uKHQpe1MucmVhZHlFeGNlcHRpb24odCl9KSx0aGlzfSxTLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxyZWFkeTpmdW5jdGlvbih0KXsoITA9PT10Py0tUy5yZWFkeVdhaXQ6Uy5pc1JlYWR5KXx8KFMuaXNSZWFkeT0hMCwhMCE9PXQmJi0tUy5yZWFkeVdhaXQ+MHx8ei5yZXNvbHZlV2l0aChhLFtTXSkpfX0pLFMucmVhZHkudGhlbj16LnRoZW4sImNvbXBsZXRlIj09PWEucmVhZHlTdGF0ZXx8ImxvYWRpbmciIT09YS5yZWFkeVN0YXRlJiYhYS5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGw/bi5zZXRUaW1lb3V0KFMucmVhZHkpOihhLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLFcpLG4uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsVykpO3ZhciAkPWZ1bmN0aW9uKHQsZSxuLHIsbyxpLGEpe3ZhciBzPTAsdT10Lmxlbmd0aCxjPW51bGw9PW47aWYoIm9iamVjdCI9PT1rKG4pKWZvcihzIGluIG89ITAsbikkKHQsZSxzLG5bc10sITAsaSxhKTtlbHNlIGlmKHZvaWQgMCE9PXImJihvPSEwLG0ocil8fChhPSEwKSxjJiYoYT8oZS5jYWxsKHQsciksZT1udWxsKTooYz1lLGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBjLmNhbGwoUyh0KSxuKX0pKSxlKSlmb3IoO3M8dTtzKyspZSh0W3NdLG4sYT9yOnIuY2FsbCh0W3NdLHMsZSh0W3NdLG4pKSk7cmV0dXJuIG8/dDpjP2UuY2FsbCh0KTp1P2UodFswXSxuKTppfSxZPS9eLW1zLS8sVj0vLShbYS16XSkvZztmdW5jdGlvbiBHKHQsZSl7cmV0dXJuIGUudG9VcHBlckNhc2UoKX1mdW5jdGlvbiBLKHQpe3JldHVybiB0LnJlcGxhY2UoWSwibXMtIikucmVwbGFjZShWLEcpfXZhciBYPWZ1bmN0aW9uKHQpe3JldHVybiAxPT09dC5ub2RlVHlwZXx8OT09PXQubm9kZVR5cGV8fCErdC5ub2RlVHlwZX07ZnVuY3Rpb24gSigpe3RoaXMuZXhwYW5kbz1TLmV4cGFuZG8rSi51aWQrK31KLnVpZD0xLEoucHJvdG90eXBlPXtjYWNoZTpmdW5jdGlvbih0KXt2YXIgZT10W3RoaXMuZXhwYW5kb107cmV0dXJuIGV8fChlPXt9LFgodCkmJih0Lm5vZGVUeXBlP3RbdGhpcy5leHBhbmRvXT1lOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHRoaXMuZXhwYW5kbyx7dmFsdWU6ZSxjb25maWd1cmFibGU6ITB9KSkpLGV9LHNldDpmdW5jdGlvbih0LGUsbil7dmFyIHIsbz10aGlzLmNhY2hlKHQpO2lmKCJzdHJpbmciPT10eXBlb2YgZSlvW0soZSldPW47ZWxzZSBmb3IociBpbiBlKW9bSyhyKV09ZVtyXTtyZXR1cm4gb30sZ2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PWU/dGhpcy5jYWNoZSh0KTp0W3RoaXMuZXhwYW5kb10mJnRbdGhpcy5leHBhbmRvXVtLKGUpXX0sYWNjZXNzOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09ZXx8ZSYmInN0cmluZyI9PXR5cGVvZiBlJiZ2b2lkIDA9PT1uP3RoaXMuZ2V0KHQsZSk6KHRoaXMuc2V0KHQsZSxuKSx2b2lkIDAhPT1uP246ZSl9LHJlbW92ZTpmdW5jdGlvbih0LGUpe3ZhciBuLHI9dFt0aGlzLmV4cGFuZG9dO2lmKHZvaWQgMCE9PXIpe2lmKHZvaWQgMCE9PWUpe249KGU9QXJyYXkuaXNBcnJheShlKT9lLm1hcChLKTooZT1LKGUpKWluIHI/W2VdOmUubWF0Y2goVSl8fFtdKS5sZW5ndGg7Zm9yKDtuLS07KWRlbGV0ZSByW2Vbbl1dfSh2b2lkIDA9PT1lfHxTLmlzRW1wdHlPYmplY3QocikpJiYodC5ub2RlVHlwZT90W3RoaXMuZXhwYW5kb109dm9pZCAwOmRlbGV0ZSB0W3RoaXMuZXhwYW5kb10pfX0saGFzRGF0YTpmdW5jdGlvbih0KXt2YXIgZT10W3RoaXMuZXhwYW5kb107cmV0dXJuIHZvaWQgMCE9PWUmJiFTLmlzRW1wdHlPYmplY3QoZSl9fTt2YXIgUT1uZXcgSixaPW5ldyBKLHR0PS9eKD86XHtbXHdcV10qXH18XFtbXHdcV10qXF0pJC8sZXQ9L1tBLVpdL2c7ZnVuY3Rpb24gbnQodCxlLG4pe3ZhciByO2lmKHZvaWQgMD09PW4mJjE9PT10Lm5vZGVUeXBlKWlmKHI9ImRhdGEtIitlLnJlcGxhY2UoZXQsIi0kJiIpLnRvTG93ZXJDYXNlKCksInN0cmluZyI9PXR5cGVvZihuPXQuZ2V0QXR0cmlidXRlKHIpKSl7dHJ5e249ZnVuY3Rpb24odCl7cmV0dXJuInRydWUiPT09dHx8ImZhbHNlIiE9PXQmJigibnVsbCI9PT10P251bGw6dD09PSt0KyIiPyt0OnR0LnRlc3QodCk/SlNPTi5wYXJzZSh0KTp0KX0obil9Y2F0Y2godCl7fVouc2V0KHQsZSxuKX1lbHNlIG49dm9pZCAwO3JldHVybiBufVMuZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKHQpe3JldHVybiBaLmhhc0RhdGEodCl8fFEuaGFzRGF0YSh0KX0sZGF0YTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIFouYWNjZXNzKHQsZSxuKX0scmVtb3ZlRGF0YTpmdW5jdGlvbih0LGUpe1oucmVtb3ZlKHQsZSl9LF9kYXRhOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gUS5hY2Nlc3ModCxlLG4pfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbih0LGUpe1EucmVtb3ZlKHQsZSl9fSksUy5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24odCxlKXt2YXIgbixyLG8saT10aGlzWzBdLGE9aSYmaS5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PXQpe2lmKHRoaXMubGVuZ3RoJiYobz1aLmdldChpKSwxPT09aS5ub2RlVHlwZSYmIVEuZ2V0KGksImhhc0RhdGFBdHRycyIpKSl7Zm9yKG49YS5sZW5ndGg7bi0tOylhW25dJiYwPT09KHI9YVtuXS5uYW1lKS5pbmRleE9mKCJkYXRhLSIpJiYocj1LKHIuc2xpY2UoNSkpLG50KGkscixvW3JdKSk7US5zZXQoaSwiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIG99cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0P3RoaXMuZWFjaChmdW5jdGlvbigpe1ouc2V0KHRoaXMsdCl9KTokKHRoaXMsZnVuY3Rpb24oZSl7dmFyIG47aWYoaSYmdm9pZCAwPT09ZSlyZXR1cm4gdm9pZCAwIT09KG49Wi5nZXQoaSx0KSk/bjp2b2lkIDAhPT0obj1udChpLHQpKT9uOnZvaWQgMDt0aGlzLmVhY2goZnVuY3Rpb24oKXtaLnNldCh0aGlzLHQsZSl9KX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Wi5yZW1vdmUodGhpcyx0KX0pfX0pLFMuZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI7aWYodClyZXR1cm4gZT0oZXx8ImZ4IikrInF1ZXVlIixyPVEuZ2V0KHQsZSksbiYmKCFyfHxBcnJheS5pc0FycmF5KG4pP3I9US5hY2Nlc3ModCxlLFMubWFrZUFycmF5KG4pKTpyLnB1c2gobikpLHJ8fFtdfSxkZXF1ZXVlOmZ1bmN0aW9uKHQsZSl7ZT1lfHwiZngiO3ZhciBuPVMucXVldWUodCxlKSxyPW4ubGVuZ3RoLG89bi5zaGlmdCgpLGk9Uy5fcXVldWVIb29rcyh0LGUpOyJpbnByb2dyZXNzIj09PW8mJihvPW4uc2hpZnQoKSxyLS0pLG8mJigiZngiPT09ZSYmbi51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIGkuc3RvcCxvLmNhbGwodCxmdW5jdGlvbigpe1MuZGVxdWV1ZSh0LGUpfSxpKSksIXImJmkmJmkuZW1wdHkuZmlyZSgpfSxfcXVldWVIb29rczpmdW5jdGlvbih0LGUpe3ZhciBuPWUrInF1ZXVlSG9va3MiO3JldHVybiBRLmdldCh0LG4pfHxRLmFjY2Vzcyh0LG4se2VtcHR5OlMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe1EucmVtb3ZlKHQsW2UrInF1ZXVlIixuXSl9KX0pfX0pLFMuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPTI7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0JiYoZT10LHQ9ImZ4IixuLS0pLGFyZ3VtZW50cy5sZW5ndGg8bj9TLnF1ZXVlKHRoaXNbMF0sdCk6dm9pZCAwPT09ZT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBuPVMucXVldWUodGhpcyx0LGUpO1MuX3F1ZXVlSG9va3ModGhpcyx0KSwiZngiPT09dCYmImlucHJvZ3Jlc3MiIT09blswXSYmUy5kZXF1ZXVlKHRoaXMsdCl9KX0sZGVxdWV1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5kZXF1ZXVlKHRoaXMsdCl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5xdWV1ZSh0fHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbih0LGUpe3ZhciBuLHI9MSxvPVMuRGVmZXJyZWQoKSxpPXRoaXMsYT10aGlzLmxlbmd0aCxzPWZ1bmN0aW9uKCl7LS1yfHxvLnJlc29sdmVXaXRoKGksW2ldKX07Zm9yKCJzdHJpbmciIT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksdD10fHwiZngiO2EtLTspKG49US5nZXQoaVthXSx0KyJxdWV1ZUhvb2tzIikpJiZuLmVtcHR5JiYocisrLG4uZW1wdHkuYWRkKHMpKTtyZXR1cm4gcygpLG8ucHJvbWlzZShlKX19KTt2YXIgcnQ9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2Usb3Q9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK3J0KyIpKFthLXolXSopJCIsImkiKSxpdD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLGF0PWEuZG9jdW1lbnRFbGVtZW50LHN0PWZ1bmN0aW9uKHQpe3JldHVybiBTLmNvbnRhaW5zKHQub3duZXJEb2N1bWVudCx0KX0sdXQ9e2NvbXBvc2VkOiEwfTthdC5nZXRSb290Tm9kZSYmKHN0PWZ1bmN0aW9uKHQpe3JldHVybiBTLmNvbnRhaW5zKHQub3duZXJEb2N1bWVudCx0KXx8dC5nZXRSb290Tm9kZSh1dCk9PT10Lm93bmVyRG9jdW1lbnR9KTt2YXIgY3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4ibm9uZSI9PT0odD1lfHx0KS5zdHlsZS5kaXNwbGF5fHwiIj09PXQuc3R5bGUuZGlzcGxheSYmc3QodCkmJiJub25lIj09PVMuY3NzKHQsImRpc3BsYXkiKX0sbHQ9ZnVuY3Rpb24odCxlLG4scil7dmFyIG8saSxhPXt9O2ZvcihpIGluIGUpYVtpXT10LnN0eWxlW2ldLHQuc3R5bGVbaV09ZVtpXTtmb3IoaSBpbiBvPW4uYXBwbHkodCxyfHxbXSksZSl0LnN0eWxlW2ldPWFbaV07cmV0dXJuIG99O2Z1bmN0aW9uIGZ0KHQsZSxuLHIpe3ZhciBvLGksYT0yMCxzPXI/ZnVuY3Rpb24oKXtyZXR1cm4gci5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gUy5jc3ModCxlLCIiKX0sdT1zKCksYz1uJiZuWzNdfHwoUy5jc3NOdW1iZXJbZV0/IiI6InB4IiksbD10Lm5vZGVUeXBlJiYoUy5jc3NOdW1iZXJbZV18fCJweCIhPT1jJiYrdSkmJm90LmV4ZWMoUy5jc3ModCxlKSk7aWYobCYmbFszXSE9PWMpe2Zvcih1Lz0yLGM9Y3x8bFszXSxsPSt1fHwxO2EtLTspUy5zdHlsZSh0LGUsbCtjKSwoMS1pKSooMS0oaT1zKCkvdXx8LjUpKTw9MCYmKGE9MCksbC89aTtsKj0yLFMuc3R5bGUodCxlLGwrYyksbj1ufHxbXX1yZXR1cm4gbiYmKGw9K2x8fCt1fHwwLG89blsxXT9sKyhuWzFdKzEpKm5bMl06K25bMl0sciYmKHIudW5pdD1jLHIuc3RhcnQ9bCxyLmVuZD1vKSksb312YXIgcHQ9e307ZnVuY3Rpb24gaHQodCl7dmFyIGUsbj10Lm93bmVyRG9jdW1lbnQscj10Lm5vZGVOYW1lLG89cHRbcl07cmV0dXJuIG98fChlPW4uYm9keS5hcHBlbmRDaGlsZChuLmNyZWF0ZUVsZW1lbnQocikpLG89Uy5jc3MoZSwiZGlzcGxheSIpLGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSwibm9uZSI9PT1vJiYobz0iYmxvY2siKSxwdFtyXT1vLG8pfWZ1bmN0aW9uIGR0KHQsZSl7Zm9yKHZhciBuLHIsbz1bXSxpPTAsYT10Lmxlbmd0aDtpPGE7aSsrKShyPXRbaV0pLnN0eWxlJiYobj1yLnN0eWxlLmRpc3BsYXksZT8oIm5vbmUiPT09biYmKG9baV09US5nZXQociwiZGlzcGxheSIpfHxudWxsLG9baV18fChyLnN0eWxlLmRpc3BsYXk9IiIpKSwiIj09PXIuc3R5bGUuZGlzcGxheSYmY3QocikmJihvW2ldPWh0KHIpKSk6Im5vbmUiIT09biYmKG9baV09Im5vbmUiLFEuc2V0KHIsImRpc3BsYXkiLG4pKSk7Zm9yKGk9MDtpPGE7aSsrKW51bGwhPW9baV0mJih0W2ldLnN0eWxlLmRpc3BsYXk9b1tpXSk7cmV0dXJuIHR9Uy5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oKXtyZXR1cm4gZHQodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gZHQodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbih0KXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0P3Q/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Y3QodGhpcyk/Uyh0aGlzKS5zaG93KCk6Uyh0aGlzKS5oaWRlKCl9KX19KTt2YXIgZ3Q9L14oPzpjaGVja2JveHxyYWRpbykkL2ksdnQ9LzwoW2Etel1bXlwvXDA+XHgyMFx0XHJcblxmXSopL2kseXQ9L14kfF5tb2R1bGUkfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLG10PXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07ZnVuY3Rpb24gYnQodCxlKXt2YXIgbjtyZXR1cm4gbj12b2lkIDAhPT10LmdldEVsZW1lbnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZXx8IioiKTp2b2lkIDAhPT10LnF1ZXJ5U2VsZWN0b3JBbGw/dC5xdWVyeVNlbGVjdG9yQWxsKGV8fCIqIik6W10sdm9pZCAwPT09ZXx8ZSYmTCh0LGUpP1MubWVyZ2UoW3RdLG4pOm59ZnVuY3Rpb24geHQodCxlKXtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspUS5zZXQodFtuXSwiZ2xvYmFsRXZhbCIsIWV8fFEuZ2V0KGVbbl0sImdsb2JhbEV2YWwiKSl9bXQub3B0Z3JvdXA9bXQub3B0aW9uLG10LnRib2R5PW10LnRmb290PW10LmNvbGdyb3VwPW10LmNhcHRpb249bXQudGhlYWQsbXQudGg9bXQudGQ7dmFyIHd0LGt0LFN0PS88fCYjP1x3KzsvO2Z1bmN0aW9uIEV0KHQsZSxuLHIsbyl7Zm9yKHZhciBpLGEscyx1LGMsbCxmPWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLHA9W10saD0wLGQ9dC5sZW5ndGg7aDxkO2grKylpZigoaT10W2hdKXx8MD09PWkpaWYoIm9iamVjdCI9PT1rKGkpKVMubWVyZ2UocCxpLm5vZGVUeXBlP1tpXTppKTtlbHNlIGlmKFN0LnRlc3QoaSkpe2ZvcihhPWF8fGYuYXBwZW5kQ2hpbGQoZS5jcmVhdGVFbGVtZW50KCJkaXYiKSkscz0odnQuZXhlYyhpKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSx1PW10W3NdfHxtdC5fZGVmYXVsdCxhLmlubmVySFRNTD11WzFdK1MuaHRtbFByZWZpbHRlcihpKSt1WzJdLGw9dVswXTtsLS07KWE9YS5sYXN0Q2hpbGQ7Uy5tZXJnZShwLGEuY2hpbGROb2RlcyksKGE9Zi5maXJzdENoaWxkKS50ZXh0Q29udGVudD0iIn1lbHNlIHAucHVzaChlLmNyZWF0ZVRleHROb2RlKGkpKTtmb3IoZi50ZXh0Q29udGVudD0iIixoPTA7aT1wW2grK107KWlmKHImJlMuaW5BcnJheShpLHIpPi0xKW8mJm8ucHVzaChpKTtlbHNlIGlmKGM9c3QoaSksYT1idChmLmFwcGVuZENoaWxkKGkpLCJzY3JpcHQiKSxjJiZ4dChhKSxuKWZvcihsPTA7aT1hW2wrK107KXl0LnRlc3QoaS50eXBlfHwiIikmJm4ucHVzaChpKTtyZXR1cm4gZn13dD1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5hcHBlbmRDaGlsZChhLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSwoa3Q9YS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGt0LnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxrdC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0Iiksd3QuYXBwZW5kQ2hpbGQoa3QpLHkuY2hlY2tDbG9uZT13dC5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsd3QuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+Iix5Lm5vQ2xvbmVDaGVja2VkPSEhd3QuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlO3ZhciBqdD0vXmtleS8sVHQ9L14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLE90PS9eKFteLl0qKSg/OlwuKC4rKXwpLztmdW5jdGlvbiBBdCgpe3JldHVybiEwfWZ1bmN0aW9uIEN0KCl7cmV0dXJuITF9ZnVuY3Rpb24gTHQodCxlKXtyZXR1cm4gdD09PWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBhLmFjdGl2ZUVsZW1lbnR9Y2F0Y2godCl7fX0oKT09KCJmb2N1cyI9PT1lKX1mdW5jdGlvbiBSdCh0LGUsbixyLG8saSl7dmFyIGEscztpZigib2JqZWN0Ij09dHlwZW9mIGUpe2ZvcihzIGluInN0cmluZyIhPXR5cGVvZiBuJiYocj1yfHxuLG49dm9pZCAwKSxlKVJ0KHQscyxuLHIsZVtzXSxpKTtyZXR1cm4gdH1pZihudWxsPT1yJiZudWxsPT1vPyhvPW4scj1uPXZvaWQgMCk6bnVsbD09byYmKCJzdHJpbmciPT10eXBlb2Ygbj8obz1yLHI9dm9pZCAwKToobz1yLHI9bixuPXZvaWQgMCkpLCExPT09bylvPUN0O2Vsc2UgaWYoIW8pcmV0dXJuIHQ7cmV0dXJuIDE9PT1pJiYoYT1vLChvPWZ1bmN0aW9uKHQpe3JldHVybiBTKCkub2ZmKHQpLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfSkuZ3VpZD1hLmd1aWR8fChhLmd1aWQ9Uy5ndWlkKyspKSx0LmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LmFkZCh0aGlzLGUsbyxyLG4pfSl9ZnVuY3Rpb24gUHQodCxlLG4pe24/KFEuc2V0KHQsZSwhMSksUy5ldmVudC5hZGQodCxlLHtuYW1lc3BhY2U6ITEsaGFuZGxlcjpmdW5jdGlvbih0KXt2YXIgcixvLGk9US5nZXQodGhpcyxlKTtpZigxJnQuaXNUcmlnZ2VyJiZ0aGlzW2VdKXtpZihpLmxlbmd0aCkoUy5ldmVudC5zcGVjaWFsW2VdfHx7fSkuZGVsZWdhdGVUeXBlJiZ0LnN0b3BQcm9wYWdhdGlvbigpO2Vsc2UgaWYoaT11LmNhbGwoYXJndW1lbnRzKSxRLnNldCh0aGlzLGUsaSkscj1uKHRoaXMsZSksdGhpc1tlXSgpLGkhPT0obz1RLmdldCh0aGlzLGUpKXx8cj9RLnNldCh0aGlzLGUsITEpOm89e30saSE9PW8pcmV0dXJuIHQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdC5wcmV2ZW50RGVmYXVsdCgpLG8udmFsdWV9ZWxzZSBpLmxlbmd0aCYmKFEuc2V0KHRoaXMsZSx7dmFsdWU6Uy5ldmVudC50cmlnZ2VyKFMuZXh0ZW5kKGlbMF0sUy5FdmVudC5wcm90b3R5cGUpLGkuc2xpY2UoMSksdGhpcyl9KSx0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpKX19KSk6dm9pZCAwPT09US5nZXQodCxlKSYmUy5ldmVudC5hZGQodCxlLEF0KX1TLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGksYSxzLHUsYyxsLGYscCxoLGQsZyx2PVEuZ2V0KHQpO2lmKHYpZm9yKG4uaGFuZGxlciYmKG49KGk9bikuaGFuZGxlcixvPWkuc2VsZWN0b3IpLG8mJlMuZmluZC5tYXRjaGVzU2VsZWN0b3IoYXQsbyksbi5ndWlkfHwobi5ndWlkPVMuZ3VpZCsrKSwodT12LmV2ZW50cyl8fCh1PXYuZXZlbnRzPXt9KSwoYT12LmhhbmRsZSl8fChhPXYuaGFuZGxlPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT1TJiZTLmV2ZW50LnRyaWdnZXJlZCE9PWUudHlwZT9TLmV2ZW50LmRpc3BhdGNoLmFwcGx5KHQsYXJndW1lbnRzKTp2b2lkIDB9KSxjPShlPShlfHwiIikubWF0Y2goVSl8fFsiIl0pLmxlbmd0aDtjLS07KWg9Zz0ocz1PdC5leGVjKGVbY10pfHxbXSlbMV0sZD0oc1syXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGgmJihmPVMuZXZlbnQuc3BlY2lhbFtoXXx8e30saD0obz9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8aCxmPVMuZXZlbnQuc3BlY2lhbFtoXXx8e30sbD1TLmV4dGVuZCh7dHlwZTpoLG9yaWdUeXBlOmcsZGF0YTpyLGhhbmRsZXI6bixndWlkOm4uZ3VpZCxzZWxlY3RvcjpvLG5lZWRzQ29udGV4dDpvJiZTLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QobyksbmFtZXNwYWNlOmQuam9pbigiLiIpfSxpKSwocD11W2hdKXx8KChwPXVbaF09W10pLmRlbGVnYXRlQ291bnQ9MCxmLnNldHVwJiYhMSE9PWYuc2V0dXAuY2FsbCh0LHIsZCxhKXx8dC5hZGRFdmVudExpc3RlbmVyJiZ0LmFkZEV2ZW50TGlzdGVuZXIoaCxhKSksZi5hZGQmJihmLmFkZC5jYWxsKHQsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1uLmd1aWQpKSxvP3Auc3BsaWNlKHAuZGVsZWdhdGVDb3VudCsrLDAsbCk6cC5wdXNoKGwpLFMuZXZlbnQuZ2xvYmFsW2hdPSEwKX0scmVtb3ZlOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGksYSxzLHUsYyxsLGYscCxoLGQsZyx2PVEuaGFzRGF0YSh0KSYmUS5nZXQodCk7aWYodiYmKHU9di5ldmVudHMpKXtmb3IoYz0oZT0oZXx8IiIpLm1hdGNoKFUpfHxbIiJdKS5sZW5ndGg7Yy0tOylpZihoPWc9KHM9T3QuZXhlYyhlW2NdKXx8W10pWzFdLGQ9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxoKXtmb3IoZj1TLmV2ZW50LnNwZWNpYWxbaF18fHt9LHA9dVtoPShyP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxoXXx8W10scz1zWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitkLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGE9aT1wLmxlbmd0aDtpLS07KWw9cFtpXSwhbyYmZyE9PWwub3JpZ1R5cGV8fG4mJm4uZ3VpZCE9PWwuZ3VpZHx8cyYmIXMudGVzdChsLm5hbWVzcGFjZSl8fHImJnIhPT1sLnNlbGVjdG9yJiYoIioqIiE9PXJ8fCFsLnNlbGVjdG9yKXx8KHAuc3BsaWNlKGksMSksbC5zZWxlY3RvciYmcC5kZWxlZ2F0ZUNvdW50LS0sZi5yZW1vdmUmJmYucmVtb3ZlLmNhbGwodCxsKSk7YSYmIXAubGVuZ3RoJiYoZi50ZWFyZG93biYmITEhPT1mLnRlYXJkb3duLmNhbGwodCxkLHYuaGFuZGxlKXx8Uy5yZW1vdmVFdmVudCh0LGgsdi5oYW5kbGUpLGRlbGV0ZSB1W2hdKX1lbHNlIGZvcihoIGluIHUpUy5ldmVudC5yZW1vdmUodCxoK2VbY10sbixyLCEwKTtTLmlzRW1wdHlPYmplY3QodSkmJlEucmVtb3ZlKHQsImhhbmRsZSBldmVudHMiKX19LGRpc3BhdGNoOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYSxzPVMuZXZlbnQuZml4KHQpLHU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLGM9KFEuZ2V0KHRoaXMsImV2ZW50cyIpfHx7fSlbcy50eXBlXXx8W10sbD1TLmV2ZW50LnNwZWNpYWxbcy50eXBlXXx8e307Zm9yKHVbMF09cyxlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl1W2VdPWFyZ3VtZW50c1tlXTtpZihzLmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWwucHJlRGlzcGF0Y2h8fCExIT09bC5wcmVEaXNwYXRjaC5jYWxsKHRoaXMscykpe2ZvcihhPVMuZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLHMsYyksZT0wOyhvPWFbZSsrXSkmJiFzLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7KWZvcihzLmN1cnJlbnRUYXJnZXQ9by5lbGVtLG49MDsoaT1vLmhhbmRsZXJzW24rK10pJiYhcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpOylzLnJuYW1lc3BhY2UmJiExIT09aS5uYW1lc3BhY2UmJiFzLnJuYW1lc3BhY2UudGVzdChpLm5hbWVzcGFjZSl8fChzLmhhbmRsZU9iaj1pLHMuZGF0YT1pLmRhdGEsdm9pZCAwIT09KHI9KChTLmV2ZW50LnNwZWNpYWxbaS5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fGkuaGFuZGxlcikuYXBwbHkoby5lbGVtLHUpKSYmITE9PT0ocy5yZXN1bHQ9cikmJihzLnByZXZlbnREZWZhdWx0KCkscy5zdG9wUHJvcGFnYXRpb24oKSkpO3JldHVybiBsLnBvc3REaXNwYXRjaCYmbC5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLHMpLHMucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24odCxlKXt2YXIgbixyLG8saSxhLHM9W10sdT1lLmRlbGVnYXRlQ291bnQsYz10LnRhcmdldDtpZih1JiZjLm5vZGVUeXBlJiYhKCJjbGljayI9PT10LnR5cGUmJnQuYnV0dG9uPj0xKSlmb3IoO2MhPT10aGlzO2M9Yy5wYXJlbnROb2RlfHx0aGlzKWlmKDE9PT1jLm5vZGVUeXBlJiYoImNsaWNrIiE9PXQudHlwZXx8ITAhPT1jLmRpc2FibGVkKSl7Zm9yKGk9W10sYT17fSxuPTA7bjx1O24rKyl2b2lkIDA9PT1hW289KHI9ZVtuXSkuc2VsZWN0b3IrIiAiXSYmKGFbb109ci5uZWVkc0NvbnRleHQ/UyhvLHRoaXMpLmluZGV4KGMpPi0xOlMuZmluZChvLHRoaXMsbnVsbCxbY10pLmxlbmd0aCksYVtvXSYmaS5wdXNoKHIpO2kubGVuZ3RoJiZzLnB1c2goe2VsZW06YyxoYW5kbGVyczppfSl9cmV0dXJuIGM9dGhpcyx1PGUubGVuZ3RoJiZzLnB1c2goe2VsZW06YyxoYW5kbGVyczplLnNsaWNlKHUpfSksc30sYWRkUHJvcDpmdW5jdGlvbih0LGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShTLkV2ZW50LnByb3RvdHlwZSx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6bShlKT9mdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gZSh0aGlzLm9yaWdpbmFsRXZlbnQpfTpmdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50W3RdfSxzZXQ6ZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZX0pfX0pfSxmaXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRbUy5leHBhbmRvXT90Om5ldyBTLkV2ZW50KHQpfSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sY2xpY2s6e3NldHVwOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXN8fHQ7cmV0dXJuIGd0LnRlc3QoZS50eXBlKSYmZS5jbGljayYmTChlLCJpbnB1dCIpJiZQdChlLCJjbGljayIsQXQpLCExfSx0cmlnZ2VyOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXN8fHQ7cmV0dXJuIGd0LnRlc3QoZS50eXBlKSYmZS5jbGljayYmTChlLCJpbnB1dCIpJiZQdChlLCJjbGljayIpLCEwfSxfZGVmYXVsdDpmdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldDtyZXR1cm4gZ3QudGVzdChlLnR5cGUpJiZlLmNsaWNrJiZMKGUsImlucHV0IikmJlEuZ2V0KGUsImNsaWNrIil8fEwoZSwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24odCl7dm9pZCAwIT09dC5yZXN1bHQmJnQub3JpZ2luYWxFdmVudCYmKHQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT10LnJlc3VsdCl9fX19LFMucmVtb3ZlRXZlbnQ9ZnVuY3Rpb24odCxlLG4pe3QucmVtb3ZlRXZlbnRMaXN0ZW5lciYmdC5yZW1vdmVFdmVudExpc3RlbmVyKGUsbil9LFMuRXZlbnQ9ZnVuY3Rpb24odCxlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBTLkV2ZW50KSlyZXR1cm4gbmV3IFMuRXZlbnQodCxlKTt0JiZ0LnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD10LHRoaXMudHlwZT10LnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9dC5kZWZhdWx0UHJldmVudGVkfHx2b2lkIDA9PT10LmRlZmF1bHRQcmV2ZW50ZWQmJiExPT09dC5yZXR1cm5WYWx1ZT9BdDpDdCx0aGlzLnRhcmdldD10LnRhcmdldCYmMz09PXQudGFyZ2V0Lm5vZGVUeXBlP3QudGFyZ2V0LnBhcmVudE5vZGU6dC50YXJnZXQsdGhpcy5jdXJyZW50VGFyZ2V0PXQuY3VycmVudFRhcmdldCx0aGlzLnJlbGF0ZWRUYXJnZXQ9dC5yZWxhdGVkVGFyZ2V0KTp0aGlzLnR5cGU9dCxlJiZTLmV4dGVuZCh0aGlzLGUpLHRoaXMudGltZVN0YW1wPXQmJnQudGltZVN0YW1wfHxEYXRlLm5vdygpLHRoaXNbUy5leHBhbmRvXT0hMH0sUy5FdmVudC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlMuRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOkN0LGlzUHJvcGFnYXRpb25TdG9wcGVkOkN0LGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOkN0LGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPUF0LHQmJiF0aGlzLmlzU2ltdWxhdGVkJiZ0LnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPUF0LHQmJiF0aGlzLmlzU2ltdWxhdGVkJiZ0LnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1BdCx0JiYhdGhpcy5pc1NpbXVsYXRlZCYmdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sUy5lYWNoKHthbHRLZXk6ITAsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNoYW5nZWRUb3VjaGVzOiEwLGN0cmxLZXk6ITAsZGV0YWlsOiEwLGV2ZW50UGhhc2U6ITAsbWV0YUtleTohMCxwYWdlWDohMCxwYWdlWTohMCxzaGlmdEtleTohMCx2aWV3OiEwLGNoYXI6ITAsY29kZTohMCxjaGFyQ29kZTohMCxrZXk6ITAsa2V5Q29kZTohMCxidXR0b246ITAsYnV0dG9uczohMCxjbGllbnRYOiEwLGNsaWVudFk6ITAsb2Zmc2V0WDohMCxvZmZzZXRZOiEwLHBvaW50ZXJJZDohMCxwb2ludGVyVHlwZTohMCxzY3JlZW5YOiEwLHNjcmVlblk6ITAsdGFyZ2V0VG91Y2hlczohMCx0b0VsZW1lbnQ6ITAsdG91Y2hlczohMCx3aGljaDpmdW5jdGlvbih0KXt2YXIgZT10LmJ1dHRvbjtyZXR1cm4gbnVsbD09dC53aGljaCYmanQudGVzdCh0LnR5cGUpP251bGwhPXQuY2hhckNvZGU/dC5jaGFyQ29kZTp0LmtleUNvZGU6IXQud2hpY2gmJnZvaWQgMCE9PWUmJlR0LnRlc3QodC50eXBlKT8xJmU/MToyJmU/Mzo0JmU/MjowOnQud2hpY2h9fSxTLmV2ZW50LmFkZFByb3ApLFMuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24odCxlKXtTLmV2ZW50LnNwZWNpYWxbdF09e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIFB0KHRoaXMsdCxMdCksITF9LHRyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gUHQodGhpcyx0KSwhMH0sZGVsZWdhdGVUeXBlOmV9fSksUy5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbih0LGUpe1MuZXZlbnQuc3BlY2lhbFt0XT17ZGVsZWdhdGVUeXBlOmUsYmluZFR5cGU6ZSxoYW5kbGU6ZnVuY3Rpb24odCl7dmFyIG4scj10aGlzLG89dC5yZWxhdGVkVGFyZ2V0LGk9dC5oYW5kbGVPYmo7cmV0dXJuIG8mJihvPT09cnx8Uy5jb250YWlucyhyLG8pKXx8KHQudHlwZT1pLm9yaWdUeXBlLG49aS5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LnR5cGU9ZSksbn19fSksUy5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBSdCh0aGlzLHQsZSxuLHIpfSxvbmU6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIFJ0KHRoaXMsdCxlLG4sciwxKX0sb2ZmOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvO2lmKHQmJnQucHJldmVudERlZmF1bHQmJnQuaGFuZGxlT2JqKXJldHVybiByPXQuaGFuZGxlT2JqLFModC5kZWxlZ2F0ZVRhcmdldCkub2ZmKHIubmFtZXNwYWNlP3Iub3JpZ1R5cGUrIi4iK3IubmFtZXNwYWNlOnIub3JpZ1R5cGUsci5zZWxlY3RvcixyLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiB0KXtmb3IobyBpbiB0KXRoaXMub2ZmKG8sZSx0W29dKTtyZXR1cm4gdGhpc31yZXR1cm4hMSE9PWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlfHwobj1lLGU9dm9pZCAwKSwhMT09PW4mJihuPUN0KSx0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LnJlbW92ZSh0aGlzLHQsbixlKX0pfX0pO3ZhciBOdD0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksSXQ9LzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksX3Q9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksRHQ9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nO2Z1bmN0aW9uIE10KHQsZSl7cmV0dXJuIEwodCwidGFibGUiKSYmTCgxMSE9PWUubm9kZVR5cGU/ZTplLmZpcnN0Q2hpbGQsInRyIikmJlModCkuY2hpbGRyZW4oInRib2R5IilbMF18fHR9ZnVuY3Rpb24gVXQodCl7cmV0dXJuIHQudHlwZT0obnVsbCE9PXQuZ2V0QXR0cmlidXRlKCJ0eXBlIikpKyIvIit0LnR5cGUsdH1mdW5jdGlvbiBCdCh0KXtyZXR1cm4idHJ1ZS8iPT09KHQudHlwZXx8IiIpLnNsaWNlKDAsNSk/dC50eXBlPXQudHlwZS5zbGljZSg1KTp0LnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLHR9ZnVuY3Rpb24gcXQodCxlKXt2YXIgbixyLG8saSxhLHMsdSxjO2lmKDE9PT1lLm5vZGVUeXBlKXtpZihRLmhhc0RhdGEodCkmJihpPVEuYWNjZXNzKHQpLGE9US5zZXQoZSxpKSxjPWkuZXZlbnRzKSlmb3IobyBpbiBkZWxldGUgYS5oYW5kbGUsYS5ldmVudHM9e30sYylmb3Iobj0wLHI9Y1tvXS5sZW5ndGg7bjxyO24rKylTLmV2ZW50LmFkZChlLG8sY1tvXVtuXSk7Wi5oYXNEYXRhKHQpJiYocz1aLmFjY2Vzcyh0KSx1PVMuZXh0ZW5kKHt9LHMpLFouc2V0KGUsdSkpfX1mdW5jdGlvbiBGdCh0LGUpe3ZhciBuPWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsiaW5wdXQiPT09biYmZ3QudGVzdCh0LnR5cGUpP2UuY2hlY2tlZD10LmNoZWNrZWQ6ImlucHV0IiE9PW4mJiJ0ZXh0YXJlYSIhPT1ufHwoZS5kZWZhdWx0VmFsdWU9dC5kZWZhdWx0VmFsdWUpfWZ1bmN0aW9uIEh0KHQsZSxuLHIpe2U9Yy5hcHBseShbXSxlKTt2YXIgbyxpLGEscyx1LGwsZj0wLHA9dC5sZW5ndGgsaD1wLTEsZD1lWzBdLGc9bShkKTtpZihnfHxwPjEmJiJzdHJpbmciPT10eXBlb2YgZCYmIXkuY2hlY2tDbG9uZSYmX3QudGVzdChkKSlyZXR1cm4gdC5lYWNoKGZ1bmN0aW9uKG8pe3ZhciBpPXQuZXEobyk7ZyYmKGVbMF09ZC5jYWxsKHRoaXMsbyxpLmh0bWwoKSkpLEh0KGksZSxuLHIpfSk7aWYocCYmKGk9KG89RXQoZSx0WzBdLm93bmVyRG9jdW1lbnQsITEsdCxyKSkuZmlyc3RDaGlsZCwxPT09by5jaGlsZE5vZGVzLmxlbmd0aCYmKG89aSksaXx8cikpe2ZvcihzPShhPVMubWFwKGJ0KG8sInNjcmlwdCIpLFV0KSkubGVuZ3RoO2Y8cDtmKyspdT1vLGYhPT1oJiYodT1TLmNsb25lKHUsITAsITApLHMmJlMubWVyZ2UoYSxidCh1LCJzY3JpcHQiKSkpLG4uY2FsbCh0W2ZdLHUsZik7aWYocylmb3IobD1hW2EubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsUy5tYXAoYSxCdCksZj0wO2Y8cztmKyspdT1hW2ZdLHl0LnRlc3QodS50eXBlfHwiIikmJiFRLmFjY2Vzcyh1LCJnbG9iYWxFdmFsIikmJlMuY29udGFpbnMobCx1KSYmKHUuc3JjJiYibW9kdWxlIiE9PSh1LnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpP1MuX2V2YWxVcmwmJiF1Lm5vTW9kdWxlJiZTLl9ldmFsVXJsKHUuc3JjLHtub25jZTp1Lm5vbmNlfHx1LmdldEF0dHJpYnV0ZSgibm9uY2UiKX0pOncodS50ZXh0Q29udGVudC5yZXBsYWNlKER0LCIiKSx1LGwpKX1yZXR1cm4gdH1mdW5jdGlvbiB6dCh0LGUsbil7Zm9yKHZhciByLG89ZT9TLmZpbHRlcihlLHQpOnQsaT0wO251bGwhPShyPW9baV0pO2krKylufHwxIT09ci5ub2RlVHlwZXx8Uy5jbGVhbkRhdGEoYnQocikpLHIucGFyZW50Tm9kZSYmKG4mJnN0KHIpJiZ4dChidChyLCJzY3JpcHQiKSksci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHIpKTtyZXR1cm4gdH1TLmV4dGVuZCh7aHRtbFByZWZpbHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdC5yZXBsYWNlKE50LCI8JDE+PC8kMj4iKX0sY2xvbmU6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhLHM9dC5jbG9uZU5vZGUoITApLHU9c3QodCk7aWYoISh5Lm5vQ2xvbmVDaGVja2VkfHwxIT09dC5ub2RlVHlwZSYmMTEhPT10Lm5vZGVUeXBlfHxTLmlzWE1MRG9jKHQpKSlmb3IoYT1idChzKSxyPTAsbz0oaT1idCh0KSkubGVuZ3RoO3I8bztyKyspRnQoaVtyXSxhW3JdKTtpZihlKWlmKG4pZm9yKGk9aXx8YnQodCksYT1hfHxidChzKSxyPTAsbz1pLmxlbmd0aDtyPG87cisrKXF0KGlbcl0sYVtyXSk7ZWxzZSBxdCh0LHMpO3JldHVybihhPWJ0KHMsInNjcmlwdCIpKS5sZW5ndGg+MCYmeHQoYSwhdSYmYnQodCwic2NyaXB0IikpLHN9LGNsZWFuRGF0YTpmdW5jdGlvbih0KXtmb3IodmFyIGUsbixyLG89Uy5ldmVudC5zcGVjaWFsLGk9MDt2b2lkIDAhPT0obj10W2ldKTtpKyspaWYoWChuKSl7aWYoZT1uW1EuZXhwYW5kb10pe2lmKGUuZXZlbnRzKWZvcihyIGluIGUuZXZlbnRzKW9bcl0/Uy5ldmVudC5yZW1vdmUobixyKTpTLnJlbW92ZUV2ZW50KG4scixlLmhhbmRsZSk7bltRLmV4cGFuZG9dPXZvaWQgMH1uW1ouZXhwYW5kb10mJihuW1ouZXhwYW5kb109dm9pZCAwKX19fSksUy5mbi5leHRlbmQoe2RldGFjaDpmdW5jdGlvbih0KXtyZXR1cm4genQodGhpcyx0LCEwKX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiB6dCh0aGlzLHQpfSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQ/Uy50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5lYWNoKGZ1bmN0aW9uKCl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fCh0aGlzLnRleHRDb250ZW50PXQpfSl9LG51bGwsdCxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIEh0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpezEhPT10aGlzLm5vZGVUeXBlJiYxMSE9PXRoaXMubm9kZVR5cGUmJjkhPT10aGlzLm5vZGVUeXBlfHxNdCh0aGlzLHQpLmFwcGVuZENoaWxkKHQpfSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSHQodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24odCl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBlPU10KHRoaXMsdCk7ZS5pbnNlcnRCZWZvcmUodCxlLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gSHQodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24odCl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHQsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gSHQodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24odCl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHQsdGhpcy5uZXh0U2libGluZyl9KX0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIHQsZT0wO251bGwhPSh0PXRoaXNbZV0pO2UrKykxPT09dC5ub2RlVHlwZSYmKFMuY2xlYW5EYXRhKGJ0KHQsITEpKSx0LnRleHRDb250ZW50PSIiKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD1udWxsIT10JiZ0LGU9bnVsbD09ZT90OmUsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gUy5jbG9uZSh0aGlzLHQsZSl9KX0saHRtbDpmdW5jdGlvbih0KXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXNbMF18fHt9LG49MCxyPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PXQmJjE9PT1lLm5vZGVUeXBlKXJldHVybiBlLmlubmVySFRNTDtpZigic3RyaW5nIj09dHlwZW9mIHQmJiFJdC50ZXN0KHQpJiYhbXRbKHZ0LmV4ZWModCl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXt0PVMuaHRtbFByZWZpbHRlcih0KTt0cnl7Zm9yKDtuPHI7bisrKTE9PT0oZT10aGlzW25dfHx7fSkubm9kZVR5cGUmJihTLmNsZWFuRGF0YShidChlLCExKSksZS5pbm5lckhUTUw9dCk7ZT0wfWNhdGNoKHQpe319ZSYmdGhpcy5lbXB0eSgpLmFwcGVuZCh0KX0sbnVsbCx0LGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiBIdCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7Uy5pbkFycmF5KHRoaXMsdCk8MCYmKFMuY2xlYW5EYXRhKGJ0KHRoaXMpKSxuJiZuLnJlcGxhY2VDaGlsZChlLHRoaXMpKX0sdCl9fSksUy5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24odCxlKXtTLmZuW3RdPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixyPVtdLG89Uyh0KSxpPW8ubGVuZ3RoLTEsYT0wO2E8PWk7YSsrKW49YT09PWk/dGhpczp0aGlzLmNsb25lKCEwKSxTKG9bYV0pW2VdKG4pLGwuYXBwbHkocixuLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2socil9fSk7dmFyIFd0PW5ldyBSZWdFeHAoIl4oIitydCsiKSg/IXB4KVthLXolXSskIiwiaSIpLCR0PWZ1bmN0aW9uKHQpe3ZhciBlPXQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztyZXR1cm4gZSYmZS5vcGVuZXJ8fChlPW4pLGUuZ2V0Q29tcHV0ZWRTdHlsZSh0KX0sWXQ9bmV3IFJlZ0V4cChpdC5qb2luKCJ8IiksImkiKTtmdW5jdGlvbiBWdCh0LGUsbil7dmFyIHIsbyxpLGEscz10LnN0eWxlO3JldHVybihuPW58fCR0KHQpKSYmKCIiIT09KGE9bi5nZXRQcm9wZXJ0eVZhbHVlKGUpfHxuW2VdKXx8c3QodCl8fChhPVMuc3R5bGUodCxlKSksIXkucGl4ZWxCb3hTdHlsZXMoKSYmV3QudGVzdChhKSYmWXQudGVzdChlKSYmKHI9cy53aWR0aCxvPXMubWluV2lkdGgsaT1zLm1heFdpZHRoLHMubWluV2lkdGg9cy5tYXhXaWR0aD1zLndpZHRoPWEsYT1uLndpZHRoLHMud2lkdGg9cixzLm1pbldpZHRoPW8scy5tYXhXaWR0aD1pKSksdm9pZCAwIT09YT9hKyIiOmF9ZnVuY3Rpb24gR3QodCxlKXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7aWYoIXQoKSlyZXR1cm4odGhpcy5nZXQ9ZSkuYXBwbHkodGhpcyxhcmd1bWVudHMpO2RlbGV0ZSB0aGlzLmdldH19fSFmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtpZihsKXtjLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDttYXJnaW4tdG9wOjFweDtwYWRkaW5nOjA7Ym9yZGVyOjAiLGwuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NjAlO3RvcDoxJSIsYXQuYXBwZW5kQ2hpbGQoYykuYXBwZW5kQ2hpbGQobCk7dmFyIHQ9bi5nZXRDb21wdXRlZFN0eWxlKGwpO3I9IjElIiE9PXQudG9wLHU9MTI9PT1lKHQubWFyZ2luTGVmdCksbC5zdHlsZS5yaWdodD0iNjAlIixzPTM2PT09ZSh0LnJpZ2h0KSxvPTM2PT09ZSh0LndpZHRoKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaT0xMj09PWUobC5vZmZzZXRXaWR0aC8zKSxhdC5yZW1vdmVDaGlsZChjKSxsPW51bGx9fWZ1bmN0aW9uIGUodCl7cmV0dXJuIE1hdGgucm91bmQocGFyc2VGbG9hdCh0KSl9dmFyIHIsbyxpLHMsdSxjPWEuY3JlYXRlRWxlbWVudCgiZGl2IiksbD1hLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuc3R5bGUmJihsLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsbC5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLHkuY2xlYXJDbG9uZVN0eWxlPSJjb250ZW50LWJveCI9PT1sLnN0eWxlLmJhY2tncm91bmRDbGlwLFMuZXh0ZW5kKHkse2JveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxvfSxwaXhlbEJveFN0eWxlczpmdW5jdGlvbigpe3JldHVybiB0KCksc30scGl4ZWxQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiB0KCkscn0scmVsaWFibGVNYXJnaW5MZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSx1fSxzY3JvbGxib3hTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxpfX0pKX0oKTt2YXIgS3Q9WyJXZWJraXQiLCJNb3oiLCJtcyJdLFh0PWEuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsSnQ9e307ZnVuY3Rpb24gUXQodCl7dmFyIGU9Uy5jc3NQcm9wc1t0XXx8SnRbdF07cmV0dXJuIGV8fCh0IGluIFh0P3Q6SnRbdF09ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpLG49S3QubGVuZ3RoO24tLTspaWYoKHQ9S3Rbbl0rZSlpbiBYdClyZXR1cm4gdH0odCl8fHQpfXZhciBadD0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sdGU9L14tLS8sZWU9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LG5lPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifTtmdW5jdGlvbiByZSh0LGUsbil7dmFyIHI9b3QuZXhlYyhlKTtyZXR1cm4gcj9NYXRoLm1heCgwLHJbMl0tKG58fDApKSsoclszXXx8InB4Iik6ZX1mdW5jdGlvbiBvZSh0LGUsbixyLG8saSl7dmFyIGE9IndpZHRoIj09PWU/MTowLHM9MCx1PTA7aWYobj09PShyPyJib3JkZXIiOiJjb250ZW50IikpcmV0dXJuIDA7Zm9yKDthPDQ7YSs9MikibWFyZ2luIj09PW4mJih1Kz1TLmNzcyh0LG4raXRbYV0sITAsbykpLHI/KCJjb250ZW50Ij09PW4mJih1LT1TLmNzcyh0LCJwYWRkaW5nIitpdFthXSwhMCxvKSksIm1hcmdpbiIhPT1uJiYodS09Uy5jc3ModCwiYm9yZGVyIitpdFthXSsiV2lkdGgiLCEwLG8pKSk6KHUrPVMuY3NzKHQsInBhZGRpbmciK2l0W2FdLCEwLG8pLCJwYWRkaW5nIiE9PW4/dSs9Uy5jc3ModCwiYm9yZGVyIitpdFthXSsiV2lkdGgiLCEwLG8pOnMrPVMuY3NzKHQsImJvcmRlciIraXRbYV0rIldpZHRoIiwhMCxvKSk7cmV0dXJuIXImJmk+PTAmJih1Kz1NYXRoLm1heCgwLE1hdGguY2VpbCh0WyJvZmZzZXQiK2VbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpXS1pLXUtcy0uNSkpfHwwKSx1fWZ1bmN0aW9uIGllKHQsZSxuKXt2YXIgcj0kdCh0KSxvPSgheS5ib3hTaXppbmdSZWxpYWJsZSgpfHxuKSYmImJvcmRlci1ib3giPT09Uy5jc3ModCwiYm94U2l6aW5nIiwhMSxyKSxpPW8sYT1WdCh0LGUscikscz0ib2Zmc2V0IitlWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKTtpZihXdC50ZXN0KGEpKXtpZighbilyZXR1cm4gYTthPSJhdXRvIn1yZXR1cm4oIXkuYm94U2l6aW5nUmVsaWFibGUoKSYmb3x8ImF1dG8iPT09YXx8IXBhcnNlRmxvYXQoYSkmJiJpbmxpbmUiPT09Uy5jc3ModCwiZGlzcGxheSIsITEscikpJiZ0LmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiYobz0iYm9yZGVyLWJveCI9PT1TLmNzcyh0LCJib3hTaXppbmciLCExLHIpLChpPXMgaW4gdCkmJihhPXRbc10pKSwoYT1wYXJzZUZsb2F0KGEpfHwwKStvZSh0LGUsbnx8KG8/ImJvcmRlciI6ImNvbnRlbnQiKSxpLHIsYSkrInB4In1mdW5jdGlvbiBhZSh0LGUsbixyLG8pe3JldHVybiBuZXcgYWUucHJvdG90eXBlLmluaXQodCxlLG4scixvKX1TLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbih0LGUpe2lmKGUpe3ZhciBuPVZ0KHQsIm9wYWNpdHkiKTtyZXR1cm4iIj09PW4/IjEiOm59fX19LGNzc051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsY29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGdyaWRBcmVhOiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTdGFydDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnt9LHN0eWxlOmZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQmJjMhPT10Lm5vZGVUeXBlJiY4IT09dC5ub2RlVHlwZSYmdC5zdHlsZSl7dmFyIG8saSxhLHM9SyhlKSx1PXRlLnRlc3QoZSksYz10LnN0eWxlO2lmKHV8fChlPVF0KHMpKSxhPVMuY3NzSG9va3NbZV18fFMuY3NzSG9va3Nbc10sdm9pZCAwPT09bilyZXR1cm4gYSYmImdldCJpbiBhJiZ2b2lkIDAhPT0obz1hLmdldCh0LCExLHIpKT9vOmNbZV07InN0cmluZyI9PT0oaT10eXBlb2YgbikmJihvPW90LmV4ZWMobikpJiZvWzFdJiYobj1mdCh0LGUsbyksaT0ibnVtYmVyIiksbnVsbCE9biYmbj09biYmKCJudW1iZXIiIT09aXx8dXx8KG4rPW8mJm9bM118fChTLmNzc051bWJlcltzXT8iIjoicHgiKSkseS5jbGVhckNsb25lU3R5bGV8fCIiIT09bnx8MCE9PWUuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoY1tlXT0iaW5oZXJpdCIpLGEmJiJzZXQiaW4gYSYmdm9pZCAwPT09KG49YS5zZXQodCxuLHIpKXx8KHU/Yy5zZXRQcm9wZXJ0eShlLG4pOmNbZV09bikpfX0sY3NzOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvLGksYSxzPUsoZSk7cmV0dXJuIHRlLnRlc3QoZSl8fChlPVF0KHMpKSwoYT1TLmNzc0hvb2tzW2VdfHxTLmNzc0hvb2tzW3NdKSYmImdldCJpbiBhJiYobz1hLmdldCh0LCEwLG4pKSx2b2lkIDA9PT1vJiYobz1WdCh0LGUscikpLCJub3JtYWwiPT09byYmZSBpbiBuZSYmKG89bmVbZV0pLCIiPT09bnx8bj8oaT1wYXJzZUZsb2F0KG8pLCEwPT09bnx8aXNGaW5pdGUoaSk/aXx8MDpvKTpvfX0pLFMuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24odCxlKXtTLmNzc0hvb2tzW2VdPXtnZXQ6ZnVuY3Rpb24odCxuLHIpe2lmKG4pcmV0dXJuIVp0LnRlc3QoUy5jc3ModCwiZGlzcGxheSIpKXx8dC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aD9pZSh0LGUscik6bHQodCxlZSxmdW5jdGlvbigpe3JldHVybiBpZSh0LGUscil9KX0sc2V0OmZ1bmN0aW9uKHQsbixyKXt2YXIgbyxpPSR0KHQpLGE9IXkuc2Nyb2xsYm94U2l6ZSgpJiYiYWJzb2x1dGUiPT09aS5wb3NpdGlvbixzPShhfHxyKSYmImJvcmRlci1ib3giPT09Uy5jc3ModCwiYm94U2l6aW5nIiwhMSxpKSx1PXI/b2UodCxlLHIscyxpKTowO3JldHVybiBzJiZhJiYodS09TWF0aC5jZWlsKHRbIm9mZnNldCIrZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSldLXBhcnNlRmxvYXQoaVtlXSktb2UodCxlLCJib3JkZXIiLCExLGkpLS41KSksdSYmKG89b3QuZXhlYyhuKSkmJiJweCIhPT0ob1szXXx8InB4IikmJih0LnN0eWxlW2VdPW4sbj1TLmNzcyh0LGUpKSxyZSgwLG4sdSl9fX0pLFMuY3NzSG9va3MubWFyZ2luTGVmdD1HdCh5LnJlbGlhYmxlTWFyZ2luTGVmdCxmdW5jdGlvbih0LGUpe2lmKGUpcmV0dXJuKHBhcnNlRmxvYXQoVnQodCwibWFyZ2luTGVmdCIpKXx8dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LWx0KHQse21hcmdpbkxlZnQ6MH0sZnVuY3Rpb24oKXtyZXR1cm4gdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSkpKyJweCJ9KSxTLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbih0LGUpe1MuY3NzSG9va3NbdCtlXT17ZXhwYW5kOmZ1bmN0aW9uKG4pe2Zvcih2YXIgcj0wLG89e30saT0ic3RyaW5nIj09dHlwZW9mIG4/bi5zcGxpdCgiICIpOltuXTtyPDQ7cisrKW9bdCtpdFtyXStlXT1pW3JdfHxpW3ItMl18fGlbMF07cmV0dXJuIG99fSwibWFyZ2luIiE9PXQmJihTLmNzc0hvb2tzW3QrZV0uc2V0PXJlKX0pLFMuZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24odCxlKXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGk9e30sYT0wO2lmKEFycmF5LmlzQXJyYXkoZSkpe2ZvcihyPSR0KHQpLG89ZS5sZW5ndGg7YTxvO2ErKylpW2VbYV1dPVMuY3NzKHQsZVthXSwhMSxyKTtyZXR1cm4gaX1yZXR1cm4gdm9pZCAwIT09bj9TLnN0eWxlKHQsZSxuKTpTLmNzcyh0LGUpfSx0LGUsYXJndW1lbnRzLmxlbmd0aD4xKX19KSxTLlR3ZWVuPWFlLGFlLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YWUsaW5pdDpmdW5jdGlvbih0LGUsbixyLG8saSl7dGhpcy5lbGVtPXQsdGhpcy5wcm9wPW4sdGhpcy5lYXNpbmc9b3x8Uy5lYXNpbmcuX2RlZmF1bHQsdGhpcy5vcHRpb25zPWUsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPXIsdGhpcy51bml0PWl8fChTLmNzc051bWJlcltuXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIHQ9YWUucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHQmJnQuZ2V0P3QuZ2V0KHRoaXMpOmFlLnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbih0KXt2YXIgZSxuPWFlLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9ZT1TLmVhc2luZ1t0aGlzLmVhc2luZ10odCx0aGlzLm9wdGlvbnMuZHVyYXRpb24qdCwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz1lPXQsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKmUrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksbiYmbi5zZXQ/bi5zZXQodGhpcyk6YWUucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0sYWUucHJvdG90eXBlLmluaXQucHJvdG90eXBlPWFlLnByb3RvdHlwZSxhZS5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIDEhPT10LmVsZW0ubm9kZVR5cGV8fG51bGwhPXQuZWxlbVt0LnByb3BdJiZudWxsPT10LmVsZW0uc3R5bGVbdC5wcm9wXT90LmVsZW1bdC5wcm9wXTooZT1TLmNzcyh0LmVsZW0sdC5wcm9wLCIiKSkmJiJhdXRvIiE9PWU/ZTowfSxzZXQ6ZnVuY3Rpb24odCl7Uy5meC5zdGVwW3QucHJvcF0/Uy5meC5zdGVwW3QucHJvcF0odCk6MSE9PXQuZWxlbS5ub2RlVHlwZXx8IVMuY3NzSG9va3NbdC5wcm9wXSYmbnVsbD09dC5lbGVtLnN0eWxlW1F0KHQucHJvcCldP3QuZWxlbVt0LnByb3BdPXQubm93OlMuc3R5bGUodC5lbGVtLHQucHJvcCx0Lm5vdyt0LnVuaXQpfX19LGFlLnByb3BIb29rcy5zY3JvbGxUb3A9YWUucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbih0KXt0LmVsZW0ubm9kZVR5cGUmJnQuZWxlbS5wYXJlbnROb2RlJiYodC5lbGVtW3QucHJvcF09dC5ub3cpfX0sUy5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbih0KXtyZXR1cm4gdH0sc3dpbmc6ZnVuY3Rpb24odCl7cmV0dXJuLjUtTWF0aC5jb3ModCpNYXRoLlBJKS8yfSxfZGVmYXVsdDoic3dpbmcifSxTLmZ4PWFlLnByb3RvdHlwZS5pbml0LFMuZnguc3RlcD17fTt2YXIgc2UsdWUsY2U9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGxlPS9xdWV1ZUhvb2tzJC87ZnVuY3Rpb24gZmUoKXt1ZSYmKCExPT09YS5oaWRkZW4mJm4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lP24ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZlKTpuLnNldFRpbWVvdXQoZmUsUy5meC5pbnRlcnZhbCksUy5meC50aWNrKCkpfWZ1bmN0aW9uIHBlKCl7cmV0dXJuIG4uc2V0VGltZW91dChmdW5jdGlvbigpe3NlPXZvaWQgMH0pLHNlPURhdGUubm93KCl9ZnVuY3Rpb24gaGUodCxlKXt2YXIgbixyPTAsbz17aGVpZ2h0OnR9O2ZvcihlPWU/MTowO3I8NDtyKz0yLWUpb1sibWFyZ2luIisobj1pdFtyXSldPW9bInBhZGRpbmciK25dPXQ7cmV0dXJuIGUmJihvLm9wYWNpdHk9by53aWR0aD10KSxvfWZ1bmN0aW9uIGRlKHQsZSxuKXtmb3IodmFyIHIsbz0oZ2UudHdlZW5lcnNbZV18fFtdKS5jb25jYXQoZ2UudHdlZW5lcnNbIioiXSksaT0wLGE9by5sZW5ndGg7aTxhO2krKylpZihyPW9baV0uY2FsbChuLGUsdCkpcmV0dXJuIHJ9ZnVuY3Rpb24gZ2UodCxlLG4pe3ZhciByLG8saT0wLGE9Z2UucHJlZmlsdGVycy5sZW5ndGgscz1TLkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIHUuZWxlbX0pLHU9ZnVuY3Rpb24oKXtpZihvKXJldHVybiExO2Zvcih2YXIgZT1zZXx8cGUoKSxuPU1hdGgubWF4KDAsYy5zdGFydFRpbWUrYy5kdXJhdGlvbi1lKSxyPTEtKG4vYy5kdXJhdGlvbnx8MCksaT0wLGE9Yy50d2VlbnMubGVuZ3RoO2k8YTtpKyspYy50d2VlbnNbaV0ucnVuKHIpO3JldHVybiBzLm5vdGlmeVdpdGgodCxbYyxyLG5dKSxyPDEmJmE/bjooYXx8cy5ub3RpZnlXaXRoKHQsW2MsMSwwXSkscy5yZXNvbHZlV2l0aCh0LFtjXSksITEpfSxjPXMucHJvbWlzZSh7ZWxlbTp0LHByb3BzOlMuZXh0ZW5kKHt9LGUpLG9wdHM6Uy5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e30sZWFzaW5nOlMuZWFzaW5nLl9kZWZhdWx0fSxuKSxvcmlnaW5hbFByb3BlcnRpZXM6ZSxvcmlnaW5hbE9wdGlvbnM6bixzdGFydFRpbWU6c2V8fHBlKCksZHVyYXRpb246bi5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oZSxuKXt2YXIgcj1TLlR3ZWVuKHQsYy5vcHRzLGUsbixjLm9wdHMuc3BlY2lhbEVhc2luZ1tlXXx8Yy5vcHRzLmVhc2luZyk7cmV0dXJuIGMudHdlZW5zLnB1c2gocikscn0sc3RvcDpmdW5jdGlvbihlKXt2YXIgbj0wLHI9ZT9jLnR3ZWVucy5sZW5ndGg6MDtpZihvKXJldHVybiB0aGlzO2ZvcihvPSEwO248cjtuKyspYy50d2VlbnNbbl0ucnVuKDEpO3JldHVybiBlPyhzLm5vdGlmeVdpdGgodCxbYywxLDBdKSxzLnJlc29sdmVXaXRoKHQsW2MsZV0pKTpzLnJlamVjdFdpdGgodCxbYyxlXSksdGhpc319KSxsPWMucHJvcHM7Zm9yKCFmdW5jdGlvbih0LGUpe3ZhciBuLHIsbyxpLGE7Zm9yKG4gaW4gdClpZihvPWVbcj1LKG4pXSxpPXRbbl0sQXJyYXkuaXNBcnJheShpKSYmKG89aVsxXSxpPXRbbl09aVswXSksbiE9PXImJih0W3JdPWksZGVsZXRlIHRbbl0pLChhPVMuY3NzSG9va3Nbcl0pJiYiZXhwYW5kImluIGEpZm9yKG4gaW4gaT1hLmV4cGFuZChpKSxkZWxldGUgdFtyXSxpKW4gaW4gdHx8KHRbbl09aVtuXSxlW25dPW8pO2Vsc2UgZVtyXT1vfShsLGMub3B0cy5zcGVjaWFsRWFzaW5nKTtpPGE7aSsrKWlmKHI9Z2UucHJlZmlsdGVyc1tpXS5jYWxsKGMsdCxsLGMub3B0cykpcmV0dXJuIG0oci5zdG9wKSYmKFMuX3F1ZXVlSG9va3MoYy5lbGVtLGMub3B0cy5xdWV1ZSkuc3RvcD1yLnN0b3AuYmluZChyKSkscjtyZXR1cm4gUy5tYXAobCxkZSxjKSxtKGMub3B0cy5zdGFydCkmJmMub3B0cy5zdGFydC5jYWxsKHQsYyksYy5wcm9ncmVzcyhjLm9wdHMucHJvZ3Jlc3MpLmRvbmUoYy5vcHRzLmRvbmUsYy5vcHRzLmNvbXBsZXRlKS5mYWlsKGMub3B0cy5mYWlsKS5hbHdheXMoYy5vcHRzLmFsd2F5cyksUy5meC50aW1lcihTLmV4dGVuZCh1LHtlbGVtOnQsYW5pbTpjLHF1ZXVlOmMub3B0cy5xdWV1ZX0pKSxjfVMuQW5pbWF0aW9uPVMuZXh0ZW5kKGdlLHt0d2VlbmVyczp7IioiOltmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuY3JlYXRlVHdlZW4odCxlKTtyZXR1cm4gZnQobi5lbGVtLHQsb3QuZXhlYyhlKSxuKSxufV19LHR3ZWVuZXI6ZnVuY3Rpb24odCxlKXttKHQpPyhlPXQsdD1bIioiXSk6dD10Lm1hdGNoKFUpO2Zvcih2YXIgbixyPTAsbz10Lmxlbmd0aDtyPG87cisrKW49dFtyXSxnZS50d2VlbmVyc1tuXT1nZS50d2VlbmVyc1tuXXx8W10sZ2UudHdlZW5lcnNbbl0udW5zaGlmdChlKX0scHJlZmlsdGVyczpbZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhLHMsdSxjLGwsZj0id2lkdGgiaW4gZXx8ImhlaWdodCJpbiBlLHA9dGhpcyxoPXt9LGQ9dC5zdHlsZSxnPXQubm9kZVR5cGUmJmN0KHQpLHY9US5nZXQodCwiZnhzaG93Iik7Zm9yKHIgaW4gbi5xdWV1ZXx8KG51bGw9PShhPVMuX3F1ZXVlSG9va3ModCwiZngiKSkudW5xdWV1ZWQmJihhLnVucXVldWVkPTAscz1hLmVtcHR5LmZpcmUsYS5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7YS51bnF1ZXVlZHx8cygpfSksYS51bnF1ZXVlZCsrLHAuYWx3YXlzKGZ1bmN0aW9uKCl7cC5hbHdheXMoZnVuY3Rpb24oKXthLnVucXVldWVkLS0sUy5xdWV1ZSh0LCJmeCIpLmxlbmd0aHx8YS5lbXB0eS5maXJlKCl9KX0pKSxlKWlmKG89ZVtyXSxjZS50ZXN0KG8pKXtpZihkZWxldGUgZVtyXSxpPWl8fCJ0b2dnbGUiPT09byxvPT09KGc/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PW98fCF2fHx2b2lkIDA9PT12W3JdKWNvbnRpbnVlO2c9ITB9aFtyXT12JiZ2W3JdfHxTLnN0eWxlKHQscil9aWYoKHU9IVMuaXNFbXB0eU9iamVjdChlKSl8fCFTLmlzRW1wdHlPYmplY3QoaCkpZm9yKHIgaW4gZiYmMT09PXQubm9kZVR5cGUmJihuLm92ZXJmbG93PVtkLm92ZXJmbG93LGQub3ZlcmZsb3dYLGQub3ZlcmZsb3dZXSxudWxsPT0oYz12JiZ2LmRpc3BsYXkpJiYoYz1RLmdldCh0LCJkaXNwbGF5IikpLCJub25lIj09PShsPVMuY3NzKHQsImRpc3BsYXkiKSkmJihjP2w9YzooZHQoW3RdLCEwKSxjPXQuc3R5bGUuZGlzcGxheXx8YyxsPVMuY3NzKHQsImRpc3BsYXkiKSxkdChbdF0pKSksKCJpbmxpbmUiPT09bHx8ImlubGluZS1ibG9jayI9PT1sJiZudWxsIT1jKSYmIm5vbmUiPT09Uy5jc3ModCwiZmxvYXQiKSYmKHV8fChwLmRvbmUoZnVuY3Rpb24oKXtkLmRpc3BsYXk9Y30pLG51bGw9PWMmJihsPWQuZGlzcGxheSxjPSJub25lIj09PWw/IiI6bCkpLGQuZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLG4ub3ZlcmZsb3cmJihkLm92ZXJmbG93PSJoaWRkZW4iLHAuYWx3YXlzKGZ1bmN0aW9uKCl7ZC5vdmVyZmxvdz1uLm92ZXJmbG93WzBdLGQub3ZlcmZsb3dYPW4ub3ZlcmZsb3dbMV0sZC5vdmVyZmxvd1k9bi5vdmVyZmxvd1syXX0pKSx1PSExLGgpdXx8KHY/ImhpZGRlbiJpbiB2JiYoZz12LmhpZGRlbik6dj1RLmFjY2Vzcyh0LCJmeHNob3ciLHtkaXNwbGF5OmN9KSxpJiYodi5oaWRkZW49IWcpLGcmJmR0KFt0XSwhMCkscC5kb25lKGZ1bmN0aW9uKCl7Zm9yKHIgaW4gZ3x8ZHQoW3RdKSxRLnJlbW92ZSh0LCJmeHNob3ciKSxoKVMuc3R5bGUodCxyLGhbcl0pfSkpLHU9ZGUoZz92W3JdOjAscixwKSxyIGluIHZ8fCh2W3JdPXUuc3RhcnQsZyYmKHUuZW5kPXUuc3RhcnQsdS5zdGFydD0wKSl9XSxwcmVmaWx0ZXI6ZnVuY3Rpb24odCxlKXtlP2dlLnByZWZpbHRlcnMudW5zaGlmdCh0KTpnZS5wcmVmaWx0ZXJzLnB1c2godCl9fSksUy5zcGVlZD1mdW5jdGlvbih0LGUsbil7dmFyIHI9dCYmIm9iamVjdCI9PXR5cGVvZiB0P1MuZXh0ZW5kKHt9LHQpOntjb21wbGV0ZTpufHwhbiYmZXx8bSh0KSYmdCxkdXJhdGlvbjp0LGVhc2luZzpuJiZlfHxlJiYhbShlKSYmZX07cmV0dXJuIFMuZngub2ZmP3IuZHVyYXRpb249MDoibnVtYmVyIiE9dHlwZW9mIHIuZHVyYXRpb24mJihyLmR1cmF0aW9uIGluIFMuZnguc3BlZWRzP3IuZHVyYXRpb249Uy5meC5zcGVlZHNbci5kdXJhdGlvbl06ci5kdXJhdGlvbj1TLmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9ci5xdWV1ZSYmITAhPT1yLnF1ZXVlfHwoci5xdWV1ZT0iZngiKSxyLm9sZD1yLmNvbXBsZXRlLHIuY29tcGxldGU9ZnVuY3Rpb24oKXttKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZTLmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0sUy5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIoY3QpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6ZX0sdCxuLHIpfSxhbmltYXRlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPVMuaXNFbXB0eU9iamVjdCh0KSxpPVMuc3BlZWQoZSxuLHIpLGE9ZnVuY3Rpb24oKXt2YXIgZT1nZSh0aGlzLFMuZXh0ZW5kKHt9LHQpLGkpOyhvfHxRLmdldCh0aGlzLCJmaW5pc2giKSkmJmUuc3RvcCghMCl9O3JldHVybiBhLmZpbmlzaD1hLG98fCExPT09aS5xdWV1ZT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShpLnF1ZXVlLGEpfSxzdG9wOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1mdW5jdGlvbih0KXt2YXIgZT10LnN0b3A7ZGVsZXRlIHQuc3RvcCxlKG4pfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJihuPWUsZT10LHQ9dm9pZCAwKSxlJiYhMSE9PXQmJnRoaXMucXVldWUodHx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9ITAsbz1udWxsIT10JiZ0KyJxdWV1ZUhvb2tzIixpPVMudGltZXJzLGE9US5nZXQodGhpcyk7aWYobylhW29dJiZhW29dLnN0b3AmJnIoYVtvXSk7ZWxzZSBmb3IobyBpbiBhKWFbb10mJmFbb10uc3RvcCYmbGUudGVzdChvKSYmcihhW29dKTtmb3Iobz1pLmxlbmd0aDtvLS07KWlbb10uZWxlbSE9PXRoaXN8fG51bGwhPXQmJmlbb10ucXVldWUhPT10fHwoaVtvXS5hbmltLnN0b3AobiksZT0hMSxpLnNwbGljZShvLDEpKTshZSYmbnx8Uy5kZXF1ZXVlKHRoaXMsdCl9KX0sZmluaXNoOmZ1bmN0aW9uKHQpe3JldHVybiExIT09dCYmKHQ9dHx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsbj1RLmdldCh0aGlzKSxyPW5bdCsicXVldWUiXSxvPW5bdCsicXVldWVIb29rcyJdLGk9Uy50aW1lcnMsYT1yP3IubGVuZ3RoOjA7Zm9yKG4uZmluaXNoPSEwLFMucXVldWUodGhpcyx0LFtdKSxvJiZvLnN0b3AmJm8uc3RvcC5jYWxsKHRoaXMsITApLGU9aS5sZW5ndGg7ZS0tOylpW2VdLmVsZW09PT10aGlzJiZpW2VdLnF1ZXVlPT09dCYmKGlbZV0uYW5pbS5zdG9wKCEwKSxpLnNwbGljZShlLDEpKTtmb3IoZT0wO2U8YTtlKyspcltlXSYmcltlXS5maW5pc2gmJnJbZV0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIG4uZmluaXNofSl9fSksUy5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbih0LGUpe3ZhciBuPVMuZm5bZV07Uy5mbltlXT1mdW5jdGlvbih0LHIsbyl7cmV0dXJuIG51bGw9PXR8fCJib29sZWFuIj09dHlwZW9mIHQ/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGhlKGUsITApLHQscixvKX19KSxTLmVhY2goe3NsaWRlRG93bjpoZSgic2hvdyIpLHNsaWRlVXA6aGUoImhpZGUiKSxzbGlkZVRvZ2dsZTpoZSgidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbih0LGUpe1MuZm5bdF09ZnVuY3Rpb24odCxuLHIpe3JldHVybiB0aGlzLmFuaW1hdGUoZSx0LG4scil9fSksUy50aW1lcnM9W10sUy5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIHQsZT0wLG49Uy50aW1lcnM7Zm9yKHNlPURhdGUubm93KCk7ZTxuLmxlbmd0aDtlKyspKHQ9bltlXSkoKXx8bltlXSE9PXR8fG4uc3BsaWNlKGUtLSwxKTtuLmxlbmd0aHx8Uy5meC5zdG9wKCksc2U9dm9pZCAwfSxTLmZ4LnRpbWVyPWZ1bmN0aW9uKHQpe1MudGltZXJzLnB1c2godCksUy5meC5zdGFydCgpfSxTLmZ4LmludGVydmFsPTEzLFMuZnguc3RhcnQ9ZnVuY3Rpb24oKXt1ZXx8KHVlPSEwLGZlKCkpfSxTLmZ4LnN0b3A9ZnVuY3Rpb24oKXt1ZT1udWxsfSxTLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxTLmZuLmRlbGF5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9Uy5meCYmUy5meC5zcGVlZHNbdF18fHQsZT1lfHwiZngiLHRoaXMucXVldWUoZSxmdW5jdGlvbihlLHIpe3ZhciBvPW4uc2V0VGltZW91dChlLHQpO3Iuc3RvcD1mdW5jdGlvbigpe24uY2xlYXJUaW1lb3V0KG8pfX0pfSxmdW5jdGlvbigpe3ZhciB0PWEuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxlPWEuY3JlYXRlRWxlbWVudCgic2VsZWN0IikuYXBwZW5kQ2hpbGQoYS5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSk7dC50eXBlPSJjaGVja2JveCIseS5jaGVja09uPSIiIT09dC52YWx1ZSx5Lm9wdFNlbGVjdGVkPWUuc2VsZWN0ZWQsKHQ9YS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS52YWx1ZT0idCIsdC50eXBlPSJyYWRpbyIseS5yYWRpb1ZhbHVlPSJ0Ij09PXQudmFsdWV9KCk7dmFyIHZlLHllPVMuZXhwci5hdHRySGFuZGxlO1MuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuICQodGhpcyxTLmF0dHIsdCxlLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1MucmVtb3ZlQXR0cih0aGlzLHQpfSl9fSksUy5leHRlbmQoe2F0dHI6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saT10Lm5vZGVUeXBlO2lmKDMhPT1pJiY4IT09aSYmMiE9PWkpcmV0dXJuIHZvaWQgMD09PXQuZ2V0QXR0cmlidXRlP1MucHJvcCh0LGUsbik6KDE9PT1pJiZTLmlzWE1MRG9jKHQpfHwobz1TLmF0dHJIb29rc1tlLnRvTG93ZXJDYXNlKCldfHwoUy5leHByLm1hdGNoLmJvb2wudGVzdChlKT92ZTp2b2lkIDApKSx2b2lkIDAhPT1uP251bGw9PT1uP3ZvaWQgUy5yZW1vdmVBdHRyKHQsZSk6byYmInNldCJpbiBvJiZ2b2lkIDAhPT0ocj1vLnNldCh0LG4sZSkpP3I6KHQuc2V0QXR0cmlidXRlKGUsbisiIiksbik6byYmImdldCJpbiBvJiZudWxsIT09KHI9by5nZXQodCxlKSk/cjpudWxsPT0ocj1TLmZpbmQuYXR0cih0LGUpKT92b2lkIDA6cil9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKHQsZSl7aWYoIXkucmFkaW9WYWx1ZSYmInJhZGlvIj09PWUmJkwodCwiaW5wdXQiKSl7dmFyIG49dC52YWx1ZTtyZXR1cm4gdC5zZXRBdHRyaWJ1dGUoInR5cGUiLGUpLG4mJih0LnZhbHVlPW4pLGV9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24odCxlKXt2YXIgbixyPTAsbz1lJiZlLm1hdGNoKFUpO2lmKG8mJjE9PT10Lm5vZGVUeXBlKWZvcig7bj1vW3IrK107KXQucmVtb3ZlQXR0cmlidXRlKG4pfX0pLHZlPXtzZXQ6ZnVuY3Rpb24odCxlLG4pe3JldHVybiExPT09ZT9TLnJlbW92ZUF0dHIodCxuKTp0LnNldEF0dHJpYnV0ZShuLG4pLG59fSxTLmVhY2goUy5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cdysvZyksZnVuY3Rpb24odCxlKXt2YXIgbj15ZVtlXXx8Uy5maW5kLmF0dHI7eWVbZV09ZnVuY3Rpb24odCxlLHIpe3ZhciBvLGksYT1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHJ8fChpPXllW2FdLHllW2FdPW8sbz1udWxsIT1uKHQsZSxyKT9hOm51bGwseWVbYV09aSksb319KTt2YXIgbWU9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxiZT0vXig/OmF8YXJlYSkkL2k7ZnVuY3Rpb24geGUodCl7cmV0dXJuKHQubWF0Y2goVSl8fFtdKS5qb2luKCIgIil9ZnVuY3Rpb24gd2UodCl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlJiZ0LmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiJ9ZnVuY3Rpb24ga2UodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dDoic3RyaW5nIj09dHlwZW9mIHQmJnQubWF0Y2goVSl8fFtdfVMuZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKHQsZSl7cmV0dXJuICQodGhpcyxTLnByb3AsdCxlLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW1MucHJvcEZpeFt0XXx8dF19KX19KSxTLmV4dGVuZCh7cHJvcDpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpPXQubm9kZVR5cGU7aWYoMyE9PWkmJjghPT1pJiYyIT09aSlyZXR1cm4gMT09PWkmJlMuaXNYTUxEb2ModCl8fChlPVMucHJvcEZpeFtlXXx8ZSxvPVMucHJvcEhvb2tzW2VdKSx2b2lkIDAhPT1uP28mJiJzZXQiaW4gbyYmdm9pZCAwIT09KHI9by5zZXQodCxuLGUpKT9yOnRbZV09bjpvJiYiZ2V0ImluIG8mJm51bGwhPT0ocj1vLmdldCh0LGUpKT9yOnRbZV19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbih0KXt2YXIgZT1TLmZpbmQuYXR0cih0LCJ0YWJpbmRleCIpO3JldHVybiBlP3BhcnNlSW50KGUsMTApOm1lLnRlc3QodC5ub2RlTmFtZSl8fGJlLnRlc3QodC5ub2RlTmFtZSkmJnQuaHJlZj8wOi0xfX19LHByb3BGaXg6e2ZvcjoiaHRtbEZvciIsY2xhc3M6ImNsYXNzTmFtZSJ9fSkseS5vcHRTZWxlY3RlZHx8KFMucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5wYXJlbnROb2RlO3JldHVybiBlJiZlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LG51bGx9LHNldDpmdW5jdGlvbih0KXt2YXIgZT10LnBhcmVudE5vZGU7ZSYmKGUuc2VsZWN0ZWRJbmRleCxlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KX19KSxTLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe1MucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxTLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG8saSxhLHMsdT0wO2lmKG0odCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLmFkZENsYXNzKHQuY2FsbCh0aGlzLGUsd2UodGhpcykpKX0pO2lmKChlPWtlKHQpKS5sZW5ndGgpZm9yKDtuPXRoaXNbdSsrXTspaWYobz13ZShuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIreGUobykrIiAiKXtmb3IoYT0wO2k9ZVthKytdOylyLmluZGV4T2YoIiAiK2krIiAiKTwwJiYocis9aSsiICIpO28hPT0ocz14ZShyKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYSxzLHU9MDtpZihtKHQpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS5yZW1vdmVDbGFzcyh0LmNhbGwodGhpcyxlLHdlKHRoaXMpKSl9KTtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5hdHRyKCJjbGFzcyIsIiIpO2lmKChlPWtlKHQpKS5sZW5ndGgpZm9yKDtuPXRoaXNbdSsrXTspaWYobz13ZShuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIreGUobykrIiAiKXtmb3IoYT0wO2k9ZVthKytdOylmb3IoO3IuaW5kZXhPZigiICIraSsiICIpPi0xOylyPXIucmVwbGFjZSgiICIraSsiICIsIiAiKTtvIT09KHM9eGUocikpJiZuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpfXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbih0LGUpe3ZhciBuPXR5cGVvZiB0LHI9InN0cmluZyI9PT1ufHxBcnJheS5pc0FycmF5KHQpO3JldHVybiJib29sZWFuIj09dHlwZW9mIGUmJnI/ZT90aGlzLmFkZENsYXNzKHQpOnRoaXMucmVtb3ZlQ2xhc3ModCk6bSh0KT90aGlzLmVhY2goZnVuY3Rpb24obil7Uyh0aGlzKS50b2dnbGVDbGFzcyh0LmNhbGwodGhpcyxuLHdlKHRoaXMpLGUpLGUpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsbyxpLGE7aWYocilmb3Iobz0wLGk9Uyh0aGlzKSxhPWtlKHQpO2U9YVtvKytdOylpLmhhc0NsYXNzKGUpP2kucmVtb3ZlQ2xhc3MoZSk6aS5hZGRDbGFzcyhlKTtlbHNlIHZvaWQgMCE9PXQmJiJib29sZWFuIiE9PW58fCgoZT13ZSh0aGlzKSkmJlEuc2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iLGUpLHRoaXMuc2V0QXR0cmlidXRlJiZ0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGV8fCExPT09dD8iIjpRLmdldCh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyPTA7Zm9yKGU9IiAiK3QrIiAiO249dGhpc1tyKytdOylpZigxPT09bi5ub2RlVHlwZSYmKCIgIit4ZSh3ZShuKSkrIiAiKS5pbmRleE9mKGUpPi0xKXJldHVybiEwO3JldHVybiExfX0pO3ZhciBTZT0vXHIvZztTLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvPXRoaXNbMF07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bSh0KSx0aGlzLmVhY2goZnVuY3Rpb24obil7dmFyIG87MT09PXRoaXMubm9kZVR5cGUmJihudWxsPT0obz1yP3QuY2FsbCh0aGlzLG4sUyh0aGlzKS52YWwoKSk6dCk/bz0iIjoibnVtYmVyIj09dHlwZW9mIG8/bys9IiI6QXJyYXkuaXNBcnJheShvKSYmKG89Uy5tYXAobyxmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8iIjp0KyIifSkpLChlPVMudmFsSG9va3NbdGhpcy50eXBlXXx8Uy52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmInNldCJpbiBlJiZ2b2lkIDAhPT1lLnNldCh0aGlzLG8sInZhbHVlIil8fCh0aGlzLnZhbHVlPW8pKX0pKTpvPyhlPVMudmFsSG9va3Nbby50eXBlXXx8Uy52YWxIb29rc1tvLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmImdldCJpbiBlJiZ2b2lkIDAhPT0obj1lLmdldChvLCJ2YWx1ZSIpKT9uOiJzdHJpbmciPT10eXBlb2Yobj1vLnZhbHVlKT9uLnJlcGxhY2UoU2UsIiIpOm51bGw9PW4/IiI6bjp2b2lkIDB9fSksUy5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbih0KXt2YXIgZT1TLmZpbmQuYXR0cih0LCJ2YWx1ZSIpO3JldHVybiBudWxsIT1lP2U6eGUoUy50ZXh0KHQpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvPXQub3B0aW9ucyxpPXQuc2VsZWN0ZWRJbmRleCxhPSJzZWxlY3Qtb25lIj09PXQudHlwZSxzPWE/bnVsbDpbXSx1PWE/aSsxOm8ubGVuZ3RoO2ZvcihyPWk8MD91OmE/aTowO3I8dTtyKyspaWYoKChuPW9bcl0pLnNlbGVjdGVkfHxyPT09aSkmJiFuLmRpc2FibGVkJiYoIW4ucGFyZW50Tm9kZS5kaXNhYmxlZHx8IUwobi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYoZT1TKG4pLnZhbCgpLGEpcmV0dXJuIGU7cy5wdXNoKGUpfXJldHVybiBzfSxzZXQ6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4scixvPXQub3B0aW9ucyxpPVMubWFrZUFycmF5KGUpLGE9by5sZW5ndGg7YS0tOykoKHI9b1thXSkuc2VsZWN0ZWQ9Uy5pbkFycmF5KFMudmFsSG9va3Mub3B0aW9uLmdldChyKSxpKT4tMSkmJihuPSEwKTtyZXR1cm4gbnx8KHQuc2VsZWN0ZWRJbmRleD0tMSksaX19fX0pLFMuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe1MudmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIHQuY2hlY2tlZD1TLmluQXJyYXkoUyh0KS52YWwoKSxlKT4tMX19LHkuY2hlY2tPbnx8KFMudmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dC5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjp0LnZhbHVlfSl9KSx5LmZvY3VzaW49Im9uZm9jdXNpbiJpbiBuO3ZhciBFZT0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8samU9ZnVuY3Rpb24odCl7dC5zdG9wUHJvcGFnYXRpb24oKX07Uy5leHRlbmQoUy5ldmVudCx7dHJpZ2dlcjpmdW5jdGlvbih0LGUscixvKXt2YXIgaSxzLHUsYyxsLGYscCxoLGc9W3J8fGFdLHY9ZC5jYWxsKHQsInR5cGUiKT90LnR5cGU6dCx5PWQuY2FsbCh0LCJuYW1lc3BhY2UiKT90Lm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKHM9aD11PXI9cnx8YSwzIT09ci5ub2RlVHlwZSYmOCE9PXIubm9kZVR5cGUmJiFFZS50ZXN0KHYrUy5ldmVudC50cmlnZ2VyZWQpJiYodi5pbmRleE9mKCIuIik+LTEmJih5PXYuc3BsaXQoIi4iKSx2PXkuc2hpZnQoKSx5LnNvcnQoKSksbD12LmluZGV4T2YoIjoiKTwwJiYib24iK3YsKHQ9dFtTLmV4cGFuZG9dP3Q6bmV3IFMuRXZlbnQodiwib2JqZWN0Ij09dHlwZW9mIHQmJnQpKS5pc1RyaWdnZXI9bz8yOjMsdC5uYW1lc3BhY2U9eS5qb2luKCIuIiksdC5ybmFtZXNwYWNlPXQubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3kuam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCx0LnJlc3VsdD12b2lkIDAsdC50YXJnZXR8fCh0LnRhcmdldD1yKSxlPW51bGw9PWU/W3RdOlMubWFrZUFycmF5KGUsW3RdKSxwPVMuZXZlbnQuc3BlY2lhbFt2XXx8e30sb3x8IXAudHJpZ2dlcnx8ITEhPT1wLnRyaWdnZXIuYXBwbHkocixlKSkpe2lmKCFvJiYhcC5ub0J1YmJsZSYmIWIocikpe2ZvcihjPXAuZGVsZWdhdGVUeXBlfHx2LEVlLnRlc3QoYyt2KXx8KHM9cy5wYXJlbnROb2RlKTtzO3M9cy5wYXJlbnROb2RlKWcucHVzaChzKSx1PXM7dT09PShyLm93bmVyRG9jdW1lbnR8fGEpJiZnLnB1c2godS5kZWZhdWx0Vmlld3x8dS5wYXJlbnRXaW5kb3d8fG4pfWZvcihpPTA7KHM9Z1tpKytdKSYmIXQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTspaD1zLHQudHlwZT1pPjE/YzpwLmJpbmRUeXBlfHx2LChmPShRLmdldChzLCJldmVudHMiKXx8e30pW3QudHlwZV0mJlEuZ2V0KHMsImhhbmRsZSIpKSYmZi5hcHBseShzLGUpLChmPWwmJnNbbF0pJiZmLmFwcGx5JiZYKHMpJiYodC5yZXN1bHQ9Zi5hcHBseShzLGUpLCExPT09dC5yZXN1bHQmJnQucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIHQudHlwZT12LG98fHQuaXNEZWZhdWx0UHJldmVudGVkKCl8fHAuX2RlZmF1bHQmJiExIT09cC5fZGVmYXVsdC5hcHBseShnLnBvcCgpLGUpfHwhWChyKXx8bCYmbShyW3ZdKSYmIWIocikmJigodT1yW2xdKSYmKHJbbF09bnVsbCksUy5ldmVudC50cmlnZ2VyZWQ9dix0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmguYWRkRXZlbnRMaXN0ZW5lcih2LGplKSxyW3ZdKCksdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZoLnJlbW92ZUV2ZW50TGlzdGVuZXIodixqZSksUy5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwLHUmJihyW2xdPXUpKSx0LnJlc3VsdH19LHNpbXVsYXRlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1TLmV4dGVuZChuZXcgUy5FdmVudCxuLHt0eXBlOnQsaXNTaW11bGF0ZWQ6ITB9KTtTLmV2ZW50LnRyaWdnZXIocixudWxsLGUpfX0pLFMuZm4uZXh0ZW5kKHt0cmlnZ2VyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQudHJpZ2dlcih0LGUsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzWzBdO2lmKG4pcmV0dXJuIFMuZXZlbnQudHJpZ2dlcih0LGUsbiwhMCl9fSkseS5mb2N1c2lufHxTLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKHQsZSl7dmFyIG49ZnVuY3Rpb24odCl7Uy5ldmVudC5zaW11bGF0ZShlLHQudGFyZ2V0LFMuZXZlbnQuZml4KHQpKX07Uy5ldmVudC5zcGVjaWFsW2VdPXtzZXR1cDpmdW5jdGlvbigpe3ZhciByPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxvPVEuYWNjZXNzKHIsZSk7b3x8ci5hZGRFdmVudExpc3RlbmVyKHQsbiwhMCksUS5hY2Nlc3MocixlLChvfHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgcj10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsbz1RLmFjY2VzcyhyLGUpLTE7bz9RLmFjY2VzcyhyLGUsbyk6KHIucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4sITApLFEucmVtb3ZlKHIsZSkpfX19KTt2YXIgVGU9bi5sb2NhdGlvbixPZT1EYXRlLm5vdygpLEFlPS9cPy87Uy5wYXJzZVhNTD1mdW5jdGlvbih0KXt2YXIgZTtpZighdHx8InN0cmluZyIhPXR5cGVvZiB0KXJldHVybiBudWxsO3RyeXtlPShuZXcgbi5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyh0LCJ0ZXh0L3htbCIpfWNhdGNoKHQpe2U9dm9pZCAwfXJldHVybiBlJiYhZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGh8fFMuZXJyb3IoIkludmFsaWQgWE1MOiAiK3QpLGV9O3ZhciBDZT0vXFtcXSQvLExlPS9ccj9cbi9nLFJlPS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxQZT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7ZnVuY3Rpb24gTmUodCxlLG4scil7dmFyIG87aWYoQXJyYXkuaXNBcnJheShlKSlTLmVhY2goZSxmdW5jdGlvbihlLG8pe258fENlLnRlc3QodCk/cih0LG8pOk5lKHQrIlsiKygib2JqZWN0Ij09dHlwZW9mIG8mJm51bGwhPW8/ZToiIikrIl0iLG8sbixyKX0pO2Vsc2UgaWYobnx8Im9iamVjdCIhPT1rKGUpKXIodCxlKTtlbHNlIGZvcihvIGluIGUpTmUodCsiWyIrbysiXSIsZVtvXSxuLHIpfVMucGFyYW09ZnVuY3Rpb24odCxlKXt2YXIgbixyPVtdLG89ZnVuY3Rpb24odCxlKXt2YXIgbj1tKGUpP2UoKTplO3Jbci5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudCh0KSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KG51bGw9PW4/IiI6bil9O2lmKG51bGw9PXQpcmV0dXJuIiI7aWYoQXJyYXkuaXNBcnJheSh0KXx8dC5qcXVlcnkmJiFTLmlzUGxhaW5PYmplY3QodCkpUy5lYWNoKHQsZnVuY3Rpb24oKXtvKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKG4gaW4gdClOZShuLHRbbl0sZSxvKTtyZXR1cm4gci5qb2luKCImIil9LFMuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gUy5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciB0PVMucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiB0P1MubWFrZUFycmF5KHQpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgdD10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIVModGhpcykuaXMoIjpkaXNhYmxlZCIpJiZQZS50ZXN0KHRoaXMubm9kZU5hbWUpJiYhUmUudGVzdCh0KSYmKHRoaXMuY2hlY2tlZHx8IWd0LnRlc3QodCkpfSkubWFwKGZ1bmN0aW9uKHQsZSl7dmFyIG49Uyh0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09bj9udWxsOkFycmF5LmlzQXJyYXkobik/Uy5tYXAobixmdW5jdGlvbih0KXtyZXR1cm57bmFtZTplLm5hbWUsdmFsdWU6dC5yZXBsYWNlKExlLCJcclxuIil9fSk6e25hbWU6ZS5uYW1lLHZhbHVlOm4ucmVwbGFjZShMZSwiXHJcbiIpfX0pLmdldCgpfX0pO3ZhciBJZT0vJTIwL2csX2U9LyMuKiQvLERlPS8oWz8mXSlfPVteJl0qLyxNZT0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLFVlPS9eKD86R0VUfEhFQUQpJC8sQmU9L15cL1wvLyxxZT17fSxGZT17fSxIZT0iKi8iLmNvbmNhdCgiKiIpLHplPWEuY3JlYXRlRWxlbWVudCgiYSIpO2Z1bmN0aW9uIFdlKHQpe3JldHVybiBmdW5jdGlvbihlLG4peyJzdHJpbmciIT10eXBlb2YgZSYmKG49ZSxlPSIqIik7dmFyIHIsbz0wLGk9ZS50b0xvd2VyQ2FzZSgpLm1hdGNoKFUpfHxbXTtpZihtKG4pKWZvcig7cj1pW28rK107KSIrIj09PXJbMF0/KHI9ci5zbGljZSgxKXx8IioiLCh0W3JdPXRbcl18fFtdKS51bnNoaWZ0KG4pKToodFtyXT10W3JdfHxbXSkucHVzaChuKX19ZnVuY3Rpb24gJGUodCxlLG4scil7dmFyIG89e30saT10PT09RmU7ZnVuY3Rpb24gYShzKXt2YXIgdTtyZXR1cm4gb1tzXT0hMCxTLmVhY2godFtzXXx8W10sZnVuY3Rpb24odCxzKXt2YXIgYz1zKGUsbixyKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGN8fGl8fG9bY10/aT8hKHU9Yyk6dm9pZCAwOihlLmRhdGFUeXBlcy51bnNoaWZ0KGMpLGEoYyksITEpfSksdX1yZXR1cm4gYShlLmRhdGFUeXBlc1swXSl8fCFvWyIqIl0mJmEoIioiKX1mdW5jdGlvbiBZZSh0LGUpe3ZhciBuLHIsbz1TLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKG4gaW4gZSl2b2lkIDAhPT1lW25dJiYoKG9bbl0/dDpyfHwocj17fSkpW25dPWVbbl0pO3JldHVybiByJiZTLmV4dGVuZCghMCx0LHIpLHR9emUuaHJlZj1UZS5ocmVmLFMuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4U2V0dGluZ3M6e3VybDpUZS5ocmVmLHR5cGU6IkdFVCIsaXNMb2NhbDovXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLy50ZXN0KFRlLnByb3RvY29sKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsYWNjZXB0czp7IioiOkhlLHRleHQ6InRleHQvcGxhaW4iLGh0bWw6InRleHQvaHRtbCIseG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQifSxjb250ZW50czp7eG1sOi9cYnhtbFxiLyxodG1sOi9cYmh0bWwvLGpzb246L1xianNvblxiL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCIsanNvbjoicmVzcG9uc2VKU09OIn0sY29udmVydGVyczp7IiogdGV4dCI6U3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOkpTT04ucGFyc2UsInRleHQgeG1sIjpTLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT9ZZShZZSh0LFMuYWpheFNldHRpbmdzKSxlKTpZZShTLmFqYXhTZXR0aW5ncyx0KX0sYWpheFByZWZpbHRlcjpXZShxZSksYWpheFRyYW5zcG9ydDpXZShGZSksYWpheDpmdW5jdGlvbih0LGUpeyJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksZT1lfHx7fTt2YXIgcixvLGkscyx1LGMsbCxmLHAsaCxkPVMuYWpheFNldHVwKHt9LGUpLGc9ZC5jb250ZXh0fHxkLHY9ZC5jb250ZXh0JiYoZy5ub2RlVHlwZXx8Zy5qcXVlcnkpP1MoZyk6Uy5ldmVudCx5PVMuRGVmZXJyZWQoKSxtPVMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGI9ZC5zdGF0dXNDb2RlfHx7fSx4PXt9LHc9e30saz0iY2FuY2VsZWQiLEU9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbih0KXt2YXIgZTtpZihsKXtpZighcylmb3Iocz17fTtlPU1lLmV4ZWMoaSk7KXNbZVsxXS50b0xvd2VyQ2FzZSgpKyIgIl09KHNbZVsxXS50b0xvd2VyQ2FzZSgpKyIgIl18fFtdKS5jb25jYXQoZVsyXSk7ZT1zW3QudG9Mb3dlckNhc2UoKSsiICJdfXJldHVybiBudWxsPT1lP251bGw6ZS5qb2luKCIsICIpfSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gbD9pOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09bCYmKHQ9d1t0LnRvTG93ZXJDYXNlKCldPXdbdC50b0xvd2VyQ2FzZSgpXXx8dCx4W3RdPWUpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PWwmJihkLm1pbWVUeXBlPXQpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24odCl7dmFyIGU7aWYodClpZihsKUUuYWx3YXlzKHRbRS5zdGF0dXNdKTtlbHNlIGZvcihlIGluIHQpYltlXT1bYltlXSx0W2VdXTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24odCl7dmFyIGU9dHx8aztyZXR1cm4gciYmci5hYm9ydChlKSxqKDAsZSksdGhpc319O2lmKHkucHJvbWlzZShFKSxkLnVybD0oKHR8fGQudXJsfHxUZS5ocmVmKSsiIikucmVwbGFjZShCZSxUZS5wcm90b2NvbCsiLy8iKSxkLnR5cGU9ZS5tZXRob2R8fGUudHlwZXx8ZC5tZXRob2R8fGQudHlwZSxkLmRhdGFUeXBlcz0oZC5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKFUpfHxbIiJdLG51bGw9PWQuY3Jvc3NEb21haW4pe2M9YS5jcmVhdGVFbGVtZW50KCJhIik7dHJ5e2MuaHJlZj1kLnVybCxjLmhyZWY9Yy5ocmVmLGQuY3Jvc3NEb21haW49emUucHJvdG9jb2wrIi8vIit6ZS5ob3N0IT1jLnByb3RvY29sKyIvLyIrYy5ob3N0fWNhdGNoKHQpe2QuY3Jvc3NEb21haW49ITB9fWlmKGQuZGF0YSYmZC5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiBkLmRhdGEmJihkLmRhdGE9Uy5wYXJhbShkLmRhdGEsZC50cmFkaXRpb25hbCkpLCRlKHFlLGQsZSxFKSxsKXJldHVybiBFO2ZvcihwIGluKGY9Uy5ldmVudCYmZC5nbG9iYWwpJiYwPT1TLmFjdGl2ZSsrJiZTLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLGQudHlwZT1kLnR5cGUudG9VcHBlckNhc2UoKSxkLmhhc0NvbnRlbnQ9IVVlLnRlc3QoZC50eXBlKSxvPWQudXJsLnJlcGxhY2UoX2UsIiIpLGQuaGFzQ29udGVudD9kLmRhdGEmJmQucHJvY2Vzc0RhdGEmJjA9PT0oZC5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYoZC5kYXRhPWQuZGF0YS5yZXBsYWNlKEllLCIrIikpOihoPWQudXJsLnNsaWNlKG8ubGVuZ3RoKSxkLmRhdGEmJihkLnByb2Nlc3NEYXRhfHwic3RyaW5nIj09dHlwZW9mIGQuZGF0YSkmJihvKz0oQWUudGVzdChvKT8iJiI6Ij8iKStkLmRhdGEsZGVsZXRlIGQuZGF0YSksITE9PT1kLmNhY2hlJiYobz1vLnJlcGxhY2UoRGUsIiQxIiksaD0oQWUudGVzdChvKT8iJiI6Ij8iKSsiXz0iK09lKysraCksZC51cmw9bytoKSxkLmlmTW9kaWZpZWQmJihTLmxhc3RNb2RpZmllZFtvXSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsUy5sYXN0TW9kaWZpZWRbb10pLFMuZXRhZ1tvXSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixTLmV0YWdbb10pKSwoZC5kYXRhJiZkLmhhc0NvbnRlbnQmJiExIT09ZC5jb250ZW50VHlwZXx8ZS5jb250ZW50VHlwZSkmJkUuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixkLmNvbnRlbnRUeXBlKSxFLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsZC5kYXRhVHlwZXNbMF0mJmQuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0/ZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXSsoIioiIT09ZC5kYXRhVHlwZXNbMF0/IiwgIitIZSsiOyBxPTAuMDEiOiIiKTpkLmFjY2VwdHNbIioiXSksZC5oZWFkZXJzKUUuc2V0UmVxdWVzdEhlYWRlcihwLGQuaGVhZGVyc1twXSk7aWYoZC5iZWZvcmVTZW5kJiYoITE9PT1kLmJlZm9yZVNlbmQuY2FsbChnLEUsZCl8fGwpKXJldHVybiBFLmFib3J0KCk7aWYoaz0iYWJvcnQiLG0uYWRkKGQuY29tcGxldGUpLEUuZG9uZShkLnN1Y2Nlc3MpLEUuZmFpbChkLmVycm9yKSxyPSRlKEZlLGQsZSxFKSl7aWYoRS5yZWFkeVN0YXRlPTEsZiYmdi50cmlnZ2VyKCJhamF4U2VuZCIsW0UsZF0pLGwpcmV0dXJuIEU7ZC5hc3luYyYmZC50aW1lb3V0PjAmJih1PW4uc2V0VGltZW91dChmdW5jdGlvbigpe0UuYWJvcnQoInRpbWVvdXQiKX0sZC50aW1lb3V0KSk7dHJ5e2w9ITEsci5zZW5kKHgsail9Y2F0Y2godCl7aWYobCl0aHJvdyB0O2ooLTEsdCl9fWVsc2UgaigtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24gaih0LGUsYSxzKXt2YXIgYyxwLGgseCx3LGs9ZTtsfHwobD0hMCx1JiZuLmNsZWFyVGltZW91dCh1KSxyPXZvaWQgMCxpPXN8fCIiLEUucmVhZHlTdGF0ZT10PjA/NDowLGM9dD49MjAwJiZ0PDMwMHx8MzA0PT09dCxhJiYoeD1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLG8saSxhLHM9dC5jb250ZW50cyx1PXQuZGF0YVR5cGVzOyIqIj09PXVbMF07KXUuc2hpZnQoKSx2b2lkIDA9PT1yJiYocj10Lm1pbWVUeXBlfHxlLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYocilmb3IobyBpbiBzKWlmKHNbb10mJnNbb10udGVzdChyKSl7dS51bnNoaWZ0KG8pO2JyZWFrfWlmKHVbMF1pbiBuKWk9dVswXTtlbHNle2ZvcihvIGluIG4pe2lmKCF1WzBdfHx0LmNvbnZlcnRlcnNbbysiICIrdVswXV0pe2k9bzticmVha31hfHwoYT1vKX1pPWl8fGF9aWYoaSlyZXR1cm4gaSE9PXVbMF0mJnUudW5zaGlmdChpKSxuW2ldfShkLEUsYSkpLHg9ZnVuY3Rpb24odCxlLG4scil7dmFyIG8saSxhLHMsdSxjPXt9LGw9dC5kYXRhVHlwZXMuc2xpY2UoKTtpZihsWzFdKWZvcihhIGluIHQuY29udmVydGVycyljW2EudG9Mb3dlckNhc2UoKV09dC5jb252ZXJ0ZXJzW2FdO2ZvcihpPWwuc2hpZnQoKTtpOylpZih0LnJlc3BvbnNlRmllbGRzW2ldJiYoblt0LnJlc3BvbnNlRmllbGRzW2ldXT1lKSwhdSYmciYmdC5kYXRhRmlsdGVyJiYoZT10LmRhdGFGaWx0ZXIoZSx0LmRhdGFUeXBlKSksdT1pLGk9bC5zaGlmdCgpKWlmKCIqIj09PWkpaT11O2Vsc2UgaWYoIioiIT09dSYmdSE9PWkpe2lmKCEoYT1jW3UrIiAiK2ldfHxjWyIqICIraV0pKWZvcihvIGluIGMpaWYoKHM9by5zcGxpdCgiICIpKVsxXT09PWkmJihhPWNbdSsiICIrc1swXV18fGNbIiogIitzWzBdXSkpeyEwPT09YT9hPWNbb106ITAhPT1jW29dJiYoaT1zWzBdLGwudW5zaGlmdChzWzFdKSk7YnJlYWt9aWYoITAhPT1hKWlmKGEmJnQudGhyb3dzKWU9YShlKTtlbHNlIHRyeXtlPWEoZSl9Y2F0Y2godCl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6YT90OiJObyBjb252ZXJzaW9uIGZyb20gIit1KyIgdG8gIitpfX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOmV9fShkLHgsRSxjKSxjPyhkLmlmTW9kaWZpZWQmJigodz1FLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIikpJiYoUy5sYXN0TW9kaWZpZWRbb109dyksKHc9RS5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpKSYmKFMuZXRhZ1tvXT13KSksMjA0PT09dHx8IkhFQUQiPT09ZC50eXBlP2s9Im5vY29udGVudCI6MzA0PT09dD9rPSJub3Rtb2RpZmllZCI6KGs9eC5zdGF0ZSxwPXguZGF0YSxjPSEoaD14LmVycm9yKSkpOihoPWssIXQmJmt8fChrPSJlcnJvciIsdDwwJiYodD0wKSkpLEUuc3RhdHVzPXQsRS5zdGF0dXNUZXh0PShlfHxrKSsiIixjP3kucmVzb2x2ZVdpdGgoZyxbcCxrLEVdKTp5LnJlamVjdFdpdGgoZyxbRSxrLGhdKSxFLnN0YXR1c0NvZGUoYiksYj12b2lkIDAsZiYmdi50cmlnZ2VyKGM/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbRSxkLGM/cDpoXSksbS5maXJlV2l0aChnLFtFLGtdKSxmJiYodi50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFtFLGRdKSwtLVMuYWN0aXZlfHxTLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gRX0sZ2V0SlNPTjpmdW5jdGlvbih0LGUsbil7cmV0dXJuIFMuZ2V0KHQsZSxuLCJqc29uIil9LGdldFNjcmlwdDpmdW5jdGlvbih0LGUpe3JldHVybiBTLmdldCh0LHZvaWQgMCxlLCJzY3JpcHQiKX19KSxTLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24odCxlKXtTW2VdPWZ1bmN0aW9uKHQsbixyLG8pe3JldHVybiBtKG4pJiYobz1vfHxyLHI9bixuPXZvaWQgMCksUy5hamF4KFMuZXh0ZW5kKHt1cmw6dCx0eXBlOmUsZGF0YVR5cGU6byxkYXRhOm4sc3VjY2VzczpyfSxTLmlzUGxhaW5PYmplY3QodCkmJnQpKX19KSxTLl9ldmFsVXJsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFMuYWpheCh7dXJsOnQsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0IixjYWNoZTohMCxhc3luYzohMSxnbG9iYWw6ITEsY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbigpe319LGRhdGFGaWx0ZXI6ZnVuY3Rpb24odCl7Uy5nbG9iYWxFdmFsKHQsZSl9fSl9LFMuZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiB0aGlzWzBdJiYobSh0KSYmKHQ9dC5jYWxsKHRoaXNbMF0pKSxlPVModCx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJmUuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGUubWFwKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXM7dC5maXJzdEVsZW1lbnRDaGlsZDspdD10LmZpcnN0RWxlbWVudENoaWxkO3JldHVybiB0fSkuYXBwZW5kKHRoaXMpKSx0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG0odCk/dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1ModGhpcykud3JhcElubmVyKHQuY2FsbCh0aGlzLGUpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPVModGhpcyksbj1lLmNvbnRlbnRzKCk7bi5sZW5ndGg/bi53cmFwQWxsKHQpOmUuYXBwZW5kKHQpfSl9LHdyYXA6ZnVuY3Rpb24odCl7dmFyIGU9bSh0KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe1ModGhpcykud3JhcEFsbChlP3QuY2FsbCh0aGlzLG4pOnQpfSl9LHVud3JhcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wYXJlbnQodCkubm90KCJib2R5IikuZWFjaChmdW5jdGlvbigpe1ModGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLHRoaXN9fSksUy5leHByLnBzZXVkb3MuaGlkZGVuPWZ1bmN0aW9uKHQpe3JldHVybiFTLmV4cHIucHNldWRvcy52aXNpYmxlKHQpfSxTLmV4cHIucHNldWRvcy52aXNpYmxlPWZ1bmN0aW9uKHQpe3JldHVybiEhKHQub2Zmc2V0V2lkdGh8fHQub2Zmc2V0SGVpZ2h0fHx0LmdldENsaWVudFJlY3RzKCkubGVuZ3RoKX0sUy5hamF4U2V0dGluZ3MueGhyPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBuZXcgbi5YTUxIdHRwUmVxdWVzdH1jYXRjaCh0KXt9fTt2YXIgVmU9ezA6MjAwLDEyMjM6MjA0fSxHZT1TLmFqYXhTZXR0aW5ncy54aHIoKTt5LmNvcnM9ISFHZSYmIndpdGhDcmVkZW50aWFscyJpbiBHZSx5LmFqYXg9R2U9ISFHZSxTLmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24odCl7dmFyIGUscjtpZih5LmNvcnN8fEdlJiYhdC5jcm9zc0RvbWFpbilyZXR1cm57c2VuZDpmdW5jdGlvbihvLGkpe3ZhciBhLHM9dC54aHIoKTtpZihzLm9wZW4odC50eXBlLHQudXJsLHQuYXN5bmMsdC51c2VybmFtZSx0LnBhc3N3b3JkKSx0LnhockZpZWxkcylmb3IoYSBpbiB0LnhockZpZWxkcylzW2FdPXQueGhyRmllbGRzW2FdO2ZvcihhIGluIHQubWltZVR5cGUmJnMub3ZlcnJpZGVNaW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlKHQubWltZVR5cGUpLHQuY3Jvc3NEb21haW58fG9bIlgtUmVxdWVzdGVkLVdpdGgiXXx8KG9bIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKSxvKXMuc2V0UmVxdWVzdEhlYWRlcihhLG9bYV0pO2U9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZSYmKGU9cj1zLm9ubG9hZD1zLm9uZXJyb3I9cy5vbmFib3J0PXMub250aW1lb3V0PXMub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsImFib3J0Ij09PXQ/cy5hYm9ydCgpOiJlcnJvciI9PT10PyJudW1iZXIiIT10eXBlb2Ygcy5zdGF0dXM/aSgwLCJlcnJvciIpOmkocy5zdGF0dXMscy5zdGF0dXNUZXh0KTppKFZlW3Muc3RhdHVzXXx8cy5zdGF0dXMscy5zdGF0dXNUZXh0LCJ0ZXh0IiE9PShzLnJlc3BvbnNlVHlwZXx8InRleHQiKXx8InN0cmluZyIhPXR5cGVvZiBzLnJlc3BvbnNlVGV4dD97YmluYXJ5OnMucmVzcG9uc2V9Ont0ZXh0OnMucmVzcG9uc2VUZXh0fSxzLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSl9fSxzLm9ubG9hZD1lKCkscj1zLm9uZXJyb3I9cy5vbnRpbWVvdXQ9ZSgiZXJyb3IiKSx2b2lkIDAhPT1zLm9uYWJvcnQ/cy5vbmFib3J0PXI6cy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXs0PT09cy5yZWFkeVN0YXRlJiZuLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlJiZyKCl9KX0sZT1lKCJhYm9ydCIpO3RyeXtzLnNlbmQodC5oYXNDb250ZW50JiZ0LmRhdGF8fG51bGwpfWNhdGNoKHQpe2lmKGUpdGhyb3cgdH19LGFib3J0OmZ1bmN0aW9uKCl7ZSYmZSgpfX19KSxTLmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24odCl7dC5jcm9zc0RvbWFpbiYmKHQuY29udGVudHMuc2NyaXB0PSExKX0pLFMuYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovXGIoPzpqYXZhfGVjbWEpc2NyaXB0XGIvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKHQpe3JldHVybiBTLmdsb2JhbEV2YWwodCksdH19fSksUy5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKHQpe3ZvaWQgMD09PXQuY2FjaGUmJih0LmNhY2hlPSExKSx0LmNyb3NzRG9tYWluJiYodC50eXBlPSJHRVQiKX0pLFMuYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbih0KXt2YXIgZSxuO2lmKHQuY3Jvc3NEb21haW58fHQuc2NyaXB0QXR0cnMpcmV0dXJue3NlbmQ6ZnVuY3Rpb24ocixvKXtlPVMoIjxzY3JpcHQ+IikuYXR0cih0LnNjcmlwdEF0dHJzfHx7fSkucHJvcCh7Y2hhcnNldDp0LnNjcmlwdENoYXJzZXQsc3JjOnQudXJsfSkub24oImxvYWQgZXJyb3IiLG49ZnVuY3Rpb24odCl7ZS5yZW1vdmUoKSxuPW51bGwsdCYmbygiZXJyb3IiPT09dC50eXBlPzQwNDoyMDAsdC50eXBlKX0pLGEuaGVhZC5hcHBlbmRDaGlsZChlWzBdKX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuKCl9fX0pO3ZhciBLZSxYZT1bXSxKZT0vKD0pXD8oPz0mfCQpfFw/XD8vO1MuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgdD1YZS5wb3AoKXx8Uy5leHBhbmRvKyJfIitPZSsrO3JldHVybiB0aGlzW3RdPSEwLHR9fSksUy5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbih0LGUscil7dmFyIG8saSxhLHM9ITEhPT10Lmpzb25wJiYoSmUudGVzdCh0LnVybCk/InVybCI6InN0cmluZyI9PXR5cGVvZiB0LmRhdGEmJjA9PT0odC5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiZKZS50ZXN0KHQuZGF0YSkmJiJkYXRhIik7aWYoc3x8Impzb25wIj09PXQuZGF0YVR5cGVzWzBdKXJldHVybiBvPXQuanNvbnBDYWxsYmFjaz1tKHQuanNvbnBDYWxsYmFjayk/dC5qc29ucENhbGxiYWNrKCk6dC5qc29ucENhbGxiYWNrLHM/dFtzXT10W3NdLnJlcGxhY2UoSmUsIiQxIitvKTohMSE9PXQuanNvbnAmJih0LnVybCs9KEFlLnRlc3QodC51cmwpPyImIjoiPyIpK3QuanNvbnArIj0iK28pLHQuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBhfHxTLmVycm9yKG8rIiB3YXMgbm90IGNhbGxlZCIpLGFbMF19LHQuZGF0YVR5cGVzWzBdPSJqc29uIixpPW5bb10sbltvXT1mdW5jdGlvbigpe2E9YXJndW1lbnRzfSxyLmFsd2F5cyhmdW5jdGlvbigpe3ZvaWQgMD09PWk/UyhuKS5yZW1vdmVQcm9wKG8pOm5bb109aSx0W29dJiYodC5qc29ucENhbGxiYWNrPWUuanNvbnBDYWxsYmFjayxYZS5wdXNoKG8pKSxhJiZtKGkpJiZpKGFbMF0pLGE9aT12b2lkIDB9KSwic2NyaXB0In0pLHkuY3JlYXRlSFRNTERvY3VtZW50PSgoS2U9YS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLmJvZHkpLmlubmVySFRNTD0iPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT4iLDI9PT1LZS5jaGlsZE5vZGVzLmxlbmd0aCksUy5wYXJzZUhUTUw9ZnVuY3Rpb24odCxlLG4pe3JldHVybiJzdHJpbmciIT10eXBlb2YgdD9bXTooImJvb2xlYW4iPT10eXBlb2YgZSYmKG49ZSxlPSExKSxlfHwoeS5jcmVhdGVIVE1MRG9jdW1lbnQ/KChyPShlPWEuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKSkuY3JlYXRlRWxlbWVudCgiYmFzZSIpKS5ocmVmPWEubG9jYXRpb24uaHJlZixlLmhlYWQuYXBwZW5kQ2hpbGQocikpOmU9YSksaT0hbiYmW10sKG89Ui5leGVjKHQpKT9bZS5jcmVhdGVFbGVtZW50KG9bMV0pXToobz1FdChbdF0sZSxpKSxpJiZpLmxlbmd0aCYmUyhpKS5yZW1vdmUoKSxTLm1lcmdlKFtdLG8uY2hpbGROb2RlcykpKTt2YXIgcixvLGl9LFMuZm4ubG9hZD1mdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGE9dGhpcyxzPXQuaW5kZXhPZigiICIpO3JldHVybiBzPi0xJiYocj14ZSh0LnNsaWNlKHMpKSx0PXQuc2xpY2UoMCxzKSksbShlKT8obj1lLGU9dm9pZCAwKTplJiYib2JqZWN0Ij09dHlwZW9mIGUmJihvPSJQT1NUIiksYS5sZW5ndGg+MCYmUy5hamF4KHt1cmw6dCx0eXBlOm98fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOmV9KS5kb25lKGZ1bmN0aW9uKHQpe2k9YXJndW1lbnRzLGEuaHRtbChyP1MoIjxkaXY+IikuYXBwZW5kKFMucGFyc2VIVE1MKHQpKS5maW5kKHIpOnQpfSkuYWx3YXlzKG4mJmZ1bmN0aW9uKHQsZSl7YS5lYWNoKGZ1bmN0aW9uKCl7bi5hcHBseSh0aGlzLGl8fFt0LnJlc3BvbnNlVGV4dCxlLHRdKX0pfSksdGhpc30sUy5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24odCxlKXtTLmZuW2VdPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9uKGUsdCl9fSksUy5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIFMuZ3JlcChTLnRpbWVycyxmdW5jdGlvbihlKXtyZXR1cm4gdD09PWUuZWxlbX0pLmxlbmd0aH0sUy5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGEscyx1LGM9Uy5jc3ModCwicG9zaXRpb24iKSxsPVModCksZj17fTsic3RhdGljIj09PWMmJih0LnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpLHM9bC5vZmZzZXQoKSxpPVMuY3NzKHQsInRvcCIpLHU9Uy5jc3ModCwibGVmdCIpLCgiYWJzb2x1dGUiPT09Y3x8ImZpeGVkIj09PWMpJiYoaSt1KS5pbmRleE9mKCJhdXRvIik+LTE/KGE9KHI9bC5wb3NpdGlvbigpKS50b3Asbz1yLmxlZnQpOihhPXBhcnNlRmxvYXQoaSl8fDAsbz1wYXJzZUZsb2F0KHUpfHwwKSxtKGUpJiYoZT1lLmNhbGwodCxuLFMuZXh0ZW5kKHt9LHMpKSksbnVsbCE9ZS50b3AmJihmLnRvcD1lLnRvcC1zLnRvcCthKSxudWxsIT1lLmxlZnQmJihmLmxlZnQ9ZS5sZWZ0LXMubGVmdCtvKSwidXNpbmciaW4gZT9lLnVzaW5nLmNhbGwodCxmKTpsLmNzcyhmKX19LFMuZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24odCl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihlKXtTLm9mZnNldC5zZXRPZmZzZXQodGhpcyx0LGUpfSk7dmFyIGUsbixyPXRoaXNbMF07cmV0dXJuIHI/ci5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8oZT1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49ci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6ZS50b3Arbi5wYWdlWU9mZnNldCxsZWZ0OmUubGVmdCtuLnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH06dm9pZCAwfSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciB0LGUsbixyPXRoaXNbMF0sbz17dG9wOjAsbGVmdDowfTtpZigiZml4ZWQiPT09Uy5jc3MociwicG9zaXRpb24iKSllPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZWxzZXtmb3IoZT10aGlzLm9mZnNldCgpLG49ci5vd25lckRvY3VtZW50LHQ9ci5vZmZzZXRQYXJlbnR8fG4uZG9jdW1lbnRFbGVtZW50O3QmJih0PT09bi5ib2R5fHx0PT09bi5kb2N1bWVudEVsZW1lbnQpJiYic3RhdGljIj09PVMuY3NzKHQsInBvc2l0aW9uIik7KXQ9dC5wYXJlbnROb2RlO3QmJnQhPT1yJiYxPT09dC5ub2RlVHlwZSYmKChvPVModCkub2Zmc2V0KCkpLnRvcCs9Uy5jc3ModCwiYm9yZGVyVG9wV2lkdGgiLCEwKSxvLmxlZnQrPVMuY3NzKHQsImJvcmRlckxlZnRXaWR0aCIsITApKX1yZXR1cm57dG9wOmUudG9wLW8udG9wLVMuY3NzKHIsIm1hcmdpblRvcCIsITApLGxlZnQ6ZS5sZWZ0LW8ubGVmdC1TLmNzcyhyLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMub2Zmc2V0UGFyZW50O3QmJiJzdGF0aWMiPT09Uy5jc3ModCwicG9zaXRpb24iKTspdD10Lm9mZnNldFBhcmVudDtyZXR1cm4gdHx8YXR9KX19KSxTLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24odCxlKXt2YXIgbj0icGFnZVlPZmZzZXQiPT09ZTtTLmZuW3RdPWZ1bmN0aW9uKHIpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24odCxyLG8pe3ZhciBpO2lmKGIodCk/aT10Ojk9PT10Lm5vZGVUeXBlJiYoaT10LmRlZmF1bHRWaWV3KSx2b2lkIDA9PT1vKXJldHVybiBpP2lbZV06dFtyXTtpP2kuc2Nyb2xsVG8obj9pLnBhZ2VYT2Zmc2V0Om8sbj9vOmkucGFnZVlPZmZzZXQpOnRbcl09b30sdCxyLGFyZ3VtZW50cy5sZW5ndGgpfX0pLFMuZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbih0LGUpe1MuY3NzSG9va3NbZV09R3QoeS5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKHQsbil7aWYobilyZXR1cm4gbj1WdCh0LGUpLFd0LnRlc3Qobik/Uyh0KS5wb3NpdGlvbigpW2VdKyJweCI6bn0pfSksUy5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24odCxlKXtTLmVhY2goe3BhZGRpbmc6ImlubmVyIit0LGNvbnRlbnQ6ZSwiIjoib3V0ZXIiK3R9LGZ1bmN0aW9uKG4scil7Uy5mbltyXT1mdW5jdGlvbihvLGkpe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGgmJihufHwiYm9vbGVhbiIhPXR5cGVvZiBvKSxzPW58fCghMD09PW98fCEwPT09aT8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuICQodGhpcyxmdW5jdGlvbihlLG4sbyl7dmFyIGk7cmV0dXJuIGIoZSk/MD09PXIuaW5kZXhPZigib3V0ZXIiKT9lWyJpbm5lciIrdF06ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrdF06OT09PWUubm9kZVR5cGU/KGk9ZS5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoZS5ib2R5WyJzY3JvbGwiK3RdLGlbInNjcm9sbCIrdF0sZS5ib2R5WyJvZmZzZXQiK3RdLGlbIm9mZnNldCIrdF0saVsiY2xpZW50Iit0XSkpOnZvaWQgMD09PW8/Uy5jc3MoZSxuLHMpOlMuc3R5bGUoZSxuLG8scyl9LGUsYT9vOnZvaWQgMCxhKX19KX0pLFMuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbih0LGUpe1MuZm5bZV09ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oZSxudWxsLHQsbik6dGhpcy50cmlnZ2VyKGUpfX0pLFMuZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIodCkubW91c2VsZWF2ZShlfHx0KX19KSxTLmZuLmV4dGVuZCh7YmluZDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMub24odCxudWxsLGUsbil9LHVuYmluZDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm9mZih0LG51bGwsZSl9LGRlbGVnYXRlOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0aGlzLm9uKGUsdCxuLHIpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYodCwiKioiKTp0aGlzLm9mZihlLHR8fCIqKiIsbil9fSksUy5wcm94eT1mdW5jdGlvbih0LGUpe3ZhciBuLHIsbztpZigic3RyaW5nIj09dHlwZW9mIGUmJihuPXRbZV0sZT10LHQ9biksbSh0KSlyZXR1cm4gcj11LmNhbGwoYXJndW1lbnRzLDIpLChvPWZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZXx8dGhpcyxyLmNvbmNhdCh1LmNhbGwoYXJndW1lbnRzKSkpfSkuZ3VpZD10Lmd1aWQ9dC5ndWlkfHxTLmd1aWQrKyxvfSxTLmhvbGRSZWFkeT1mdW5jdGlvbih0KXt0P1MucmVhZHlXYWl0Kys6Uy5yZWFkeSghMCl9LFMuaXNBcnJheT1BcnJheS5pc0FycmF5LFMucGFyc2VKU09OPUpTT04ucGFyc2UsUy5ub2RlTmFtZT1MLFMuaXNGdW5jdGlvbj1tLFMuaXNXaW5kb3c9YixTLmNhbWVsQ2FzZT1LLFMudHlwZT1rLFMubm93PURhdGUubm93LFMuaXNOdW1lcmljPWZ1bmN0aW9uKHQpe3ZhciBlPVMudHlwZSh0KTtyZXR1cm4oIm51bWJlciI9PT1lfHwic3RyaW5nIj09PWUpJiYhaXNOYU4odC1wYXJzZUZsb2F0KHQpKX0sdm9pZCAwPT09KHI9ZnVuY3Rpb24oKXtyZXR1cm4gU30uYXBwbHkoZSxbXSkpfHwodC5leHBvcnRzPXIpO3ZhciBRZT1uLmpRdWVyeSxaZT1uLiQ7cmV0dXJuIFMubm9Db25mbGljdD1mdW5jdGlvbih0KXtyZXR1cm4gbi4kPT09UyYmKG4uJD1aZSksdCYmbi5qUXVlcnk9PT1TJiYobi5qUXVlcnk9UWUpLFN9LG98fChuLmpRdWVyeT1uLiQ9UyksU30pfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjQ1KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0Nil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDgpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNTIpO2Z1bmN0aW9uIG8odCxlLG4sbyxpLGEscyl7dHJ5e3ZhciB1PXRbYV0ocyksYz11LnZhbHVlfWNhdGNoKHQpe3JldHVybiB2b2lkIG4odCl9dS5kb25lP2UoYyk6ci5yZXNvbHZlKGMpLnRoZW4obyxpKX10LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPWFyZ3VtZW50cztyZXR1cm4gbmV3IHIoZnVuY3Rpb24ocixpKXt2YXIgYT10LmFwcGx5KGUsbik7ZnVuY3Rpb24gcyh0KXtvKGEscixpLHMsdSwibmV4dCIsdCl9ZnVuY3Rpb24gdSh0KXtvKGEscixpLHMsdSwidGhyb3ciLHQpfXModm9pZCAwKX0pfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI2NCkuZGVmYXVsdDt0LmV4cG9ydHM9cix0LmV4cG9ydHMuZGVmYXVsdD1yfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjk4KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKHQpe3JldHVybiB0LnJlcGxhY2UoL1tcLVxbXF1cL1x7XH1cKFwpXCpcK1w/XC5cXFxeXCRcfF0vZywiXFwkJiIpfXIucHJvdG89ZnVuY3Rpb24oKXtyZXR1cm4gUmVnRXhwLmVzY2FwZT1yLHJ9LHQuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTM3KX0sZnVuY3Rpb24odCxlLG4pe24oMTM4KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLlJlZmxlY3QuY29uc3RydWN0fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oMzMpLGk9bigyMiksYT1uKDExKSxzPW4oNyksdT1uKDQ3KSxjPW4oOTEpLGw9big2KSxmPW8oIlJlZmxlY3QiLCJjb25zdHJ1Y3QiKSxwPWwoZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiEoZihmdW5jdGlvbigpe30sW10sdClpbnN0YW5jZW9mIHQpfSksaD0hbChmdW5jdGlvbigpe2YoZnVuY3Rpb24oKXt9KX0pLGQ9cHx8aDtyKHt0YXJnZXQ6IlJlZmxlY3QiLHN0YXQ6ITAsZm9yY2VkOmQsc2hhbTpkfSx7Y29uc3RydWN0OmZ1bmN0aW9uKHQsZSl7aSh0KSxhKGUpO3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg8Mz90OmkoYXJndW1lbnRzWzJdKTtpZihoJiYhcClyZXR1cm4gZih0LGUsbik7aWYodD09bil7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyB0O2Nhc2UgMTpyZXR1cm4gbmV3IHQoZVswXSk7Y2FzZSAyOnJldHVybiBuZXcgdChlWzBdLGVbMV0pO2Nhc2UgMzpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0pO2Nhc2UgNDpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0sZVszXSl9dmFyIHI9W251bGxdO3JldHVybiByLnB1c2guYXBwbHkocixlKSxuZXcoYy5hcHBseSh0LHIpKX12YXIgbz1uLnByb3RvdHlwZSxsPXUocyhvKT9vOk9iamVjdC5wcm90b3R5cGUpLGQ9RnVuY3Rpb24uYXBwbHkuY2FsbCh0LGwsZSk7cmV0dXJuIHMoZCk/ZDpsfX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMyksbz1uKDIzKSxpPW4oMTEpLGE9big1NSk7dC5leHBvcnRzPXI/T2JqZWN0LmRlZmluZVByb3BlcnRpZXM6ZnVuY3Rpb24odCxlKXtpKHQpO2Zvcih2YXIgbixyPWEoZSkscz1yLmxlbmd0aCx1PTA7cz51OylvLmYodCxuPXJbdSsrXSxlW25dKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89bigxNyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dHJ5e28ocix0LGUpfWNhdGNoKG4pe3JbdF09ZX1yZXR1cm4gZX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNDIpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxKSxvPXIuSlNPTnx8KHIuSlNPTj17c3RyaW5naWZ5OkpTT04uc3RyaW5naWZ5fSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBvLnN0cmluZ2lmeS5hcHBseShvLGFyZ3VtZW50cyl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTQ0KX0sZnVuY3Rpb24odCxlLG4pe24oMTQ1KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLk9iamVjdC5hc3NpZ259LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigxNDYpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpPYmplY3QuYXNzaWduIT09b30se2Fzc2lnbjpvfSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxMyksbz1uKDYpLGk9big1NSksYT1uKDkyKSxzPW4oNjQpLHU9bigyNCksYz1uKDY1KSxsPU9iamVjdC5hc3NpZ247dC5leHBvcnRzPSFsfHxvKGZ1bmN0aW9uKCl7dmFyIHQ9e30sZT17fSxuPVN5bWJvbCgpO3JldHVybiB0W25dPTcsImFiY2RlZmdoaWprbG1ub3BxcnN0Ii5zcGxpdCgiIikuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPXR9KSw3IT1sKHt9LHQpW25dfHwiYWJjZGVmZ2hpamtsbW5vcHFyc3QiIT1pKGwoe30sZSkpLmpvaW4oIiIpfSk/ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dSh0KSxvPWFyZ3VtZW50cy5sZW5ndGgsbD0xLGY9YS5mLHA9cy5mO28+bDspZm9yKHZhciBoLGQ9Yyhhcmd1bWVudHNbbCsrXSksZz1mP2koZCkuY29uY2F0KGYoZCkpOmkoZCksdj1nLmxlbmd0aCx5PTA7dj55OyloPWdbeSsrXSxyJiYhcC5jYWxsKGQsaCl8fChuW2hdPWRbaF0pO3JldHVybiBufTpsfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTQ4KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQ5KSxvPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5jb25jYXQ7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLmNvbmNhdD9yOmV9fSxmdW5jdGlvbih0LGUsbil7big5Myk7dmFyIHI9bigxOCk7dC5leHBvcnRzPXIoIkFycmF5IikuY29uY2F0fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTUxKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTUyKSxvPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5tYXA7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLm1hcD9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigxNTMpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLm1hcH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89big3MykubWFwO3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDohbig3MikoIm1hcCIpfSx7bWFwOmZ1bmN0aW9uKHQpe3JldHVybiBvKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNTUpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTU2KX0sZnVuY3Rpb24odCxlLG4pe24oMTU3KTt2YXIgcj1uKDEpLk9iamVjdCxvPXQuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHIuZGVmaW5lUHJvcGVydHkodCxlLG4pfTtyLmRlZmluZVByb3BlcnR5LnNoYW0mJihvLnNoYW09ITApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oMTMpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDohbyxzaGFtOiFvfSx7ZGVmaW5lUHJvcGVydHk6bigyMykuZn0pfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTU5KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE2MCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE2MSk7dmFyIHI9bigxKS5PYmplY3Qsbz10LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKX07ci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iuc2hhbSYmKG8uc2hhbT0hMCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big2KSxpPW4oMjEpLGE9big0NSkuZixzPW4oMTMpLHU9byhmdW5jdGlvbigpe2EoMSl9KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXN8fHUsc2hhbTohc30se2dldE93blByb3BlcnR5RGVzY3JpcHRvcjpmdW5jdGlvbih0LGUpe3JldHVybiBhKGkodCksZSl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNjMpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTY0KX0sZnVuY3Rpb24odCxlLG4pe24oMTY1KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLlJlZmxlY3QuZ2V0fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oNyksaT1uKDExKSxhPW4oMTQpLHM9big0NSksdT1uKDQ5KTtyKHt0YXJnZXQ6IlJlZmxlY3QiLHN0YXQ6ITB9LHtnZXQ6ZnVuY3Rpb24gdChlLG4pe3ZhciByLGMsbD1hcmd1bWVudHMubGVuZ3RoPDM/ZTphcmd1bWVudHNbMl07cmV0dXJuIGkoZSk9PT1sP2Vbbl06KHI9cy5mKGUsbikpP2EociwidmFsdWUiKT9yLnZhbHVlOnZvaWQgMD09PXIuZ2V0P3ZvaWQgMDpyLmdldC5jYWxsKGwpOm8oYz11KGUpKT90KGMsbixsKTp2b2lkIDB9fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtmb3IoOyFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKSYmbnVsbCE9PSh0PXIodCkpOyk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTY4KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE2OSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE3MCk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5PYmplY3QuZ2V0UHJvdG90eXBlT2Z9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big2KSxpPW4oMjQpLGE9big0OSkscz1uKDk2KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6byhmdW5jdGlvbigpe2EoMSl9KSxzaGFtOiFzfSx7Z2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIGEoaSh0KSl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzIpfSxmdW5jdGlvbih0LGUsbil7bigxNzMpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuT2JqZWN0LnNldFByb3RvdHlwZU9mfSxmdW5jdGlvbih0LGUsbil7bigwKSh7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITB9LHtzZXRQcm90b3R5cGVPZjpuKDc0KX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoIXIodCkmJm51bGwhPT10KXRocm93IFR5cGVFcnJvcigiQ2FuJ3Qgc2V0ICIrU3RyaW5nKHQpKyIgYXMgYSBwcm90b3R5cGUiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzYpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTc3KX0sZnVuY3Rpb24odCxlLG4pe24oMTc4KTt2YXIgcj1uKDEpLk9iamVjdDt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gci5jcmVhdGUodCxlKX19LGZ1bmN0aW9uKHQsZSxuKXtuKDApKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxzaGFtOiFuKDEzKX0se2NyZWF0ZTpuKDQ3KX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big5Nyk7ZnVuY3Rpb24gbyhlLG4pe3JldHVybiB0LmV4cG9ydHM9bz1yfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9LG8oZSxuKX10LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTgxKSxvPW4oMTAzKTtmdW5jdGlvbiBpKGUpe3JldHVybiB0LmV4cG9ydHM9aT0iZnVuY3Rpb24iPT10eXBlb2YgbyYmInN5bWJvbCI9PXR5cGVvZiByP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBvJiZ0LmNvbnN0cnVjdG9yPT09byYmdCE9PW8ucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSxpKGUpfXQuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTgyKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE4Myl9LGZ1bmN0aW9uKHQsZSxuKXtuKDk4KSxuKDM1KSxuKDUxKTt2YXIgcj1uKDc1KTt0LmV4cG9ydHM9ci5mKCJpdGVyYXRvciIpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2OCksbz1uKDQ2KSxpPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciBpLGEscz1TdHJpbmcobyhlKSksdT1yKG4pLGM9cy5sZW5ndGg7cmV0dXJuIHU8MHx8dT49Yz90PyIiOnZvaWQgMDooaT1zLmNoYXJDb2RlQXQodSkpPDU1Mjk2fHxpPjU2MzE5fHx1KzE9PT1jfHwoYT1zLmNoYXJDb2RlQXQodSsxKSk8NTYzMjB8fGE+NTczNDM/dD9zLmNoYXJBdCh1KTppOnQ/cy5zbGljZSh1LHUrMik6YS01NjMyMCsoaS01NTI5Njw8MTApKzY1NTM2fX07dC5leHBvcnRzPXtjb2RlQXQ6aSghMSksY2hhckF0OmkoITApfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz1uKDE4NiksaT1yLldlYWtNYXA7dC5leHBvcnRzPSJmdW5jdGlvbiI9PXR5cGVvZiBpJiYvbmF0aXZlIGNvZGUvLnRlc3Qoby5jYWxsKGkpKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTgpO3QuZXhwb3J0cz1yKCJuYXRpdmUtZnVuY3Rpb24tdG8tc3RyaW5nIixGdW5jdGlvbi50b1N0cmluZyl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big3Niksbz17fTtvW24oMikoInRvU3RyaW5nVGFnIildPSJ6Iix0LmV4cG9ydHM9IltvYmplY3Qgel0iIT09U3RyaW5nKG8pP2Z1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgIityKHRoaXMpKyJdIn06by50b1N0cmluZ30sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9e0NTU1J1bGVMaXN0OjAsQ1NTU3R5bGVEZWNsYXJhdGlvbjowLENTU1ZhbHVlTGlzdDowLENsaWVudFJlY3RMaXN0OjAsRE9NUmVjdExpc3Q6MCxET01TdHJpbmdMaXN0OjAsRE9NVG9rZW5MaXN0OjEsRGF0YVRyYW5zZmVySXRlbUxpc3Q6MCxGaWxlTGlzdDowLEhUTUxBbGxDb2xsZWN0aW9uOjAsSFRNTENvbGxlY3Rpb246MCxIVE1MRm9ybUVsZW1lbnQ6MCxIVE1MU2VsZWN0RWxlbWVudDowLE1lZGlhTGlzdDowLE1pbWVUeXBlQXJyYXk6MCxOYW1lZE5vZGVNYXA6MCxOb2RlTGlzdDoxLFBhaW50UmVxdWVzdExpc3Q6MCxQbHVnaW46MCxQbHVnaW5BcnJheTowLFNWR0xlbmd0aExpc3Q6MCxTVkdOdW1iZXJMaXN0OjAsU1ZHUGF0aFNlZ0xpc3Q6MCxTVkdQb2ludExpc3Q6MCxTVkdTdHJpbmdMaXN0OjAsU1ZHVHJhbnNmb3JtTGlzdDowLFNvdXJjZUJ1ZmZlckxpc3Q6MCxTdHlsZVNoZWV0TGlzdDowLFRleHRUcmFja0N1ZUxpc3Q6MCxUZXh0VHJhY2tMaXN0OjAsVG91Y2hMaXN0OjB9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTA0KSxuKDIwNyksbigyMDgpLG4oMjA5KSxuKDIxMCksbigyMTEpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDUpLGk9bigyOCksYT1uKDEzKSxzPW4oOTUpLHU9big2KSxjPW4oMTQpLGw9big0OCksZj1uKDcpLHA9bigxMSksaD1uKDI0KSxkPW4oMjEpLGc9big1NCksdj1uKDMxKSx5PW4oNDcpLG09big1NSksYj1uKDEwNikseD1uKDE5MSksdz1uKDkyKSxrPW4oNDUpLFM9bigyMyksRT1uKDY0KSxqPW4oMTcpLFQ9bigzNiksTz1uKDU4KSxBPW4oNTcpLEM9big1NiksTD1uKDcwKSxSPW4oMiksUD1uKDc1KSxOPW4oNCksST1uKDI5KSxfPW4oNTApLEQ9big3MykuZm9yRWFjaCxNPUEoImhpZGRlbiIpLFU9UigidG9QcmltaXRpdmUiKSxCPV8uc2V0LHE9Xy5nZXR0ZXJGb3IoIlN5bWJvbCIpLEY9T2JqZWN0LnByb3RvdHlwZSxIPW8uU3ltYm9sLHo9by5KU09OLFc9eiYmei5zdHJpbmdpZnksJD1rLmYsWT1TLmYsVj14LmYsRz1FLmYsSz1PKCJzeW1ib2xzIiksWD1PKCJvcC1zeW1ib2xzIiksSj1PKCJzdHJpbmctdG8tc3ltYm9sLXJlZ2lzdHJ5IiksUT1PKCJzeW1ib2wtdG8tc3RyaW5nLXJlZ2lzdHJ5IiksWj1PKCJ3a3MiKSx0dD1vLlFPYmplY3QsZXQ9IXR0fHwhdHQucHJvdG90eXBlfHwhdHQucHJvdG90eXBlLmZpbmRDaGlsZCxudD1hJiZ1KGZ1bmN0aW9uKCl7cmV0dXJuIDchPXkoWSh7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiBZKHRoaXMsImEiLHt2YWx1ZTo3fSkuYX19KSkuYX0pP2Z1bmN0aW9uKHQsZSxuKXt2YXIgcj0kKEYsZSk7ciYmZGVsZXRlIEZbZV0sWSh0LGUsbiksciYmdCE9PUYmJlkoRixlLHIpfTpZLHJ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49S1t0XT15KEgucHJvdG90eXBlKTtyZXR1cm4gQihuLHt0eXBlOiJTeW1ib2wiLHRhZzp0LGRlc2NyaXB0aW9uOmV9KSxhfHwobi5kZXNjcmlwdGlvbj1lKSxufSxvdD1zJiYic3ltYm9sIj09dHlwZW9mIEguaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KHQpaW5zdGFuY2VvZiBIfSxpdD1mdW5jdGlvbih0LGUsbil7dD09PUYmJml0KFgsZSxuKSxwKHQpO3ZhciByPWcoZSwhMCk7cmV0dXJuIHAobiksYyhLLHIpPyhuLmVudW1lcmFibGU/KGModCxNKSYmdFtNXVtyXSYmKHRbTV1bcl09ITEpLG49eShuLHtlbnVtZXJhYmxlOnYoMCwhMSl9KSk6KGModCxNKXx8WSh0LE0sdigxLHt9KSksdFtNXVtyXT0hMCksbnQodCxyLG4pKTpZKHQscixuKX0sYXQ9ZnVuY3Rpb24odCxlKXtwKHQpO3ZhciBuPWQoZSkscj1tKG4pLmNvbmNhdChsdChuKSk7cmV0dXJuIEQocixmdW5jdGlvbihlKXthJiYhc3QuY2FsbChuLGUpfHxpdCh0LGUsbltlXSl9KSx0fSxzdD1mdW5jdGlvbih0KXt2YXIgZT1nKHQsITApLG49Ry5jYWxsKHRoaXMsZSk7cmV0dXJuISh0aGlzPT09RiYmYyhLLGUpJiYhYyhYLGUpKSYmKCEobnx8IWModGhpcyxlKXx8IWMoSyxlKXx8Yyh0aGlzLE0pJiZ0aGlzW01dW2VdKXx8bil9LHV0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZCh0KSxyPWcoZSwhMCk7aWYobiE9PUZ8fCFjKEsscil8fGMoWCxyKSl7dmFyIG89JChuLHIpO3JldHVybiFvfHwhYyhLLHIpfHxjKG4sTSkmJm5bTV1bcl18fChvLmVudW1lcmFibGU9ITApLG99fSxjdD1mdW5jdGlvbih0KXt2YXIgZT1WKGQodCkpLG49W107cmV0dXJuIEQoZSxmdW5jdGlvbih0KXtjKEssdCl8fGMoQyx0KXx8bi5wdXNoKHQpfSksbn0sbHQ9ZnVuY3Rpb24odCl7dmFyIGU9dD09PUYsbj1WKGU/WDpkKHQpKSxyPVtdO3JldHVybiBEKG4sZnVuY3Rpb24odCl7IWMoSyx0KXx8ZSYmIWMoRix0KXx8ci5wdXNoKEtbdF0pfSkscn07c3x8KFQoKEg9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgSCl0aHJvdyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9TdHJpbmcoYXJndW1lbnRzWzBdKTp2b2lkIDAsZT1MKHQpLG49ZnVuY3Rpb24odCl7dGhpcz09PUYmJm4uY2FsbChYLHQpLGModGhpcyxNKSYmYyh0aGlzW01dLGUpJiYodGhpc1tNXVtlXT0hMSksbnQodGhpcyxlLHYoMSx0KSl9O3JldHVybiBhJiZldCYmbnQoRixlLHtjb25maWd1cmFibGU6ITAsc2V0Om59KSxydChlLHQpfSkucHJvdG90eXBlLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4gcSh0aGlzKS50YWd9KSxFLmY9c3QsUy5mPWl0LGsuZj11dCxiLmY9eC5mPWN0LHcuZj1sdCxhJiYoWShILnByb3RvdHlwZSwiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHEodGhpcykuZGVzY3JpcHRpb259fSksaXx8VChGLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsc3Qse3Vuc2FmZTohMH0pKSxQLmY9ZnVuY3Rpb24odCl7cmV0dXJuIHJ0KFIodCksdCl9KSxyKHtnbG9iYWw6ITAsd3JhcDohMCxmb3JjZWQ6IXMsc2hhbTohc30se1N5bWJvbDpIfSksRChtKFopLGZ1bmN0aW9uKHQpe04odCl9KSxyKHt0YXJnZXQ6IlN5bWJvbCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtmb3I6ZnVuY3Rpb24odCl7dmFyIGU9U3RyaW5nKHQpO2lmKGMoSixlKSlyZXR1cm4gSltlXTt2YXIgbj1IKGUpO3JldHVybiBKW2VdPW4sUVtuXT1lLG59LGtleUZvcjpmdW5jdGlvbih0KXtpZighb3QodCkpdGhyb3cgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBzeW1ib2wiKTtpZihjKFEsdCkpcmV0dXJuIFFbdF19LHVzZVNldHRlcjpmdW5jdGlvbigpe2V0PSEwfSx1c2VTaW1wbGU6ZnVuY3Rpb24oKXtldD0hMX19KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXMsc2hhbTohYX0se2NyZWF0ZTpmdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lP3kodCk6YXQoeSh0KSxlKX0sZGVmaW5lUHJvcGVydHk6aXQsZGVmaW5lUHJvcGVydGllczphdCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6dXR9KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtnZXRPd25Qcm9wZXJ0eU5hbWVzOmN0LGdldE93blByb3BlcnR5U3ltYm9sczpsdH0pLHIoe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDp1KGZ1bmN0aW9uKCl7dy5mKDEpfSl9LHtnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ZnVuY3Rpb24odCl7cmV0dXJuIHcuZihoKHQpKX19KSx6JiZyKHt0YXJnZXQ6IkpTT04iLHN0YXQ6ITAsZm9yY2VkOiFzfHx1KGZ1bmN0aW9uKCl7dmFyIHQ9SCgpO3JldHVybiJbbnVsbF0iIT1XKFt0XSl8fCJ7fSIhPVcoe2E6dH0pfHwie30iIT1XKE9iamVjdCh0KSl9KX0se3N0cmluZ2lmeTpmdW5jdGlvbih0KXtmb3IodmFyIGUsbixyPVt0XSxvPTE7YXJndW1lbnRzLmxlbmd0aD5vOylyLnB1c2goYXJndW1lbnRzW28rK10pO2lmKG49ZT1yWzFdLChmKGUpfHx2b2lkIDAhPT10KSYmIW90KHQpKXJldHVybiBsKGUpfHwoZT1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuJiYoZT1uLmNhbGwodGhpcyx0LGUpKSwhb3QoZSkpcmV0dXJuIGV9KSxyWzFdPWUsVy5hcHBseSh6LHIpfX0pLEgucHJvdG90eXBlW1VdfHxqKEgucHJvdG90eXBlLFUsSC5wcm90b3R5cGUudmFsdWVPZiksSShILCJTeW1ib2wiKSxDW01dPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMSksbz1uKDEwNikuZixpPXt9LnRvU3RyaW5nLGE9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KTpbXTt0LmV4cG9ydHMuZj1mdW5jdGlvbih0KXtyZXR1cm4gYSYmIltvYmplY3QgV2luZG93XSI9PWkuY2FsbCh0KT9mdW5jdGlvbih0KXt0cnl7cmV0dXJuIG8odCl9Y2F0Y2godCl7cmV0dXJuIGEuc2xpY2UoKX19KHQpOm8ocih0KSl9fSxmdW5jdGlvbih0LGUsbil7big0KSgiYXN5bmNJdGVyYXRvciIpfSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlLG4pe24oNCkoImhhc0luc3RhbmNlIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJpc0NvbmNhdFNwcmVhZGFibGUiKX0sZnVuY3Rpb24odCxlLG4pe24oNCkoIm1hdGNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJtYXRjaEFsbCIpfSxmdW5jdGlvbih0LGUsbil7big0KSgicmVwbGFjZSIpfSxmdW5jdGlvbih0LGUsbil7big0KSgic2VhcmNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJzcGVjaWVzIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJzcGxpdCIpfSxmdW5jdGlvbih0LGUsbil7big0KSgidG9QcmltaXRpdmUiKX0sZnVuY3Rpb24odCxlLG4pe24oNCkoInRvU3RyaW5nVGFnIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJ1bnNjb3BhYmxlcyIpfSxmdW5jdGlvbih0LGUsbil7bigyOSkoTWF0aCwiTWF0aCIsITApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KTtuKDI5KShyLkpTT04sIkpTT04iLCEwKX0sZnVuY3Rpb24odCxlLG4pe24oNCkoImFzeW5jRGlzcG9zZSIpfSxmdW5jdGlvbih0LGUsbil7big0KSgiZGlzcG9zZSIpfSxmdW5jdGlvbih0LGUsbil7big0KSgib2JzZXJ2YWJsZSIpfSxmdW5jdGlvbih0LGUsbil7big0KSgicGF0dGVybk1hdGNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJyZXBsYWNlQWxsIil9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMTQpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMTUpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmZpbmQ7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLmZpbmQ/cjplfX0sZnVuY3Rpb24odCxlLG4pe24oMjE2KTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5maW5kfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDczKS5maW5kLGk9big3NyksYT0hMDsiZmluZCJpbltdJiZBcnJheSgxKS5maW5kKGZ1bmN0aW9uKCl7YT0hMX0pLHIoe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDphfSx7ZmluZDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLGkoImZpbmQiKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIxOCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIxOSksbz1TdHJpbmcucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LnRyaW07cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHx0PT09b3x8dCBpbnN0YW5jZW9mIFN0cmluZyYmZT09PW8udHJpbT9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigyMjApO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJTdHJpbmciKS50cmltfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDEwNykudHJpbTtyKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOm4oMjIxKSgidHJpbSIpfSx7dHJpbTpmdW5jdGlvbigpe3JldHVybiBvKHRoaXMpfX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2KSxvPW4oNzgpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcihmdW5jdGlvbigpe3JldHVybiEhb1t0XSgpfHwi4oCLwoXhoI4iIT0i4oCLwoXhoI4iW3RdKCl8fG9bdF0ubmFtZSE9PXR9KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMjMpfSxmdW5jdGlvbih0LGUsbil7bigyMjQpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIucGFyc2VJbnR9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigyMjUpO3Ioe2dsb2JhbDohMCxmb3JjZWQ6cGFyc2VJbnQhPW99LHtwYXJzZUludDpvfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89bigxMDcpLnRyaW0saT1uKDc4KSxhPXIucGFyc2VJbnQscz0vXlsrLV0/MFtYeF0vLHU9OCE9PWEoaSsiMDgiKXx8MjIhPT1hKGkrIjB4MTYiKTt0LmV4cG9ydHM9dT9mdW5jdGlvbih0LGUpe3ZhciBuPW8oU3RyaW5nKHQpKTtyZXR1cm4gYShuLGU+Pj4wfHwocy50ZXN0KG4pPzE2OjEwKSl9OmF9LGZ1bmN0aW9uKHQsZSxuKXtuKDUxKSxuKDM1KSx0LmV4cG9ydHM9bigxMDgpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTA5KX0sZnVuY3Rpb24odCxlLG4pe24oMCkoe3RhcmdldDoiQXJyYXkiLHN0YXQ6ITB9LHtpc0FycmF5Om4oNDgpfSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDUxKSxuKDM1KSx0LmV4cG9ydHM9big1Mil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMDQpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTEwKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDIzMyk7cih7dGFyZ2V0OiJBcnJheSIsc3RhdDohMCxmb3JjZWQ6IW4oMTEzKShmdW5jdGlvbih0KXtBcnJheS5mcm9tKHQpfSl9LHtmcm9tOm99KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMyKSxvPW4oMjQpLGk9bigxMTEpLGE9bigxMTIpLHM9bigzNCksdT1uKDcxKSxjPW4oNTIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZSxuLGwsZixwPW8odCksaD0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcz90aGlzOkFycmF5LGQ9YXJndW1lbnRzLmxlbmd0aCxnPWQ+MT9hcmd1bWVudHNbMV06dm9pZCAwLHY9dm9pZCAwIT09Zyx5PTAsbT1jKHApO2lmKHYmJihnPXIoZyxkPjI/YXJndW1lbnRzWzJdOnZvaWQgMCwyKSksbnVsbD09bXx8aD09QXJyYXkmJmEobSkpZm9yKG49bmV3IGgoZT1zKHAubGVuZ3RoKSk7ZT55O3krKyl1KG4seSx2P2cocFt5XSx5KTpwW3ldKTtlbHNlIGZvcihmPW0uY2FsbChwKSxuPW5ldyBoOyEobD1mLm5leHQoKSkuZG9uZTt5KyspdShuLHksdj9pKGYsZyxbbC52YWx1ZSx5XSwhMCk6bC52YWx1ZSk7cmV0dXJuIG4ubGVuZ3RoPXksbn19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMTQpfSxmdW5jdGlvbih0LGUsbil7bigyMzYpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLnNsaWNlfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDcpLGk9big0OCksYT1uKDg5KSxzPW4oMzQpLHU9bigyMSksYz1uKDcxKSxsPW4oNzIpLGY9bigyKSgic3BlY2llcyIpLHA9W10uc2xpY2UsaD1NYXRoLm1heDtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IWwoInNsaWNlIil9LHtzbGljZTpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbCxkPXUodGhpcyksZz1zKGQubGVuZ3RoKSx2PWEodCxnKSx5PWEodm9pZCAwPT09ZT9nOmUsZyk7aWYoaShkKSYmKCJmdW5jdGlvbiIhPXR5cGVvZihuPWQuY29uc3RydWN0b3IpfHxuIT09QXJyYXkmJiFpKG4ucHJvdG90eXBlKT9vKG4pJiZudWxsPT09KG49bltmXSkmJihuPXZvaWQgMCk6bj12b2lkIDAsbj09PUFycmF5fHx2b2lkIDA9PT1uKSlyZXR1cm4gcC5jYWxsKGQsdix5KTtmb3Iocj1uZXcodm9pZCAwPT09bj9BcnJheTpuKShoKHktdiwwKSksbD0wO3Y8eTt2KyssbCsrKXYgaW4gZCYmYyhyLGwsZFt2XSk7cmV0dXJuIHIubGVuZ3RoPWwscn19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzOCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDIzOSk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5PYmplY3Qua2V5c30sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDI0KSxpPW4oNTUpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpuKDYpKGZ1bmN0aW9uKCl7aSgxKX0pfSx7a2V5czpmdW5jdGlvbih0KXtyZXR1cm4gaShvKHQpKX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0MSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI0Miksbz1BcnJheS5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5kZXhPZjtyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PW8uaW5kZXhPZj9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigyNDMpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLmluZGV4T2Z9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNjcpLmluZGV4T2YsaT1uKDI0NCksYT1bXS5pbmRleE9mLHM9ISFhJiYxL1sxXS5pbmRleE9mKDEsLTApPDAsdT1pKCJpbmRleE9mIik7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOnN8fHV9LHtpbmRleE9mOmZ1bmN0aW9uKHQpe3JldHVybiBzP2EuYXBwbHkodGhpcyxhcmd1bWVudHMpfHwwOm8odGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPVtdW3RdO3JldHVybiFufHwhcihmdW5jdGlvbigpe24uY2FsbChudWxsLGV8fGZ1bmN0aW9uKCl7dGhyb3cgMX0sMSl9KX19LGZ1bmN0aW9uKHQsZSxuKXtuKDExNSksdC5leHBvcnRzPW4oMSkuc2V0VGltZW91dH0sZnVuY3Rpb24odCxlLG4pe24oMTE1KSx0LmV4cG9ydHM9bigxKS5zZXRJbnRlcnZhbH0sZnVuY3Rpb24odCxlLG4pe3ZhciByPWZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZSxuPU9iamVjdC5wcm90b3R5cGUscj1uLmhhc093blByb3BlcnR5LG89ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbD9TeW1ib2w6e30saT1vLml0ZXJhdG9yfHwiQEBpdGVyYXRvciIsYT1vLmFzeW5jSXRlcmF0b3J8fCJAQGFzeW5jSXRlcmF0b3IiLHM9by50b1N0cmluZ1RhZ3x8IkBAdG9TdHJpbmdUYWciO2Z1bmN0aW9uIHUodCxlLG4pe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSksdFtlXX10cnl7dSh7fSwiIil9Y2F0Y2godCl7dT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRbZV09bn19ZnVuY3Rpb24gYyh0LGUsbixyKXt2YXIgbz1lJiZlLnByb3RvdHlwZSBpbnN0YW5jZW9mIHY/ZTp2LGk9T2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSksYT1uZXcgQShyfHxbXSk7cmV0dXJuIGkuX2ludm9rZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZjtyZXR1cm4gZnVuY3Rpb24obyxpKXtpZihyPT09aCl0aHJvdyBuZXcgRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTtpZihyPT09ZCl7aWYoInRocm93Ij09PW8pdGhyb3cgaTtyZXR1cm4gTCgpfWZvcihuLm1ldGhvZD1vLG4uYXJnPWk7Oyl7dmFyIGE9bi5kZWxlZ2F0ZTtpZihhKXt2YXIgcz1qKGEsbik7aWYocyl7aWYocz09PWcpY29udGludWU7cmV0dXJuIHN9fWlmKCJuZXh0Ij09PW4ubWV0aG9kKW4uc2VudD1uLl9zZW50PW4uYXJnO2Vsc2UgaWYoInRocm93Ij09PW4ubWV0aG9kKXtpZihyPT09Zil0aHJvdyByPWQsbi5hcmc7bi5kaXNwYXRjaEV4Y2VwdGlvbihuLmFyZyl9ZWxzZSJyZXR1cm4iPT09bi5tZXRob2QmJm4uYWJydXB0KCJyZXR1cm4iLG4uYXJnKTtyPWg7dmFyIHU9bCh0LGUsbik7aWYoIm5vcm1hbCI9PT11LnR5cGUpe2lmKHI9bi5kb25lP2Q6cCx1LmFyZz09PWcpY29udGludWU7cmV0dXJue3ZhbHVlOnUuYXJnLGRvbmU6bi5kb25lfX0idGhyb3ciPT09dS50eXBlJiYocj1kLG4ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9dS5hcmcpfX19KHQsbixhKSxpfWZ1bmN0aW9uIGwodCxlLG4pe3RyeXtyZXR1cm57dHlwZToibm9ybWFsIixhcmc6dC5jYWxsKGUsbil9fWNhdGNoKHQpe3JldHVybnt0eXBlOiJ0aHJvdyIsYXJnOnR9fX10LndyYXA9Yzt2YXIgZj0ic3VzcGVuZGVkU3RhcnQiLHA9InN1c3BlbmRlZFlpZWxkIixoPSJleGVjdXRpbmciLGQ9ImNvbXBsZXRlZCIsZz17fTtmdW5jdGlvbiB2KCl7fWZ1bmN0aW9uIHkoKXt9ZnVuY3Rpb24gbSgpe312YXIgYj17fTtiW2ldPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3ZhciB4PU9iamVjdC5nZXRQcm90b3R5cGVPZix3PXgmJngoeChDKFtdKSkpO3cmJnchPT1uJiZyLmNhbGwodyxpKSYmKGI9dyk7dmFyIGs9bS5wcm90b3R5cGU9di5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShiKTtmdW5jdGlvbiBTKHQpe1sibmV4dCIsInRocm93IiwicmV0dXJuIl0uZm9yRWFjaChmdW5jdGlvbihlKXt1KHQsZSxmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faW52b2tlKGUsdCl9KX0pfWZ1bmN0aW9uIEUodCxlKXt2YXIgbjt0aGlzLl9pbnZva2U9ZnVuY3Rpb24obyxpKXtmdW5jdGlvbiBhKCl7cmV0dXJuIG5ldyBlKGZ1bmN0aW9uKG4sYSl7IWZ1bmN0aW9uIG4obyxpLGEscyl7dmFyIHU9bCh0W29dLHQsaSk7aWYoInRocm93IiE9PXUudHlwZSl7dmFyIGM9dS5hcmcsZj1jLnZhbHVlO3JldHVybiBmJiYib2JqZWN0Ij09dHlwZW9mIGYmJnIuY2FsbChmLCJfX2F3YWl0Iik/ZS5yZXNvbHZlKGYuX19hd2FpdCkudGhlbihmdW5jdGlvbih0KXtuKCJuZXh0Iix0LGEscyl9LGZ1bmN0aW9uKHQpe24oInRocm93Iix0LGEscyl9KTplLnJlc29sdmUoZikudGhlbihmdW5jdGlvbih0KXtjLnZhbHVlPXQsYShjKX0sZnVuY3Rpb24odCl7cmV0dXJuIG4oInRocm93Iix0LGEscyl9KX1zKHUuYXJnKX0obyxpLG4sYSl9KX1yZXR1cm4gbj1uP24udGhlbihhLGEpOmEoKX19ZnVuY3Rpb24gaih0LG4pe3ZhciByPXQuaXRlcmF0b3Jbbi5tZXRob2RdO2lmKHI9PT1lKXtpZihuLmRlbGVnYXRlPW51bGwsInRocm93Ij09PW4ubWV0aG9kKXtpZih0Lml0ZXJhdG9yLnJldHVybiYmKG4ubWV0aG9kPSJyZXR1cm4iLG4uYXJnPWUsaih0LG4pLCJ0aHJvdyI9PT1uLm1ldGhvZCkpcmV0dXJuIGc7bi5tZXRob2Q9InRocm93IixuLmFyZz1uZXcgVHlwZUVycm9yKCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kIil9cmV0dXJuIGd9dmFyIG89bChyLHQuaXRlcmF0b3Isbi5hcmcpO2lmKCJ0aHJvdyI9PT1vLnR5cGUpcmV0dXJuIG4ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9by5hcmcsbi5kZWxlZ2F0ZT1udWxsLGc7dmFyIGk9by5hcmc7cmV0dXJuIGk/aS5kb25lPyhuW3QucmVzdWx0TmFtZV09aS52YWx1ZSxuLm5leHQ9dC5uZXh0TG9jLCJyZXR1cm4iIT09bi5tZXRob2QmJihuLm1ldGhvZD0ibmV4dCIsbi5hcmc9ZSksbi5kZWxlZ2F0ZT1udWxsLGcpOmk6KG4ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9bmV3IFR5cGVFcnJvcigiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3QiKSxuLmRlbGVnYXRlPW51bGwsZyl9ZnVuY3Rpb24gVCh0KXt2YXIgZT17dHJ5TG9jOnRbMF19OzEgaW4gdCYmKGUuY2F0Y2hMb2M9dFsxXSksMiBpbiB0JiYoZS5maW5hbGx5TG9jPXRbMl0sZS5hZnRlckxvYz10WzNdKSx0aGlzLnRyeUVudHJpZXMucHVzaChlKX1mdW5jdGlvbiBPKHQpe3ZhciBlPXQuY29tcGxldGlvbnx8e307ZS50eXBlPSJub3JtYWwiLGRlbGV0ZSBlLmFyZyx0LmNvbXBsZXRpb249ZX1mdW5jdGlvbiBBKHQpe3RoaXMudHJ5RW50cmllcz1be3RyeUxvYzoicm9vdCJ9XSx0LmZvckVhY2goVCx0aGlzKSx0aGlzLnJlc2V0KCEwKX1mdW5jdGlvbiBDKHQpe2lmKHQpe3ZhciBuPXRbaV07aWYobilyZXR1cm4gbi5jYWxsKHQpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0Lm5leHQpcmV0dXJuIHQ7aWYoIWlzTmFOKHQubGVuZ3RoKSl7dmFyIG89LTEsYT1mdW5jdGlvbiBuKCl7Zm9yKDsrK288dC5sZW5ndGg7KWlmKHIuY2FsbCh0LG8pKXJldHVybiBuLnZhbHVlPXRbb10sbi5kb25lPSExLG47cmV0dXJuIG4udmFsdWU9ZSxuLmRvbmU9ITAsbn07cmV0dXJuIGEubmV4dD1hfX1yZXR1cm57bmV4dDpMfX1mdW5jdGlvbiBMKCl7cmV0dXJue3ZhbHVlOmUsZG9uZTohMH19cmV0dXJuIHkucHJvdG90eXBlPWsuY29uc3RydWN0b3I9bSxtLmNvbnN0cnVjdG9yPXkseS5kaXNwbGF5TmFtZT11KG0scywiR2VuZXJhdG9yRnVuY3Rpb24iKSx0LmlzR2VuZXJhdG9yRnVuY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQuY29uc3RydWN0b3I7cmV0dXJuISFlJiYoZT09PXl8fCJHZW5lcmF0b3JGdW5jdGlvbiI9PT0oZS5kaXNwbGF5TmFtZXx8ZS5uYW1lKSl9LHQubWFyaz1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LG0pOih0Ll9fcHJvdG9fXz1tLHUodCxzLCJHZW5lcmF0b3JGdW5jdGlvbiIpKSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGspLHR9LHQuYXdyYXA9ZnVuY3Rpb24odCl7cmV0dXJue19fYXdhaXQ6dH19LFMoRS5wcm90b3R5cGUpLEUucHJvdG90eXBlW2FdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQuQXN5bmNJdGVyYXRvcj1FLHQuYXN5bmM9ZnVuY3Rpb24oZSxuLHIsbyxpKXt2b2lkIDA9PT1pJiYoaT1Qcm9taXNlKTt2YXIgYT1uZXcgRShjKGUsbixyLG8pLGkpO3JldHVybiB0LmlzR2VuZXJhdG9yRnVuY3Rpb24obik/YTphLm5leHQoKS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiB0LmRvbmU/dC52YWx1ZTphLm5leHQoKX0pfSxTKGspLHUoayxzLCJHZW5lcmF0b3IiKSxrW2ldPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGsudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iW29iamVjdCBHZW5lcmF0b3JdIn0sdC5rZXlzPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KWUucHVzaChuKTtyZXR1cm4gZS5yZXZlcnNlKCksZnVuY3Rpb24gbigpe2Zvcig7ZS5sZW5ndGg7KXt2YXIgcj1lLnBvcCgpO2lmKHIgaW4gdClyZXR1cm4gbi52YWx1ZT1yLG4uZG9uZT0hMSxufXJldHVybiBuLmRvbmU9ITAsbn19LHQudmFsdWVzPUMsQS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkEscmVzZXQ6ZnVuY3Rpb24odCl7aWYodGhpcy5wcmV2PTAsdGhpcy5uZXh0PTAsdGhpcy5zZW50PXRoaXMuX3NlbnQ9ZSx0aGlzLmRvbmU9ITEsdGhpcy5kZWxlZ2F0ZT1udWxsLHRoaXMubWV0aG9kPSJuZXh0Iix0aGlzLmFyZz1lLHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKE8pLCF0KWZvcih2YXIgbiBpbiB0aGlzKSJ0Ij09PW4uY2hhckF0KDApJiZyLmNhbGwodGhpcyxuKSYmIWlzTmFOKCtuLnNsaWNlKDEpKSYmKHRoaXNbbl09ZSl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLmRvbmU9ITA7dmFyIHQ9dGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247aWYoInRocm93Ij09PXQudHlwZSl0aHJvdyB0LmFyZztyZXR1cm4gdGhpcy5ydmFsfSxkaXNwYXRjaEV4Y2VwdGlvbjpmdW5jdGlvbih0KXtpZih0aGlzLmRvbmUpdGhyb3cgdDt2YXIgbj10aGlzO2Z1bmN0aW9uIG8ocixvKXtyZXR1cm4gcy50eXBlPSJ0aHJvdyIscy5hcmc9dCxuLm5leHQ9cixvJiYobi5tZXRob2Q9Im5leHQiLG4uYXJnPWUpLCEhb31mb3IodmFyIGk9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2k+PTA7LS1pKXt2YXIgYT10aGlzLnRyeUVudHJpZXNbaV0scz1hLmNvbXBsZXRpb247aWYoInJvb3QiPT09YS50cnlMb2MpcmV0dXJuIG8oImVuZCIpO2lmKGEudHJ5TG9jPD10aGlzLnByZXYpe3ZhciB1PXIuY2FsbChhLCJjYXRjaExvYyIpLGM9ci5jYWxsKGEsImZpbmFsbHlMb2MiKTtpZih1JiZjKXtpZih0aGlzLnByZXY8YS5jYXRjaExvYylyZXR1cm4gbyhhLmNhdGNoTG9jLCEwKTtpZih0aGlzLnByZXY8YS5maW5hbGx5TG9jKXJldHVybiBvKGEuZmluYWxseUxvYyl9ZWxzZSBpZih1KXtpZih0aGlzLnByZXY8YS5jYXRjaExvYylyZXR1cm4gbyhhLmNhdGNoTG9jLCEwKX1lbHNle2lmKCFjKXRocm93IG5ldyBFcnJvcigidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHkiKTtpZih0aGlzLnByZXY8YS5maW5hbGx5TG9jKXJldHVybiBvKGEuZmluYWxseUxvYyl9fX19LGFicnVwdDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7bj49MDstLW4pe3ZhciBvPXRoaXMudHJ5RW50cmllc1tuXTtpZihvLnRyeUxvYzw9dGhpcy5wcmV2JiZyLmNhbGwobywiZmluYWxseUxvYyIpJiZ0aGlzLnByZXY8by5maW5hbGx5TG9jKXt2YXIgaT1vO2JyZWFrfX1pJiYoImJyZWFrIj09PXR8fCJjb250aW51ZSI9PT10KSYmaS50cnlMb2M8PWUmJmU8PWkuZmluYWxseUxvYyYmKGk9bnVsbCk7dmFyIGE9aT9pLmNvbXBsZXRpb246e307cmV0dXJuIGEudHlwZT10LGEuYXJnPWUsaT8odGhpcy5tZXRob2Q9Im5leHQiLHRoaXMubmV4dD1pLmZpbmFsbHlMb2MsZyk6dGhpcy5jb21wbGV0ZShhKX0sY29tcGxldGU6ZnVuY3Rpb24odCxlKXtpZigidGhyb3ciPT09dC50eXBlKXRocm93IHQuYXJnO3JldHVybiJicmVhayI9PT10LnR5cGV8fCJjb250aW51ZSI9PT10LnR5cGU/dGhpcy5uZXh0PXQuYXJnOiJyZXR1cm4iPT09dC50eXBlPyh0aGlzLnJ2YWw9dGhpcy5hcmc9dC5hcmcsdGhpcy5tZXRob2Q9InJldHVybiIsdGhpcy5uZXh0PSJlbmQiKToibm9ybWFsIj09PXQudHlwZSYmZSYmKHRoaXMubmV4dD1lKSxnfSxmaW5pc2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtlPj0wOy0tZSl7dmFyIG49dGhpcy50cnlFbnRyaWVzW2VdO2lmKG4uZmluYWxseUxvYz09PXQpcmV0dXJuIHRoaXMuY29tcGxldGUobi5jb21wbGV0aW9uLG4uYWZ0ZXJMb2MpLE8obiksZ319LGNhdGNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7ZT49MDstLWUpe3ZhciBuPXRoaXMudHJ5RW50cmllc1tlXTtpZihuLnRyeUxvYz09PXQpe3ZhciByPW4uY29tcGxldGlvbjtpZigidGhyb3ciPT09ci50eXBlKXt2YXIgbz1yLmFyZztPKG4pfXJldHVybiBvfX10aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpfSxkZWxlZ2F0ZVlpZWxkOmZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdGhpcy5kZWxlZ2F0ZT17aXRlcmF0b3I6Qyh0KSxyZXN1bHROYW1lOm4sbmV4dExvYzpyfSwibmV4dCI9PT10aGlzLm1ldGhvZCYmKHRoaXMuYXJnPWUpLGd9fSx0fSh0LmV4cG9ydHMpO3RyeXtyZWdlbmVyYXRvclJ1bnRpbWU9cn1jYXRjaCh0KXtGdW5jdGlvbigiciIsInJlZ2VuZXJhdG9yUnVudGltZSA9IHIiKShyKX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDkpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNTApLG89RnVuY3Rpb24ucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmJpbmQ7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgRnVuY3Rpb24mJmU9PT1vLmJpbmQ/cjplfX0sZnVuY3Rpb24odCxlLG4pe24oMjUxKTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiRnVuY3Rpb24iKS5iaW5kfSxmdW5jdGlvbih0LGUsbil7bigwKSh7dGFyZ2V0OiJGdW5jdGlvbiIscHJvdG86ITB9LHtiaW5kOm4oOTEpfSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNTMpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTE2KSxuKDI1OSksbigyNjApLG4oMjYxKSxuKDI2Mil9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHIsbyxpLGEscz1uKDApLHU9bigyOCksYz1uKDUpLGw9bigxKSxmPW4oMTE3KSxwPW4oMzYpLGg9bigxMTgpLGQ9bigyOSksZz1uKDI1NSksdj1uKDcpLHk9bigyMiksbT1uKDExOSksYj1uKDI3KSx4PW4oNTkpLHc9bigxMTMpLGs9bigxMjApLFM9bigxMjEpLnNldCxFPW4oMjU2KSxqPW4oMTIyKSxUPW4oMjU3KSxPPW4oNTMpLEE9big2MCksQz1uKDc5KSxMPW4oNTApLFI9big4NyksUD1uKDIpKCJzcGVjaWVzIiksTj0iUHJvbWlzZSIsST1MLmdldCxfPUwuc2V0LEQ9TC5nZXR0ZXJGb3IoTiksTT1mLFU9Yy5UeXBlRXJyb3IsQj1jLmRvY3VtZW50LHE9Yy5wcm9jZXNzLEY9Yy5mZXRjaCxIPXEmJnEudmVyc2lvbnMsej1IJiZILnY4fHwiIixXPU8uZiwkPVcsWT0icHJvY2VzcyI9PWIocSksVj0hIShCJiZCLmNyZWF0ZUV2ZW50JiZjLmRpc3BhdGNoRXZlbnQpLEc9UihOLGZ1bmN0aW9uKCl7dmFyIHQ9TS5yZXNvbHZlKDEpLGU9ZnVuY3Rpb24oKXt9LG49KHQuY29uc3RydWN0b3I9e30pW1BdPWZ1bmN0aW9uKHQpe3QoZSxlKX07cmV0dXJuISgoWXx8ImZ1bmN0aW9uIj09dHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCkmJighdXx8dC5maW5hbGx5KSYmdC50aGVuKGUpaW5zdGFuY2VvZiBuJiYwIT09ei5pbmRleE9mKCI2LjYiKSYmLTE9PT1DLmluZGV4T2YoIkNocm9tZS82NiIpKX0pLEs9R3x8IXcoZnVuY3Rpb24odCl7TS5hbGwodCkuY2F0Y2goZnVuY3Rpb24oKXt9KX0pLFg9ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuISghdih0KXx8ImZ1bmN0aW9uIiE9dHlwZW9mKGU9dC50aGVuKSkmJmV9LEo9ZnVuY3Rpb24odCxlLG4pe2lmKCFlLm5vdGlmaWVkKXtlLm5vdGlmaWVkPSEwO3ZhciByPWUucmVhY3Rpb25zO0UoZnVuY3Rpb24oKXtmb3IodmFyIG89ZS52YWx1ZSxpPTE9PWUuc3RhdGUsYT0wO3IubGVuZ3RoPmE7KXt2YXIgcyx1LGMsbD1yW2ErK10sZj1pP2wub2s6bC5mYWlsLHA9bC5yZXNvbHZlLGg9bC5yZWplY3QsZD1sLmRvbWFpbjt0cnl7Zj8oaXx8KDI9PT1lLnJlamVjdGlvbiYmZXQodCxlKSxlLnJlamVjdGlvbj0xKSwhMD09PWY/cz1vOihkJiZkLmVudGVyKCkscz1mKG8pLGQmJihkLmV4aXQoKSxjPSEwKSkscz09PWwucHJvbWlzZT9oKFUoIlByb21pc2UtY2hhaW4gY3ljbGUiKSk6KHU9WChzKSk/dS5jYWxsKHMscCxoKTpwKHMpKTpoKG8pfWNhdGNoKHQpe2QmJiFjJiZkLmV4aXQoKSxoKHQpfX1lLnJlYWN0aW9ucz1bXSxlLm5vdGlmaWVkPSExLG4mJiFlLnJlamVjdGlvbiYmWih0LGUpfSl9fSxRPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvO1Y/KChyPUIuY3JlYXRlRXZlbnQoIkV2ZW50IikpLnByb21pc2U9ZSxyLnJlYXNvbj1uLHIuaW5pdEV2ZW50KHQsITEsITApLGMuZGlzcGF0Y2hFdmVudChyKSk6cj17cHJvbWlzZTplLHJlYXNvbjpufSwobz1jWyJvbiIrdF0pP28ocik6InVuaGFuZGxlZHJlamVjdGlvbiI9PT10JiZUKCJVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24iLG4pfSxaPWZ1bmN0aW9uKHQsZSl7Uy5jYWxsKGMsZnVuY3Rpb24oKXt2YXIgbixyPWUudmFsdWU7aWYodHQoZSkmJihuPUEoZnVuY3Rpb24oKXtZP3EuZW1pdCgidW5oYW5kbGVkUmVqZWN0aW9uIixyLHQpOlEoInVuaGFuZGxlZHJlamVjdGlvbiIsdCxyKX0pLGUucmVqZWN0aW9uPVl8fHR0KGUpPzI6MSxuLmVycm9yKSl0aHJvdyBuLnZhbHVlfSl9LHR0PWZ1bmN0aW9uKHQpe3JldHVybiAxIT09dC5yZWplY3Rpb24mJiF0LnBhcmVudH0sZXQ9ZnVuY3Rpb24odCxlKXtTLmNhbGwoYyxmdW5jdGlvbigpe1k/cS5lbWl0KCJyZWplY3Rpb25IYW5kbGVkIix0KTpRKCJyZWplY3Rpb25oYW5kbGVkIix0LGUudmFsdWUpfSl9LG50PWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBmdW5jdGlvbihvKXt0KGUsbixvLHIpfX0scnQ9ZnVuY3Rpb24odCxlLG4scil7ZS5kb25lfHwoZS5kb25lPSEwLHImJihlPXIpLGUudmFsdWU9bixlLnN0YXRlPTIsSih0LGUsITApKX0sb3Q9ZnVuY3Rpb24odCxlLG4scil7aWYoIWUuZG9uZSl7ZS5kb25lPSEwLHImJihlPXIpO3RyeXtpZih0PT09bil0aHJvdyBVKCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZiIpO3ZhciBvPVgobik7bz9FKGZ1bmN0aW9uKCl7dmFyIHI9e2RvbmU6ITF9O3RyeXtvLmNhbGwobixudChvdCx0LHIsZSksbnQocnQsdCxyLGUpKX1jYXRjaChuKXtydCh0LHIsbixlKX19KTooZS52YWx1ZT1uLGUuc3RhdGU9MSxKKHQsZSwhMSkpfWNhdGNoKG4pe3J0KHQse2RvbmU6ITF9LG4sZSl9fX07RyYmKE09ZnVuY3Rpb24odCl7bSh0aGlzLE0sTikseSh0KSxyLmNhbGwodGhpcyk7dmFyIGU9SSh0aGlzKTt0cnl7dChudChvdCx0aGlzLGUpLG50KHJ0LHRoaXMsZSkpfWNhdGNoKHQpe3J0KHRoaXMsZSx0KX19LChyPWZ1bmN0aW9uKHQpe18odGhpcyx7dHlwZTpOLGRvbmU6ITEsbm90aWZpZWQ6ITEscGFyZW50OiExLHJlYWN0aW9uczpbXSxyZWplY3Rpb246ITEsc3RhdGU6MCx2YWx1ZTp2b2lkIDB9KX0pLnByb3RvdHlwZT1oKE0ucHJvdG90eXBlLHt0aGVuOmZ1bmN0aW9uKHQsZSl7dmFyIG49RCh0aGlzKSxyPVcoayh0aGlzLE0pKTtyZXR1cm4gci5vaz0iZnVuY3Rpb24iIT10eXBlb2YgdHx8dCxyLmZhaWw9ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUsci5kb21haW49WT9xLmRvbWFpbjp2b2lkIDAsbi5wYXJlbnQ9ITAsbi5yZWFjdGlvbnMucHVzaChyKSwwIT1uLnN0YXRlJiZKKHRoaXMsbiwhMSksci5wcm9taXNlfSxjYXRjaDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aGVuKHZvaWQgMCx0KX19KSxvPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHIsZT1JKHQpO3RoaXMucHJvbWlzZT10LHRoaXMucmVzb2x2ZT1udChvdCx0LGUpLHRoaXMucmVqZWN0PW50KHJ0LHQsZSl9LE8uZj1XPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09TXx8dD09PWk/bmV3IG8odCk6JCh0KX0sdXx8ImZ1bmN0aW9uIiE9dHlwZW9mIGZ8fChhPWYucHJvdG90eXBlLnRoZW4scChmLnByb3RvdHlwZSwidGhlbiIsZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3JldHVybiBuZXcgTShmdW5jdGlvbih0LGUpe2EuY2FsbChuLHQsZSl9KS50aGVuKHQsZSl9KSwiZnVuY3Rpb24iPT10eXBlb2YgRiYmcyh7Z2xvYmFsOiEwLGVudW1lcmFibGU6ITAsZm9yY2VkOiEwfSx7ZmV0Y2g6ZnVuY3Rpb24odCl7cmV0dXJuIGooTSxGLmFwcGx5KGMsYXJndW1lbnRzKSl9fSkpKSxzKHtnbG9iYWw6ITAsd3JhcDohMCxmb3JjZWQ6R30se1Byb21pc2U6TX0pLGQoTSxOLCExLCEwKSxnKE4pLGk9bC5Qcm9taXNlLHMoe3RhcmdldDpOLHN0YXQ6ITAsZm9yY2VkOkd9LHtyZWplY3Q6ZnVuY3Rpb24odCl7dmFyIGU9Vyh0aGlzKTtyZXR1cm4gZS5yZWplY3QuY2FsbCh2b2lkIDAsdCksZS5wcm9taXNlfX0pLHMoe3RhcmdldDpOLHN0YXQ6ITAsZm9yY2VkOnV8fEd9LHtyZXNvbHZlOmZ1bmN0aW9uKHQpe3JldHVybiBqKHUmJnRoaXM9PT1pP006dGhpcyx0KX19KSxzKHt0YXJnZXQ6TixzdGF0OiEwLGZvcmNlZDpLfSx7YWxsOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1XKGUpLHI9bi5yZXNvbHZlLG89bi5yZWplY3QsaT1BKGZ1bmN0aW9uKCl7dmFyIG49eShlLnJlc29sdmUpLGk9W10sYT0wLHM9MTt4KHQsZnVuY3Rpb24odCl7dmFyIHU9YSsrLGM9ITE7aS5wdXNoKHZvaWQgMCkscysrLG4uY2FsbChlLHQpLnRoZW4oZnVuY3Rpb24odCl7Y3x8KGM9ITAsaVt1XT10LC0tc3x8cihpKSl9LG8pfSksLS1zfHxyKGkpfSk7cmV0dXJuIGkuZXJyb3ImJm8oaS52YWx1ZSksbi5wcm9taXNlfSxyYWNlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1XKGUpLHI9bi5yZWplY3Qsbz1BKGZ1bmN0aW9uKCl7dmFyIG89eShlLnJlc29sdmUpO3godCxmdW5jdGlvbih0KXtvLmNhbGwoZSx0KS50aGVuKG4ucmVzb2x2ZSxyKX0pfSk7cmV0dXJuIG8uZXJyb3ImJnIoby52YWx1ZSksbi5wcm9taXNlfX0pfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzMpLG89bigyMyksaT1uKDIpLGE9bigxMykscz1pKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXIodCksbj1vLmY7YSYmZSYmIWVbc10mJm4oZSxzLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGEscyx1LGMsbD1uKDUpLGY9big0NSkuZixwPW4oMjcpLGg9bigxMjEpLnNldCxkPW4oNzkpLGc9bC5NdXRhdGlvbk9ic2VydmVyfHxsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXIsdj1sLnByb2Nlc3MseT1sLlByb21pc2UsbT0icHJvY2VzcyI9PXAodiksYj1mKGwsInF1ZXVlTWljcm90YXNrIikseD1iJiZiLnZhbHVlO3h8fChyPWZ1bmN0aW9uKCl7dmFyIHQsZTtmb3IobSYmKHQ9di5kb21haW4pJiZ0LmV4aXQoKTtvOyl7ZT1vLmZuLG89by5uZXh0O3RyeXtlKCl9Y2F0Y2godCl7dGhyb3cgbz9hKCk6aT12b2lkIDAsdH19aT12b2lkIDAsdCYmdC5lbnRlcigpfSxtP2E9ZnVuY3Rpb24oKXt2Lm5leHRUaWNrKHIpfTpnJiYhLyhpcGhvbmV8aXBvZHxpcGFkKS4qYXBwbGV3ZWJraXQvaS50ZXN0KGQpPyhzPSEwLHU9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpLG5ldyBnKHIpLm9ic2VydmUodSx7Y2hhcmFjdGVyRGF0YTohMH0pLGE9ZnVuY3Rpb24oKXt1LmRhdGE9cz0hc30pOnkmJnkucmVzb2x2ZT8oYz15LnJlc29sdmUodm9pZCAwKSxhPWZ1bmN0aW9uKCl7Yy50aGVuKHIpfSk6YT1mdW5jdGlvbigpe2guY2FsbChsLHIpfSksdC5leHBvcnRzPXh8fGZ1bmN0aW9uKHQpe3ZhciBlPXtmbjp0LG5leHQ6dm9pZCAwfTtpJiYoaS5uZXh0PWUpLG98fChvPWUsYSgpKSxpPWV9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj1yLmNvbnNvbGU7biYmbi5lcnJvciYmKDE9PT1hcmd1bWVudHMubGVuZ3RoP24uZXJyb3IodCk6bi5lcnJvcih0LGUpKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oMjgpLGk9bigxMTcpLGE9bigzMykscz1uKDEyMCksdT1uKDEyMiksYz1uKDM2KTtyKHt0YXJnZXQ6IlByb21pc2UiLHByb3RvOiEwLHJlYWw6ITB9LHtmaW5hbGx5OmZ1bmN0aW9uKHQpe3ZhciBlPXModGhpcyxhKCJQcm9taXNlIikpLG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ7cmV0dXJuIHRoaXMudGhlbihuP2Z1bmN0aW9uKG4pe3JldHVybiB1KGUsdCgpKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIG59KX06dCxuP2Z1bmN0aW9uKG4pe3JldHVybiB1KGUsdCgpKS50aGVuKGZ1bmN0aW9uKCl7dGhyb3cgbn0pfTp0KX19KSxvfHwiZnVuY3Rpb24iIT10eXBlb2YgaXx8aS5wcm90b3R5cGUuZmluYWxseXx8YyhpLnByb3RvdHlwZSwiZmluYWxseSIsYSgiUHJvbWlzZSIpLnByb3RvdHlwZS5maW5hbGx5KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDQ5KSxpPW4oNzQpLGE9big0Nykscz1uKDMxKSx1PW4oNTkpLGM9bigxNyksbD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7aWYoIShuIGluc3RhbmNlb2YgbCkpcmV0dXJuIG5ldyBsKHQsZSk7aSYmKG49aShuZXcgRXJyb3IoZSksbyhuKSkpO3ZhciByPVtdO3JldHVybiB1KHQsci5wdXNoLHIpLGMobiwiZXJyb3JzIixyKSx2b2lkIDAhPT1lJiZjKG4sIm1lc3NhZ2UiLFN0cmluZyhlKSksbn07bC5wcm90b3R5cGU9YShFcnJvci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnMoNSxsKSxuYW1lOnMoNSwiQWdncmVnYXRlRXJyb3IiKX0pLHIoe2dsb2JhbDohMH0se0FnZ3JlZ2F0ZUVycm9yOmx9KX0sZnVuY3Rpb24odCxlLG4pe24oMTIzKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89big1MyksaT1uKDYwKTtyKHt0YXJnZXQ6IlByb21pc2UiLHN0YXQ6ITB9LHt0cnk6ZnVuY3Rpb24odCl7dmFyIGU9by5mKHRoaXMpLG49aSh0KTtyZXR1cm4obi5lcnJvcj9lLnJlamVjdDplLnJlc29sdmUpKG4udmFsdWUpLGUucHJvbWlzZX19KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89bigyMiksaT1uKDMzKSxhPW4oNTMpLHM9big2MCksdT1uKDU5KTtyKHt0YXJnZXQ6IlByb21pc2UiLHN0YXQ6ITB9LHthbnk6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWEuZihlKSxyPW4ucmVzb2x2ZSxjPW4ucmVqZWN0LGw9cyhmdW5jdGlvbigpe3ZhciBuPW8oZS5yZXNvbHZlKSxhPVtdLHM9MCxsPTEsZj0hMTt1KHQsZnVuY3Rpb24odCl7dmFyIG89cysrLHU9ITE7YS5wdXNoKHZvaWQgMCksbCsrLG4uY2FsbChlLHQpLnRoZW4oZnVuY3Rpb24odCl7dXx8Znx8KGY9ITAscih0KSl9LGZ1bmN0aW9uKHQpe3V8fGZ8fCh1PSEwLGFbb109dCwtLWx8fGMobmV3KGkoIkFnZ3JlZ2F0ZUVycm9yIikpKGEsIk5vIG9uZSBwcm9taXNlIHJlc29sdmVkIikpKX0pfSksLS1sfHxjKG5ldyhpKCJBZ2dyZWdhdGVFcnJvciIpKShhLCJObyBvbmUgcHJvbWlzZSByZXNvbHZlZCIpKX0pO3JldHVybiBsLmVycm9yJiZjKGwudmFsdWUpLG4ucHJvbWlzZX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDExNil9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fXJldHVybiBmdW5jdGlvbihlLG4scil7cmV0dXJuIG4mJnQoZS5wcm90b3R5cGUsbiksciYmdChlLHIpLGV9fSgpLG89ZnVuY3Rpb24odCl7aWYodCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBlPXt9O2lmKG51bGwhPXQpZm9yKHZhciBuIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJihlW25dPXRbbl0pO3JldHVybiBlLmRlZmF1bHQ9dCxlfShuKDI2NSkpLGk9cChuKDI2NikpLGE9cChuKDI2NykpLHM9cChuKDI2OCkpLHU9cChuKDI2OSkpLGM9cChuKDI3MCkpLGw9cChuKDI3MSkpLGY9cChuKDI3MikpO2Z1bmN0aW9uIHAodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fXZhciBoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307IWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsdCksdGhpcy50eXBlPSJsYW5ndWFnZURldGVjdG9yIix0aGlzLmRldGVjdG9ycz17fSx0aGlzLmluaXQoZSxuKX1yZXR1cm4gcih0LFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e30sbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e307dGhpcy5zZXJ2aWNlcz10LHRoaXMub3B0aW9ucz1vLmRlZmF1bHRzKGUsdGhpcy5vcHRpb25zfHx7fSx7b3JkZXI6WyJxdWVyeXN0cmluZyIsImNvb2tpZSIsImxvY2FsU3RvcmFnZSIsIm5hdmlnYXRvciIsImh0bWxUYWciXSxsb29rdXBRdWVyeXN0cmluZzoibG5nIixsb29rdXBDb29raWU6ImkxOG5leHQiLGxvb2t1cExvY2FsU3RvcmFnZToiaTE4bmV4dExuZyIsY2FjaGVzOlsibG9jYWxTdG9yYWdlIl0sZXhjbHVkZUNhY2hlRm9yOlsiY2ltb2RlIl19KSx0aGlzLm9wdGlvbnMubG9va3VwRnJvbVVybEluZGV4JiYodGhpcy5vcHRpb25zLmxvb2t1cEZyb21QYXRoSW5kZXg9dGhpcy5vcHRpb25zLmxvb2t1cEZyb21VcmxJbmRleCksdGhpcy5pMThuT3B0aW9ucz1uLHRoaXMuYWRkRGV0ZWN0b3IoaS5kZWZhdWx0KSx0aGlzLmFkZERldGVjdG9yKGEuZGVmYXVsdCksdGhpcy5hZGREZXRlY3RvcihzLmRlZmF1bHQpLHRoaXMuYWRkRGV0ZWN0b3IodS5kZWZhdWx0KSx0aGlzLmFkZERldGVjdG9yKGMuZGVmYXVsdCksdGhpcy5hZGREZXRlY3RvcihsLmRlZmF1bHQpLHRoaXMuYWRkRGV0ZWN0b3IoZi5kZWZhdWx0KX19LHtrZXk6ImFkZERldGVjdG9yIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmRldGVjdG9yc1t0Lm5hbWVdPXR9fSx7a2V5OiJkZXRlY3QiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dHx8KHQ9dGhpcy5vcHRpb25zLm9yZGVyKTt2YXIgbj1bXTt0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoZS5kZXRlY3RvcnNbdF0pe3ZhciByPWUuZGV0ZWN0b3JzW3RdLmxvb2t1cChlLm9wdGlvbnMpO3ImJiJzdHJpbmciPT10eXBlb2YgciYmKHI9W3JdKSxyJiYobj1uLmNvbmNhdChyKSl9fSk7dmFyIHI9dm9pZCAwO2lmKG4uZm9yRWFjaChmdW5jdGlvbih0KXtpZighcil7dmFyIG49ZS5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmZvcm1hdExhbmd1YWdlQ29kZSh0KTtlLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuaXNXaGl0ZWxpc3RlZChuKSYmKHI9bil9fSksIXIpe3ZhciBvPXRoaXMuaTE4bk9wdGlvbnMuZmFsbGJhY2tMbmc7InN0cmluZyI9PXR5cGVvZiBvJiYobz1bb10pLG98fChvPVtdKSxyPSJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KG8pP29bMF06b1swXXx8by5kZWZhdWx0JiZvLmRlZmF1bHRbMF19cmV0dXJuIHJ9fSx7a2V5OiJjYWNoZVVzZXJMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2V8fChlPXRoaXMub3B0aW9ucy5jYWNoZXMpLGUmJih0aGlzLm9wdGlvbnMuZXhjbHVkZUNhY2hlRm9yJiZ0aGlzLm9wdGlvbnMuZXhjbHVkZUNhY2hlRm9yLmluZGV4T2YodCk+LTF8fGUuZm9yRWFjaChmdW5jdGlvbihlKXtuLmRldGVjdG9yc1tlXSYmbi5kZXRlY3RvcnNbZV0uY2FjaGVVc2VyTGFuZ3VhZ2UodCxuLm9wdGlvbnMpfSkpfX1dKSx0fSgpO2gudHlwZT0ibGFuZ3VhZ2VEZXRlY3RvciIsZS5kZWZhdWx0PWh9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdHM9ZnVuY3Rpb24odCl7cmV0dXJuIG8uY2FsbChpLmNhbGwoYXJndW1lbnRzLDEpLGZ1bmN0aW9uKGUpe2lmKGUpZm9yKHZhciBuIGluIGUpdm9pZCAwPT09dFtuXSYmKHRbbl09ZVtuXSl9KSx0fSxlLmV4dGVuZD1mdW5jdGlvbih0KXtyZXR1cm4gby5jYWxsKGkuY2FsbChhcmd1bWVudHMsMSksZnVuY3Rpb24oZSl7aWYoZSlmb3IodmFyIG4gaW4gZSl0W25dPWVbbl19KSx0fTt2YXIgcj1bXSxvPXIuZm9yRWFjaCxpPXIuc2xpY2V9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPXZvaWQgMDtpZihuKXt2YXIgaT1uZXcgRGF0ZTtpLnNldFRpbWUoaS5nZXRUaW1lKCkrNjAqbioxZTMpLG89IjsgZXhwaXJlcz0iK2kudG9HTVRTdHJpbmcoKX1lbHNlIG89IiI7cj1yPyJkb21haW49IityKyI7IjoiIixkb2N1bWVudC5jb29raWU9dCsiPSIrZStvKyI7IityKyJwYXRoPS8ifSxvPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10KyI9IixuPWRvY3VtZW50LmNvb2tpZS5zcGxpdCgiOyIpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7Zm9yKHZhciBvPW5bcl07IiAiPT09by5jaGFyQXQoMCk7KW89by5zdWJzdHJpbmcoMSxvLmxlbmd0aCk7aWYoMD09PW8uaW5kZXhPZihlKSlyZXR1cm4gby5zdWJzdHJpbmcoZS5sZW5ndGgsby5sZW5ndGgpfXJldHVybiBudWxsfTtlLmRlZmF1bHQ9e25hbWU6ImNvb2tpZSIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMDtpZih0Lmxvb2t1cENvb2tpZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCl7dmFyIG49byh0Lmxvb2t1cENvb2tpZSk7biYmKGU9bil9cmV0dXJuIGV9LGNhY2hlVXNlckxhbmd1YWdlOmZ1bmN0aW9uKHQsZSl7ZS5sb29rdXBDb29raWUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJnIoZS5sb29rdXBDb29raWUsdCxlLmNvb2tpZU1pbnV0ZXMsZS5jb29raWVEb21haW4pfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD17bmFtZToicXVlcnlzdHJpbmciLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDA7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cpZm9yKHZhciBuPXdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKDEpLnNwbGl0KCImIikscj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgbz1uW3JdLmluZGV4T2YoIj0iKTtpZihvPjApbltyXS5zdWJzdHJpbmcoMCxvKT09PXQubG9va3VwUXVlcnlzdHJpbmcmJihlPW5bcl0uc3Vic3RyaW5nKG8rMSkpfXJldHVybiBlfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPXZvaWQgMDt0cnl7cj0idW5kZWZpbmVkIiE9PXdpbmRvdyYmbnVsbCE9PXdpbmRvdy5sb2NhbFN0b3JhZ2U7d2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKCJpMThuZXh0LnRyYW5zbGF0ZS5ib28iLCJmb28iKSx3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oImkxOG5leHQudHJhbnNsYXRlLmJvbyIpfWNhdGNoKHQpe3I9ITF9ZS5kZWZhdWx0PXtuYW1lOiJsb2NhbFN0b3JhZ2UiLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDA7aWYodC5sb29rdXBMb2NhbFN0b3JhZ2UmJnIpe3ZhciBuPXdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0Lmxvb2t1cExvY2FsU3RvcmFnZSk7biYmKGU9bil9cmV0dXJuIGV9LGNhY2hlVXNlckxhbmd1YWdlOmZ1bmN0aW9uKHQsZSl7ZS5sb29rdXBMb2NhbFN0b3JhZ2UmJnImJndpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShlLmxvb2t1cExvY2FsU3RvcmFnZSx0KX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHQ9e25hbWU6Im5hdmlnYXRvciIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPVtdO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yKXtpZihuYXZpZ2F0b3IubGFuZ3VhZ2VzKWZvcih2YXIgbj0wO248bmF2aWdhdG9yLmxhbmd1YWdlcy5sZW5ndGg7bisrKWUucHVzaChuYXZpZ2F0b3IubGFuZ3VhZ2VzW25dKTtuYXZpZ2F0b3IudXNlckxhbmd1YWdlJiZlLnB1c2gobmF2aWdhdG9yLnVzZXJMYW5ndWFnZSksbmF2aWdhdG9yLmxhbmd1YWdlJiZlLnB1c2gobmF2aWdhdG9yLmxhbmd1YWdlKX1yZXR1cm4gZS5sZW5ndGg+MD9lOnZvaWQgMH19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHQ9e25hbWU6Imh0bWxUYWciLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDAsbj10Lmh0bWxUYWd8fCgidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50P2RvY3VtZW50LmRvY3VtZW50RWxlbWVudDpudWxsKTtyZXR1cm4gbiYmImZ1bmN0aW9uIj09dHlwZW9mIG4uZ2V0QXR0cmlidXRlJiYoZT1uLmdldEF0dHJpYnV0ZSgibGFuZyIpKSxlfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD17bmFtZToicGF0aCIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyl7dmFyIG49d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLm1hdGNoKC9cLyhbYS16QS1aLV0qKS9nKTtpZihuIGluc3RhbmNlb2YgQXJyYXkpaWYoIm51bWJlciI9PXR5cGVvZiB0Lmxvb2t1cEZyb21QYXRoSW5kZXgpe2lmKCJzdHJpbmciIT10eXBlb2Ygblt0Lmxvb2t1cEZyb21QYXRoSW5kZXhdKXJldHVybjtlPW5bdC5sb29rdXBGcm9tUGF0aEluZGV4XS5yZXBsYWNlKCIvIiwiIil9ZWxzZSBlPW5bMF0ucmVwbGFjZSgiLyIsIiIpfXJldHVybiBlfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD17bmFtZToic3ViZG9tYWluIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93KXt2YXIgbj13aW5kb3cubG9jYXRpb24uaHJlZi5tYXRjaCgvKD86aHR0cFtzXSpcOlwvXC8pKiguKj8pXC4oPz1bXlwvXSpcLi57Miw1fSkvZ2kpO24gaW5zdGFuY2VvZiBBcnJheSYmKGU9Im51bWJlciI9PXR5cGVvZiB0Lmxvb2t1cEZyb21TdWJkb21haW5JbmRleD9uW3QubG9va3VwRnJvbVN1YmRvbWFpbkluZGV4XS5yZXBsYWNlKCJodHRwOi8vIiwiIikucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKS5yZXBsYWNlKCIuIiwiIik6blswXS5yZXBsYWNlKCJodHRwOi8vIiwiIikucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKS5yZXBsYWNlKCIuIiwiIikpfXJldHVybiBlfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI3NCksbz1uKDEyNCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHIodCkpcmV0dXJuIG8odCl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjc1KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDEwOSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEyNSksbz1uKDI3OCksaT1uKDEwMyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PWkmJm8oT2JqZWN0KHQpKSlyZXR1cm4gcih0KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMTApfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjc5KX0sZnVuY3Rpb24odCxlLG4pe24oNTEpLG4oMzUpLHQuZXhwb3J0cz1uKDI4MCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDc2KSxvPW4oMiksaT1uKDMwKSxhPW8oIml0ZXJhdG9yIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPU9iamVjdCh0KTtyZXR1cm4gdm9pZCAwIT09ZVthXXx8IkBAaXRlcmF0b3IiaW4gZXx8aS5oYXNPd25Qcm9wZXJ0eShyKGUpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEyNSksbz1uKDI4MiksaT1uKDEyNCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG47aWYodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBpKHQsZSk7dmFyIGE9byhuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSkuY2FsbChuLDgsLTEpO3JldHVybiJPYmplY3QiPT09YSYmdC5jb25zdHJ1Y3RvciYmKGE9dC5jb25zdHJ1Y3Rvci5uYW1lKSwiTWFwIj09PWF8fCJTZXQiPT09YT9yKHQpOiJBcmd1bWVudHMiPT09YXx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QoYSk/aSh0LGUpOnZvaWQgMH19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjgzKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDExNCl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjg2KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjg3KSxvPW4oMjg5KSxpPUFycmF5LnByb3RvdHlwZSxhPVN0cmluZy5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5jbHVkZXM7cmV0dXJuIHQ9PT1pfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1pLmluY2x1ZGVzP3I6InN0cmluZyI9PXR5cGVvZiB0fHx0PT09YXx8dCBpbnN0YW5jZW9mIFN0cmluZyYmZT09PWEuaW5jbHVkZXM/bzplfX0sZnVuY3Rpb24odCxlLG4pe24oMjg4KTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5pbmNsdWRlc30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89big2NykuaW5jbHVkZXMsaT1uKDc3KTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMH0se2luY2x1ZGVzOmZ1bmN0aW9uKHQpe3JldHVybiBvKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSksaSgiaW5jbHVkZXMiKX0sZnVuY3Rpb24odCxlLG4pe24oMjkwKTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiU3RyaW5nIikuaW5jbHVkZXN9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oMjkxKSxpPW4oNDYpO3Ioe3RhcmdldDoiU3RyaW5nIixwcm90bzohMCxmb3JjZWQ6IW4oMjkzKSgiaW5jbHVkZXMiKX0se2luY2x1ZGVzOmZ1bmN0aW9uKHQpe3JldHVybiEhflN0cmluZyhpKHRoaXMpKS5pbmRleE9mKG8odCksYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyOTIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihyKHQpKXRocm93IFR5cGVFcnJvcigiVGhlIG1ldGhvZCBkb2Vzbid0IGFjY2VwdCByZWd1bGFyIGV4cHJlc3Npb25zIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3KSxvPW4oMjcpLGk9bigyKSgibWF0Y2giKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIHIodCkmJih2b2lkIDAhPT0oZT10W2ldKT8hIWU6IlJlZ0V4cCI9PW8odCkpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMikoIm1hdGNoIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPS8uLzt0cnl7Ii8uLyJbdF0oZSl9Y2F0Y2gobil7dHJ5e3JldHVybiBlW3JdPSExLCIvLi8iW3RdKGUpfWNhdGNoKHQpe319cmV0dXJuITF9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiOyhmdW5jdGlvbih0KXsKLyohCiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLgogKgogKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz4KICogQGxpY2Vuc2UgIE1JVAogKi8KdmFyIHI9bigyOTUpLG89bigyOTYpLGk9bigyOTcpO2Z1bmN0aW9uIGEoKXtyZXR1cm4gdS5UWVBFRF9BUlJBWV9TVVBQT1JUPzIxNDc0ODM2NDc6MTA3Mzc0MTgyM31mdW5jdGlvbiBzKHQsZSl7aWYoYSgpPGUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoIik7cmV0dXJuIHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odD1uZXcgVWludDhBcnJheShlKSkuX19wcm90b19fPXUucHJvdG90eXBlOihudWxsPT09dCYmKHQ9bmV3IHUoZSkpLHQubGVuZ3RoPWUpLHR9ZnVuY3Rpb24gdSh0LGUsbil7aWYoISh1LlRZUEVEX0FSUkFZX1NVUFBPUlR8fHRoaXMgaW5zdGFuY2VvZiB1KSlyZXR1cm4gbmV3IHUodCxlLG4pO2lmKCJudW1iZXIiPT10eXBlb2YgdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmciKTtyZXR1cm4gZih0aGlzLHQpfXJldHVybiBjKHRoaXMsdCxlLG4pfWZ1bmN0aW9uIGModCxlLG4scil7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ZnVuY3Rpb24odCxlLG4scil7aWYoZS5ieXRlTGVuZ3RoLG48MHx8ZS5ieXRlTGVuZ3RoPG4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHMiKTtpZihlLmJ5dGVMZW5ndGg8bisocnx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHMiKTtlPXZvaWQgMD09PW4mJnZvaWQgMD09PXI/bmV3IFVpbnQ4QXJyYXkoZSk6dm9pZCAwPT09cj9uZXcgVWludDhBcnJheShlLG4pOm5ldyBVaW50OEFycmF5KGUsbixyKTt1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9ZSkuX19wcm90b19fPXUucHJvdG90eXBlOnQ9cCh0LGUpO3JldHVybiB0fSh0LGUsbixyKToic3RyaW5nIj09dHlwZW9mIGU/ZnVuY3Rpb24odCxlLG4peyJzdHJpbmciPT10eXBlb2YgbiYmIiIhPT1ufHwobj0idXRmOCIpO2lmKCF1LmlzRW5jb2RpbmcobikpdGhyb3cgbmV3IFR5cGVFcnJvcignImVuY29kaW5nIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJyk7dmFyIHI9MHxkKGUsbiksbz0odD1zKHQscikpLndyaXRlKGUsbik7byE9PXImJih0PXQuc2xpY2UoMCxvKSk7cmV0dXJuIHR9KHQsZSxuKTpmdW5jdGlvbih0LGUpe2lmKHUuaXNCdWZmZXIoZSkpe3ZhciBuPTB8aChlLmxlbmd0aCk7cmV0dXJuIDA9PT0odD1zKHQsbikpLmxlbmd0aD90OihlLmNvcHkodCwwLDAsbiksdCl9aWYoZSl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8Imxlbmd0aCJpbiBlKXJldHVybiJudW1iZXIiIT10eXBlb2YgZS5sZW5ndGh8fChyPWUubGVuZ3RoKSE9cj9zKHQsMCk6cCh0LGUpO2lmKCJCdWZmZXIiPT09ZS50eXBlJiZpKGUuZGF0YSkpcmV0dXJuIHAodCxlLmRhdGEpfXZhciByO3Rocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4iKX0odCxlKX1mdW5jdGlvbiBsKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9ZnVuY3Rpb24gZih0LGUpe2lmKGwoZSksdD1zKHQsZTwwPzA6MHxoKGUpKSwhdS5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcih2YXIgbj0wO248ZTsrK24pdFtuXT0wO3JldHVybiB0fWZ1bmN0aW9uIHAodCxlKXt2YXIgbj1lLmxlbmd0aDwwPzA6MHxoKGUubGVuZ3RoKTt0PXModCxuKTtmb3IodmFyIHI9MDtyPG47cis9MSl0W3JdPTI1NSZlW3JdO3JldHVybiB0fWZ1bmN0aW9uIGgodCl7aWYodD49YSgpKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4IithKCkudG9TdHJpbmcoMTYpKyIgYnl0ZXMiKTtyZXR1cm4gMHx0fWZ1bmN0aW9uIGQodCxlKXtpZih1LmlzQnVmZmVyKHQpKXJldHVybiB0Lmxlbmd0aDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3KHQpfHx0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXJldHVybiB0LmJ5dGVMZW5ndGg7InN0cmluZyIhPXR5cGVvZiB0JiYodD0iIit0KTt2YXIgbj10Lmxlbmd0aDtpZigwPT09bilyZXR1cm4gMDtmb3IodmFyIHI9ITE7Oylzd2l0Y2goZSl7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gbjtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2Ugdm9pZCAwOnJldHVybiBGKHQpLmxlbmd0aDtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIDIqbjtjYXNlImhleCI6cmV0dXJuIG4+Pj4xO2Nhc2UiYmFzZTY0IjpyZXR1cm4gSCh0KS5sZW5ndGg7ZGVmYXVsdDppZihyKXJldHVybiBGKHQpLmxlbmd0aDtlPSgiIitlKS50b0xvd2VyQ2FzZSgpLHI9ITB9fWZ1bmN0aW9uIGcodCxlLG4pe3ZhciByPSExO2lmKCh2b2lkIDA9PT1lfHxlPDApJiYoZT0wKSxlPnRoaXMubGVuZ3RoKXJldHVybiIiO2lmKCh2b2lkIDA9PT1ufHxuPnRoaXMubGVuZ3RoKSYmKG49dGhpcy5sZW5ndGgpLG48PTApcmV0dXJuIiI7aWYoKG4+Pj49MCk8PShlPj4+PTApKXJldHVybiIiO2Zvcih0fHwodD0idXRmOCIpOzspc3dpdGNoKHQpe2Nhc2UiaGV4IjpyZXR1cm4gTCh0aGlzLGUsbik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gVCh0aGlzLGUsbik7Y2FzZSJhc2NpaSI6cmV0dXJuIEEodGhpcyxlLG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIEModGhpcyxlLG4pO2Nhc2UiYmFzZTY0IjpyZXR1cm4gaih0aGlzLGUsbik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBSKHRoaXMsZSxuKTtkZWZhdWx0OmlmKHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTt0PSh0KyIiKS50b0xvd2VyQ2FzZSgpLHI9ITB9fWZ1bmN0aW9uIHYodCxlLG4pe3ZhciByPXRbZV07dFtlXT10W25dLHRbbl09cn1mdW5jdGlvbiB5KHQsZSxuLHIsbyl7aWYoMD09PXQubGVuZ3RoKXJldHVybi0xO2lmKCJzdHJpbmciPT10eXBlb2Ygbj8ocj1uLG49MCk6bj4yMTQ3NDgzNjQ3P249MjE0NzQ4MzY0NzpuPC0yMTQ3NDgzNjQ4JiYobj0tMjE0NzQ4MzY0OCksbj0rbixpc05hTihuKSYmKG49bz8wOnQubGVuZ3RoLTEpLG48MCYmKG49dC5sZW5ndGgrbiksbj49dC5sZW5ndGgpe2lmKG8pcmV0dXJuLTE7bj10Lmxlbmd0aC0xfWVsc2UgaWYobjwwKXtpZighbylyZXR1cm4tMTtuPTB9aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT11LmZyb20oZSxyKSksdS5pc0J1ZmZlcihlKSlyZXR1cm4gMD09PWUubGVuZ3RoPy0xOm0odCxlLG4scixvKTtpZigibnVtYmVyIj09dHlwZW9mIGUpcmV0dXJuIGUmPTI1NSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQmJiJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mP28/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHQsZSxuKTpVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKHQsZSxuKTptKHQsW2VdLG4scixvKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKX1mdW5jdGlvbiBtKHQsZSxuLHIsbyl7dmFyIGksYT0xLHM9dC5sZW5ndGgsdT1lLmxlbmd0aDtpZih2b2lkIDAhPT1yJiYoInVjczIiPT09KHI9U3RyaW5nKHIpLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09cnx8InV0ZjE2bGUiPT09cnx8InV0Zi0xNmxlIj09PXIpKXtpZih0Lmxlbmd0aDwyfHxlLmxlbmd0aDwyKXJldHVybi0xO2E9MixzLz0yLHUvPTIsbi89Mn1mdW5jdGlvbiBjKHQsZSl7cmV0dXJuIDE9PT1hP3RbZV06dC5yZWFkVUludDE2QkUoZSphKX1pZihvKXt2YXIgbD0tMTtmb3IoaT1uO2k8cztpKyspaWYoYyh0LGkpPT09YyhlLC0xPT09bD8wOmktbCkpe2lmKC0xPT09bCYmKGw9aSksaS1sKzE9PT11KXJldHVybiBsKmF9ZWxzZS0xIT09bCYmKGktPWktbCksbD0tMX1lbHNlIGZvcihuK3U+cyYmKG49cy11KSxpPW47aT49MDtpLS0pe2Zvcih2YXIgZj0hMCxwPTA7cDx1O3ArKylpZihjKHQsaStwKSE9PWMoZSxwKSl7Zj0hMTticmVha31pZihmKXJldHVybiBpfXJldHVybi0xfWZ1bmN0aW9uIGIodCxlLG4scil7bj1OdW1iZXIobil8fDA7dmFyIG89dC5sZW5ndGgtbjtyPyhyPU51bWJlcihyKSk+byYmKHI9byk6cj1vO3ZhciBpPWUubGVuZ3RoO2lmKGklMiE9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtyPmkvMiYmKHI9aS8yKTtmb3IodmFyIGE9MDthPHI7KythKXt2YXIgcz1wYXJzZUludChlLnN1YnN0cigyKmEsMiksMTYpO2lmKGlzTmFOKHMpKXJldHVybiBhO3RbbithXT1zfXJldHVybiBhfWZ1bmN0aW9uIHgodCxlLG4scil7cmV0dXJuIHooRihlLHQubGVuZ3RoLW4pLHQsbixyKX1mdW5jdGlvbiB3KHQsZSxuLHIpe3JldHVybiB6KGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDsrK24pZS5wdXNoKDI1NSZ0LmNoYXJDb2RlQXQobikpO3JldHVybiBlfShlKSx0LG4scil9ZnVuY3Rpb24gayh0LGUsbixyKXtyZXR1cm4gdyh0LGUsbixyKX1mdW5jdGlvbiBTKHQsZSxuLHIpe3JldHVybiB6KEgoZSksdCxuLHIpfWZ1bmN0aW9uIEUodCxlLG4scil7cmV0dXJuIHooZnVuY3Rpb24odCxlKXtmb3IodmFyIG4scixvLGk9W10sYT0wO2E8dC5sZW5ndGgmJiEoKGUtPTIpPDApOysrYSluPXQuY2hhckNvZGVBdChhKSxyPW4+Pjgsbz1uJTI1NixpLnB1c2gobyksaS5wdXNoKHIpO3JldHVybiBpfShlLHQubGVuZ3RoLW4pLHQsbixyKX1mdW5jdGlvbiBqKHQsZSxuKXtyZXR1cm4gMD09PWUmJm49PT10Lmxlbmd0aD9yLmZyb21CeXRlQXJyYXkodCk6ci5mcm9tQnl0ZUFycmF5KHQuc2xpY2UoZSxuKSl9ZnVuY3Rpb24gVCh0LGUsbil7bj1NYXRoLm1pbih0Lmxlbmd0aCxuKTtmb3IodmFyIHI9W10sbz1lO288bjspe3ZhciBpLGEscyx1LGM9dFtvXSxsPW51bGwsZj1jPjIzOT80OmM+MjIzPzM6Yz4xOTE/MjoxO2lmKG8rZjw9bilzd2l0Y2goZil7Y2FzZSAxOmM8MTI4JiYobD1jKTticmVhaztjYXNlIDI6MTI4PT0oMTkyJihpPXRbbysxXSkpJiYodT0oMzEmYyk8PDZ8NjMmaSk+MTI3JiYobD11KTticmVhaztjYXNlIDM6aT10W28rMV0sYT10W28rMl0sMTI4PT0oMTkyJmkpJiYxMjg9PSgxOTImYSkmJih1PSgxNSZjKTw8MTJ8KDYzJmkpPDw2fDYzJmEpPjIwNDcmJih1PDU1Mjk2fHx1PjU3MzQzKSYmKGw9dSk7YnJlYWs7Y2FzZSA0Omk9dFtvKzFdLGE9dFtvKzJdLHM9dFtvKzNdLDEyOD09KDE5MiZpKSYmMTI4PT0oMTkyJmEpJiYxMjg9PSgxOTImcykmJih1PSgxNSZjKTw8MTh8KDYzJmkpPDwxMnwoNjMmYSk8PDZ8NjMmcyk+NjU1MzUmJnU8MTExNDExMiYmKGw9dSl9bnVsbD09PWw/KGw9NjU1MzMsZj0xKTpsPjY1NTM1JiYobC09NjU1MzYsci5wdXNoKGw+Pj4xMCYxMDIzfDU1Mjk2KSxsPTU2MzIwfDEwMjMmbCksci5wdXNoKGwpLG8rPWZ9cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8PU8pcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQpO3ZhciBuPSIiLHI9MDtmb3IoO3I8ZTspbis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdC5zbGljZShyLHIrPU8pKTtyZXR1cm4gbn0ocil9ZS5CdWZmZXI9dSxlLlNsb3dCdWZmZXI9ZnVuY3Rpb24odCl7K3QhPXQmJih0PTApO3JldHVybiB1LmFsbG9jKCt0KX0sZS5JTlNQRUNUX01BWF9CWVRFUz01MCx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwIT09dC5UWVBFRF9BUlJBWV9TVVBQT1JUP3QuVFlQRURfQVJSQVlfU1VQUE9SVDpmdW5jdGlvbigpe3RyeXt2YXIgdD1uZXcgVWludDhBcnJheSgxKTtyZXR1cm4gdC5fX3Byb3RvX189e19fcHJvdG9fXzpVaW50OEFycmF5LnByb3RvdHlwZSxmb286ZnVuY3Rpb24oKXtyZXR1cm4gNDJ9fSw0Mj09PXQuZm9vKCkmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnN1YmFycmF5JiYwPT09dC5zdWJhcnJheSgxLDEpLmJ5dGVMZW5ndGh9Y2F0Y2godCl7cmV0dXJuITF9fSgpLGUua01heExlbmd0aD1hKCksdS5wb29sU2l6ZT04MTkyLHUuX2F1Z21lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19fPXUucHJvdG90eXBlLHR9LHUuZnJvbT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGMobnVsbCx0LGUsbil9LHUuVFlQRURfQVJSQVlfU1VQUE9SVCYmKHUucHJvdG90eXBlLl9fcHJvdG9fXz1VaW50OEFycmF5LnByb3RvdHlwZSx1Ll9fcHJvdG9fXz1VaW50OEFycmF5LCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuc3BlY2llcyYmdVtTeW1ib2wuc3BlY2llc109PT11JiZPYmplY3QuZGVmaW5lUHJvcGVydHkodSxTeW1ib2wuc3BlY2llcyx7dmFsdWU6bnVsbCxjb25maWd1cmFibGU6ITB9KSksdS5hbGxvYz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBsKGUpLGU8PTA/cyh0LGUpOnZvaWQgMCE9PW4/InN0cmluZyI9PXR5cGVvZiByP3ModCxlKS5maWxsKG4scik6cyh0LGUpLmZpbGwobik6cyh0LGUpfShudWxsLHQsZSxuKX0sdS5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtyZXR1cm4gZihudWxsLHQpfSx1LmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbih0KXtyZXR1cm4gZihudWxsLHQpfSx1LmlzQnVmZmVyPWZ1bmN0aW9uKHQpe3JldHVybiEobnVsbD09dHx8IXQuX2lzQnVmZmVyKX0sdS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7aWYoIXUuaXNCdWZmZXIodCl8fCF1LmlzQnVmZmVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMiKTtpZih0PT09ZSlyZXR1cm4gMDtmb3IodmFyIG49dC5sZW5ndGgscj1lLmxlbmd0aCxvPTAsaT1NYXRoLm1pbihuLHIpO288aTsrK28paWYodFtvXSE9PWVbb10pe249dFtvXSxyPWVbb107YnJlYWt9cmV0dXJuIG48cj8tMTpyPG4/MTowfSx1LmlzRW5jb2Rpbmc9ZnVuY3Rpb24odCl7c3dpdGNoKFN0cmluZyh0KS50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LHUuY29uY2F0PWZ1bmN0aW9uKHQsZSl7aWYoIWkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gdS5hbGxvYygwKTt2YXIgbjtpZih2b2lkIDA9PT1lKWZvcihlPTAsbj0wO248dC5sZW5ndGg7KytuKWUrPXRbbl0ubGVuZ3RoO3ZhciByPXUuYWxsb2NVbnNhZmUoZSksbz0wO2ZvcihuPTA7bjx0Lmxlbmd0aDsrK24pe3ZhciBhPXRbbl07aWYoIXUuaXNCdWZmZXIoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2EuY29weShyLG8pLG8rPWEubGVuZ3RofXJldHVybiByfSx1LmJ5dGVMZW5ndGg9ZCx1LnByb3RvdHlwZS5faXNCdWZmZXI9ITAsdS5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCUyIT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz0yKXYodGhpcyxlLGUrMSk7cmV0dXJuIHRoaXN9LHUucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9NCl2KHRoaXMsZSxlKzMpLHYodGhpcyxlKzEsZSsyKTtyZXR1cm4gdGhpc30sdS5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCU4IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz04KXYodGhpcyxlLGUrNyksdih0aGlzLGUrMSxlKzYpLHYodGhpcyxlKzIsZSs1KSx2KHRoaXMsZSszLGUrNCk7cmV0dXJuIHRoaXN9LHUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PXQ/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/VCh0aGlzLDAsdCk6Zy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHUucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtpZighdS5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7cmV0dXJuIHRoaXM9PT10fHwwPT09dS5jb21wYXJlKHRoaXMsdCl9LHUucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgdD0iIixuPWUuSU5TUEVDVF9NQVhfQllURVM7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJih0PXRoaXMudG9TdHJpbmcoImhleCIsMCxuKS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+biYmKHQrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK3QrIj4ifSx1LnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSxuLHIsbyl7aWYoIXUuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PW4mJihuPXQ/dC5sZW5ndGg6MCksdm9pZCAwPT09ciYmKHI9MCksdm9pZCAwPT09byYmKG89dGhpcy5sZW5ndGgpLGU8MHx8bj50Lmxlbmd0aHx8cjwwfHxvPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPj1vJiZlPj1uKXJldHVybiAwO2lmKHI+PW8pcmV0dXJuLTE7aWYoZT49bilyZXR1cm4gMTtpZih0aGlzPT09dClyZXR1cm4gMDtmb3IodmFyIGk9KG8+Pj49MCktKHI+Pj49MCksYT0obj4+Pj0wKS0oZT4+Pj0wKSxzPU1hdGgubWluKGksYSksYz10aGlzLnNsaWNlKHIsbyksbD10LnNsaWNlKGUsbiksZj0wO2Y8czsrK2YpaWYoY1tmXSE9PWxbZl0pe2k9Y1tmXSxhPWxbZl07YnJlYWt9cmV0dXJuIGk8YT8tMTphPGk/MTowfSx1LnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbih0LGUsbil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YodCxlLG4pfSx1LnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geSh0aGlzLHQsZSxuLCEwKX0sdS5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5KHRoaXMsdCxlLG4sITEpfSx1LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LGUsbixyKXtpZih2b2lkIDA9PT1lKXI9InV0ZjgiLG49dGhpcy5sZW5ndGgsZT0wO2Vsc2UgaWYodm9pZCAwPT09biYmInN0cmluZyI9PXR5cGVvZiBlKXI9ZSxuPXRoaXMubGVuZ3RoLGU9MDtlbHNle2lmKCFpc0Zpbml0ZShlKSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7ZXw9MCxpc0Zpbml0ZShuKT8obnw9MCx2b2lkIDA9PT1yJiYocj0idXRmOCIpKToocj1uLG49dm9pZCAwKX12YXIgbz10aGlzLmxlbmd0aC1lO2lmKCh2b2lkIDA9PT1ufHxuPm8pJiYobj1vKSx0Lmxlbmd0aD4wJiYobjwwfHxlPDApfHxlPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO3J8fChyPSJ1dGY4Iik7Zm9yKHZhciBpPSExOzspc3dpdGNoKHIpe2Nhc2UiaGV4IjpyZXR1cm4gYih0aGlzLHQsZSxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiB4KHRoaXMsdCxlLG4pO2Nhc2UiYXNjaWkiOnJldHVybiB3KHRoaXMsdCxlLG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIGsodGhpcyx0LGUsbik7Y2FzZSJiYXNlNjQiOnJldHVybiBTKHRoaXMsdCxlLG4pO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gRSh0aGlzLHQsZSxuKTtkZWZhdWx0OmlmKGkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKTtyPSgiIityKS50b0xvd2VyQ2FzZSgpLGk9ITB9fSx1LnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O3ZhciBPPTQwOTY7ZnVuY3Rpb24gQSh0LGUsbil7dmFyIHI9IiI7bj1NYXRoLm1pbih0Lmxlbmd0aCxuKTtmb3IodmFyIG89ZTtvPG47KytvKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JnRbb10pO3JldHVybiByfWZ1bmN0aW9uIEModCxlLG4pe3ZhciByPSIiO249TWF0aC5taW4odC5sZW5ndGgsbik7Zm9yKHZhciBvPWU7bzxuOysrbylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRbb10pO3JldHVybiByfWZ1bmN0aW9uIEwodCxlLG4pe3ZhciByPXQubGVuZ3RoOyghZXx8ZTwwKSYmKGU9MCksKCFufHxuPDB8fG4+cikmJihuPXIpO2Zvcih2YXIgbz0iIixpPWU7aTxuOysraSlvKz1xKHRbaV0pO3JldHVybiBvfWZ1bmN0aW9uIFIodCxlLG4pe2Zvcih2YXIgcj10LnNsaWNlKGUsbiksbz0iIixpPTA7aTxyLmxlbmd0aDtpKz0yKW8rPVN0cmluZy5mcm9tQ2hhckNvZGUocltpXSsyNTYqcltpKzFdKTtyZXR1cm4gb31mdW5jdGlvbiBQKHQsZSxuKXtpZih0JTEhPTB8fHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib2Zmc2V0IGlzIG5vdCB1aW50Iik7aWYodCtlPm4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlRyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgiKX1mdW5jdGlvbiBOKHQsZSxuLHIsbyxpKXtpZighdS5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmZmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7aWYoZT5vfHxlPGkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKG4rcj50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gSSh0LGUsbixyKXtlPDAmJihlPTY1NTM1K2UrMSk7Zm9yKHZhciBvPTAsaT1NYXRoLm1pbih0Lmxlbmd0aC1uLDIpO288aTsrK28pdFtuK29dPShlJjI1NTw8OCoocj9vOjEtbykpPj4+OCoocj9vOjEtbyl9ZnVuY3Rpb24gXyh0LGUsbixyKXtlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKTtmb3IodmFyIG89MCxpPU1hdGgubWluKHQubGVuZ3RoLW4sNCk7bzxpOysrbyl0W24rb109ZT4+PjgqKHI/bzozLW8pJjI1NX1mdW5jdGlvbiBEKHQsZSxuLHIsbyxpKXtpZihuK3I+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKG48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gTSh0LGUsbixyLGkpe3JldHVybiBpfHxEKHQsMCxuLDQpLG8ud3JpdGUodCxlLG4sciwyMyw0KSxuKzR9ZnVuY3Rpb24gVSh0LGUsbixyLGkpe3JldHVybiBpfHxEKHQsMCxuLDgpLG8ud3JpdGUodCxlLG4sciw1Miw4KSxuKzh9dS5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24odCxlKXt2YXIgbixyPXRoaXMubGVuZ3RoO2lmKCh0PX5+dCk8MD8odCs9cik8MCYmKHQ9MCk6dD5yJiYodD1yKSwoZT12b2lkIDA9PT1lP3I6fn5lKTwwPyhlKz1yKTwwJiYoZT0wKTplPnImJihlPXIpLGU8dCYmKGU9dCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUKShuPXRoaXMuc3ViYXJyYXkodCxlKSkuX19wcm90b19fPXUucHJvdG90eXBlO2Vsc2V7dmFyIG89ZS10O249bmV3IHUobyx2b2lkIDApO2Zvcih2YXIgaT0wO2k8bzsrK2kpbltpXT10aGlzW2krdF19cmV0dXJuIG59LHUucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24odCxlLG4pe3R8PTAsZXw9MCxufHxQKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbdF0sbz0xLGk9MDsrK2k8ZSYmKG8qPTI1Nik7KXIrPXRoaXNbdCtpXSpvO3JldHVybiByfSx1LnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKHQsZSxuKXt0fD0wLGV8PTAsbnx8UCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW3QrLS1lXSxvPTE7ZT4wJiYobyo9MjU2KTspcis9dGhpc1t0Ky0tZV0qbztyZXR1cm4gcn0sdS5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCwxLHRoaXMubGVuZ3RoKSx0aGlzW3RdfSx1LnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fSx1LnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDh8dGhpc1t0KzFdfSx1LnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDQsdGhpcy5sZW5ndGgpLCh0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2KSsxNjc3NzIxNip0aGlzW3QrM119LHUucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1t0XSsodGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdKX0sdS5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKHQsZSxuKXt0fD0wLGV8PTAsbnx8UCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW3RdLG89MSxpPTA7KytpPGUmJihvKj0yNTYpOylyKz10aGlzW3QraV0qbztyZXR1cm4gcj49KG8qPTEyOCkmJihyLT1NYXRoLnBvdygyLDgqZSkpLHJ9LHUucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbih0LGUsbil7dHw9MCxlfD0wLG58fFAodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9ZSxvPTEsaT10aGlzW3QrLS1yXTtyPjAmJihvKj0yNTYpOylpKz10aGlzW3QrLS1yXSpvO3JldHVybiBpPj0obyo9MTI4KSYmKGktPU1hdGgucG93KDIsOCplKSksaX0sdS5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDEsdGhpcy5sZW5ndGgpLDEyOCZ0aGlzW3RdPy0xKigyNTUtdGhpc1t0XSsxKTp0aGlzW3RdfSx1LnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbih0LGUpe2V8fFAodCwyLHRoaXMubGVuZ3RoKTt2YXIgbj10aGlzW3RdfHRoaXNbdCsxXTw8ODtyZXR1cm4gMzI3Njgmbj80Mjk0OTAxNzYwfG46bn0sdS5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24odCxlKXtlfHxQKHQsMix0aGlzLmxlbmd0aCk7dmFyIG49dGhpc1t0KzFdfHRoaXNbdF08PDg7cmV0dXJuIDMyNzY4Jm4/NDI5NDkwMTc2MHxuOm59LHUucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2fHRoaXNbdCszXTw8MjR9LHUucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdPDwyNHx0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM119LHUucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw0LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyx0LCEwLDIzLDQpfSx1LnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsNCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsdCwhMSwyMyw0KX0sdS5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw4LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyx0LCEwLDUyLDgpfSx1LnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDgsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLHQsITEsNTIsOCl9LHUucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKHQsZSxuLHIpeyh0PSt0LGV8PTAsbnw9MCxyKXx8Tih0aGlzLHQsZSxuLE1hdGgucG93KDIsOCpuKS0xLDApO3ZhciBvPTEsaT0wO2Zvcih0aGlzW2VdPTI1NSZ0OysraTxuJiYobyo9MjU2KTspdGhpc1tlK2ldPXQvbyYyNTU7cmV0dXJuIGUrbn0sdS5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24odCxlLG4scil7KHQ9K3QsZXw9MCxufD0wLHIpfHxOKHRoaXMsdCxlLG4sTWF0aC5wb3coMiw4Km4pLTEsMCk7dmFyIG89bi0xLGk9MTtmb3IodGhpc1tlK29dPTI1NSZ0Oy0tbz49MCYmKGkqPTI1Nik7KXRoaXNbZStvXT10L2kmMjU1O3JldHVybiBlK259LHUucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwxLDI1NSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlR8fCh0PU1hdGguZmxvb3IodCkpLHRoaXNbZV09MjU1JnQsZSsxfSx1LnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsMiw2NTUzNSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44KTpJKHRoaXMsdCxlLCEwKSxlKzJ9LHUucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwyLDY1NTM1LDApLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+OCx0aGlzW2UrMV09MjU1JnQpOkkodGhpcyx0LGUsITEpLGUrMn0sdS5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZSszXT10Pj4+MjQsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrMV09dD4+PjgsdGhpc1tlXT0yNTUmdCk6Xyh0aGlzLHQsZSwhMCksZSs0fSx1LnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+MjQsdGhpc1tlKzFdPXQ+Pj4xNix0aGlzW2UrMl09dD4+PjgsdGhpc1tlKzNdPTI1NSZ0KTpfKHRoaXMsdCxlLCExKSxlKzR9LHUucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24odCxlLG4scil7aWYodD0rdCxlfD0wLCFyKXt2YXIgbz1NYXRoLnBvdygyLDgqbi0xKTtOKHRoaXMsdCxlLG4sby0xLC1vKX12YXIgaT0wLGE9MSxzPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KytpPG4mJihhKj0yNTYpOyl0PDAmJjA9PT1zJiYwIT09dGhpc1tlK2ktMV0mJihzPTEpLHRoaXNbZStpXT0odC9hPj4wKS1zJjI1NTtyZXR1cm4gZStufSx1LnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9K3QsZXw9MCwhcil7dmFyIG89TWF0aC5wb3coMiw4Km4tMSk7Tih0aGlzLHQsZSxuLG8tMSwtbyl9dmFyIGk9bi0xLGE9MSxzPTA7Zm9yKHRoaXNbZStpXT0yNTUmdDstLWk+PTAmJihhKj0yNTYpOyl0PDAmJjA9PT1zJiYwIT09dGhpc1tlK2krMV0mJihzPTEpLHRoaXNbZStpXT0odC9hPj4wKS1zJjI1NTtyZXR1cm4gZStufSx1LnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwxLDEyNywtMTI4KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlR8fCh0PU1hdGguZmxvb3IodCkpLHQ8MCYmKHQ9MjU1K3QrMSksdGhpc1tlXT0yNTUmdCxlKzF9LHUucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44KTpJKHRoaXMsdCxlLCEwKSxlKzJ9LHUucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjgsdGhpc1tlKzFdPTI1NSZ0KTpJKHRoaXMsdCxlLCExKSxlKzJ9LHUucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCx0aGlzW2UrMl09dD4+PjE2LHRoaXNbZSszXT10Pj4+MjQpOl8odGhpcyx0LGUsITApLGUrNH0sdS5wcm90b3R5cGUud3JpdGVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx0PDAmJih0PTQyOTQ5NjcyOTUrdCsxKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCk6Xyh0aGlzLHQsZSwhMSksZSs0fSx1LnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBNKHRoaXMsdCxlLCEwLG4pfSx1LnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBNKHRoaXMsdCxlLCExLG4pfSx1LnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gVSh0aGlzLHQsZSwhMCxuKX0sdS5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIFUodGhpcyx0LGUsITEsbil9LHUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24odCxlLG4scil7aWYobnx8KG49MCkscnx8MD09PXJ8fChyPXRoaXMubGVuZ3RoKSxlPj10Lmxlbmd0aCYmKGU9dC5sZW5ndGgpLGV8fChlPTApLHI+MCYmcjxuJiYocj1uKSxyPT09bilyZXR1cm4gMDtpZigwPT09dC5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZihlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDB8fG4+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO3I+dGhpcy5sZW5ndGgmJihyPXRoaXMubGVuZ3RoKSx0Lmxlbmd0aC1lPHItbiYmKHI9dC5sZW5ndGgtZStuKTt2YXIgbyxpPXItbjtpZih0aGlzPT09dCYmbjxlJiZlPHIpZm9yKG89aS0xO28+PTA7LS1vKXRbbytlXT10aGlzW28rbl07ZWxzZSBpZihpPDFlM3x8IXUuVFlQRURfQVJSQVlfU1VQUE9SVClmb3Iobz0wO288aTsrK28pdFtvK2VdPXRoaXNbbytuXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKHQsdGhpcy5zdWJhcnJheShuLG4raSksZSk7cmV0dXJuIGl9LHUucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24odCxlLG4scil7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIGU/KHI9ZSxlPTAsbj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiBuJiYocj1uLG49dGhpcy5sZW5ndGgpLDE9PT10Lmxlbmd0aCl7dmFyIG89dC5jaGFyQ29kZUF0KDApO288MjU2JiYodD1vKX1pZih2b2lkIDAhPT1yJiYic3RyaW5nIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgciYmIXUuaXNFbmNvZGluZyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3IpfWVsc2UibnVtYmVyIj09dHlwZW9mIHQmJih0Jj0yNTUpO2lmKGU8MHx8dGhpcy5sZW5ndGg8ZXx8dGhpcy5sZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYobjw9ZSlyZXR1cm4gdGhpczt2YXIgaTtpZihlPj4+PTAsbj12b2lkIDA9PT1uP3RoaXMubGVuZ3RoOm4+Pj4wLHR8fCh0PTApLCJudW1iZXIiPT10eXBlb2YgdClmb3IoaT1lO2k8bjsrK2kpdGhpc1tpXT10O2Vsc2V7dmFyIGE9dS5pc0J1ZmZlcih0KT90OkYobmV3IHUodCxyKS50b1N0cmluZygpKSxzPWEubGVuZ3RoO2ZvcihpPTA7aTxuLWU7KytpKXRoaXNbaStlXT1hW2klc119cmV0dXJuIHRoaXN9O3ZhciBCPS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIHEodCl7cmV0dXJuIHQ8MTY/IjAiK3QudG9TdHJpbmcoMTYpOnQudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIEYodCxlKXt2YXIgbjtlPWV8fDEvMDtmb3IodmFyIHI9dC5sZW5ndGgsbz1udWxsLGk9W10sYT0wO2E8cjsrK2Epe2lmKChuPXQuY2hhckNvZGVBdChhKSk+NTUyOTUmJm48NTczNDQpe2lmKCFvKXtpZihuPjU2MzE5KXsoZS09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYoYSsxPT09cil7KGUtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfW89bjtjb250aW51ZX1pZihuPDU2MzIwKXsoZS09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSksbz1uO2NvbnRpbnVlfW49NjU1MzYrKG8tNTUyOTY8PDEwfG4tNTYzMjApfWVsc2UgbyYmKGUtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2lmKG89bnVsbCxuPDEyOCl7aWYoKGUtPTEpPDApYnJlYWs7aS5wdXNoKG4pfWVsc2UgaWYobjwyMDQ4KXtpZigoZS09Mik8MClicmVhaztpLnB1c2gobj4+NnwxOTIsNjMmbnwxMjgpfWVsc2UgaWYobjw2NTUzNil7aWYoKGUtPTMpPDApYnJlYWs7aS5wdXNoKG4+PjEyfDIyNCxuPj42JjYzfDEyOCw2MyZufDEyOCl9ZWxzZXtpZighKG48MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigoZS09NCk8MClicmVhaztpLnB1c2gobj4+MTh8MjQwLG4+PjEyJjYzfDEyOCxuPj42JjYzfDEyOCw2MyZufDEyOCl9fXJldHVybiBpfWZ1bmN0aW9uIEgodCl7cmV0dXJuIHIudG9CeXRlQXJyYXkoZnVuY3Rpb24odCl7aWYoKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbT90LnRyaW0oKTp0LnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0odCkucmVwbGFjZShCLCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDt0Lmxlbmd0aCU0IT0wOyl0Kz0iPSI7cmV0dXJuIHR9KHQpKX1mdW5jdGlvbiB6KHQsZSxuLHIpe2Zvcih2YXIgbz0wO288ciYmIShvK24+PWUubGVuZ3RofHxvPj10Lmxlbmd0aCk7KytvKWVbbytuXT10W29dO3JldHVybiBvfX0pLmNhbGwodGhpcyxuKDg1KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS5ieXRlTGVuZ3RoPWZ1bmN0aW9uKHQpe3ZhciBlPWModCksbj1lWzBdLHI9ZVsxXTtyZXR1cm4gMyoobityKS80LXJ9LGUudG9CeXRlQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGUsbixyPWModCksYT1yWzBdLHM9clsxXSx1PW5ldyBpKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gMyooZStuKS80LW59KDAsYSxzKSksbD0wLGY9cz4wP2EtNDphO2ZvcihuPTA7bjxmO24rPTQpZT1vW3QuY2hhckNvZGVBdChuKV08PDE4fG9bdC5jaGFyQ29kZUF0KG4rMSldPDwxMnxvW3QuY2hhckNvZGVBdChuKzIpXTw8NnxvW3QuY2hhckNvZGVBdChuKzMpXSx1W2wrK109ZT4+MTYmMjU1LHVbbCsrXT1lPj44JjI1NSx1W2wrK109MjU1JmU7Mj09PXMmJihlPW9bdC5jaGFyQ29kZUF0KG4pXTw8MnxvW3QuY2hhckNvZGVBdChuKzEpXT4+NCx1W2wrK109MjU1JmUpOzE9PT1zJiYoZT1vW3QuY2hhckNvZGVBdChuKV08PDEwfG9bdC5jaGFyQ29kZUF0KG4rMSldPDw0fG9bdC5jaGFyQ29kZUF0KG4rMildPj4yLHVbbCsrXT1lPj44JjI1NSx1W2wrK109MjU1JmUpO3JldHVybiB1fSxlLmZyb21CeXRlQXJyYXk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49dC5sZW5ndGgsbz1uJTMsaT1bXSxhPTAscz1uLW87YTxzO2ErPTE2MzgzKWkucHVzaChsKHQsYSxhKzE2MzgzPnM/czphKzE2MzgzKSk7MT09PW8/KGU9dFtuLTFdLGkucHVzaChyW2U+PjJdK3JbZTw8NCY2M10rIj09IikpOjI9PT1vJiYoZT0odFtuLTJdPDw4KSt0W24tMV0saS5wdXNoKHJbZT4+MTBdK3JbZT4+NCY2M10rcltlPDwyJjYzXSsiPSIpKTtyZXR1cm4gaS5qb2luKCIiKX07Zm9yKHZhciByPVtdLG89W10saT0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSxhPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixzPTAsdT1hLmxlbmd0aDtzPHU7KytzKXJbc109YVtzXSxvW2EuY2hhckNvZGVBdChzKV09cztmdW5jdGlvbiBjKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGUlND4wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpO3ZhciBuPXQuaW5kZXhPZigiPSIpO3JldHVybi0xPT09biYmKG49ZSksW24sbj09PWU/MDo0LW4lNF19ZnVuY3Rpb24gbCh0LGUsbil7Zm9yKHZhciBvLGksYT1bXSxzPWU7czxuO3MrPTMpbz0odFtzXTw8MTYmMTY3MTE2ODApKyh0W3MrMV08PDgmNjUyODApKygyNTUmdFtzKzJdKSxhLnB1c2goclsoaT1vKT4+MTgmNjNdK3JbaT4+MTImNjNdK3JbaT4+NiY2M10rcls2MyZpXSk7cmV0dXJuIGEuam9pbigiIil9b1siLSIuY2hhckNvZGVBdCgwKV09NjIsb1siXyIuY2hhckNvZGVBdCgwKV09NjN9LGZ1bmN0aW9uKHQsZSl7ZS5yZWFkPWZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGksYSxzPTgqby1yLTEsdT0oMTw8cyktMSxjPXU+PjEsbD0tNyxmPW4/by0xOjAscD1uPy0xOjEsaD10W2UrZl07Zm9yKGYrPXAsaT1oJigxPDwtbCktMSxoPj49LWwsbCs9cztsPjA7aT0yNTYqaSt0W2UrZl0sZis9cCxsLT04KTtmb3IoYT1pJigxPDwtbCktMSxpPj49LWwsbCs9cjtsPjA7YT0yNTYqYSt0W2UrZl0sZis9cCxsLT04KTtpZigwPT09aSlpPTEtYztlbHNle2lmKGk9PT11KXJldHVybiBhP05hTjoxLzAqKGg/LTE6MSk7YSs9TWF0aC5wb3coMixyKSxpLT1jfXJldHVybihoPy0xOjEpKmEqTWF0aC5wb3coMixpLXIpfSxlLndyaXRlPWZ1bmN0aW9uKHQsZSxuLHIsbyxpKXt2YXIgYSxzLHUsYz04Kmktby0xLGw9KDE8PGMpLTEsZj1sPj4xLHA9MjM9PT1vP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxoPXI/MDppLTEsZD1yPzE6LTEsZz1lPDB8fDA9PT1lJiYxL2U8MD8xOjA7Zm9yKGU9TWF0aC5hYnMoZSksaXNOYU4oZSl8fGU9PT0xLzA/KHM9aXNOYU4oZSk/MTowLGE9bCk6KGE9TWF0aC5mbG9vcihNYXRoLmxvZyhlKS9NYXRoLkxOMiksZSoodT1NYXRoLnBvdygyLC1hKSk8MSYmKGEtLSx1Kj0yKSwoZSs9YStmPj0xP3AvdTpwKk1hdGgucG93KDIsMS1mKSkqdT49MiYmKGErKyx1Lz0yKSxhK2Y+PWw/KHM9MCxhPWwpOmErZj49MT8ocz0oZSp1LTEpKk1hdGgucG93KDIsbyksYSs9Zik6KHM9ZSpNYXRoLnBvdygyLGYtMSkqTWF0aC5wb3coMixvKSxhPTApKTtvPj04O3RbbitoXT0yNTUmcyxoKz1kLHMvPTI1NixvLT04KTtmb3IoYT1hPDxvfHMsYys9bztjPjA7dFtuK2hdPTI1NSZhLGgrPWQsYS89MjU2LGMtPTgpO3RbbitoLWRdfD0xMjgqZ319LGZ1bmN0aW9uKHQsZSl7dmFyIG49e30udG9TdHJpbmc7dC5leHBvcnRzPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PW4uY2FsbCh0KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyOTkpfSxmdW5jdGlvbih0LGUsbil7bigzMDApO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuVVJMU2VhcmNoUGFyYW1zfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24oMTAyKTt2YXIgcj1uKDApLG89bigzMDEpLGk9bigzNiksYT1uKDExOCkscz1uKDI5KSx1PW4oMTAwKSxjPW4oNTApLGw9bigxMTkpLGY9bigxNCkscD1uKDMyKSxoPW4oMTEpLGQ9big3KSxnPW4oMTA4KSx2PW4oNTIpLHk9bigyKSgiaXRlcmF0b3IiKSxtPWMuc2V0LGI9Yy5nZXR0ZXJGb3IoIlVSTFNlYXJjaFBhcmFtcyIpLHg9Yy5nZXR0ZXJGb3IoIlVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yIiksdz0vXCsvZyxrPUFycmF5KDQpLFM9ZnVuY3Rpb24odCl7cmV0dXJuIGtbdC0xXXx8KGtbdC0xXT1SZWdFeHAoIigoPzolW1xcZGEtZl17Mn0peyIrdCsifSkiLCJnaSIpKX0sRT1mdW5jdGlvbih0KXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0KX1jYXRjaChlKXtyZXR1cm4gdH19LGo9ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKHcsIiAiKSxuPTQ7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZSl9Y2F0Y2godCl7Zm9yKDtuOyllPWUucmVwbGFjZShTKG4tLSksRSk7cmV0dXJuIGV9fSxUPS9bIScoKX5dfCUyMC9nLE89eyIhIjoiJTIxIiwiJyI6IiUyNyIsIigiOiIlMjgiLCIpIjoiJTI5IiwifiI6IiU3RSIsIiUyMCI6IisifSxBPWZ1bmN0aW9uKHQpe3JldHVybiBPW3RdfSxDPWZ1bmN0aW9uKHQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQodCkucmVwbGFjZShULEEpfSxMPWZ1bmN0aW9uKHQsZSl7aWYoZSlmb3IodmFyIG4scixvPWUuc3BsaXQoIiYiKSxpPTA7aTxvLmxlbmd0aDspKG49b1tpKytdKS5sZW5ndGgmJihyPW4uc3BsaXQoIj0iKSx0LnB1c2goe2tleTpqKHIuc2hpZnQoKSksdmFsdWU6aihyLmpvaW4oIj0iKSl9KSl9LFI9ZnVuY3Rpb24odCl7dGhpcy5lbnRyaWVzLmxlbmd0aD0wLEwodGhpcy5lbnRyaWVzLHQpfSxQPWZ1bmN0aW9uKHQsZSl7aWYodDxlKXRocm93IFR5cGVFcnJvcigiTm90IGVub3VnaCBhcmd1bWVudHMiKX0sTj11KGZ1bmN0aW9uKHQsZSl7bSh0aGlzLHt0eXBlOiJVUkxTZWFyY2hQYXJhbXNJdGVyYXRvciIsaXRlcmF0b3I6ZyhiKHQpLmVudHJpZXMpLGtpbmQ6ZX0pfSwiSXRlcmF0b3IiLGZ1bmN0aW9uKCl7dmFyIHQ9eCh0aGlzKSxlPXQua2luZCxuPXQuaXRlcmF0b3IubmV4dCgpLHI9bi52YWx1ZTtyZXR1cm4gbi5kb25lfHwobi52YWx1ZT0ia2V5cyI9PT1lP3Iua2V5OiJ2YWx1ZXMiPT09ZT9yLnZhbHVlOltyLmtleSxyLnZhbHVlXSksbn0pLEk9ZnVuY3Rpb24oKXtsKHRoaXMsSSwiVVJMU2VhcmNoUGFyYW1zIik7dmFyIHQsZSxuLHIsbyxpLGEscz1hcmd1bWVudHMubGVuZ3RoPjA/YXJndW1lbnRzWzBdOnZvaWQgMCx1PXRoaXMsYz1bXTtpZihtKHUse3R5cGU6IlVSTFNlYXJjaFBhcmFtcyIsZW50cmllczpjLHVwZGF0ZVVSTDpmdW5jdGlvbigpe30sdXBkYXRlU2VhcmNoUGFyYW1zOlJ9KSx2b2lkIDAhPT1zKWlmKGQocykpaWYoImZ1bmN0aW9uIj09dHlwZW9mKHQ9dihzKSkpZm9yKGU9dC5jYWxsKHMpOyEobj1lLm5leHQoKSkuZG9uZTspe2lmKChvPShyPWcoaChuLnZhbHVlKSkpLm5leHQoKSkuZG9uZXx8KGk9ci5uZXh0KCkpLmRvbmV8fCFyLm5leHQoKS5kb25lKXRocm93IFR5cGVFcnJvcigiRXhwZWN0ZWQgc2VxdWVuY2Ugd2l0aCBsZW5ndGggMiIpO2MucHVzaCh7a2V5Om8udmFsdWUrIiIsdmFsdWU6aS52YWx1ZSsiIn0pfWVsc2UgZm9yKGEgaW4gcylmKHMsYSkmJmMucHVzaCh7a2V5OmEsdmFsdWU6c1thXSsiIn0pO2Vsc2UgTChjLCJzdHJpbmciPT10eXBlb2Ygcz8iPyI9PT1zLmNoYXJBdCgwKT9zLnNsaWNlKDEpOnM6cysiIil9LF89SS5wcm90b3R5cGU7YShfLHthcHBlbmQ6ZnVuY3Rpb24odCxlKXtQKGFyZ3VtZW50cy5sZW5ndGgsMik7dmFyIG49Yih0aGlzKTtuLmVudHJpZXMucHVzaCh7a2V5OnQrIiIsdmFsdWU6ZSsiIn0pLG4udXBkYXRlVVJMKCl9LGRlbGV0ZTpmdW5jdGlvbih0KXtQKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBlPWIodGhpcyksbj1lLmVudHJpZXMscj10KyIiLG89MDtvPG4ubGVuZ3RoOyluW29dLmtleT09PXI/bi5zcGxpY2UobywxKTpvKys7ZS51cGRhdGVVUkwoKX0sZ2V0OmZ1bmN0aW9uKHQpe1AoYXJndW1lbnRzLmxlbmd0aCwxKTtmb3IodmFyIGU9Yih0aGlzKS5lbnRyaWVzLG49dCsiIixyPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXS5rZXk9PT1uKXJldHVybiBlW3JdLnZhbHVlO3JldHVybiBudWxsfSxnZXRBbGw6ZnVuY3Rpb24odCl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgZT1iKHRoaXMpLmVudHJpZXMsbj10KyIiLHI9W10sbz0wO288ZS5sZW5ndGg7bysrKWVbb10ua2V5PT09biYmci5wdXNoKGVbb10udmFsdWUpO3JldHVybiByfSxoYXM6ZnVuY3Rpb24odCl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgZT1iKHRoaXMpLmVudHJpZXMsbj10KyIiLHI9MDtyPGUubGVuZ3RoOylpZihlW3IrK10ua2V5PT09bilyZXR1cm4hMDtyZXR1cm4hMX0sc2V0OmZ1bmN0aW9uKHQsZSl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgbixyPWIodGhpcyksbz1yLmVudHJpZXMsaT0hMSxhPXQrIiIscz1lKyIiLHU9MDt1PG8ubGVuZ3RoO3UrKykobj1vW3VdKS5rZXk9PT1hJiYoaT9vLnNwbGljZSh1LS0sMSk6KGk9ITAsbi52YWx1ZT1zKSk7aXx8by5wdXNoKHtrZXk6YSx2YWx1ZTpzfSksci51cGRhdGVVUkwoKX0sc29ydDpmdW5jdGlvbigpe3ZhciB0LGUsbixyPWIodGhpcyksbz1yLmVudHJpZXMsaT1vLnNsaWNlKCk7Zm9yKG8ubGVuZ3RoPTAsbj0wO248aS5sZW5ndGg7bisrKXtmb3IodD1pW25dLGU9MDtlPG47ZSsrKWlmKG9bZV0ua2V5PnQua2V5KXtvLnNwbGljZShlLDAsdCk7YnJlYWt9ZT09PW4mJm8ucHVzaCh0KX1yLnVwZGF0ZVVSTCgpfSxmb3JFYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPWIodGhpcykuZW50cmllcyxyPXAodCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKSxvPTA7bzxuLmxlbmd0aDspcigoZT1uW28rK10pLnZhbHVlLGUua2V5LHRoaXMpfSxrZXlzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsImtleXMiKX0sdmFsdWVzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsInZhbHVlcyIpfSxlbnRyaWVzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsImVudHJpZXMiKX19LHtlbnVtZXJhYmxlOiEwfSksaShfLHksXy5lbnRyaWVzKSxpKF8sInRvU3RyaW5nIixmdW5jdGlvbigpe2Zvcih2YXIgdCxlPWIodGhpcykuZW50cmllcyxuPVtdLHI9MDtyPGUubGVuZ3RoOyl0PWVbcisrXSxuLnB1c2goQyh0LmtleSkrIj0iK0ModC52YWx1ZSkpO3JldHVybiBuLmpvaW4oIiYiKX0se2VudW1lcmFibGU6ITB9KSxzKEksIlVSTFNlYXJjaFBhcmFtcyIpLHIoe2dsb2JhbDohMCxmb3JjZWQ6IW99LHtVUkxTZWFyY2hQYXJhbXM6SX0pLHQuZXhwb3J0cz17VVJMU2VhcmNoUGFyYW1zOkksZ2V0U3RhdGU6Yn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpLG89bigyKSxpPW4oMjgpLGE9bygiaXRlcmF0b3IiKTt0LmV4cG9ydHM9IXIoZnVuY3Rpb24oKXt2YXIgdD1uZXcgVVJMKCJiP2U9MSIsImh0dHA6Ly9hIiksZT10LnNlYXJjaFBhcmFtcztyZXR1cm4gdC5wYXRobmFtZT0iYyUyMGQiLGkmJiF0LnRvSlNPTnx8IWUuc29ydHx8Imh0dHA6Ly9hL2MlMjBkP2U9MSIhPT10LmhyZWZ8fCIxIiE9PWUuZ2V0KCJlIil8fCJhPTEiIT09U3RyaW5nKG5ldyBVUkxTZWFyY2hQYXJhbXMoIj9hPTEiKSl8fCFlW2FdfHwiYSIhPT1uZXcgVVJMKCJodHRwczovL2FAYiIpLnVzZXJuYW1lfHwiYiIhPT1uZXcgVVJMU2VhcmNoUGFyYW1zKG5ldyBVUkxTZWFyY2hQYXJhbXMoImE9YiIpKS5nZXQoImEiKXx8InhuLS1lMWF5YmMiIT09bmV3IFVSTCgiaHR0cDovL9GC0LXRgdGCIikuaG9zdHx8IiMlRDAlQjEiIT09bmV3IFVSTCgiaHR0cDovL2Ej0LEiKS5oYXNofSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5yKGUpO3ZhciByPW4oOSksbz1uLm4ociksaT1uKDYxKSxhPW4ubihpKSxzPW4oMjYpLHU9bi5uKHMpLGM9bigzKSxsPW4ubihjKSxmPW4oMjApLHA9bi5uKGYpLGg9big4KSxkPW4ubihoKSxnPW4oMTIpLHY9bi5uKGcpLHk9bigxMjYpLG09bi5uKHkpLGI9bigxOSkseD1uLm4oYiksdz1uKDM3KSxrPW4ubih3KSxTPW4oMTUpLEU9bi5uKFMpLGo9bigxMCksVD1uLm4oaiksTz0obigxNiksbig4MCkpLEE9bi5uKE8pO2Z1bmN0aW9uIEModCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjAsbj1BKCkodC5yZXBsYWNlKC9bXjAtOV0vZ2ksIiIpLDEwKTtyZXR1cm4gbnx8ZX1mdW5jdGlvbiBMKHQpe3ZhciBlPSIiLG49dC5jb250ZW50cygpO2lmKG4ubGVuZ3RoPjApZm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKz0xKXt2YXIgbz1uLmdldChyKTszPT09by5ub2RlVHlwZSYmby5kYXRhJiYoZSs9by5kYXRhKX1yZXR1cm4gZX1mdW5jdGlvbiBSKHQsZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJzZWxlY3RvciByZXF1aXJlZCIpO3JldHVybiB0KGUpLmxlbmd0aD4wJiYiaW1nIj09PXQoZSkucHJvcCgidGFnTmFtZSIpLnRvTG93ZXJDYXNlKCk/dChlKS5hdHRyKCJhbHQiKXx8IiI6dChlKS50ZXh0KCkucmVwbGFjZSgvXG4vLCIiKX1mdW5jdGlvbiBQKHQsZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJzZWxlY3RvciByZXF1aXJlZCIpO3ZhciBuPSIiO2lmKHQoZSkubGVuZ3RoPjApe3ZhciByPXQoZSkucHJvcCgidGFnTmFtZSIpLnRvTG93ZXJDYXNlKCk7bj0iaW5wdXQiPT09cj90KGUpLnZhbCgpOiJtZXRhIj09PXI/dChlKS5hdHRyKCJjb250ZW50Iil8fCIiOkwodChlKSl9cmV0dXJuIG49bi5yZXBsYWNlKC9bXjAtOV0vZywiIiksQSgpKG4sMTApfXZhciBOPW4oMzgpLEk9bi5uKE4pLF89bigzOSksRD1uLm4oXyksTT1uKDQwKSxVPW4ubihNKSxCPW4oNDEpLHE9bi5uKEIpLEY9big0MiksSD1uLm4oRiksej1uKDQzKSxXPW4ubih6KSwkPW4oNjIpLFk9bi5uKCQpO2Z1bmN0aW9uIFYodCxlKXt2YXIgbjtpZih2b2lkIDA9PT1xLmF8fG51bGw9PVUoKSh0KSl7aWYoRCgpKHQpfHwobj1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKCF0KXJldHVybjtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIEcodCxlKTt2YXIgcj1XKCkobj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLmNhbGwobiw4LC0xKTsiT2JqZWN0Ij09PXImJnQuY29uc3RydWN0b3ImJihyPXQuY29uc3RydWN0b3IubmFtZSk7aWYoIk1hcCI9PT1yfHwiU2V0Ij09PXIpcmV0dXJuIEgoKSh0KTtpZigiQXJndW1lbnRzIj09PXJ8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKXJldHVybiBHKHQsZSl9KHQpKXx8ZSYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxvPWZ1bmN0aW9uKCl7fTtyZXR1cm57czpvLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjpvfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGksYT0hMCxzPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj1JKCkodCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1uLm5leHQoKTtyZXR1cm4gYT10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXtzPSEwLGk9dH0sZjpmdW5jdGlvbigpe3RyeXthfHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKHMpdGhyb3cgaX19fX1mdW5jdGlvbiBHKHQsZSl7KG51bGw9PWV8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9ZnVuY3Rpb24gSyh0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIlNLVeOBjOS4jeato+OBp+OBmSIpO2lmKDA9PT1ZKCkodCkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiU0tV6aCF55uu5pWw44GM5LiN5q2j44Gn44GZIil9dmFyIFg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuPWUuJCxyPWUubmFtZSxvPWUucHJpY2U7ZCgpKHRoaXMsdCksdGhpcy4kPW4sdGhpcy5uYW1lU2VsZWN0b3I9cnx8IiIsdGhpcy5wcmljZVNlbGVjdG9yPW98fCIifXJldHVybiB2KCkodCxbe2tleToiZ2V0UHVyY2hhc2FibGUiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiEwfX0se2tleToiZXhlY3V0ZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdCxlLG4scj0hMDt0cnl7cmV0dXJuIHQ9dGhpcy5nZXRJdGVtKCksZT10aGlzLmdldFNrdVJvd3ModCkscj10aGlzLmdldFB1cmNoYXNhYmxlKHtpdGVtOnQsc2t1Um93czplfSksZnVuY3Rpb24odCl7dmFyIGU9dC5pdGVtLG49dC5za3VSb3dzO2lmKCFlKXRocm93IG5ldyBFcnJvcigi44Ki44Kk44OG44Og44GM5LiN5q2j44Gn44GZIik7aWYoIWUubmFtZSl0aHJvdyBuZXcgRXJyb3IoIuOCouOCpOODhuODoOWQjeWJjeOBjOS4jeato+OBp+OBmSIpO2lmKCEobiYmMCE9PW4ubGVuZ3RofHxlLnByaWNlKSl0aHJvdyBuZXcgRXJyb3IoIuOCouOCpOODhuODoOmHkemhjeOBjOS4jeato+OBp+OBmSIpO2lmKG4pe3ZhciByLG89VihuKTt0cnl7Zm9yKG8ucygpOyEocj1vLm4oKSkuZG9uZTspe0soci52YWx1ZSl9fWNhdGNoKHQpe28uZSh0KX1maW5hbGx5e28uZigpfX19KHtpdGVtOnQsc2t1Um93czplfSkse2l0ZW06dCxza3VSb3dzOmUscHVyY2hhc2FibGU6cn19Y2F0Y2godCl7bj10fXZhciBvPXtwdXJjaGFzYWJsZTpyfTtyZXR1cm4gdCYmKG8uaXRlbT10KSxlJiYoby5za3VSb3dzPWUpLG4mJihvLmVycm9yPW4pLG99fSx7a2V5OiJnZXRJdGVtIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXtuYW1lOiIiLHByaWNlOjB9O3RoaXMubmFtZVNlbGVjdG9yP3QubmFtZT10aGlzLmdldEl0ZW1OYW1lKFIodGhpcy4kLHRoaXMubmFtZVNlbGVjdG9yKSk6dC5uYW1lPXRoaXMuZ2V0SXRlbU5hbWUoKSx0aGlzLnByaWNlU2VsZWN0b3I/dC5wcmljZT10aGlzLmdldEl0ZW1QcmljZShQKHRoaXMuJCx0aGlzLnByaWNlU2VsZWN0b3IpKTp0LnByaWNlPXRoaXMuZ2V0SXRlbVByaWNlKCk7dmFyIGU9dGhpcy5nZXRJdGVtQ29kZSgpO3JldHVybiBlJiYodC5jb2RlPWUpLHR9fSx7a2V5OiJnZXRJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06IiI7cmV0dXJuIHRoaXMubmFtZVNlbGVjdG9yP1IodGhpcy4kLHRoaXMubmFtZVNlbGVjdG9yKTp0fX0se2tleToiZ2V0SXRlbVByaWNlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTowO3JldHVybiB0aGlzLnByaWNlU2VsZWN0b3I/UCh0aGlzLiQsdGhpcy5wcmljZVNlbGVjdG9yKTp0fX0se2tleToiZ2V0SXRlbUNvZGUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9fSx7a2V5OiJnZXRTa3VSb3dzIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm5bXX19XSksdH0oKSxKPW4oMTI3KSxRPW4ubihKKSxaPW4oMTI4KTtmdW5jdGlvbiB0dCgpe3JldHVybiB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlcyYmd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2V8fHdpbmRvdy5uYXZpZ2F0b3IudXNlckxhbmd1YWdlfHx3aW5kb3cubmF2aWdhdG9yLmJyb3dzZXJMYW5ndWFnZX12YXIgZXQ9bigxMjkpLG50PW4ubihldCkscnQ9bigxMzApLG90PW4ubihydCksaXQ9InppZ3phZyI7dmFyIGF0PW4oMjUpLHN0PSJ1c2FnZSIsdXQ9InppZ3phZy1mbG93LWNvbnRyb2xsZWQiO2Z1bmN0aW9uIGN0KHQsZSl7d2luZG93LiQmJmZ1bmN0aW9uKG4pe3ZhciByPW4odCk7aWYociYmci5sZW5ndGg+MClmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rPTEpe3ZhciBpPXIuZ2V0KG8pO2kuaGFzQXR0cmlidXRlKHV0KXx8KCJjbGljayI9PT1lP2kub25jbGljaz1udWxsOiJzdWJtaXQiPT09ZSYmKGkub25zdWJtaXQ9bnVsbCksIm9mZiJpbiBuKGkpP24oaSkub2ZmKGUpOiJ1bmJpbmQiaW4gbihpKSYmbihpKS51bmJpbmQoZSkpfX0od2luZG93LiQpfXZhciBsdD17cHJlc2VydmVPcmlnaW5hbEV2ZW50OiExLGRpc2FibGVQb2ludGVyRXZlbnQ6ITEsZGlzYWJsZVJlcG9ydDohMX07dmFyIGZ0PXtkaXNhYmxlUmVwb3J0OiExfTtmdW5jdGlvbiBwdCh0KXt2YXIgZT1vdCgpKGZ1bmN0aW9uKCl7dmFyIG4scixvPXdpbmRvdy56aWd6YWc7ImRlYWN0aXZhdGVkIj09PShuPXN0LHI9d2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGl0KSxKU09OLnBhcnNlKHI/ZGVjb2RlVVJJQ29tcG9uZW50KGF0b2IocikpOiJ7fSIpW25dKXx8by5pc0RlbmllZHx8KHQoKSxjbGVhckludGVydmFsKGUpKX0sNTAwKX1mdW5jdGlvbiBodCh0LGUpe3ZhciBuPXdpbmRvdy56aWd6YWc7bnQoKShmdW5jdGlvbigpey9DaHJvbWUvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpJiYwPT09dChlKS5sZW5ndGgmJm4mJiJpdGVtIj09PW4uZGlzY292ZXJ5U3RhdHVzJiZhdC5hLmVycm9yKCIiLmNvbmNhdChlLCI6IOOCouOCpOODhuODoOODmuODvOOCuOOBp+ipsuW9k+OBmeOCi+ODleODreODvOWItuW+oeeUqOOBruimgee0oOOBjOimi+OBpOOBi+OCiuOBvuOBm+OCkyIpKX0sNWUzKX12YXIgZHQ9e29uQ2hhbmdlc1JlYWR5OmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpbImphIl07Qm9vbGVhbihUKCkoZSkuY2FsbChlLGZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybi0xIT09USgpKGU9dHQoKSkuY2FsbChlLHQpfSkpfHxwdChmdW5jdGlvbigpe3QoWil9KX0sb3ZlcnJpZGVDbGlja0V2ZW50OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106bHQ7aWYoKHI9dSgpKHUoKSh7fSxsdCkscikpLmRpc2FibGVSZXBvcnR8fGh0KHQsZSksci5kaXNhYmxlUG9pbnRlckV2ZW50KXtpZih3aW5kb3cuZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUodXQpKXJldHVybjt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO28uaW5uZXJIVE1MPSJcbiAgICAiLmNvbmNhdChlLCIge1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgfSIpO3ZhciBpPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdCIpO3JldHVybiBpJiZpLnBhcmVudE5vZGUmJmkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobyxpKSx0KGRvY3VtZW50KS5vbigiY2xpY2siLGZ1bmN0aW9uKHIpe3IudGFyZ2V0JiZ0KHIudGFyZ2V0KS5jbG9zZXN0KHQoZSkucGFyZW50KCkpLmxlbmd0aD4wJiZuKHIpfSksdm9pZCB3aW5kb3cuZG9jdW1lbnQuYm9keS5zZXRBdHRyaWJ1dGUodXQsIjEiKX1yLnByZXNlcnZlT3JpZ2luYWxFdmVudHx8Y3QoZSwiY2xpY2siKTtmb3IodmFyIGE9dChlKSxzPTA7czxhLmxlbmd0aDtzKz0xKXt2YXIgYz1hLmdldChzKTtjLmhhc0F0dHJpYnV0ZSh1dCl8fChjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbih0KXtyLnByZXNlcnZlT3JpZ2luYWxFdmVudHx8KHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpKSxuKHQpfSwhMCksYy5zZXRBdHRyaWJ1dGUodXQsIjEiKSl9fSxvdmVycmlkZVN1Ym1pdEV2ZW50OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106ZnQ7KHI9dSgpKHUoKSh7fSxmdCkscikpLmRpc2FibGVSZXBvcnR8fGh0KHQsZSksY3QoZSwic3VibWl0Iik7dmFyIG89dChlKTtpZihvJiZvLmxlbmd0aD4wKWZvcih2YXIgaT0wO2k8by5sZW5ndGg7aSs9MSl7dmFyIGE9by5nZXQoaSk7YS5oYXNBdHRyaWJ1dGUodXQpfHwodChhKS5vbigic3VibWl0IixuKSxhLnNldEF0dHJpYnV0ZSh1dCwiMSIpKX19LHVuYmluZE9yaWdpbmFsSlF1ZXJ5RXZlbnRzOmN0fTt2YXIgZ3Q9big4MSksdnQ9bi5uKGd0KSx5dD1uKDEzMSksbXQ9bi5uKHl0KSxidD1uKDEzMikseHQ9bi5uKGJ0KSx3dD1uKDgyKSxrdD1uLm4od3QpO2Z1bmN0aW9uIFN0KHQpe3JldHVybihTdD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIEV0KHQsZSxuKXtyZXR1cm4gZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH1mdW5jdGlvbiBqdCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/T2JqZWN0KGFyZ3VtZW50c1tlXSk6e30scj1PYmplY3Qua2V5cyhuKTsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmKHI9ci5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhuKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KS5lbnVtZXJhYmxlfSkpKSxyLmZvckVhY2goZnVuY3Rpb24oZSl7RXQodCxlLG5bZV0pfSl9cmV0dXJuIHR9ZnVuY3Rpb24gVHQodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBPdCh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fWZ1bmN0aW9uIEF0KHQsZSxuKXtyZXR1cm4gZSYmT3QodC5wcm90b3R5cGUsZSksbiYmT3QodCxuKSx0fWZ1bmN0aW9uIEN0KHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBMdCh0LGUpe3JldHVybiFlfHwib2JqZWN0IiE9PVN0KGUpJiYiZnVuY3Rpb24iIT10eXBlb2YgZT9DdCh0KTplfWZ1bmN0aW9uIFJ0KHQpe3JldHVybihSdD1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9ZnVuY3Rpb24gUHQodCxlKXtyZXR1cm4oUHQ9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9KSh0LGUpfWZ1bmN0aW9uIE50KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJlB0KHQsZSl9dmFyIEl0PXt0eXBlOiJsb2dnZXIiLGxvZzpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgibG9nIix0KX0sd2FybjpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgid2FybiIsdCl9LGVycm9yOmZ1bmN0aW9uKHQpe3RoaXMub3V0cHV0KCJlcnJvciIsdCl9LG91dHB1dDpmdW5jdGlvbih0LGUpe2NvbnNvbGUmJmNvbnNvbGVbdF0mJmNvbnNvbGVbdF0uYXBwbHkoY29uc29sZSxlKX19LF90PW5ldyhmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O1R0KHRoaXMsdCksdGhpcy5pbml0KGUsbil9cmV0dXJuIEF0KHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTt0aGlzLnByZWZpeD1lLnByZWZpeHx8ImkxOG5leHQ6Iix0aGlzLmxvZ2dlcj10fHxJdCx0aGlzLm9wdGlvbnM9ZSx0aGlzLmRlYnVnPWUuZGVidWd9fSx7a2V5OiJzZXREZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5kZWJ1Zz10fX0se2tleToibG9nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwibG9nIiwiIiwhMCl9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIiIsITApfX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCksbj0wO248dDtuKyspZVtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuZm9yd2FyZChlLCJlcnJvciIsIiIpfX0se2tleToiZGVwcmVjYXRlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIldBUk5JTkcgREVQUkVDQVRFRDogIiwhMCl9fSx7a2V5OiJmb3J3YXJkIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gciYmIXRoaXMuZGVidWc/bnVsbDooInN0cmluZyI9PXR5cGVvZiB0WzBdJiYodFswXT0iIi5jb25jYXQobikuY29uY2F0KHRoaXMucHJlZml4LCIgIikuY29uY2F0KHRbMF0pKSx0aGlzLmxvZ2dlcltlXSh0KSl9fSx7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdCh0aGlzLmxvZ2dlcixqdCh7fSx7cHJlZml4OiIiLmNvbmNhdCh0aGlzLnByZWZpeCwiOiIpLmNvbmNhdChlLCI6Iil9LHRoaXMub3B0aW9ucykpfX1dKSx0fSgpKSxEdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtUdCh0aGlzLHQpLHRoaXMub2JzZXJ2ZXJzPXt9fXJldHVybiBBdCh0LFt7a2V5OiJvbiIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3JldHVybiB0LnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbih0KXtuLm9ic2VydmVyc1t0XT1uLm9ic2VydmVyc1t0XXx8W10sbi5vYnNlcnZlcnNbdF0ucHVzaChlKX0pLHRoaXN9fSx7a2V5OiJvZmYiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5vYnNlcnZlcnNbdF0mJihlP3RoaXMub2JzZXJ2ZXJzW3RdPXRoaXMub2JzZXJ2ZXJzW3RdLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdCE9PWV9KTpkZWxldGUgdGhpcy5vYnNlcnZlcnNbdF0pfX0se2tleToiZW1pdCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkoZT4xP2UtMTowKSxyPTE7cjxlO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO2lmKHRoaXMub2JzZXJ2ZXJzW3RdKXt2YXIgbz1bXS5jb25jYXQodGhpcy5vYnNlcnZlcnNbdF0pO28uZm9yRWFjaChmdW5jdGlvbih0KXt0LmFwcGx5KHZvaWQgMCxuKX0pfWlmKHRoaXMub2JzZXJ2ZXJzWyIqIl0pe3ZhciBpPVtdLmNvbmNhdCh0aGlzLm9ic2VydmVyc1siKiJdKTtpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hcHBseShlLFt0XS5jb25jYXQobikpfSl9fX1dKSx0fSgpO2Z1bmN0aW9uIE10KCl7dmFyIHQsZSxuPW5ldyBQcm9taXNlKGZ1bmN0aW9uKG4scil7dD1uLGU9cn0pO3JldHVybiBuLnJlc29sdmU9dCxuLnJlamVjdD1lLG59ZnVuY3Rpb24gVXQodCl7cmV0dXJuIG51bGw9PXQ/IiI6IiIrdH1mdW5jdGlvbiBCdCh0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5pbmRleE9mKCIjIyMiKT4tMT90LnJlcGxhY2UoLyMjIy9nLCIuIik6dH1mdW5jdGlvbiBvKCl7cmV0dXJuIXR8fCJzdHJpbmciPT10eXBlb2YgdH1mb3IodmFyIGk9InN0cmluZyIhPXR5cGVvZiBlP1tdLmNvbmNhdChlKTplLnNwbGl0KCIuIik7aS5sZW5ndGg+MTspe2lmKG8oKSlyZXR1cm57fTt2YXIgYT1yKGkuc2hpZnQoKSk7IXRbYV0mJm4mJih0W2FdPW5ldyBuKSx0PXRbYV19cmV0dXJuIG8oKT97fTp7b2JqOnQsazpyKGkuc2hpZnQoKSl9fWZ1bmN0aW9uIHF0KHQsZSxuKXt2YXIgcj1CdCh0LGUsT2JqZWN0KTtyLm9ialtyLmtdPW59ZnVuY3Rpb24gRnQodCxlKXt2YXIgbj1CdCh0LGUpLHI9bi5vYmosbz1uLms7aWYocilyZXR1cm4gcltvXX1mdW5jdGlvbiBIdCh0LGUsbil7dmFyIHI9RnQodCxuKTtyZXR1cm4gdm9pZCAwIT09cj9yOkZ0KGUsbil9ZnVuY3Rpb24genQodCxlLG4pe2Zvcih2YXIgciBpbiBlKSJfX3Byb3RvX18iIT09ciYmImNvbnN0cnVjdG9yIiE9PXImJihyIGluIHQ/InN0cmluZyI9PXR5cGVvZiB0W3JdfHx0W3JdaW5zdGFuY2VvZiBTdHJpbmd8fCJzdHJpbmciPT10eXBlb2YgZVtyXXx8ZVtyXWluc3RhbmNlb2YgU3RyaW5nP24mJih0W3JdPWVbcl0pOnp0KHRbcl0sZVtyXSxuKTp0W3JdPWVbcl0pO3JldHVybiB0fWZ1bmN0aW9uIFd0KHQpe3JldHVybiB0LnJlcGxhY2UoL1tcLVxbXF1cL1x7XH1cKFwpXCpcK1w/XC5cXFxeXCRcfF0vZywiXFwkJiIpfXZhciAkdD17IiYiOiImYW1wOyIsIjwiOiImbHQ7IiwiPiI6IiZndDsiLCciJzoiJnF1b3Q7IiwiJyI6IiYjMzk7IiwiLyI6IiYjeDJGOyJ9O2Z1bmN0aW9uIFl0KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90LnJlcGxhY2UoL1smPD4iJ1wvXS9nLGZ1bmN0aW9uKHQpe3JldHVybiAkdFt0XX0pOnR9dmFyIFZ0PSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cubmF2aWdhdG9yJiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCYmd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpPi0xLEd0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7dmFyIG4scj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e25zOlsidHJhbnNsYXRpb24iXSxkZWZhdWx0TlM6InRyYW5zbGF0aW9uIn07cmV0dXJuIFR0KHRoaXMsZSksbj1MdCh0aGlzLFJ0KGUpLmNhbGwodGhpcykpLFZ0JiZEdC5jYWxsKEN0KG4pKSxuLmRhdGE9dHx8e30sbi5vcHRpb25zPXIsdm9pZCAwPT09bi5vcHRpb25zLmtleVNlcGFyYXRvciYmKG4ub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSxufXJldHVybiBOdChlLER0KSxBdChlLFt7a2V5OiJhZGROYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMubnMuaW5kZXhPZih0KTwwJiZ0aGlzLm9wdGlvbnMubnMucHVzaCh0KX19LHtrZXk6InJlbW92ZU5hbWVzcGFjZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9ucy5ucy5pbmRleE9mKHQpO2U+LTEmJnRoaXMub3B0aW9ucy5ucy5zcGxpY2UoZSwxKX19LHtrZXk6ImdldFJlc291cmNlIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9LG89dm9pZCAwIT09ci5rZXlTZXBhcmF0b3I/ci5rZXlTZXBhcmF0b3I6dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcixpPVt0LGVdO3JldHVybiBuJiYic3RyaW5nIiE9dHlwZW9mIG4mJihpPWkuY29uY2F0KG4pKSxuJiYic3RyaW5nIj09dHlwZW9mIG4mJihpPWkuY29uY2F0KG8/bi5zcGxpdChvKTpuKSksdC5pbmRleE9mKCIuIik+LTEmJihpPXQuc3BsaXQoIi4iKSksRnQodGhpcy5kYXRhLGkpfX0se2tleToiYWRkUmVzb3VyY2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTp7c2lsZW50OiExfSxpPXRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3I7dm9pZCAwPT09aSYmKGk9Ii4iKTt2YXIgYT1bdCxlXTtuJiYoYT1hLmNvbmNhdChpP24uc3BsaXQoaSk6bikpLHQuaW5kZXhPZigiLiIpPi0xJiYocj1lLGU9KGE9dC5zcGxpdCgiLiIpKVsxXSksdGhpcy5hZGROYW1lc3BhY2VzKGUpLHF0KHRoaXMuZGF0YSxhLHIpLG8uc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbixyKX19LHtrZXk6ImFkZFJlc291cmNlcyIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7c2lsZW50OiExfTtmb3IodmFyIG8gaW4gbikic3RyaW5nIiE9dHlwZW9mIG5bb10mJiJbb2JqZWN0IEFycmF5XSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KG5bb10pfHx0aGlzLmFkZFJlc291cmNlKHQsZSxvLG5bb10se3NpbGVudDohMH0pO3Iuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbil9fSx7a2V5OiJhZGRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06e3NpbGVudDohMX0sYT1bdCxlXTt0LmluZGV4T2YoIi4iKT4tMSYmKHI9bixuPWUsZT0oYT10LnNwbGl0KCIuIikpWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoZSk7dmFyIHM9RnQodGhpcy5kYXRhLGEpfHx7fTtyP3p0KHMsbixvKTpzPWp0KHt9LHMsbikscXQodGhpcy5kYXRhLGEscyksaS5zaWxlbnR8fHRoaXMuZW1pdCgiYWRkZWQiLHQsZSxuKX19LHtrZXk6InJlbW92ZVJlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMuaGFzUmVzb3VyY2VCdW5kbGUodCxlKSYmZGVsZXRlIHRoaXMuZGF0YVt0XVtlXSx0aGlzLnJlbW92ZU5hbWVzcGFjZXMoZSksdGhpcy5lbWl0KCJyZW1vdmVkIix0LGUpfX0se2tleToiaGFzUmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuZ2V0UmVzb3VyY2UodCxlKX19LHtrZXk6ImdldFJlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiBlfHwoZT10aGlzLm9wdGlvbnMuZGVmYXVsdE5TKSwidjEiPT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEk/anQoe30se30sdGhpcy5nZXRSZXNvdXJjZSh0LGUpKTp0aGlzLmdldFJlc291cmNlKHQsZSl9fSx7a2V5OiJnZXREYXRhQnlMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF0YVt0XX19LHtrZXk6InRvSlNPTiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhfX1dKSxlfSgpLEt0PXtwcm9jZXNzb3JzOnt9LGFkZFBvc3RQcm9jZXNzb3I6ZnVuY3Rpb24odCl7dGhpcy5wcm9jZXNzb3JzW3QubmFtZV09dH0saGFuZGxlOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGk9dGhpcztyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2kucHJvY2Vzc29yc1t0XSYmKGU9aS5wcm9jZXNzb3JzW3RdLnByb2Nlc3MoZSxuLHIsbykpfSksZX19LFh0PXt9LEp0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7dmFyIG4scixvLGksYT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307cmV0dXJuIFR0KHRoaXMsZSksbj1MdCh0aGlzLFJ0KGUpLmNhbGwodGhpcykpLFZ0JiZEdC5jYWxsKEN0KG4pKSxyPVsicmVzb3VyY2VTdG9yZSIsImxhbmd1YWdlVXRpbHMiLCJwbHVyYWxSZXNvbHZlciIsImludGVycG9sYXRvciIsImJhY2tlbmRDb25uZWN0b3IiLCJpMThuRm9ybWF0IiwidXRpbHMiXSxvPXQsaT1DdChuKSxyLmZvckVhY2goZnVuY3Rpb24odCl7b1t0XSYmKGlbdF09b1t0XSl9KSxuLm9wdGlvbnM9YSx2b2lkIDA9PT1uLm9wdGlvbnMua2V5U2VwYXJhdG9yJiYobi5vcHRpb25zLmtleVNlcGFyYXRvcj0iLiIpLG4ubG9nZ2VyPV90LmNyZWF0ZSgidHJhbnNsYXRvciIpLG59cmV0dXJuIE50KGUsRHQpLEF0KGUsW3trZXk6ImNoYW5nZUxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbih0KXt0JiYodGhpcy5sYW5ndWFnZT10KX19LHtrZXk6ImV4aXN0cyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOntpbnRlcnBvbGF0aW9uOnt9fSxuPXRoaXMucmVzb2x2ZSh0LGUpO3JldHVybiBuJiZ2b2lkIDAhPT1uLnJlc319LHtrZXk6ImV4dHJhY3RGcm9tS2V5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXZvaWQgMCE9PWUubnNTZXBhcmF0b3I/ZS5uc1NlcGFyYXRvcjp0aGlzLm9wdGlvbnMubnNTZXBhcmF0b3I7dm9pZCAwPT09biYmKG49IjoiKTt2YXIgcj12b2lkIDAhPT1lLmtleVNlcGFyYXRvcj9lLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLG89ZS5uc3x8dGhpcy5vcHRpb25zLmRlZmF1bHROUztpZihuJiZ0LmluZGV4T2Yobik+LTEpe3ZhciBpPXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7aWYoaSYmaS5sZW5ndGg+MClyZXR1cm57a2V5OnQsbmFtZXNwYWNlczpvfTt2YXIgYT10LnNwbGl0KG4pOyhuIT09cnx8bj09PXImJnRoaXMub3B0aW9ucy5ucy5pbmRleE9mKGFbMF0pPi0xKSYmKG89YS5zaGlmdCgpKSx0PWEuam9pbihyKX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIG8mJihvPVtvXSkse2tleTp0LG5hbWVzcGFjZXM6b319fSx7a2V5OiJ0cmFuc2xhdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzO2lmKCJvYmplY3QiIT09U3QoZSkmJnRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlciYmKGU9dGhpcy5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKGFyZ3VtZW50cykpLGV8fChlPXt9KSxudWxsPT10KXJldHVybiIiO0FycmF5LmlzQXJyYXkodCl8fCh0PVtTdHJpbmcodCldKTt2YXIgbz12b2lkIDAhPT1lLmtleVNlcGFyYXRvcj9lLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLGk9dGhpcy5leHRyYWN0RnJvbUtleSh0W3QubGVuZ3RoLTFdLGUpLGE9aS5rZXkscz1pLm5hbWVzcGFjZXMsdT1zW3MubGVuZ3RoLTFdLGM9ZS5sbmd8fHRoaXMubGFuZ3VhZ2UsbD1lLmFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlfHx0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU7aWYoYyYmImNpbW9kZSI9PT1jLnRvTG93ZXJDYXNlKCkpe2lmKGwpe3ZhciBmPWUubnNTZXBhcmF0b3J8fHRoaXMub3B0aW9ucy5uc1NlcGFyYXRvcjtyZXR1cm4gdStmK2F9cmV0dXJuIGF9dmFyIHA9dGhpcy5yZXNvbHZlKHQsZSksaD1wJiZwLnJlcyxkPXAmJnAudXNlZEtleXx8YSxnPXAmJnAuZXhhY3RVc2VkS2V5fHxhLHY9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShoKSx5PVsiW29iamVjdCBOdW1iZXJdIiwiW29iamVjdCBGdW5jdGlvbl0iLCJbb2JqZWN0IFJlZ0V4cF0iXSxtPXZvaWQgMCE9PWUuam9pbkFycmF5cz9lLmpvaW5BcnJheXM6dGhpcy5vcHRpb25zLmpvaW5BcnJheXMsYj0hdGhpcy5pMThuRm9ybWF0fHx0aGlzLmkxOG5Gb3JtYXQuaGFuZGxlQXNPYmplY3QseD0ic3RyaW5nIiE9dHlwZW9mIGgmJiJib29sZWFuIiE9dHlwZW9mIGgmJiJudW1iZXIiIT10eXBlb2YgaDtpZihiJiZoJiZ4JiZ5LmluZGV4T2Yodik8MCYmKCJzdHJpbmciIT10eXBlb2YgbXx8IltvYmplY3QgQXJyYXldIiE9PXYpKXtpZighZS5yZXR1cm5PYmplY3RzJiYhdGhpcy5vcHRpb25zLnJldHVybk9iamVjdHMpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImFjY2Vzc2luZyBhbiBvYmplY3QgLSBidXQgcmV0dXJuT2JqZWN0cyBvcHRpb25zIGlzIG5vdCBlbmFibGVkISIpLHRoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXI/dGhpcy5vcHRpb25zLnJldHVybmVkT2JqZWN0SGFuZGxlcihkLGgsZSk6ImtleSAnIi5jb25jYXQoYSwiICgiKS5jb25jYXQodGhpcy5sYW5ndWFnZSwiKScgcmV0dXJuZWQgYW4gb2JqZWN0IGluc3RlYWQgb2Ygc3RyaW5nLiIpO2lmKG8pe3ZhciB3PSJbb2JqZWN0IEFycmF5XSI9PT12LGs9dz9bXTp7fSxTPXc/ZzpkO2Zvcih2YXIgRSBpbiBoKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChoLEUpKXt2YXIgaj0iIi5jb25jYXQoUykuY29uY2F0KG8pLmNvbmNhdChFKTtrW0VdPXRoaXMudHJhbnNsYXRlKGosanQoe30sZSx7am9pbkFycmF5czohMSxuczpzfSkpLGtbRV09PT1qJiYoa1tFXT1oW0VdKX1oPWt9fWVsc2UgaWYoYiYmInN0cmluZyI9PXR5cGVvZiBtJiYiW29iamVjdCBBcnJheV0iPT09dikoaD1oLmpvaW4obSkpJiYoaD10aGlzLmV4dGVuZFRyYW5zbGF0aW9uKGgsdCxlLG4pKTtlbHNle3ZhciBUPSExLE89ITE7aWYoIXRoaXMuaXNWYWxpZExvb2t1cChoKSYmdm9pZCAwIT09ZS5kZWZhdWx0VmFsdWUpe2lmKFQ9ITAsdm9pZCAwIT09ZS5jb3VudCl7dmFyIEE9dGhpcy5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgoYyxlLmNvdW50KTtoPWVbImRlZmF1bHRWYWx1ZSIuY29uY2F0KEEpXX1ofHwoaD1lLmRlZmF1bHRWYWx1ZSl9dGhpcy5pc1ZhbGlkTG9va3VwKGgpfHwoTz0hMCxoPWEpO3ZhciBDPWUuZGVmYXVsdFZhbHVlJiZlLmRlZmF1bHRWYWx1ZSE9PWgmJnRoaXMub3B0aW9ucy51cGRhdGVNaXNzaW5nO2lmKE98fFR8fEMpe2lmKHRoaXMubG9nZ2VyLmxvZyhDPyJ1cGRhdGVLZXkiOiJtaXNzaW5nS2V5IixjLHUsYSxDP2UuZGVmYXVsdFZhbHVlOmgpLG8pe3ZhciBMPXRoaXMucmVzb2x2ZShhLGp0KHt9LGUse2tleVNlcGFyYXRvcjohMX0pKTtMJiZMLnJlcyYmdGhpcy5sb2dnZXIud2FybigiU2VlbXMgdGhlIGxvYWRlZCB0cmFuc2xhdGlvbnMgd2VyZSBpbiBmbGF0IEpTT04gZm9ybWF0IGluc3RlYWQgb2YgbmVzdGVkLiBFaXRoZXIgc2V0IGtleVNlcGFyYXRvcjogZmFsc2Ugb24gaW5pdCBvciBtYWtlIHN1cmUgeW91ciB0cmFuc2xhdGlvbnMgYXJlIHB1Ymxpc2hlZCBpbiBuZXN0ZWQgZm9ybWF0LiIpfXZhciBSPVtdLFA9dGhpcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nLGUubG5nfHx0aGlzLmxhbmd1YWdlKTtpZigiZmFsbGJhY2siPT09dGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nVG8mJlAmJlBbMF0pZm9yKHZhciBOPTA7TjxQLmxlbmd0aDtOKyspUi5wdXNoKFBbTl0pO2Vsc2UiYWxsIj09PXRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvP1I9dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShlLmxuZ3x8dGhpcy5sYW5ndWFnZSk6Ui5wdXNoKGUubG5nfHx0aGlzLmxhbmd1YWdlKTt2YXIgST1mdW5jdGlvbih0LG4pe3Iub3B0aW9ucy5taXNzaW5nS2V5SGFuZGxlcj9yLm9wdGlvbnMubWlzc2luZ0tleUhhbmRsZXIodCx1LG4sQz9lLmRlZmF1bHRWYWx1ZTpoLEMsZSk6ci5iYWNrZW5kQ29ubmVjdG9yJiZyLmJhY2tlbmRDb25uZWN0b3Iuc2F2ZU1pc3NpbmcmJnIuYmFja2VuZENvbm5lY3Rvci5zYXZlTWlzc2luZyh0LHUsbixDP2UuZGVmYXVsdFZhbHVlOmgsQyxlKSxyLmVtaXQoIm1pc3NpbmdLZXkiLHQsdSxuLGgpfTtpZih0aGlzLm9wdGlvbnMuc2F2ZU1pc3Npbmcpe3ZhciBfPXZvaWQgMCE9PWUuY291bnQmJiJzdHJpbmciIT10eXBlb2YgZS5jb3VudDt0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdQbHVyYWxzJiZfP1IuZm9yRWFjaChmdW5jdGlvbih0KXtyLnBsdXJhbFJlc29sdmVyLmdldFBsdXJhbEZvcm1zT2ZLZXkodCxhKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBJKFt0XSxlKX0pfSk6SShSLGEpfX1oPXRoaXMuZXh0ZW5kVHJhbnNsYXRpb24oaCx0LGUscCxuKSxPJiZoPT09YSYmdGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvTWlzc2luZ0tleSYmKGg9IiIuY29uY2F0KHUsIjoiKS5jb25jYXQoYSkpLE8mJnRoaXMub3B0aW9ucy5wYXJzZU1pc3NpbmdLZXlIYW5kbGVyJiYoaD10aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcihoKSl9cmV0dXJuIGh9fSx7a2V5OiJleHRlbmRUcmFuc2xhdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaT10aGlzO2lmKHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LnBhcnNlKXQ9dGhpcy5pMThuRm9ybWF0LnBhcnNlKHQsbixyLnVzZWRMbmcsci51c2VkTlMsci51c2VkS2V5LHtyZXNvbHZlZDpyfSk7ZWxzZSBpZighbi5za2lwSW50ZXJwb2xhdGlvbil7bi5pbnRlcnBvbGF0aW9uJiZ0aGlzLmludGVycG9sYXRvci5pbml0KGp0KHt9LG4se2ludGVycG9sYXRpb246anQoe30sdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24sbi5pbnRlcnBvbGF0aW9uKX0pKTt2YXIgYSxzPW4uaW50ZXJwb2xhdGlvbiYmbi5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlc3x8dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzO2lmKHMpe3ZhciB1PXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7YT11JiZ1Lmxlbmd0aH12YXIgYz1uLnJlcGxhY2UmJiJzdHJpbmciIT10eXBlb2Ygbi5yZXBsYWNlP24ucmVwbGFjZTpuO2lmKHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMmJihjPWp0KHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMsYykpLHQ9dGhpcy5pbnRlcnBvbGF0b3IuaW50ZXJwb2xhdGUodCxjLG4ubG5nfHx0aGlzLmxhbmd1YWdlLG4pLHMpe3ZhciBsPXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7YTwobCYmbC5sZW5ndGgpJiYobi5uZXN0PSExKX0hMSE9PW4ubmVzdCYmKHQ9dGhpcy5pbnRlcnBvbGF0b3IubmVzdCh0LGZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkodCksYT0wO2E8dDthKyspclthXT1hcmd1bWVudHNbYV07cmV0dXJuIG8mJm9bMF09PT1yWzBdJiYhbi5jb250ZXh0PyhpLmxvZ2dlci53YXJuKCJJdCBzZWVtcyB5b3UgYXJlIG5lc3RpbmcgcmVjdXJzaXZlbHkga2V5OiAiLmNvbmNhdChyWzBdLCIgaW4ga2V5OiAiKS5jb25jYXQoZVswXSkpLG51bGwpOmkudHJhbnNsYXRlLmFwcGx5KGksci5jb25jYXQoW2VdKSl9LG4pKSxuLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLnJlc2V0KCl9dmFyIGY9bi5wb3N0UHJvY2Vzc3x8dGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzLHA9InN0cmluZyI9PXR5cGVvZiBmP1tmXTpmO3JldHVybiBudWxsIT10JiZwJiZwLmxlbmd0aCYmITEhPT1uLmFwcGx5UG9zdFByb2Nlc3NvciYmKHQ9S3QuaGFuZGxlKHAsdCxlLHRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzUGFzc1Jlc29sdmVkP2p0KHtpMThuUmVzb2x2ZWQ6cn0sbik6bix0aGlzKSksdH19LHtrZXk6InJlc29sdmUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYT10aGlzLHM9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSx0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoIWEuaXNWYWxpZExvb2t1cChlKSl7dmFyIHU9YS5leHRyYWN0RnJvbUtleSh0LHMpLGM9dS5rZXk7bj1jO3ZhciBsPXUubmFtZXNwYWNlczthLm9wdGlvbnMuZmFsbGJhY2tOUyYmKGw9bC5jb25jYXQoYS5vcHRpb25zLmZhbGxiYWNrTlMpKTt2YXIgZj12b2lkIDAhPT1zLmNvdW50JiYic3RyaW5nIiE9dHlwZW9mIHMuY291bnQscD12b2lkIDAhPT1zLmNvbnRleHQmJiJzdHJpbmciPT10eXBlb2Ygcy5jb250ZXh0JiYiIiE9PXMuY29udGV4dCxoPXMubG5ncz9zLmxuZ3M6YS5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShzLmxuZ3x8YS5sYW5ndWFnZSxzLmZhbGxiYWNrTG5nKTtsLmZvckVhY2goZnVuY3Rpb24odCl7YS5pc1ZhbGlkTG9va3VwKGUpfHwoaT10LCFYdFsiIi5jb25jYXQoaFswXSwiLSIpLmNvbmNhdCh0KV0mJmEudXRpbHMmJmEudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlJiYhYS51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UoaSkmJihYdFsiIi5jb25jYXQoaFswXSwiLSIpLmNvbmNhdCh0KV09ITAsYS5sb2dnZXIud2Fybigna2V5ICInLmNvbmNhdChuLCciIGZvciBsYW5ndWFnZXMgIicpLmNvbmNhdChoLmpvaW4oIiwgIiksJyIgd29uXCd0IGdldCByZXNvbHZlZCBhcyBuYW1lc3BhY2UgIicpLmNvbmNhdChpLCciIHdhcyBub3QgeWV0IGxvYWRlZCcpLCJUaGlzIG1lYW5zIHNvbWV0aGluZyBJUyBXUk9ORyBpbiB5b3VyIHNldHVwLiBZb3UgYWNjZXNzIHRoZSB0IGZ1bmN0aW9uIGJlZm9yZSBpMThuZXh0LmluaXQgLyBpMThuZXh0LmxvYWROYW1lc3BhY2UgLyBpMThuZXh0LmNoYW5nZUxhbmd1YWdlIHdhcyBkb25lLiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgb3IgUHJvbWlzZSB0byByZXNvbHZlIGJlZm9yZSBhY2Nlc3NpbmcgaXQhISEiKSksaC5mb3JFYWNoKGZ1bmN0aW9uKG4pe2lmKCFhLmlzVmFsaWRMb29rdXAoZSkpe289bjt2YXIgaSx1LGw9YyxoPVtsXTtpZihhLmkxOG5Gb3JtYXQmJmEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKWEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKGgsYyxuLHQscyk7ZWxzZSBmJiYoaT1hLnBsdXJhbFJlc29sdmVyLmdldFN1ZmZpeChuLHMuY291bnQpKSxmJiZwJiZoLnB1c2gobCtpKSxwJiZoLnB1c2gobCs9IiIuY29uY2F0KGEub3B0aW9ucy5jb250ZXh0U2VwYXJhdG9yKS5jb25jYXQocy5jb250ZXh0KSksZiYmaC5wdXNoKGwrPWkpO2Zvcig7dT1oLnBvcCgpOylhLmlzVmFsaWRMb29rdXAoZSl8fChyPXUsZT1hLmdldFJlc291cmNlKG4sdCx1LHMpKX19KSl9KX19KSx7cmVzOmUsdXNlZEtleTpuLGV4YWN0VXNlZEtleTpyLHVzZWRMbmc6byx1c2VkTlM6aX19fSx7a2V5OiJpc1ZhbGlkTG9va3VwIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4hKHZvaWQgMD09PXR8fCF0aGlzLm9wdGlvbnMucmV0dXJuTnVsbCYmbnVsbD09PXR8fCF0aGlzLm9wdGlvbnMucmV0dXJuRW1wdHlTdHJpbmcmJiIiPT09dCl9fSx7a2V5OiJnZXRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fTtyZXR1cm4gdGhpcy5pMThuRm9ybWF0JiZ0aGlzLmkxOG5Gb3JtYXQuZ2V0UmVzb3VyY2U/dGhpcy5pMThuRm9ybWF0LmdldFJlc291cmNlKHQsZSxuLHIpOnRoaXMucmVzb3VyY2VTdG9yZS5nZXRSZXNvdXJjZSh0LGUsbixyKX19XSksZX0oKTtmdW5jdGlvbiBRdCh0KXtyZXR1cm4gdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpfXZhciBadD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7VHQodGhpcyx0KSx0aGlzLm9wdGlvbnM9ZSx0aGlzLndoaXRlbGlzdD10aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5nc3x8ITEsdGhpcy5zdXBwb3J0ZWRMbmdzPXRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHwhMSx0aGlzLmxvZ2dlcj1fdC5jcmVhdGUoImxhbmd1YWdlVXRpbHMiKX1yZXR1cm4gQXQodCxbe2tleToiZ2V0U2NyaXB0UGFydEZyb21Db2RlIix2YWx1ZTpmdW5jdGlvbih0KXtpZighdHx8dC5pbmRleE9mKCItIik8MClyZXR1cm4gbnVsbDt2YXIgZT10LnNwbGl0KCItIik7cmV0dXJuIDI9PT1lLmxlbmd0aD9udWxsOihlLnBvcCgpLCJ4Ij09PWVbZS5sZW5ndGgtMV0udG9Mb3dlckNhc2UoKT9udWxsOnRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKGUuam9pbigiLSIpKSl9fSx7a2V5OiJnZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHQuaW5kZXhPZigiLSIpPDApcmV0dXJuIHQ7dmFyIGU9dC5zcGxpdCgiLSIpO3JldHVybiB0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlWzBdKX19LHtrZXk6ImZvcm1hdExhbmd1YWdlQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0JiZ0LmluZGV4T2YoIi0iKT4tMSl7dmFyIGU9WyJoYW5zIiwiaGFudCIsImxhdG4iLCJjeXJsIiwiY2FucyIsIm1vbmciLCJhcmFiIl0sbj10LnNwbGl0KCItIik7cmV0dXJuIHRoaXMub3B0aW9ucy5sb3dlckNhc2VMbmc/bj1uLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC50b0xvd2VyQ2FzZSgpfSk6Mj09PW4ubGVuZ3RoPyhuWzBdPW5bMF0udG9Mb3dlckNhc2UoKSxuWzFdPW5bMV0udG9VcHBlckNhc2UoKSxlLmluZGV4T2YoblsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKG5bMV09UXQoblsxXS50b0xvd2VyQ2FzZSgpKSkpOjM9PT1uLmxlbmd0aCYmKG5bMF09blswXS50b0xvd2VyQ2FzZSgpLDI9PT1uWzFdLmxlbmd0aCYmKG5bMV09blsxXS50b1VwcGVyQ2FzZSgpKSwic2duIiE9PW5bMF0mJjI9PT1uWzJdLmxlbmd0aCYmKG5bMl09blsyXS50b1VwcGVyQ2FzZSgpKSxlLmluZGV4T2YoblsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKG5bMV09UXQoblsxXS50b0xvd2VyQ2FzZSgpKSksZS5pbmRleE9mKG5bMl0udG9Mb3dlckNhc2UoKSk+LTEmJihuWzJdPVF0KG5bMl0udG9Mb3dlckNhc2UoKSkpKSxuLmpvaW4oIi0iKX1yZXR1cm4gdGhpcy5vcHRpb25zLmNsZWFuQ29kZXx8dGhpcy5vcHRpb25zLmxvd2VyQ2FzZUxuZz90LnRvTG93ZXJDYXNlKCk6dH19LHtrZXk6ImlzV2hpdGVsaXN0ZWQiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxvZ2dlci5kZXByZWNhdGUoImxhbmd1YWdlVXRpbHMuaXNXaGl0ZWxpc3RlZCIsJ2Z1bmN0aW9uICJpc1doaXRlbGlzdGVkIiB3aWxsIGJlIHJlbmFtZWQgdG8gImlzU3VwcG9ydGVkQ29kZSIgaW4gdGhlIG5leHQgbWFqb3IgLSBwbGVhc2UgbWFrZSBzdXJlIHRvIHJlbmFtZSBpdFwncyB1c2FnZSBhc2FwLicpLHRoaXMuaXNTdXBwb3J0ZWRDb2RlKHQpfX0se2tleToiaXNTdXBwb3J0ZWRDb2RlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4oImxhbmd1YWdlT25seSI9PT10aGlzLm9wdGlvbnMubG9hZHx8dGhpcy5vcHRpb25zLm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncykmJih0PXRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCkpLCF0aGlzLnN1cHBvcnRlZExuZ3N8fCF0aGlzLnN1cHBvcnRlZExuZ3MubGVuZ3RofHx0aGlzLnN1cHBvcnRlZExuZ3MuaW5kZXhPZih0KT4tMX19LHtrZXk6ImdldEJlc3RNYXRjaEZyb21Db2RlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzO3JldHVybiB0Pyh0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoIWUpe3ZhciByPW4uZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpO24ub3B0aW9ucy5zdXBwb3J0ZWRMbmdzJiYhbi5pc1N1cHBvcnRlZENvZGUocil8fChlPXIpfX0pLCFlJiZ0aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5ncyYmdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCFlKXt2YXIgcj1uLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpO2lmKG4uaXNTdXBwb3J0ZWRDb2RlKHIpKXJldHVybiBlPXI7ZT1uLm9wdGlvbnMuc3VwcG9ydGVkTG5ncy5maW5kKGZ1bmN0aW9uKHQpe2lmKDA9PT10LmluZGV4T2YocikpcmV0dXJuIHR9KX19KSxlfHwoZT10aGlzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKVswXSksZSk6bnVsbH19LHtrZXk6ImdldEZhbGxiYWNrQ29kZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYoIXQpcmV0dXJuW107aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXQoZSkpLCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSwiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseSh0KSlyZXR1cm4gdDtpZighZSlyZXR1cm4gdC5kZWZhdWx0fHxbXTt2YXIgbj10W2VdO3JldHVybiBufHwobj10W3RoaXMuZ2V0U2NyaXB0UGFydEZyb21Db2RlKGUpXSksbnx8KG49dFt0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlKV0pLG58fChuPXRbdGhpcy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShlKV0pLG58fChuPXQuZGVmYXVsdCksbnx8W119fSx7a2V5OiJ0b1Jlc29sdmVIaWVyYXJjaHkiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPXRoaXMuZ2V0RmFsbGJhY2tDb2RlcyhlfHx0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmd8fFtdLHQpLG89W10saT1mdW5jdGlvbih0KXt0JiYobi5pc1N1cHBvcnRlZENvZGUodCk/by5wdXNoKHQpOm4ubG9nZ2VyLndhcm4oInJlamVjdGluZyBsYW5ndWFnZSBjb2RlIG5vdCBmb3VuZCBpbiBzdXBwb3J0ZWRMbmdzOiAiLmNvbmNhdCh0KSkpfTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJnQuaW5kZXhPZigiLSIpPi0xPygibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiZpKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSwibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiYiY3VycmVudE9ubHkiIT09dGhpcy5vcHRpb25zLmxvYWQmJmkodGhpcy5nZXRTY3JpcHRQYXJ0RnJvbUNvZGUodCkpLCJjdXJyZW50T25seSIhPT10aGlzLm9wdGlvbnMubG9hZCYmaSh0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKSk6InN0cmluZyI9PXR5cGVvZiB0JiZpKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSxyLmZvckVhY2goZnVuY3Rpb24odCl7by5pbmRleE9mKHQpPDAmJmkobi5mb3JtYXRMYW5ndWFnZUNvZGUodCkpfSksb319XSksdH0oKSx0ZT1be2xuZ3M6WyJhY2giLCJhayIsImFtIiwiYXJuIiwiYnIiLCJmaWwiLCJndW4iLCJsbiIsIm1mZSIsIm1nIiwibWkiLCJvYyIsInB0IiwicHQtQlIiLCJ0ZyIsInRpIiwidHIiLCJ1eiIsIndhIl0sbnI6WzEsMl0sZmM6MX0se2xuZ3M6WyJhZiIsImFuIiwiYXN0IiwiYXoiLCJiZyIsImJuIiwiY2EiLCJkYSIsImRlIiwiZGV2IiwiZWwiLCJlbiIsImVvIiwiZXMiLCJldCIsImV1IiwiZmkiLCJmbyIsImZ1ciIsImZ5IiwiZ2wiLCJndSIsImhhIiwiaGkiLCJodSIsImh5IiwiaWEiLCJpdCIsImtuIiwia3UiLCJsYiIsIm1haSIsIm1sIiwibW4iLCJtciIsIm5haCIsIm5hcCIsIm5iIiwibmUiLCJubCIsIm5uIiwibm8iLCJuc28iLCJwYSIsInBhcCIsInBtcyIsInBzIiwicHQtUFQiLCJybSIsInNjbyIsInNlIiwic2kiLCJzbyIsInNvbiIsInNxIiwic3YiLCJzdyIsInRhIiwidGUiLCJ0ayIsInVyIiwieW8iXSxucjpbMSwyXSxmYzoyfSx7bG5nczpbImF5IiwiYm8iLCJjZ2ciLCJmYSIsImh0IiwiaWQiLCJqYSIsImpibyIsImthIiwia2siLCJrbSIsImtvIiwia3kiLCJsbyIsIm1zIiwic2FoIiwic3UiLCJ0aCIsInR0IiwidWciLCJ2aSIsIndvIiwiemgiXSxucjpbMV0sZmM6M30se2xuZ3M6WyJiZSIsImJzIiwiY25yIiwiZHoiLCJociIsInJ1Iiwic3IiLCJ1ayJdLG5yOlsxLDIsNV0sZmM6NH0se2xuZ3M6WyJhciJdLG5yOlswLDEsMiwzLDExLDEwMF0sZmM6NX0se2xuZ3M6WyJjcyIsInNrIl0sbnI6WzEsMiw1XSxmYzo2fSx7bG5nczpbImNzYiIsInBsIl0sbnI6WzEsMiw1XSxmYzo3fSx7bG5nczpbImN5Il0sbnI6WzEsMiwzLDhdLGZjOjh9LHtsbmdzOlsiZnIiXSxucjpbMSwyXSxmYzo5fSx7bG5nczpbImdhIl0sbnI6WzEsMiwzLDcsMTFdLGZjOjEwfSx7bG5nczpbImdkIl0sbnI6WzEsMiwzLDIwXSxmYzoxMX0se2xuZ3M6WyJpcyJdLG5yOlsxLDJdLGZjOjEyfSx7bG5nczpbImp2Il0sbnI6WzAsMV0sZmM6MTN9LHtsbmdzOlsia3ciXSxucjpbMSwyLDMsNF0sZmM6MTR9LHtsbmdzOlsibHQiXSxucjpbMSwyLDEwXSxmYzoxNX0se2xuZ3M6WyJsdiJdLG5yOlsxLDIsMF0sZmM6MTZ9LHtsbmdzOlsibWsiXSxucjpbMSwyXSxmYzoxN30se2xuZ3M6WyJtbmsiXSxucjpbMCwxLDJdLGZjOjE4fSx7bG5nczpbIm10Il0sbnI6WzEsMiwxMSwyMF0sZmM6MTl9LHtsbmdzOlsib3IiXSxucjpbMiwxXSxmYzoyfSx7bG5nczpbInJvIl0sbnI6WzEsMiwyMF0sZmM6MjB9LHtsbmdzOlsic2wiXSxucjpbNSwxLDIsM10sZmM6MjF9LHtsbmdzOlsiaGUiLCJpdyJdLG5yOlsxLDIsMjAsMjFdLGZjOjIyfV0sZWU9ezE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PjEpfSwyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMSE9dCl9LDM6ZnVuY3Rpb24odCl7cmV0dXJuIDB9LDQ6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwPT0xJiZ0JTEwMCE9MTE/MDp0JTEwPj0yJiZ0JTEwPD00JiYodCUxMDA8MTB8fHQlMTAwPj0yMCk/MToyKX0sNTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDA9PXQ/MDoxPT10PzE6Mj09dD8yOnQlMTAwPj0zJiZ0JTEwMDw9MTA/Mzp0JTEwMD49MTE/NDo1KX0sNjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDp0Pj0yJiZ0PD00PzE6Mil9LDc6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6dCUxMD49MiYmdCUxMDw9NCYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDg6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOjghPXQmJjExIT10PzI6Myl9LDk6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0Pj0yKX0sMTA6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOnQ8Nz8yOnQ8MTE/Mzo0KX0sMTE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10fHwxMT09dD8wOjI9PXR8fDEyPT10PzE6dD4yJiZ0PDIwPzI6Myl9LDEyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMCE9MXx8dCUxMDA9PTExKX0sMTM6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigwIT09dCl9LDE0OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjI9PXQ/MTozPT10PzI6Myl9LDE1OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6dCUxMD49MiYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDE2OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6MCE9PXQ/MToyKX0sMTc6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10fHx0JTEwPT0xJiZ0JTEwMCE9MTE/MDoxKX0sMTg6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigwPT10PzA6MT09dD8xOjIpfSwxOTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDowPT10fHx0JTEwMD4xJiZ0JTEwMDwxMT8xOnQlMTAwPjEwJiZ0JTEwMDwyMD8yOjMpfSwyMDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDowPT10fHx0JTEwMD4wJiZ0JTEwMDwyMD8xOjIpfSwyMTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTAwPT0xPzE6dCUxMDA9PTI/Mjp0JTEwMD09M3x8dCUxMDA9PTQ/MzowKX0sMjI6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOih0PDB8fHQ+MTApJiZ0JTEwPT0wPzI6Myl9fTt2YXIgbmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O1R0KHRoaXMsdCksdGhpcy5sYW5ndWFnZVV0aWxzPWUsdGhpcy5vcHRpb25zPXIsdGhpcy5sb2dnZXI9X3QuY3JlYXRlKCJwbHVyYWxSZXNvbHZlciIpLHRoaXMucnVsZXM9KG49e30sdGUuZm9yRWFjaChmdW5jdGlvbih0KXt0LmxuZ3MuZm9yRWFjaChmdW5jdGlvbihlKXtuW2VdPXtudW1iZXJzOnQubnIscGx1cmFsczplZVt0LmZjXX19KX0pLG4pfXJldHVybiBBdCh0LFt7a2V5OiJhZGRSdWxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMucnVsZXNbdF09ZX19LHtrZXk6ImdldFJ1bGUiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJ1bGVzW3RdfHx0aGlzLnJ1bGVzW3RoaXMubGFuZ3VhZ2VVdGlscy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KV19fSx7a2V5OiJuZWVkc1BsdXJhbCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRSdWxlKHQpO3JldHVybiBlJiZlLm51bWJlcnMubGVuZ3RoPjF9fSx7a2V5OiJnZXRQbHVyYWxGb3Jtc09mS2V5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1bXSxvPXRoaXMuZ2V0UnVsZSh0KTtyZXR1cm4gbz8oby5udW1iZXJzLmZvckVhY2goZnVuY3Rpb24obyl7dmFyIGk9bi5nZXRTdWZmaXgodCxvKTtyLnB1c2goIiIuY29uY2F0KGUpLmNvbmNhdChpKSl9KSxyKTpyfX0se2tleToiZ2V0U3VmZml4Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj10aGlzLmdldFJ1bGUodCk7aWYocil7dmFyIG89ci5ub0Ficz9yLnBsdXJhbHMoZSk6ci5wbHVyYWxzKE1hdGguYWJzKGUpKSxpPXIubnVtYmVyc1tvXTt0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXgmJjI9PT1yLm51bWJlcnMubGVuZ3RoJiYxPT09ci5udW1iZXJzWzBdJiYoMj09PWk/aT0icGx1cmFsIjoxPT09aSYmKGk9IiIpKTt2YXIgYT1mdW5jdGlvbigpe3JldHVybiBuLm9wdGlvbnMucHJlcGVuZCYmaS50b1N0cmluZygpP24ub3B0aW9ucy5wcmVwZW5kK2kudG9TdHJpbmcoKTppLnRvU3RyaW5nKCl9O3JldHVybiJ2MSI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04/MT09PWk/IiI6Im51bWJlciI9PXR5cGVvZiBpPyJfcGx1cmFsXyIuY29uY2F0KGkudG9TdHJpbmcoKSk6YSgpOiJ2MiI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04/YSgpOnRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCYmMj09PXIubnVtYmVycy5sZW5ndGgmJjE9PT1yLm51bWJlcnNbMF0/YSgpOnRoaXMub3B0aW9ucy5wcmVwZW5kJiZvLnRvU3RyaW5nKCk/dGhpcy5vcHRpb25zLnByZXBlbmQrby50b1N0cmluZygpOm8udG9TdHJpbmcoKX1yZXR1cm4gdGhpcy5sb2dnZXIud2Fybigibm8gcGx1cmFsIHJ1bGUgZm91bmQgZm9yOiAiLmNvbmNhdCh0KSksIiJ9fV0pLHR9KCkscmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O1R0KHRoaXMsdCksdGhpcy5sb2dnZXI9X3QuY3JlYXRlKCJpbnRlcnBvbGF0b3IiKSx0aGlzLm9wdGlvbnM9ZSx0aGlzLmZvcm1hdD1lLmludGVycG9sYXRpb24mJmUuaW50ZXJwb2xhdGlvbi5mb3JtYXR8fGZ1bmN0aW9uKHQpe3JldHVybiB0fSx0aGlzLmluaXQoZSl9cmV0dXJuIEF0KHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O3QuaW50ZXJwb2xhdGlvbnx8KHQuaW50ZXJwb2xhdGlvbj17ZXNjYXBlVmFsdWU6ITB9KTt2YXIgZT10LmludGVycG9sYXRpb247dGhpcy5lc2NhcGU9dm9pZCAwIT09ZS5lc2NhcGU/ZS5lc2NhcGU6WXQsdGhpcy5lc2NhcGVWYWx1ZT12b2lkIDA9PT1lLmVzY2FwZVZhbHVlfHxlLmVzY2FwZVZhbHVlLHRoaXMudXNlUmF3VmFsdWVUb0VzY2FwZT12b2lkIDAhPT1lLnVzZVJhd1ZhbHVlVG9Fc2NhcGUmJmUudXNlUmF3VmFsdWVUb0VzY2FwZSx0aGlzLnByZWZpeD1lLnByZWZpeD9XdChlLnByZWZpeCk6ZS5wcmVmaXhFc2NhcGVkfHwie3siLHRoaXMuc3VmZml4PWUuc3VmZml4P1d0KGUuc3VmZml4KTplLnN1ZmZpeEVzY2FwZWR8fCJ9fSIsdGhpcy5mb3JtYXRTZXBhcmF0b3I9ZS5mb3JtYXRTZXBhcmF0b3I/ZS5mb3JtYXRTZXBhcmF0b3I6ZS5mb3JtYXRTZXBhcmF0b3J8fCIsIix0aGlzLnVuZXNjYXBlUHJlZml4PWUudW5lc2NhcGVTdWZmaXg/IiI6ZS51bmVzY2FwZVByZWZpeHx8Ii0iLHRoaXMudW5lc2NhcGVTdWZmaXg9dGhpcy51bmVzY2FwZVByZWZpeD8iIjplLnVuZXNjYXBlU3VmZml4fHwiIix0aGlzLm5lc3RpbmdQcmVmaXg9ZS5uZXN0aW5nUHJlZml4P1d0KGUubmVzdGluZ1ByZWZpeCk6ZS5uZXN0aW5nUHJlZml4RXNjYXBlZHx8V3QoIiR0KCIpLHRoaXMubmVzdGluZ1N1ZmZpeD1lLm5lc3RpbmdTdWZmaXg/V3QoZS5uZXN0aW5nU3VmZml4KTplLm5lc3RpbmdTdWZmaXhFc2NhcGVkfHxXdCgiKSIpLHRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I9ZS5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcj9lLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yOmUubmVzdGluZ09wdGlvbnNTZXBhcmF0b3J8fCIsIix0aGlzLm1heFJlcGxhY2VzPWUubWF4UmVwbGFjZXM/ZS5tYXhSZXBsYWNlczoxZTMsdGhpcy5hbHdheXNGb3JtYXQ9dm9pZCAwIT09ZS5hbHdheXNGb3JtYXQmJmUuYWx3YXlzRm9ybWF0LHRoaXMucmVzZXRSZWdFeHAoKX19LHtrZXk6InJlc2V0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucyYmdGhpcy5pbml0KHRoaXMub3B0aW9ucyl9fSx7a2V5OiJyZXNldFJlZ0V4cCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0iIi5jb25jYXQodGhpcy5wcmVmaXgsIiguKz8pIikuY29uY2F0KHRoaXMuc3VmZml4KTt0aGlzLnJlZ2V4cD1uZXcgUmVnRXhwKHQsImciKTt2YXIgZT0iIi5jb25jYXQodGhpcy5wcmVmaXgpLmNvbmNhdCh0aGlzLnVuZXNjYXBlUHJlZml4LCIoLis/KSIpLmNvbmNhdCh0aGlzLnVuZXNjYXBlU3VmZml4KS5jb25jYXQodGhpcy5zdWZmaXgpO3RoaXMucmVnZXhwVW5lc2NhcGU9bmV3IFJlZ0V4cChlLCJnIik7dmFyIG49IiIuY29uY2F0KHRoaXMubmVzdGluZ1ByZWZpeCwiKC4rPykiKS5jb25jYXQodGhpcy5uZXN0aW5nU3VmZml4KTt0aGlzLm5lc3RpbmdSZWdleHA9bmV3IFJlZ0V4cChuLCJnIil9fSx7a2V5OiJpbnRlcnBvbGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIG8saSxhLHM9dGhpcyx1PXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24mJnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXN8fHt9O2Z1bmN0aW9uIGModCl7cmV0dXJuIHQucmVwbGFjZSgvXCQvZywiJCQkJCIpfXZhciBsPWZ1bmN0aW9uKHQpe2lmKHQuaW5kZXhPZihzLmZvcm1hdFNlcGFyYXRvcik8MCl7dmFyIG89SHQoZSx1LHQpO3JldHVybiBzLmFsd2F5c0Zvcm1hdD9zLmZvcm1hdChvLHZvaWQgMCxuKTpvfXZhciBpPXQuc3BsaXQocy5mb3JtYXRTZXBhcmF0b3IpLGE9aS5zaGlmdCgpLnRyaW0oKSxjPWkuam9pbihzLmZvcm1hdFNlcGFyYXRvcikudHJpbSgpO3JldHVybiBzLmZvcm1hdChIdChlLHUsYSksYyxuLHIpfTt0aGlzLnJlc2V0UmVnRXhwKCk7dmFyIGY9ciYmci5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXJ8fHRoaXMub3B0aW9ucy5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXIscD1yJiZyLmludGVycG9sYXRpb24mJnIuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXN8fHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcztyZXR1cm5be3JlZ2V4OnRoaXMucmVnZXhwVW5lc2NhcGUsc2FmZVZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBjKHQpfX0se3JlZ2V4OnRoaXMucmVnZXhwLHNhZmVWYWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gcy5lc2NhcGVWYWx1ZT9jKHMuZXNjYXBlKHQpKTpjKHQpfX1dLmZvckVhY2goZnVuY3Rpb24oZSl7Zm9yKGE9MDtvPWUucmVnZXguZXhlYyh0KTspe2lmKHZvaWQgMD09PShpPWwob1sxXS50cmltKCkpKSlpZigiZnVuY3Rpb24iPT10eXBlb2YgZil7dmFyIG49Zih0LG8scik7aT0ic3RyaW5nIj09dHlwZW9mIG4/bjoiIn1lbHNle2lmKHApe2k9b1swXTtjb250aW51ZX1zLmxvZ2dlci53YXJuKCJtaXNzZWQgdG8gcGFzcyBpbiB2YXJpYWJsZSAiLmNvbmNhdChvWzFdLCIgZm9yIGludGVycG9sYXRpbmcgIikuY29uY2F0KHQpKSxpPSIifWVsc2Uic3RyaW5nIj09dHlwZW9mIGl8fHMudXNlUmF3VmFsdWVUb0VzY2FwZXx8KGk9VXQoaSkpO2lmKHQ9dC5yZXBsYWNlKG9bMF0sZS5zYWZlVmFsdWUoaSkpLGUucmVnZXgubGFzdEluZGV4PTAsKythPj1zLm1heFJlcGxhY2VzKWJyZWFrfX0pLHR9fSx7a2V5OiJuZXN0Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbz10aGlzLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGE9anQoe30saSk7ZnVuY3Rpb24gcyh0LGUpe3ZhciBuPXRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I7aWYodC5pbmRleE9mKG4pPDApcmV0dXJuIHQ7dmFyIHI9dC5zcGxpdChuZXcgUmVnRXhwKCIiLmNvbmNhdChuLCJbIF0qeyIpKSksbz0ieyIuY29uY2F0KHJbMV0pO3Q9clswXSxvPShvPXRoaXMuaW50ZXJwb2xhdGUobyxhKSkucmVwbGFjZSgvJy9nLCciJyk7dHJ5e2E9SlNPTi5wYXJzZShvKSxlJiYoYT1qdCh7fSxlLGEpKX1jYXRjaChlKXtyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiZmFpbGVkIHBhcnNpbmcgb3B0aW9ucyBzdHJpbmcgaW4gbmVzdGluZyBmb3Iga2V5ICIuY29uY2F0KHQpLGUpLCIiLmNvbmNhdCh0KS5jb25jYXQobikuY29uY2F0KG8pfXJldHVybiBkZWxldGUgYS5kZWZhdWx0VmFsdWUsdH1mb3IoYS5hcHBseVBvc3RQcm9jZXNzb3I9ITEsZGVsZXRlIGEuZGVmYXVsdFZhbHVlO249dGhpcy5uZXN0aW5nUmVnZXhwLmV4ZWModCk7KXt2YXIgdT1bXSxjPSExO2lmKG5bMF0uaW5jbHVkZXModGhpcy5mb3JtYXRTZXBhcmF0b3IpJiYhL3suKn0vLnRlc3QoblsxXSkpe3ZhciBsPW5bMV0uc3BsaXQodGhpcy5mb3JtYXRTZXBhcmF0b3IpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCl9KTtuWzFdPWwuc2hpZnQoKSx1PWwsYz0hMH1pZigocj1lKHMuY2FsbCh0aGlzLG5bMV0udHJpbSgpLGEpLGEpKSYmblswXT09PXQmJiJzdHJpbmciIT10eXBlb2YgcilyZXR1cm4gcjsic3RyaW5nIiE9dHlwZW9mIHImJihyPVV0KHIpKSxyfHwodGhpcy5sb2dnZXIud2FybigibWlzc2VkIHRvIHJlc29sdmUgIi5jb25jYXQoblsxXSwiIGZvciBuZXN0aW5nICIpLmNvbmNhdCh0KSkscj0iIiksYyYmKHI9dS5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gby5mb3JtYXQodCxlLGkubG5nLGkpfSxyLnRyaW0oKSkpLHQ9dC5yZXBsYWNlKG5bMF0sciksdGhpcy5yZWdleHAubGFzdEluZGV4PTB9cmV0dXJuIHR9fV0pLHR9KCk7dmFyIG9lPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxuLHIpe3ZhciBvLGk9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9O3JldHVybiBUdCh0aGlzLGUpLG89THQodGhpcyxSdChlKS5jYWxsKHRoaXMpKSxWdCYmRHQuY2FsbChDdChvKSksby5iYWNrZW5kPXQsby5zdG9yZT1uLG8uc2VydmljZXM9cixvLmxhbmd1YWdlVXRpbHM9ci5sYW5ndWFnZVV0aWxzLG8ub3B0aW9ucz1pLG8ubG9nZ2VyPV90LmNyZWF0ZSgiYmFja2VuZENvbm5lY3RvciIpLG8uc3RhdGU9e30sby5xdWV1ZT1bXSxvLmJhY2tlbmQmJm8uYmFja2VuZC5pbml0JiZvLmJhY2tlbmQuaW5pdChyLGkuYmFja2VuZCxpKSxvfXJldHVybiBOdChlLER0KSxBdChlLFt7a2V5OiJxdWV1ZUxvYWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPXRoaXMsaT1bXSxhPVtdLHM9W10sdT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciByPSEwO2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgcz0iIi5jb25jYXQodCwifCIpLmNvbmNhdChlKTshbi5yZWxvYWQmJm8uc3RvcmUuaGFzUmVzb3VyY2VCdW5kbGUodCxlKT9vLnN0YXRlW3NdPTI6by5zdGF0ZVtzXTwwfHwoMT09PW8uc3RhdGVbc10/YS5pbmRleE9mKHMpPDAmJmEucHVzaChzKTooby5zdGF0ZVtzXT0xLHI9ITEsYS5pbmRleE9mKHMpPDAmJmEucHVzaChzKSxpLmluZGV4T2Yocyk8MCYmaS5wdXNoKHMpLHUuaW5kZXhPZihlKTwwJiZ1LnB1c2goZSkpKX0pLHJ8fHMucHVzaCh0KX0pLChpLmxlbmd0aHx8YS5sZW5ndGgpJiZ0aGlzLnF1ZXVlLnB1c2goe3BlbmRpbmc6YSxsb2FkZWQ6e30sZXJyb3JzOltdLGNhbGxiYWNrOnJ9KSx7dG9Mb2FkOmkscGVuZGluZzphLHRvTG9hZExhbmd1YWdlczpzLHRvTG9hZE5hbWVzcGFjZXM6dX19fSx7a2V5OiJsb2FkZWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LnNwbGl0KCJ8Iiksbz1yWzBdLGk9clsxXTtlJiZ0aGlzLmVtaXQoImZhaWxlZExvYWRpbmciLG8saSxlKSxuJiZ0aGlzLnN0b3JlLmFkZFJlc291cmNlQnVuZGxlKG8saSxuKSx0aGlzLnN0YXRlW3RdPWU/LTE6Mjt2YXIgYT17fTt0aGlzLnF1ZXVlLmZvckVhY2goZnVuY3Rpb24obil7IWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPUJ0KHQsZSxPYmplY3QpLGk9by5vYmosYT1vLms7aVthXT1pW2FdfHxbXSxyJiYoaVthXT1pW2FdLmNvbmNhdChuKSkscnx8aVthXS5wdXNoKG4pfShuLmxvYWRlZCxbb10saSksZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5pbmRleE9mKGUpOy0xIT09bjspdC5zcGxpY2UobiwxKSxuPXQuaW5kZXhPZihlKX0obi5wZW5kaW5nLHQpLGUmJm4uZXJyb3JzLnB1c2goZSksMCE9PW4ucGVuZGluZy5sZW5ndGh8fG4uZG9uZXx8KE9iamVjdC5rZXlzKG4ubG9hZGVkKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2FbdF18fChhW3RdPVtdKSxuLmxvYWRlZFt0XS5sZW5ndGgmJm4ubG9hZGVkW3RdLmZvckVhY2goZnVuY3Rpb24oZSl7YVt0XS5pbmRleE9mKGUpPDAmJmFbdF0ucHVzaChlKX0pfSksbi5kb25lPSEwLG4uZXJyb3JzLmxlbmd0aD9uLmNhbGxiYWNrKG4uZXJyb3JzKTpuLmNhbGxiYWNrKCkpfSksdGhpcy5lbWl0KCJsb2FkZWQiLGEpLHRoaXMucXVldWU9dGhpcy5xdWV1ZS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIXQuZG9uZX0pfX0se2tleToicmVhZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMsbz1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106MCxpPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTozNTAsYT1hcmd1bWVudHMubGVuZ3RoPjU/YXJndW1lbnRzWzVdOnZvaWQgMDtyZXR1cm4gdC5sZW5ndGg/dGhpcy5iYWNrZW5kW25dKHQsZSxmdW5jdGlvbihzLHUpe3MmJnUmJm88NT9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5yZWFkLmNhbGwocix0LGUsbixvKzEsMippLGEpfSxpKTphKHMsdSl9KTphKG51bGwse30pfX0se2tleToicHJlcGFyZUxvYWRpbmciLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fSxvPWFyZ3VtZW50cy5sZW5ndGg+Mz9hcmd1bWVudHNbM106dm9pZCAwO2lmKCF0aGlzLmJhY2tlbmQpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oIk5vIGJhY2tlbmQgd2FzIGFkZGVkIHZpYSBpMThuZXh0LnVzZS4gV2lsbCBub3QgbG9hZCByZXNvdXJjZXMuIiksbyYmbygpOyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeSh0KSksInN0cmluZyI9PXR5cGVvZiBlJiYoZT1bZV0pO3ZhciBpPXRoaXMucXVldWVMb2FkKHQsZSxyLG8pO2lmKCFpLnRvTG9hZC5sZW5ndGgpcmV0dXJuIGkucGVuZGluZy5sZW5ndGh8fG8oKSxudWxsO2kudG9Mb2FkLmZvckVhY2goZnVuY3Rpb24odCl7bi5sb2FkT25lKHQpfSl9fSx7a2V5OiJsb2FkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dGhpcy5wcmVwYXJlTG9hZGluZyh0LGUse30sbil9fSx7a2V5OiJyZWxvYWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt0aGlzLnByZXBhcmVMb2FkaW5nKHQsZSx7cmVsb2FkOiEwfSxuKX19LHtrZXk6ImxvYWRPbmUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06IiIscj10LnNwbGl0KCJ8Iiksbz1yWzBdLGk9clsxXTt0aGlzLnJlYWQobyxpLCJyZWFkIix2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKHIsYSl7ciYmZS5sb2dnZXIud2FybigiIi5jb25jYXQobiwibG9hZGluZyBuYW1lc3BhY2UgIikuY29uY2F0KGksIiBmb3IgbGFuZ3VhZ2UgIikuY29uY2F0KG8sIiBmYWlsZWQiKSxyKSwhciYmYSYmZS5sb2dnZXIubG9nKCIiLmNvbmNhdChuLCJsb2FkZWQgbmFtZXNwYWNlICIpLmNvbmNhdChpLCIgZm9yIGxhbmd1YWdlICIpLmNvbmNhdChvKSxhKSxlLmxvYWRlZCh0LHIsYSl9KX19LHtrZXk6InNhdmVNaXNzaW5nIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+NSYmdm9pZCAwIT09YXJndW1lbnRzWzVdP2FyZ3VtZW50c1s1XTp7fTt0aGlzLnNlcnZpY2VzLnV0aWxzJiZ0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSYmIXRoaXMuc2VydmljZXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlKGUpP3RoaXMubG9nZ2VyLndhcm4oJ2RpZCBub3Qgc2F2ZSBrZXkgIicuY29uY2F0KG4sJyIgYXMgdGhlIG5hbWVzcGFjZSAiJykuY29uY2F0KGUsJyIgd2FzIG5vdCB5ZXQgbG9hZGVkJyksIlRoaXMgbWVhbnMgc29tZXRoaW5nIElTIFdST05HIGluIHlvdXIgc2V0dXAuIFlvdSBhY2Nlc3MgdGhlIHQgZnVuY3Rpb24gYmVmb3JlIGkxOG5leHQuaW5pdCAvIGkxOG5leHQubG9hZE5hbWVzcGFjZSAvIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2Ugd2FzIGRvbmUuIFdhaXQgZm9yIHRoZSBjYWxsYmFjayBvciBQcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGFjY2Vzc2luZyBpdCEhISIpOm51bGwhPW4mJiIiIT09biYmKHRoaXMuYmFja2VuZCYmdGhpcy5iYWNrZW5kLmNyZWF0ZSYmdGhpcy5iYWNrZW5kLmNyZWF0ZSh0LGUsbixyLG51bGwsanQoe30saSx7aXNVcGRhdGU6b30pKSx0JiZ0WzBdJiZ0aGlzLnN0b3JlLmFkZFJlc291cmNlKHRbMF0sZSxuLHIpKX19XSksZX0oKTtmdW5jdGlvbiBpZSgpe3JldHVybntkZWJ1ZzohMSxpbml0SW1tZWRpYXRlOiEwLG5zOlsidHJhbnNsYXRpb24iXSxkZWZhdWx0TlM6WyJ0cmFuc2xhdGlvbiJdLGZhbGxiYWNrTG5nOlsiZGV2Il0sZmFsbGJhY2tOUzohMSx3aGl0ZWxpc3Q6ITEsbm9uRXhwbGljaXRXaGl0ZWxpc3Q6ITEsc3VwcG9ydGVkTG5nczohMSxub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M6ITEsbG9hZDoiYWxsIixwcmVsb2FkOiExLHNpbXBsaWZ5UGx1cmFsU3VmZml4OiEwLGtleVNlcGFyYXRvcjoiLiIsbnNTZXBhcmF0b3I6IjoiLHBsdXJhbFNlcGFyYXRvcjoiXyIsY29udGV4dFNlcGFyYXRvcjoiXyIscGFydGlhbEJ1bmRsZWRMYW5ndWFnZXM6ITEsc2F2ZU1pc3Npbmc6ITEsdXBkYXRlTWlzc2luZzohMSxzYXZlTWlzc2luZ1RvOiJmYWxsYmFjayIsc2F2ZU1pc3NpbmdQbHVyYWxzOiEwLG1pc3NpbmdLZXlIYW5kbGVyOiExLG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcjohMSxwb3N0UHJvY2VzczohMSxwb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZDohMSxyZXR1cm5OdWxsOiEwLHJldHVybkVtcHR5U3RyaW5nOiEwLHJldHVybk9iamVjdHM6ITEsam9pbkFycmF5czohMSxyZXR1cm5lZE9iamVjdEhhbmRsZXI6ITEscGFyc2VNaXNzaW5nS2V5SGFuZGxlcjohMSxhcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk6ITEsYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU6ITEsb3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGU9e307aWYoIm9iamVjdCI9PT1TdCh0WzFdKSYmKGU9dFsxXSksInN0cmluZyI9PXR5cGVvZiB0WzFdJiYoZS5kZWZhdWx0VmFsdWU9dFsxXSksInN0cmluZyI9PXR5cGVvZiB0WzJdJiYoZS50RGVzY3JpcHRpb249dFsyXSksIm9iamVjdCI9PT1TdCh0WzJdKXx8Im9iamVjdCI9PT1TdCh0WzNdKSl7dmFyIG49dFszXXx8dFsyXTtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09blt0XX0pfXJldHVybiBlfSxpbnRlcnBvbGF0aW9uOntlc2NhcGVWYWx1ZTohMCxmb3JtYXQ6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHR9LHByZWZpeDoie3siLHN1ZmZpeDoifX0iLGZvcm1hdFNlcGFyYXRvcjoiLCIsdW5lc2NhcGVQcmVmaXg6Ii0iLG5lc3RpbmdQcmVmaXg6IiR0KCIsbmVzdGluZ1N1ZmZpeDoiKSIsbmVzdGluZ09wdGlvbnNTZXBhcmF0b3I6IiwiLG1heFJlcGxhY2VzOjFlMyxza2lwT25WYXJpYWJsZXM6ITF9fX1mdW5jdGlvbiBhZSh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQubnMmJih0Lm5zPVt0Lm5zXSksInN0cmluZyI9PXR5cGVvZiB0LmZhbGxiYWNrTG5nJiYodC5mYWxsYmFja0xuZz1bdC5mYWxsYmFja0xuZ10pLCJzdHJpbmciPT10eXBlb2YgdC5mYWxsYmFja05TJiYodC5mYWxsYmFja05TPVt0LmZhbGxiYWNrTlNdKSx0LndoaXRlbGlzdCYmKHQud2hpdGVsaXN0JiZ0LndoaXRlbGlzdC5pbmRleE9mKCJjaW1vZGUiKTwwJiYodC53aGl0ZWxpc3Q9dC53aGl0ZWxpc3QuY29uY2F0KFsiY2ltb2RlIl0pKSx0LnN1cHBvcnRlZExuZ3M9dC53aGl0ZWxpc3QpLHQubm9uRXhwbGljaXRXaGl0ZWxpc3QmJih0Lm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncz10Lm5vbkV4cGxpY2l0V2hpdGVsaXN0KSx0LnN1cHBvcnRlZExuZ3MmJnQuc3VwcG9ydGVkTG5ncy5pbmRleE9mKCJjaW1vZGUiKTwwJiYodC5zdXBwb3J0ZWRMbmdzPXQuc3VwcG9ydGVkTG5ncy5jb25jYXQoWyJjaW1vZGUiXSkpLHR9ZnVuY3Rpb24gc2UoKXt9dmFyIHVlPW5ldyhmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIHQsbj1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30scj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtpZihUdCh0aGlzLGUpLHQ9THQodGhpcyxSdChlKS5jYWxsKHRoaXMpKSxWdCYmRHQuY2FsbChDdCh0KSksdC5vcHRpb25zPWFlKG4pLHQuc2VydmljZXM9e30sdC5sb2dnZXI9X3QsdC5tb2R1bGVzPXtleHRlcm5hbDpbXX0sciYmIXQuaXNJbml0aWFsaXplZCYmIW4uaXNDbG9uZSl7aWYoIXQub3B0aW9ucy5pbml0SW1tZWRpYXRlKXJldHVybiB0LmluaXQobixyKSxMdCh0LEN0KHQpKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5pbml0KG4scil9LDApfXJldHVybiB0fXJldHVybiBOdChlLER0KSxBdChlLFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30sbj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtmdW5jdGlvbiByKHQpe3JldHVybiB0PyJmdW5jdGlvbiI9PXR5cGVvZiB0P25ldyB0OnQ6bnVsbH1pZigiZnVuY3Rpb24iPT10eXBlb2YgZSYmKG49ZSxlPXt9KSxlLndoaXRlbGlzdCYmIWUuc3VwcG9ydGVkTG5ncyYmdGhpcy5sb2dnZXIuZGVwcmVjYXRlKCJ3aGl0ZWxpc3QiLCdvcHRpb24gIndoaXRlbGlzdCIgd2lsbCBiZSByZW5hbWVkIHRvICJzdXBwb3J0ZWRMbmdzIiBpbiB0aGUgbmV4dCBtYWpvciAtIHBsZWFzZSBtYWtlIHN1cmUgdG8gcmVuYW1lIHRoaXMgb3B0aW9uIGFzYXAuJyksZS5ub25FeHBsaWNpdFdoaXRlbGlzdCYmIWUubm9uRXhwbGljaXRTdXBwb3J0ZWRMbmdzJiZ0aGlzLmxvZ2dlci5kZXByZWNhdGUoIndoaXRlbGlzdCIsJ29wdGlvbnMgIm5vbkV4cGxpY2l0V2hpdGVsaXN0IiB3aWxsIGJlIHJlbmFtZWQgdG8gIm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncyIgaW4gdGhlIG5leHQgbWFqb3IgLSBwbGVhc2UgbWFrZSBzdXJlIHRvIHJlbmFtZSB0aGlzIG9wdGlvbiBhc2FwLicpLHRoaXMub3B0aW9ucz1qdCh7fSxpZSgpLHRoaXMub3B0aW9ucyxhZShlKSksdGhpcy5mb3JtYXQ9dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0LG58fChuPXNlKSwhdGhpcy5vcHRpb25zLmlzQ2xvbmUpe3RoaXMubW9kdWxlcy5sb2dnZXI/X3QuaW5pdChyKHRoaXMubW9kdWxlcy5sb2dnZXIpLHRoaXMub3B0aW9ucyk6X3QuaW5pdChudWxsLHRoaXMub3B0aW9ucyk7dmFyIG89bmV3IFp0KHRoaXMub3B0aW9ucyk7dGhpcy5zdG9yZT1uZXcgR3QodGhpcy5vcHRpb25zLnJlc291cmNlcyx0aGlzLm9wdGlvbnMpO3ZhciBpPXRoaXMuc2VydmljZXM7aS5sb2dnZXI9X3QsaS5yZXNvdXJjZVN0b3JlPXRoaXMuc3RvcmUsaS5sYW5ndWFnZVV0aWxzPW8saS5wbHVyYWxSZXNvbHZlcj1uZXcgbmUobyx7cHJlcGVuZDp0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yLGNvbXBhdGliaWxpdHlKU09OOnRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTixzaW1wbGlmeVBsdXJhbFN1ZmZpeDp0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXh9KSxpLmludGVycG9sYXRvcj1uZXcgcmUodGhpcy5vcHRpb25zKSxpLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6dGhpcy5oYXNMb2FkZWROYW1lc3BhY2UuYmluZCh0aGlzKX0saS5iYWNrZW5kQ29ubmVjdG9yPW5ldyBvZShyKHRoaXMubW9kdWxlcy5iYWNrZW5kKSxpLnJlc291cmNlU3RvcmUsaSx0aGlzLm9wdGlvbnMpLGkuYmFja2VuZENvbm5lY3Rvci5vbigiKiIsZnVuY3Rpb24oZSl7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkobj4xP24tMTowKSxvPTE7bzxuO28rKylyW28tMV09YXJndW1lbnRzW29dO3QuZW1pdC5hcHBseSh0LFtlXS5jb25jYXQocikpfSksdGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3ImJihpLmxhbmd1YWdlRGV0ZWN0b3I9cih0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3RvciksaS5sYW5ndWFnZURldGVjdG9yLmluaXQoaSx0aGlzLm9wdGlvbnMuZGV0ZWN0aW9uLHRoaXMub3B0aW9ucykpLHRoaXMubW9kdWxlcy5pMThuRm9ybWF0JiYoaS5pMThuRm9ybWF0PXIodGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQpLGkuaTE4bkZvcm1hdC5pbml0JiZpLmkxOG5Gb3JtYXQuaW5pdCh0aGlzKSksdGhpcy50cmFuc2xhdG9yPW5ldyBKdCh0aGlzLnNlcnZpY2VzLHRoaXMub3B0aW9ucyksdGhpcy50cmFuc2xhdG9yLm9uKCIqIixmdW5jdGlvbihlKXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjE/bi0xOjApLG89MTtvPG47bysrKXJbby0xXT1hcmd1bWVudHNbb107dC5lbWl0LmFwcGx5KHQsW2VdLmNvbmNhdChyKSl9KSx0aGlzLm1vZHVsZXMuZXh0ZXJuYWwuZm9yRWFjaChmdW5jdGlvbihlKXtlLmluaXQmJmUuaW5pdCh0KX0pfXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvcnx8dGhpcy5vcHRpb25zLmxuZ3x8dGhpcy5sb2dnZXIud2FybigiaW5pdDogbm8gbGFuZ3VhZ2VEZXRlY3RvciBpcyB1c2VkIGFuZCBubyBsbmcgaXMgZGVmaW5lZCIpO3ZhciBhPVsiZ2V0UmVzb3VyY2UiLCJoYXNSZXNvdXJjZUJ1bmRsZSIsImdldFJlc291cmNlQnVuZGxlIiwiZ2V0RGF0YUJ5TGFuZ3VhZ2UiXTthLmZvckVhY2goZnVuY3Rpb24oZSl7dFtlXT1mdW5jdGlvbigpe3ZhciBuO3JldHVybihuPXQuc3RvcmUpW2VdLmFwcGx5KG4sYXJndW1lbnRzKX19KTt2YXIgcz1bImFkZFJlc291cmNlIiwiYWRkUmVzb3VyY2VzIiwiYWRkUmVzb3VyY2VCdW5kbGUiLCJyZW1vdmVSZXNvdXJjZUJ1bmRsZSJdO3MuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPWZ1bmN0aW9uKCl7dmFyIG47cmV0dXJuKG49dC5zdG9yZSlbZV0uYXBwbHkobixhcmd1bWVudHMpLHR9fSk7dmFyIHU9TXQoKSxjPWZ1bmN0aW9uKCl7dC5jaGFuZ2VMYW5ndWFnZSh0Lm9wdGlvbnMubG5nLGZ1bmN0aW9uKGUscil7dC5pc0luaXRpYWxpemVkPSEwLHQub3B0aW9ucy5pc0Nsb25lfHx0LmxvZ2dlci5sb2coImluaXRpYWxpemVkIix0Lm9wdGlvbnMpLHQuZW1pdCgiaW5pdGlhbGl6ZWQiLHQub3B0aW9ucyksdS5yZXNvbHZlKHIpLG4oZSxyKX0pfTtyZXR1cm4gdGhpcy5vcHRpb25zLnJlc291cmNlc3x8IXRoaXMub3B0aW9ucy5pbml0SW1tZWRpYXRlP2MoKTpzZXRUaW1lb3V0KGMsMCksdX19LHtrZXk6ImxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06c2Uscj1uLG89InN0cmluZyI9PXR5cGVvZiB0P3Q6dGhpcy5sYW5ndWFnZTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHI9dCksIXRoaXMub3B0aW9ucy5yZXNvdXJjZXN8fHRoaXMub3B0aW9ucy5wYXJ0aWFsQnVuZGxlZExhbmd1YWdlcyl7aWYobyYmImNpbW9kZSI9PT1vLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHIoKTt2YXIgaT1bXSxhPWZ1bmN0aW9uKHQpe3QmJmUuc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkodCkuZm9yRWFjaChmdW5jdGlvbih0KXtpLmluZGV4T2YodCk8MCYmaS5wdXNoKHQpfSl9O2lmKG8pYShvKTtlbHNle3ZhciBzPXRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyk7cy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBhKHQpfSl9dGhpcy5vcHRpb25zLnByZWxvYWQmJnRoaXMub3B0aW9ucy5wcmVsb2FkLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGEodCl9KSx0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IubG9hZChpLHRoaXMub3B0aW9ucy5ucyxyKX1lbHNlIHIobnVsbCl9fSx7a2V5OiJyZWxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1NdCgpO3JldHVybiB0fHwodD10aGlzLmxhbmd1YWdlcyksZXx8KGU9dGhpcy5vcHRpb25zLm5zKSxufHwobj1zZSksdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnJlbG9hZCh0LGUsZnVuY3Rpb24odCl7ci5yZXNvbHZlKCksbih0KX0pLHJ9fSx7a2V5OiJ1c2UiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCF0KXRocm93IG5ldyBFcnJvcigiWW91IGFyZSBwYXNzaW5nIGFuIHVuZGVmaW5lZCBtb2R1bGUhIFBsZWFzZSBjaGVjayB0aGUgb2JqZWN0IHlvdSBhcmUgcGFzc2luZyB0byBpMThuZXh0LnVzZSgpIik7aWYoIXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoIllvdSBhcmUgcGFzc2luZyBhIHdyb25nIG1vZHVsZSEgUGxlYXNlIGNoZWNrIHRoZSBvYmplY3QgeW91IGFyZSBwYXNzaW5nIHRvIGkxOG5leHQudXNlKCkiKTtyZXR1cm4iYmFja2VuZCI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMuYmFja2VuZD10KSwoImxvZ2dlciI9PT10LnR5cGV8fHQubG9nJiZ0Lndhcm4mJnQuZXJyb3IpJiYodGhpcy5tb2R1bGVzLmxvZ2dlcj10KSwibGFuZ3VhZ2VEZXRlY3RvciI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3Rvcj10KSwiaTE4bkZvcm1hdCI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdD10KSwicG9zdFByb2Nlc3NvciI9PT10LnR5cGUmJkt0LmFkZFBvc3RQcm9jZXNzb3IodCksIjNyZFBhcnR5Ij09PXQudHlwZSYmdGhpcy5tb2R1bGVzLmV4dGVybmFsLnB1c2godCksdGhpc319LHtrZXk6ImNoYW5nZUxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7dGhpcy5pc0xhbmd1YWdlQ2hhbmdpbmdUbz10O3ZhciByPU10KCk7dGhpcy5lbWl0KCJsYW5ndWFnZUNoYW5naW5nIix0KTt2YXIgbz1mdW5jdGlvbih0KXt2YXIgbz0ic3RyaW5nIj09dHlwZW9mIHQ/dDpuLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0QmVzdE1hdGNoRnJvbUNvZGVzKHQpO28mJihuLmxhbmd1YWdlfHwobi5sYW5ndWFnZT1vLG4ubGFuZ3VhZ2VzPW4uc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkobykpLG4udHJhbnNsYXRvci5sYW5ndWFnZXx8bi50cmFuc2xhdG9yLmNoYW5nZUxhbmd1YWdlKG8pLG4uc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmbi5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmNhY2hlVXNlckxhbmd1YWdlKG8pKSxuLmxvYWRSZXNvdXJjZXMobyxmdW5jdGlvbih0KXshZnVuY3Rpb24odCxvKXtvPyhuLmxhbmd1YWdlPW8sbi5sYW5ndWFnZXM9bi5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShvKSxuLnRyYW5zbGF0b3IuY2hhbmdlTGFuZ3VhZ2Uobyksbi5pc0xhbmd1YWdlQ2hhbmdpbmdUbz12b2lkIDAsbi5lbWl0KCJsYW5ndWFnZUNoYW5nZWQiLG8pLG4ubG9nZ2VyLmxvZygibGFuZ3VhZ2VDaGFuZ2VkIixvKSk6bi5pc0xhbmd1YWdlQ2hhbmdpbmdUbz12b2lkIDAsci5yZXNvbHZlKGZ1bmN0aW9uKCl7cmV0dXJuIG4udC5hcHBseShuLGFyZ3VtZW50cyl9KSxlJiZlKHQsZnVuY3Rpb24oKXtyZXR1cm4gbi50LmFwcGx5KG4sYXJndW1lbnRzKX0pfSh0LG8pfSl9O3JldHVybiB0fHwhdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yfHx0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuYXN5bmM/IXQmJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jP3RoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3Qobyk6byh0KTpvKHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3QoKSkscn19LHtrZXk6ImdldEZpeGVkVCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9ZnVuY3Rpb24gdChlLHIpe3ZhciBvO2lmKCJvYmplY3QiIT09U3Qocikpe2Zvcih2YXIgaT1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KGk+Mj9pLTI6MCkscz0yO3M8aTtzKyspYVtzLTJdPWFyZ3VtZW50c1tzXTtvPW4ub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihbZSxyXS5jb25jYXQoYSkpfWVsc2Ugbz1qdCh7fSxyKTtyZXR1cm4gby5sbmc9by5sbmd8fHQubG5nLG8ubG5ncz1vLmxuZ3N8fHQubG5ncyxvLm5zPW8ubnN8fHQubnMsbi50KGUsbyl9O3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9yLmxuZz10OnIubG5ncz10LHIubnM9ZSxyfX0se2tleToidCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdGhpcy50cmFuc2xhdG9yJiYodD10aGlzLnRyYW5zbGF0b3IpLnRyYW5zbGF0ZS5hcHBseSh0LGFyZ3VtZW50cyl9fSx7a2V5OiJleGlzdHMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHRoaXMudHJhbnNsYXRvciYmKHQ9dGhpcy50cmFuc2xhdG9yKS5leGlzdHMuYXBwbHkodCxhcmd1bWVudHMpfX0se2tleToic2V0RGVmYXVsdE5hbWVzcGFjZSIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLmRlZmF1bHROUz10fX0se2tleToiaGFzTG9hZGVkTmFtZXNwYWNlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCF0aGlzLmlzSW5pdGlhbGl6ZWQpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImhhc0xvYWRlZE5hbWVzcGFjZTogaTE4bmV4dCB3YXMgbm90IGluaXRpYWxpemVkIix0aGlzLmxhbmd1YWdlcyksITE7aWYoIXRoaXMubGFuZ3VhZ2VzfHwhdGhpcy5sYW5ndWFnZXMubGVuZ3RoKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJoYXNMb2FkZWROYW1lc3BhY2U6IGkxOG4ubGFuZ3VhZ2VzIHdlcmUgdW5kZWZpbmVkIG9yIGVtcHR5Iix0aGlzLmxhbmd1YWdlcyksITE7dmFyIHI9dGhpcy5sYW5ndWFnZXNbMF0sbz0hIXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nLGk9dGhpcy5sYW5ndWFnZXNbdGhpcy5sYW5ndWFnZXMubGVuZ3RoLTFdO2lmKCJjaW1vZGUiPT09ci50b0xvd2VyQ2FzZSgpKXJldHVybiEwO3ZhciBhPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnN0YXRlWyIiLmNvbmNhdCh0LCJ8IikuY29uY2F0KG4pXTtyZXR1cm4tMT09PXJ8fDI9PT1yfTtpZihuLnByZWNoZWNrKXt2YXIgcz1uLnByZWNoZWNrKHRoaXMsYSk7aWYodm9pZCAwIT09cylyZXR1cm4gc31yZXR1cm4hIXRoaXMuaGFzUmVzb3VyY2VCdW5kbGUocix0KXx8KCF0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IuYmFja2VuZHx8ISghYShyLHQpfHxvJiYhYShpLHQpKSl9fSx7a2V5OiJsb2FkTmFtZXNwYWNlcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9TXQoKTtyZXR1cm4gdGhpcy5vcHRpb25zLm5zPygic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe24ub3B0aW9ucy5ucy5pbmRleE9mKHQpPDAmJm4ub3B0aW9ucy5ucy5wdXNoKHQpfSksdGhpcy5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uKHQpe3IucmVzb2x2ZSgpLGUmJmUodCl9KSxyKTooZSYmZSgpLFByb21pc2UucmVzb2x2ZSgpKX19LHtrZXk6ImxvYWRMYW5ndWFnZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49TXQoKTsic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSk7dmFyIHI9dGhpcy5vcHRpb25zLnByZWxvYWR8fFtdLG89dC5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHIuaW5kZXhPZih0KTwwfSk7cmV0dXJuIG8ubGVuZ3RoPyh0aGlzLm9wdGlvbnMucHJlbG9hZD1yLmNvbmNhdChvKSx0aGlzLmxvYWRSZXNvdXJjZXMoZnVuY3Rpb24odCl7bi5yZXNvbHZlKCksZSYmZSh0KX0pLG4pOihlJiZlKCksUHJvbWlzZS5yZXNvbHZlKCkpfX0se2tleToiZGlyIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0fHwodD10aGlzLmxhbmd1YWdlcyYmdGhpcy5sYW5ndWFnZXMubGVuZ3RoPjA/dGhpcy5sYW5ndWFnZXNbMF06dGhpcy5sYW5ndWFnZSksIXQpcmV0dXJuInJ0bCI7cmV0dXJuWyJhciIsInNodSIsInNxciIsInNzaCIsInhhYSIsInloZCIsInl1ZCIsImFhbyIsImFiaCIsImFidiIsImFjbSIsImFjcSIsImFjdyIsImFjeCIsImFjeSIsImFkZiIsImFkcyIsImFlYiIsImFlYyIsImFmYiIsImFqcCIsImFwYyIsImFwZCIsImFyYiIsImFycSIsImFycyIsImFyeSIsImFyeiIsImF1eiIsImF2bCIsImF5aCIsImF5bCIsImF5biIsImF5cCIsImJieiIsInBnYSIsImhlIiwiaXciLCJwcyIsInBidCIsInBidSIsInBzdCIsInBycCIsInByZCIsInVnIiwidXIiLCJ5ZGQiLCJ5ZHMiLCJ5aWgiLCJqaSIsInlpIiwiaGJvIiwibWVuIiwieG1uIiwiZmEiLCJqcHIiLCJwZW8iLCJwZXMiLCJwcnMiLCJkdiIsInNhbSJdLmluZGV4T2YodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKT49MD8icnRsIjoibHRyIn19LHtrZXk6ImNyZWF0ZUluc3RhbmNlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxuPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwO3JldHVybiBuZXcgZSh0LG4pfX0se2tleToiY2xvbmVJbnN0YW5jZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnNlLG89anQoe30sdGhpcy5vcHRpb25zLG4se2lzQ2xvbmU6ITB9KSxpPW5ldyBlKG8pLGE9WyJzdG9yZSIsInNlcnZpY2VzIiwibGFuZ3VhZ2UiXTtyZXR1cm4gYS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lbZV09dFtlXX0pLGkuc2VydmljZXM9anQoe30sdGhpcy5zZXJ2aWNlcyksaS5zZXJ2aWNlcy51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOmkuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQoaSl9LGkudHJhbnNsYXRvcj1uZXcgSnQoaS5zZXJ2aWNlcyxpLm9wdGlvbnMpLGkudHJhbnNsYXRvci5vbigiKiIsZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkoZT4xP2UtMTowKSxyPTE7cjxlO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO2kuZW1pdC5hcHBseShpLFt0XS5jb25jYXQobikpfSksaS5pbml0KG8sciksaS50cmFuc2xhdG9yLm9wdGlvbnM9aS5vcHRpb25zLGkudHJhbnNsYXRvci5iYWNrZW5kQ29ubmVjdG9yLnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6aS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZChpKX0saX19XSksZX0oKSksY2U9bigxMzMpLGxlPW4ubihjZSk7ZnVuY3Rpb24gZmUodCxlLG4pe3JldHVybiBlIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09bix0fWZ1bmN0aW9uIHBlKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e30scj1PYmplY3Qua2V5cyhuKTsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmKHI9ci5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhuKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KS5lbnVtZXJhYmxlfSkpKSxyLmZvckVhY2goZnVuY3Rpb24oZSl7ZmUodCxlLG5bZV0pfSl9cmV0dXJuIHR9ZnVuY3Rpb24gaGUodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1mdW5jdGlvbiBkZSh0LGUsbil7dmFyIHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcyxpPWFyZ3VtZW50cyxhPWZ1bmN0aW9uKCl7cj1udWxsLG58fHQuYXBwbHkobyxpKX0scz1uJiYhcjtjbGVhclRpbWVvdXQocikscj1zZXRUaW1lb3V0KGEsZSkscyYmdC5hcHBseShvLGkpfX1mdW5jdGlvbiBnZSh0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5pbmRleE9mKCIjIyMiKT4tMT90LnJlcGxhY2UoLyMjIy9nLCIuIik6dH1mb3IodmFyIG89InN0cmluZyIhPXR5cGVvZiBlP1tdLmNvbmNhdChlKTplLnNwbGl0KCIuIik7by5sZW5ndGg+MTspe2lmKCF0KXJldHVybnt9O3ZhciBpPXIoby5zaGlmdCgpKTshdFtpXSYmbiYmKHRbaV09bmV3IG4pLHQ9dFtpXX1yZXR1cm4gdD97b2JqOnQsazpyKG8uc2hpZnQoKSl9Ont9fWZ1bmN0aW9uIHZlKHQsZSxuKXt2YXIgcj1nZSh0LGUsT2JqZWN0KTtyLm9ialtyLmtdPW59ZnVuY3Rpb24geWUodCxlKXt2YXIgbj1nZSh0LGUpLHI9bi5vYmosbz1uLms7aWYocilyZXR1cm4gcltvXX12YXIgbWU9bmV3IFJlZ0V4cCgie3soLis/KX19IiwiZyIpO2Z1bmN0aW9uIGJlKHQsZSxuKXt2YXIgcixvLGk7Zm9yKDtyPW1lLmV4ZWModCk7KSJzdHJpbmciIT10eXBlb2Yobz1yWzFdLnRyaW0oKSkmJihvPW51bGw9PShpPW8pPyIiOiIiK2kpLG98fChvPSIiKSxvPW8ucmVwbGFjZSgvXCQvZywiJCQkJCIpLHQ9dC5yZXBsYWNlKHJbMF0sZVtvXXx8byksbWUubGFzdEluZGV4PTA7cmV0dXJuIHR9ZnVuY3Rpb24geGUodCxlLG4scixvKXt0cnl7dmFyIGk9bmV3KFhNTEh0dHBSZXF1ZXN0fHxBY3RpdmVYT2JqZWN0KSgiTVNYTUwyLlhNTEhUVFAuMy4wIik7aS5vcGVuKHI/IlBPU1QiOiJHRVQiLHQsMSksZS5jcm9zc0RvbWFpbnx8aS5zZXRSZXF1ZXN0SGVhZGVyKCJYLVJlcXVlc3RlZC1XaXRoIiwiWE1MSHR0cFJlcXVlc3QiKSxlLmF1dGhvcml6ZSYmZS5hcGlLZXkmJmkuc2V0UmVxdWVzdEhlYWRlcigiQXV0aG9yaXphdGlvbiIsZS5hcGlLZXkpLChyfHxlLnNldENvbnRlbnRUeXBlSlNPTikmJmkuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24vanNvbiIpLGkub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aS5yZWFkeVN0YXRlPjMmJm4mJm4oaS5yZXNwb25zZVRleHQsaSl9LGkuc2VuZChKU09OLnN0cmluZ2lmeShyKSl9Y2F0Y2godCl7d2luZG93LmNvbnNvbGUmJmNvbnNvbGUubG9nKHQpfX12YXIgd2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbixyKXshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyx0KSxlJiZlLnByb2plY3RJZD90aGlzLmluaXQobnVsbCxlLHt9LG4pOnRoaXMuaW5pdChudWxsLG4se30sciksdGhpcy50eXBlPSJiYWNrZW5kIn12YXIgZSxuLHI7cmV0dXJuIGU9dCwobj1be2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxyPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwLG89YXJndW1lbnRzLmxlbmd0aD4zP2FyZ3VtZW50c1szXTp2b2lkIDA7dGhpcy5vcHRpb25zPXBlKHt9LHtsb2FkUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL3t7cHJvamVjdElkfX0ve3t2ZXJzaW9ufX0ve3tsbmd9fS97e25zfX0iLHByaXZhdGVQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vcHJpdmF0ZS97e3Byb2plY3RJZH19L3t7dmVyc2lvbn19L3t7bG5nfX0ve3tuc319IixwdWxsUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL3B1bGwve3twcm9qZWN0SWR9fS97e3ZlcnNpb259fS97e2xuZ319L3t7bnN9fSIsZ2V0TGFuZ3VhZ2VzUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL2xhbmd1YWdlcy97e3Byb2plY3RJZH19IixhZGRQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vbWlzc2luZy97e3Byb2plY3RJZH19L3t7dmVyc2lvbn19L3t7bG5nfX0ve3tuc319Iix1cGRhdGVQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vdXBkYXRlL3t7cHJvamVjdElkfX0ve3t2ZXJzaW9ufX0ve3tsbmd9fS97e25zfX0iLHJlZmVyZW5jZUxuZzoiZW4iLGNyb3NzRG9tYWluOiEwLHNldENvbnRlbnRUeXBlSlNPTjohMSx2ZXJzaW9uOiJsYXRlc3QiLHB1bGw6ITEscHJpdmF0ZTohMSx3aGl0ZWxpc3RUaHJlc2hvbGQ6LjksZmFpbExvYWRpbmdPbkVtcHR5SlNPTjohMSxhbGxvd2VkQWRkT3JVcGRhdGVIb3N0czpbImxvY2FsaG9zdCJdfSx0aGlzLm9wdGlvbnMsbiksdGhpcy5zZXJ2aWNlcz10LHRoaXMub3B0aW9ucy5wdWxsJiZjb25zb2xlLndhcm4oImRlcHJlY2F0ZWQ6IHB1bGwgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBhbmQgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggbG9jaXplIHByaXZhdGUgdmVyc2lvbnMiKTt2YXIgaT13aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZTtpPyh0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkPXRoaXMub3B0aW9ucy5hbGxvd2VkQWRkT3JVcGRhdGVIb3N0cy5pbmRleE9mKGkpPi0xLHIuc2F2ZU1pc3NpbmcmJiF0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkJiZ0JiZ0LmxvZ2dlciYmdC5sb2dnZXIud2FybignbG9jaXplLWJhY2tlbmQ6IHdpbGwgbm90IHNhdmUgbWlzc2luZ3MgYmVjYXVzZSB0aGUgaG9zdCAiJy5jb25jYXQoaSwnIiB3YXMgbm90IGluIHRoZSBsaXN0IG9mIGFsbG93ZWRBZGRPclVwZGF0ZUhvc3RzOiAnKS5jb25jYXQodGhpcy5vcHRpb25zLmFsbG93ZWRBZGRPclVwZGF0ZUhvc3RzLmpvaW4oIiwgIiksIiAobWF0Y2hlcyBuZWVkIHRvIGJlIGV4YWN0KS4iKSkpOnRoaXMuaXNBZGRPclVwZGF0ZUFsbG93ZWQ9ITAsImZ1bmN0aW9uIj09dHlwZW9mIG8mJnRoaXMuZ2V0T3B0aW9ucyhmdW5jdGlvbih0LHIpe2lmKHQpcmV0dXJuIG8odCk7ZS5vcHRpb25zLnJlZmVyZW5jZUxuZz1uLnJlZmVyZW5jZUxuZ3x8ci5yZWZlcmVuY2VMbmd8fGUub3B0aW9ucy5yZWZlcmVuY2VMbmcsbyhudWxsLHIpfSksdGhpcy5xdWV1ZWRXcml0ZXM9e30sdGhpcy5kZWJvdW5jZWRQcm9jZXNzPWRlKHRoaXMucHJvY2VzcywxZTQpfX0se2tleToiZ2V0TGFuZ3VhZ2VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1iZSh0aGlzLm9wdGlvbnMuZ2V0TGFuZ3VhZ2VzUGF0aCx7cHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWR9KTt0aGlzLmxvYWRVcmwoZSx7fSx0KX19LHtrZXk6ImdldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5nZXRMYW5ndWFnZXMoZnVuY3Rpb24obixyKXtpZihuKXJldHVybiB0KG4pO3ZhciBvPU9iamVjdC5rZXlzKHIpO2lmKCFvLmxlbmd0aClyZXR1cm4gdChuZXcgRXJyb3IoIndhcyB1bmFibGUgdG8gbG9hZCBsYW5ndWFnZXMgdmlhIEFQSSIpKTt2YXIgaT1vLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiByW2VdLmlzUmVmZXJlbmNlTGFuZ3VhZ2UmJih0PWUpLHR9LCIiKSxhPW8ucmVkdWNlKGZ1bmN0aW9uKHQsbil7dmFyIG89cltuXTtyZXR1cm4gby50cmFuc2xhdGVkW2Uub3B0aW9ucy52ZXJzaW9uXSYmby50cmFuc2xhdGVkW2Uub3B0aW9ucy52ZXJzaW9uXT49ZS5vcHRpb25zLndoaXRlbGlzdFRocmVzaG9sZCYmdC5wdXNoKG4pLHR9LFtdKSxzPW8ucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaW5kZXhPZigiLSIpPi0xfHx0fSwhMSk7dChudWxsLHtmYWxsYmFja0xuZzppLHJlZmVyZW5jZUxuZzppLHdoaXRlbGlzdDphLGxvYWQ6cz8iYWxsIjoibGFuZ3VhZ2VPbmx5In0pfSl9fSx7a2V5OiJyZWFkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHIsbz17fTt0aGlzLm9wdGlvbnMucHJpdmF0ZT8ocj1iZSh0aGlzLm9wdGlvbnMucHJpdmF0ZVBhdGgse2xuZzp0LG5zOmUscHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWQsdmVyc2lvbjp0aGlzLm9wdGlvbnMudmVyc2lvbn0pLG89e2F1dGhvcml6ZTohMH0pOnRoaXMub3B0aW9ucy5wdWxsPyhyPWJlKHRoaXMub3B0aW9ucy5wdWxsUGF0aCx7bG5nOnQsbnM6ZSxwcm9qZWN0SWQ6dGhpcy5vcHRpb25zLnByb2plY3RJZCx2ZXJzaW9uOnRoaXMub3B0aW9ucy52ZXJzaW9ufSksbz17YXV0aG9yaXplOiEwfSk6cj1iZSh0aGlzLm9wdGlvbnMubG9hZFBhdGgse2xuZzp0LG5zOmUscHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWQsdmVyc2lvbjp0aGlzLm9wdGlvbnMudmVyc2lvbn0pLHRoaXMubG9hZFVybChyLG8sbil9fSx7a2V5OiJsb2FkVXJsIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpczt4ZSh0LHBlKHt9LHRoaXMub3B0aW9ucyxlKSxmdW5jdGlvbihlLG8pe2lmKG8uc3RhdHVzPj01MDAmJm8uc3RhdHVzPDYwMClyZXR1cm4gbigiZmFpbGVkIGxvYWRpbmcgIit0LCEwKTtpZihvLnN0YXR1cz49NDAwJiZvLnN0YXR1czw1MDApcmV0dXJuIG4oImZhaWxlZCBsb2FkaW5nICIrdCwhMSk7dmFyIGksYTt0cnl7aT1KU09OLnBhcnNlKGUpfWNhdGNoKGUpe2E9ImZhaWxlZCBwYXJzaW5nICIrdCsiIHRvIGpzb24ifXJldHVybiBhP24oYSwhMSk6ci5vcHRpb25zLmZhaWxMb2FkaW5nT25FbXB0eUpTT04mJiFPYmplY3Qua2V5cyhpKS5sZW5ndGg/bigibG9hZGVkIHJlc3VsdCBlbXB0eSBmb3IgIit0LCExKTp2b2lkIG4obnVsbCxpKX0pfX0se2tleToiY3JlYXRlIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8saSl7dmFyIGE9dGhpcztpZihvfHwobz1mdW5jdGlvbigpe30pLCF0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkKXJldHVybiBvKCJob3N0IGlzIG5vdCBhbGxvd2VkIHRvIGNyZWF0ZSBrZXkuIik7InN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLHQuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0PT09YS5vcHRpb25zLnJlZmVyZW5jZUxuZ30pLmxlbmd0aDwxJiZ0aGlzLnNlcnZpY2VzJiZ0aGlzLnNlcnZpY2VzLmxvZ2dlciYmdGhpcy5zZXJ2aWNlcy5sb2dnZXIud2FybignbG9jaXplLWJhY2tlbmQ6IHdpbGwgbm90IHNhdmUgbWlzc2luZ3MgYmVjYXVzZSB0aGUgcmVmZXJlbmNlIGxhbmd1YWdlICInLmNvbmNhdCh0aGlzLm9wdGlvbnMucmVmZXJlbmNlTG5nLCciIHdhcyBub3QgaW4gdGhlIGxpc3Qgb2YgdG8gc2F2ZSBsYW5ndWFnZXM6ICcpLmNvbmNhdCh0LmpvaW4oIiwgIiksIiAob3BlbiB5b3VyIHNpdGUgaW4gdGhlIHJlZmVyZW5jZSBsYW5ndWFnZSB0byBzYXZlIG1pc3NpbmdzKS4iKSksdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Q9PT1hLm9wdGlvbnMucmVmZXJlbmNlTG5nJiZhLnF1ZXVlLmNhbGwoYSxhLm9wdGlvbnMucmVmZXJlbmNlTG5nLGUsbixyLG8saSl9KX19LHtrZXk6InVwZGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvLGkpe3ZhciBhPXRoaXM7aWYob3x8KG89ZnVuY3Rpb24oKXt9KSwhdGhpcy5pc0FkZE9yVXBkYXRlQWxsb3dlZClyZXR1cm4gbygiaG9zdCBpcyBub3QgYWxsb3dlZCB0byB1cGRhdGUga2V5LiIpO2l8fChpPXt9KSwic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksaS5pc1VwZGF0ZT0hMCx0LmZvckVhY2goZnVuY3Rpb24odCl7dD09PWEub3B0aW9ucy5yZWZlcmVuY2VMbmcmJmEucXVldWUuY2FsbChhLGEub3B0aW9ucy5yZWZlcmVuY2VMbmcsZSxuLHIsbyxpKX0pfX0se2tleToid3JpdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpZigheWUodGhpcy5xdWV1ZWRXcml0ZXMsWyJsb2NrcyIsdCxlXSkpe3ZhciByPWJlKHRoaXMub3B0aW9ucy5hZGRQYXRoLHtsbmc6dCxuczplLHByb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkLHZlcnNpb246dGhpcy5vcHRpb25zLnZlcnNpb259KSxvPWJlKHRoaXMub3B0aW9ucy51cGRhdGVQYXRoLHtsbmc6dCxuczplLHByb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkLHZlcnNpb246dGhpcy5vcHRpb25zLnZlcnNpb259KSxpPXllKHRoaXMucXVldWVkV3JpdGVzLFt0LGVdKTtpZih2ZSh0aGlzLnF1ZXVlZFdyaXRlcyxbdCxlXSxbXSksaS5sZW5ndGgpe3ZlKHRoaXMucXVldWVkV3JpdGVzLFsibG9ja3MiLHQsZV0sITApO3ZhciBhPSExLHM9ITEsdT17fSxjPXt9O2kuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT10Lm9wdGlvbnMmJnQub3B0aW9ucy50RGVzY3JpcHRpb24/e3ZhbHVlOnQuZmFsbGJhY2tWYWx1ZXx8IiIsY29udGV4dDp7dGV4dDp0Lm9wdGlvbnMudERlc2NyaXB0aW9ufX06dC5mYWxsYmFja1ZhbHVlfHwiIjt0Lm9wdGlvbnMmJnQub3B0aW9ucy5pc1VwZGF0ZT8oc3x8KHM9ITApLGNbdC5rZXldPWUpOihhfHwoYT0hMCksdVt0LmtleV09ZSl9KTt2YXIgbD0wO2EmJmwrKyxzJiZsKys7dmFyIGY9ZnVuY3Rpb24oKXstLWx8fCh2ZShuLnF1ZXVlZFdyaXRlcyxbImxvY2tzIix0LGVdLCExKSxpLmZvckVhY2goZnVuY3Rpb24odCl7dC5jYWxsYmFjayYmdC5jYWxsYmFjaygpfSksbi5kZWJvdW5jZWRQcm9jZXNzKHQsZSkpfTtsfHxmKCksYSYmeGUocixwZSh7fSx7YXV0aG9yaXplOiEwfSx0aGlzLm9wdGlvbnMpLGZ1bmN0aW9uKHQsZSl7ZigpfSx1KSxzJiZ4ZShvLHBlKHt9LHthdXRob3JpemU6ITB9LHRoaXMub3B0aW9ucyksZnVuY3Rpb24odCxlKXtmKCl9LGMpfX19fSx7a2V5OiJwcm9jZXNzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7T2JqZWN0LmtleXModGhpcy5xdWV1ZWRXcml0ZXMpLmZvckVhY2goZnVuY3Rpb24oZSl7ImxvY2tzIiE9PWUmJk9iamVjdC5rZXlzKHQucXVldWVkV3JpdGVzW2VdKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3QucXVldWVkV3JpdGVzW2VdW25dLmxlbmd0aCYmdC53cml0ZShlLG4pfSl9KX19LHtrZXk6InF1ZXVlIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8saSl7IWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPWdlKHQsZSxPYmplY3QpLGk9by5vYmosYT1vLms7aVthXT1pW2FdfHxbXSxyJiYoaVthXT1pW2FdLmNvbmNhdChuKSkscnx8aVthXS5wdXNoKG4pfSh0aGlzLnF1ZXVlZFdyaXRlcyxbdCxlXSx7a2V5Om4sZmFsbGJhY2tWYWx1ZTpyfHwiIixjYWxsYmFjazpvLG9wdGlvbnM6aX0pLHRoaXMuZGVib3VuY2VkUHJvY2VzcygpfX1dKSYmaGUoZS5wcm90b3R5cGUsbiksciYmaGUoZSxyKSx0fSgpO3dlLnR5cGU9ImJhY2tlbmQiO3ZhciBrZT13ZSxTZT1uKDQ0KTtmdW5jdGlvbiBFZSgpe3JldHVybihFZT14dCgpKHZ0LmEubWFyayhmdW5jdGlvbiB0KGUpe3JldHVybiB2dC5hLndyYXAoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLG5ldyBrdC5hKGZ1bmN0aW9uKHQpe3VlLmNoYW5nZUxhbmd1YWdlKGUsZnVuY3Rpb24oKXt0KHZvaWQgMCl9KX0pKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19LHQpfSkpKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gamUoKXt2YXIgdDtyZXR1cm4gbXQoKSh0PXVlLnQpLmNhbGwodCx1ZSl9dmFyIFRlPXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBrdC5hKGZ1bmN0aW9uKHQsZSl7dWUudXNlKG5ldyBsZS5hKG51bGwse29yZGVyOlsibmF2aWdhdG9yIl19KSkudXNlKGtlKS5pbml0KHtmYWxsYmFja0xuZzoiZW4iLG5zOlsiZGVmYXVsdCJdLGRlZmF1bHROUzoiZGVmYXVsdCIsYmFja2VuZDp7cHJvamVjdElkOlNlLmxvY2l6ZS5wcm9kdWN0SWQsdmVyc2lvbjpTZS5sb2NpemUudmVyc2lvbixhcGlLZXk6U2UubG9jaXplLmFwaUtleSxyZWZlcmVuY2VMbmc6ImVuIn19LGZ1bmN0aW9uKG4scil7cmV0dXJuIG4/ZShuKTp0KHIpfSl9KX0sY2hhbmdlTGFuZ3VhZ2U6ZnVuY3Rpb24odCl7cmV0dXJuIEVlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZ2V0TGFuZ3VhZ2U6ZnVuY3Rpb24oKXtyZXR1cm4gdWUubGFuZ3VhZ2V9LGdldFQ6amV9LE9lPW4oODMpLEFlPW4ubihPZSksQ2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuPWUuZGF0YTtkKCkodGhpcyx0KSx0aGlzLmRhdGE9bn1yZXR1cm4gdigpKHQsbnVsbCxbe2tleToiY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10scj0xO3I8ZS5sZW5ndGg7cis9MSl7Zm9yKHZhciBvPXt9LGk9MDtpPHQubGVuZ3RoO2krPTEpb1t0W2ldXT1lW3JdW2ldO24ucHVzaChvKX1yZXR1cm4gbn19LHtrZXk6InNwbGl0Q291bnRyaWVzIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdD8iIj09PXR8fCIsIj09PXQ/W106dC5zcGxpdCgiLCIpOltdfX0se2tleToibm9ybWFsaXplUmF3RGF0YSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10scj0wLG89WSgpKHQpO3I8by5sZW5ndGg7cisrKXt2YXIgaSxhPXRbb1tyXV07YS5zaGlmdCgpLG49bCgpKGk9W10pLmNhbGwoaSxBZSgpKG4pLEFlKCkoYSkpfXJldHVybiBuLnVuc2hpZnQoZSkse2RhdGE6bn19fV0pLHR9KCk7ZnVuY3Rpb24gTGUodCl7dmFyIGU9ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFvLmEpcmV0dXJuITE7aWYoby5hLnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKCkoRGF0ZSxbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1FKCkodCk7aWYoZSl7dmFyIGk9RSgpKHRoaXMpLmNvbnN0cnVjdG9yO249bygpKHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gaygpKHRoaXMsbil9fXZhciBSZT17YnlVcmw6e25hbWU6ImJ5VXJsIixjb2x1bW5zOlsidXJsIiwiY291bnRyaWVzIl19LGJ5SXRlbU5hbWU6e25hbWU6ImJ5SXRlbU5hbWUiLGNvbHVtbnM6WyJpdGVtTmFtZSIsImNvdW50cmllcyJdfSxieUl0ZW1Db2RlOntuYW1lOiJieUl0ZW1Db2RlIixjb2x1bW5zOlsiaXRlbUNvZGUiLCJjb3VudHJpZXMiXX0sYnlDYXRlZ29yeTp7bmFtZToiYnlDYXRlZ29yeSIsY29sdW1uczpbImNhdGVnb3J5IiwiY291bnRyaWVzIl19LGJ5SXRlbURlc2NyaXB0aW9uOntuYW1lOiJieUl0ZW1EZXNjcmlwdGlvbiIsY29sdW1uczpbInRleHQiLCJjb3VudHJpZXMiXX19LFBlPWZ1bmN0aW9uKHQpe3goKShuLHQpO3ZhciBlPUxlKG4pO2Z1bmN0aW9uIG4odCl7dmFyIHI7cmV0dXJuIGQoKSh0aGlzLG4pLChyPWUuY2FsbCh0aGlzLHQpKS5kYXRhPXQuZGF0YSxyLnNoZWV0VHlwZT10LnNoZWV0VHlwZXx8UmUscn1yZXR1cm4gdigpKG4sW3trZXk6ImJ5VXJsIix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoZWV0VHlwZS5ieVVybClyZXR1cm5bXTt2YXIgdD10aGlzLnNoZWV0VHlwZS5ieVVybDtpZighdGhpcy5kYXRhW3QubmFtZV0pcmV0dXJuW107dmFyIGU9Q2UuY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSh0LmNvbHVtbnMsdGhpcy5kYXRhW3QubmFtZV0pO3JldHVybiBwKCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57dXJsOmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiYnlJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXtpZighdGhpcy5zaGVldFR5cGUuYnlJdGVtTmFtZSlyZXR1cm5bXTt2YXIgdD10aGlzLnNoZWV0VHlwZS5ieUl0ZW1OYW1lO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1DZS5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIHAoKShlKS5jYWxsKGUsZnVuY3Rpb24oZSl7dmFyIG49ZVt0LmNvbHVtbnNbMV1dO3JldHVybntpdGVtTmFtZTplW3QuY29sdW1uc1swXV0sY291bnRyaWVzOkNlLnNwbGl0Q291bnRyaWVzKG4pLGlzQWxsOiJBTEwiPT09bn19KX19LHtrZXk6ImJ5SXRlbUNvZGUiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5SXRlbUNvZGUpcmV0dXJuW107dmFyIHQ9dGhpcy5zaGVldFR5cGUuYnlJdGVtQ29kZTtpZighdGhpcy5kYXRhW3QubmFtZV0pcmV0dXJuW107dmFyIGU9Q2UuY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSh0LmNvbHVtbnMsdGhpcy5kYXRhW3QubmFtZV0pO3JldHVybiBwKCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57aXRlbUNvZGU6ZVt0LmNvbHVtbnNbMF1dLGNvdW50cmllczpDZS5zcGxpdENvdW50cmllcyhuKSxpc0FsbDoiQUxMIj09PW59fSl9fSx7a2V5OiJieUNhdGVnb3J5Iix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoZWV0VHlwZS5ieUNhdGVnb3J5KXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5Q2F0ZWdvcnk7aWYoIXRoaXMuZGF0YVt0Lm5hbWVdKXJldHVybltdO3ZhciBlPUNlLmNvbnZlcnRHb29nbGVTcHJlYWRzaGVldEFwaVJhd0RhdGEodC5jb2x1bW5zLHRoaXMuZGF0YVt0Lm5hbWVdKTtyZXR1cm4gcCgpKGUpLmNhbGwoZSxmdW5jdGlvbihlKXt2YXIgbj1lW3QuY29sdW1uc1sxXV07cmV0dXJue2NhdGVnb3J5OmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiYnlJdGVtRGVzY3JpcHRpb24iLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5SXRlbURlc2NyaXB0aW9uKXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5SXRlbURlc2NyaXB0aW9uO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1DZS5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIHAoKShlKS5jYWxsKGUsZnVuY3Rpb24oZSl7dmFyIG49ZVt0LmNvbHVtbnNbMV1dO3JldHVybnt0ZXh0OmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiZXhlY3V0ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57ZXhjbHVzaW9uOntieVVybDp0aGlzLmJ5VXJsKCksYnlJdGVtTmFtZTp0aGlzLmJ5SXRlbU5hbWUoKSxieUl0ZW1Db2RlOnRoaXMuYnlJdGVtQ29kZSgpLGJ5Q2F0ZWdvcnk6dGhpcy5ieUNhdGVnb3J5KCksYnlJdGVtRGVzY3JpcHRpb246dGhpcy5ieUl0ZW1EZXNjcmlwdGlvbigpfX19fV0pLG59KENlKSxOZT1uKDYzKSxJZT1uLm4oTmUpLF9lPW4oODQpO2Z1bmN0aW9uIERlKHQsZSl7dmFyIG47aWYodm9pZCAwPT09cS5hfHxudWxsPT1VKCkodCkpe2lmKEQoKSh0KXx8KG49ZnVuY3Rpb24odCxlKXt2YXIgbjtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBNZSh0LGUpO3ZhciByPVcoKShuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSkuY2FsbChuLDgsLTEpOyJPYmplY3QiPT09ciYmdC5jb25zdHJ1Y3RvciYmKHI9dC5jb25zdHJ1Y3Rvci5uYW1lKTtpZigiTWFwIj09PXJ8fCJTZXQiPT09cilyZXR1cm4gSCgpKHQpO2lmKCJBcmd1bWVudHMiPT09cnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QocikpcmV0dXJuIE1lKHQsZSl9KHQpKXx8ZSYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxvPWZ1bmN0aW9uKCl7fTtyZXR1cm57czpvLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjpvfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGksYT0hMCxzPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj1JKCkodCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1uLm5leHQoKTtyZXR1cm4gYT10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXtzPSEwLGk9dH0sZjpmdW5jdGlvbigpe3RyeXthfHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKHMpdGhyb3cgaX19fX1mdW5jdGlvbiBNZSh0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfWZ1bmN0aW9uIFVlKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhby5hKXJldHVybiExO2lmKG8uYS5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobygpKERhdGUsW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9RSgpKHQpO2lmKGUpe3ZhciBpPUUoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPW8oKShyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGsoKSh0aGlzLG4pfX12YXIgQmU9ZnVuY3Rpb24odCl7eCgpKG4sdCk7dmFyIGU9VWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBkKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gdigpKG4sW3trZXk6ImV4Y2x1ZGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxyKXt2YXIgbyxpLGEscz0hMSx1PXRoaXMubG9jYXRpb24uY291bnRyeSxjPURlKHQpO3RyeXtmb3IoYy5zKCk7IShvPWMubigpKS5kb25lOyl7dmFyIGY9by52YWx1ZTtpZihyKGYpKXtzPW4ubWF0Y2hDb3VudHJ5KGYsdSk7YnJlYWt9fX1jYXRjaCh0KXtjLmUodCl9ZmluYWxseXtjLmYoKX1yZXR1cm4gcz8oYXQuYS5kZWJ1ZyhsKCkoaT0iRVhDTFVERUQgQlkgU1BSRUFEU0hFRVQ6ICIuY29uY2F0KGUsIiwgIikpLmNhbGwoaSx1KSkse2NvZGU6IkVYQ0xVREVEX0JZX0JMQUNLTElTVCIsbWVzc2FnZTpsKCkoYT0iIi5jb25jYXQoZSwiLCAiKSkuY2FsbChhLHUsIiDjgavoqbLlvZPjgZfjgZ/jgZ/jgoHpmaTlpJYiKSxwYXJhbXM6e3ZhbHVlOmUsY291bnRyeTp1fX0pOl9lLmF9fV0sW3trZXk6Im1hdGNoQ291bnRyeSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4hKCF0LmlzQWxsJiYwIT09dC5jb3VudHJpZXMubGVuZ3RoKXx8SWUoKShuPXQuY291bnRyaWVzKS5jYWxsKG4sZSl9fV0pLG59KF9lLmIpO2Z1bmN0aW9uIHFlKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhby5hKXJldHVybiExO2lmKG8uYS5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobygpKERhdGUsW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9RSgpKHQpO2lmKGUpe3ZhciBpPUUoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPW8oKShyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGsoKSh0aGlzLG4pfX12YXIgRmU9d2luZG93LnppZ3phZyxIZT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJidG4tbmF2IikubGVuZ3RoPjAsemU9L1wvaXRlbVwvXGQrLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtkdC5vbkNoYW5nZXNSZWFkeShmdW5jdGlvbih0KXsvdG93ZXJcLmpwXC8vLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpJiYoSGU/KHplJiYoZHQub3ZlcnJpZGVDbGlja0V2ZW50KHQsIi5pdGVtLWluZm8tbWFpbiAubWFpbi1jYXJ0aW4tYnRuLCAjRmxvYXRpbmdDYXJ0SW4gLm1haW4tY2FydGluLWJ0biIsZnVuY3Rpb24oKXtGZS5wYWdlVG8oIml0ZW0iKX0pLHQoJ1tpZCo9IlJlbGF0aW9uR3JvdXBJdGVtc18iXScpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwiLmNhcnRpbi1idG4ucmVsZWFzZWQtYnRuIixmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG4scj10KGUudGFyZ2V0KTtpZihyLmNsb3Nlc3QoIi5yZWxhdGlvbi1ncm91cC1pdGVtLXJvdyIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShuPXIuY2xvc2VzdCgiLnJlbGF0aW9uLWdyb3VwLWl0ZW0tcm93IikpLmNhbGwobiwiLml0ZW0taW5mby1ibG9jayA+IGEiKS5hdHRyKCJocmVmIil8fCIifX0pKSxkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwnYVtocmVmJD0iL2VjL1Nob3BwaW5nQmFnL0l0ZW1MaXN0Il0nLGZ1bmN0aW9uKCl7RmUucGFnZVRvKCJjYXJ0Iil9KSx0KCIuYm94LnNlY3Rpb24sIC50ZXh0LWhvbGRlciIpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwnYVtocmVmKj0iYWN0aW9uPWNhcnRpbiJdJyxmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG49dChlLnRhcmdldCk7aWYobi5jbG9zZXN0KCIuZXZlbi1pdGVtIikubGVuZ3RoPjApe3ZhciByPW4uY2xvc2VzdCgiLmV2ZW4taXRlbSIpO1QoKShyKS5jYWxsKHIsIi5zdWItdGl0bGUiKS5sZW5ndGg+MD93aW5kb3cubG9jYXRpb24uaHJlZj1UKCkocikuY2FsbChyLCIuc3ViLXRpdGxlID4gYSIpLmF0dHIoImhyZWYiKXx8IiI6VCgpKHIpLmNhbGwociwiLndyYXBwLXRleHQiKS5sZW5ndGg+MCYmKHdpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShyKS5jYWxsKHIsIi53cmFwcC10ZXh0IGE6Zmlyc3Qtb2YtdHlwZSIpLmF0dHIoImhyZWYiKXx8IiIpfX19KSk6KHplJiYoZHQub3ZlcnJpZGVDbGlja0V2ZW50KHQsIi5wcmljZS1pbmZvLW1haW4gLmNhcnRpbi1hcmVhLW5vd29uc2FsZSwgLnByaWNlLWluZm8tbWFpbiAuY2FydGluLWFyZWEtcmVzZXJ2ZSIsZnVuY3Rpb24oKXtGZS5wYWdlVG8oIml0ZW0iKX0pLHQoJ1tpZCo9IlJlbGF0aW9uR3JvdXBJdGVtc18iXScpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwiLmNhcnRpbi1idG4ucmVsZWFzZWQtYnRuIixmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG4scj10KGUudGFyZ2V0KTtpZihyLmNsb3Nlc3QoIi5yZWxhdGlvbi1ncm91cC1pdGVtLXJvdyIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShuPXIuY2xvc2VzdCgiLml0ZW0tYmxvY2siKSkuY2FsbChuLCIuaXRlbS1pbmZvLWJsb2NrID4gYSIpLmF0dHIoImhyZWYiKXx8IiJ9fSkpLGR0Lm92ZXJyaWRlQ2xpY2tFdmVudCh0LCdhW2hyZWYkPSIvZWMvU2hvcHBpbmdCYWcvSXRlbUxpc3QiXScsZnVuY3Rpb24oKXtGZS5wYWdlVG8oImNhcnQiKX0pLHQoIi50b3BNb2R1bGVCb3gsIC5hcnRpc3RNYWluT25lQ29sdW1uLCAuc2VhcmNoTGlzdFRhYmxlIikubGVuZ3RoPjAmJmR0Lm92ZXJyaWRlQ2xpY2tFdmVudCh0LCdhW2hyZWYqPSJhY3Rpb249Y2FydGluIl0nLGZ1bmN0aW9uKGUpe2lmKGUudGFyZ2V0KXt2YXIgbixyPXQoZS50YXJnZXQpO2lmKHIuY2xvc2VzdCgiLmZlYXR1cmVJdGVtQ2FydFdyYXAwMSIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShuPXIuY2xvc2VzdCgiLmZlYXR1cmVJdGVtQ2FydFdyYXAwMSIpKS5jYWxsKG4sIi5uYW1lOmZpcnN0LW9mLXR5cGUgPiBhIikuYXR0cigiaHJlZiIpfHwiIjtlbHNlIGlmKHIuY2xvc2VzdCgiLmFydGlzdFNlY3Rpb25MaW5lMDEiKS5sZW5ndGg+MCl7dmFyIG87d2luZG93LmxvY2F0aW9uLmhyZWY9VCgpKG89ci5jbG9zZXN0KCJsaSIpKS5jYWxsKG8sIi50aXRsZSA+IGEiKS5hdHRyKCJocmVmIil8fCIifWVsc2UgaWYoci5jbG9zZXN0KCIuaW5NZGwtZmVhdHVyZUl0ZW1DZWxsLCAuZGlzY29ncmFwaHlMaW5ldXBUYWJsZTAxIikubGVuZ3RoPjApe3ZhciBpO3dpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShpPXIuY2xvc2VzdCgiLmluTWRsLWZlYXR1cmVJdGVtQ2VsbCwgLmRpc2NvZ3JhcGh5TGluZXVwVGFibGUwMSIpKS5jYWxsKGksIi50aXRsZSA+IGEiKS5hdHRyKCJocmVmIil8fCIifWVsc2UgaWYoci5jbG9zZXN0KCIuZmVhdHVyZUl0ZW1PdGhlckxpc3QwMSIpLmxlbmd0aD4wKXt2YXIgYTt3aW5kb3cubG9jYXRpb24uaHJlZj1UKCkoYT1yLmNsb3Nlc3QoImxpIikpLmNhbGwoYSwiLmltZyA+IHAgPiBhIikuYXR0cigiaHJlZiIpfHwiIn1lbHNlIGlmKHIuY2xvc2VzdCgiLmluTWRsLWF0Y2xJdGVtUm93IikubGVuZ3RoPjApe3ZhciBzO3dpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShzPXIuY2xvc2VzdCgibGkiKSkuY2FsbChzLCIudGl0bGUgPiBhIikuYXR0cigiaHJlZiIpfHwiIn19fSx7ZGlzYWJsZVBvaW50ZXJFdmVudDohMH0pKSl9KTt2YXIgV2U9ZnVuY3Rpb24odCl7eCgpKG4sdCk7dmFyIGU9cWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBkKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gdigpKG4sW3trZXk6ImdldEl0ZW0iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsZSxyPXRoaXMsbz1tKCkoRSgpKG4ucHJvdG90eXBlKSwiZ2V0SXRlbSIsdGhpcykuY2FsbCh0aGlzKTtIZT9vLmltYWdlcz1wKCkodD10aGlzLiQoIiNqYWNrZXRQaG90b1N3aXBlciAubWFpbi1qYWNrZXQgaW1nIikuZ2V0KCkpLmNhbGwodCxmdW5jdGlvbih0KXtyZXR1cm4gci4kKHQpLmF0dHIoInNyYyIpfHwiIn0pOm8uaW1hZ2VzPXAoKShlPXRoaXMuJCgiI21haW4taW1hZ2UiKS5nZXQoKSkuY2FsbChlLGZ1bmN0aW9uKHQpe3JldHVybiByLiQodCkuYXR0cigic3JjIil8fCIifSk7cmV0dXJuIG99fSx7a2V5OiJnZXRJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06IiI7cmV0dXJuIHRoaXMuJCgiI1ByaXZpbGVnZUFyZWEiKS5sZW5ndGg+MD90KyLvvIjnibnlhbjjgYLjgorvvIkiOnR9fSx7a2V5OiJnZXRJdGVtUHJpY2UiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjAsZT10LG49dGhpcy4kKCIuc2FsZS1wcmljZS12YWx1ZSIpLHI9dGhpcy4kKCIubXVsdGlidXktcHJpY2UtbGFiZWwiKS50ZXh0KCk7cmV0dXJuIG4ubGVuZ3RoPjAmJigv44G+44Go44KB44Gm44Kq44OV5L6h5qC8Ly50ZXN0KHIpfHwoZT1DKG4udGV4dCgpKSkpLGV9fSx7a2V5OiJnZXRQdXJjaGFzYWJsZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIDAhPT10aGlzLiQoJy5jYXJ0aW4tYXJlYS1ub3dvbnNhbGVbb25jbGljayo9IkNhcnRJbiJdLCAuY2FydGluLWFyZWEtcmVzZXJ2ZVtvbmNsaWNrKj0iQ2FydEluIl0nKS5sZW5ndGh8fChhdC5hLmRlYnVnKCLjgqvjg7zjg4jjg5zjgr/jg7PjgYznhKHjgYTjgZ/jgoHjgIHos7zlhaXkuI3lj68iKSwhMSl9fV0pLG59KFgpLCRlPWZ1bmN0aW9uKHQpe3goKShuLHQpO3ZhciBlPXFlKG4pO2Z1bmN0aW9uIG4oKXtyZXR1cm4gZCgpKHRoaXMsbiksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIG59KFdlKSxZZT1mdW5jdGlvbih0KXt4KCkobix0KTt2YXIgZT1xZShuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIGQoKSh0aGlzLG4pLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBufShXZSksVmU9ZnVuY3Rpb24odCl7eCgpKG4sdCk7dmFyIGU9cWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBkKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gbn0oQmUpO0ZlLmRpc2NvdmVyeShmdW5jdGlvbih0KXt2YXIgZT10LmNhbGxiYWNrLG49dC5sb2NhdGlvbjshZnVuY3Rpb24odCxlKXt2YXIgbj13aW5kb3cuemlnemFnO24mJm4udXRpbHMuZmV0Y2hIdG1sKHQsZSl9KGZ1bmN0aW9uKHQpe3RyeXtpZighemUpcmV0dXJuIGUoKTt2YXIgcixvPW5ldyBQZSh7ZGF0YTpGZS5zaG9wRGF0YXx8e319KS5leGVjdXRlKCk7aWYoSGUpe3I9bmV3ICRlKHskOnQsbmFtZToiLml0ZW0tamFja2V0LXRpdGxlIC5wcm9kdWN0LXRpdGxlIixwcmljZToiLml0ZW0taW5mbyAucHJpY2UtdmFsdWUifSkuZXhlY3V0ZSgpfWVsc2V7cj1uZXcgWWUoeyQ6dCxuYW1lOiIuaXRlbS1pbmZvIC5wcm9kdWN0LXRpdGxlIixwcmljZToiLnByaWNlLWluZm8tbWFpbiAucHJpY2UtdmFsdWUifSkuZXhlY3V0ZSgpfXZhciBpPW5ldyBWZSh7bG9jYXRpb246bixzY3JhcGVyUmVzdWx0OnIsZGF0YTpvLmV4Y2x1c2lvbn0pLmV4ZWN1dGUoKTtyZXR1cm4gZShudWxsLHtpdGVtOnIuaXRlbSxza3VSb3dzOnIuc2t1Um93cyxleGNsdXNpb246aX0pfWNhdGNoKHQpe3JldHVybiBlKHQpfX0pfSk7dmFyIEdlPW5ldyBEYXRlKCJNb24gRmViIDEgMjAyMSAwMDowMDowMCBHTVQrMDgwMCIpLEtlPW5ldyBEYXRlKCJTdW4gRmViIDI4IDIwMjEgMjM6NTk6NTkgR01UKzA4MDAiKSxYZT1uZXcgRGF0ZSgiTW9uIEZlYiAxIDIwMjEgMDA6MDA6MDAgR01UKzA4MDAiKSxKZT1uZXcgRGF0ZSgiU3VuIEZlYiAxNCAyMDIxIDIzOjU5OjU5IEdNVCswODAwIiksUWU9bmV3IERhdGUsWmU9UWUuZ2V0VGltZSgpPj1HZS5nZXRUaW1lKCkmJlFlLmdldFRpbWUoKTw9S2UuZ2V0VGltZSgpLHRuPVFlLmdldFRpbWUoKT49WGUuZ2V0VGltZSgpJiZRZS5nZXRUaW1lKCk8PUplLmdldFRpbWUoKSxlbj0vXnpoL2kudGVzdCh0dCgpKTtpZihaZSYmZW4/KEZlLmNhcnRNb2RhbChmdW5jdGlvbigpe3ZhciB0LGUsbixyPWplKCk7cmV0dXJue2JvdHRvbTp7aHRtbDpsKCkodD1sKCkoZT1sKCkobj0nXG4gICAgPGRpdiBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuMyAhaW1wb3J0YW50OyI+XG4gICAgPHAgc3R5bGU9ImNvbG9yOiByZWQgIWltcG9ydGFudDtmb250LXNpemU6IDAuN2VtICFpbXBvcnRhbnQ7bWFyZ2luOiAwICFpbXBvcnRhbnQ7Ij4nLmNvbmNhdChyKCJ0b3dlcl9qcC5jYXJ0LmJvdHRvbS50ZXh0MS5hbGVydCIpLCc8L3A+XG4gICAgPHVsIHN0eWxlPSJtYXJnaW46IDAuNGVtIDAgIWltcG9ydGFudDsiPlxuICAgIDxsaSBzdHlsZT0iZm9udC1zaXplOiAwLjdlbSAhaW1wb3J0YW50O3BhZGRpbmc6IDAgIWltcG9ydGFudDsiPicpKS5jYWxsKG4scigidG93ZXJfanAuY2FydC5ib3R0b20ubGluZTEiKSwnPC9saT5cbiAgICA8bGkgc3R5bGU9ImZvbnQtc2l6ZTogMC43ZW0gIWltcG9ydGFudDtwYWRkaW5nOiAwICFpbXBvcnRhbnQ7Ij4nKSkuY2FsbChlLHIoInRvd2VyX2pwLmNhcnQuYm90dG9tLmxpbmUyIiksJzwvbGk+XG4gICAgPC91bD5cbiAgICA8cCBzdHlsZT0iY29sb3I6IHJlZCAhaW1wb3J0YW50O2ZvbnQtc2l6ZTogMC43ZW0gIWltcG9ydGFudDttYXJnaW46IDAgIWltcG9ydGFudDsiPicpKS5jYWxsKHQscigidG93ZXJfanAuY2FydC5ib3R0b20udGV4dDIuYWxlcnQiKSwiIDwvcD5cbiAgICA8L2Rpdj5cbiAgICAiKX0sbWlkZGxlOntodG1sOidcbiAgICA8ZGl2IHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmUgIWltcG9ydGFudDsgbWFyZ2luOiAtMTZweCAwIDBweCAhaW1wb3J0YW50OyI+XG4gICAgPHNwYW4gc3R5bGU9IlxuICAgIGNvbnRlbnQ6IFwnXCcgIWltcG9ydGFudDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDtcbiAgICByaWdodDogMTNweCAhaW1wb3J0YW50O1xuICAgIHRvcDogLTExcHggIWltcG9ydGFudDtcbiAgICB3aWR0aDogMHB4ICFpbXBvcnRhbnQ7XG4gICAgaGVpZ2h0OiAwcHggIWltcG9ydGFudDtcbiAgICBtYXJnaW46IGF1dG8gIWltcG9ydGFudDtcbiAgICBib3JkZXItc3R5bGU6IHNvbGlkICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyOiA2cHggc29saWQgdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgICBib3JkZXItYm90dG9tOiA2cHggc29saWQgI2UzMzczOCAhaW1wb3J0YW50OyI+PC9zcGFuPlxuICAgIDxwIHN0eWxlPSJcbiAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDtcbiAgICBjb2xvcjogI2RhNDg0OCAhaW1wb3J0YW50O1xuICAgIGxpbmUtaGVpZ2h0OiAxLjUgIWltcG9ydGFudDtcbiAgICBmb250LXdlaWdodDogYm9sZCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDNweCAhaW1wb3J0YW50O1xuICAgIGJhY2tncm91bmQ6ICNmZmZlZmMgIWltcG9ydGFudDtcbiAgICBib3JkZXI6IHNvbGlkIDFweCAjZGE0ODQ4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogNHB4IDFlbSAhaW1wb3J0YW50O1xuICAgIHdoaXRlLXNwYWNlOiBwcmUtbGluZSAhaW1wb3J0YW50OyI+Jy5jb25jYXQocigidG93ZXJfanAuY2FydE1vZGFsLm1pZGRsZSIpLCI8L3A+XG4gICAgPC9kaXY+XG4gICAgIil9fX0pLEZlLmNoYXJnZXMoZnVuY3Rpb24odCl7dmFyIGU9dC5kZWZhdWx0Q2hhcmdlcztyZXR1cm4gdSgpKHUoKSh7fSxlKSx7cHVyY2hhc2VTZXJ2aWNlRmVlOjB9KX0pKTpGZS5jYXJ0TW9kYWwoZnVuY3Rpb24oKXt2YXIgdCxlLG4scj1qZSgpO3JldHVybntib3R0b206e2h0bWw6bCgpKHQ9bCgpKGU9bCgpKG49J1xuICA8ZGl2IHN0eWxlPSJsaW5lLWhlaWdodDogMS4zICFpbXBvcnRhbnQ7Ij5cbiAgPHAgc3R5bGU9ImNvbG9yOiByZWQgIWltcG9ydGFudDtmb250LXNpemU6IDAuN2VtICFpbXBvcnRhbnQ7bWFyZ2luOiAwICFpbXBvcnRhbnQ7Ij4nLmNvbmNhdChyKCJ0b3dlcl9qcC5jYXJ0LmJvdHRvbS50ZXh0MS5hbGVydCIpLCc8L3A+XG4gIDx1bCBzdHlsZT0ibWFyZ2luOiAwLjRlbSAwICFpbXBvcnRhbnQ7Ij5cbiAgPGxpIHN0eWxlPSJmb250LXNpemU6IDAuN2VtICFpbXBvcnRhbnQ7cGFkZGluZzogMCAhaW1wb3J0YW50OyI+JykpLmNhbGwobixyKCJ0b3dlcl9qcC5jYXJ0LmJvdHRvbS5saW5lMSIpLCc8L2xpPlxuICA8bGkgc3R5bGU9ImZvbnQtc2l6ZTogMC43ZW0gIWltcG9ydGFudDtwYWRkaW5nOiAwICFpbXBvcnRhbnQ7Ij4nKSkuY2FsbChlLHIoInRvd2VyX2pwLmNhcnQuYm90dG9tLmxpbmUyIiksJzwvbGk+XG4gIDwvdWw+XG4gIDxwIHN0eWxlPSJjb2xvcjogcmVkICFpbXBvcnRhbnQ7Zm9udC1zaXplOiAwLjdlbSAhaW1wb3J0YW50O21hcmdpbjogMCAhaW1wb3J0YW50OyI+JykpLmNhbGwodCxyKCJ0b3dlcl9qcC5jYXJ0LmJvdHRvbS50ZXh0Mi5hbGVydCIpLCIgPC9wPlxuICA8L2Rpdj5cbiAgIil9fX0pLHRuJiZlbil7aWYoRmUubm90aWNlTW9kYWwoZnVuY3Rpb24oKXt2YXIgdCxlLG4scixvPWplKCk7cmV0dXJuIEhlP3tqdW1ib3Ryb246e2h0bWw6bCgpKHQ9bCgpKGU9J1xuICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luOiA2cHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICAgIDxkaXY+XG4gICAgICA8c3BhbiBzdHlsZT0ibWFyZ2luOiAzNHB4IDAgMCAhaW1wb3J0YW50OyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyI+PGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvbm90aWNlTW9kYWxfbG9nby5wbmciIGFsdD0iV29ybGRTaG9wcGluZ8OXVE9XRVIgUkVDT1JEUyIgc3R5bGU9Im1heC13aWR0aDogNDAwcHggIWltcG9ydGFudDsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsiPjwvc3Bhbj5cbiAgICAgIDxoMSBzdHlsZT0iZm9udC1zaXplOiAyLjlyZW0gIWltcG9ydGFudDsiPicuY29uY2F0KG8oImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDEiKSwnPC9oMT5cbiAgICAgIDxoMiBzdHlsZT0iZm9udC1zaXplOiAxLjRyZW0gIWltcG9ydGFudDsiPicpKS5jYWxsKGUsbygiY29tbW9uLm5vdGljZU1vZGFsLmp1bWJvdHJvbi5oMiIpLCc8L2gyPlxuICAgICAgPGEgaHJlZj0iYWxpcGF5czovL3BsYXRmb3JtYXBpL3N0YXJ0YXBwP2FwcElkPTIwMTkxMDE3Njg0MTg3NTUiPlxuICAgICAgPGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvY2FtcGFpZ24tYmFubmVyLXNwXzIwMjEwMTIyLnBuZyIgc3R5bGU9IndpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Ij5cbiAgICAgIDwvYT5cbiAgICAgIDxhIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7IiBocmVmPSJodHRwczovL3Rvd2VyLmpwL3NpdGUvaG93dG8vZm9yaW50ZXJuYXRpb25hbGN1c3RvbWVyIj5cbiAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgICAgICAgIGZvbnQtc2l6ZTogMS42cmVtICFpbXBvcnRhbnQ7XG4gICAgICAgICAgbWFyZ2luOiAxcmVtIGF1dG8gIWltcG9ydGFudDtcbiAgICAgICAgICBwYWRkaW5nOiAxcmVtICFpbXBvcnRhbnQ7XG4gICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQgIWltcG9ydGFudDtcbiAgICAgICAgICBtYXgtd2lkdGg6IDUwMHB4ICFpbXBvcnRhbnQ7XG4gICAgICAgICAgYm9yZGVyOiBzb2xpZCAjZmZjYTAwICFpbXBvcnRhbnQ7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmY2EwMCAhaW1wb3J0YW50O1xuICAgICAgICAgIGNvbG9yOiAjMDAwMDAwICFpbXBvcnRhbnQ7Ij4nKSkuY2FsbCh0LG8oInRvd2VyX2pwLm5vdGljZU1vZGFsLmp1bWJvdHJvbi50ZXh0IiksIjwvc3Bhbj5cbiAgICAgIDwvYT5cbiAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICAiKX19OntqdW1ib3Ryb246e2h0bWw6bCgpKG49bCgpKHI9J1xuICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luOiA2cHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICAgIDxkaXY+XG4gICAgICA8c3BhbiBzdHlsZT0ibWFyZ2luOiAzNHB4IDAgMCAhaW1wb3J0YW50OyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyI+PGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvbm90aWNlTW9kYWxfbG9nby5wbmciIGFsdD0iV29ybGRTaG9wcGluZ8OXVE9XRVIgUkVDT1JEUyIgc3R5bGU9Im1heC13aWR0aDogNDAwcHggIWltcG9ydGFudDsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsiPjwvc3Bhbj5cbiAgICAgIDxoMSBzdHlsZT0iZm9udC1zaXplOiAyLjlyZW0gIWltcG9ydGFudDsiPicuY29uY2F0KG8oImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDEiKSwnPC9oMT5cbiAgICAgIDxoMiBzdHlsZT0iZm9udC1zaXplOiAxLjRyZW0gIWltcG9ydGFudDsiPicpKS5jYWxsKHIsbygiY29tbW9uLm5vdGljZU1vZGFsLmp1bWJvdHJvbi5oMiIpLCc8L2gyPlxuICAgICAgPGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvY2FtcGFpZ24tYmFubmVyLXBjXzIwMjEwMTIyLnBuZyIgc3R5bGU9IndpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IG1heC13aWR0aDogMzgwcHggIWltcG9ydGFudDsiPlxuICAgICAgPGEgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OyBjb2xvcjogYmxhY2sgIWltcG9ydGFudDsiIGhyZWY9Imh0dHBzOi8vdG93ZXIuanAvc2l0ZS9ob3d0by9mb3JpbnRlcm5hdGlvbmFsY3VzdG9tZXIiPlxuICAgICAgPHNwYW4gc3R5bGU9ImRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gICAgICAgIGZvbnQtc2l6ZTogMS42cmVtICFpbXBvcnRhbnQ7XG4gICAgICAgIG1hcmdpbjogMXJlbSBhdXRvICFpbXBvcnRhbnQ7XG4gICAgICAgIHBhZGRpbmc6IDFyZW0gIWltcG9ydGFudDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQgIWltcG9ydGFudDtcbiAgICAgICAgbWF4LXdpZHRoOiA1MDBweCAhaW1wb3J0YW50O1xuICAgICAgICBib3JkZXI6IHNvbGlkICNmZmNhMDAgIWltcG9ydGFudDtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmY2EwMCAhaW1wb3J0YW50O1xuICAgICAgICBjb2xvcjogIzAwMDAwMCAhaW1wb3J0YW50OyI+JykpLmNhbGwobixvKCJ0b3dlcl9qcC5ub3RpY2VNb2RhbC5qdW1ib3Ryb24udGV4dCIpLCI8L3NwYW4+XG4gICAgICA8L2E+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgIil9fX0pLHplKWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pdGVtLWluZm8tbWFpbiAuc3RvY2stc3RhdHVzIikubGVuZ3RoPjAmJiLjgYrlj5bjgorlr4TjgZsiPT09ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLml0ZW0taW5mby1tYWluIC5zdG9jay1zdGF0dXMiKVswXS50ZXh0Q29udGVudD9GZS5pdGVtTW9kYWwoZnVuY3Rpb24oKXt2YXIgdCxlLG49amUoKTtyZXR1cm4gSGU/e2JvdHRvbTp7aHRtbDpsKCkodD0nXG4gICAgICA8ZGl2PlxuICAgICAgPHAgc3R5bGU9ImNvbG9yOiByZWQgIWltcG9ydGFudDtcbiAgICAgICAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDtcbiAgICAgICAgICBmb250LXdlaWdodDogYm9sZCAhaW1wb3J0YW50O1xuICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxICFpbXBvcnRhbnQ7XG4gICAgICAgICAgbWFyZ2luOiAwLjRlbSAwICFpbXBvcnRhbnQ7Ij4nLmNvbmNhdChuKCJ0b3dlcl9qcC5pdGVtLmJvdHRvbS50aXRsZSIpLCc8L3A+XG4gICAgICA8cCBzdHlsZT0iZm9udC1zaXplOiAxMXB4ICFpbXBvcnRhbnQ7XG4gICAgICAgICAgd2hpdGUtc3BhY2U6IHByZS1saW5lICFpbXBvcnRhbnQ7XG4gICAgICAgICAgbGluZS1oZWlnaHQ6IDEuMiAhaW1wb3J0YW50O1xuICAgICAgICAgIHBhZGRpbmctYm90dG9tOiAwLjJlbSAhaW1wb3J0YW50OyI+JykpLmNhbGwodCxuKCJ0b3dlcl9qcC5pdGVtLmJvdHRvbS50ZXh0IiksJzwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGEgaHJlZj0iYWxpcGF5czovL3BsYXRmb3JtYXBpL3N0YXJ0YXBwP2FwcElkPTIwMTkxMDE3Njg0MTg3NTUiPlxuICAgICAgPGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvY2FtcGFpZ24tYmFubmVyLXNwXzIwMjEwMTIyLnBuZyIgc3R5bGU9IndpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Ij5cbiAgICAgIDwvYT5cbiAgICAgICcpfX06e2JvdHRvbTp7aHRtbDpsKCkoZT0nXG4gICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiAtMTVweCFpbXBvcnRhbnQ7Ij5cbiAgICAgIDxwIHN0eWxlPSJjb2xvcjogcmVkICFpbXBvcnRhbnQ7XG4gICAgICAgICAgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7XG4gICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQgIWltcG9ydGFudDtcbiAgICAgICAgICBsaW5lLWhlaWdodDogMSAhaW1wb3J0YW50O1xuICAgICAgICAgIG1hcmdpbjogMC4xZW0gMCAhaW1wb3J0YW50OyI+Jy5jb25jYXQobigidG93ZXJfanAuaXRlbS5ib3R0b20udGl0bGUiKSwnPC9wPlxuICAgICAgPHAgc3R5bGU9ImZvbnQtc2l6ZTogMTBweCAhaW1wb3J0YW50O1xuICAgICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtbGluZSAhaW1wb3J0YW50O1xuICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxICFpbXBvcnRhbnQ7Ij4nKSkuY2FsbChlLG4oInRvd2VyX2pwLml0ZW0uYm90dG9tLnRleHQiKSwnPC9wPlxuICAgICAgPC9kaXY+XG4gICAgICA8aW1nIHNyYz0iaHR0cHM6Ly9zdGF0aWMtY29udGVudHMud29ybGRzaG9wcGluZy5qcC9zaG9wcy90b3dlcl9qcC9jYW1wYWlnbi1iYW5uZXItcGNfMjAyMTAxMjIucG5nIiBzdHlsZT0id2lkdGg6IDg1JSAhaW1wb3J0YW50OyBtYXgtd2lkdGg6IDI0MHB4ICFpbXBvcnRhbnQ7IG1hcmdpbi1ib3R0b206IC0xNXB4IWltcG9ydGFudDsiPlxuICAgICAgJyl9fX0pOkZlLml0ZW1Nb2RhbChmdW5jdGlvbigpe3JldHVybiBIZT97Ym90dG9tOntodG1sOidcbiAgICAgICAgICA8YSBocmVmPSJhbGlwYXlzOi8vcGxhdGZvcm1hcGkvc3RhcnRhcHA/YXBwSWQ9MjAxOTEwMTc2ODQxODc1NSI+XG4gICAgICAgICAgPGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvY2FtcGFpZ24tYmFubmVyLXNwXzIwMjEwMTIyLnBuZyIgc3R5bGU9IndpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Ij5cbiAgICAgICAgICA8L2E+XG4gICAgICAgICAgJ319Ontib3R0b206e2h0bWw6J1xuICAgICAgICAgIDxpbWcgc3JjPSJodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL3Rvd2VyX2pwL2NhbXBhaWduLWJhbm5lci1wY18yMDIxMDEyMi5wbmciIHN0eWxlPSJ3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBtYXgtd2lkdGg6IDQ4MHB4ICFpbXBvcnRhbnQ7Ij5cbiAgICAgICAgICAnfX19KTtGZS5sYXVuY2goZnVuY3Rpb24oKXt2YXIgdD0hc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiU1RPUkFHRV9LRVlfcmFndGFnX2pwIik7cmV0dXJuIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oIlNUT1JBR0VfS0VZX3JhZ3RhZ19qcCIsYSgpKCEwKSksdD8ibm90aWNlIjpudWxsfSl9ZWxzZXtpZihGZS5ub3RpY2VNb2RhbChmdW5jdGlvbigpe3ZhciB0LGUsbj1qZSgpO3JldHVybntqdW1ib3Ryb246e2h0bWw6bCgpKHQ9bCgpKGU9J1xuICA8ZGl2IHN0eWxlPSJtYXJnaW46IDZweCAwIDAgIWltcG9ydGFudDsiPlxuICA8ZGl2PlxuICA8c3BhbiBzdHlsZT0ibWFyZ2luOiAzNHB4IDAgMCAhaW1wb3J0YW50OyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyI+PGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvbm90aWNlTW9kYWxfbG9nby5wbmciIGFsdD0iV29ybGRTaG9wcGluZ8OXVE9XRVIgUkVDT1JEUyIgc3R5bGU9Im1heC13aWR0aDogNDAwcHggIWltcG9ydGFudDsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsiPjwvc3Bhbj5cbiAgPGgxIHN0eWxlPSJmb250LXNpemU6IDIuOXJlbSAhaW1wb3J0YW50OyI+Jy5jb25jYXQobigiY29tbW9uLm5vdGljZU1vZGFsLmp1bWJvdHJvbi5oMSIpLCc8L2gxPlxuICA8aDIgc3R5bGU9ImZvbnQtc2l6ZTogMS40cmVtICFpbXBvcnRhbnQ7Ij4nKSkuY2FsbChlLG4oImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDIiKSwnPC9oMj5cbiAgPGEgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OyBjb2xvcjogYmxhY2sgIWltcG9ydGFudDsiIGhyZWY9Imh0dHBzOi8vdG93ZXIuanAvc2l0ZS9ob3d0by9mb3JpbnRlcm5hdGlvbmFsY3VzdG9tZXIiPlxuICA8c3BhbiBzdHlsZT0iZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICAgIGZvbnQtc2l6ZTogMS42cmVtICFpbXBvcnRhbnQ7XG4gICAgICBtYXJnaW46IDFyZW0gYXV0byAhaW1wb3J0YW50O1xuICAgICAgcGFkZGluZzogMXJlbSAhaW1wb3J0YW50O1xuICAgICAgZm9udC13ZWlnaHQ6IGJvbGQgIWltcG9ydGFudDtcbiAgICAgIG1heC13aWR0aDogNTAwcHggIWltcG9ydGFudDtcbiAgICAgIGJvcmRlcjogc29saWQgI2ZmY2EwMCAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmY2EwMCAhaW1wb3J0YW50O1xuICAgICAgY29sb3I6ICMwMDAwMDAgIWltcG9ydGFudDsiPicpKS5jYWxsKHQsbigidG93ZXJfanAubm90aWNlTW9kYWwuanVtYm90cm9uLnRleHQiKSwiPC9zcGFuPlxuICA8L2E+XG4gIDwvZGl2PlxuICA8L2Rpdj5cbiAgIil9fX0pLHplKWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pdGVtLWluZm8tbWFpbiAuc3RvY2stc3RhdHVzIikubGVuZ3RoPjAmJiLjgYrlj5bjgorlr4TjgZsiPT09ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLml0ZW0taW5mby1tYWluIC5zdG9jay1zdGF0dXMiKVswXS50ZXh0Q29udGVudCYmRmUuaXRlbU1vZGFsKGZ1bmN0aW9uKCl7dmFyIHQsZT1qZSgpO3JldHVybntib3R0b206e2h0bWw6bCgpKHQ9J1xuICA8ZGl2PlxuICA8cCBzdHlsZT0iY29sb3I6IHJlZCAhaW1wb3J0YW50O1xuICAgICAgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7XG4gICAgICBmb250LXdlaWdodDogYm9sZCAhaW1wb3J0YW50O1xuICAgICAgbGluZS1oZWlnaHQ6IDEgIWltcG9ydGFudDtcbiAgICAgIG1hcmdpbjogMC40ZW0gMCAhaW1wb3J0YW50OyI+Jy5jb25jYXQoZSgidG93ZXJfanAuaXRlbS5ib3R0b20udGl0bGUiKSwnPC9wPlxuICA8cCBzdHlsZT0iZm9udC1zaXplOiAxMXB4ICFpbXBvcnRhbnQ7XG4gICAgICB3aGl0ZS1zcGFjZTogcHJlLWxpbmUgIWltcG9ydGFudDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxLjIgIWltcG9ydGFudDtcbiAgICAgIHBhZGRpbmctYm90dG9tOiAwLjJlbSAhaW1wb3J0YW50OyI+JykpLmNhbGwodCxlKCJ0b3dlcl9qcC5pdGVtLmJvdHRvbS50ZXh0IiksIjwvcD5cbiAgPC9kaXY+XG4gICIpfX19KX0vdG93ZXJzaGlidXlhXC5qcFwva3BvcC8udGVzdCh3aW5kb3cubG9jYXRpb24uaHJlZik/KEZlLmxhdW5jaChmdW5jdGlvbigpe3JldHVybiJiYW5uZXItaGlkZGVuIn0pLEZlLmJhbm5lcihmdW5jdGlvbigpe3JldHVybntoaWRkZW46e2h0bWw6J1xuPGEgaHJlZj0iaHR0cHM6Ly9iaXQubHkvMllVbEtUZCI+XG48ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiAjNjQ2NTY3ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogNHB4IDRweCAwICFpbXBvcnRhbnQ7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7XG4gICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gICAgYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gICAgcmlnaHQ6IDEwcHggIWltcG9ydGFudDtcbiAgICBsZWZ0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogMTBweCAxMHB4IDAgMCAhaW1wb3J0YW50OyI+XG4gICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDZweCA3cHggNXB4IDdweCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDZweCA2cHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICA8aW1nIHNyYz0iaHR0cHM6Ly9jaGVja291dC1zdGF0aWMud29ybGRzaG9wcGluZy5qcC9pbWFnZXMvY29tbW9uL2Jhbm5lcl9oaWRkZW5faWNvbl9lbi5zdmciIGFsdD0iR2xvYmFsIFNoaXBwaW5nIiBzdHlsZT0id2lkdGg6IDUycHggIWltcG9ydGFudDsiPlxuICAgIDwvc3Bhbj5cbjwvZGl2PlxuPC9hPlxuJ319fSkpOi8odG93ZXJzaGlidXlhXC5qcCkvLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpJiYoRmUubGF1bmNoKGZ1bmN0aW9uKCl7cmV0dXJuImJhbm5lci1oaWRkZW4ifSksRmUuYmFubmVyKGZ1bmN0aW9uKCl7cmV0dXJue2hpZGRlbjp7aHRtbDonXG48YSBocmVmPSJodHRwczovL2JpdC5seS8zZ0x1NHVBIj5cbjxkaXYgc3R5bGU9ImJhY2tncm91bmQ6ICM2NDY1NjcgIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiA0cHggNHB4IDAgIWltcG9ydGFudDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDtcbiAgICBib3R0b206IDAgIWltcG9ydGFudDtcbiAgICByaWdodDogMTBweCAhaW1wb3J0YW50O1xuICAgIGxlZnQ6IGF1dG8gIWltcG9ydGFudDtcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4IDEwcHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogd2hpdGUgIWltcG9ydGFudDtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgIHdpZHRoOiA1MHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogNnB4IDdweCA1cHggN3B4ICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogNnB4IDZweCAwIDAgIWltcG9ydGFudDsiPlxuICAgIDxpbWcgc3JjPSJodHRwczovL2NoZWNrb3V0LXN0YXRpYy53b3JsZHNob3BwaW5nLmpwL2ltYWdlcy9jb21tb24vYmFubmVyX2hpZGRlbl9pY29uX2VuLnN2ZyIgYWx0PSJHbG9iYWwgU2hpcHBpbmciIHN0eWxlPSJ3aWR0aDogNTJweCAhaW1wb3J0YW50OyI+XG4gICAgPC9zcGFuPlxuPC9kaXY+XG48L2E+XG4nfX19KSksLyhtaWtpa2lcLnRva3lvXC5qcFwvKS8udGVzdCh3aW5kb3cubG9jYXRpb24uaHJlZikmJihGZS5sYXVuY2goZnVuY3Rpb24oKXtyZXR1cm4iYmFubmVyLWhpZGRlbiJ9KSxGZS5iYW5uZXIoZnVuY3Rpb24oKXtyZXR1cm57aGlkZGVuOntodG1sOidcbjxhIGhyZWY9Imh0dHBzOi8vYml0Lmx5LzMxSU56MkwiPlxuPGRpdiBzdHlsZT0iYmFja2dyb3VuZDogIzY0NjU2NyAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDRweCA0cHggIWltcG9ydGFudDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDtcbiAgICBib3R0b206IDEzMHB4ICFpbXBvcnRhbnQ7XG4gICAgcmlnaHQ6IC0yM3B4ICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogMTBweCAwIDAgMTBweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctcmlnaHQ6IDAgIWltcG9ydGFudDsiPlxuICAgIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50O1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gICAgd2lkdGg6IDUwcHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiA2cHggMjBweCA2cHggN3B4ICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogNnB4IDAgMCA2cHggIWltcG9ydGFudDsiPlxuICAgIDxpbWcgc3JjPSJodHRwczovL2NoZWNrb3V0LXN0YXRpYy53b3JsZHNob3BwaW5nLmpwL2ltYWdlcy9jb21tb24vYmFubmVyX2hpZGRlbl9pY29uX2VuLnN2ZyIgYWx0PSJHbG9iYWwgU2hpcHBpbmciIHN0eWxlPSJ3aWR0aDogNTJweCAhaW1wb3J0YW50OyBib3JkZXItcmFkaXVzOiA2cHggMCAwIDZweCAhaW1wb3J0YW50OyI+XG4gICAgPC9zcGFuPlxuPC9kaXY+XG48L2E+XG4nfX19KSksLyh0b3dlclwuanBcL3x0b3dlcnNoaWJ1eWFcLmpwXC98bWlraWtpXC50b2t5b1wuanBcLykvLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpJiZUZS5pbml0aWFsaXplKCkudGhlbihmdW5jdGlvbigpe3JldHVybiBGZS5ydW4oKX0pfV0pO30=
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
13.32.24.99
, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- server-13-32-24-99.fra56.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- 3fecb7a5f36736f043a5819358c0b1521aeabfdd04bb870923fdf5bc67d5bdb1
|
GET
H/1.1
|
200
OK
|
b43bae49f7
Show response
bam-cell.nr-data.net/1/
|
57 B
646 B
|
238ms
180ms
|
Script
text/javascript |
162.247.243.146
CLOUDFLARENET
|
|
General
- Full URL
- https://bam-cell.nr-data.net/1/b43bae49f7?a=59411024&v=1198.fe6ec20&to=YVdXbUsHVhcFVxVfDVgddGppSVsLCUQOWAdYRkYWSQdfARBNEVMRGQMHW1gVXRcBVRNVCkZTUlwXB0sUHA%3D%3D&rst=10728&ck=1&ref=https://tower.jp/search/advanced/item/search&ap=130&be=2431&fe=10558&dc=8140&perf=%7B%22timing%22:%7B%22of%22:1614676124809,%22n%22:0,%22f%22:1,%22dn%22:1,%22dne%22:2,%22c%22:2,%22s%22:27,%22ce%22:1913,%22rq%22:1914,%22rp%22:2422,%22rpe%22:2985,%22dl%22:2424,%22di%22:8141,%22ds%22:8141,%22de%22:8173,%22dc%22:10558,%22l%22:10558,%22le%22:10598%7D,%22navigation%22:%7B%7D%7D&fp=5847&fcp=5847&jsonp=NREUM.setToken
- Requested by
- Host: js-agent.newrelic.com
URL: https://js-agent.newrelic.com/nr-1198.min.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
162.247.243.146
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- d10c94b6cdb747904baee9070f003bb45849da46f8100b1320f286c21cbcaaa1
|
OPTIONS
H2
|
200
|
report
checkout-api.worldshopping.jp/v1/
|
0
0
|
792ms
792ms
|
Other
application/json |
13.225.74.64
AMAZON-02
|
|
|
POST
H2
|
200
|
report
Show response
checkout-api.worldshopping.jp/v1/
|
2 B
444 B
|
320ms
320ms
|
XHR
application/json |
13.225.74.64
AMAZON-02
|
|
|
POST
H/1.1
|
200
OK
|
b43bae49f7
Show response
bam-cell.nr-data.net/events/1/
|
24 B
484 B
|
200ms
199ms
|
XHR
image/gif |
162.247.243.146
CLOUDFLARENET
|
|
General
- Full URL
- https://bam-cell.nr-data.net/events/1/b43bae49f7?a=59411024&v=1198.fe6ec20&to=YVdXbUsHVhcFVxVfDVgddGppSVsLCUQOWAdYRkYWSQdfARBNEVMRGQMHW1gVXRcBVRNVCkZTUlwXB0sUHA%3D%3D&rst=20728&ck=1&ref=https://tower.jp/search/advanced/item/search
- Requested by
- Host: js-agent.newrelic.com
URL: https://js-agent.newrelic.com/nr-1198.min.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
162.247.243.146
, United States,
ASN13335
(CLOUDFLARENET, US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- 0c9cf152a0ad00d4f102c93c613c104914be5517ac8f8e0831727f8bfbe8b300
|